簡體   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