From 0b68dc8075191bb131a32e42691b2505035f6c77 Mon Sep 17 00:00:00 2001 From: Thomas <> Date: Thu, 2 Mar 2023 16:07:53 +0100 Subject: feat(positioning): add hidden parameter to enforce new pages on already signed documents --- .../pdfas/common/settings/IProfileConstants.java | 1 + .../lib/impl/pdfbox2/positioning/Positioning.java | 35 +++++++++++++++------- .../impl/signing/pdfbox2/PADESPDFBOXSigner.java | 6 ++-- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/settings/IProfileConstants.java b/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/settings/IProfileConstants.java index 3f07f774..95eaa8ea 100644 --- a/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/settings/IProfileConstants.java +++ b/pdf-as-common/src/main/java/at/gv/egiz/pdfas/common/settings/IProfileConstants.java @@ -94,6 +94,7 @@ public interface IProfileConstants { public final static String SIG_PDFA1B_VALID = "SIG_PDFA1B_VALID"; public final static String SIG_PDFA_VALID = "SIG_PDFA_VALID"; public final static String SIG_PDFUA_FORCE = "SIG_PDFUA_FORCE"; + public final static String SIG_NEWPAGE_FORCE = "SIGNED_NEWPAGE_FORCE"; public final static String LATIN1_ENCODING = "latin1_encoding"; public final static String SIGNATURE_BLOCK_PARAMETER = "sbp"; diff --git a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/positioning/Positioning.java b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/positioning/Positioning.java index 13d1ebe6..f942d77e 100644 --- a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/positioning/Positioning.java +++ b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/positioning/Positioning.java @@ -32,7 +32,9 @@ import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.common.PDRectangle; import at.gv.egiz.pdfas.common.exceptions.PdfAsException; +import at.gv.egiz.pdfas.common.settings.IProfileConstants; import at.gv.egiz.pdfas.common.settings.ISettings; +import at.gv.egiz.pdfas.common.settings.SignatureProfileSettings; import at.gv.egiz.pdfas.lib.api.IConfigurationConstants; import at.gv.egiz.pdfas.lib.impl.pdfbox2.utils.PdfBoxUtils; import at.gv.egiz.pdfas.lib.impl.stamping.IPDFVisualObject; @@ -68,14 +70,15 @@ public class Positioning { * @param pdfDataSource The pdf. * @param pdf_table The pdf table to be written. * @param settings + * @param signatureProfileSettings Signature-block settings * @return Returns the PositioningInformation. * @throws PdfAsException F.e. */ public static PositioningInstruction determineTablePositioning( TablePos pos, String signature_type, PDDocument pdfDataSource, - IPDFVisualObject pdf_table, ISettings settings) throws PdfAsException { + IPDFVisualObject pdf_table, ISettings settings, SignatureProfileSettings signatureProfileSettings) throws PdfAsException { return adjustSignatureTableandCalculatePosition(pdfDataSource, - pdf_table, pos, settings); + pdf_table, pos, settings, signatureProfileSettings); } /** @@ -85,12 +88,13 @@ public class Positioning { * @param pdfDataSource The PDF document. * @param pdf_table The PDFPTable to be placed. * @param settings + * @param profilConfig Signature-profile configuration * @return Returns the position where the PDFPTable should be placed. * @throws PdfAsException F.e. */ public static PositioningInstruction adjustSignatureTableandCalculatePosition( final PDDocument pdfDataSource, IPDFVisualObject pdf_table, - TablePos pos, ISettings settings) throws PdfAsException { + TablePos pos, ISettings settings, SignatureProfileSettings profilConfig) throws PdfAsException { PdfBoxUtils.checkPDFPermissions(pdfDataSource); final long numberOfExistingSignatures = getNumberOfExistingSignatures(pdfDataSource); @@ -111,7 +115,7 @@ public class Positioning { } } - make_new_page = checkIfNewPageIsAllowed(make_new_page, numberOfExistingSignatures, settings); + make_new_page = checkIfNewPageIsAllowed(make_new_page, numberOfExistingSignatures, settings, profilConfig); if(make_new_page && numberOfExistingSignatures!=0) { @@ -216,13 +220,13 @@ public class Positioning { // we do have an empty page or nothing in area above footerline pos_y = page_height - SIGNATURE_MARGIN_VERTICAL; return buildPostitionInfoOnSubpage(pdfDataSource, make_new_page, page, pos_x, pos_y, pos.rotation, - pos.getFooterLine(), table_height, pos, page_height, numberOfExistingSignatures, settings); + pos.getFooterLine(), table_height, pos, page_height, numberOfExistingSignatures, settings, profilConfig); } else { // we do have text take SIGNATURE_MARGIN pos_y = page_height - pre_page_length - SIGNATURE_MARGIN_VERTICAL; return buildPostitionInfoOnSubpage(pdfDataSource, make_new_page, page, pos_x, pos_y, pos.rotation, - pos.getFooterLine(), table_height, pos, page_height, numberOfExistingSignatures, settings); + pos.getFooterLine(), table_height, pos, page_height, numberOfExistingSignatures, settings, profilConfig); } } @@ -245,12 +249,23 @@ public class Positioning { } - private static boolean checkIfNewPageIsAllowed(boolean make_new_page, long numberOfExistingSignatures, ISettings settings) throws PdfAsException { + private static boolean isNewPageOnSignedDocumentsEnabled(SignatureProfileSettings profilConfig) { + String value = profilConfig.getValue(IProfileConstants.SIG_NEWPAGE_FORCE); + return Boolean.valueOf(value); + + } + + private static boolean checkIfNewPageIsAllowed(boolean make_new_page, long numberOfExistingSignatures, ISettings settings, + SignatureProfileSettings profilConfig) throws PdfAsException { if(make_new_page && numberOfExistingSignatures!=0) { - log.info("Signature-block would be need a new page, but new pages are not allowed on already signed documents."); + log.debug("Signature-block would be need a new page, but new pages are not allowed on already signed documents."); if (isFailOnLessSpaceEnabled(settings)) { throw new PdfAsException("error.pdf.stamp.12"); + } else if (isNewPageOnSignedDocumentsEnabled(profilConfig)) { + log.info("New pages not allowed on already signed documents, but force new page by configuration"); + return make_new_page; + } else { log.info("Placing signature-block on last page without free-space checks ... "); return false; @@ -265,10 +280,10 @@ public class Positioning { private static PositioningInstruction buildPostitionInfoOnSubpage(PDDocument pdfDataSource, boolean make_new_page, int page, float pos_x, float pos_y, float rotation, float footer_line, float table_height, TablePos pos, float page_height, - long numberOfExistingSignatures, ISettings settings) throws PdfAsException { + long numberOfExistingSignatures, ISettings settings, SignatureProfileSettings profilConfig) throws PdfAsException { if (pos_y - footer_line <= table_height) { - make_new_page = checkIfNewPageIsAllowed(true, numberOfExistingSignatures, settings); + make_new_page = checkIfNewPageIsAllowed(true, numberOfExistingSignatures, settings, profilConfig); if (make_new_page) { page++; 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..b827abe6 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 @@ -329,7 +329,7 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { final PositioningInstruction positioningInstruction = Positioning.determineTablePositioning(tablePos, "", - doc, visualObject, pdfObject.getStatus().getSettings()); + doc, visualObject, pdfObject.getStatus().getSettings(), signatureProfileSettings); logger.debug("Positioning: {}", positioningInstruction.toString()); @@ -820,10 +820,10 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { PositioningInstruction positioningInstruction; if (signaturePosString != null) { positioningInstruction = Positioning.determineTablePositioning(new TablePos(signaturePosString), "", - origDoc, visualObject, pdfObject.getStatus().getSettings()); + origDoc, visualObject, pdfObject.getStatus().getSettings(), signatureProfileSettings); } else { positioningInstruction = Positioning.determineTablePositioning(new TablePos(), "", origDoc, - visualObject, pdfObject.getStatus().getSettings()); + visualObject, pdfObject.getStatus().getSettings(), signatureProfileSettings); } origDoc.close(); -- cgit v1.2.3