[英]Python PDFMiner error: “No /Root object! - Is this really a PDF?”
[英]Error in PDF root object
此 PDF 根 object 将使 Adobe Reader 失败。 其他 PDF 阅读器,如 Foxit、Nuance、Evince、SumatraPDF 将毫无问题地打开 PDF 文件。 问题是 /Dests 需要间接 object(PDF 参考)。 删除 /Dests << >> 将使 Adobe Reader 打开文件,但打印失败。 没有/Dests,所有其他阅读器都可以正常工作。 任何想法如何更正以下根 object 示例中的语法?
17 0 obj
<<
/Type /Catalog
/Pages 2 0 R
/Outlines 15 0 R
/PageMode /UseOutlines
/Dests <<
/__WKANCHOR_2 8 0 R
/#8d#c2#ca#ebs#e4#60#00#9e#97l#b9#80#1b#cb#86sQR#83 9 0 R
>>
>>
endobj
好的,找到了几分钟的空闲时间...
所以我注意到的第一件事是 *所有其他读者确实可以打开文件(我只测试了几个)。 但是这些确实会吐出很多警告和错误消息...(尝试 Ghostscript: gs virkerikke.pdf
,或尝试 evince...) PDF 中至少有一个损坏的xref
表(或至少这个是投诉之一)。
xpdf
抱怨:[....]
Error: Invalid XRef entry
Error: Invalid XRef entry
Error: Invalid XRef entry
Error (157): Unterminated string
Error (159): End of file inside dictionary
gv
抱怨:Warning: translation table syntax error: Unknown keysym name: apLineDel
Warning: ... found while parsing '<Key>apLineDel: GV_Page(page+5) '
Warning: String to TranslationTable conversion encountered errors
evince
抱怨:[....]
Error: Invalid XRef entry
Error: Invalid XRef entry
Error: Invalid XRef entry
Error (157): Unterminated string
Error (159): End of file inside dictionary
Error (157): Unterminated string
Error (159): End of file inside dictionary
Error (157): Unterminated string
Error (159): End of file inside dictionary
[....]
Error (1918): Unterminated string
Error (1920): End of file inside dictionary
gs
抱怨:**** Warning: File has a corrupted %%EOF marker, or garbage after %%EOF.
mupdf
抱怨:+ pdf/pdf_xref.c:60: pdf_read_start_xref(): cannot find startxref
| pdf/pdf_xref.c:477: pdf_load_xref(): cannot read startxref
\ pdf/pdf_xref.c:532: pdf_open_xref_with_stream(): trying to repair
warning: ignoring invalid character in hex string: '!'
warning: ignoring invalid character in hex string: 'O'
warning: ignoring invalid character in hex string: 'T'
warning: ignoring invalid character in hex string: 'Y'
[....]
qpdf --qdf
抱怨:virkerikke.pdf (object 17 0, file position 2234): null character not allowed in name token
好的,现在在文本编辑器中打开这个糟糕的文件,尝试修复它。 我发现这个文件(大小为 32746 字节)有一些严重的语法问题:
%%EOF
之后的垃圾:在 PDF 的%%EOF
标记之后,有一个完整且语法正确的 HTML 文件,其标题为"Wkhtmltopdf - Teknisk regelverk" 。 它的大小是 11878 字节。 删除此部分,您将拥有一个“更好”的 PDF,其大小仅剩 20868 字节......尽管在保存编辑后的文件后 Acrobat/Adobe Reader 仍然无法打开它。/#8d#c2#ca#ebs#e4#60#00#9e#97l#b9#80#1b#cb#86sQR#83
。 它在此文件中显示为 2x。 在我的第一条评论中,我已经告诉过你,这个密钥对我来说看起来不可信,因为它只包含很少的 ASCII 字符,但有很多二进制字节(使用它们的十六进制表示。(我忽略的是它甚至包含一个#00
是一个nul
字符的 PDF 表示形式......对于 PDF 中的名称标记,使用它是非法的。)用另一个(幻想)长度完全相同的名称标记替换该名称标记(两次出现)。我做了选择/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
保存编辑的文件。现在,即使是 Acrobat/Adobe Readers 也可以毫无怨言地打开这个修复过的文件。 此外, “其他阅读器”现在可以更好地使用此文件,发出更少的警告,并且现在能够识别他们无法获取原始文件的一些元数据(例如创建日期和生产者 == wkhtmltopdf)。
/Dests
应该是包含名称(键)和相应目的地(值)的字典( /Key value
对)。 /Dests
关键字首次出现在 PDF 1.1 中。
PDF 1.1 允许键仅是名称 object。 PDF 1.2 允许键也是字节字符串。
那么您的文件声称是哪个 PDF 版本?
来自 PDF 1.7(“ISO 32000-1”)的规范,描述了/Dests
的含义:
在 PDF 1.1 中,名称对象和目的地之间的对应关系应由文档目录中的 Dests 条目定义(参见 7.7.2,“文档目录”)。 这个条目的值应该是一个字典,其中每个键是一个目的地名称,并且对应的值是一个定义目的地的数组,使用表 151 中所示的语法,或者一个具有 D 条目的字典,其值是这样一个数组.
看起来很简单。 将 dests 数组移动到它自己的 object 中。
而不是
17 0 obj
<<
/Type /Catalog
/Pages 2 0 R
/Outlines 15 0 R
/PageMode /UseOutlines
/Dests <<
/__WKANCHOR_2 8 0 R
/#8d#c2#ca#ebs#e4#60#00#9e#97l#b9#80#1b#cb#86sQR#83 9 0 R
>>
>>
endobj
你应该有:
17 0 obj
<<
/Type /Catalog
/Pages 2 0 R
/Outlines 15 0 R
/PageMode /UseOutlines
/Dests 1234 0 R
>>
endobj
1234 0 obj
<</__WKANCHOR_2 8 0 R/#8d#c2#ca#ebs#e4#60#00#9e#97l#b9#80#1b#cb#86sQR#83 9 0 R>>
endobj
object 数字将是伪随机数。
以及如何将 dest 数组从根目录移到它自己的 object 将完全取决于您使用的 PDF 软件。 “十六进制编辑器”是一个选项,但是从技术上讲,您在 SuperUser 上而不是在 StackOverflow 上。 我怀疑你可能会在那个上得到一个调度。 我会让它自己滑动。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.