2010-03-24 118 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