我承认我是Python的新手。我们必须处理带有附件或带注解附件的PDF文件。我正在尝试使用PyPDF 2库从PDF文件中提取附件。
在GitHub上找到的唯一(!)示例包含以下代码:
import PyPDF2
def getAttachments(reader):
catalog = reader.trailer["/Root"]
# VK
print (catalog)
#
fileNames = catalog['/Names']['/EmbeddedFiles']['/Names']
这一呼吁是:
rootdir = "C:/Users/***.pdf" # My file path
handler = open(rootdir, 'rb')
reader = PyPDF2.PdfFileReader(handler)
dictionary = getAttachments(reader)
我得到一个KeyError:'/EmbeddedFiles'
目录的打印确实不包含EmbeddedFiles:'/扩展名':'/ADBE':'/1.7','/ExtensionLevel':3}},'/元数据':IndirectObject(2,0),“/Names’:IndirectObject(5,0),“/OpenAction':IndirectObject(6,0),'/PageLayout':'/OneColumn','/Pages':IndirectObject(3,0),“/PieceInfo”:IndirectObject(7,0),“/Type”:“/目录”
此PDF包含9个附件。我怎样才能得到它们?
5条答案
按热度按时间pinkon5k1#
后期编辑
随着PyPDF的rebase(Back to Roots)取代PyPDF 2,这被Add“reader关闭。PyPDF 3.5.0(2023年2月)见
https://github.com/py-pdf/pypdf/commit/5e792c2519f101045e512ec047ebfcaf5e87ee28
较旧的答案*太长的评论,我没有亲自测试过这段代码,它看起来与你在问题中的大纲非常相似,但是我在这里添加了其他人来测试。这是合并请求https://github.com/mstamy2/PyPDF2/pull/440的主题,以下是Kevin M Loeffler在https://kevinmloeffler.com/2018/07/08/how-to-extract-pdf-file-attachments-using-python-and-pypdf2/ * 中描述的完整更新序列
如果你能提供一个你有问题的输入类型的例子,这样其他人就可以调整提取例程来适应,这总是有帮助的。
在收到一个错误时“我猜脚本正在损坏,因为PDF的嵌入文件部分并不总是存在,所以试图访问它会抛出一个错误。““我会尝试将get_attachments方法中'catalog'行后面的所有内容放在try-catch中。”
不幸的是,有许多未包含在PyPDF 2***中的未决拉取请求,但现在包含在新的Re-Incarnation中,作为PyPDF***https://github.com/mstamy2/PyPDF2/pulls,其他请求也可能相关或需要帮助解决这个和其他缺点。因此,你需要看看这些是否也有帮助。
有关一个尚未完成的try catch示例,您可以将其包含在/中并将其应用于其他用例,请参见https://github.com/mstamy2/PyPDF2/pull/551/commits/9d52ef517319b538f007669631ba6b778f8ec3a3。
除了
/Type/EmbeddedFiles
之外,嵌入文件的相关关键字包括/Type /Filespec
和/Subtype /FileAttachment
,请注意,这些关键字对可能并不总是有空格,因此也许可以查看这些关键字是否可以查询附件同样,在最后一点上,该示例搜索以复数索引的/EmbeddedFiles,而任何单独的条目本身被标识为单数
vxbzzdmp2#
这可以改进,但它已经过测试(使用PyMuPDF)。
它检测损坏的PDF文件,加密,附件,注解和投资组合。
我还没有将产出与我们的内部分类进行比较。
生成可以导入Excel的分号分隔文件。
zour9fqk3#
我也遇到了同样的问题与几个pdf,我有。我能够对引用的代码进行这些更改,使其为我工作:
jxct1oxe4#
我知道这是一个迟来的答复,但我昨天才开始调查。我使用PyMuPdf库来提取嵌入的文件。下面是我的代码:
o8x7eapl5#
免责声明:我是
borb
的作者(本答案中使用的库)borb
是一个开源的纯Python PDF库。它抽象了处理PDF的大部分不愉快(例如必须处理字典和必须知道PDF语法和结构)。这里有一个巨大的示例库,包含一个关于处理嵌入式文件的部分,您可以在这里找到。
为了完整性,我将在这里重复相关的示例:
在读取
Document
之后,您可以简单地要求它提供一个dict
,将文件名Map到字节。