![](/img/trans.png)
[英]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.