2016-06-30 10 views
1

iTextsharpを使って画像をPDFに追加することができるかどうかを知りたいのですが、画像をページに直接追加するのではなく、最初にライブラリに追加してから、 PDFで必要に応じてライブラリを作成します。iTextsharpでイメージライブラリを作成することはできますか?

この方法の利点は、同じイメージを再利用すると、イメージの正確な複製がPDFに追加されなくなりますが、イメージの現在のコピーを再利用することです。

は、私がこれまでにいくつかのテストを行っている。このことから

Actual image size: 102kB 
1 copy of the image in the PDF + other text: 259kB 
2 copies of the image in the PDF + other text: 481kB 
3 copies...: 704kB 
4 copies...: 926kB 

それはPDFが、私は同じ画像を再利用すると、単純にそれを参照してることを知っているのに十分にスマートではないことは明らかです。可能であれば本当に素晴らしいでしょう...

+0

のために真である再利用が唯一のドキュメント内にあるので、あなたは、ドキュメント自体の中にライブラリを意味しますか? – adv12

+0

私は彼が辞書を使用し、イメージのオブジェクトへの参照を使用することを意味したいと思います。 –

+0

コードを入力した場合、そのエラーは明らかでした。 – mkl

答えて

2

イメージはImage XObjectsとしてPDFに保存されます。 XObjectは、eXternal Objectの略です。これは、イメージのビットとバイトがページのコンテンツストリームに格納されていないことを意味します。

正しく使用されると、iTextはそのようなXObjectに画像のビットとバイトを追加し、必要に応じていつでも再利用します。同じ画像を複数回追加してファイルサイズが大きくなると、iTextを正しく使用していないことになります。

Chapter 3 of the tutorial "iText 7: Building Blocks"を参照し、MaryReillyV2の例とMaryReillyV3の例を比較してください。

これは正しいです:

Image img = new Image(ImageDataFactory.create(MARY)); 
document.add(img); 
document.add(img); 

これは、ファイルサイズは16キロバイトでドキュメントを作成します。

これは間違っている:

Image img1 = new Image(ImageDataFactory.create(MARY)); 
document.add(img1); 
Image img2 = new Image(ImageDataFactory.create(MARY)); 
document.add(img2); 

これは、ファイルサイズは31キロバイトでドキュメントを作成します。どちらのPDFは肉眼と同じに見える

enter image description here

唯一の違いは、31キロバイトのPDFが誰かによって作成されたのに対し、16キロバイトのPDFは、マニュアルを読んで誰かによって作成されたことがある人しなかった。

ファイルmary_reilly_V1.pdfは、画像を1度追加したPDFファイルです。ご存じのように、イメージを2回正しく追加したPDFとのファイルサイズの違いはほぼ同じです。

エクストラ発言

答えはiTextの7についてですが、同じ原理がiTextの5

+0

優秀、ブルーノの質問にお答えいただきありがとうございます! – Wyzak

関連する問題