2016-09-09 5 views
1

ドキュメントの/ Pagesレベルの/ Resourcesディクショナリに保存されているフォントを持つPdfは、すべてのページで再利用できるようにしています。これは2つのことを達成するように思われます:コースの適切な表示だけでなく、より小さいファイルサイズ。このPdfからページをコピーするためにiTextを使用する場合、高レベルまたはより低レベルの関数(PdfPageのcopyToやcopyFormAsXObjectなど)を使用するかどうかにかかわらず、結果として得られるPdfには特性がないことに気付きました。個々のページ。iTextはPDFドキュメントの/ Pagesからリソース辞書をコピーしません

ページコピーを実行する際にこれが守られない特別な理由はありますか?

さらに、これを自分で実行しようとしましたが、ドキュメントのページにリソースを置く方法がないようです。私はPdfPages上の.putメソッドで個々のページのためにそれを行うことができますが、PdfDocumentの場合、等価ではないようです。 iTextを使ってこの構造のPdfDocumentを作成する方法はありますか?

答えて

1

あなたのPDFを膨らませることについて心配する必要はありません。リソースは、リソース辞書に間接オブジェクトとして追加されます。つまり、リソース辞書は実際のリソースオブジェクトへの参照を保持し、辞書に埋め込む必要はありません。ここではPDFの/ページエントリです:

3 0 obj 
<< 
    /Type /Pages 
    /Count 3 
    /Kids [5 0 R 13 0 R 23 0 R ] 
    /Resources << 
     /Font << 
      /FAAAAH 7 0 R 
      /FAAABG 16 0 R 
     >> 
     /ExtGState << 
      /GS1 15 0 R 
      /GS2 21 0 R 
      /GS3 25 0 R 
     >> 
    >> 
>> 

「/ FAAAAH 7 0 R」の行は、リソースの辞書は、参照のみを保持して見ることができるようにフォントFAAAAHは、オブジェクト#7であることを意味は、(7 0 R)フォントオブジェクトに渡します。実際のフォントオブジェクトはPDF内の他の場所にあります。すべてのPDFリーダーとパーサーは、オブジェクト#7にアクセスする方法を知っています。

コピーまたはマージの際に膨れが発生している場合、PDFにはおそらく1回ではなく2回、参照が2回あります。/Resourcesの場所は、ファイルの膨大化とは関係がありません。これは、PDF内にあるもので、膨らみに追加されます。

あなたはsmartmodeでPDFWriterのを実行することにより、iTextの中でこれに対抗することができます

私たちは、iTextの継承をコピーしない理由に見ていきます。

+1

「厳密に言えば、/ Pagesレベルの/ Resources辞書はありません」 - 間違っています。 **リソース**はPDF仕様では "継承可能"とマークされています*エントリーを完全に[**ページ**辞書で]省略すると、リソースはページツリーの祖先ノードから継承されます。これを例外として線形化PDF:*リニアライズドPDF組織に準拠した文書(附属書F参照)では、すべてのページ属性は、それらが適用されるページ辞書のエントリとして明示的に指定される。 * – mkl

+0

私はあなたのコメントを反映するために私の答えを編集しました。 –

関連する問題