11

BIRT で背景画像を指定すると、PDF 生成ルーチンは、PDF のすべてのページの背景画像として一度参照するのではなく、PDF 内の画像情報を繰り返すようです (少なくとも、この時点で問題を理解しているようです)。 PDF.

これにより、BIRT で生成された PDF が大きくなりすぎます。ファイルサイズをより合理的に保ちながら、BIRT が画像を PDF 内に一度だけ保存し、PDF の各ページの背景画像にする方法はありますか?

4

1 に答える 1

7

はい、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を使用して、再コンパイルせずに実行時にコードインジェクションを実行できます。

于 2010-03-28T05:50:38.223 に答える