title: Adding a dynamic image to a PDF using ColdFusion and iText
body: <p>I pieced together some code to insert a dynamic image into a PDF using both <a href="http://www.adobe.com/products/coldfusion/" rel="nofollow noreferrer">ColdFusion</a> and <a href="http://www.lowagie.com/iText/" rel="nofollow noreferrer">iText</a>, while filling in some form fields as well. After I got it working and blogged about it, I couldn't help but think that there might be a better way to accomplish this. I'm using the basic idea of this in a production app right now so any comments or suggestion would be most welcomed.</p>
  
  <pre><code>&lt;cfscript&gt;
  // full path to PDF you want to add image to
  readPDF = expandpath(”your.pdf”);
  // full path to the PDF we will output. Using creatUUID() to create
  // a unique file name so we can delete it afterwards
  writePDF = expandpath(”#createUUID()#.pdf”);
  // full path to the image you want to add
  yourimage = expandpath(”dynamic_image.jpg”);
  
  // JAVA STUFF!!!
  // output buffer to write PDF
  fileIO = createObject(”java”,”java.io.FileOutputStream”).init(writePDF);
  // reader to read our PDF
  reader = createObject(”java”,”com.lowagie.text.pdf.PdfReader”).init(readPDF);
  // stamper so we can modify our existing PDF
  stamper = createObject(”java”,”com.lowagie.text.pdf.PdfStamper”).init(reader, fileIO);
  // get the content of our existing PDF
  content = stamper.getOverContent(reader.getNumberOfPages());
  // create an image object so we can add our dynamic image to our PDF
  image = createobject(”java”, “com.lowagie.text.Image”);
  // get the form fields
  pdfForm = stamper.getAcroFields();
  // setting a value to our form field
  pdfForm.setField(”our_field”, “whatever you want to put here”);
  // initalize our image
  img = image.getInstance(yourimage);
  // centering our image top center of our existing PDF with a little margin from the top
  x = (reader.getPageSize(1).width() - img.scaledWidth()) - 50;
  y = (reader.getPageSize(1).height() - img.scaledHeight()) / 2 ;
  // now we assign the position to our image
  img.setAbsolutePosition(javacast(”float”, y),javacast(”float”, x));
  // add our image to the existing PDF
  content.addImage(img);
  // flattern our form so our values show
  stamper.setFormFlattening(true);
  // close the stamper and output our new PDF
  stamper.close();
  // close the reader
  reader.close();
  &lt;/cfscript&gt;
  &lt;!— write out new PDF to the browser —&gt;
  &lt;cfcontent type=”application/pdf” file = “#writePDF#” deleteFile = “yes”&gt;
  </code></pre>