aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Lenz <thomas.lenz@egiz.gv.at>2026-01-13 13:16:58 +0100
committerThomas Lenz <thomas.lenz@egiz.gv.at>2026-01-13 13:34:10 +0100
commit07ae5c9208ce15ef5286b39b0ff016e143e17a97 (patch)
tree473c072d0db36fe6742d6a5cf0b6bafacd93a643
parent6fb0555f4af1c0cd18713562e2e8609da82c3b72 (diff)
downloadpdf-as-4-07ae5c9208ce15ef5286b39b0ff016e143e17a97.tar.gz
pdf-as-4-07ae5c9208ce15ef5286b39b0ff016e143e17a97.tar.bz2
pdf-as-4-07ae5c9208ce15ef5286b39b0ff016e143e17a97.zip
chore(placeholder): store placeholderId in a different location within the signature dictionary
Reason: the previously used `location` element refers to a physical location
-rw-r--r--pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/placeholder/SignaturePlaceholderExtractor.java72
-rw-r--r--pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java7
2 files changed, 65 insertions, 14 deletions
diff --git a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/placeholder/SignaturePlaceholderExtractor.java b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/placeholder/SignaturePlaceholderExtractor.java
index 7cff90d6..011eac89 100644
--- a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/placeholder/SignaturePlaceholderExtractor.java
+++ b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/placeholder/SignaturePlaceholderExtractor.java
@@ -55,6 +55,7 @@ import java.util.Collections;
import java.util.Hashtable;
import java.util.List;
import java.util.Map.Entry;
+import java.util.Objects;
import java.util.Properties;
import java.util.Set;
import java.util.Vector;
@@ -69,6 +70,8 @@ import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.graphics.PDXObject;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
+import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDPropBuild;
+import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDPropBuildDataDict;
import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature;
import org.apache.pdfbox.util.Matrix;
@@ -101,6 +104,8 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j
public class SignaturePlaceholderExtractor extends PDFStreamEngine implements PlaceholderExtractorConstants {
+ public static final String PREFIX = "PDF-AS_";
+
private final List<SignaturePlaceholderData> placeholders = new ArrayList<>();
private int currentPage = 0;
@@ -235,11 +240,11 @@ public class SignaturePlaceholderExtractor extends PDFStreamEngine implements Pl
final String posString = "p:" + currentPage + ";x:" + Math.floor(x)
+ ";y:" + Math.ceil(y) + ";w:" + Math.ceil(w);
-
- log.debug("Found Placeholder at: {}", posString);
+
try {
data.setTablePos(new TablePos(posString));
data.setPlaceholderName(objectName.getName());
+ log.debug("Found Placeholder at: {}", data.toString());
placeholders.add(data);
} catch (final PdfAsException e) {
@@ -256,6 +261,38 @@ public class SignaturePlaceholderExtractor extends PDFStreamEngine implements Pl
}
}
+ /**
+ * Read placeholderId from signature.
+ *
+ * @param signature Signature
+ * @return placeholderId or <code>null</code> if there is no placeholderId.
+ */
+ private static String readPlaceHolderId(PDSignature signature) {
+ PDPropBuild sigProps = getOrNew(signature);
+ PDPropBuildDataDict appProps = getOrNew(sigProps);
+ return appProps.getName() != null && appProps.getName().startsWith(PREFIX)
+ ? appProps.getName().substring(PREFIX.length())
+ : appProps.getName();
+
+ }
+
+ /**
+ * Set a placeholderId into signature directory.
+ *
+ * @param signature Signature
+ * @param placeholderId placeholderId
+ */
+ public static void setPlaceholderId(PDSignature signature, String placeholderId) {
+ PDPropBuild sigProps = getOrNew(signature);
+ PDPropBuildDataDict appProps = getOrNew(sigProps);
+ appProps.setName(PREFIX + placeholderId);
+ sigProps.setPDPropBuildApp(appProps);
+ signature.setPropBuild(sigProps);
+
+ }
+
+
+
private SignaturePlaceholderData matchPlaceholderPage(
List<SignaturePlaceholderData> placeholders, String placeholderId, int matchMode) {
log.debug("Searching requested placeholder:{} with matchMode:{} in single page ... ", placeholderId, matchMode);
@@ -382,19 +419,32 @@ public class SignaturePlaceholderExtractor extends PDFStreamEngine implements Pl
}
}
+
+
+ private static final PDPropBuildDataDict getOrNew(PDPropBuild sigProps) {
+ PDPropBuildDataDict props = sigProps.getApp();
+ return props != null ? props : new PDPropBuildDataDict();
+ }
+
+ private static final PDPropBuild getOrNew(PDSignature signature) {
+ PDPropBuild sigProps = signature.getPropBuild();
+ return sigProps != null ? sigProps : new PDPropBuild();
+
+ }
+
private List<String> existingExistingSignatureNames(PDDocument doc) {
- final List<String> existingLocations = new ArrayList<>();
try {
- final List<PDSignature> pdSignatureList = doc.getSignatureDictionaries();
- if (pdSignatureList.size() != 0) {
- for (final PDSignature sig : pdSignatureList) {
- existingLocations.add(sig.getLocation());
- }
- }
+ final List<PDSignature> pdSignatureList = doc.getSignatureDictionaries();
+ return pdSignatureList.stream()
+ .map(el -> readPlaceHolderId(el))
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+
} catch (final IOException e) {
- e.printStackTrace();
+ log.warn("Can not parse signature dictionaries", e);
+ return Collections.emptyList();
+
}
- return existingLocations;
}
private List<SignaturePlaceholderData> removeAlreadyUsePlaceholders(
diff --git a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java
index abbe7c8e..d8a25a9a 100644
--- a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java
+++ b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox2/PADESPDFBOXSigner.java
@@ -85,6 +85,7 @@ import at.gv.egiz.pdfas.lib.impl.ErrorExtractor;
import at.gv.egiz.pdfas.lib.impl.SignaturePositionImpl;
import at.gv.egiz.pdfas.lib.impl.configuration.SignatureProfileConfiguration;
import at.gv.egiz.pdfas.lib.impl.pdfbox2.PDFBOXObject;
+import at.gv.egiz.pdfas.lib.impl.pdfbox2.placeholder.SignaturePlaceholderExtractor;
import at.gv.egiz.pdfas.lib.impl.pdfbox2.positioning.Positioning;
import at.gv.egiz.pdfas.lib.impl.pdfbox2.utils.PdfBoxUtils;
import at.gv.egiz.pdfas.lib.impl.placeholder.PlaceholderFilter;
@@ -163,9 +164,9 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants {
pdfObject.getStatus().getSignParamter().getPlaceHolderId());
if (nextPlaceholderData != null) {
- log.info("Placeholder data found.");
- signature.setLocation(nextPlaceholderData.getPlaceholderName());
-
+ log.info("Placeholder data found. Injection placeholderId ...");
+ SignaturePlaceholderExtractor.setPlaceholderId(signature, nextPlaceholderData.getPlaceholderName());
+
if (nextPlaceholderData.getProfile() != null) {
if (pdfObject.getStatus().getSettings().isValue(IConfigurationConstants.PLACEHOLDER_PROFILE_OVERWRITE, true)) {
log.debug("Placeholder Profile set to: {}", nextPlaceholderData.getProfile());