如何用背景图像减小BIRT生成PDF的大小?

时间:2010-03-24 22:38:19

标签: pdf-generation birt

在BIRT中给出背景图像时,似乎(至少这是我们对此问题的理解),PDF生成例程重复PDF中的图像信息,而不是将其作为所有背景图像引用PDF页面。

这导致我们的BIRT生成的PDF太大。有没有办法让BIRT只将图像存储在PDF中,并将其作为PDF每页的背景图像,同时保持文件大小更合理?

1 个答案:

答案 0 :(得分: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在运行时执行代码注入,而无需重新编译。