use of com.tom_roush.pdfbox.pdmodel.interactive.form.PDAcroForm in project PdfBox-Android by TomRoush.
the class PDAnnotationTest method createWidgetAnnotationFromField.
@Test
public void createWidgetAnnotationFromField() {
PDDocument document = new PDDocument();
PDAcroForm acroForm = new PDAcroForm(document);
PDTextField textField = new PDTextField(acroForm);
PDAnnotation annotation = textField.getWidgets().get(0);
assertEquals(COSName.ANNOT, annotation.getCOSObject().getItem(COSName.TYPE));
assertEquals(PDAnnotationWidget.SUB_TYPE, annotation.getCOSObject().getNameAsString(COSName.SUBTYPE));
}
use of com.tom_roush.pdfbox.pdmodel.interactive.form.PDAcroForm in project PdfBox-Android by TomRoush.
the class PDFMergerUtilityTest method checkWithNumberTree.
/**
* PDFBOX-4408: Check that /StructParents values from pages and /StructParent values from
* annotations are found in the /ParentTree.
*
* @param document
*/
void checkWithNumberTree(PDDocument document) throws IOException {
PDDocumentCatalog documentCatalog = document.getDocumentCatalog();
PDNumberTreeNode parentTree = documentCatalog.getStructureTreeRoot().getParentTree();
Map<Integer, COSObjectable> numberTreeAsMap = PDFMergerUtility.getNumberTreeAsMap(parentTree);
Set<Integer> keySet = numberTreeAsMap.keySet();
PDAcroForm acroForm = documentCatalog.getAcroForm();
if (acroForm != null) {
for (PDField field : acroForm.getFieldTree()) {
for (PDAnnotationWidget widget : field.getWidgets()) {
if (widget.getStructParent() >= 0) {
assertTrue("field '" + field.getFullyQualifiedName() + "' /StructParent " + widget.getStructParent() + " missing in /ParentTree", keySet.contains(widget.getStructParent()));
}
}
}
}
for (PDPage page : document.getPages()) {
if (page.getStructParents() >= 0) {
assertTrue(keySet.contains(page.getStructParents()));
}
for (PDAnnotation ann : page.getAnnotations()) {
if (ann.getStructParent() >= 0) {
assertTrue("/StructParent " + ann.getStructParent() + " missing in /ParentTree", keySet.contains(ann.getStructParent()));
}
}
}
// might also test image and form dictionaries...
}
use of com.tom_roush.pdfbox.pdmodel.interactive.form.PDAcroForm in project PdfBox-Android by TomRoush.
the class MergeAcroFormsTest method testLegacyModeMerge.
/*
* Test LegacyMode merge
*/
@Test
public void testLegacyModeMerge() throws IOException {
PDFMergerUtility merger = new PDFMergerUtility();
File toBeMerged = new File(IN_DIR, "AcroFormForMerge.pdf");
File pdfOutput = new File(OUT_DIR, "PDFBoxLegacyMerge-SameMerged.pdf");
merger.setDestinationFileName(pdfOutput.getAbsolutePath());
merger.addSource(toBeMerged);
merger.addSource(toBeMerged);
merger.mergeDocuments(null);
merger.setAcroFormMergeMode(AcroFormMergeMode.PDFBOX_LEGACY_MODE);
PDDocument compliantDocument = null;
PDDocument toBeCompared = null;
try {
compliantDocument = PDDocument.load(new File(IN_DIR, "PDFBoxLegacyMerge-SameMerged.pdf"));
toBeCompared = PDDocument.load(new File(OUT_DIR, "PDFBoxLegacyMerge-SameMerged.pdf"));
PDAcroForm compliantAcroForm = compliantDocument.getDocumentCatalog().getAcroForm();
PDAcroForm toBeComparedAcroForm = toBeCompared.getDocumentCatalog().getAcroForm();
assertEquals("There shall be the same number of root fields", compliantAcroForm.getFields().size(), toBeComparedAcroForm.getFields().size());
for (PDField compliantField : compliantAcroForm.getFieldTree()) {
assertNotNull("There shall be a field with the same FQN", toBeComparedAcroForm.getField(compliantField.getFullyQualifiedName()));
PDField toBeComparedField = toBeComparedAcroForm.getField(compliantField.getFullyQualifiedName());
compareFieldProperties(compliantField, toBeComparedField);
}
for (PDField toBeComparedField : toBeComparedAcroForm.getFieldTree()) {
assertNotNull("There shall be a field with the same FQN", compliantAcroForm.getField(toBeComparedField.getFullyQualifiedName()));
PDField compliantField = compliantAcroForm.getField(toBeComparedField.getFullyQualifiedName());
compareFieldProperties(toBeComparedField, compliantField);
}
} finally {
IOUtils.closeQuietly(compliantDocument);
IOUtils.closeQuietly(toBeCompared);
}
}
use of com.tom_roush.pdfbox.pdmodel.interactive.form.PDAcroForm in project PdfBox-Android by TomRoush.
the class MergeAcroFormsTest method testAPEntry.
/*
* PDFBOX-1100 Ensure that after merging the PDFs there is an AP and V entry.
*/
@Test
public void testAPEntry() throws IOException {
InputStream is1 = null;
InputStream is2 = null;
// Merge the PDFs form PDFBOX-1100
PDFMergerUtility merger = new PDFMergerUtility();
try {
File file1 = new File(TARGET_PDF_DIR, "PDFBOX-1100-1.pdf");
assumeTrue(file1.exists());
is1 = new FileInputStream(file1);
File file2 = new File(TARGET_PDF_DIR, "PDFBOX-1100-2.pdf");
assumeTrue(file2.exists());
is2 = new FileInputStream(file2);
File pdfOutput = new File(OUT_DIR, "PDFBOX-1100.pdf");
merger.setDestinationFileName(pdfOutput.getAbsolutePath());
merger.addSource(is1);
merger.addSource(is2);
merger.mergeDocuments(null);
// Test merge result
PDDocument mergedPDF = PDDocument.load(pdfOutput);
assertEquals("There shall be 2 pages", 2, mergedPDF.getNumberOfPages());
PDAcroForm acroForm = mergedPDF.getDocumentCatalog().getAcroForm();
PDField formField = acroForm.getField("Testfeld");
assertNotNull("There shall be an /AP entry for the field", formField.getCOSObject().getDictionaryObject(COSName.AP));
assertNotNull("There shall be a /V entry for the field", formField.getCOSObject().getDictionaryObject(COSName.V));
formField = acroForm.getField("Testfeld2");
assertNotNull("There shall be an /AP entry for the field", formField.getCOSObject().getDictionaryObject(COSName.AP));
assertNotNull("There shall be a /V entry for the field", formField.getCOSObject().getDictionaryObject(COSName.V));
mergedPDF.close();
} finally {
IOUtils.closeQuietly(is1);
IOUtils.closeQuietly(is2);
}
}
use of com.tom_roush.pdfbox.pdmodel.interactive.form.PDAcroForm in project PdfBox-Android by TomRoush.
the class PDFTemplateCreator method buildPDF.
/**
* Build a PDF with a visible signature step by step, and return it as a stream.
*
* @param properties
* @return InputStream
* @throws IOException
*/
public InputStream buildPDF(PDVisibleSignDesigner properties) throws IOException {
Log.i("PdfBox-Android", "pdf building has been started");
PDFTemplateStructure pdfStructure = pdfBuilder.getStructure();
// we create array of [Text, ImageB, ImageC, ImageI]
pdfBuilder.createProcSetArray();
// create page
pdfBuilder.createPage(properties);
PDPage page = pdfStructure.getPage();
// create template
pdfBuilder.createTemplate(page);
PDDocument template = pdfStructure.getTemplate();
// create /AcroForm
pdfBuilder.createAcroForm(template);
PDAcroForm acroForm = pdfStructure.getAcroForm();
// AcroForm contains signature fields
pdfBuilder.createSignatureField(acroForm);
PDSignatureField pdSignatureField = pdfStructure.getSignatureField();
// create signature
// TODO
// The line below has no effect with the CreateVisibleSignature example.
// The signature field is needed as a "holder" for the /AP tree,
// but the /P and /V PDSignatureField entries are ignored by PDDocument.addSignature
pdfBuilder.createSignature(pdSignatureField, page, "");
// that is /AcroForm/DR entry
pdfBuilder.createAcroFormDictionary(acroForm, pdSignatureField);
// create AffineTransform
pdfBuilder.createAffineTransform(properties.getTransform());
AffineTransform transform = pdfStructure.getAffineTransform();
// rectangle, formatter, image. /AcroForm/DR/XObject contains that form
pdfBuilder.createSignatureRectangle(pdSignatureField, properties);
pdfBuilder.createFormatterRectangle(properties.getFormatterRectangleParameters());
PDRectangle bbox = pdfStructure.getFormatterRectangle();
pdfBuilder.createSignatureImage(template, properties.getImage());
// create form stream, form and resource.
pdfBuilder.createHolderFormStream(template);
PDStream holderFormStream = pdfStructure.getHolderFormStream();
pdfBuilder.createHolderFormResources();
PDResources holderFormResources = pdfStructure.getHolderFormResources();
pdfBuilder.createHolderForm(holderFormResources, holderFormStream, bbox);
// that is /AP entry the appearance dictionary.
pdfBuilder.createAppearanceDictionary(pdfStructure.getHolderForm(), pdSignatureField);
// inner form stream, form and resource (holder form contains inner form)
pdfBuilder.createInnerFormStream(template);
pdfBuilder.createInnerFormResource();
PDResources innerFormResource = pdfStructure.getInnerFormResources();
pdfBuilder.createInnerForm(innerFormResource, pdfStructure.getInnerFormStream(), bbox);
PDFormXObject innerForm = pdfStructure.getInnerForm();
// inner form must be in the holder form as we wrote
pdfBuilder.insertInnerFormToHolderResources(innerForm, holderFormResources);
// Image form is in this structure: /AcroForm/DR/FRM/Resources/XObject/n2
pdfBuilder.createImageFormStream(template);
PDStream imageFormStream = pdfStructure.getImageFormStream();
pdfBuilder.createImageFormResources();
PDResources imageFormResources = pdfStructure.getImageFormResources();
pdfBuilder.createImageForm(imageFormResources, innerFormResource, imageFormStream, bbox, transform, pdfStructure.getImage());
pdfBuilder.createBackgroundLayerForm(innerFormResource, bbox);
// now inject procSetArray
pdfBuilder.injectProcSetArray(innerForm, page, innerFormResource, imageFormResources, holderFormResources, pdfStructure.getProcSet());
COSName imageFormName = pdfStructure.getImageFormName();
COSName imageName = pdfStructure.getImageName();
COSName innerFormName = pdfStructure.getInnerFormName();
// now create Streams of AP
pdfBuilder.injectAppearanceStreams(holderFormStream, imageFormStream, imageFormStream, imageFormName, imageName, innerFormName, properties);
pdfBuilder.createVisualSignature(template);
pdfBuilder.createWidgetDictionary(pdSignatureField, holderFormResources);
InputStream in = getVisualSignatureAsStream(pdfStructure.getVisualSignature());
Log.i("PdfBox-Android", "stream returning started, size= " + in.available());
// we must close the document
template.close();
// return result of the stream
return in;
}
Aggregations