4

此 PDF 根对象将使 Adob​​e Reader 失败。Foxit、Nuance、Evince、SumatraPDF 等其他 PDF 阅读器可以毫无问题地打开 PDF 文件。问题是 /Dests 需要间接对象(PDF 参考)。删除 /Dests << >> 将使 Adob​​e Reader 打开文件,但打印失败。没有/Dests,所有其他阅读器都可以正常工作。任何想法如何纠正以下根对象示例中的语法?

  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
4

3 回答 3

3

好的,找到了几分钟的空闲时间...

所以我注意到的第一件事是 *所有其他读者确实可以打开文件(我只测试了几个)。但是这些确实会吐出很多警告和错误消息...(尝试 Ghostscript:gs virkerikke.pdf或尝试 evince...)xrefPDF 中至少也有一个损坏的表格(或者至少这是其中一个抱怨)。

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有一个完整且语法正确的 HTML 文件粘贴到 PDF 的%%EOF标记之后,标题为“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)。

于 2011-06-03T00:49:15.833 回答
1

/Dests应该是/Key value包含名称(键)和相应目的地(值)的字典(一对)。该/Dests关键字首次出现在 PDF 1.1 中。

PDF 1.1 只允许键是名称对象。PDF 1.2 允许键也可以是字节字符串。

那么您的文件声称是哪个 PDF 版本?

来自 PDF 1.7(“ISO 32000-1”)的规范,描述了 的含义/Dests

在 PDF 1.1 中,名称对象和目的地之间的对应关系应由文档目录中的 Dests 条目定义(参见 7.7.2,“文档目录”)。这个条目的值应该是一个字典,其中每个键是一个目的地名称,并且对应的值是一个定义目的地的数组,使用表 151 中所示的语法,或者一个具有 D 条目的字典,其值是这样一个数组.

于 2011-06-02T08:53:35.777 回答
0

看起来很简单。将 dests 数组移动到它自己的对象中。

而不是

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

对象编号将是伪随机的。

以及如何将 dest 数组从根目录移到它自己的对象中,这将完全取决于您使用的 PDF 软件。“十六进制编辑器”是一个选项,但是从技术上讲,您在 SuperUser 上而不是在 StackOverflow 上。我怀疑你可能会在那个上得到一个调度。我会让它自己滑动。

于 2011-06-06T17:40:37.397 回答