如何删除接收到的 PDF 中的投影仪覆盖?

如何删除接收到的 PDF 中的投影仪覆盖?

我经常收到 PDF 文件,讲师们懒得在讲授之前使用“讲义”选项重新编译他们的投影仪文件。

有没有办法自动从接收的 PDF 文件中删除这些覆盖,只保留显示完整内容的幻灯片?

答案1

答案的开始

由于只有 pdf 输出,我在网上搜索了一下如何使用 LaTeX 以外的其他工具来处理 pdf 文件。我认为使用python基于 的脚本会更简单,但这再次只是一个建议。

经过一番挖掘,以下是结合两个 StackOverflow 解决方案的结果:

结合这两种解决方案,我提出了这个python脚本

  1. 检索与frame
  2. 应用适当的移位来获取与前一页相关的最后一页的页码frame
  3. 在新文件中仅连接这些帧

在我的例子中,似乎 Beamer 存储的frame页码以

infile.trailer["/Root"]["/PageLabels"]["/Nums"]

返回

[0, {'/P': '1'}, 5, {'/P': '2'}, 7, {'/P': '3'}]

这是 Python 脚本

from PyPDF2 import PdfFileWriter, PdfFileReader
# Read pdf from file
infile = PdfFileReader('test.pdf')
# Get total amount of pages
totpages = infile.getNumPages()
# Get starting page number from each page
pdfpagenuminfo = infile.trailer["/Root"]["/PageLabels"]["/Nums"]
pdfpagenumaliases = pdfpagenuminfo[0::2]
# Shift page number of interest to get only the page of the last overlay for each frame 
pagestokeep = [x-1 for x in pdfpagenumaliases[1::]] + [totpages-1]

# Initialize output
output = PdfFileWriter()
# Add content to output
for i in pagestokeep:
    p = infile.getPage(i)
    output.addPage(p)
# Write to output file
with open('newfile.pdf', 'wb') as f:
    output.write(f)

这是我用来测试它的 beamer 示例

\documentclass[]{beamer}

\begin{document}
 \begin{frame}
 \begin{itemize}[<+->]
     \item 1
     \item 2
     \item 3
     \item 4
     \item 5
 \end{itemize}   
 \end{frame}

 \begin{frame}
    \begin{itemize}[<+->]
        \item 1
        \item 2
    \end{itemize}   
    \end{frame}
    \begin{frame}
        \begin{itemize}[<+->]
            \item 1
            \item 2
        \end{itemize}   
        \end{frame}
\end{document}

希望这可以帮助

答案2

您可以使用pdftk:(从这个答案

#! /bin/bash

INPUT=$1
OUTPUT=$2

PAGE_NUMBERS=$((pdftk ${INPUT} dump_data | egrep "PageLabelNewIndex" | sed 's/[^0-9]//g' | sed '1d' | sed -r 's/(.*)/echo $((\1-1))/ge') | tr '\n' ' ')

pdftk ${INPUT} cat $PAGE_NUMBERS end output ${OUTPUT}

它从具有相同编号的多页中选择最后一页。

相关内容