我经常收到 PDF 文件,讲师们懒得在讲授之前使用“讲义”选项重新编译他们的投影仪文件。
有没有办法自动从接收的 PDF 文件中删除这些覆盖,只保留显示完整内容的幻灯片?
答案1
答案的开始
由于只有 pdf 输出,我在网上搜索了一下如何使用 LaTeX 以外的其他工具来处理 pdf 文件。我认为使用python
基于 的脚本会更简单,但这再次只是一个建议。
经过一番挖掘,以下是结合两个 StackOverflow 解决方案的结果:
- https://stackoverflow.com/a/39574231/9576551
- https://stackoverflow.com/questions/12360999/retrieve-page-numbers-from-document-with-pypdf/35728954
结合这两种解决方案,我提出了这个python脚本
- 检索与
frame
- 应用适当的移位来获取与前一页相关的最后一页的页码
frame
- 在新文件中仅连接这些帧
在我的例子中,似乎 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}
它从具有相同编号的多页中选择最后一页。