繁体   English   中英

PDF 根 object 中的错误

[英]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 字节)有一些严重的语法问题:

  1. %%EOF之后的垃圾:在 PDF 的%%EOF标记之后,有一个完整且语法正确的 HTML 文件,其标题为"Wkhtmltopdf - Teknisk regelverk" 它的大小是 11878 字节。 删除此部分,您将拥有一个“更好”的 PDF,其大小仅剩 20868 字节......尽管在保存编辑后的文件后 Acrobat/Adobe Reader 仍然无法打开它。
  2. 名称标记中的无效字符:这是在名称标记/#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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM