我有超过 50,000 个 PDF 文档需要分配给客户帐户。但是,每个 PDF 都包含我不希望客户看到的页面(公司内部内容),因此我希望能够根据其内容删除特定页面(页面上显示“仅供办公室使用”)并保存 PDF作为一个新文件。
我对脚本方面很满意,我只需要知道什么软件能够完成这样的任务。
答案1
有许多用于操作 PDF 文件的库,包括未维护的库pypdf和它的叉子pyPDF2。您可以逐页处理文件,提取文本并复制文本合适的页面。
我使用 Python3.6 和 PyPDF2==1.26.0 运行了以下命令:
#!/usr/bin/env python3
import re
import sys
from PyPDF2 import PdfFileWriter, PdfFileReader
pdf_in = PdfFileReader(sys.stdin.buffer)
pdf_out = PdfFileWriter()
for p in [pdf_in.getPage(i) for i in range(0, pdf_in.getNumPages())]:
text = p.extractText()
if not re.search(r'for\s+office\s+use\s+only', text, re.I):
pdf_out.addPage(p)
pdf_out.write(sys.stdout.buffer)
请注意,文档中的文本可能不会完全按照您想要的方式显示。在 PDF 文档中,行、单词甚至字符可能会出现乱序。文档可以由出现在某些坐标处的片段构成,而不是文本流。
即使文本按顺序排列(通常是这种情况),跨多个页面的文本也会在中间有页脚和页眉。跨多行的文本在换行符周围可能有额外的空格。由于文本对齐,即使同一行上的文本也可能在单词之间有多个空格(这就是我\s+
在上面的正则表达式中使用而不是纯空格的原因)。
从 PDF 中提取文本的工具尝试将页面重建为文本,但并不总是能完美完成工作。如果 pyPdf 不能很好地处理您的文档,您可以尝试其他库进行文本提取;看这和这线程一些例子。
答案2
一种选择是查看命令行 PDF 编辑器,例如 PDFEdit、Pdftk 或 PDFSaM。 pdftotext 作为识别要删除的页码的简单方法可能很有用。