在BIRT中给出背景图像时,似乎(至少这是我们对此问题的理解),PDF生成例程重复PDF中的图像信息,而不是将其作为所有背景图像引用PDF页面。
这导致我们的BIRT生成的PDF太大。有没有办法让BIRT只将图像存储在PDF中,并将其作为PDF每页的背景图像,同时保持文件大小更合理?
答案 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在运行时执行代码注入,而无需重新编译。