From f6d416f004ed294cff71e25358d7b37a9750a1b6 Mon Sep 17 00:00:00 2001 From: Thomas <> Date: Fri, 13 Jan 2023 14:02:43 +0100 Subject: fix(sigblock): invalid preview in case of sig-blocks with more than half page height Issue: #68 ## Info: This is only a work-around, because it looks like a general issue in methods to create visual signature tables. T --- .../impl/signing/pdfbox2/PADESPDFBOXSigner.java | 15 +++---- .../stamping/pdfbox2/PDFAsTemplateCreator.java | 49 +++++++++++++++------- .../pdfbox2/PDFAsVisualSignatureProperties.java | 25 ++++++----- ...SignatureFieldsAndPlaceHolderExtractorTest.java | 16 ++++--- 4 files changed, 68 insertions(+), 37 deletions(-) (limited to 'pdf-as-pdfbox-2') diff --git a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java index ef1f14b2..42f16598 100644 --- a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java +++ b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java @@ -363,7 +363,7 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { } properties = new PDFAsVisualSignatureProperties(pdfObject.getStatus().getSettings(), pdfObject, - (PdfBoxVisualObject) visualObject, positioningInstruction, signatureProfileSettings); + (PdfBoxVisualObject) visualObject, positioningInstruction, signatureProfileSettings, false); properties.buildSignature(); @@ -825,7 +825,7 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { positioningInstruction = Positioning.determineTablePositioning(new TablePos(), "", origDoc, visualObject, pdfObject.getStatus().getSettings()); } - + origDoc.close(); final SignaturePositionImpl position = new SignaturePositionImpl(); @@ -839,15 +839,16 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { final PDFAsVisualSignatureProperties properties = new PDFAsVisualSignatureProperties( pdfObject.getStatus().getSettings(), pdfObject, (PdfBoxVisualObject) visualObject, - positioningInstruction, signatureProfileSettings); - + positioningInstruction, signatureProfileSettings, true); + + // build visual-signature form properties.buildSignature(); - PDDocument visualDoc; + + PDDocument visualDoc; synchronized (PDDocument.class) { visualDoc = PDDocument.load(properties.getVisibleSignature()); } - final float stdRes = 72; final float targetRes = resolution; final float factor = targetRes / stdRes; @@ -859,7 +860,7 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { visualDoc.close(); pdfRenderer = null; - + final BufferedImage cutOut = new BufferedImage( (int) (position.getWidth() * factor), (int) (position.getHeight() * factor), diff --git a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox2/PDFAsTemplateCreator.java b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox2/PDFAsTemplateCreator.java index b07e6ed5..62ad4dbf 100644 --- a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox2/PDFAsTemplateCreator.java +++ b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox2/PDFAsTemplateCreator.java @@ -23,11 +23,11 @@ ******************************************************************************/ package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox2; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; -import at.gv.egiz.pdfas.common.settings.SignatureProfileSettings; -import at.gv.egiz.pdfas.lib.impl.stamping.TableFactory; -import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDResources; @@ -42,6 +42,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import at.gv.egiz.pdfas.common.exceptions.PdfAsException; +import at.gv.egiz.pdfas.common.settings.SignatureProfileSettings; public class PDFAsTemplateCreator extends PDFTemplateCreator { @@ -54,7 +55,7 @@ public class PDFAsTemplateCreator extends PDFTemplateCreator { } - public InputStream buildPDF(PDFAsVisualSignatureDesigner properties, PDDocument originalDocument) + public InputStream buildPDF(PDFAsVisualSignatureDesigner properties, PDDocument originalDocument, boolean buildPreviewOnly) throws IOException, PdfAsException { logger.debug("pdf building has been started"); PDFTemplateStructure pdfStructure = pdfBuilder.getStructure(); @@ -80,7 +81,7 @@ public class PDFAsTemplateCreator extends PDFTemplateCreator { // create signature this.pdfBuilder.createSignature(pdSignatureField, page, properties.getSignatureFieldName()); - + // that is /AcroForm/DR entry this.pdfBuilder.createAcroFormDictionary(acroForm, pdSignatureField); @@ -92,6 +93,8 @@ public class PDFAsTemplateCreator extends PDFTemplateCreator { this.pdfBuilder.createSignatureRectangle(pdSignatureField, properties, properties.getRotation() + properties.getPageRotation()); this.pdfBuilder.createFormaterRectangle(properties.getFormaterRectangleParams()); PDRectangle formater = pdfStructure.getFormatterRectangle(); + + //this.pdfBuilder.createSignatureImage(template, properties.getImageStream()); @@ -108,11 +111,13 @@ public class PDFAsTemplateCreator extends PDFTemplateCreator { // inner formstream, form and resource (hlder form containts inner form) this.pdfBuilder.createInnerFormStreamPdfAs(template, originalDocument); + this.pdfBuilder.createInnerFormResource(); PDResources innerFormResource = pdfStructure.getInnerFormResources(); + this.pdfBuilder.createInnerForm(innerFormResource, pdfStructure.getInnerFormStream(), formater); PDFormXObject innerForm = pdfStructure.getInnerForm(); - + // inner form must be in the holder form as we wrote this.pdfBuilder.insertInnerFormToHolerResources(innerForm, holderFormResources); @@ -127,10 +132,10 @@ public class PDFAsTemplateCreator extends PDFTemplateCreator { // now inject procSetArray /*this.pdfBuilder.injectProcSetArray(innerForm, page, innerFormResource, imageFormResources, holderFormResources, pdfStructure.getProcSet());*/ + this.pdfBuilder.injectProcSetArray(innerForm, page, innerFormResource, null, holderFormResources, pdfStructure.getProcSet()); - /*String imgFormName = pdfStructure.getImageFormName(); String imgName = pdfStructure.getImageName();*/ String innerFormName = pdfStructure.getInnerFormName().getName(); @@ -138,13 +143,16 @@ public class PDFAsTemplateCreator extends PDFTemplateCreator { // now create Streams of AP /*this.pdfBuilder.injectAppearanceStreams(holderFormStream, imageFormStream, imageFormStream, imgFormName, imgName, innerFormName, properties);*/ - this.pdfBuilder.injectAppearanceStreams(holderFormStream, null, null, null, - null, innerFormName, properties); + + if (!buildPreviewOnly) { + this.pdfBuilder.injectAppearanceStreams(holderFormStream, null, null, null, + null, innerFormName, properties); + + } + this.pdfBuilder.createVisualSignature(template); this.pdfBuilder.createWidgetDictionary(pdSignatureField, holderFormResources); - - ByteArrayInputStream in = null; //COSDocument doc = pdfStructure.getVisualSignature(); @@ -152,8 +160,8 @@ public class PDFAsTemplateCreator extends PDFTemplateCreator { //in = pdfStructure.getTemplateAppearanceStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); template.save(baos); - baos.close(); - + baos.close(); + SignatureProfileSettings signatureProfileSettings = this.pdfBuilder.signatureProfileSettings; @@ -188,4 +196,17 @@ public class PDFAsTemplateCreator extends PDFTemplateCreator { // return result of the stream return in; } + +// @SneakyThrows +// private void saveDebuggingSnapshot(PDDocument template, String fileName) { +// ByteArrayOutputStream baos = new ByteArrayOutputStream(); +// template.save(baos); +// baos.close(); +// +// FileOutputStream fos = new FileOutputStream("/home/tlenz/Projekte/pdfas4/source/pdf-as-cli/build/" + fileName + ".pdf"); +// fos.write(baos.toByteArray()); +// fos.close(); +// +// } + } diff --git a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox2/PDFAsVisualSignatureProperties.java b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox2/PDFAsVisualSignatureProperties.java index f482f49f..34093a9d 100644 --- a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox2/PDFAsVisualSignatureProperties.java +++ b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox2/PDFAsVisualSignatureProperties.java @@ -23,12 +23,8 @@ ******************************************************************************/ package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox2; -import at.gv.egiz.pdfas.common.exceptions.PdfAsException; -import at.gv.egiz.pdfas.common.exceptions.PdfAsWrappedIOException; -import at.gv.egiz.pdfas.common.settings.ISettings; -import at.gv.egiz.pdfas.common.settings.SignatureProfileSettings; -import at.gv.egiz.pdfas.lib.impl.pdfbox2.PDFBOXObject; -import at.knowcenter.wag.egov.egiz.pdf.PositioningInstruction; +import java.io.IOException; + import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageTree; @@ -36,7 +32,12 @@ import org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleS import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; +import at.gv.egiz.pdfas.common.exceptions.PdfAsException; +import at.gv.egiz.pdfas.common.exceptions.PdfAsWrappedIOException; +import at.gv.egiz.pdfas.common.settings.ISettings; +import at.gv.egiz.pdfas.common.settings.SignatureProfileSettings; +import at.gv.egiz.pdfas.lib.impl.pdfbox2.PDFBOXObject; +import at.knowcenter.wag.egov.egiz.pdf.PositioningInstruction; public class PDFAsVisualSignatureProperties extends PDVisibleSigProperties { @@ -56,9 +57,13 @@ public class PDFAsVisualSignatureProperties extends PDVisibleSigProperties { private String alternativeTableCaption=""; + private boolean buildPreviewOnly; + public PDFAsVisualSignatureProperties(ISettings settings, PDFBOXObject object, - PdfBoxVisualObject visObj, PositioningInstruction pos, SignatureProfileSettings signatureProfileSettings) { - this.settings = settings; + PdfBoxVisualObject visObj, PositioningInstruction pos, SignatureProfileSettings signatureProfileSettings, + boolean buildPreviewOnly) { + this.buildPreviewOnly = buildPreviewOnly; + this.settings = settings; this.signatureProfileSettings = signatureProfileSettings; try { main = visObj.getTable(); @@ -113,7 +118,7 @@ public class PDFAsVisualSignatureProperties extends PDVisibleSigProperties { PDFAsVisualSignatureBuilder builder = new PDFAsVisualSignatureBuilder(this, this.settings, designer, this.signatureProfileSettings); PDFAsTemplateCreator creator = new PDFAsTemplateCreator(builder); try { - setVisibleSignature(creator.buildPDF(designer, this.origDoc)); + setVisibleSignature(creator.buildPDF(designer, this.origDoc, buildPreviewOnly)); } catch (PdfAsException e) { throw new PdfAsWrappedIOException(e); } diff --git a/pdf-as-pdfbox-2/src/test/java/at/gv/egiz/pdfas/lib/testpdfbox/SignatureFieldsAndPlaceHolderExtractorTest.java b/pdf-as-pdfbox-2/src/test/java/at/gv/egiz/pdfas/lib/testpdfbox/SignatureFieldsAndPlaceHolderExtractorTest.java index 0d85c82b..40522504 100644 --- a/pdf-as-pdfbox-2/src/test/java/at/gv/egiz/pdfas/lib/testpdfbox/SignatureFieldsAndPlaceHolderExtractorTest.java +++ b/pdf-as-pdfbox-2/src/test/java/at/gv/egiz/pdfas/lib/testpdfbox/SignatureFieldsAndPlaceHolderExtractorTest.java @@ -1,16 +1,20 @@ package at.gv.egiz.pdfas.lib.testpdfbox; -import at.gv.egiz.pdfas.lib.impl.pdfbox2.placeholder.SignatureFieldsAndPlaceHolderExtractor; -import at.gv.egiz.pdfas.lib.impl.placeholder.SignaturePlaceholderData; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.junit.Assert; -import org.junit.Test; - import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import at.gv.egiz.pdfas.lib.impl.pdfbox2.placeholder.SignatureFieldsAndPlaceHolderExtractor; +import at.gv.egiz.pdfas.lib.impl.placeholder.SignaturePlaceholderData; + +@RunWith(JUnit4.class) public class SignatureFieldsAndPlaceHolderExtractorTest { public String getPath(String resourceName) { -- cgit v1.2.3