From 5e65a0aa96300e24a6dc7d4be64cf6745f325fc5 Mon Sep 17 00:00:00 2001 From: Andreas Fitzek Date: Thu, 8 May 2014 11:57:22 +0200 Subject: Added Rotation for pdfbox signatures --- .../lib/impl/signing/pdfbox/PADESPDFBOXSigner.java | 144 +++++++++++++++------ .../impl/stamping/pdfbox/PDFAsTemplateCreator.java | 5 +- .../pdfbox/PDFAsVisualSignatureBuilder.java | 141 +++++++++++++------- .../pdfbox/PDFAsVisualSignatureDesigner.java | 4 + .../pdfbox/PDFAsVisualSignatureProperties.java | 8 +- 5 files changed, 208 insertions(+), 94 deletions(-) diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PADESPDFBOXSigner.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PADESPDFBOXSigner.java index c74b15b0..68257861 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PADESPDFBOXSigner.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PADESPDFBOXSigner.java @@ -30,6 +30,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Calendar; +import java.util.Iterator; import java.util.List; import org.apache.pdfbox.cos.COSDictionary; @@ -41,13 +42,21 @@ import org.apache.pdfbox.pdmodel.PDDocumentCatalog; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageNode; import org.apache.pdfbox.pdmodel.PDResources; +import org.apache.pdfbox.pdmodel.graphics.color.PDGamma; import org.apache.pdfbox.pdmodel.graphics.color.PDOutputIntent; import org.apache.pdfbox.pdmodel.graphics.xobject.PDJpeg; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceCharacteristicsDictionary; import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature; import org.apache.pdfbox.pdmodel.interactive.digitalsignature.SignatureOptions; +import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; +import org.apache.pdfbox.pdmodel.interactive.form.PDField; +import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import sun.tools.jar.SignatureFile; import at.gv.egiz.pdfas.common.exceptions.PdfAsException; import at.gv.egiz.pdfas.common.messages.MessageResolver; import at.gv.egiz.pdfas.common.settings.SignatureProfileSettings; @@ -193,14 +202,15 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { IPDFVisualObject visualObject = stamper.createVisualPDFObject( pdfObject, main); - /*PDDocument originalDocument = PDDocument - .load(new ByteArrayInputStream(pdfObject.getStatus() - .getPdfObject().getOriginalDocument()));*/ + /* + * PDDocument originalDocument = PDDocument .load(new + * ByteArrayInputStream(pdfObject.getStatus() + * .getPdfObject().getOriginalDocument())); + */ PositioningInstruction positioningInstruction = Positioning - .determineTablePositioning(tablePos, "", - doc, visualObject, - legacy32Position); + .determineTablePositioning(tablePos, "", doc, + visualObject, legacy32Position); SignaturePositionImpl position = new SignaturePositionImpl(); position.setX(positioningInstruction.getX()); @@ -218,10 +228,11 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { properties.buildSignature(); - /*ByteArrayOutputStream sigbos = new ByteArrayOutputStream(); - sigbos.write(StreamUtils.inputStreamToByteArray(properties - .getVisibleSignature())); - sigbos.close();*/ + /* + * ByteArrayOutputStream sigbos = new ByteArrayOutputStream(); + * sigbos.write(StreamUtils.inputStreamToByteArray(properties + * .getVisibleSignature())); sigbos.close(); + */ if (signaturePlaceholderData != null) { // Placeholder found! @@ -238,14 +249,18 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { int pageNumber = positioningInstruction.getPage(); rootPages.getAllKids(kids); PDPage page = kids.get(pageNumber); - - logger.info("Placeholder name: " + signaturePlaceholderData.getPlaceholderName()); - COSDictionary xobjectsDictionary = (COSDictionary) page.findResources().getCOSDictionary() + + logger.info("Placeholder name: " + + signaturePlaceholderData.getPlaceholderName()); + COSDictionary xobjectsDictionary = (COSDictionary) page + .findResources().getCOSDictionary() .getDictionaryObject(COSName.XOBJECT); - xobjectsDictionary.setItem(signaturePlaceholderData.getPlaceholderName(), img); + xobjectsDictionary.setItem( + signaturePlaceholderData.getPlaceholderName(), img); xobjectsDictionary.setNeedToBeUpdate(true); page.findResources().getCOSObject().setNeedToBeUpdate(true); - logger.info("Placeholder name: " + signaturePlaceholderData.getPlaceholderName()); + logger.info("Placeholder name: " + + signaturePlaceholderData.getPlaceholderName()); } if (positioningInstruction.isMakeNewPage()) { @@ -283,51 +298,98 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { e); } } - - /*if(signatureProfileSettings.isPDFA()) { - // Check for PDF-UA - PDDocumentCatalog root = doc.getDocumentCatalog(); - PDStructureTreeRoot treeRoot = root.getStructureTreeRoot(); - if(treeRoot != null) { - // Handle as PDF-UA - logger.info("Tree Root: {}", treeRoot.toString()); - PDStructureElement docElement = PDFBoxTaggingUtils.getDocumentElement(treeRoot); - PDStructureElement sigBlock = new PDStructureElement("Table", docElement); - root.getCOSObject().setNeedToBeUpdate(true); - docElement.getCOSObject().setNeedToBeUpdate(true); - treeRoot.getCOSObject().setNeedToBeUpdate(true); - sigBlock.setTitle("Signature Table"); - } - }*/ + + /* + * if(signatureProfileSettings.isPDFA()) { // Check for PDF-UA + * PDDocumentCatalog root = doc.getDocumentCatalog(); + * PDStructureTreeRoot treeRoot = root.getStructureTreeRoot(); + * if(treeRoot != null) { // Handle as PDF-UA + * logger.info("Tree Root: {}", treeRoot.toString()); + * PDStructureElement docElement = + * PDFBoxTaggingUtils.getDocumentElement(treeRoot); + * PDStructureElement sigBlock = new PDStructureElement("Table", + * docElement); root.getCOSObject().setNeedToBeUpdate(true); + * docElement.getCOSObject().setNeedToBeUpdate(true); + * treeRoot.getCOSObject().setNeedToBeUpdate(true); + * sigBlock.setTitle("Signature Table"); } } + */ options.setPreferedSignatureSize(0x1000); options.setPage(positioningInstruction.getPage()); - options.setVisualSignature(properties - .getVisibleSignature()); + options.setVisualSignature(properties.getVisibleSignature()); } doc.addSignature(signature, signer, options); + if (requestedSignature.isVisual()) { + + // if(requestedSignature.getSignaturePosition().) + + PDAcroForm acroForm = doc.getDocumentCatalog().getAcroForm(); + if (acroForm != null) { + + @SuppressWarnings("unchecked") + List fields = acroForm.getFields(); + PDSignatureField signatureField = null; + + if (fields != null) { + for (PDField pdField : fields) { + if (pdField instanceof PDSignatureField) { + if (((PDSignatureField) pdField).getSignature().getDictionary() + .equals(signature.getDictionary())) { + signatureField = (PDSignatureField) pdField; + } + } + } + } else { + logger.warn("Failed to apply rotation! [Cannot find Field list in acroForm!]"); + } + + if(signatureField != null) { + if (signatureField.getWidget() != null) { + if (signatureField.getWidget() + .getAppearanceCharacteristics() == null) { + PDAppearanceCharacteristicsDictionary dict = new PDAppearanceCharacteristicsDictionary( + new COSDictionary()); + signatureField.getWidget() + .setAppearanceCharacteristics(dict); + } + + if (signatureField.getWidget() + .getAppearanceCharacteristics() != null) { + signatureField.getWidget() + .getAppearanceCharacteristics() + .setRotation(90); + } + } + } else { + logger.warn("Failed to apply rotation! [Cannot find signature Field!]"); + } + } else { + logger.warn("Failed to apply rotation! [Cannot find acroForm!]"); + } + } + // pdfbox patched (FIS -> IS) doc.saveIncremental(fis, fos); fis.close(); fos.flush(); fos.close(); fos = null; - + fis = new FileInputStream(new File(fisTmpFile)); // write to resulting output stream - //ByteArrayOutputStream bos = new ByteArrayOutputStream(); - //bos.write(); - //bos.close(); - + // ByteArrayOutputStream bos = new ByteArrayOutputStream(); + // bos.write(); + // bos.close(); - pdfObject.setSignedDocument(StreamUtils.inputStreamToByteArray(fis)); + pdfObject + .setSignedDocument(StreamUtils.inputStreamToByteArray(fis)); fis.close(); fis = null; System.gc(); - + helper.deleteFile(fisTmpFile); } catch (IOException e) { @@ -341,7 +403,7 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants { throw new PdfAsException("error.pdf.sig.01", e); } finally { logger.info("Signature done!"); - + } } } diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsTemplateCreator.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsTemplateCreator.java index 528e4d6a..1c001b0c 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsTemplateCreator.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsTemplateCreator.java @@ -65,7 +65,7 @@ public class PDFAsTemplateCreator extends PDFTemplateCreator { //AffineTransform transform = pdfStructure.getAffineTransform(); // rectangle, formatter, image. /AcroForm/DR/XObject contains that form - this.pdfBuilder.createSignatureRectangle(pdSignatureField, properties); + this.pdfBuilder.createSignatureRectangle(pdSignatureField, properties, properties.getRotation()); this.pdfBuilder.createFormaterRectangle(properties.getFormaterRectangleParams()); PDRectangle formater = pdfStructure.getFormaterRectangle(); @@ -79,7 +79,8 @@ public class PDFAsTemplateCreator extends PDFTemplateCreator { this.pdfBuilder.createHolderForm(holderFormResources, holderFormStream, formater); // that is /AP entry the appearance dictionary. - this.pdfBuilder.createAppearanceDictionary(pdfStructure.getHolderForm(), pdSignatureField); + this.pdfBuilder.createAppearanceDictionary(pdfStructure.getHolderForm(), pdSignatureField, + properties.getRotation()); // inner formstream, form and resource (hlder form containts inner form) this.pdfBuilder.createInnerFormStream(template); diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureBuilder.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureBuilder.java index ea26c778..f7a6c824 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureBuilder.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureBuilder.java @@ -2,6 +2,7 @@ package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox; import java.awt.Color; import java.awt.geom.AffineTransform; +import java.awt.geom.Point2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; @@ -71,10 +72,10 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { logger.info("Drawing Table:"); abstractTable.dumpTable(); - if(abstractTable.getBGColor() != null) { + if (abstractTable.getBGColor() != null) { contentStream.setNonStrokingColor(abstractTable.getBGColor()); contentStream.fillRect(x, y, abstractTable.getWidth(), - abstractTable.getHeight()); + abstractTable.getHeight()); contentStream.setNonStrokingColor(Color.BLACK); } float total = 0; @@ -125,7 +126,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { yheight = y + abstractTable.getHeight(); } for (int i = 0; i <= cols; i++) { - if(subtable && i == cols) { + if (subtable && i == cols) { continue; } logger.info("COL LINE: {} {} {} {}", nextx, ypos, nextx, @@ -156,21 +157,24 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { String text = (String) cell.getValue(); float ttexty = texty - padding - fontSize; - //COSName name = COSName.getPDFName("ANDI_TAG!"); - //contentStream.beginMarkedContentSequence(COSName.ALT, name); - String fontName = textFont.equals(PDType1Font.COURIER) ? "COURIER" : "HELVETICA"; - + // COSName name = COSName.getPDFName("ANDI_TAG!"); + // contentStream.beginMarkedContentSequence(COSName.ALT, + // name); + String fontName = textFont.equals(PDType1Font.COURIER) ? "COURIER" + : "HELVETICA"; + contentStream.beginText(); - - if(innerFormResources.getFonts().containsValue(textFont)) { + + if (innerFormResources.getFonts().containsValue(textFont)) { String fontID = getFontID(textFont); logger.info("Using Font: " + fontID); - contentStream.appendRawCommands("/" + fontID + " " + fontSize + " Tf\n"); + contentStream.appendRawCommands("/" + fontID + " " + + fontSize + " Tf\n"); } else { contentStream.setFont(textFont, fontSize); } logger.info("Writing: " + textx + " : " + ttexty + " = " - + text + " as " + cell.getType() + " w " + fontName); + + text + " as " + cell.getType() + " w " + fontName); contentStream.moveTextPositionByAmount(textx, ttexty); if (text.contains("\n")) { @@ -256,16 +260,17 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { private Map images = new HashMap(); private String getFontID(PDFont font) { - Iterator> it = innerFormResources.getFonts().entrySet().iterator(); - while(it.hasNext()) { + Iterator> it = innerFormResources + .getFonts().entrySet().iterator(); + while (it.hasNext()) { java.util.Map.Entry entry = it.next(); - if(entry.getValue().equals(font)) { + if (entry.getValue().equals(font)) { return entry.getKey(); } } return ""; } - + public PDFAsVisualSignatureBuilder( PDFAsVisualSignatureProperties properties, ISettings settings) { this.properties = properties; @@ -292,7 +297,8 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { getStructure().setTemplate(template); } - private void readTableResources(PDFBoxTable table, PDDocument template) throws PdfAsException, IOException { + private void readTableResources(PDFBoxTable table, PDDocument template) + throws PdfAsException, IOException { float[] colsSizes = table.getColsRelativeWith(); int max_cols = table.getColCount(); @@ -322,18 +328,16 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { logger.info("Col: " + cols_idx + " : " + colsSizes[cols_idx]); } - /*if(!addedFonts.contains(table.getFont().getFont(null))) { - PDFont font = table.getFont().getFont(template); - addedFonts.add(font); - innerFormResources.addFont(font); - } - - if(!addedFonts.contains(table.getValueFont().getFont(null))) { - PDFont font = table.getValueFont().getFont(template); - addedFonts.add(font); - innerFormResources.addFont(font); - }*/ - + /* + * if(!addedFonts.contains(table.getFont().getFont(null))) { PDFont font + * = table.getFont().getFont(template); addedFonts.add(font); + * innerFormResources.addFont(font); } + * + * if(!addedFonts.contains(table.getValueFont().getFont(null))) { PDFont + * font = table.getValueFont().getFont(template); addedFonts.add(font); + * innerFormResources.addFont(font); } + */ + for (int i = 0; i < table.getRowCount(); i++) { ArrayList row = table.getRow(i); for (int j = 0; j < row.size(); j++) { @@ -372,19 +376,20 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { float size = (int) Math.floor((double) width); size -= 2 * padding; logger.debug("Scaling image to: " + size); - - if(table.style != null) { - if(table.style.getImageScaleToFit() != null) { - size = table.style.getImageScaleToFit().getWidth(); + + if (table.style != null) { + if (table.style.getImageScaleToFit() != null) { + size = table.style.getImageScaleToFit() + .getWidth(); } } - + PDXObjectImage pdImage = new PDJpeg(template, img); ImageObject image = new ImageObject(pdImage, size); images.put(img_ref, image); innerFormResources.addXObject(pdImage, "Im"); } - } else if(cell.getType() == Entry.TYPE_TABLE) { + } else if (cell.getType() == Entry.TYPE_TABLE) { PDFBoxTable tbl_value = (PDFBoxTable) cell.getValue(); readTableResources(tbl_value, template); } @@ -402,10 +407,10 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { innerFormResources = new PDResources(); getStructure().getPage().setResources(innerFormResources); readTableResources(properties.getMainTable(), template); - + PDPageContentStream stream = new PDPageContentStream(template, getStructure().getPage()); - //stream.setFont(PDType1Font.COURIER, 5); + // stream.setFont(PDType1Font.COURIER, 5); drawTable(getStructure().getPage(), stream, 1, 1, properties.getMainTable(), template, false); @@ -450,7 +455,15 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { * String imgFormComment = "q " + 100 + " 0 0 50 0 0 cm /" + imageName + * " Do Q\n"; */ - String holderFormComment = "q 1 0 0 1 0 0 cm /" + innerFormName + double m00 = getStructure().getAffineTransform().getScaleX(); + double m10 = getStructure().getAffineTransform().getShearY(); + double m01 = getStructure().getAffineTransform().getShearX(); + double m11 = getStructure().getAffineTransform().getScaleY(); + double m02 = getStructure().getAffineTransform().getTranslateX(); + double m12 = getStructure().getAffineTransform().getTranslateY(); + + String holderFormComment = "q " + m00 + " " + m10 + " " + m01 + " " + + m11 + " " + m02 + " " + m12 + " cm /" + innerFormName + " Do Q \n"; // String innerFormComment = "q 1 0 0 1 0 0 cm /" + imageObjectName + // " Do Q\n"; @@ -522,14 +535,36 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { } public void createSignatureRectangle(PDSignatureField signatureField, - PDFAsVisualSignatureDesigner properties) throws IOException { + PDFAsVisualSignatureDesigner properties, float degrees) + throws IOException { PDRectangle rect = new PDRectangle(); - rect.setUpperRightX(properties.getxAxis() + properties.getWidth() + 10); - rect.setUpperRightY(properties.getPageHeight() - properties.getyAxis()); - rect.setLowerLeftY(properties.getPageHeight() - properties.getyAxis() - - properties.getHeight() - 10); - rect.setLowerLeftX(properties.getxAxis()); + + Point2D upSrc = new Point2D.Float(); + upSrc.setLocation(properties.getxAxis() + properties.getWidth() + 10, + properties.getPageHeight() - properties.getyAxis()); + + Point2D llSrc = new Point2D.Float(); + llSrc.setLocation(properties.getxAxis(), properties.getPageHeight() + - properties.getyAxis() - properties.getHeight() - 10); + AffineTransform transform = new AffineTransform(); + transform.setToIdentity(); + if (degrees % 360 != 0) { + transform.setToRotation(Math.toRadians(degrees), llSrc.getX(), + llSrc.getY()); + } + Point2D upDst = new Point2D.Float(); + transform.transform(upSrc, upDst); + + Point2D llDst = new Point2D.Float(); + transform.transform(llSrc, llDst); + + rect.setUpperRightX((float) upDst.getX()); + rect.setUpperRightY((float) upDst.getY()); + rect.setLowerLeftY((float) llDst.getY()); + rect.setLowerLeftX((float) llDst.getX()); + logger.info("rectangle of signature has been created: {}", + rect.toString()); signatureField.getWidget().setRectangle(rect); getStructure().setSignatureRectangle(rect); logger.info("rectangle of signature has been created"); @@ -538,6 +573,7 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { public void createAffineTransform(byte[] params) { AffineTransform transform = new AffineTransform(params[0], params[1], params[2], params[3], params[4], params[5]); + // transform.rotate(90); getStructure().setAffineTransform(transform); logger.info("Matrix has been added"); } @@ -555,10 +591,14 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { public void createFormaterRectangle(float[] params) { PDRectangle formrect = new PDRectangle(); - formrect.setUpperRightX(params[0]); - formrect.setUpperRightY(params[1]); - formrect.setLowerLeftX(params[2]); - formrect.setLowerLeftY(params[3]); + float[] translated = new float[4]; + getStructure().getAffineTransform().transform(params, 0, translated, 0, + 2); + + formrect.setUpperRightX(translated[0]); + formrect.setUpperRightY(translated[1]); + formrect.setLowerLeftX(translated[2]); + formrect.setLowerLeftY(translated[3]); getStructure().setFormaterRectangle(formrect); logger.info("Formater rectangle has been created"); @@ -591,14 +631,17 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { } public void createAppearanceDictionary(PDXObjectForm holderForml, - PDSignatureField signatureField) throws IOException { + PDSignatureField signatureField, float degrees) throws IOException { PDAppearanceDictionary appearance = new PDAppearanceDictionary(); appearance.getCOSObject().setDirect(true); PDAppearanceStream appearanceStream = new PDAppearanceStream( holderForml.getCOSStream()); - + AffineTransform transform = new AffineTransform(); + transform.setToIdentity(); + transform.rotate(Math.toRadians(degrees)); + appearanceStream.setMatrix(transform); appearance.setNormalAppearance(appearanceStream); signatureField.getWidget().setAppearance(appearance); diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureDesigner.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureDesigner.java index b2183753..4bc33cba 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureDesigner.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureDesigner.java @@ -398,4 +398,8 @@ public class PDFAsVisualSignatureDesigner { "That method is not yet implemented"); } + public float getRotation() { + return this.properties.getRotation(); + } + } diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureProperties.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureProperties.java index 6b1edf13..9ccf4eed 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureProperties.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureProperties.java @@ -1,6 +1,5 @@ package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox; -import java.io.ByteArrayInputStream; import java.io.IOException; import org.apache.pdfbox.pdmodel.PDDocument; @@ -21,6 +20,8 @@ public class PDFAsVisualSignatureProperties extends PDVisibleSigProperties { private PDFBoxTable main; private PDFAsVisualSignatureDesigner designer; + + private float rotationAngle = 0; public PDFAsVisualSignatureProperties(ISettings settings, PDFObject object, PdfBoxVisualObject visObj, PositioningInstruction pos) { @@ -31,6 +32,7 @@ public class PDFAsVisualSignatureProperties extends PDVisibleSigProperties { } catch (Throwable e) { e.printStackTrace(); } + this.rotationAngle = pos.getRotation(); try { PDDocument origDoc = object.getDocument(); @@ -58,6 +60,8 @@ public class PDFAsVisualSignatureProperties extends PDVisibleSigProperties { } + public float getRotation() { + return this.rotationAngle; + } - } -- cgit v1.2.3