4

この PDF ルート オブジェクトにより、Adobe Reader が失敗します。Foxit、Nuance、Evince、SumatraPDF などの他の PDF リーダーでは、PDF ファイルを問題なく開くことができます。問題は、間接オブジェクトを必要とする /Dests です (PDF 参照)。/Dests << >> を削除すると、Adobe 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

OK、数分の空きが見つかりました...

だから私が最初に気付いたのは、 *他のすべてのリーダーが実際にファイルを開く可能性があるということです (私はいくつかだけをテストしました)。しかし、これらは非常に多くの警告とエラーメッセージを吐き出します... (Ghostscriptを試してください: gs virkerikke.pdf、またはエビデンスを試してください...) PDFにも少なくとも破損したxrefテーブルがあります(または少なくともこれは苦情の1つです) )。

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

OK、このくだらないファイルをテキスト エディタで開き、修復しようとしています。私が見つけたのは、このファイル (サイズが 32746 バイト) に重大な構文上の問題があることです。

  1. 後のガベージ%%EOF:%%EOFタイトル「Wkhtmltopdf - Teknisk regelverk」のマーカーの後に、完全で構文が正しい HTML ファイルが PDF に接着されています。そのサイズは 11878 バイトです。この部分を削除すると、サイズが 20868 バイトしか残っていない「より良い」PDF が作成されます...ただし、編集したファイルを保存した後も、Acrobat/Adobe Reader では開きません。
  2. 名前トークンに無効な文字:これは名前トークン内にあります/#8d#c2#ca#ebs#e4#60#00#9e#97l#b9#80#1b#cb#86sQR#83。このファイルでは 2 回表示されます。すでに最初のコメントで、このキーは信頼できるとは思えないと言いました。なぜなら、このキーには ASCII 文字がほとんど含まれておらず、バイナリ バイト (16 進表現を使用) が多数含まれているからです。#00これは、文字の PDF 表現ですnul... PDF の名前トークンでの使用は違法です.) その名前トークンを、まったく同じ長さの別の (幻想的な) ものに置き換えます (両方の出現で). 私は . を選択し/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaました. 保存編集したファイル。

現在、Acrobat/Adobe Reader でさえ、この修復されたファイルを問題なく開くことができます。また、「他のリーダー」はこのファイルをより適切に処理できるようになり、警告が少なくなり、元のファイルでは取得できなかったメタデータ (作成日やプロデューサー == 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 ソフトウェアに完全に依存します。「16進エディタ」はオプションですが、ここではStackOverflowの代わりにSuperUserを使用しています...技術的には。あなたはそれでマリガンを得るかもしれないと思います。私はそれを自分で滑らせます。

于 2011-06-06T17:40:37.397 に答える