2010-12-29 8 views
4

PDFパーサ/ライターを開発していますが、クロスリファレンスストリームを生成することに固執しています。 私のプログラムはthisファイルを読み込み、線形化を取り除き、オブジェクトストリーム内のすべてのオブジェクトを解凍します。最後に、PDFファイルを作成して保存します。PDFクロスリファレンスストリーム

普通のクロスリファレンス&予告編を使用すると、これは実際にうまくいきます。これはthisファイルに示されています。

私は、Adobe Readerがそれを見ることができない、thisファイルにもたらされる(代わりに、相互参照ストリームオブジェクトを生成してみてください。

は、PDFのとのだれでも経験を持っており、私は問題が何であるかを検索することができます?

相互参照が最初34127バイト3.ファイル2およびファイルの間の唯一の違いは同じであることに留意されたい。

誰かがデコード基準ストリームのコンテンツを必要とする場合、thisファイルをダウンロードし、それを開きHEXエディタ。この参照表を確認しました。 nそしてもう一度私は間違った何かを見つけることができませんでした。しかし、辞書もOKだと思われます。

ありがとうございました!

更新

私は今、完全に問題を解決してきました。新しいPDF hereを見つけることができます。

答えて

6

2つの問題。

  1. サイズ整数(必須)このセクションにまたはのための任意のセクションで使用される最も高いオブジェクトの数よりも多い数1これは、更新しなければならないた。それはトレーラー辞書のサイズのエントリに相当しなければならない。「

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

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

    はあなたのインデックスは、おそらく少し周りをスキップする必要がありますが、インデックス配列は、それを反映する必要なしオブジェクト2-4または7を持っていない

  3. あなたのデータアイン。。トン右のどちらか(と私は外部参照ストリームを読み取るために出て学びました。私をイェーイ。)


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を介して、followiオフセット:

0は未使用です。ファイン。
1は0x0aにあります。はい、確かに
2は0x47です。いいえ。それは "1 0"の流れの始まりの近くにあります。これはおそらく偶然ではありません。
3は0x101にあります。いいえ。 0x101はまだ "1 0"のストリーム内にあります。
4は0x170にあります。 Ditto
5は0x2fdにあります。 Ditto
6は0x76f1にあります。いいえ、この時間はその画像の流れの中に埋もれていました。

私はあなたが考えを得ると思います。したがって、たとえあなたが正しい\ Indexを持っていても、オフセットはすべて間違っています(そして、resultNormal.pdfのものとはまったく異なり、10進数の混乱も許します)。何をしたい

がresultNormalの外部参照で見つけることができます:

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

だからあなたの指数は、(私はこの権利を読んでいる場合)する必要があります:\インデックス[0 2 5 2 8 5]。そしてデータ:
1 3460(それはだ10進数)
1 3514(同上)
などが

興味深いことに、PDFの仕様は、サイズがなければならないことを言いますこの値およびすべての以前のXRefのエントリ数と、使用中の最も高いオブジェクト番号よりも1番目の値が同じである必要があります。

後で述べる部分はこれまで実行されていないと思いますが、xrefストリームは通常の相互参照テーブルよりも保持力があることがわかりました。両方を扱う同じコードかもしれませんが、そうでないかもしれません。


@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>>
ストリーム
...
endstream
endobjは

+0

ありがとうございます!!!私はそれが/ Indexタグのものだと思う。それはオプションなので無視しました。しかし、私のオブジェクトは0から9ではないので、それが必要です。 –

+0

これで、暗号化せずにrefストリームを保存し、/ Index配列を辞書に追加しました。今それは素晴らしい作品です!本当にありがとう!! –

+0

私は知っている:私は知っている:私は*ロック*。そして、私はとても控えめです!そして、よく見える。 「よく見える」ことを忘れないようにしましょう。 Err ...私は...「あなたは大歓迎です。 –

0

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

ビューアで開いた場合、オブジェクトは「13 0」のオブジェクトを相互参照ストリームとして読み込みますが、そのプレーンな辞書(ストリームタグとデータはありません)を読み込もうとします。

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

EDITまあ

- "resultstream.pdfは、" 問題の文書は、これは私のエディタ(SciTEのは)何のストリームがありません

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

を見るものである場合。私は、ストリームデータ自体を見ずに(参照

+0

は、私はそれが問題だとは思いません。私はメモ帳で "ストリーム....エンドストリーム"を参照してください。おそらくあなたの視聴者に問題がありますか? –

+0

上記の編集を参照してください! – mtraut

+0

SciTEはテキストエディタです(これは問題ありません)。私は、リンクから直接保存するのではなく、一部のビューアアプリケーションでPDFを開いてそこから保存したとします。リンクからは必ず保存してください。特に、破損している既知のPDFを扱う場合は特に注意してください。視聴者はファイルを修正しようとする傾向があるので、保存するバージョンは読み込んだバージョンとはかなり異なる場合があります。 –