diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/java/at/knowcenter/wag/egov/egiz/pdf/BinarySignature.java | 80 | 
1 files changed, 77 insertions, 3 deletions
| diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/BinarySignature.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/BinarySignature.java index d0cd951..f07d8c6 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/BinarySignature.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/BinarySignature.java @@ -28,9 +28,13 @@ import java.security.cert.X509Certificate;  import java.util.ArrayList;
  import java.util.Collections;
  import java.util.Comparator;
 +import java.util.HashMap;
  import java.util.Iterator;
  import java.util.List;
 +import javax.xml.datatype.DatatypeFactory;
 +import javax.xml.datatype.XMLGregorianCalendar;
 +
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
 @@ -40,6 +44,7 @@ import at.gv.egiz.pdfas.exceptions.pdf.CaptionNotFoundException;  import at.gv.egiz.pdfas.exceptions.pdf.KZSettingNotFoundException;
  import at.gv.egiz.pdfas.framework.input.PdfDataSource;
  import at.gv.egiz.pdfas.framework.output.DataSink;
 +import at.gv.egiz.pdfas.framework.signator.SignatorInformation;
  import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
  import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
  import at.knowcenter.wag.egov.egiz.exceptions.PlaceholderException;
 @@ -58,6 +63,7 @@ import com.lowagie.text.Rectangle;  import com.lowagie.text.pdf.PRStream;
  import com.lowagie.text.pdf.PdfArray;
  import com.lowagie.text.pdf.PdfContentByte;
 +import com.lowagie.text.pdf.PdfDate;
  import com.lowagie.text.pdf.PdfDictionary;
  import com.lowagie.text.pdf.PdfIndirectObject;
  import com.lowagie.text.pdf.PdfIndirectReference;
 @@ -66,6 +72,8 @@ import com.lowagie.text.pdf.PdfNumber;  import com.lowagie.text.pdf.PdfObject;
  import com.lowagie.text.pdf.PdfPTable;
  import com.lowagie.text.pdf.PdfReader;
 +import com.lowagie.text.pdf.PdfSignature;
 +import com.lowagie.text.pdf.PdfSignatureAppearance;
  import com.lowagie.text.pdf.PdfStamper;
  import com.lowagie.text.pdf.PdfStamperImp;
  import com.lowagie.text.pdf.PdfString;
 @@ -775,7 +783,7 @@ public abstract class BinarySignature     *           Forwarded exception.
     */
    public static IncrementalUpdateInformation writeIncrementalUpdate(PdfDataSource original_document, DataSink written_pdf, PdfPTable pdf_table, String profile, PositioningInstruction pi,
 -      List variable_field_definitions, List all_field_definitions, List invisible_field_definitions, String invisibleKZString, TimeStamper timeStamper) throws PresentableException
 +      List variable_field_definitions, List all_field_definitions, List invisible_field_definitions, String invisibleKZString, TimeStamper timeStamper, SignatorInformation si) throws PresentableException
    {
      try
      {
 @@ -800,7 +808,8 @@ public abstract class BinarySignature        // IMPORTANT: append the new content to the original document using
        // incremental updated
        // The stamper allows this by setting append = true
 -      PdfStamper stamper = new PdfStamper(reader, baos, '\0', true);
 +      //PdfStamper stamper = new PdfStamper(reader, baos, '\0', true);
 +      PdfStamper stamper = PdfStamper.createSignature(reader, baos, '\0', null, true);
        if (pi.isMakeNewPage())
        {
 @@ -895,7 +904,8 @@ public abstract class BinarySignature          createEgizDict(stamper, table_template, iui, variable_field_definitions, all_field_definitions, invisible_field_definitions, invisibleKZString);
        }
 -      stamper.close();
 +      //stamper.close();
 +      createAdobeSigAttrib(stamper, si, atp);  // here..., stamper is closed
        // System.out.println("wprinz: STAMPING FINISHED");
        // just to make sure the stream is really closed
 @@ -917,6 +927,70 @@ public abstract class BinarySignature    }
    /**
 +   * Schreibt Adobe-pdf signatur attribut mittels itext
 +   * @param stamper
 +   * @param si
 +   * @param atp
 +   */
 +  public static void  createAdobeSigAttrib(PdfStamper stamper, SignatorInformation si, ActualTablePos atp) {
 +    
 +    try {
 +       logger.info("create adobe signature field");      
 +       PdfSignatureAppearance sap = stamper.getSignatureAppearance();
 +
 +       sap.setCrypto(null, null, null, null);
 +       // supress overlay text for visible signatures
 +       sap.setLayer2Text("");
 +       sap.setLayer4Text("");
 +       
 +       // the following line marks the sig block as adobe sig
 +       //sap.setVisibleSignature(createRectangleFromTablePos(iui.actualTablePos), iui.actualTablePos.page, "PDF-AS-Signatur");
 +       sap.setVisibleSignature(new Rectangle(0, 0, 0, 0), atp.page, "PDF-AS-Signatur");
 +       String subfilter = "urn:pdfsigfilter:bka.gv.at:binaer:v1.1.0";
 +       if (si != null) {
 +          subfilter = si.getSignSignatureObject().kz;
 +       }
 +       PdfSignature sig = new PdfSignature(new PdfName("Adobe.PDF-AS"), new PdfName(subfilter));
 +       // the following fields are not shown by the reader, because its is no Standard filter
 +       //sig.setLocation("location is not visible");
 +       //sig.setReason("reason is not visible");        
 +       //sig.setContact("contact is not visible");
 +       sig.setDate(new PdfDate());
 +       if (si != null) {
 +          XMLGregorianCalendar c =  DatatypeFactory.newInstance().newXMLGregorianCalendar(si.getSignSignatureObject().date);
 +          sig.setDate(new PdfDate(c.toGregorianCalendar()));
 +       }
 +       String cn = null;
 +       if (si != null) {
 +          cn = si.getSignSignatureObject().certSubjectDNPart("CN");           
 +       }
 +       if (cn == null) {
 +          cn = "PDF-AS";
 +       }
 +       sig.setName(cn);
 +       sap.setCryptoDictionary(sig);
 +       
 +       // content element is mandatory but empty
 +       HashMap exc = new HashMap();
 +       exc.put(PdfName.CONTENTS, new Integer(2));
 +       sap.preClose(exc); // *2+2
 +          
 +       PdfDictionary dic = new PdfDictionary();
 +       dic.put(PdfName.CONTENTS, new PdfString((String)null).setHexWriting(true));
 +       sap.close(dic);
 +    } catch (Exception ex) {
 +       logger.error("error", ex);
 +       throw new RuntimeException(ex );
 +    }
 +
 +    //stamper.close();
 + }
 +  
 +  private static Rectangle createRectangleFromTablePos(ActualTablePos pos) {
 +     return new Rectangle(pos.x, pos.y, pos.x + pos.width, pos.y - pos.height);
 +  }
 +  
 +  /**
     * Creates the EGIZ Dictionary and adds it to the document.
     * 
     * @param stamper
 | 
