我有一个巨大的 PDF 文档(几百页),很可能是通过 PowerPoint 演示文稿制作的。
每个演示步骤包含一页,因此如果在一张 PowerPoint 幻灯片上有一些文本或图像,后来以动画的形式出现,则 PDF 中将有两页:一页仅包含幻灯片的初始内容,另一页添加了动画对象。
我无法访问原始演示文稿,只能访问 PDF。
现在有没有办法(脚本,应用程序等)自动删除所有冗余页面,只保留每个原始幻灯片中每组页面的所有信息的最后一页,并丢弃动画步骤中不完整的页面?
检查算法实际上非常简单:对于每个页面,检查下一页是否至少包含当前页面中的所有信息(文本,图像,对象)或更多,如果是,则删除当前页面。
不幸的是,我不知道是否或如何比较 PDF 文档的页面并找出其中一个元素是否是另一个元素的子集。
您能否给我提供任何解决方案,帮助我整理我的庞大的 PDF 文档并删除动画步骤以便将其打印出来?
我真的不想要一个必须手动检查和删除所有页面的 PDF 编辑器应用程序,我已经有了https://www.xodo.com/为此。我希望找到一种方法来自动化这个过程。
答案1
答案2
我正好遇到了同样的需要。所以我创建了一个 Python 脚本,可以自动检查和删除 PDF 中冗余内容的页面。试试看这里。
这对于重复的文本内容很有效,但如果同一张幻灯片上的动画替换了之前的图像,它可能无法保留图像 - 因为我不需要那样。如果有人找到方法,请通过打开 PR 让我知道 - 我很乐意改进它。
附言:感谢您的详细提问!它帮助我为这个脚本写了一个不错的自述文件。:)
答案3
我编写了一个 CLI 实用程序,可以从 pdf 中删除“动画”(逐步显示)幻灯片。
- 它需要从演示文稿导出的 pdf 文件。
- 它检测两页连续页面之间的图像差异(假设背景为白色)。
- 如果后续页面仅能增强该页面的效果,则它会省略该页面。
因为它确实存在图像差异,所以提取文本时出现问题或者两张连续幻灯片之间的唯一差异是图像都不应该有关系。
它的名字是:https://github.com/mit/mit/blob/master/mit/licensed-repo/。pdfdeanimate-image.py
可以在这个 MIT 许可的仓库中找到:https://github.com/schokotets/pdf-slides-utils- 我愿意接受拉取请求,因为到目前为止实现还不是很清晰。
我已将当前的 python 源代码复制到此处。它需要poppler-utils
渲染 pdf 并pdftk
连接 pdf。它创建一个目录来存储.pgm
文件,这些文件是灰度幻灯片渲染。
通过以下方式运行:./pdfdeanimate-image.py slides.pdf
。
结果是一个文件stripped-slides.pdf
。
#!/usr/bin/env nix-shell
#!nix-shell -i python3 -p poppler_utils pdftk python38 python38Packages.numpy python38Packages.pillow
import subprocess
import sys
import os
import glob
import numpy
from PIL import Image, ImageOps
pdffile = sys.argv[1]
pdffile_name = pdffile.rsplit(".",1)[0]
pgmdir_name = pdffile_name+"-pgm"
pgmfile_name = pgmdir_name+"/"+pdffile_name
try:
os.mkdir(pgmdir_name)
subprocess.run(["pdftoppm", "-gray", pdffile, pgmfile_name])
print("converted pdf to pgm files")
except FileExistsError:
print("assuming pdf is already converted to pgm")
lastpix = None
haslastpix = False
containpages = []
currenthold = -1
filelist = glob.glob(os.path.join(pgmdir_name, '*.pgm'))
for filename in sorted(filelist, key=lambda s: s.lower()):
pagenr = filename.rsplit("/",1)[-1].rsplit(".",1)[0].rsplit("-",1)[-1]
img = Image.open(filename)
pix = numpy.array(img)
img.close()
if haslastpix:
isconsecutive = numpy.all(lastpix >= pix)
if not isconsecutive:
containpages.append(currenthold)
lastpix = pix
haslastpix = True
currenthold = pagenr
containpages.append(currenthold)
print(f"reduced {len(filelist)}-pages pdf to {len(containpages)}-pages pdf")
subprocess.run(["pdftk", pdffile, "cat"] + containpages + ["output", "stripped-"+pdffile])
答案4
维也纳技术大学的一组学生编写了一个基于网络的工具,可以从某些 PDF 中删除重复的幻灯片。 https://fsinf.github.io/pdf-page-stripper/
根据您正在寻找的内容,此处列出的 4 种不同工具中的一种可能最适合您。以下是每种工具的简要概述。
PDF页面剥离器:这篇文章着眼于页码。许多导出的 PDF 中的动画、重复幻灯片的页码都相同。这使得删除多余的幻灯片变得非常容易。
Jaladh Singhal 的 PDF 修剪器:检查连续页面是否具有相同的文本。如果是,它会删除前一个现已多余的页面。
pdfdeanimate-image 由 SchokoTets 提供:检查连续页面看相同,或者如果后面的页面只有额外的、较暗的内容。那么它会删除多余的内容。
Apache PDFBox®:这个是不是自动化工具。相反,它可以用作 CLI 工具来从 PDF 中提取文本。之后,必须手动比较并删除冗余页面。