aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Fitzek <andreas.fitzek@iaik.tugraz.at>2014-04-03 15:38:01 +0200
committerAndreas Fitzek <andreas.fitzek@iaik.tugraz.at>2014-04-03 15:47:56 +0200
commitf891dca529c9dc199114ae4f0857d28812315b11 (patch)
tree66de8c3db33fd05ff8511c9d8252aaef72a6b516
parent473f376290dbcaa435f234a9ba48d9bc54946923 (diff)
downloadpdf-as-4-f891dca529c9dc199114ae4f0857d28812315b11.tar.gz
pdf-as-4-f891dca529c9dc199114ae4f0857d28812315b11.tar.bz2
pdf-as-4-f891dca529c9dc199114ae4f0857d28812315b11.zip
Fixed Positioning to recognize Annotations
-rw-r--r--pdf-as-lib/src/configuration/cfg/profiles/SIGNATURBLOCK_SMALL_EN.properties1
-rw-r--r--pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PADESPDFBOXSigner.java19
-rw-r--r--pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/PDFAsVisualSignatureBuilder.java9
-rw-r--r--pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/stamping/pdfbox/tagging/PDFBoxTaggingUtils.java35
-rw-r--r--pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFPage.java31
-rw-r--r--pdf-as-lib/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFUtilities.java62
-rw-r--r--pdf-as-lib/src/main/resources/config/config.zipbin1039807 -> 1039914 bytes
-rw-r--r--pdf-as-web/build.gradle1
8 files changed, 127 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
index f277bd76..b47b3495 100644
--- a/pdf-as-lib/src/main/resources/config/config.zip
+++ b/pdf-as-lib/src/main/resources/config/config.zip
Binary files differ
diff --git a/pdf-as-web/build.gradle b/pdf-as-web/build.gradle
index bd2f098e..42925721 100644
--- a/pdf-as-web/build.gradle
+++ b/pdf-as-web/build.gradle
@@ -26,6 +26,7 @@ dependencies {
compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.5'
compile group: 'opensymphony', name: 'sitemesh', version: '2.4.2'
+ providedCompile "javax.servlet:servlet-api:2.5"
testCompile group: 'junit', name: 'junit', version: '4.+'
}