diff options
author | Andreas Fitzek <andreas.fitzek@iaik.tugraz.at> | 2014-10-16 12:45:01 +0200 |
---|---|---|
committer | Andreas Fitzek <andreas.fitzek@iaik.tugraz.at> | 2014-10-16 12:45:01 +0200 |
commit | 63784f692a50606f34702706761edac052fdac60 (patch) | |
tree | 50f78a92c35cdfced053209a334944acdee2b983 /pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java | |
parent | 7b105bafe5a1f4c01224c8ae0b820a478b09447f (diff) | |
download | pdf-as-4-63784f692a50606f34702706761edac052fdac60.tar.gz pdf-as-4-63784f692a50606f34702706761edac052fdac60.tar.bz2 pdf-as-4-63784f692a50606f34702706761edac052fdac60.zip |
Introduced PDF-AS Backends, removed all pdfbox specific code to pdfbox backend
Diffstat (limited to 'pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java')
-rw-r--r-- | pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java | 384 |
1 files changed, 97 insertions, 287 deletions
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 85a11d0d..3d9725a7 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 @@ -25,9 +25,7 @@ package at.gv.egiz.pdfas.lib.impl; import iaik.x509.X509Certificate; -import java.awt.Graphics2D; import java.awt.Image; -import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; @@ -38,13 +36,6 @@ import java.util.Iterator; import java.util.List; import org.apache.commons.io.IOUtils; -import org.apache.pdfbox.cos.COSArray; -import org.apache.pdfbox.cos.COSBase; -import org.apache.pdfbox.cos.COSDictionary; -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.cos.COSString; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDPage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -54,10 +45,8 @@ import at.gv.egiz.pdfas.common.exceptions.PdfAsException; import at.gv.egiz.pdfas.common.exceptions.PdfAsSettingsException; import at.gv.egiz.pdfas.common.settings.ISettings; import at.gv.egiz.pdfas.common.settings.Settings; -import at.gv.egiz.pdfas.common.settings.SignatureProfileSettings; import at.gv.egiz.pdfas.common.utils.PDFUtils; import at.gv.egiz.pdfas.common.utils.StreamUtils; -import at.gv.egiz.pdfas.lib.api.ByteArrayDataSource; import at.gv.egiz.pdfas.lib.api.Configuration; import at.gv.egiz.pdfas.lib.api.IConfigurationConstants; import at.gv.egiz.pdfas.lib.api.PdfAs; @@ -67,30 +56,18 @@ import at.gv.egiz.pdfas.lib.api.sign.SignParameter; import at.gv.egiz.pdfas.lib.api.sign.SignResult; import at.gv.egiz.pdfas.lib.api.verify.VerifyParameter; import at.gv.egiz.pdfas.lib.api.verify.VerifyResult; +import at.gv.egiz.pdfas.lib.backend.PDFASBackend; +import at.gv.egiz.pdfas.lib.impl.backend.BackendLoader; import at.gv.egiz.pdfas.lib.impl.configuration.ConfigurationImpl; -import at.gv.egiz.pdfas.lib.impl.configuration.SignatureProfileConfiguration; -import at.gv.egiz.pdfas.lib.impl.positioning.Positioning; import at.gv.egiz.pdfas.lib.impl.preprocessor.PreProcessorLoader; import at.gv.egiz.pdfas.lib.impl.signing.IPdfSigner; -import at.gv.egiz.pdfas.lib.impl.signing.PdfSignerFactory; -import at.gv.egiz.pdfas.lib.impl.signing.pdfbox.PdfboxSignerWrapper; -import at.gv.egiz.pdfas.lib.impl.signing.sig_interface.SignatureDataExtractor; -import at.gv.egiz.pdfas.lib.impl.stamping.IPDFStamper; -import at.gv.egiz.pdfas.lib.impl.stamping.IPDFVisualObject; -import at.gv.egiz.pdfas.lib.impl.stamping.StamperFactory; -import at.gv.egiz.pdfas.lib.impl.stamping.TableFactory; -import at.gv.egiz.pdfas.lib.impl.stamping.pdfbox.PDFAsVisualSignatureProperties; -import at.gv.egiz.pdfas.lib.impl.stamping.pdfbox.PdfBoxVisualObject; +import at.gv.egiz.pdfas.lib.impl.signing.PDFASSignatureExtractor; import at.gv.egiz.pdfas.lib.impl.status.OperationStatus; -import at.gv.egiz.pdfas.lib.impl.status.PDFObject; import at.gv.egiz.pdfas.lib.impl.status.RequestedSignature; import at.gv.egiz.pdfas.lib.impl.verify.IVerifier; import at.gv.egiz.pdfas.lib.impl.verify.IVerifyFilter; import at.gv.egiz.pdfas.lib.impl.verify.VerifierDispatcher; import at.gv.egiz.pdfas.lib.util.SignatureUtils; -import at.knowcenter.wag.egov.egiz.pdf.PositioningInstruction; -import at.knowcenter.wag.egov.egiz.pdf.TablePos; -import at.knowcenter.wag.egov.egiz.table.Table; public class PdfAsImpl implements PdfAs, IConfigurationConstants, ErrorConstants { @@ -160,16 +137,27 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants, // execute pre Processors signPreProcessing(parameter); - + + // allocated Backend + PDFASBackend backend = BackendLoader.getPDFASBackend(); + + if (backend == null) { + throw new PDFASError(ERROR_NO_BACKEND); + } + ISettings settings = (ISettings) parameter.getConfiguration(); - status = new OperationStatus(settings, parameter); + status = new OperationStatus(settings, parameter, backend); + + IPdfSigner signer = backend.getPdfSigner(); + + status.setPdfObject(signer.buildPDFObject(status)); // set Original PDF Document Data status.getPdfObject() .setOriginalDocument(parameter.getDataSource()); - PDDocument doc = status.getPdfObject().getDocument(); - PDFUtils.checkPDFPermissions(doc); + // Check PDF Permissions + signer.checkPDFPermissions(status.getPdfObject()); // PlaceholderConfiguration placeholderConfiguration = status // .getPlaceholderConfiguration(); @@ -196,9 +184,9 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants, // this.stampPdf(status); // Create signature - IPdfSigner signer = PdfSignerFactory.createPdfSigner(); - signer.signPDF(status.getPdfObject(), requestedSignature, - new PdfboxSignerWrapper(status.getSignParamter() + + signer.signPDF(status.getPdfObject(), requestedSignature, signer + .buildSignaturInterface(status.getSignParamter() .getPlainSigner(), parameter, requestedSignature)); // ================================================================ @@ -225,140 +213,18 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants, // execute pre Processors verifyPreProcessing(parameter); - - int signatureToVerify = parameter.getWhichSignature(); - int currentSignature = 0; - PDDocument doc = null; - try { - List<VerifyResult> result = new ArrayList<VerifyResult>(); - ISettings settings = (ISettings) parameter.getConfiguration(); - VerifierDispatcher verifier = new VerifierDispatcher(settings); - doc = PDDocument.load(parameter.getDataSource().getInputStream()); - COSDictionary trailer = doc.getDocument().getTrailer(); - if (trailer == null) { - // No signatures ... - return result; - } - COSDictionary root = (COSDictionary) trailer - .getDictionaryObject(COSName.ROOT); - if (root == null) { - // No signatures ... - return result; - } - COSDictionary acroForm = (COSDictionary) root - .getDictionaryObject(COSName.ACRO_FORM); - if (acroForm == null) { - // No signatures ... - return result; - } - COSArray fields = (COSArray) acroForm - .getDictionaryObject(COSName.FIELDS); - if (fields == null) { - // No signatures ... - return result; - } + // allocated Backend + PDFASBackend backend = BackendLoader.getPDFASBackend(); - int lastSig = -1; - for (int i = 0; i < fields.size(); i++) { - COSDictionary field = (COSDictionary) fields.getObject(i); - String type = field.getNameAsString("FT"); - if ("Sig".equals(type)) { - lastSig = i; - } - } + if (backend == null) { + throw new PDFASError(ERROR_NO_BACKEND); + } - byte[] inputData = IOUtils.toByteArray(parameter.getDataSource() - .getInputStream()); - - for (int i = 0; i < fields.size(); i++) { - COSDictionary field = (COSDictionary) fields.getObject(i); - String type = field.getNameAsString("FT"); - if ("Sig".equals(type)) { - boolean verifyThis = true; - - if (signatureToVerify >= 0) { - // verify only specific siganture! - verifyThis = signatureToVerify == currentSignature; - } - - if (signatureToVerify == -2) { - verifyThis = i == lastSig; - } - - if (verifyThis) { - logger.trace("Found Signature: "); - COSBase base = field.getDictionaryObject("V"); - COSDictionary dict = (COSDictionary) base; - - logger.debug("Signer: " + dict.getNameAsString("Name")); - logger.debug("SubFilter: " - + dict.getNameAsString("SubFilter")); - logger.debug("Filter: " - + dict.getNameAsString("Filter")); - logger.debug("Modified: " + dict.getNameAsString("M")); - COSArray byteRange = (COSArray) dict - .getDictionaryObject("ByteRange"); - - StringBuilder sb = new StringBuilder(); - int[] bytes = new int[byteRange.size()]; - for (int j = 0; j < byteRange.size(); j++) { - bytes[j] = byteRange.getInt(j); - sb.append(" " + bytes[j]); - } - - logger.debug("ByteRange" + sb.toString()); - - COSString content = (COSString) dict - .getDictionaryObject("Contents"); - - ByteArrayOutputStream contentData = new ByteArrayOutputStream(); - for (int j = 0; j < bytes.length; j = j + 2) { - int offset = bytes[j]; - int length = bytes[j + 1]; - - contentData.write(inputData, offset, length); - } - contentData.close(); - - IVerifyFilter verifyFilter = verifier.getVerifier( - dict.getNameAsString("Filter"), - dict.getNameAsString("SubFilter")); - - IVerifier lvlVerifier = verifier - .getVerifierByLevel(parameter - .getSignatureVerificationLevel()); - lvlVerifier.setConfiguration(parameter - .getConfiguration()); - if (verifyFilter != null) { - List<VerifyResult> results = verifyFilter.verify( - contentData.toByteArray(), - content.getBytes(), - parameter.getVerificationTime(), bytes, - lvlVerifier); - if (results != null && !results.isEmpty()) { - result.addAll(results); - } - } - } - currentSignature++; - } - } - return result; - } catch (IOException e) { - logger.error("Failed to verify document", e); - throw ErrorExtractor.searchPdfAsError(e); - } catch (PdfAsException e) { - logger.error("Failed to verify document", e); + try { + return backend.getVerifier().verify(parameter); + } catch (Throwable e) { throw ErrorExtractor.searchPdfAsError(e); - } finally { - if (doc != null) { - try { - doc.close(); - } catch (IOException e) { - logger.info("Failed to close doc"); - } - } } } @@ -380,9 +246,21 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants, // execute pre Processors signPreProcessing(parameter); - + + // allocated Backend + PDFASBackend backend = BackendLoader.getPDFASBackend(); + + if (backend == null) { + throw new PDFASError(ERROR_NO_BACKEND); + } + ISettings settings = (ISettings) parameter.getConfiguration(); - OperationStatus status = new OperationStatus(settings, parameter); + OperationStatus status = new OperationStatus(settings, parameter, + backend); + + IPdfSigner signer = backend.getPdfSigner(); + + status.setPdfObject(signer.buildPDFObject(status)); RequestedSignature requestedSignature = new RequestedSignature( status); @@ -428,11 +306,14 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants, .getPDFFilter(); String pdfSubFilter = status.getSignParamter().getPlainSigner() .getPDFSubFilter(); - SignatureDataExtractor signatureDataExtractor = new SignatureDataExtractor( - request.getCertificate(), pdfFilter, pdfSubFilter, - status.getSigningDate()); - IPdfSigner signer = PdfSignerFactory.createPdfSigner(); + IPdfSigner signer = status.getBackend().getPdfSigner(); + + PDFASSignatureExtractor signatureDataExtractor = signer + .buildBlindSignaturInterface(request.getCertificate(), + pdfFilter, pdfSubFilter, + status.getSigningDate()); + signer.signPDF(status.getPdfObject(), status.getRequestedSignature(), signatureDataExtractor); @@ -462,9 +343,8 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants, // Inject signature byte[] into signedDocument int offset = request.getSignatureDataByteRange()[1] + 1; - String signature = new COSString(request.getSignature()) - .getHexString(); - byte[] pdfSignature = signature.getBytes(); + byte[] pdfSignature = status.getBackend().getPdfSigner() + .rewritePlainSignature(request.getSignature()); // byte[] input = // PDFUtils.blackOutSignature(status.getPdfObject().getSignedDocument(), // request.getSignatureDataByteRange()); @@ -517,53 +397,61 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants, private void listPreProcessors(List<PreProcessor> preProcessors) { logger.debug("--------------"); logger.debug("Listing PreProcessors:"); - + Iterator<PreProcessor> preProcessorsIterator = preProcessors.iterator(); int idx = 0; - while(preProcessorsIterator.hasNext()) { + while (preProcessorsIterator.hasNext()) { PreProcessor preProcessor = preProcessorsIterator.next(); - logger.debug("{}: {} [{}]", idx, preProcessor.getName(), preProcessor.getClass().getName()); + logger.debug("{}: {} [{}]", idx, preProcessor.getName(), + preProcessor.getClass().getName()); idx++; } logger.debug("--------------"); } - - private void verifyPreProcessing(VerifyParameter parameter) throws PDFASError { - List<PreProcessor> preProcessors = PreProcessorLoader.getPreProcessors(parameter.getConfiguration()); - + + private void verifyPreProcessing(VerifyParameter parameter) + throws PDFASError { + List<PreProcessor> preProcessors = PreProcessorLoader + .getPreProcessors(parameter.getConfiguration()); + listPreProcessors(preProcessors); - + logger.debug("executing PreProcessors for verifing:"); Iterator<PreProcessor> preProcessorsIterator = preProcessors.iterator(); - - while(preProcessorsIterator.hasNext()) { + + while (preProcessorsIterator.hasNext()) { PreProcessor preProcessor = preProcessorsIterator.next(); - logger.debug("executing: {} [{}]", preProcessor.getName(), preProcessor.getClass().getName()); + logger.debug("executing: {} [{}]", preProcessor.getName(), + preProcessor.getClass().getName()); preProcessor.verify(parameter); - logger.debug("done executing: {} [{}]", preProcessor.getName(), preProcessor.getClass().getName()); + logger.debug("done executing: {} [{}]", preProcessor.getName(), + preProcessor.getClass().getName()); } - + logger.debug("executing PreProcessors for verifing done"); } - + private void signPreProcessing(SignParameter parameter) throws PDFASError { - List<PreProcessor> preProcessors = PreProcessorLoader.getPreProcessors(parameter.getConfiguration()); - + List<PreProcessor> preProcessors = PreProcessorLoader + .getPreProcessors(parameter.getConfiguration()); + listPreProcessors(preProcessors); - + logger.debug("executing PreProcessors for signing:"); Iterator<PreProcessor> preProcessorsIterator = preProcessors.iterator(); - - while(preProcessorsIterator.hasNext()) { + + while (preProcessorsIterator.hasNext()) { PreProcessor preProcessor = preProcessorsIterator.next(); - logger.debug("executing: {} [{}]", preProcessor.getName(), preProcessor.getClass().getName()); + logger.debug("executing: {} [{}]", preProcessor.getName(), + preProcessor.getClass().getName()); preProcessor.sign(parameter); - logger.debug("done executing: {} [{}]", preProcessor.getName(), preProcessor.getClass().getName()); + logger.debug("done executing: {} [{}]", preProcessor.getName(), + preProcessor.getClass().getName()); } - + logger.debug("executing PreProcessors for signing done"); } - + private SignResult createSignResult(OperationStatus status) throws IOException { // ================================================================ @@ -580,7 +468,8 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants, } public Image generateVisibleSignaturePreview(SignParameter parameter, - java.security.cert.X509Certificate cert, int resolution) throws PDFASError { + java.security.cert.X509Certificate cert, int resolution) + throws PDFASError { OperationStatus status = null; try { @@ -589,14 +478,20 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants, throw new PDFASError(ERROR_SET_INVALID_SETTINGS_OBJ); } X509Certificate iaikCert; - if(!(cert instanceof X509Certificate)) { + if (!(cert instanceof X509Certificate)) { iaikCert = new X509Certificate(cert.getEncoded()); } else { - iaikCert = (X509Certificate)cert; + iaikCert = (X509Certificate) cert; } - + // allocated Backend + PDFASBackend backend = BackendLoader.getPDFASBackend(); + ISettings settings = (ISettings) parameter.getConfiguration(); - status = new OperationStatus(settings, parameter); + status = new OperationStatus(settings, parameter, backend); + + IPdfSigner signer = backend.getPdfSigner(); + + status.setPdfObject(signer.buildPDFObject(status)); RequestedSignature requestedSignature = new RequestedSignature( status); @@ -607,93 +502,8 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants, return null; } - PDFObject pdfObject = status.getPdfObject(); - - PDDocument origDoc = new PDDocument(); - origDoc.addPage(new PDPage(PDPage.PAGE_SIZE_A4)); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - origDoc.save(baos); - baos.close(); - - pdfObject.setOriginalDocument(new ByteArrayDataSource(baos - .toByteArray())); - - SignatureProfileSettings signatureProfileSettings = TableFactory - .createProfile(requestedSignature.getSignatureProfileID(), - pdfObject.getStatus().getSettings()); - - // create Table describtion - Table main = TableFactory.createSigTable(signatureProfileSettings, - MAIN, pdfObject.getStatus(), requestedSignature); - - IPDFStamper stamper = StamperFactory.createDefaultStamper(pdfObject - .getStatus().getSettings()); - - IPDFVisualObject visualObject = stamper.createVisualPDFObject( - pdfObject, main); - - SignatureProfileConfiguration signatureProfileConfiguration = pdfObject - .getStatus().getSignatureProfileConfiguration( - requestedSignature.getSignatureProfileID()); - - String signaturePosString = signatureProfileConfiguration - .getDefaultPositioning(); - PositioningInstruction positioningInstruction = null; - if (signaturePosString != null) { - positioningInstruction = Positioning.determineTablePositioning( - new TablePos(signaturePosString), "", origDoc, - visualObject, false); - } else { - positioningInstruction = Positioning.determineTablePositioning( - new TablePos(), "", origDoc, visualObject, false); - } - - origDoc.close(); - - 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); - - PDFAsVisualSignatureProperties properties = new PDFAsVisualSignatureProperties( - pdfObject.getStatus().getSettings(), pdfObject, - (PdfBoxVisualObject) visualObject, positioningInstruction); - - properties.buildSignature(); - PDDocument visualDoc = PDDocument.load(properties - .getVisibleSignature()); - // PDPageable pageable = new PDPageable(visualDoc); - List<PDPage> pages = new ArrayList<PDPage>(); - visualDoc.getDocumentCatalog().getPages().getAllKids(pages); - - PDPage firstPage = pages.get(0); - - float stdRes = 72; - float targetRes = resolution; - float factor = targetRes / stdRes; - - BufferedImage outputImage = firstPage.convertToImage( - BufferedImage.TYPE_4BYTE_ABGR, (int) targetRes); - - BufferedImage cutOut = new BufferedImage( - (int) (position.getWidth() * factor), - (int) (position.getHeight() * factor), - BufferedImage.TYPE_4BYTE_ABGR); - - Graphics2D graphics = (Graphics2D) cutOut.getGraphics(); - - graphics.drawImage(outputImage, 0, 0, cutOut.getWidth(), cutOut - .getHeight(), (int) (1 * factor), (int) (outputImage - .getHeight() - ((position.getHeight() + 1) * factor)), - (int) ((1 + position.getWidth()) * factor), - (int) (outputImage.getHeight() - - ((position.getHeight() + 1) * factor) + (position - .getHeight() * factor)), null); - return cutOut; + return signer.generateVisibleSignaturePreview(parameter, iaikCert, + resolution, status, requestedSignature); } catch (PdfAsException e) { logger.error("PDF-AS Exception", e); throw ErrorExtractor.searchPdfAsError(e); |