/**
 * <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.commons.DynamicSignatureLifetimeEnum;
import at.gv.egiz.pdfas.api.commons.DynamicSignatureProfile;
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 SignatureCreationWithDynamicProfilesDemo {

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

   /**
    * 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);
         signParameters.setSignaturePositioning(new SignaturePositioning("x:auto;y:auto;w:auto;p:auto;f:80"));
         // standard signature
         signParameters.setSignatureType(Constants.SIGNATURE_TYPE_TEXTUAL);

         // set signature profile (note: this setting is being overwritten if the optional settings (below) are used
         signParameters.setSignatureProfileId("SIGNATURBLOCK_DE");
         
         // OPTIONAL[start]: adjust fixed signature profile dynamically according to your needs
         
            // create dynamic signature profile, take values from profile SIGNATURBLOCK_DE
            DynamicSignatureProfile dsp = pdfasAPI.createDynamicSignatureProfile(
                     "SIGNATURBLOCK_DE",
                     DynamicSignatureLifetimeEnum.AUTO  // auto lifetime for one sign process
            );
            
            // simple access for everyone
            // can also be done by using signParameters.setProfileOverrideValue("SIG_META", "New note value.");
            dsp.setFieldValue("SIG_META", "New note value.");      
            
            // full control - USE THIS ONLY IF YOU REALLY KNOW WHAT YOU ARE DOING
            // inconsiderate use may lead to non verifiable signatures
            dsp.setPropertyRaw("table.main.Style.halign", "right");
            
            // mandatory: register the profile
            dsp.apply();
            
            // set dynamic sign profile
            signParameters.setSignatureProfileId(dsp.getName());
            
         // OPTIONAL[end]
            
         // 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();
      }

   }
   
}