2011-08-14 16 views
8

W moim bieżącym projekcie próbuję dodać BufferedImage do dokumentu PDFBox. Bardziej szczegółowo, używam obrazu z JFreeChart. Mój kod wygląda następująco:Dodawanie obrazu BufferedImage do 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(); 
} 

Dokument zostanie utworzony; Mogę dodać tekst, ale pojawia się błąd stwierdzający, że obraz nie ma wystarczającej ilości informacji do wyświetlenia.

Każda wskazówka, co robię źle?

+0

Jaki jest błąd? – leonm

+0

Komunikat o błędzie jest wyświetlany w wygenerowanym pliku pdf, powinienem był o tym powiedzieć. Kiedy otwieram plik, wyświetla cały tekst, ale zamiast obrazu pojawia się komunikat "Niewystarczające dane do wyświetlenia obrazu". Im bardziej lub mniej zielony, jeśli chodzi o siplaying obrazów, więc wszelkie pomysły są mile widziane – Oglop

+0

To może być ten błąd: https://issues.apache.org/jira/browse/PDFBOX-2026 Zostanie to naprawione w 1.8.5. Lub pobierz migawkę. –

Odpowiedz

7

Dzięki za pomoc w wyrzuceniu trashgod. Spędził ostatniej nocy i kilka godzin dzisiaj jest mylony o PipedIn/OutStreams. Nie mogę tego rozgryźć. Jednak mam to do pracy. Okazuje się, że to wcale nie było trudne.

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(); 
} 

Jestem pewien, że można to zrobić lepiej, ale działa.

3

dwie rzeczy wyróżniają się:

  • Nie połykać wyjątki.

  • Użyj obrazu ChartUtilities, aby renderować obraz w odpowiednim formacie, zgodnie z sugestią here.

+0

Więc spojrzał na to, co powiedziałeś, mogę uzyskać outputStream przy użyciu: OutputStream out = new ByteArrayOutputStream(); a następnie: ChartUtilities.writeChartAsJPEG (out, wykres, 300, 300); jednak nie mogę wymyślić, jak przekształcić to w strumień wejściowy. – Oglop

+0

Aby przenieść dane z 'OutputStream' do strumienia' InputStream' użyj potokowych strumieni, pokazanych [tutaj] (http://stackoverflow.com/questions/4443878/redirecting-system-out-to-jtextpane/4444677#4444677) i [tutaj] (http://stackoverflow.com/questions/484119/why-doesnt-more-java-code-use-pipedinputstream-pipedoutputstream). – trashgod

+0

Ponadto można po prostu zapisać obraz jako plik lub pamięć podręczną w tablicy bajtów. Weź również pod uwagę 'PNG' v' JPG' [tradeoff] (http://www.turnkeylinux.org/blog/png-vs-jpg). – trashgod

5

Jest to łatwy sposób, aby wstawić JFreeChart do PDF z PDFBox:

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

Bez strumienia;)

+0

To wydaje się być tym, czego wtedy szukałem. Wspaniały! – Oglop