2011-08-14 12 views
8

मेरी वर्तमान प्रोजेक्ट में, मैं एक पीडीएफबॉक्स दस्तावेज़ में BufferedImage जोड़ने का प्रयास करता हूं। अधिक विशिष्ट रूप से, मैं JFreeChart से एक छवि का उपयोग करता हूं। मेरा कोड इस तरह दिखता है:पीडीएफबॉक्स दस्तावेज़ में BufferedImage जोड़ें

public void exportToPDF(JFreeChart chart, String filePath){ 
    PDDocument doc = null; 
    PDPage page = null; 
    PDXObjectImage ximage = null; 

    try { 
     doc = new PDDocument(); 
     page = new PDPage(); 
     doc.addPage(page); 
     PDPageContentStream content = new PDPageContentStream(doc, page); 
     BufferedImage image = chart.createBufferedImage(300, 300); 
     ximage = new PDJpeg(doc, image); 
     content.drawImage(ximage, 20, 20); 
     content.close(); 
    } catch(IOException ie) { 
    } 
    doc.save(filePath); 
    doc.close(); 
} 

दस्तावेज़ बनाया गया है; मैं टेक्स्ट जोड़ सकता हूं, लेकिन मुझे यह बताते हुए एक त्रुटि मिलती है कि छवि में पर्याप्त जानकारी नहीं है।

कोई भी संकेत जो मैं गलत कर रहा हूं?

+0

त्रुटि क्या है? – leonm

+0

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

+0

यह यह बग हो सकता है: https://issues.apache.org/jira/browse/PDFBOX-2026 यह 1.8.5 में तय किया जाएगा। या एक स्नैपशॉट डाउनलोड करें। –

उत्तर

7

ट्रैशगोड की मदद करने के लिए धन्यवाद। पिछली रात और कुछ घंटों पहले पिपेडइन/आउटस्ट्रीम के बारे में भ्रमित हो रही थी। इसे समझ नहीं सकते। हालांकि, मुझे यह काम करने के लिए मिला। बाहर निकलना यह बिल्कुल मुश्किल नहीं था।

public void exportToPDF(JFreeChart chart, String filePath){ 
    PDDocument doc = null; 
    PDPage page = null; 
    PDXObjectImage ximage = null; 
    try { 
     doc = new PDDocument(); 
     page = new PDPage(); 
     doc.addPage(page); 
     PDPageContentStream content = new PDPageContentStream(doc, page); 

     //create a new outStream 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     ChartUtilities.writeChartAsJPEG(out, chart, 300, 300);//write to outstream 
     //create a new inputstream 
     InputStream in = new ByteArrayInputStream(out.toByteArray()); 
     ximage = new PDJpeg(doc, in); 
     content.drawImage(ximage, 5, 300); 
     content.close(); 
    } 
    catch (IOException ie){ 
     //handle exception 
    } 
    //save and close 
    doc.save(filePath); 
    doc.close(); 
} 

मुझे यकीन है कि यह बेहतर किया जा सकता है लेकिन यह काम करता है।

3

दो बातें बाहर खड़े:

  • अपवाद निगल न करें।

  • ChartUtilities का उपयोग उपयुक्त प्रारूप में छवि को प्रस्तुत करने के लिए करें, जैसा कि here सुझाया गया है।

+0

तो मैंने देखा कि आपने क्या कहा है, मैं आउटपुटस्ट्रीम का उपयोग कर आउटस्ट्रीम प्राप्त कर सकता हूं: आउटपुटस्ट्रीम आउट = नया बाइटएरे ऑटपुटस्ट्रीम(); और फिर: चार्टउटीलिटीज .writeChartAsJPEG (आउट, चार्ट, 300, 300); हालांकि, मैं यह नहीं समझ सकता कि इसे इनपुटस्ट्रीम में कैसे चालू किया जाए। – Oglop

+0

'आउटपुटस्ट्रीम' से डेटा को 'इनपुटस्ट्रीम' में पाइप स्ट्रीमों का उपयोग करने के लिए, [यहां] दिखाया गया है (http://stackoverflow.com/questions/4443878/redirecting-system-out-to-jtextpane/4444677#4444677) और [यहां] (http://stackoverflow.com/questions/484119/why-doesnt-more-java-code-use-pipedinputstream-pipedoutputstream)। – trashgod

+0

इसके अलावा, आप छवि को फ़ाइल के रूप में सहेज सकते हैं या इसके बाइट सरणी को कैश कर सकते हैं। 'पीएनजी' वी' जेपीजी '[ट्रेडऑफ] (http://www.turnkeylinux.org/blog/png-vs-jpg) पर भी विचार करें। – trashgod

5

एक आसान तरीका pdfbox के साथ एक पीडीएफ में एक JFreeChart सम्मिलित करने के लिए नहीं है:

BufferedImage bufferedImage = source.getChart().createBufferedImage(source.getWidth(), 
     source.getHeight(), BufferedImage.TYPE_INT_RGB, null); 
PDXObjectImage ximage = new PDJpeg(doc, bufferedImage); 
किसी भी स्ट्रीम के बिना

;)

+0

ऐसा लगता है कि मैं फिर से क्या देख रहा था। महान! – Oglop

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