2010-03-24 20 views
11

ऐसा लगता है (कम से कम इस बिंदु पर इस मुद्दे की हमारी समझ है) कि बीआईआरटी में पृष्ठभूमि छवि दी गई है, पीडीएफ पीढ़ी की दिनचर्या पीडीएफ के अंदर छवि की जानकारी दोहराती है, इसे एक बार सभी पृष्ठों की पृष्ठभूमि छवि के रूप में संदर्भित करने के बजाय पीडीएफ का।पृष्ठभूमि छवि के साथ बीआईआरटी उत्पन्न पीडीएफ के आकार को कम करने के लिए कैसे?

इससे हमारे बीआईआरटी जेनरेट किए गए पीडीएफ बहुत बड़े होते हैं। क्या बीआईआरटी को पीडीएफ के अंदर एक बार छवि को स्टोर करने का कोई तरीका है और फ़ाइल आकार को और अधिक उचित रखते हुए पीडीएफ के प्रत्येक पृष्ठ पर पृष्ठभूमि छवि होनी चाहिए?

+0

+1 दिलचस्प सवाल। मैंने कभी यह नहीं देखा ... – ChristopheD

उत्तर

7

हां, बीआईआरटी प्रत्येक पृष्ठ के लिए एक ही पृष्ठभूमि छवि का एक नया अवतार बनाएगा। दुर्भाग्यवश यह org/eclipse/birt/report/engine/emitter/pdf/PDFPage.java में आसानी से अच्छी तरह से हैक करने के लिए बहुत गहराई से दफनाया गया है, और यह निश्चित रूप से कॉन्फ़िगर करने योग्य नहीं है।

लेकिन निराशा नहीं! आप iText (बीआईआरटी द्वारा आंतरिक रूप से उपयोग किए जाने वाले वही 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। आप बीआईआरटी द्वारा उपयोग किए गए आईटेक्स्ट जेएआर को पैच और पुनर्निर्माण कर सकते हैं, या रीकंपिलेशन की आवश्यकता के बिना रनटाइम पर कोड इंजेक्शन करने के लिए Javassist का उपयोग कर सकते हैं।

+1

धन्यवाद Vlad, PdfSmartCopy एक कामकाज था जो हमारे लिए अच्छा काम करता था। – Yishai

संबंधित मुद्दे