/**
 * <copyright> Copyright 2006 by Know-Center, Graz, Austria </copyright>
 * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a
 * joint initiative of the Federal Chancellery Austria and Graz University of
 * Technology.
 *
 * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by
 * the European Commission - subsequent versions of the EUPL (the "Licence");
 * You may not use this work except in compliance with the Licence.
 * You may obtain a copy of the Licence at:
 * http://www.osor.eu/eupl/
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the Licence is distributed on an "AS IS" basis,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the Licence for the specific language governing permissions and
 * limitations under the Licence.
 *
 * This product combines work with different licenses. See the "NOTICE" text
 * file for details on the various modules and licenses.
 * The "NOTICE" text file is part of the distribution. Any derivative works
 * that you distribute must include a readable copy of the "NOTICE" text file.
 */
package demo;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;

import at.gv.egiz.pdfas.PdfAsFactory;
import at.gv.egiz.pdfas.api.PdfAs;
import at.gv.egiz.pdfas.api.analyze.NonTextObjectInfo;
import at.gv.egiz.pdfas.api.commons.Constants;
import at.gv.egiz.pdfas.api.exceptions.PdfAsException;
import at.gv.egiz.pdfas.api.io.DataSource;
import at.gv.egiz.pdfas.api.sign.SignParameters;
import at.gv.egiz.pdfas.api.sign.SignResult;
import at.gv.egiz.pdfas.api.sign.pos.SignaturePositioning;
import at.gv.egiz.pdfas.io.FileBasedDataSink;
import at.gv.egiz.pdfas.io.FileBasedDataSource;

public class SignatureCreationDemo {

   /**
    * Disable instantiation.
    */
   private SignatureCreationDemo() {
   }

   /**
    * Starts a demo that signs a document.
    * 
    * @param args
    *           The parameter(s).
    */
   public static void main(String[] args) {

      if (args == null || args.length == 0) {
         System.err.println("Please provide path of file to be signed.");
         System.exit(1);
      }
      
      File configdir = new File("./work");
      File unsignedFile = new File(args[0]);
      File signedFile = new File(args[0] + "_signed.pdf");

      try {
         
         // instantiate api
         PdfAs pdfasAPI = PdfAsFactory.createPdfAs(configdir);

         // set source
         DataSource dataSource = new FileBasedDataSource(unsignedFile, "application/pdf");

         // set output
         FileBasedDataSink dataSink = new FileBasedDataSink(signedFile);

         // configure signature
         SignParameters signParameters = new SignParameters();
         signParameters.setDocument(dataSource);
         signParameters.setOutput(dataSink);
         signParameters.setSignatureDevice(Constants.SIGNATURE_DEVICE_MOA); // Constants.SIGNATURE_DEVICE_BKU
         signParameters.setSignaturePositioning(new SignaturePositioning("x:100;y:200;w:500;p:1;f:80"));
         signParameters.setCheckForPlaceholder(true);
         // standard signature
         signParameters.setSignatureType(Constants.SIGNATURE_TYPE_TEXTUAL);
         signParameters.setSignatureProfileId("SIGNATURBLOCK_DE");
         
         // --- enable in case of BAIK SIGNATURE ---
         /*
            signParameters.setSignatureType(Constants.SIGNATURE_TYPE_BINARY);
            // signParameters.setSignatureProfileId("BAIK_URKUNDE_SIGNATUR");
            signParameters.setSignatureProfileId("BAIK_ARCHIV_SIGNATUR");
            // use BAIK TimeStamp
            signParameters.setTimeStamperImpl(new DummyTimeStamper());
         */

         // dynamic adjustment of signature profile values
         // warning: inconsiderate modifications might lead to signatures that can't be validated
         //          based on default configuration
         // note: any modifications are bound to the SignParameters object instance.
         //       It is not possible to permanently change profile configuration.
         signParameters.setProfileOverrideValue("SIG_NAME", "Max Mustermann"); // you may use expressions here like ${subject.EMAIL}
         signParameters.setProfileOverrideValue("SIG_META", "This is a modified note.");
         
         // sign
         System.out.println("Signing...");
         SignResult signResult = pdfasAPI.sign(signParameters);
         System.out.println("Successfully signed.");
         
         // check if non textual elements have been detected
         if (signResult.hasNonTextualObjects()) {
            System.out.println("\nWARNING: " + signResult.getNonTextualObjects().size() + " non textual object(s) detected.");
            Iterator noit = signResult.getNonTextualObjects().iterator();
            while (noit.hasNext()) {
               NonTextObjectInfo info = (NonTextObjectInfo) noit.next();
               System.out.println("  -> " + info.toString());
            }
            System.out.println();
         }
         
      } catch (PdfAsException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }

   }
   
}