iText 7 http://itextpdf.com/ライブラリを使用します:itext7-io-7.0.2.jar、itext7-kernel-7.0.2.jar、itext7-layout-7.0.2.jar、slf4j- api-1.7.25.jar、slf4j-simple-1.7.25.jar、 はドキュメントページの背景イメージを設定し、いくつかの類似したページを同じドキュメント(pdf-file)に保存します。イメージファイルiText 7 jarファイルから背景イメージを読み取る
final String IMAGE = "/resources/image.jpg";
は、jarファイルのリソースとして保存する必要があります。 java.awtでの
ImageData imgData = ImageDataFactory.create(new Main().loadImage(IMAGE), true);
コード:ImageDataをオブジェクトは、メソッドがcom.itextpdf.io.image.ImageDataFactoryの(java.awt.Imageの画像、をjava.awt.Color色)を作成し使用して作成されます。 image.BufferedImage loadImage(文字列imageFilename)メソッドです:
private BufferedImage loadImage(String imageFilename) {
BufferedImage img = null;
try {
img = javax.imageio.ImageIO.read(getClass().getResourceAsStream(imageFilename));
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
return img;
}
のImageDataオブジェクトをループで使用されます。
Document document = ... (get Document object)
PdfDocument pdf = document.getPdfDocument();
PageSize pageSize = pdf.getDefaultPageSize();
PdfPage page = pdf.addNewPage();
for (int i = 0; i < documents.size(); i++) {
PdfCanvas canvas = new PdfCanvas(page);
canvas.addImage(imgData, pageSize, false);
... (add document body)
if (i < documents.size() - 1) {
page = pdf.addNewPage();
document.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
}
}
document.close();
問題は、私は、JARファイルからプログラムを実行した後、私は得ることですpdf-文書はmuです(createメソッドを使用しますが、画像のバイトからのImageDataオブジェクトを作成した場合
ImageData imgData = ImageDataFactory.create("src/resources/image.jpg");
:私は、直接画像参照(81メガバイト対17ページの文書のための9メガバイト)を使用して、IDEからプログラムを実行したときよりも大きなCH com.itextpdf.io.image.ImageDataFactoryのバイト[]バイト、ブールrecoverImage):
ImageData imgData = ImageDataFactory.create(new Main().loadImageByte(IMAGE), true);
と使用バイト[] loadImageByte(文字列imageFilename)方法:
private byte[] loadImageByte(String imageFilename) {
byte[] dataBytes = null;
try {
InputStream is = getClass().getResourceAsStream(imageFilename);
dataBytes = new byte[is.available()];
is.read(dataBytes);
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
return dataBytes;
}
SI作成されたpdfドキュメントのzeは、IDEからプログラムを実行するとき、またはjarファイルから開始するときの両方で小さくなります。 ただし、後者の場合、文書が開かないため、Adobe Acrobat 9に「画像のデータが不十分です」というエラーが表示されます(両方の文書のバイトが異なります)。
ファイルサイズが異なる理由は何ですか?jarファイルからプログラムによって小さなサイズのpdfドキュメントを取得する方法はありますか?
確かめるためにすべてを詳細に調べる必要がありますが、ファイルサイズが異なると考えられる理由は、サイズが小さい場合、イメージはXOBjectとして一度保存され、ドキュメント全体と大きなファイルの場合は、その都度イメージが追加されます。 –
'loadImageByte'経由の2回目の試みについて:' is.available() 'を使ってリソースファイルのサイズを調べます。これは間違っていますが、 'is.available()'は実際に使用されている 'InputStream'クラスに応じてより小さい値を返します。実際に使用される' InputStream'クラスは、ファイルシステム内のリソースjarアーカイブから圧縮されたリソースを使用してjarファイルから実行されます。 – mkl
問題を再現するためにイメージファイルを共有できますか? – mkl