diff options
author | Andreas Fitzek <andreas.fitzek@iaik.tugraz.at> | 2014-04-03 15:38:01 +0200 |
---|---|---|
committer | Andreas Fitzek <andreas.fitzek@iaik.tugraz.at> | 2014-04-03 15:47:56 +0200 |
commit | f891dca529c9dc199114ae4f0857d28812315b11 (patch) | |
tree | 66de8c3db33fd05ff8511c9d8252aaef72a6b516 /pdf-as-lib | |
parent | 473f376290dbcaa435f234a9ba48d9bc54946923 (diff) | |
download | pdf-as-4-f891dca529c9dc199114ae4f0857d28812315b11.tar.gz pdf-as-4-f891dca529c9dc199114ae4f0857d28812315b11.tar.bz2 pdf-as-4-f891dca529c9dc199114ae4f0857d28812315b11.zip |
Fixed Positioning to recognize Annotations
Diffstat (limited to 'pdf-as-lib')
7 files changed, 126 insertions, 31 deletions
diff --git a/pdf-as-lib/src/configuration/cfg/profiles/SIGNATURBLOCK_SMALL_EN.properties b/pdf-as-lib/src/configuration/cfg/profiles/SIGNATURBLOCK_SMALL_EN.properties index ce21a3ab..cfe6267a 100644 --- a/pdf-as-lib/src/configuration/cfg/profiles/SIGNATURBLOCK_SMALL_EN.properties +++ b/pdf-as-lib/src/configuration/cfg/profiles/SIGNATURBLOCK_SMALL_EN.properties @@ -15,6 +15,7 @@ sig_obj.SIGNATURBLOCK_SMALL_EN.key.SIG_NOTE=Note sig_obj.SIGNATURBLOCK_SMALL_EN.value.SIG_SUBJECT=${subject.T != null ? (subject.T + " ") : ""}${subject.CN}
sig_obj.SIGNATURBLOCK_SMALL_EN.value.SIG_ISSUER=${issuer.T != null ? (issuer.T + " ") : ""}${issuer.CN}
sig_obj.SIGNATURBLOCK_SMALL_EN.value.SIG_NUMBER=${sn}
+sig_obj.SIGNATURBLOCK_SMALL_EN.value.SIG_NOTE=This document is signed with a qualified electronic signature. According to \u00a7\u00A04 art.\u00A01 of the Signature Act it in principle is legally equivalent to an handwritten signature.
sig_obj.SIGNATURBLOCK_SMALL_EN.pos=f:80;w:260
sig_obj.SIGNATURBLOCK_SMALL_EN.adobeSignFieldValue=PDF-AS Signature
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 767887b3..c04dca59 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 @@ -42,6 +42,8 @@ import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocumentCatalog; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageNode; +import org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureElement; +import org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureTreeRoot; import org.apache.pdfbox.pdmodel.graphics.color.PDOutputIntent; import org.apache.pdfbox.pdmodel.graphics.xobject.PDJpeg; import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature; @@ -69,6 +71,7 @@ import at.gv.egiz.pdfas.lib.impl.stamping.TableFactory; import at.gv.egiz.pdfas.lib.impl.stamping.ValueResolver; 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.stamping.pdfbox.tagging.PDFBoxTaggingUtils; import at.gv.egiz.pdfas.lib.impl.status.PDFObject; import at.gv.egiz.pdfas.lib.impl.status.RequestedSignature; import at.knowcenter.wag.egov.egiz.pdf.PositioningInstruction; @@ -288,6 +291,22 @@ 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"); + } + }*/ options.setPreferedSignatureSize(0x1000); options.setPage(positioningInstruction.getPage()); 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 0b183c08..e24ff939 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 @@ -41,14 +41,13 @@ import org.slf4j.LoggerFactory; import at.gv.egiz.pdfas.common.exceptions.PdfAsException; import at.gv.egiz.pdfas.common.settings.ISettings; -import at.gv.egiz.pdfas.lib.test.mains.TestPDFBoxTable; import at.knowcenter.wag.egov.egiz.table.Entry; import at.knowcenter.wag.egov.egiz.table.Style; public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { private static final Logger logger = LoggerFactory - .getLogger(TestPDFBoxTable.class); + .getLogger(PDFAsVisualSignatureBuilder.class); private void drawTable(PDPage page, PDPageContentStream contentStream, float x, float y, PDFBoxTable abstractTable, PDDocument doc, @@ -157,9 +156,8 @@ 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); + //COSName name = COSName.getPDFName("ANDI_TAG!"); + //contentStream.beginMarkedContentSequence(COSName.ALT, name); String fontName = textFont.equals(PDType1Font.COURIER) ? "COURIER" : "HELVETICA"; contentStream.beginText(); @@ -254,7 +252,6 @@ public class PDFAsVisualSignatureBuilder extends PDVisibleSigBuilder { private PDFAsVisualSignatureProperties properties; private ISettings settings; -// private List<PDFont> addedFonts = new ArrayList<PDFont>(); private PDResources innerFormResources; private Map<String, ImageObject> images = new HashMap<String, ImageObject>(); diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/tagging/PDFBoxTaggingUtils.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/tagging/PDFBoxTaggingUtils.java new file mode 100644 index 00000000..3501e354 --- /dev/null +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/tagging/PDFBoxTaggingUtils.java @@ -0,0 +1,35 @@ +package at.gv.egiz.pdfas.lib.impl.stamping.pdfbox.tagging; + +import java.util.Iterator; +import java.util.List; + +import org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure.PDMarkedContentReference; +import org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureElement; +import org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureNode; +import org.apache.pdfbox.pdmodel.documentinterchange.markedcontent.PDMarkedContent; + +public class PDFBoxTaggingUtils { + + public static String DOCUMENT = "Document"; + + public static void beginMarkedContent(PDMarkedContentReference reference) { + PDMarkedContentReference ref; + PDMarkedContent mc; + } + + public static PDStructureElement getDocumentElement(PDStructureNode structElem) { + List<Object> kids = structElem.getKids(); + Iterator<Object> kidsit = kids.iterator(); + while (kidsit.hasNext()) { + Object kid = kidsit.next(); + if (kid instanceof PDStructureElement) { + PDStructureElement elem = (PDStructureElement) kid; + if(elem.getStructureType().equals(DOCUMENT)) { + return elem; + } + } + } + return null; + } + +} diff --git a/pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFPage.java b/pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFPage.java index 540179b8..e482d50c 100644 --- a/pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFPage.java +++ b/pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFPage.java @@ -64,6 +64,7 @@ import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.common.PDStream; import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObject; import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; import org.apache.pdfbox.util.Matrix; import org.apache.pdfbox.util.PDFOperator; import org.apache.pdfbox.util.PDFTextStripper; @@ -534,4 +535,34 @@ public class PDFPage extends PDFTextStripper { return min; } + public void processAnnotation(PDAnnotation anno) { + float current_y = anno.getRectangle().getLowerLeftY(); + + int pageRotation = this.getCurrentPage().findRotation(); + // logger_.debug("PageRotation = " + pageRotation); + if (pageRotation == 0) { + float page_height = this.getCurrentPage().findMediaBox().getHeight(); + current_y = page_height - anno.getRectangle().getLowerLeftY(); + } + if (pageRotation == 90) { + current_y = anno.getRectangle().getLowerLeftX(); + } + if (pageRotation == 180) { + current_y = anno.getRectangle().getUpperRightY(); + } + if (pageRotation == 270) { + float page_height = this.getCurrentPage().findMediaBox().getHeight(); + current_y = page_height - anno.getRectangle().getUpperRightX(); + } + + if (current_y > this.effectivePageHeight) { + return; + } + + // store ypos of the char if it is not empty + if (current_y > this.max_character_ypos) { + this.max_character_ypos = current_y; + } + } + } diff --git a/pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFUtilities.java b/pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFUtilities.java index c68f6229..3f5e67fc 100644 --- a/pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFUtilities.java +++ b/pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFUtilities.java @@ -49,47 +49,59 @@ package at.knowcenter.wag.egov.egiz.pdf; import java.io.IOException; +import java.util.Iterator; import java.util.List; import org.apache.pdfbox.cos.COSStream; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDResources; +import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; import at.gv.egiz.pdfas.common.exceptions.PDFIOException; - /** * Contains useful helpers for accessing PDF documents. * * @author wprinz * @author mruhmer */ -public abstract class PDFUtilities -{ - public static float calculatePageLength(PDDocument document, int page, float effectivePageHeight, /*int pagerotation,*/ boolean legacy32) throws PDFIOException { - //int last_page_id = document.getNumberOfPages(); - List<?> allPages = document.getDocumentCatalog().getAllPages(); - PDPage pdpage = (PDPage) allPages.get(page); - //pdpage.setRotation(pagerotation); - return calculatePageLength(pdpage, effectivePageHeight, legacy32); +public abstract class PDFUtilities { + public static float calculatePageLength(PDDocument document, int page, + float effectivePageHeight, /* int pagerotation, */boolean legacy32) + throws PDFIOException { + // int last_page_id = document.getNumberOfPages(); + List<?> allPages = document.getDocumentCatalog().getAllPages(); + PDPage pdpage = (PDPage) allPages.get(page); + // pdpage.setRotation(pagerotation); + return calculatePageLength(pdpage, effectivePageHeight, legacy32); } - public static float calculatePageLength(PDPage page, float effectivePageHeight, boolean legacy32) throws PDFIOException - { - try{ - PDFPage my_page = new PDFPage(effectivePageHeight, legacy32); - PDResources resources = page.findResources(); - COSStream stream = page.getContents().getStream(); - //List<PDThreadBead> articles = page.getThreadBeads(); - //my_page.processMyPage(page); - my_page.processStream(page, resources, stream); - return my_page.getMaxPageLength(); - } - catch (IOException e) - { - throw new PDFIOException("error.pdf.stamp.11", e); - } - } + public static float calculatePageLength(PDPage page, + float effectivePageHeight, boolean legacy32) throws PDFIOException { + try { + PDFPage my_page = new PDFPage(effectivePageHeight, legacy32); + PDResources resources = page.findResources(); + COSStream stream = page.getContents().getStream(); + // List<PDThreadBead> articles = page.getThreadBeads(); + // my_page.processMyPage(page); + my_page.processStream(page, resources, stream); + + if (!legacy32) { + Iterator<PDAnnotation> annotationsIt = page.getAnnotations() + .iterator(); + + while (annotationsIt.hasNext()) { + PDAnnotation annotation = annotationsIt.next(); + if(!annotation.isInvisible()) { + my_page.processAnnotation(annotation); + } + } + } + return my_page.getMaxPageLength(); + } catch (IOException e) { + throw new PDFIOException("error.pdf.stamp.11", e); + } + } } diff --git a/pdf-as-lib/src/main/resources/config/config.zip b/pdf-as-lib/src/main/resources/config/config.zip Binary files differindex f277bd76..b47b3495 100644 --- a/pdf-as-lib/src/main/resources/config/config.zip +++ b/pdf-as-lib/src/main/resources/config/config.zip |