我有一个 pdf 作品集,由一个电子邮件线程组成,每封电子邮件都包含附件。我想阅读每封电子邮件中的文本并提取附件。但是,我找不到有关如何在 python 中阅读 pdf 作品集的信息。我尝试过使用库、PDFMiner 和 textract,但输出只是显示:“为了获得最佳体验,请在 Acrobat X 或 Adobe Reader X 或更高版本中打开此 PDF 组合。立即获取 Adobe Reader!”
有什么想法吗?谢谢!
来自
poppler实用程序的程序
pdfdetach
可以提取附件。
大多数类 UNIX 操作系统发行版都有一个
poppler-utils
软件包可用。您可以在 SourceForge 上找到 ms-windows 版本。
您可以使用
subprocess
模块从 Python 调用此程序。
您可以使用
python-poppler
。
from poppler import load_from_file
pdf_document = load_from_file("portfolio.pdf")
if pdf_document.has_embedded_files():
for attachment in pdf_document.embedded_files():
print(attachment.data)
我花了相当多的工作才使用@Roland Smith 和@ikreb 的答案从投资组合中提取嵌入文件。 python-poppler 有一个相当神秘的 API,上面的说明只是获取数据,而不是 pdf。 以下步骤详细介绍了如何使用 poppler 和 python 子进程从投资组合中获取文档:
您需要安装 Poppler。 它可以通过自制程序(或condo)安装在Mac 上。 您可能还需要 cmake (也与自制程序一起安装)。 以下是在 Windows 上安装的多种方法:如何在 Windows 上安装 Poppler?
Poppler 是一个命令行程序,因此您不一定必须使用 python 来解决您的问题。 从命令行:
# this will pull the files from the portfolio and save them to the same directory
pdfdetach -saveall <file_name, no quotes>
# example:
pdfdetach -saveall my_portfolio.pdf
import subprocess
# pdfdetach will save all files from the portfolio to the same directory
subprocess.run(['pdfdetach', '-saveall', file_name.pdf])
# if you want to get a list of the files, use -list (see note below)
subprocess.run(['pdfdetach', '-list', file_name])
# it is also useful, within a script, to save to another folder using -o:
subprocess.run(['pdfdetach', '-saveall', os.path.join(os.path.join(os.getcwd(), my_portfolio.pdf), '-o', os.path.join(os.getcwd(), './out')])
关于列表输出的注释:输出将是一个子进程对象,必须对其进行解析以生成文件名的 python 列表。 这篇文章有几种方法可以做到这一点:python子进程输出到列表或文件
不幸的是,许多可以处理 PDF 的软件包,包括
poppler
都不适合我,因为我无法在我正在使用的大学编码环境中安装它们。我也遇到了问题PyMuPDF
。
Pikepdf 看起来是一个值得探索的选项。在文档中,他们写了为什么在某些环境中它可能比像
PyMuPDF
这样的包更受欢迎:
PyMuPDF 是一个具有令人印象深刻的功能的 PDF 库。然而,其 AGPL 许可证比 pikepdf 限制性大得多,而且它的依赖性 静态库使得很难包含在开源 Linux 中 或 BSD 发行版。
另一种非编码解决方案是简单地使用 Adobe 中的打印选项,然后选择将打开的文件夹中的所有文件打印到新的 PDF 中。