2011-08-14 2 views
8

현재 프로젝트에서 PDFBox 문서에 BufferedImage을 추가하려고합니다. 더 구체적으로는 JFreeChart의 이미지를 사용합니다. 내 코드는 다음과 같습니다.BufferedImage를 PDFBox 문서에 추가

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

생성 된 pdf 파일에 오류 메시지가 표시됩니다. 분명히해야합니다. 파일을 열면 모든 텍스트가 사라집니다. 대신 이미지 대신 "이미지를 표시하는 데 불충분 한 데이터"라는 메시지가 나타납니다. 어떤 이미지가 siplaying 할 때 어떤 아이디어라도 환영받을 정도로 녹색이됩니다. – Oglop

+0

이것은 버그 일 수 있습니다 : https://issues.apache.org/jira/browse/PDFBOX-2026 1.8.5에서 수정 될 것입니다. 또는 스냅 샷을 다운로드하십시오. –

답변

7

trashgod를 도와 주셔서 감사합니다. 어젯밤과 PipedIn/OutStreams에 대해 혼란스러워하는 오늘 몇 시간을 보냈습니다. 그것을 알아낼 수 없습니다. 그러나, 나는 그것이 작동하도록했습니다. 그것이 전혀 어렵지 않았 음을 밝혀냅니다.

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

두 가지 눈에 띄는 :

예외를 삼키지 마십시오
  • .

  • here과 같이 이미지를 적절한 형식으로 렌더링하려면 ChartUtilities을 사용하십시오.

+0

그래서 당신이 말한 것을 보았습니다. 다음을 사용하여 outputStream을 얻을 수 있습니다 : OutputStream out = new ByteArrayOutputStream(); 그리고 나서 : ChartUtilities.writeChartAsJPEG (out, chart, 300, 300); 그러나, 나는 입력 스트림으로 이것을 전환하는 방법을 알아낼 수 없습니다. – Oglop

+0

'OutputStream'에서 'InputStream'으로 데이터를 이동하려면 [여기] (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

또한 이미지를 파일로 저장하거나 바이트 배열을 캐시 할 수 있습니다. 'PNG' v''JPG' [tradeoff] (http://www.turnkeylinux.org/blog/png-vs-jpg)도 고려하십시오. – trashgod

5

pdfbox와 PDF로 된 JFreeChart를 삽입 할 수있는 쉬운 방법이있다 : 어떤 스트림없이

BufferedImage bufferedImage = source.getChart().createBufferedImage(source.getWidth(), 
     source.getHeight(), BufferedImage.TYPE_INT_RGB, null); 
PDXObjectImage ximage = new PDJpeg(doc, bufferedImage); 

가)

+0

이것은 당시 제가 찾고 있던 것 같습니다. 큰! – Oglop

관련 문제