gpt4 book ai didi

python - 结构错误 : unpack requires a string argument of length 16

转载 作者:太空狗 更新时间:2023-10-29 21:19:22 28 4
gpt4 key购买 nike

处理 PDF 时 file (2.pdf)使用 pdfminer (pdf2txt.py) 我收到以下错误:

pdf2txt.py 2.pdf 

Traceback (most recent call last):
File "/usr/local/bin/pdf2txt.py", line 115, in <module>
if __name__ == '__main__': sys.exit(main(sys.argv))
File "/usr/local/bin/pdf2txt.py", line 109, in main
interpreter.process_page(page)
File "/usr/local/lib/python2.7/dist-packages/pdfminer/pdfinterp.py", line 832, in process_page
self.render_contents(page.resources, page.contents, ctm=ctm)
File "/usr/local/lib/python2.7/dist-packages/pdfminer/pdfinterp.py", line 843, in render_contents
self.init_resources(resources)
File "/usr/local/lib/python2.7/dist-packages/pdfminer/pdfinterp.py", line 347, in init_resources
self.fontmap[fontid] = self.rsrcmgr.get_font(objid, spec)
File "/usr/local/lib/python2.7/dist-packages/pdfminer/pdfinterp.py", line 195, in get_font
font = self.get_font(None, subspec)
File "/usr/local/lib/python2.7/dist-packages/pdfminer/pdfinterp.py", line 186, in get_font
font = PDFCIDFont(self, spec)
File "/usr/local/lib/python2.7/dist-packages/pdfminer/pdffont.py", line 654, in __init__
StringIO(self.fontfile.get_data()))
File "/usr/local/lib/python2.7/dist-packages/pdfminer/pdffont.py", line 375, in __init__
(name, tsum, offset, length) = struct.unpack('>4sLLL', fp.read(16))
struct.error: unpack requires a string argument of length 16

虽然类似file (1.pdf)不会造成问题。

我找不到有关该错误的任何信息。我添加了一个 issue在 pdfminer GitHub 存储库上,但仍未得到答复。有人可以向我解释为什么会这样吗?我能做些什么来解析 2.pdf


更新:在 installing pdfminer 之后,我用 BytesIO 而不是 StringIO 得到了类似的错误直接来自 GitHub 存储库。

    $ pdf2txt.py 2.pdf 
Traceback (most recent call last):
File "/home/danil/projects/python/pdfminer-source/env/bin/pdf2txt.py", line 116, in <module>
if __name__ == '__main__': sys.exit(main(sys.argv))
File "/home/danil/projects/python/pdfminer-source/env/bin/pdf2txt.py", line 110, in main
interpreter.process_page(page)
File "/home/danil/projects/python/pdfminer-source/env/local/lib/python2.7/site-packages/pdfminer/pdfinterp.py", line 839, in process_page
self.render_contents(page.resources, page.contents, ctm=ctm)
File "/home/danil/projects/python/pdfminer-source/env/local/lib/python2.7/site-packages/pdfminer/pdfinterp.py", line 850, in render_contents
self.init_resources(resources)
File "/home/danil/projects/python/pdfminer-source/env/local/lib/python2.7/site-packages/pdfminer/pdfinterp.py", line 356, in init_resources
self.fontmap[fontid] = self.rsrcmgr.get_font(objid, spec)
File "/home/danil/projects/python/pdfminer-source/env/local/lib/python2.7/site-packages/pdfminer/pdfinterp.py", line 204, in get_font
font = self.get_font(None, subspec)
File "/home/danil/projects/python/pdfminer-source/env/local/lib/python2.7/site-packages/pdfminer/pdfinterp.py", line 195, in get_font
font = PDFCIDFont(self, spec)
File "/home/danil/projects/python/pdfminer-source/env/local/lib/python2.7/site-packages/pdfminer/pdffont.py", line 665, in __init__
BytesIO(self.fontfile.get_data()))
File "/home/danil/projects/python/pdfminer-source/env/local/lib/python2.7/site-packages/pdfminer/pdffont.py", line 386, in __init__
(name, tsum, offset, length) = struct.unpack('>4sLLL', fp.read(16))
struct.error: unpack requires a string argument of length 16

最佳答案

TL;恢复

感谢@mkl 和@hynecker 提供的额外信息...据此我可以确认这是 pdfminer 和您的 PDF 中的错误。每当 pdfminer 尝试获取嵌入式文件流(例如字体定义)时,它都会在 endobj 之前选取文件中的最后一个。遗憾的是,并非所有 PDF 都严格添加结束标记,因此 pdfminer 应该对此有弹性。

快速修复此问题

我创建了一个补丁 - 已作为拉取请求提交到 github 上。参见 https://github.com/euske/pdfminer/pull/159 .

详细诊断

如其他答案中所述,您看到这种情况的原因是您没有从流中获得预期的字节数,因为 pdfminer 正在解压缩数据。但是为什么?

正如您在堆栈跟踪中看到的那样,pdfminer(正确地)发现它有一个要处理的 CID 字体。然后它继续将嵌入的字体文件处理为 TrueType 字体(在 pdffont.py 中)。它尝试通过读取一组二进制表来解析关联的流(流 ID 18)。

这不适用于 2.pdf,因为它有一个文本流。您可以通过运行 dumppdf -b -i 18 2.pdf 来查看。我把开始放在这里:

/CIDInit /ProcSet findresource begin
12 dict begin
begincmap
/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0
>> def /CMapName /Adobe-Identity-UCS def
...

所以,垃圾输入,垃圾输出...这是您的文件或 pdfminer 中的错误吗?好吧,其他读者可以处理它的事实让我怀疑。

再仔细研究一下,我发现该流与流 ID 17 相同,后者是 ToUnicode 字段的 cmap。快速浏览 PDF spec表明这些不能相同。

进一步深入研究代码,我发现所有流都获得相同的数据。哎呀!这是错误。原因似乎与此 PDF 缺少一些结束标记这一事实有关 - 如@hynecker 所述。

修复方法是为每个流返回正确的数据。任何其他只是吞下错误的修复都会导致错误的数据被用于所有流,例如,不正确的字体定义。

我相信随附的补丁可以解决您的问题,并且通常可以安全使用。

关于python - 结构错误 : unpack requires a string argument of length 16,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40158637/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com