11

似乎(至少这是我们此时对问题的理解)给定 BIRT 中的背景图像,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,如果过去已经从同一对象获取图像,则返回现有对象URL。您可以修补和重建 BIRT 使用的 iText JAR,或使用Javassist在运行时执行代码注入,而无需重新编译。

于 2010-03-28T05:50:38.223 回答