5

PDF パーサー/ライターを開発していますが、相互参照ストリームの生成に行き詰まっています。私のプログラムはこのファイルを読み取り、その線形化を削除して、オブジェクト ストリーム内のすべてのオブジェクトを解凍します。最後に、PDF ファイルをビルドして保存します。

このファイルでわかるように、通常の相互参照と予告編を使用すると、これは非常にうまく機能します。

代わりに相互参照ストリーム オブジェクトを生成しようとすると (結果としてこのファイルが生成され、Adobe Reader では表示できません。

PDFの経験があり、問題が何であるかを検索するのを手伝ってくれる人はいますか?

相互参照は、ファイル 2 とファイル 3 の唯一の違いであることに注意してください。最初の 34127 バイトは同じです。

デコードされた参照ストリームのコンテンツが必要な場合は、このファイルをダウンロードして、HEX エディターで開いてください。この参照表を何度も確認しましたが、間違いは見つかりませんでした。しかし、辞書も大丈夫のようです。

助けてくれてありがとう!!!

アップデート

私は今、問題を完全に解決しました。新しい PDFはこちらからご覧いただけます

4

2 に答える 2

7

私が見る2つの問題(ストリームデータ自体を見ずに.

  1. サイズ 整数 (必須) このセクションまたはこれが更新されるセクションで使用される最大のオブジェクト番号よりも 1 大きい数値。これは、トレーラー ディクショナリのサイズ エントリに相当するものとします。」

    あなたのサイズは... 14.

  2. "インデックス配列 (オプション) このセクションの各サブセクションの整数のペアを含む配列。最初の整数はサブセクションの最初のオブジェクト番号、2 番目の整数はサブセクションのエントリ数、配列はソートされます。オブジェクト番号の昇順です。サブセクションは重複できません。オブジェクト番号は、セクション内に最大 1 つのエントリを持つことができます。デフォルト値: [0 サイズ]."

    インデックスはおそらく少しスキップする必要があります。オブジェクト 2 ~ 4 または 7 はありません。インデックス配列はそれを反映する必要があります。

  3. あなたのデータも正しくありません (そして、私はちょうど xref ストリームを読むことを学びました.

00 00 00  
01 00 0a  
01 00 47  
01 01 01  
01 01 70  
01 02 fd  
01 76 f1  
01 84 6b  
01 84 a1  
01 85 4f

このデータによると、「インデックスなし」のためにオブジェクト番号0〜9として解釈され、次のオフセットがあります。

0 is unused.  Fine.  
1 is at 0x0a.  Yep, sure is  
2 is at 0x47.  Nope.  That lands near the beginning of "1 0"'s stream. This probably isn't a coincidence.  
3 is at 0x101.  Nope.  0x101 is still within "1 0"'s stream.  
4 is at 0x170.  Ditto  
5 is at 0x2fd.  Ditto  
6 is at 0x76f1. Nope, and this time buried inside that image's stream.

私はあなたがアイデアを得ると思います。したがって、正しい \Index を持っていたとしても、オフセットはすべて間違っています (そして、resultNormal.pdf の内容とは完全に異なり、10 進数と 16 進数の混乱を許すことさえあります)。

必要なものは、resultNormal の xref にあります。

xref  
0 2  
0000000000 65535 f  
0000000010 00000 n  
5 2  
0000003460 00000 n  
0000003514 00000 n  
8 5  
0000003688 00000 n  
0000003749 00000 n  
0000003935 00000 n  
0000004046 00000 n  
0000004443 00000 n  

したがって、インデックスは次のようになります (私がこれを正しく読んでいる場合): \Index[0 2 5 2 8 5]。そしてデータ:

0 0 0  
1 0 a  
1 3460 (that's decimal)  
1 3514 (ditto)  
1 3688  
etc

興味深いことに、PDF の仕様では、サイズは、この XRef と以前のすべての XRef のエントリ数と、使用中の最大オブジェクト数よりも 1 大きい数値の両方である必要があると規定されています。

後者の部分が強制されることはないと思いますが、外部参照ストリームが通常の相互参照テーブルよりも保持力が高いことに気付いても驚かないでしょう。両方を処理する同じコードかもしれませんが、そうでないかもしれません。


@mtraut:

ここに私が見るものがあります:

13 0 obj <</Size 10/Length 44/Filter /FlateDecode/DecodeParms <</Columns 3/Predictor 12>>/W [1 2 0]/Type /XRef/Root 8 0 R>>
stream  
...  
endstream  
endobj  
于 2010-12-30T00:58:06.810 に答える
0

"resultstream.pdf" には有効な相互参照ストリームがありません。

ビューアで開くと、オブジェクト " 13 0 " をクロス リファレンス ストリームとして読み取ろうとしますが、これは単純な辞書です (ストリーム タグとデータが欠落しています)。

少し話が逸れますが、どの言語で開発していますか? 少なくとも Java では、3 つの貴重な選択肢 (PDFBox、iText、および jPod を知っています。開発者の 1 人として個人的に jPod を選択した場合、非常にクリーンな実装です :-)。これがあなたのプラットフォームに合わない場合は、少なくともアルゴリズムとデータ構造を見ることができます。

編集

そうですね - 「resultstream.pdf」が問題のドキュメントである場合、これが私の編集者 (SCITE) に表示されるものです。

...
13 0 obj
<</Size 0/W [1 2 0]/Type /XRef/Root 8 0 R>>
endobj
startxref
34127
%%EOF

ストリームはありません。

于 2010-12-29T18:04:11.143 に答える