Last active
August 29, 2015 14:21
-
-
Save JoelGeraci-Datalogics/0f0c603a484eb0d18a20 to your computer and use it in GitHub Desktop.
Merging PDF Files and Retaining Interactive Fields Using the Datalogics PDF Java Toolkit
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright Datalogics, Inc. 2015 | |
*/ | |
package pdfjt.cookbook.combine; | |
import com.adobe.internal.io.ByteReader; | |
import com.adobe.internal.io.ByteWriter; | |
import com.adobe.internal.io.InputStreamByteReader; | |
import com.adobe.pdfjt.core.types.ASRectangle; | |
import com.adobe.pdfjt.pdf.document.PDFDocument; | |
import com.adobe.pdfjt.pdf.document.PDFOpenOptions; | |
import com.adobe.pdfjt.pdf.document.PDFSaveFullOptions; | |
import com.adobe.pdfjt.pdf.document.PDFVersion; | |
import com.adobe.pdfjt.pdf.interactive.forms.PDFField; | |
import com.adobe.pdfjt.pdf.interactive.forms.PDFInteractiveForm; | |
import com.adobe.pdfjt.services.manipulations.PMMOptions; | |
import com.adobe.pdfjt.services.manipulations.PMMService; | |
import java.io.File; | |
import java.io.FileInputStream; | |
import java.util.Iterator; | |
import pdfjt.util.SampleFileServices; | |
public class MergeFormsRetainingFields { | |
private static final String inputDir = "cookbook/MergeForms/input"; | |
private static final String outputDir = "cookbook/MergeForms/output"; | |
private static final String outputFilename = "MergedFormsWithFields.pdf"; | |
/** | |
* @param args | |
*/ | |
public static void main(String[] args) throws Exception{ | |
/* | |
* Start by creating a new PDF document that will be used to merge the | |
* other documents into. The new document will contain a single blank page | |
* but we'll remove this just before saving the merged file. | |
*/ | |
PDFDocument mergedDocument = PDFDocument.newInstance( | |
new ASRectangle(new double[]{ 0, 0, 612, 792}), | |
PDFOpenOptions.newInstance()); | |
/* | |
* Create the new PMMService that will be used to manipulate the pages. | |
*/ | |
PMMService pmmService = new PMMService(mergedDocument); | |
try { | |
/* | |
* Add the files in the input directory to the new PDF file. This | |
* process will append the pages from each document to the end of | |
* the new document creating a continuous series of pages. | |
* | |
* Folders will be skipped. | |
*/ | |
File root = new File(inputDir); | |
File[] list = root.listFiles(); | |
if (list == null) return; | |
for (File pdfFile : list) { | |
if (pdfFile.isDirectory() == false) { | |
String pdfFileName = pdfFile.getName(); | |
FileInputStream fis = new FileInputStream(pdfFile); | |
ByteReader byteReader = new InputStreamByteReader(fis); | |
PDFDocument pdfToAppend = PDFDocument.newInstance(byteReader, PDFOpenOptions.newInstance()); | |
String pdfBaseFileName = pdfFileName.substring(0, pdfFileName.length() - 4); | |
/* | |
* Unless the following step is taken, form fields with the | |
* same name will be merged and assume the value of the | |
* first field encountered during the append. | |
* | |
* To ensure that each field in the combined file has a | |
* unique name, we'll prepend the file name to the field | |
* name prior to combining. | |
*/ | |
// Get the form and then the field iterator | |
PDFInteractiveForm pdfInteractiveForm = pdfToAppend.getInteractiveForm(); | |
Iterator<PDFField> fieldIterator = pdfInteractiveForm.iterator(); | |
// Iterator over form fields | |
while(fieldIterator.hasNext()) { | |
PDFField pdfField = (PDFField)(fieldIterator.next()); | |
//Change the field name | |
pdfField.setPartialName(pdfBaseFileName+"."+pdfField.getPartialName()); | |
} | |
// Now append the PDF with the modified field names. | |
System.out.println("Appending " + pdfFileName + " to the end of "+outputFilename); | |
pmmService.appendPages(pdfToAppend, null, PMMOptions.newInstanceAll()); | |
byteReader.close(); | |
} | |
} | |
/* | |
* Remove the first page. We don't need it anymore. | |
*/ | |
mergedDocument.requirePages().removePage(mergedDocument.requirePages().getPage(0)); | |
/* | |
* Save the file | |
*/ | |
ByteWriter outputWriter = SampleFileServices.getRAFByteWriter(outputDir + File.separator + outputFilename); | |
mergedDocument.save(outputWriter, PDFSaveFullOptions.newInstance(PDFVersion.v1_7)); | |
System.out.println("Created "+outputFilename +" with "+mergedDocument.requirePages().getCount()+" pages"); | |
mergedDocument.close(); | |
outputWriter.close(); | |
} finally { | |
// | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment