2010-03-24 88 views
11

看起来(至少这是我们对此问题的理解),给定BIRT中的背景图像,PDF生成例程重复PDF内的图像信息,而不是将其一次引用为所有页面的背景图像的PDF。如何减少BIRT生成PDF与背景图像的大小?

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

+0

+1有趣的问题。从来没有注意到这个... – ChristopheD 2010-03-24 22:40:39

回答

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在运行时执行代码注入,而无需重新编译。

+1

感谢弗拉德,PdfSmartCopy是一种解决方法,对我们来说效果很好。 – Yishai 2010-04-02 04:02:58