似乎(至少这是我们此时对问题的理解)给定 BIRT 中的背景图像,PDF 生成例程会重复 PDF 中的图像信息,而不是将其作为所有页面的背景图像引用。 PDF格式。
这会导致我们的 BIRT 生成的 PDF 太大。有没有办法让 BIRT 只在 PDF 中存储一次图像,并将其作为 PDF 每一页的背景图像,同时保持文件大小更合理?
似乎(至少这是我们此时对问题的理解)给定 BIRT 中的背景图像,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
,如果过去已经从同一对象获取图像,则返回现有对象URL
。您可以修补和重建 BIRT 使用的 iText JAR,或使用Javassist在运行时执行代码注入,而无需重新编译。