Java: Generating PDF and Previewing it as an Image – iText and PDF Renderer

Lucas Jellema 6

Inspired by a blog article by Edwin Biemond, I decided to try it out myself: previewing an PDF document in an image. However, Edwin used jPedal (http://www.jpedal.org/), a commercial product. It is not extremely expensive – but not freely available., So I decided to look a little further for a truly open source and free product. I found PDF Renderer, published by Sun Microsystems:https://pdf-renderer.dev.java.net/ .It could easily do for me what I was looking for.

As an additional step, I also used iText – http://www.lowagie.com/iText/download.html – an open source project that support programmatic generation of PDF document from Java.

Within half an hour, I had a program running that generated the following preview of the first page of a dynamically produced PDF document:

 

The steps for achieving this are amazingly simple:

Steps:

1. Download iText

Go to http://www.lowagie.com/iText/download.html and download iText-2.1.4.jar.

2. Download PDF Renderer

Go to https://pdf-renderer.dev.java.net/ and download PDFRenderer.jar

3. Create Project

In your favorite IDE, create an Application/Workspace/Project – whatever you need to get going on an application. Add the two JAR-files you just downloaded as libraries.

4. Create Class

Create a class that creates a PDF document on the fly and then has its first page turned into an image that can be previewed, for example in a Swing Panel:

package pdfimagegenerator;

import com.lowagie.text.Document;

import com.lowagie.text.DocumentException;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;

import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFPage;

import java.awt.Image;
import java.awt.Rectangle;

import java.io.*;

import java.net.MalformedURLException;
import java.net.URL;

import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

import javax.swing.*;

public class PdfToImage {
    public PdfToImage() {
    }

    private static ByteArrayOutputStream createPDF() throws DocumentException,
                                                            MalformedURLException,
                                                            IOException {
        Document doc = new Document();
        ByteArrayOutputStream baosPDF = new ByteArrayOutputStream();
        PdfWriter docWriter = null;
        docWriter = PdfWriter.getInstance(doc, baosPDF);
        doc.open();
        URL imageUrl = new URL("http://www.bruinenfit.nl/images/pdf-logo.jpg");
        com.lowagie.text.Image image = com.lowagie.text.Image.getInstance(imageUrl);

        image.scaleToFit(300,100);
        image.setAlignment(com.lowagie.text.Image.ALIGN_CENTER);
        doc.add(image);
        doc.add(new Paragraph("This special PDF document was created on " +
                              new java.util.Date()));

        doc.close();
        docWriter.close();
        return baosPDF;
    }

    public static void previewPDFDocumentInImage() throws IOException {
        ByteBuffer buf = null;

        try {
            buf = ByteBuffer.wrap(createPDF().toByteArray());
        } catch (DocumentException e) {
        }
        // use the PDF Renderer library on the buf which contains the in memory PDF document
        PDFFile pdffile = new PDFFile(buf);
        PDFPage page = pdffile.getPage(1);

        //get the width and height for the doc at the default zoom
        Rectangle rect =
            new Rectangle(0, 0, (int)page.getBBox().getWidth(), (int)page.getBBox().getHeight());

        //generate the image
        Image img = page.getImage(rect.width, rect.height, //width & height
                rect, // clip rect
                null, // null for the ImageObserver
                true, // fill background with white
                true) // block until drawing is done
        ;

        //show the image in a frame
        JFrame frame = new JFrame("My incredible PDF document");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JLabel(new ImageIcon(img)));
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(final String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    try {
                        PdfToImage.previewPDFDocumentInImage();
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
            });
    }
}

5. Run the class

The outcome looks like this:

Resources

 

http://java-polis.blogspot.com/2007/11/creating-pdf-documents-dynamically-in.html

6 thoughts on “Java: Generating PDF and Previewing it as an Image – iText and PDF Renderer

  1. This example works like a charm, for one page. In case of multiple pages, doc.newPage();  after  doc.add(image); do the stuff.
     

  2. This is a good way of generating PDF dynamically. The only problem with this means is that there are no controls similar to Adobe Reader’s controls. How could that be added to the application.

Comments are closed.

Next Post

ADF 11g - TreeTable with sub totals - how the SQL query can make life easier for the View developer

Facebook0TwitterLinkedinThe ADF 11g Tree Table component can be used for the compact presentation of fairly complex data sets. It allows the user to quickly drill down to a specific area of interest. For example to find all Roles within a specific Department and for any Role all Employees in that […]