看起來(至少這是我們對此問題的理解),給定BIRT中的背景圖像,PDF生成例程重複PDF內的圖像信息,而不是將其一次引用爲所有頁面的背景圖像的PDF。如何減少BIRT生成PDF與背景圖像的大小?
這會導致我們的BIRT生成的PDF太大。有沒有辦法讓BIRT只將圖像一次存儲在PDF中,並將其作爲PDF每頁上的背景圖像,同時保持文件大小更合理?
看起來(至少這是我們對此問題的理解),給定BIRT中的背景圖像,PDF生成例程重複PDF內的圖像信息,而不是將其一次引用爲所有頁面的背景圖像的PDF。如何減少BIRT生成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在運行時執行代碼注入,而無需重新編譯。
感謝弗拉德,PdfSmartCopy是一種解決方法,對我們來說效果很好。 – Yishai 2010-04-02 04:02:58
+1有趣的問題。從來沒有注意到這個... – ChristopheD 2010-03-24 22:40:39