Add BufferedImage to PDFBox document
Asked Answered
M

3

8

In my current project, I try to add a BufferedImage to a PDFBox document. More specificly, I use an image from a JFreeChart. My code looks like this:

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

The document gets created; I can add text, but I get an error stating the the image does not have enough information to be shown.

Any clue to what I am doing wrong?

Mesnalty answered 14/8, 2011 at 6:51 Comment(2)
The error message is displayed in the generated pdf file, I should have been clear on that. When i open the file it dislays all text as it should but instead of an image i get a message "Unsufficient data to display image". Im more or less green when it comes to siplaying images so any ideas are welcomedMesnalty
This might be this bug: issues.apache.org/jira/browse/PDFBOX-2026 It will be fixed in 1.8.5. Or download a snapshot.Bromine
M
7

Thanks for helping me out trashgod. Spent last night and a few hours today beeing confused about PipedIn/OutStreams. Can´t figure it out. However, i got it to work. Turns out it wasn´t very difficult at all.

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

I´m sure this can be done better but it works.

Mesnalty answered 15/8, 2011 at 16:20 Comment(0)
D
5

There is an easy way to insert a JFreeChart into a pdf with pdfbox:

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

Without any stream ;)

Disagreeable answered 5/10, 2012 at 9:3 Comment(1)
This seems to be what I was looking for back then. Great!Mesnalty
K
3

Two things stand out:

  • Do not swallow exceptions.

  • Do use ChartUtilities to render the image in a suitable format, as suggested here.

Kebab answered 14/8, 2011 at 12:43 Comment(3)
So i looked at what you said, i can get an outputStream by using: OutputStream out = new ByteArrayOutputStream(); and then: ChartUtilities.writeChartAsJPEG(out, chart, 300, 300); however, i can´t figure out how to turn this into an inputstream.Mesnalty
To move data from an OutputStream to an InputStream use piped streams, shown here and here.Kebab
Also, you can just save the image as a file or cache its byte array. Also consider the PNG v JPG tradeoff.Kebab

© 2022 - 2024 — McMap. All rights reserved.