Search in sources :

Example 6 with PDAcroForm

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));
}
Also used : PDDocument(com.tom_roush.pdfbox.pdmodel.PDDocument) PDTextField(com.tom_roush.pdfbox.pdmodel.interactive.form.PDTextField) PDAcroForm(com.tom_roush.pdfbox.pdmodel.interactive.form.PDAcroForm) Test(org.junit.Test)

Example 7 with PDAcroForm

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...
}
Also used : PDNumberTreeNode(com.tom_roush.pdfbox.pdmodel.common.PDNumberTreeNode) COSObjectable(com.tom_roush.pdfbox.pdmodel.common.COSObjectable) PDField(com.tom_roush.pdfbox.pdmodel.interactive.form.PDField) PDPage(com.tom_roush.pdfbox.pdmodel.PDPage) PDAnnotation(com.tom_roush.pdfbox.pdmodel.interactive.annotation.PDAnnotation) PDAnnotationWidget(com.tom_roush.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget) PDAcroForm(com.tom_roush.pdfbox.pdmodel.interactive.form.PDAcroForm) PDDocumentCatalog(com.tom_roush.pdfbox.pdmodel.PDDocumentCatalog)

Example 8 with PDAcroForm

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);
    }
}
Also used : PDField(com.tom_roush.pdfbox.pdmodel.interactive.form.PDField) PDDocument(com.tom_roush.pdfbox.pdmodel.PDDocument) PDAcroForm(com.tom_roush.pdfbox.pdmodel.interactive.form.PDAcroForm) File(java.io.File) Test(org.junit.Test)

Example 9 with PDAcroForm

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);
    }
}
Also used : PDField(com.tom_roush.pdfbox.pdmodel.interactive.form.PDField) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) PDDocument(com.tom_roush.pdfbox.pdmodel.PDDocument) PDAcroForm(com.tom_roush.pdfbox.pdmodel.interactive.form.PDAcroForm) File(java.io.File) FileInputStream(java.io.FileInputStream) Test(org.junit.Test)

Example 10 with PDAcroForm

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;
}
Also used : PDPage(com.tom_roush.pdfbox.pdmodel.PDPage) COSName(com.tom_roush.pdfbox.cos.COSName) ByteArrayInputStream(java.io.ByteArrayInputStream) InputStream(java.io.InputStream) PDDocument(com.tom_roush.pdfbox.pdmodel.PDDocument) AffineTransform(com.tom_roush.harmony.awt.geom.AffineTransform) PDResources(com.tom_roush.pdfbox.pdmodel.PDResources) PDFormXObject(com.tom_roush.pdfbox.pdmodel.graphics.form.PDFormXObject) PDRectangle(com.tom_roush.pdfbox.pdmodel.common.PDRectangle) PDAcroForm(com.tom_roush.pdfbox.pdmodel.interactive.form.PDAcroForm) PDSignatureField(com.tom_roush.pdfbox.pdmodel.interactive.form.PDSignatureField) PDStream(com.tom_roush.pdfbox.pdmodel.common.PDStream)

Aggregations

PDAcroForm (com.tom_roush.pdfbox.pdmodel.interactive.form.PDAcroForm)14 PDField (com.tom_roush.pdfbox.pdmodel.interactive.form.PDField)8 PDDocument (com.tom_roush.pdfbox.pdmodel.PDDocument)6 PDSignatureField (com.tom_roush.pdfbox.pdmodel.interactive.form.PDSignatureField)4 File (java.io.File)4 Test (org.junit.Test)4 COSDictionary (com.tom_roush.pdfbox.cos.COSDictionary)2 PDDocumentCatalog (com.tom_roush.pdfbox.pdmodel.PDDocumentCatalog)2 PDPage (com.tom_roush.pdfbox.pdmodel.PDPage)2 COSArrayList (com.tom_roush.pdfbox.pdmodel.common.COSArrayList)2 PDAnnotation (com.tom_roush.pdfbox.pdmodel.interactive.annotation.PDAnnotation)2 PDAnnotationWidget (com.tom_roush.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget)2 PDTextField (com.tom_roush.pdfbox.pdmodel.interactive.form.PDTextField)2 IOException (java.io.IOException)2 InputStream (java.io.InputStream)2 ArrayList (java.util.ArrayList)2 AffineTransform (com.tom_roush.harmony.awt.geom.AffineTransform)1 COSArray (com.tom_roush.pdfbox.cos.COSArray)1 COSDocument (com.tom_roush.pdfbox.cos.COSDocument)1 COSName (com.tom_roush.pdfbox.cos.COSName)1