From 29ec10fb663523c4a18904c332199ce6e974dd2f Mon Sep 17 00:00:00 2001 From: Andreas Fitzek Date: Wed, 27 Nov 2013 10:05:35 +0100 Subject: Support for QR Placeholders in PAdES --- .../java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java | 87 ++++++++++++++++++++-- 1 file changed, 80 insertions(+), 7 deletions(-) (limited to 'pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java') diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java index 4a8e41c3..2f2d47c8 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java @@ -3,6 +3,7 @@ package at.gv.egiz.pdfas.lib.impl; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; @@ -35,6 +36,8 @@ import at.gv.egiz.pdfas.lib.api.verify.VerifyResult; import at.gv.egiz.pdfas.lib.impl.configuration.ConfigurationImpl; import at.gv.egiz.pdfas.lib.impl.configuration.PlaceholderConfiguration; import at.gv.egiz.pdfas.lib.impl.configuration.SignatureProfileConfiguration; +import at.gv.egiz.pdfas.lib.impl.placeholder.SignaturePlaceholderData; +import at.gv.egiz.pdfas.lib.impl.placeholder.SignaturePlaceholderExtractor; import at.gv.egiz.pdfas.lib.impl.positioning.Positioning; import at.gv.egiz.pdfas.lib.impl.signing.IPdfSigner; import at.gv.egiz.pdfas.lib.impl.signing.PdfSignerFactory; @@ -105,13 +108,12 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants { status.getPdfObject().setOriginalDocument( parameter.getDataSource().getByteData()); - // Placeholder search? - if (placeholderConfiguration.isGlobalPlaceholderEnabled()) { - // TODO: Do placeholder search - } - this.stampPdf(status); + FileOutputStream fos = new FileOutputStream("/home/afitzek/qr_2_stamped.pdf"); + fos.write(status.getPdfObject().getStampedDocument()); + fos.close(); + /* * if (requestedSignature.isVisual()) { * logger.info("Creating visual siganture block"); // @@ -259,7 +261,7 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants { if (verifyFilter != null) { List results = verifyFilter.verify( contentData.toByteArray(), content.getBytes()); - if(results != null && !results.isEmpty()) { + if (results != null && !results.isEmpty()) { result.addAll(results); } } @@ -421,6 +423,72 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants { } } + private boolean checkPlaceholderSignature(OperationStatus status) + throws PdfAsException, IOException { + if (status.getPlaceholderConfiguration().isGlobalPlaceholderEnabled()) { + SignaturePlaceholderData signaturePlaceholderData = SignaturePlaceholderExtractor + .extract(new ByteArrayInputStream(status.getPdfObject() + .getOriginalDocument()), null, 1); + + if (signaturePlaceholderData != null) { + RequestedSignature requestedSignature = status + .getRequestedSignature(); + + if (signaturePlaceholderData.getProfile() != null) { + requestedSignature + .setSignatureProfileID(signaturePlaceholderData + .getProfile()); + } + + String signatureProfileID = requestedSignature + .getSignatureProfileID(); + + TablePos tablePos = signaturePlaceholderData.getTablePos(); + + SignatureProfileSettings signatureProfileSettings = TableFactory + .createProfile(signatureProfileID, settings); + + Table main = TableFactory.createSigTable( + signatureProfileSettings, MAIN, settings, + requestedSignature); + + IPDFStamper stamper = StamperFactory + .createDefaultStamper(settings); + IPDFVisualObject visualObject = stamper.createVisualPDFObject( + status.getPdfObject(), main); + + PDDocument originalDocument = PDDocument + .load(new ByteArrayInputStream(status.getPdfObject() + .getOriginalDocument())); + + PositioningInstruction positioningInstruction = Positioning + .determineTablePositioning(tablePos, "", originalDocument, + visualObject); + + // ================================================================ + // StampingStage (visual) -> stamp logical signature block to + // location (itext) + + byte[] incrementalUpdate = stamper.writeVisualObject(visualObject, + positioningInstruction, status.getPdfObject() + .getOriginalDocument(), signaturePlaceholderData.getPlaceholderName()); + + SignaturePositionImpl position = new SignaturePositionImpl(); + position.setX(positioningInstruction.getX()); + position.setY(positioningInstruction.getY()); + position.setPage(positioningInstruction.getPage()); + position.setHeight(visualObject.getHeight()); + position.setWidth(visualObject.getWidth()); + + requestedSignature.setSignaturePosition(position); + + status.getPdfObject().setStampedDocument(incrementalUpdate); + return true; + } + } + return false; + } + private void stampPdf(OperationStatus status) throws PdfAsException, IOException { @@ -429,6 +497,11 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants { SignatureProfileConfiguration signatureProfileConfiguration = status .getSignatureProfileConfiguration(signatureProfileID); + if (checkPlaceholderSignature(status)) { + logger.info("Placeholder found for Signature"); + return; + } + if (requestedSignature.isVisual()) { logger.info("Creating visual siganture block"); // ================================================================ @@ -477,7 +550,7 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants { byte[] incrementalUpdate = stamper.writeVisualObject(visualObject, positioningInstruction, status.getPdfObject() - .getOriginalDocument()); + .getOriginalDocument(), null); SignaturePositionImpl position = new SignaturePositionImpl(); position.setX(positioningInstruction.getX()); -- cgit v1.2.3