Add BufferedImage to PDFBox document

18,336

Solution 1

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.

Solution 2

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

Solution 3

Two things stand out:

  • Do not swallow exceptions.

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

Share:
18,336

Related videos on Youtube

Oglop
Author by

Oglop

Updated on June 08, 2022

Comments

  • Oglop
    Oglop almost 2 years

    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?

  • Oglop
    Oglop over 11 years
    This seems to be what I was looking for back then. Great!