Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iTextSharp produce PDF from existing PDF template

Tags:

c#

pdf

itextsharp

I am looking at the feasibility of creating something using C# and iTextSharp that can take a PDF template and replace various place holder values with actual values retrieved from a database. Essentially a PDF mail merge. I have the iText in action book but it covers rather a lot of stuff i don't need and I am struggling to find anything related to what i want to do. I am happy to use PDF fields as the place holders so long as the merged/flattened form does not look like it has fields in it, the output document should look like a mail merged letter and not a form that has been filled in. In an ideal world i just want search the text content of the PDF and then replace text place holders with their correct field values a la word mail merge.

Can anyone advise me of the best approach to this and point me in the direction of the most helpful iTextSharp classes to use, or if you know the iText in Action book a pointer to the most helpful section for me to read.

like image 979
Ben Robinson Avatar asked Jun 08 '11 11:06

Ben Robinson


1 Answers

  1. Build your template sans fields in your page-layout/text-editor of choice.
  2. Save to PDF.
  3. Open that PDF and add fields to it. This is easy to do in Acrobat Pro (you could download a trial if need be). It's also possible in iText, just much harder.

In either case, you want to set your form fields to have no border, and no background... that way only their contents will be visible, no boxes to make your fields look like fields.

Merging field data into a form is Quite Trivial with iText (forgive my Java, I don't know much about C#):

void fillPDF( String filePath, Map<String, String> fieldVals ) {
  PdfReader reader = new PdfReader(myFilePath);

  PdfStamper stamper = new PdfStamper( reader, outputFileStream );
  stamper.setFormFlattening(true);

  AcroFields fields = stamper.getAcroFields();

  for (String fldName : fieldVals.keySet()) {
    fields.setField( fldName, fieldVals.get(fldName) );
  }

  stamper.close();
}

This ignores list boxes with multiple selections (and exceptions), but other than that should be ready to go. Given that you're doing a mail-merge type thing, I don't think multiple selections will be much of an issue.

like image 54
Mark Storer Avatar answered Sep 21 '22 01:09

Mark Storer