BIRT で背景画像を指定すると、PDF 生成ルーチンは、PDF のすべてのページの背景画像として一度参照するのではなく、PDF 内の画像情報を繰り返すようです (少なくとも、この時点で問題を理解しているようです)。 PDF.
これにより、BIRT で生成された PDF が大きくなりすぎます。ファイルサイズをより合理的に保ちながら、BIRT が画像を PDF 内に一度だけ保存し、PDF の各ページの背景画像にする方法はありますか?
BIRT で背景画像を指定すると、PDF 生成ルーチンは、PDF のすべてのページの背景画像として一度参照するのではなく、PDF 内の画像情報を繰り返すようです (少なくとも、この時点で問題を理解しているようです)。 PDF.
これにより、BIRT で生成された PDF が大きくなりすぎます。ファイルサイズをより合理的に保ちながら、BIRT が画像を PDF 内に一度だけ保存し、PDF の各ページの背景画像にする方法はありますか?
はい、BIRTは各ページに同じ背景画像の新しいインカネーションを作成します。残念ながら、これはあまりにも深く埋もれているorg/eclipse/birt/report/engine/emitter/pdf/PDFPage.javaため、簡単にうまくハックすることはできず、ほとんどの場合、構成できません。
しかし、絶望はありません!iText(BIRTによって内部的に使用されるのと同じiText)を使用して、。で重複するエンティティを削除PdfSmartCopyできます。次のようなもの:
PdfReader reader = new PdfReader(PDF_IN_FROM_BIRT);
Document document = new Document();
PdfSmartCopy copy = new PdfSmartCopy(document,
new FileOutputStream(PDF_OUT_NO_DUPLICATES));
document.open();
for (int page = 1; page <= reader.getNumberOfPages(); page++) {
copy.addPage(copy.getImportedPage(reader, page));
}
document.close();
上記が受け入れられない場合は、パッチcom.itextpdf.text.Image.getInstance(URL)を適用してシングルトンのように動作させ、過去com.itextpdf.text.Imageに同じオブジェクトから画像を取得したことがある場合は、既存のオブジェクトを返すことができます。URLBIRTで使用されるiTextJARにパッチを適用して再構築するか、Javassistを使用して、再コンパイルせずに実行時にコードインジェクションを実行できます。