Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to automate PDF form-filling in Java

I am doing some "pro bono" development for a food pantry near where I live. They are inundated with forms and paperwork, and I would like to develop a system that simply reads data from their MySQL server (which I set up for them on a previous project) and feeds data into PDF versions of all the forms they are required to fill out. This will help them out enormously and save them a lot of time, as well as get rid of a lot of human errors that are made when filling out these forms.

Not knowing anything about the internals of PDF files, I can foresee two avenues here:

  • Harder Way: It is possible to scan a paper document, turn it into a PDF, and then have software that "fills out" the PDF simply by saying "add text except blah to the following (x,y) coordinates..."; or
  • Easier Way: PDF specification already allows for the construct of "fields" that can be filled out; this way I just write code that says "add text excerpt blah to the field called *address_value*...", etc.

So my first question is: which of the two avenues am I facing? Does PDF have a concept of "fields" or do I need to "fill out" these documents by telling the PDF library the pixel coordinates of where to place data?

Second, I obviously need an open source (and Java) library to do this. iText seems to be a good start but I've heard it can be difficult to work with. Can anyone lend some ideas or general recommendations here? Thanks in advance!

like image 562
IAmYourFaja Avatar asked Jul 28 '12 14:07

IAmYourFaja


People also ask

How do I create a fillable PDF in Java?

You can create fillable PDF form in Java applications by following the steps below: Create a PDF file with a blank page. Add TextBox field and RadioButton field on the page. Save the output PDF file.

How do you process a PDF file in Java?

Step 1: Create a content handler. Step 2: Create a PDF file locally in the system one is using. Step 3: Now, create a FileInputStream that has the same path where the created PDF file is residing. Step 4: For the PDF file, create a content parser with the help of the metadata type object.


2 Answers

You can easily merge data into PDF's fields using the FDF(Form Data Format) technology.

Adobe provides a library to do that : Acrobat Forms Data Format (FDF) Toolkit

Also Apache PDFBox can be used to do that.

like image 112
RealHowTo Avatar answered Sep 18 '22 22:09

RealHowTo


Please take a look at the chapter about interactive forms in the free ebook The Best iText Questions on StackOverflow. It bundles the answers to questions such as:

  • How to fill out a pdf file programatically?
  • How can I flatten a XFA PDF Form using iTextSharp?
  • Checking off pdf checkbox with itextsharp
  • How to continue field output on a second page?
  • finding out required fields to fill in pdf file
  • and so on...

Or you can watch this video where I explain how to use forms for reporting step by step.

See for instance:

public void manipulatePdf(String src, String dest) throws DocumentException, IOException {     PdfReader reader = new PdfReader(src);     PdfStamper stamper = new PdfStamper(reader,             new FileOutputStream(dest));     AcroFields fields = stamper.getAcroFields();     fields.setField("name", "CALIFORNIA");     fields.setField("abbr", "CA");     fields.setField("capital", "Sacramento");     fields.setField("city", "Los Angeles");     fields.setField("population", "36,961,664");     fields.setField("surface", "163,707");     fields.setField("timezone1", "PT (UTC-8)");     fields.setField("timezone2", "-");     fields.setField("dst", "YES");     stamper.setFormFlattening(true);     stamper.close();     reader.close(); } 
like image 39
Bruno Lowagie Avatar answered Sep 16 '22 22:09

Bruno Lowagie