I have compiled code to insert a dynamic image into a PDF using ColdFusion and iText , filling in some form fields as well. After I started working and wrote about it, I could not help but think that there might be a better way to achieve this. I am using the basic idea of ββthis in a production application right now, so any comments or suggestions would be most welcome.
<cfscript> // 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(); </cfscript> <!β write out new PDF to the browser β> <cfcontent type="application/pdf" file = "
source share