Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating a new PDF document using PDFBOX API

Tags:

java

pdfbox

I need to create a PDF which will hold the report of execution status, where the status would be in table structure. Is it possible to generate pdf table format with the PDFBOX api?

Here is some sample code for creating a new PDF document:

import java.awt.Color;
import java.io.IOException;
import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;



public class HelloWorld
{
    /**
     * Constructor.
     */
    public HelloWorld()
    {
        super();
    }


    public static void main(String[] args) throws IOException, COSVisitorException
    {
        PDDocument doc = null;
    try
    {
        doc = new PDDocument();

        PDPage page = new PDPage();
        doc.addPage( page );
        PDFont font = PDType1Font.COURIER_BOLD_OBLIQUE;
        Color color = Color.blue; 


        PDPageContentStream contentStream = new PDPageContentStream(doc, page);
        contentStream.beginText();
        contentStream.setFont( font, 12 );
        contentStream.setNonStrokingColor(color);
        contentStream.moveTextPositionByAmount( 100, 700 );
        contentStream.drawString( "message" );

        contentStream.setNonStrokingColor(Color.GREEN);
        contentStream.drawString( "Hi" );

        contentStream.endText();
        contentStream.close();
        doc.save( "d:\\abc.pdf" );
    }
    finally
    {
        if( doc != null )
        {
            doc.close();
        }
    }
    } 
}
like image 386
Ganeshja Avatar asked May 14 '13 11:05

Ganeshja


People also ask

How do I add a page to my PDFBox?

You can add a page to the PDF document using the addPage() method of the PDDocument class. To this method you need to pass the PDPage object as a parameter. Therefore, add the blank page created in the previous step to the PDDocument object as shown in the following code block.

What is the use of PDFBox?

It allows the creation of new PDF documents, manipulation of existing documents, bookmarking PDF and the ability to extract content from PDF documents. We can also use it to digitally sign, print and validate files against the PDF/A-1b standard. PDFBox library was originally developed in 2002 by Ben Litchfield.


2 Answers

Try this:

public static void drawTable(PDPage page, PDPageContentStream contentStream,
                             float y, float margin,
                             String[][] content) throws IOException {
        final int rows = content.length;
        final int cols = content[0].length;
        final float rowHeight = 20f;
        final float tableWidth = page.getCropBox().getWidth() - margin - margin;
        final float tableHeight = rowHeight * rows;
        final float colWidth = tableWidth/(float)cols;
        final float cellMargin=5f;

        //draw the rows
        float nexty = y ;
        for (int i = 0; i <= rows; i++) {
            contentStream.drawLine(margin, nexty, margin+tableWidth, nexty);
            nexty-= rowHeight;
        }

        //draw the columns
        float nextx = margin;
        for (int i = 0; i <= cols; i++) {
            contentStream.drawLine(nextx, y, nextx, y-tableHeight);
            nextx += colWidth;
        }

        //now add the text
        contentStream.setFont( PDType1Font.HELVETICA_BOLD , 12 );

        float textx = margin+cellMargin;
        float texty = y-15;
        for(int i = 0; i < content.length; i++){
            for(int j = 0 ; j < content[i].length; j++){
                String text = content[i][j];
                contentStream.beginText();
                contentStream.moveTextPositionByAmount(textx,texty);
                contentStream.drawString(text);
                contentStream.endText();
                textx += colWidth;
            }
            texty-=rowHeight;
            textx = margin+cellMargin;
        }
    }

And simply call this method in main function

public static void main(String[] args) throws IOException, COSVisitorException {
    PDDocument doc = new PDDocument();
    PDPage page = new PDPage();
    doc.addPage( page );
    PDPageContentStream contentStream = new PDPageContentStream(doc, page);

    String[][] content = {
        {"Name"," Time "},
        {"HTC","01:25"},
        {"Samsung Tab2","05:30"}
    } ;

    drawTable(page, contentStream, 700, 100, content);

    contentStream.close();
    doc.save("h:\\test.pdf" );
} 
like image 81
immutable Avatar answered Oct 04 '22 08:10

immutable


import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.pdmodel.graphics.xobject.*;
import org.apache.pdfbox.pdmodel.edit.*;
import org.apache.pdfbox.pdmodel.font.*;


public class PDFExample {   

    public static void main(String[] args){
    // Create a document and add a page to it
    try {
    PDDocument document = new PDDocument();
    PDPage page = new PDPage();
    document.addPage(page); 

    // Image to use 
    PDXObjectImage img = new PDJpeg(document, new FileInputStream( new File("C://213480-EligibilityFormHeader.jpg") ) );

    // Create a new font object selecting one of the PDF base fonts
    PDFont font = PDType1Font.HELVETICA_BOLD;

    // Start a new content stream which will "hold" the to be created content
    PDPageContentStream contentStream = new PDPageContentStream(document, page,true,true);

    contentStream.setFont( font, 6 );
    contentStream.drawImage(img, 25, 700);

    drawTable( page,  contentStream );

    // Make sure that the content stream is closed
    contentStream.close();

    // Save the results and ensure that the document is properly closed
    document.save( "C://HelloWorld.pdf");
    document.close();
    } catch (Exception e) {
        System.out.println("Exception is: ");
    }
    }

    private static void drawTable( PDPage page, PDPageContentStream contentStream) {
        try {
            float y = 650;
            float margin = 130;

            String[] content = {"One","Two", "Date", "Score", "Score2", "Score3", "Score4", "Score5", "Score6"};

            final int rows = content.length;
            final int cols = 2;
            final float rowHeight = 22f;
            final float tableWidth =  900.0f;
            final float tableHeight = rowHeight * rows;
            final float cellMargin=1f;

            //draw the rows
            float nexty = y ;
            for (int i = 0; i <= rows; i++)
            {
                contentStream.drawLine(margin, nexty, 400, nexty);
                nexty-= rowHeight;
            }

            float colWidthX [] = {200,70,0};

            //draw the columns
            float nextx = margin;
            for (int i = 0; i <= cols; i++)
            {
                contentStream.drawLine(nextx, y, nextx, y-tableHeight);
                nextx += colWidthX[i] ; //colWidth;
            }

            //now add the text
            float textx = margin+cellMargin;
            float texty = y-15;
            //textx = margin+cellMargin;


                for(int j = 0 ; j < rows; j++) {
                    contentStream.beginText();
                    contentStream.moveTextPositionByAmount(textx,texty);

                    contentStream.drawString(content[j]);
                    contentStream.endText();
                    textx += colWidthX[0]+9;
                    contentStream.beginText();
                    contentStream.moveTextPositionByAmount(textx,texty);
                    if(j==0)
                        contentStream.drawString( "1" );
                    if(j==1)
                        contentStream.drawString( "12345" );
                    if(j==2)
                        contentStream.drawString( "05-December-2003" );
                    if(j==3)
                        contentStream.drawString( "15" );
                    if(j==4)
                        contentStream.drawString( "1" );
                    if(j==5)
                        contentStream.drawString( "1" );
                    if(j==6)
                        contentStream.drawString( "1" );
                    if(j==7)
                        contentStream.drawString( "1" );
                    if(j==8)
                        contentStream.drawString( "1" );

                    contentStream.endText();
                    textx = margin+cellMargin; //colWidth;
                    texty -= rowHeight; //row height

                }
                texty-=rowHeight;
                textx = margin+cellMargin;
        }
        catch ( IOException ioe )
        {
            //Package.log.error( " drawTable :" + ioe);
            final String errormsg = "Could not drawTable ";
            //Package.log.error("In RuleThread drawTable " + errormsg, ioe);
            throw new RuntimeException(errormsg, ioe);
        }
        catch ( Exception ex )
        {
            //Package.log.error( " drawTable :" + ex);
            final String errormsg = "Could not drawTable ";
            //Package.log.error("In RuleThread drawTable " + errormsg, ex);
            throw new RuntimeException(errormsg, ex);
        }
    }


}
like image 27
VGK Avatar answered Oct 04 '22 07:10

VGK