diff options
Diffstat (limited to 'pdf-as-lib')
6 files changed, 229 insertions, 100 deletions
| diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/SignaturePosition.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/SignaturePosition.java new file mode 100644 index 00000000..477d798f --- /dev/null +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/SignaturePosition.java @@ -0,0 +1,38 @@ +package at.gv.egiz.pdfas.lib.api; + +public interface SignaturePosition { +	  /** +	   * Returns the page on which the signature was placed. +	   *  +	   * @return Returns the page on which the signature was placed. +	   */ +	  public int getPage(); + +	  /** +	   * Returns the x position. +	   *  +	   * @return Returns the x position. +	   */ +	  public float getX(); + +	  /** +	   * Returns the y position. +	   *  +	   * @return Returns the y position. +	   */ +	  public float getY(); + +	  /** +	   * Returns the width of the signature. +	   *  +	   * @return Returns the width of the signature. +	   */ +	  public float getWidth(); + +	  /** +	   * Returns the height of the signature. +	   *  +	   * @return Returns the height of the signature. +	   */ +	  public float getHeight(); +} diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/sign/SignResult.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/sign/SignResult.java index 03e48d73..d994c3e1 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/sign/SignResult.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/api/sign/SignResult.java @@ -3,6 +3,7 @@ package at.gv.egiz.pdfas.lib.api.sign;  import java.security.cert.X509Certificate;  import at.gv.egiz.pdfas.lib.api.DataSink; +import at.gv.egiz.pdfas.lib.api.SignaturePosition;  public interface SignResult {  	/** @@ -34,5 +35,5 @@ public interface SignResult {  	 * @return Returns the position where the signature is finally placed. May  	 *         return null if no position information is available.  	 */ -	//public SignaturePosition getSignaturePosition(); +	public SignaturePosition getSignaturePosition();  } diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java index c83d3bf7..6f74303c 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/PdfAsImpl.java @@ -1,17 +1,10 @@  package at.gv.egiz.pdfas.lib.impl; -import iaik.cms.CMSException; -import iaik.cms.CMSParsingException; -import iaik.cms.SignedData; -import iaik.cms.SignerInfo; -import iaik.x509.X509Certificate; -  import java.io.ByteArrayInputStream;  import java.io.ByteArrayOutputStream;  import java.io.File;  import java.io.IOException;  import java.io.OutputStream; -import java.security.SignatureException;  import java.util.ArrayList;  import java.util.Calendar;  import java.util.List; @@ -25,13 +18,11 @@ import org.apache.pdfbox.pdmodel.PDDocument;  import org.slf4j.Logger;  import org.slf4j.LoggerFactory; -import sun.misc.Regexp;  import at.gv.egiz.pdfas.common.exceptions.PdfAsException;  import at.gv.egiz.pdfas.common.exceptions.PdfAsSettingsException;  import at.gv.egiz.pdfas.common.settings.ISettings;  import at.gv.egiz.pdfas.common.settings.Settings;  import at.gv.egiz.pdfas.common.settings.SignatureProfileSettings; -import at.gv.egiz.pdfas.common.utils.StringUtils;  import at.gv.egiz.pdfas.lib.api.Configuration;  import at.gv.egiz.pdfas.lib.api.IConfigurationConstants;  import at.gv.egiz.pdfas.lib.api.PdfAs; @@ -48,7 +39,6 @@ import at.gv.egiz.pdfas.lib.impl.signing.IPdfSigner;  import at.gv.egiz.pdfas.lib.impl.signing.PdfSignerFactory;  import at.gv.egiz.pdfas.lib.impl.signing.pdfbox.PdfboxSignerWrapper;  import at.gv.egiz.pdfas.lib.impl.signing.sig_interface.SignatureDataExtractor; -import at.gv.egiz.pdfas.lib.impl.signing.sig_interface.SignatureDataInjector;  import at.gv.egiz.pdfas.lib.impl.stamping.IPDFStamper;  import at.gv.egiz.pdfas.lib.impl.stamping.IPDFVisualObject;  import at.gv.egiz.pdfas.lib.impl.stamping.StamperFactory; @@ -103,8 +93,9 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants {  			logger.info("Selected signature Profile: " + signatureProfileID); -			SignatureProfileConfiguration signatureProfileConfiguration = status -					.getSignatureProfileConfiguration(signatureProfileID); +			// SignatureProfileConfiguration signatureProfileConfiguration = +			// status +			// .getSignatureProfileConfiguration(signatureProfileID);  			// set Original PDF Document Data  			status.getPdfObject().setOriginalDocument( @@ -115,65 +106,62 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants {  				// TODO: Do placeholder search  			} -			if (requestedSignature.isVisual()) { -				logger.info("Creating visual siganture block"); -				// ================================================================ -				// SignBlockCreationStage (visual) -> create visual signature -				// block (logicaly) -				SignatureProfileSettings signatureProfileSettings = TableFactory -						.createProfile(signatureProfileID, settings); - -				Table main = TableFactory.createSigTable( -						signatureProfileSettings, MAIN, settings, -						requestedSignature); - -				IPDFStamper stamper = StamperFactory -						.createDefaultStamper(settings); -				IPDFVisualObject visualObject = stamper.createVisualPDFObject( -						status.getPdfObject(), main); - -				// ================================================================ -				// PositioningStage (visual) -> find position or use fixed -				// position - -				String posString = status.getSignParamter() -						.getSignaturePosition(); - -				if (posString == null) { -					posString = signatureProfileConfiguration -							.getDefaultPositioning(); -				} - -				TablePos tablePos = null; - -				if (posString == null) { -					tablePos = new TablePos(); -				} else { -					tablePos = new TablePos(posString); -				} - -				PDDocument originalDocument = PDDocument -						.load(new ByteArrayInputStream(status.getPdfObject() -								.getOriginalDocument())); - -				PositioningInstruction positioningInstruction = Positioning -						.determineTablePositioning(tablePos, "", -								originalDocument, visualObject); +			this.stampPdf(status); -				// ================================================================ -				// StampingStage (visual) -> stamp logical signature block to -				// location (itext) - -				byte[] incrementalUpdate = stamper.writeVisualObject( -						visualObject, positioningInstruction, status -								.getPdfObject().getOriginalDocument()); -				status.getPdfObject().setStampedDocument(incrementalUpdate); -			} else { -				logger.info("No visual siganture block"); -				// Stamped Object is equal to original -				status.getPdfObject().setStampedDocument( -						status.getPdfObject().getOriginalDocument()); -			} +			/* +			 * if (requestedSignature.isVisual()) { +			 * logger.info("Creating visual siganture block"); // +			 * ================================================================ +			 * // SignBlockCreationStage (visual) -> create visual signature // +			 * block (logicaly) SignatureProfileSettings +			 * signatureProfileSettings = TableFactory +			 * .createProfile(signatureProfileID, settings); +			 *  +			 * Table main = TableFactory.createSigTable( +			 * signatureProfileSettings, MAIN, settings, requestedSignature); +			 *  +			 * IPDFStamper stamper = StamperFactory +			 * .createDefaultStamper(settings); IPDFVisualObject visualObject = +			 * stamper.createVisualPDFObject( status.getPdfObject(), main); +			 *  +			 * // +			 * ================================================================ +			 * // PositioningStage (visual) -> find position or use fixed // +			 * position +			 *  +			 * String posString = status.getSignParamter() +			 * .getSignaturePosition(); +			 *  +			 * if (posString == null) { posString = +			 * signatureProfileConfiguration .getDefaultPositioning(); } +			 *  +			 * TablePos tablePos = null; +			 *  +			 * if (posString == null) { tablePos = new TablePos(); } else { +			 * tablePos = new TablePos(posString); } +			 *  +			 * PDDocument originalDocument = PDDocument .load(new +			 * ByteArrayInputStream(status.getPdfObject() +			 * .getOriginalDocument())); +			 *  +			 * PositioningInstruction positioningInstruction = Positioning +			 * .determineTablePositioning(tablePos, "", originalDocument, +			 * visualObject); +			 *  +			 * // +			 * ================================================================ +			 * // StampingStage (visual) -> stamp logical signature block to // +			 * location (itext) +			 *  +			 * byte[] incrementalUpdate = stamper.writeVisualObject( +			 * visualObject, positioningInstruction, status +			 * .getPdfObject().getOriginalDocument()); +			 * status.getPdfObject().setStampedDocument(incrementalUpdate); } +			 * else { logger.info("No visual siganture block"); // Stamped +			 * Object is equal to original +			 * status.getPdfObject().setStampedDocument( +			 * status.getPdfObject().getOriginalDocument()); } +			 */  			// TODO: Create signature  			IPdfSigner signer = PdfSignerFactory.createPdfSigner(); @@ -269,8 +257,8 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants {  					result.addAll(results);  				} -				return result;  			} +			return result;  		} catch (IOException e) {  			e.printStackTrace();  		} catch (PdfAsException e) { @@ -327,24 +315,25 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants {  			try {  				status.getRequestedSignature().setCertificate(  						request.getCertificate()); -				 +  				// set Original PDF Document Data  				status.getPdfObject().setOriginalDocument(  						status.getSignParamter().getDataSource().getByteData()); -				 +  				// STAMPER!  				stampPdf(status);  				request.setNeedCertificate(false);  				status.setSigningDate(Calendar.getInstance()); -				 +  				// GET Signature DATA  				String pdfFilter = status.getSignParamter().getPlainSigner()  						.getPDFFilter();  				String pdfSubFilter = status.getSignParamter().getPlainSigner()  						.getPDFSubFilter();  				SignatureDataExtractor signatureDataExtractor = new SignatureDataExtractor( -						request.getCertificate(), pdfFilter, pdfSubFilter, status.getSigningDate()); +						request.getCertificate(), pdfFilter, pdfSubFilter, +						status.getSigningDate());  				IPdfSigner signer = PdfSignerFactory.createPdfSigner();  				signer.signPDF(status.getPdfObject(), @@ -362,23 +351,25 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants {  			request.setNeedSignature(false);  			// TODO: Inject signature byte[] into signedDocument  			int offset = request.getSignatureData().length; -			 -			for(int i = 0; i < request.getSignature().length; i++) { -				status.getPdfObject().getSignedDocument()[offset + i] = request.getSignature()[i]; + +			for (int i = 0; i < request.getSignature().length; i++) { +				status.getPdfObject().getSignedDocument()[offset + i] = request +						.getSignature()[i];  			}  			/* -			 -			String pdfFilter = status.getSignParamter().getPlainSigner() -					.getPDFFilter(); -			String pdfSubFilter = status.getSignParamter().getPlainSigner() -					.getPDFSubFilter(); -			SignatureDataInjector injector = new SignatureDataInjector( -					request.getCertificate(), pdfFilter, pdfSubFilter, status.getSigningDate(), -					request.getSignature(), request.getSignatureData()); - -			IPdfSigner signer = PdfSignerFactory.createPdfSigner(); -			signer.signPDF(status.getPdfObject(), -					status.getRequestedSignature(), injector);*/ +			 *  +			 * String pdfFilter = status.getSignParamter().getPlainSigner() +			 * .getPDFFilter(); String pdfSubFilter = +			 * status.getSignParamter().getPlainSigner() .getPDFSubFilter(); +			 * SignatureDataInjector injector = new SignatureDataInjector( +			 * request.getCertificate(), pdfFilter, pdfSubFilter, +			 * status.getSigningDate(), request.getSignature(), +			 * request.getSignatureData()); +			 *  +			 * IPdfSigner signer = PdfSignerFactory.createPdfSigner(); +			 * signer.signPDF(status.getPdfObject(), +			 * status.getRequestedSignature(), injector); +			 */  			request.setIsReady(true);  		} else {  			throw new PdfAsException("Invalid Status"); @@ -399,10 +390,10 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants {  		if (!request.isReady()) {  			throw new PdfAsException("Invalid Status");  		} -		 +  		try {  			return createSignResult(status); -		} catch(IOException e) { +		} catch (IOException e) {  			throw new PdfAsException("Invalid Status", e);  		}  	} @@ -464,6 +455,16 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants {  			byte[] incrementalUpdate = stamper.writeVisualObject(visualObject,  					positioningInstruction, status.getPdfObject()  							.getOriginalDocument()); + +			SignaturePositionImpl position = new SignaturePositionImpl(); +			position.setX(positioningInstruction.getX()); +			position.setY(positioningInstruction.getY()); +			position.setPage(positioningInstruction.getPage()); +			position.setHeight(visualObject.getHeight()); +			position.setWidth(visualObject.getWidth()); + +			requestedSignature.setSignaturePosition(position); +  			status.getPdfObject().setStampedDocument(incrementalUpdate);  		} else {  			logger.info("No visual siganture block"); @@ -473,7 +474,8 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants {  		}  	} -	private SignResult createSignResult(OperationStatus status) throws IOException { +	private SignResult createSignResult(OperationStatus status) +			throws IOException {  		// ================================================================  		// Create SignResult  		SignResultImpl result = new SignResultImpl(status.getSignParamter() @@ -485,6 +487,13 @@ public class PdfAsImpl implements PdfAs, IConfigurationConstants {  		outputStream.close(); +		// result.setSignaturePosition(status.getRequestedSignature().); + +		result.setSignerCertificate(status.getRequestedSignature() +				.getCertificate()); +		result.setSignaturePosition(status.getRequestedSignature() +				.getSignaturePosition()); +  		return result;  	} diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/SignResultImpl.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/SignResultImpl.java index dcb27be9..28a2a33b 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/SignResultImpl.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/SignResultImpl.java @@ -3,11 +3,14 @@ package at.gv.egiz.pdfas.lib.impl;  import java.security.cert.X509Certificate;  import at.gv.egiz.pdfas.lib.api.DataSink; +import at.gv.egiz.pdfas.lib.api.SignaturePosition;  import at.gv.egiz.pdfas.lib.api.sign.SignResult;  public class SignResultImpl implements SignResult {  	protected DataSink dataSink; +	protected X509Certificate certificate; +	protected SignaturePosition position;  	public SignResultImpl(DataSink dataSink) {  		this.dataSink = dataSink; @@ -18,8 +21,19 @@ public class SignResultImpl implements SignResult {  	}  	public X509Certificate getSignerCertificate() { -		// TODO Auto-generated method stub -		return null; +		return this.certificate; +	} + +	public SignaturePosition getSignaturePosition() { +		return this.position; +	} + +	public void setSignerCertificate(X509Certificate certificate) { +		this.certificate = certificate; +	} + +	public void setSignaturePosition(SignaturePosition position) { +		this.position = position;  	}  } diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/SignaturePositionImpl.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/SignaturePositionImpl.java new file mode 100644 index 00000000..7ad8174b --- /dev/null +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/SignaturePositionImpl.java @@ -0,0 +1,55 @@ +package at.gv.egiz.pdfas.lib.impl; + +import at.gv.egiz.pdfas.lib.api.SignaturePosition; + +public class SignaturePositionImpl implements SignaturePosition { + +	protected int page; +	protected float x; +	protected float y; +	protected float width; +	protected float height; +	 +	 +	 +	public void setPage(int page) { +		this.page = page; +	} + +	public void setX(float x) { +		this.x = x; +	} + +	public void setY(float y) { +		this.y = y; +	} + +	public void setWidth(float width) { +		this.width = width; +	} + +	public void setHeight(float height) { +		this.height = height; +	} + +	public int getPage() { +		return page; +	} + +	public float getX() { +		return x; +	} + +	public float getY() { +		return y; +	} + +	public float getWidth() { +		return width; +	} + +	public float getHeight() { +		return height; +	} + +} diff --git a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/status/RequestedSignature.java b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/status/RequestedSignature.java index a1820104..8bf56259 100644 --- a/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/status/RequestedSignature.java +++ b/pdf-as-lib/src/main/java/at/gv/egiz/pdfas/lib/impl/status/RequestedSignature.java @@ -3,14 +3,16 @@ package at.gv.egiz.pdfas.lib.impl.status;  import iaik.x509.X509Certificate;  import at.gv.egiz.pdfas.common.exceptions.PdfAsException;  import at.gv.egiz.pdfas.common.exceptions.PdfAsSettingsException; +import at.gv.egiz.pdfas.lib.api.SignaturePosition;  import at.knowcenter.wag.egov.egiz.pdf.TablePos;  public class RequestedSignature {      private String signatureProfile; -    private TablePos signaturePosition; +    private TablePos tablePosition;      private OperationStatus status;      private X509Certificate certificate; +    private SignaturePosition signaturePosition = null;      //private IPlainSigner signer = null;      public RequestedSignature(OperationStatus status) throws PdfAsException { @@ -30,9 +32,9 @@ public class RequestedSignature {      	this.signatureProfile = profileID;      	if(status.getSignParamter().getSignaturePosition() == null) { -    		this.signaturePosition = new TablePos(); +    		this.tablePosition = new TablePos();      	} else { -    		this.signaturePosition = new TablePos(status.getSignParamter().getSignaturePosition()); +    		this.tablePosition = new TablePos(status.getSignParamter().getSignaturePosition());      	}      } @@ -41,7 +43,7 @@ public class RequestedSignature {      }      public TablePos getTablePos() { -    	return this.signaturePosition; +    	return this.tablePosition;      }      public String getSignatureProfileID() { @@ -55,5 +57,15 @@ public class RequestedSignature {      public void setCertificate(X509Certificate certificate) {      	this.certificate = certificate;      } + +	public SignaturePosition getSignaturePosition() { +		return signaturePosition; +	} + +	public void setSignaturePosition(SignaturePosition signaturePosition) { +		this.signaturePosition = signaturePosition; +	} +     +      } | 
