From cc3e985f2ed5c78b04f494feb2abdb534479a06e Mon Sep 17 00:00:00 2001
From: emusic <emina.music@egiz.gv.at>
Date: Fri, 17 Jan 2020 14:39:04 +0100
Subject: changes in qr placeholder search - additional information removed,
 location of dictionary used for storing qr info

---
 .../lib/impl/placeholder/PlaceholderExtractor.java |   3 +-
 .../lib/impl/placeholder/PlaceholderFilter.java    |  64 ++++++------
 .../impl/placeholder/SignaturePlaceholderData.java |   3 +-
 pdf-as-lib/src/main/resources/config/config.zip    | Bin 1276507 -> 1276742 bytes
 .../placeholder/PDFBoxPlaceholderExtractor.java    |   6 +-
 .../placeholder/SignaturePlaceholderExtractor.java |  43 +++-----
 .../lib/impl/pdfbox2/positioning/Positioning.java  |   4 +-
 .../impl/signing/pdfbox2/PADESPDFBOXSigner.java    | 113 ++++++++++++---------
 .../placeholder/PDFBoxPlaceholderExtractor.java    |   3 -
 .../lib/impl/signing/pdfbox/PADESPDFBOXSigner.java |   2 +-
 10 files changed, 116 insertions(+), 125 deletions(-)

diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/placeholder/PlaceholderExtractor.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/placeholder/PlaceholderExtractor.java
index 62a26a16..4c352b90 100644
--- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/placeholder/PlaceholderExtractor.java
+++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/placeholder/PlaceholderExtractor.java
@@ -4,6 +4,5 @@ import at.gv.egiz.pdfas.common.exceptions.PdfAsException;
 import at.gv.egiz.pdfas.lib.impl.status.PDFObject;
 
 public interface PlaceholderExtractor {
-	public SignaturePlaceholderData extract(PDFObject doc,
-			String placeholderId, int matchMode) throws PdfAsException;
+	SignaturePlaceholderData extract(PDFObject doc, String placeholderId, int matchMode) throws PdfAsException;
 }
diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/placeholder/PlaceholderFilter.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/placeholder/PlaceholderFilter.java
index 51cd3ff2..5919ee5d 100644
--- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/placeholder/PlaceholderFilter.java
+++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/placeholder/PlaceholderFilter.java
@@ -36,18 +36,22 @@ import at.gv.egiz.pdfas.lib.impl.status.OperationStatus;
 public class PlaceholderFilter implements IConfigurationConstants,
 		PlaceholderExtractorConstants {
 
-	public static SignaturePlaceholderData checkPlaceholderSignature(
-			OperationStatus status, ISettings settings) throws PdfAsException,
+	public static SignaturePlaceholderData checkPlaceholderSignatureLocation(
+			OperationStatus status, ISettings settings, String signatureLocation) throws PdfAsException,
 			IOException {
 
+		String placeholderID;
+
 		if (status.getPlaceholderConfiguration().isGlobalPlaceholderEnabled()) {
-			PlaceholderExtractor extractor = status.getBackend()
-					.getPlaceholderExtractor();
+			PlaceholderExtractor extractor = status.getBackend().getPlaceholderExtractor();
 
-			String placeholderID = PlaceholderWebConfiguration.getValue(PLACEHOLDER_WEB_ID);
-			if(placeholderID == null)
-			{
-				 placeholderID = settings.getValue(PLACEHOLDER_ID);
+			if(signatureLocation!=null) {
+				placeholderID = signatureLocation;
+			} else {
+				placeholderID = PlaceholderWebConfiguration.getValue(PLACEHOLDER_WEB_ID);
+				if(placeholderID == null) {
+					placeholderID = settings.getValue(PLACEHOLDER_ID);
+				}
 			}
 
 			String placeholderModeString = settings.getValue(PLACEHOLDER_MODE);
@@ -55,7 +59,6 @@ public class PlaceholderFilter implements IConfigurationConstants,
 			if (placeholderModeString != null) {
 				try {
 					placeholderMode = Integer.parseInt(placeholderModeString);
-
 					if (placeholderMode < PLACEHOLDER_MODE_MIN
 							|| placeholderMode > PLACEHOLDER_MODE_MAX) {
 						throw new PdfAsErrorCarrier(new PDFASError(
@@ -66,39 +69,36 @@ public class PlaceholderFilter implements IConfigurationConstants,
 							PDFASError.ERROR_INVALID_PLACEHOLDER_MODE, e));
 				}
 			}
-			SignaturePlaceholderData signaturePlaceholderData = extractor
-					.extract(status.getPdfObject(), placeholderID, placeholderMode);
-
+			SignaturePlaceholderData signaturePlaceholderData = extractor.extract(status.getPdfObject(), placeholderID, placeholderMode);
 			return signaturePlaceholderData;
+
 		} else if (status.getPlaceholderConfiguration().isProfileConfigurationEnabled(status.getRequestedSignature().getSignatureProfileID())) {
 			//filter for local placeholder in selected profiles
-			PlaceholderExtractor extractor = status.getBackend()
-						.getPlaceholderExtractor();
+			PlaceholderExtractor extractor = status.getBackend().getPlaceholderExtractor();
 			int placeholderMode = PLACEHOLDER_MATCH_MODE_SORTED;
 
-			String placeholderID =status.getPlaceholderConfiguration().getProfilePlaceholderID(status.getRequestedSignature().getSignatureProfileID());
-			if(placeholderID != null)
-			{
+			placeholderID = status.getPlaceholderConfiguration().getProfilePlaceholderID(status.getRequestedSignature().getSignatureProfileID());
+			if(placeholderID != null) {
 				placeholderMode = PLACEHOLDER_MATCH_MODE_MODERATE;
 			}
 			String placeholderModeString = settings.getValue(PLACEHOLDER_MODE);
-				if (placeholderModeString != null) {
-					try {
-						placeholderMode = Integer.parseInt(placeholderModeString);
-						if (placeholderMode < PLACEHOLDER_MODE_MIN
-								|| placeholderMode > PLACEHOLDER_MODE_MAX) {
-							throw new PdfAsErrorCarrier(new PDFASError(
-									PDFASError.ERROR_INVALID_PLACEHOLDER_MODE));
-						}
-					} catch (NumberFormatException e) {
+			if (placeholderModeString != null) {
+				try {
+					placeholderMode = Integer.parseInt(placeholderModeString);
+					if (placeholderMode < PLACEHOLDER_MODE_MIN
+							|| placeholderMode > PLACEHOLDER_MODE_MAX) {
 						throw new PdfAsErrorCarrier(new PDFASError(
-								PDFASError.ERROR_INVALID_PLACEHOLDER_MODE, e));
+								PDFASError.ERROR_INVALID_PLACEHOLDER_MODE));
 					}
+				} catch (NumberFormatException e) {
+					throw new PdfAsErrorCarrier(new PDFASError(
+							PDFASError.ERROR_INVALID_PLACEHOLDER_MODE, e));
 				}
-				SignaturePlaceholderData signaturePlaceholderData = extractor
-						.extract(status.getPdfObject(), placeholderID, placeholderMode);
-
-				return signaturePlaceholderData;
 			}
+			SignaturePlaceholderData signaturePlaceholderData = extractor.extract(status.getPdfObject(), placeholderID, placeholderMode);
+			return signaturePlaceholderData;
+		}
 		return null;
-	}}
\ No newline at end of file
+	}
+
+}
\ No newline at end of file
diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/placeholder/SignaturePlaceholderData.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/placeholder/SignaturePlaceholderData.java
index 3dbedee5..cf0ad149 100644
--- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/placeholder/SignaturePlaceholderData.java
+++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/placeholder/SignaturePlaceholderData.java
@@ -54,8 +54,7 @@ import at.knowcenter.wag.egov.egiz.pdf.TablePos;
  * @author exthex
  *
  */
-public class
-SignaturePlaceholderData {
+public class SignaturePlaceholderData {
 
    public static final String ID_KEY = "id";
 
diff --git a/pdf-as-lib/src/main/resources/config/config.zip b/pdf-as-lib/src/main/resources/config/config.zip
index 3be3dd92..387e3e41 100644
Binary files a/pdf-as-lib/src/main/resources/config/config.zip and b/pdf-as-lib/src/main/resources/config/config.zip differ
diff --git a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/placeholder/PDFBoxPlaceholderExtractor.java b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/placeholder/PDFBoxPlaceholderExtractor.java
index 730a6581..256400a0 100644
--- a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/placeholder/PDFBoxPlaceholderExtractor.java
+++ b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/placeholder/PDFBoxPlaceholderExtractor.java
@@ -9,16 +9,12 @@ import at.gv.egiz.pdfas.lib.impl.status.PDFObject;
 public class PDFBoxPlaceholderExtractor implements PlaceholderExtractor {
 
 	@Override
-	public SignaturePlaceholderData extract(PDFObject doc,
-			String placeholderId, int matchMode) throws PdfAsException {
-
+	public SignaturePlaceholderData extract(PDFObject doc, String placeholderId, int matchMode) throws PdfAsException {
 		if (doc instanceof PDFBOXObject) {
 			PDFBOXObject object = (PDFBOXObject) doc;
 			return SignaturePlaceholderExtractor.extract(object.getDocument(),
 					placeholderId, matchMode);
 		}
-
 		throw new PdfAsException("INVALID STATE");
 	}
-
 }
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 31bbb76f..f69b1788 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
@@ -50,14 +50,8 @@ import java.awt.geom.AffineTransform;
 import java.awt.geom.NoninvertibleTransformException;
 import java.awt.image.BufferedImage;
 import java.io.IOException;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.Map.Entry;
-import java.util.Properties;
-import java.util.Set;
-import java.util.Vector;
 
 import javassist.bytecode.stackmap.TypeData.ClassName;
 
@@ -109,7 +103,7 @@ public class SignaturePlaceholderExtractor extends PDFStreamEngine implements Pl
 	private static Logger logger = LoggerFactory
 			.getLogger(SignaturePlaceholderExtractor.class);
 
-	private List<SignaturePlaceholderData> placeholders = new Vector<SignaturePlaceholderData>();
+	private static List<SignaturePlaceholderData> placeholders = new Vector<>();
 	private int currentPage = 0;
 	private PDDocument doc;
 	
@@ -131,10 +125,12 @@ public class SignaturePlaceholderExtractor extends PDFStreamEngine implements Pl
             
             addOperator( processor );
 		}
-		
 		this.doc = doc;
 	}
 
+	public static List<SignaturePlaceholderData> listPlaceholders() {
+		return placeholders;
+	}
 	/**
 	 * Search the document for placeholder images and possibly included
 	 * additional info.<br/>
@@ -310,8 +306,8 @@ public class SignaturePlaceholderExtractor extends PDFStreamEngine implements Pl
 						float yPos = unrotatedCTM.getYPosition();
 						float yScale = unrotatedCTM.getScaleY();
 						float y = yPos + yScale;
-						float w = unrotatedCTM.getScaleX();;
-						
+						float w = unrotatedCTM.getScaleX();
+
 						logger.debug("Page height: {}", page.getCropBox().getHeight());
 						logger.debug("Page width: {}", page.getCropBox().getWidth());
 						
@@ -349,39 +345,31 @@ public class SignaturePlaceholderExtractor extends PDFStreamEngine implements Pl
 	
 	//TODO: pdfbox2 - was override
 	public Map<String, PDFont> getFonts() {
-		if (fonts == null)
-        {
+		if (fonts == null) {
             // at least an empty map will be returned
             // TODO we should return null instead of an empty map
             fonts = new HashMap<String, PDFont>();
             if(this.getResources() != null && this.getResources().getCOSObject() != null) {
             COSDictionary fontsDictionary = (COSDictionary) this.getResources().getCOSObject().getDictionaryObject(COSName.FONT);
-            if (fontsDictionary == null)
-            {
+            if (fontsDictionary == null) {
             	// ignore we do not want to set anything, never when creating a signature!!!!!
                 //fontsDictionary = new COSDictionary();
                 //this.getResources().getCOSDictionary().setItem(COSName.FONT, fontsDictionary);
             }
-            else
-            {
-                for (COSName fontName : fontsDictionary.keySet())
-                {
+            else {
+                for (COSName fontName : fontsDictionary.keySet()) {
                     COSBase font = fontsDictionary.getDictionaryObject(fontName);
                     // data-000174.pdf contains a font that is a COSArray, looks to be an error in the
                     // PDF, we will just ignore entries that are not dictionaries.
-                    if (font instanceof COSDictionary)
-                    {
+                    if (font instanceof COSDictionary) {
                         PDFont newFont = null;
-                        try
-                        {
+                        try {
                             newFont = PDFontFactory.createFont((COSDictionary) font);
                         }
-                        catch (IOException exception)
-                        {
+                        catch (IOException exception) {
                             logger.error("error while creating a font", exception);
                         }
-                        if (newFont != null)
-                        {
+                        if (newFont != null) {
                             fonts.put(fontName.getName(), newFont);
                         }
                     }
@@ -488,5 +476,4 @@ public class SignaturePlaceholderExtractor extends PDFStreamEngine implements Pl
 		}
 		return null;
 	}
-
 }
diff --git a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/positioning/Positioning.java b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/positioning/Positioning.java
index 7942edcd..8aaa51ac 100644
--- a/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/positioning/Positioning.java
+++ b/pdf-as-pdfbox-2/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox2/positioning/Positioning.java
@@ -196,8 +196,7 @@ public class Positioning {
                 }
 		}
 
-		if(make_new_page && counter!=0)
-		{
+		if(make_new_page && counter!=0) {
 			make_new_page = false;
 		}
 
@@ -327,7 +326,6 @@ public class Positioning {
 		// we do have text take SIGNATURE_MARGIN
 		pos_y = page_height - page_length - SIGNATURE_MARGIN_VERTICAL;
 		if (pos_y - footer_line <= table_height) {
-			///TODO: new page should not be created when signature exists
 			if(counter!=0)
 				make_new_page = false;
 			else{
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 c99bb608..aa61d623 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
@@ -35,7 +35,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.SignatureFieldsExtractor;
+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;
@@ -69,8 +69,6 @@ import org.apache.pdfbox.pdmodel.common.PDRectangle;
 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.image.JPEGFactory;
-import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
 import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature;
 import org.apache.pdfbox.pdmodel.interactive.digitalsignature.SignatureOptions;
 import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
@@ -93,7 +91,6 @@ import javax.activation.DataSource;
 import java.awt.*;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayOutputStream;
-import java.io.Closeable;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -109,6 +106,7 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants {
 			PDFASSignatureInterface genericSigner) throws PdfAsException {
 
 		PDFAsVisualSignatureProperties properties = null;
+		String placeholder_id = "";
 
 		if (!(genericPdfObject instanceof PDFBOXObject)) {
 			// tODO:
@@ -134,13 +132,37 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants {
 			doc = pdfObject.getDocument();
 			//if signature already exists dont create new page
 			List<PDSignatureField> pdSignatureFieldList = doc.getSignatureFields();
+			PDSignature signature;
+
+			// sign a PDF with an existing empty signature, as created by the CreateEmptySignatureForm example.
+			String sigFieldName = pdfObject.getStatus().getSettings().getValue(SIGNATURE_FIELD_NAME);
+			signature = findExistingSignature(doc, sigFieldName);
+			if (signature == null) {
+				// create signature dictionary
+				signature = new PDSignature();
+			}
+			else {
+				isAdobeSigForm = true;
+			}
+
+			signature.setFilter(COSName.getPDFName(signer.getPDFFilter()));
+			signature.setSubFilter(COSName.getPDFName(signer.getPDFSubFilter()));
 
+			SignaturePlaceholderData signaturePlaceholderDataInit = PlaceholderFilter.checkPlaceholderSignatureLocation(pdfObject.getStatus(), pdfObject.getStatus().getSettings(), placeholder_id);
 
+			//gives a list of all placeholders
+			List<SignaturePlaceholderData> placeholders = SignaturePlaceholderExtractor.listPlaceholders();
+            if(checkAvailablePlaceholders(placeholders,existingSignatureLocations(doc))!=null)
+			{
+				placeholder_id = (checkAvailablePlaceholders(placeholders, existingSignatureLocations(doc))).getId();
+			};
 			SignaturePlaceholderData signaturePlaceholderData = PlaceholderFilter
-					.checkPlaceholderSignature(pdfObject.getStatus(), pdfObject.getStatus().getSettings());
+					.checkPlaceholderSignatureLocation(pdfObject.getStatus(), pdfObject.getStatus().getSettings(),placeholder_id);
 
 			TablePos tablePos = null;
 
+			signature.setLocation(signaturePlaceholderData.getPlaceholderName());
+
 			if (signaturePlaceholderData != null) {
 				// Placeholder found!
 				logger.info("Placeholder data found.");
@@ -166,32 +188,8 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants {
 					logger.debug("Placeholder Position set to: " + tablePos.toString());
 				}
 			}
-
-			//PDSignature signature = new PDSignature();
-
-			PDSignature signature;
-
-			// sign a PDF with an existing empty signature, as created by the CreateEmptySignatureForm example.
-			String sigFieldName = pdfObject.getStatus().getSettings().getValue(SIGNATURE_FIELD_NAME);
-			signature = findExistingSignature(doc, sigFieldName);
-			//signature = findExistingSignature(doc, "ownerSignature");
-			if (signature == null) {
-				// create signature dictionary
-				signature = new PDSignature();
-
-			}
-			else {
-				isAdobeSigForm = true;
-			}
-
-			signature.setFilter(COSName.getPDFName(signer.getPDFFilter())); // default
-			// filter
-			signature.setSubFilter(COSName.getPDFName(signer.getPDFSubFilter()));
-
 			SignatureProfileSettings signatureProfileSettings = TableFactory
 					.createProfile(requestedSignature.getSignatureProfileID(), pdfObject.getStatus().getSettings());
-
-
             //Check if input document is PDF-A conform
             if (signatureProfileSettings.isPDFA()) {
                 DataSource origDoc = pdfObject.getOriginalDocument();
@@ -200,7 +198,6 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants {
                 //runPDFAPreflight(origDoc);
             }
 
-
 			ValueResolver resolver = new ValueResolver(requestedSignature, pdfObject.getStatus());
 			String signerName = resolver.resolve("SIG_SUBJECT", signatureProfileSettings.getValue("SIG_SUBJECT"),
 					signatureProfileSettings);
@@ -351,7 +348,7 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants {
 				 * (properties .getVisibleSignature())); sigbos.close();
 				 */
 
-				if (signaturePlaceholderData != null) {
+				/*if (signaturePlaceholderData != null) {
 
 					InputStream fis = PADESPDFBOXSigner.class.getResourceAsStream("/placeholder/empty.jpg");
 					PDImageXObject img = JPEGFactory.createFromStream(doc, fis);
@@ -367,12 +364,13 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants {
 					logger.info("Placeholder name: " + signaturePlaceholderData.getPlaceholderName());
 					COSDictionary xobjectsDictionary = (COSDictionary) page.getResources().getCOSObject()
 							.getDictionaryObject(COSName.XOBJECT);
+
+
 					xobjectsDictionary.setItem(signaturePlaceholderData.getPlaceholderName(), img);
 					xobjectsDictionary.setNeedToBeUpdated(true);
 					page.getResources().getCOSObject().setNeedToBeUpdated(true);
 					logger.info("Placeholder name: " + signaturePlaceholderData.getPlaceholderName());
-
-				}
+				}*/
 
 				if (signatureProfileSettings.isPDFA() || signatureProfileSettings.isPDFA3()) {
                     PDDocumentCatalog root = doc.getDocumentCatalog();
@@ -597,13 +595,11 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants {
 							signatureField.setAlternateFieldName(sigFieldName);
 					}
 
-
 					ntn.getCOSObject().setNeedToBeUpdated(true);
 					sigBlock.getCOSObject().setNeedToBeUpdated(true);
 					structureTreeRoot.getCOSObject().setNeedToBeUpdated(true);
 					objectDic.setNeedToBeUpdated(true);
 					docElement.getCOSObject().setNeedToBeUpdated(true);
-
 				}
 			} catch (Throwable e) {
 				if (signatureProfileSettings.isPDFUA() == true) {
@@ -652,9 +648,7 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants {
                     // Ignore
                 }
             }
-
 			logger.debug("Signature done!");
-
 		}
 	}
 
@@ -722,8 +716,7 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants {
     }
 
     @Override
-    public PDFASSignatureExtractor buildBlindSignaturInterface(X509Certificate certificate, String filter,
-                                                               String subfilter, Calendar date) {
+    public PDFASSignatureExtractor buildBlindSignaturInterface(X509Certificate certificate, String filter, String subfilter, Calendar date) {
         return new SignatureDataExtractor(certificate, filter, subfilter, date);
     }
 
@@ -867,29 +860,51 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants {
     }
 
 	// Find an existing signature.
-	private PDSignature findExistingSignature(PDDocument doc, String sigFieldName)
-	{
+	private PDSignature findExistingSignature(PDDocument doc, String sigFieldName) {
 		PDSignature signature = null;
 		PDSignatureField signatureField;
 		PDAcroForm acroForm = doc.getDocumentCatalog().getAcroForm();
-		if (acroForm != null)
-		{
+		if (acroForm != null) {
 			signatureField = (PDSignatureField) acroForm.getField(sigFieldName);
-			if (signatureField != null)
-			{
+			if (signatureField != null) {
 				// retrieve signature dictionary
 				signature = signatureField.getSignature();
-				if (signature == null)
-				{
+				if (signature == null) {
 					signature = new PDSignature();
 					signatureField.getCOSObject().setItem(COSName.V, signature);
 				}
-				else
-				{
+				else {
 					throw new IllegalStateException("The signature field " + sigFieldName + " is already signed.");
 				}
 			}
 		}
 		return signature;
 	}
+
+	private List<String> existingSignatureLocations(PDDocument doc) {
+		List<String> existingLocations = new ArrayList<>();
+		try {
+			List <PDSignature> pdSignatureList =  doc.getSignatureDictionaries();
+			if(pdSignatureList.size() != 0) {
+				for(PDSignature sig : pdSignatureList) {
+					existingLocations.add(sig.getLocation());
+				}
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return existingLocations;
+	}
+
+	//find first available placeholder
+	public SignaturePlaceholderData checkAvailablePlaceholders(List<SignaturePlaceholderData> placeholders, List<String> existingPlaceholders) {
+		SignaturePlaceholderData result = null;
+		for(int i = 0; i < placeholders.size(); ++i) {
+            if(!existingPlaceholders.contains(placeholders.get(i).getPlaceholderName())) {
+				result = placeholders.get(i);
+				break;
+			}
+		}
+		return result;
+	}
 }
\ No newline at end of file
diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/placeholder/PDFBoxPlaceholderExtractor.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/placeholder/PDFBoxPlaceholderExtractor.java
index 18099b23..0e4227ec 100644
--- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/placeholder/PDFBoxPlaceholderExtractor.java
+++ b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/pdfbox/placeholder/PDFBoxPlaceholderExtractor.java
@@ -11,14 +11,11 @@ public class PDFBoxPlaceholderExtractor implements PlaceholderExtractor {
 	@Override
 	public SignaturePlaceholderData extract(PDFObject doc,
 			String placeholderId, int matchMode) throws PdfAsException {
-
 		if (doc instanceof PDFBOXObject) {
 			PDFBOXObject object = (PDFBOXObject) doc;
 			return SignaturePlaceholderExtractor.extract(object.getDocument(),
 					placeholderId, matchMode);
 		}
-
 		throw new PdfAsException("INVALID STATE");
 	}
-
 }
diff --git a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PADESPDFBOXSigner.java b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PADESPDFBOXSigner.java
index 751c1291..53eb9f80 100644
--- a/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PADESPDFBOXSigner.java
+++ b/pdf-as-pdfbox/src/main/java/at/gv/egiz/pdfas/lib/impl/signing/pdfbox/PADESPDFBOXSigner.java
@@ -148,7 +148,7 @@ public class PADESPDFBOXSigner implements IPdfSigner, IConfigurationConstants {
 				doc = pdfObject.getDocument();
 
 				SignaturePlaceholderData signaturePlaceholderData = PlaceholderFilter
-						.checkPlaceholderSignature(pdfObject.getStatus(), pdfObject.getStatus().getSettings());
+						.checkPlaceholderSignatureLocation(pdfObject.getStatus(), pdfObject.getStatus().getSettings(), null);
 
 				TablePos tablePos = null;
 
-- 
cgit v1.2.3