You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2013/03/01 17:33:56 UTC

svn commit: r1451638 [2/2] - in /pdfbox/trunk: examples/ examples/src/main/java/org/apache/pdfbox/examples/signature/ pdfbox/src/main/java/org/apache/pdfbox/cos/ pdfbox/src/main/java/org/apache/pdfbox/pdfparser/ pdfbox/src/main/java/org/apache/pdfbox/p...

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/filespecification/PDComplexFileSpecification.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/filespecification/PDComplexFileSpecification.java?rev=1451638&r1=1451637&r2=1451638&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/filespecification/PDComplexFileSpecification.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/filespecification/PDComplexFileSpecification.java Fri Mar  1 16:33:56 2013
@@ -18,6 +18,7 @@ package org.apache.pdfbox.pdmodel.common
 
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.cos.COSStream;
 
 /**
@@ -36,7 +37,7 @@ public class PDComplexFileSpecification 
     public PDComplexFileSpecification()
     {
         fs = new COSDictionary();
-        fs.setName( "Type", "Filespec" );
+        fs.setItem( COSName.TYPE, COSName.FILESPEC );
     }
 
     /**
@@ -70,13 +71,56 @@ public class PDComplexFileSpecification 
     }
 
     /**
+     * <p>Preferred method for getting the filename.
+     * It will determinate the recommended file name.</p>
+     * <p>First of all we try to get the unicode filename if it exist.
+     * If it doesn't exist we take a look at the DOS, MAC UNIX filenames.
+     * If no one exist the required F entry will be returned.</p>
+     *
+     * @return The preferred file name.
+     */
+    public String getFilename()
+    {
+        if (getUnicodeFile() != null)
+        {
+            return getUnicodeFile();
+        }
+        else if (getFileDos() != null)
+        {
+            return getFileDos();
+        }
+        else if (getFileMac() != null)
+        {
+            return getFileMac();
+        }
+        else if (getFileUnix() != null)
+        {
+            return getFileUnix();
+        }
+        else
+        {
+            return getFile();
+        }
+    }
+
+    /**
+     * This will get the unicode file name.
+     *
+     * @return The file name.
+     */
+    public String getUnicodeFile()
+    {
+        return fs.getString(COSName.UF);
+    }
+
+    /**
      * This will get the file name.
      *
      * @return The file name.
      */
     public String getFile()
     {
-        return fs.getString( "F" );
+        return fs.getString( COSName.F );
     }
 
     /**
@@ -86,7 +130,7 @@ public class PDComplexFileSpecification 
      */
     public void setFile( String file )
     {
-        fs.setString( "F", file );
+        fs.setString( COSName.F, file );
     }
 
     /**
@@ -96,7 +140,7 @@ public class PDComplexFileSpecification 
      */
     public String getFileDos()
     {
-        return fs.getString( "DOS" );
+        return fs.getString( COSName.DOS );
     }
 
     /**
@@ -106,7 +150,7 @@ public class PDComplexFileSpecification 
      */
     public void setFileDos( String file )
     {
-        fs.setString( "DOS", file );
+        fs.setString( COSName.DOS, file );
     }
 
     /**
@@ -116,7 +160,7 @@ public class PDComplexFileSpecification 
      */
     public String getFileMac()
     {
-        return fs.getString( "Mac" );
+        return fs.getString( COSName.MAC );
     }
 
     /**
@@ -126,7 +170,7 @@ public class PDComplexFileSpecification 
      */
     public void setFileMac( String file )
     {
-        fs.setString( "Mac", file );
+        fs.setString( COSName.MAC, file );
     }
 
     /**
@@ -136,7 +180,7 @@ public class PDComplexFileSpecification 
      */
     public String getFileUnix()
     {
-        return fs.getString( "Unix" );
+        return fs.getString( COSName.UNIX );
     }
 
     /**
@@ -146,7 +190,7 @@ public class PDComplexFileSpecification 
      */
     public void setFileUnix( String file )
     {
-        fs.setString( "Unix", file );
+        fs.setString( COSName.UNIX, file );
     }
 
     /**
@@ -157,7 +201,7 @@ public class PDComplexFileSpecification 
      */
     public void setVolatile( boolean fileIsVolatile )
     {
-        fs.setBoolean( "V", fileIsVolatile );
+        fs.setBoolean( COSName.V, fileIsVolatile );
     }
 
     /**
@@ -167,7 +211,7 @@ public class PDComplexFileSpecification 
      */
     public boolean isVolatile()
     {
-        return fs.getBoolean( "V", false );
+        return fs.getBoolean( COSName.V, false );
     }
 
     /**
@@ -193,15 +237,15 @@ public class PDComplexFileSpecification 
      */
     public void setEmbeddedFile( PDEmbeddedFile file )
     {
-        COSDictionary ef = (COSDictionary)fs.getDictionaryObject( "EF" );
+        COSDictionary ef = (COSDictionary)fs.getDictionaryObject( COSName.EF );
         if( ef == null && file != null )
         {
             ef = new COSDictionary();
-            fs.setItem( "EF", ef );
+            fs.setItem( COSName.EF, ef );
         }
         if( ef != null )
         {
-            ef.setItem( "F", file );
+            ef.setItem( COSName.F, file );
         }
     }
 
@@ -228,15 +272,15 @@ public class PDComplexFileSpecification 
      */
     public void setEmbeddedFileDos( PDEmbeddedFile file )
     {
-        COSDictionary ef = (COSDictionary)fs.getDictionaryObject( "DOS" );
+        COSDictionary ef = (COSDictionary)fs.getDictionaryObject( COSName.DOS );
         if( ef == null && file != null )
         {
             ef = new COSDictionary();
-            fs.setItem( "EF", ef );
+            fs.setItem( COSName.EF, ef );
         }
         if( ef != null )
         {
-            ef.setItem( "DOS", file );
+            ef.setItem( COSName.DOS, file );
         }
     }
 
@@ -263,15 +307,15 @@ public class PDComplexFileSpecification 
      */
     public void setEmbeddedFileMac( PDEmbeddedFile file )
     {
-        COSDictionary ef = (COSDictionary)fs.getDictionaryObject( "Mac" );
+        COSDictionary ef = (COSDictionary)fs.getDictionaryObject( COSName.MAC );
         if( ef == null && file != null )
         {
             ef = new COSDictionary();
-            fs.setItem( "EF", ef );
+            fs.setItem( COSName.EF, ef );
         }
         if( ef != null )
         {
-            ef.setItem( "Mac", file );
+            ef.setItem( COSName.MAC, file );
         }
     }
 
@@ -298,15 +342,16 @@ public class PDComplexFileSpecification 
      */
     public void setEmbeddedFileUnix( PDEmbeddedFile file )
     {
-        COSDictionary ef = (COSDictionary)fs.getDictionaryObject( "Unix" );
+        COSDictionary ef = (COSDictionary)fs.getDictionaryObject( COSName.UNIX );
         if( ef == null && file != null )
         {
             ef = new COSDictionary();
-            fs.setItem( "EF", ef );
+            fs.setItem( COSName.EF, ef );
         }
         if( ef != null )
         {
-            ef.setItem( "Unix", file );
+            ef.setItem( COSName.UNIX, file );
         }
     }
 }
+

Added: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDPropBuild.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDPropBuild.java?rev=1451638&view=auto
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDPropBuild.java (added)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDPropBuild.java Fri Mar  1 16:33:56 2013
@@ -0,0 +1,162 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pdfbox.pdmodel.interactive.digitalsignature;
+
+import org.apache.pdfbox.cos.COSBase;
+import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * <p>This represents a pdf signature build dictionary as specified in
+ * <a href="http://partners.adobe.com/public/developer/en/acrobat/Acrobat_Signature_BuildDict.pdf">
+ * http://partners.adobe.com/public/developer/en/acrobat/Acrobat_Signature_BuildDict.pdf</a></p>
+ *
+ * <p>The signature build properties dictionary provides signature properties for the software
+ * application that was used to create the signature.</p>
+ *
+ * @author Thomas Chojecki
+ * @version $Revision: 1.1 $
+ */
+public class PDPropBuild implements COSObjectable
+{
+
+    private COSDictionary dictionary;
+
+    /**
+     * Default constructor.
+     */
+    public PDPropBuild()
+    {
+        dictionary = new COSDictionary();
+        dictionary.setDirect(true); // the specification claim to use direct objects
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param dict The signature dictionary.
+     */
+    public PDPropBuild(COSDictionary dict)
+    {
+        dictionary = dict;
+        dictionary.setDirect(true); // the specification claim to use direct objects
+    }
+
+    /**
+     * Convert this standard java object to a COS object.
+     *
+     * @return The cos object that matches this Java object.
+     */
+    public COSBase getCOSObject()
+    {
+        return getDictionary();
+    }
+
+    /**
+     * Convert this standard java object to a COS dictionary.
+     *
+     * @return The COS dictionary that matches this Java object.
+     */
+    public COSDictionary getDictionary()
+    {
+        return dictionary;
+    }
+
+    /**
+     * A build data dictionary for the signature handler that was
+     * used to create the parent signature.
+     *
+     * @return the Filter as PDPropBuildFilter object
+     */
+    public PDPropBuildDataDict getFilter()
+    {
+        PDPropBuildDataDict filter = null;
+        COSDictionary filterDic = (COSDictionary)dictionary.getDictionaryObject(COSName.FILTER);
+        if (filterDic != null)
+        {
+            filter = new PDPropBuildDataDict(filterDic);
+        }
+        return filter;
+    }
+
+    /**
+     * Set the build data dictionary for the signature handler.
+     * This entry is optional but is highly recommended for the signatures.
+     *
+     * @param filter is the PDPropBuildFilter
+     */
+    public void setPDPropBuildFilter(PDPropBuildDataDict filter)
+    {
+        dictionary.setItem(COSName.FILTER, filter);
+    }
+
+    /**
+     * A build data dictionary for the PubSec software module
+     * that was used to create the parent signature.
+     *
+     * @return the PubSec as PDPropBuildPubSec object
+     */
+    public PDPropBuildDataDict getPubSec()
+    {
+        PDPropBuildDataDict pubSec = null;
+        COSDictionary pubSecDic = (COSDictionary)dictionary.getDictionaryObject(COSName.PUB_SEC);
+        if (pubSecDic != null)
+        {
+            pubSec = new PDPropBuildDataDict(pubSecDic);
+        }
+        return pubSec;
+    }
+
+    /**
+     * Set the build data dictionary for the PubSec Software module.
+     *
+     * @param pubSec is the PDPropBuildPubSec
+     */
+    public void setPDPropBuildPubSec(PDPropBuildDataDict pubSec)
+    {
+        dictionary.setItem(COSName.PUB_SEC, pubSec);
+    }
+
+    /**
+     * A build data dictionary for the viewing application software
+     * module that was used to create the parent signature.
+     *
+     * @return the App as PDPropBuildApp object
+     */
+    public PDPropBuildDataDict getApp()
+    {
+        PDPropBuildDataDict app = null;
+        COSDictionary appDic = (COSDictionary)dictionary.getDictionaryObject(COSName.APP);
+        if (appDic != null)
+        {
+            app = new PDPropBuildDataDict(appDic);
+        }
+        return app;
+    }
+
+    /**
+     * Set the build data dictionary for the viewing application
+     * software module.
+     *
+     * @param app is the PDPropBuildApp
+     */
+    public void setPDPropBuildApp(PDPropBuildDataDict app)
+    {
+        dictionary.setItem(COSName.APP, app);
+    }
+}

Propchange: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDPropBuild.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDPropBuildDataDict.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDPropBuildDataDict.java?rev=1451638&view=auto
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDPropBuildDataDict.java (added)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDPropBuildDataDict.java Fri Mar  1 16:33:56 2013
@@ -0,0 +1,248 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pdfbox.pdmodel.interactive.digitalsignature;
+
+import org.apache.pdfbox.cos.COSBase;
+import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * <p>This represents the general property dictionaries from the build property dictionary.</p>
+ *
+ * @see PDPropBuild
+ * @author Thomas Chojecki
+ * @version $Revision: 1.1 $
+ */
+public class PDPropBuildDataDict implements COSObjectable
+{
+
+    private COSDictionary dictionary;
+
+    /**
+     * Default constructor.
+     */
+    public PDPropBuildDataDict()
+    {
+        dictionary = new COSDictionary();
+        dictionary.setDirect(true); // the specification claim to use direct objects
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param dict The signature dictionary.
+     */
+    public PDPropBuildDataDict(COSDictionary dict)
+    {
+        dictionary = dict;
+        dictionary.setDirect(true); // the specification claim to use direct objects
+    }
+
+
+    /**
+     * Convert this standard java object to a COS object.
+     *
+     * @return The cos object that matches this Java object.
+     */
+    public COSBase getCOSObject()
+    {
+        return getDictionary();
+    }
+
+    /**
+     * Convert this standard java object to a COS dictionary.
+     *
+     * @return The COS dictionary that matches this Java object.
+     */
+    public COSDictionary getDictionary()
+    {
+        return dictionary;
+    }
+
+    /**
+     * The name of the software module that was used to create the signature.
+     * @return the name of the software module
+     */
+    public String getName()
+    {
+        return dictionary.getString(COSName.NAME);
+    }
+
+    /**
+     * The name of the software module that was used to create the signature.
+     *
+     * @param name is the name of the software module
+     */
+    public void setName(String name)
+    {
+        dictionary.setString(COSName.NAME, name);
+    }
+
+    /**
+     * The build date of the software module.
+     *
+     * @return the build date of the software module
+     */
+    public String getDate()
+    {
+        return dictionary.getString(COSName.DATE);
+    }
+
+    /**
+     * The build date of the software module. This string is normally produced by the
+     * compiler under C++.
+     *
+     * @param date is the build date of the software module
+     */
+    public void setDate(String date)
+    {
+        dictionary.setString(COSName.DATE, date);
+    }
+
+    /**
+     * The software module revision number, corresponding to the Date attribute.
+     *
+     * @return the revision of the software module
+     */
+    public long getRevision()
+    {
+        return dictionary.getLong(COSName.R);
+    }
+
+    /**
+     * The software module revision number, corresponding to the Date attribute.
+     *
+     * @param revision is the software module revision number
+     */
+    public void setRevision(long revision)
+    {
+        dictionary.setLong(COSName.R, revision);
+    }
+
+    /**
+     * The software module revision number, used to determinate the minimum version
+     * of software that is required in order to process this signature.
+     *
+     * @return the revision of the software module
+     */
+    public long getMinimumRevision()
+    {
+        return dictionary.getLong(COSName.V);
+    }
+
+    /**
+     * The software module revision number, used to determinate the minimum version
+     * of software that is required in order to process this signature.
+     *
+     * @param revision is the software module revision number
+     */
+    public void setMinimumRevision(long revision)
+    {
+        dictionary.setLong(COSName.V, revision);
+    }
+
+    /**
+     * A flag that can be used by the signature handler or software module to
+     * indicate that this signature was created with unrelease software.
+     *
+     * @return true if the software module or signature handler was a pre release.
+     */
+    public boolean getPreRelease()
+    {
+        return dictionary.getBoolean(COSName.PRE_RELEASE, false);
+    }
+
+    /**
+     * A flag that can be used by the signature handler or software module to
+     * indicate that this signature was created with unrelease software.
+     *
+     * @param preRelease is true if the signature was created with a unrelease
+     *                   software, otherwise false.
+     */
+    public void setPreRelease(boolean preRelease)
+    {
+        dictionary.setBoolean(COSName.PRE_RELEASE, preRelease);
+    }
+
+    /**
+     * Indicates the operation system. The format isn't specified yet.
+     *
+     * @return a the operation system id or name.
+     */
+    public String getOS()
+    {
+        return dictionary.getString(COSName.OS);
+    }
+
+    /**
+     * Indicates the operation system. The format isn't specified yet.
+     *
+     * @param os is a string with the system id or name.
+     */
+    public void setOS(String os)
+    {
+        dictionary.setString(COSName.OS, os);
+    }
+
+    /**
+     * If there is a LegalPDF dictionary in the catalog
+     * of the PDF file and the NonEmbeddedFonts attribute in this dictionary
+     * has a non zero value, and the viewing application has a preference
+     * set to suppress the display of this warning then the value of this
+     * attribute will be set to true.
+     *
+     * @return true if NonEFontNoWarn is set to true
+     */
+    public boolean getNonEFontNoWarn()
+    {
+        return dictionary.getBoolean(COSName.NON_EFONT_NO_WARN, true);
+    }
+
+    /*
+     * setNonEFontNoWarn missing. Maybe not needed or should be self
+     * implemented.
+     *
+     * Documentation says:
+     * (Optional; PDF 1.5) If there is a LegalPDF dictionary in the catalog
+     * of the PDF file and the NonEmbeddedFonts attribute in this dictionary
+     * has a non zero value, and the viewing application has a preference
+     * set to suppress the display of this warning then the value of this
+     * attribute will be set to true.
+     */
+
+    /**
+     * If true, the application was in trusted mode when signing took place.
+     *
+     * @return true if the application was in trusted mode while signing.
+     *              default: false
+     */
+    public boolean getTrustedMode()
+    {
+        return dictionary.getBoolean(COSName.TRUSTED_MODE, false);
+    }
+
+    /**
+     * If true, the application was in trusted mode when signing took place.
+     *
+     * @param trustedMode true if the application is in trusted mode.
+     */
+    public void setTrustedMode(boolean trustedMode)
+    {
+        dictionary.setBoolean(COSName.TRUSTED_MODE, trustedMode);
+    }
+}

Propchange: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDPropBuildDataDict.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDSeedValue.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDSeedValue.java?rev=1451638&view=auto
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDSeedValue.java (added)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDSeedValue.java Fri Mar  1 16:33:56 2013
@@ -0,0 +1,575 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pdfbox.pdmodel.interactive.digitalsignature;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.pdfbox.cos.COSArray;
+import org.apache.pdfbox.cos.COSBase;
+import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.pdmodel.common.COSArrayList;
+import org.apache.pdfbox.pdmodel.common.COSObjectable;
+import org.apache.pdfbox.util.BitFlagHelper;
+
+/**
+ * This represents a pdf signature seed value dictionary.
+ *
+ * @author Thomas Chojecki
+ * @version $Revision: 1.1 $
+ */
+public class PDSeedValue implements COSObjectable
+{
+
+    /**
+     * A Ff flag.
+     */
+    public static final int FLAG_FILTER = 1;
+
+    /**
+     * A Ff flag.
+     */
+    public static final int FLAG_SUBFILTER = 1 << 1;
+
+    /**
+     * A Ff flag.
+     */
+    public static final int FLAG_V = 1 << 2;
+
+    /**
+     * A Ff flag.
+     */
+    public static final int FLAG_REASON = 1 << 3;
+
+    /**
+     * A Ff flag.
+     */
+    public static final int FLAG_LEGAL_ATTESTATION = 1 << 4;
+
+    /**
+     * A Ff flag.
+     */
+    public static final int FLAG_ADD_REV_INFO = 1 << 5;
+
+    /**
+     * A Ff flag.
+     */
+    public static final int FLAG_DIGEST_METHOD = 1 << 6;
+
+    private COSDictionary dictionary;
+
+    /**
+     * Default constructor.
+     */
+    public PDSeedValue()
+    {
+        dictionary = new COSDictionary();
+        dictionary.setItem(COSName.TYPE, COSName.SV);
+        dictionary.setDirect(true); // the specification claim to use direct objects
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param dict The signature dictionary.
+     */
+    public PDSeedValue(COSDictionary dict)
+    {
+        dictionary = dict;
+        dictionary.setDirect(true); // the specification claim to use direct objects
+    }
+
+
+    /**
+     * Convert this standard java object to a COS object.
+     *
+     * @return The cos object that matches this Java object.
+     */
+    public COSBase getCOSObject()
+    {
+        return getDictionary();
+    }
+
+    /**
+     * Convert this standard java object to a COS dictionary.
+     *
+     * @return The COS dictionary that matches this Java object.
+     */
+    public COSDictionary getDictionary()
+    {
+        return dictionary;
+    }
+
+    /**
+     *
+     * @return true if the Filter is required
+     */
+    public boolean isFilterRequired()
+    {
+        return BitFlagHelper.getFlag(getDictionary(), COSName.FF, FLAG_FILTER);
+    }
+
+    /**
+     * set true if the filter shall be required.
+     * 
+     * @param flag if true, the specified Filter shall be used when signing.
+     */
+    public void setFilterRequired(boolean flag)
+    {
+        BitFlagHelper.setFlag(getDictionary(), COSName.FF, FLAG_FILTER, flag);
+    }
+
+    /**
+     *
+     * @return true if the SubFilter is required
+     */
+    public boolean isSubFilterRequired()
+    {
+        return BitFlagHelper.getFlag(getDictionary(), COSName.FF, FLAG_SUBFILTER);
+    }
+
+    /**
+     * set true if the subfilter shall be required.
+     * 
+     * @param flag if true, the first supported SubFilter in the array shall be used when signing.
+     */
+    public void setSubFilterRequired(boolean flag)
+    {
+        BitFlagHelper.setFlag(getDictionary(), COSName.FF, FLAG_SUBFILTER, flag);
+    }
+
+    /**
+    *
+    * @return true if the DigestMethod is required
+    */
+    public boolean isDigestMethodRequired()
+    {
+        return BitFlagHelper.getFlag(getDictionary(), COSName.FF, FLAG_DIGEST_METHOD);
+    }
+
+    /**
+     * set true if the DigestMethod shall be required.
+     * 
+     * @param flag if true, one digest from the array shall be used.
+     */
+    public void setDigestMethodRequired(boolean flag)
+    {
+        BitFlagHelper.setFlag(getDictionary(), COSName.FF, FLAG_DIGEST_METHOD, flag);
+    }
+
+    /**
+    *
+    * @return true if the V entry is required
+    */
+    public boolean isVRequired()
+    {
+        return BitFlagHelper.getFlag(getDictionary(), COSName.FF, FLAG_V);
+    }
+
+    /**
+     * set true if the V entry shall be required.
+     * 
+     * @param flag if true, the V entry shall be used.
+     */
+    public void setVRequired(boolean flag)
+    {
+        BitFlagHelper.setFlag(getDictionary(), COSName.FF, FLAG_V, flag);
+    }
+
+    /**
+    *
+    * @return true if the Reason is required
+    */
+    public boolean isReasonRequired()
+    {
+        return BitFlagHelper.getFlag(getDictionary(), COSName.FF, FLAG_REASON);
+    }
+
+    /**
+     * set true if the Reason shall be required.
+     * 
+     * @param flag if true, the Reason entry shall be used.
+     */
+    public void setReasonRequired(boolean flag)
+    {
+        BitFlagHelper.setFlag(getDictionary(), COSName.FF, FLAG_REASON, flag);
+    }
+
+    /**
+    *
+    * @return true if the LegalAttestation is required
+    */
+    public boolean isLegalAttestationRequired()
+    {
+        return BitFlagHelper.getFlag(getDictionary(), COSName.FF, FLAG_LEGAL_ATTESTATION);
+    }
+
+    /**
+     * set true if the LegalAttestation shall be required.
+     * 
+     * @param flag if true, the LegalAttestation entry shall be used.
+     */
+    public void setLegalAttestationRequired(boolean flag)
+    {
+        BitFlagHelper.setFlag(getDictionary(), COSName.FF, FLAG_LEGAL_ATTESTATION, flag);
+    }
+
+    /**
+    *
+    * @return true if the AddRevInfo is required
+    */
+    public boolean isAddRevInfoRequired()
+    {
+        return BitFlagHelper.getFlag(getDictionary(), COSName.FF, FLAG_ADD_REV_INFO);
+    }
+
+    /**
+     * set true if the AddRevInfo shall be required.
+     * 
+     * @param flag if true, the AddRevInfo shall be used.
+     */
+    public void setAddRevInfoRequired(boolean flag)
+    {
+        BitFlagHelper.setFlag(getDictionary(), COSName.FF, FLAG_ADD_REV_INFO, flag);
+    }
+
+    /**
+     * If <b>Filter</b> is not null and the {@link #isFilterRequired()} indicates this entry is a
+     * required constraint, then the signature handler specified by this entry shall be used when
+     * signing; otherwise, signing shall not take place. If {@link #isFilterRequired()} indicates
+     * that this is an optional constraint, this handler may be used if it is available. If it is
+     * not available, a different handler may be used instead.
+     *
+     * @return the filter that shall be used by the signature handler
+     */
+    public String getFilter()
+    {
+        return dictionary.getNameAsString(COSName.FILTER);
+    }
+
+    /**
+     * (Optional) The signature handler that shall be used to sign the signature field.
+     *
+     * @param filter is the filter that shall be used by the signature handler
+     */
+    public void setFilter(COSName filter)
+    {
+        dictionary.setItem(COSName.FILTER, filter);
+    }
+
+    /**
+     * If <b>SubFilter</b> is not null and the {@link #isSubFilterRequired()} indicates this
+     * entry is a required constraint, then the first matching encodings shall be used when
+     * signing; otherwise, signing shall not take place. If {@link #isSubFilterRequired()}
+     * indicates that this is an optional constraint, then the first matching encoding shall
+     * be used if it is available. If it is not available, a different encoding may be used
+     * instead.
+     *
+     * @return the subfilter that shall be used by the signature handler
+     */
+    public List<String> getSubFilter()
+    {
+        List<String> retval = null;
+        COSArray fields = (COSArray)dictionary.getDictionaryObject(COSName.SUBFILTER);
+
+        if (fields != null)
+        {
+            List<String> actuals = new ArrayList<String>();
+            for ( int i = 0; i < fields.size(); i++ )
+            {
+                String element = fields.getName(i);
+                if (element != null)
+                {
+                    if (element != null)
+                    {
+                        actuals.add(element);
+                    }
+                }
+            }
+            retval = new COSArrayList(actuals, fields);
+        }
+        return retval;
+    }
+
+    /**
+     * (Optional) An array of names indicating encodings to use when signing. The first name
+     * in the array that matches an encoding supported by the signature handler shall be the
+     * encoding that is actually used for signing.
+     *
+     * @param subfilter is the name that shall be used for encoding
+     */
+    public void setSubFilter(List<COSName> subfilter)
+    {
+        dictionary.setItem(COSName.SUBFILTER, COSArrayList.converterToCOSArray(subfilter));
+    }
+
+    /**
+     * An array of names indicating acceptable digest algorithms to use when
+     * signing. The value shall be one of <b>SHA1</b>, <b>SHA256</b>, <b>SHA384</b>,
+     * <b>SHA512</b>, <b>RIPEMD160</b>. The default value is implementation-specific.
+     *
+     * @return the digest method that shall be used by the signature handler
+     */
+    public List<String> getDigestMethod()
+    {
+        List<String> retval = null;
+        COSArray fields = (COSArray)dictionary.getDictionaryObject(COSName.DIGEST_METHOD);
+
+        if (fields != null)
+        {
+            List<String> actuals = new ArrayList<String>();
+            for ( int i = 0; i < fields.size(); i++ )
+            {
+                String element = fields.getName(i);
+                if (element != null)
+                {
+                    if (element != null)
+                    {
+                        actuals.add(element);
+                    }
+                }
+            }
+            retval = new COSArrayList(actuals, fields);
+        }
+        return retval;
+    }
+
+    /**
+     * <p>(Optional, PDF 1.7) An array of names indicating acceptable digest
+     * algorithms to use when signing. The value shall be one of <b>SHA1</b>,
+     * <b>SHA256</b>, <b>SHA384</b>, <b>SHA512</b>, <b>RIPEMD160</b>. The default
+     * value is implementation-specific.</p>
+     *
+     * <p>This property is only applicable if the digital credential signing contains RSA
+     * public/privat keys</p>
+     *
+     * @param digestMethod is a list of possible names of the digests, that should be
+     * used for signing.
+     */
+    public void setDigestMethod(List<COSName> digestMethod)
+    {
+        // integrity check
+        for ( COSName cosName : digestMethod )
+        {
+            if (!(cosName.equals(COSName.DIGEST_SHA1) 
+                    || cosName.equals(COSName.DIGEST_SHA256)
+                    || cosName.equals(COSName.DIGEST_SHA384)
+                    || cosName.equals(COSName.DIGEST_SHA512)
+                    || cosName.equals(COSName.DIGEST_RIPEMD160)))
+            {
+                throw new IllegalArgumentException("Specified digest " + cosName.getName() + " isn't allowed.");
+            }
+        }
+        dictionary.setItem(COSName.DIGEST_METHOD, COSArrayList.converterToCOSArray(digestMethod));
+    }
+
+    /**
+     * The minimum required capability of the signature field seed value
+     * dictionary parser. A value of 1 specifies that the parser shall be able to
+     * recognize all seed value dictionary entries in a PDF 1.5 file. A value of 2
+     * specifies that it shall be able to recognize all seed value dictionary entries
+     * specified.
+     *
+     * @return the minimum required capability of the signature field seed value
+     * dictionary parser
+     */
+    public float getV()
+    {
+        return dictionary.getFloat(COSName.V);
+    }
+
+    /**
+     * (Optional) The minimum required capability of the signature field seed value
+     * dictionary parser. A value of 1 specifies that the parser shall be able to
+     * recognize all seed value dictionary entries in a PDF 1.5 file. A value of 2
+     * specifies that it shall be able to recognize all seed value dictionary entries
+     * specified.
+     *
+     * @param minimumRequiredCapability is the minimum required capability of the
+     * signature field seed value dictionary parser
+     */
+    public void setV(float minimumRequiredCapability)
+    {
+        dictionary.setFloat(COSName.V, minimumRequiredCapability);
+    }
+
+    /**
+     * If the Reasons array is provided and {@link #isReasonRequired()} indicates that
+     * Reasons is a required constraint, one of the reasons in the array shall be used
+     * for the signature dictionary; otherwise signing shall not take place. If the
+     * {@link #isReasonRequired()} indicates Reasons is an optional constraint, one of
+     * the reasons in the array may be chose or a custom reason can be provided.
+     *
+     * @return the reasons that should be used by the signature handler
+     */
+    public List<String> getReasons()
+    {
+        List<String> retval = null;
+        COSArray fields = (COSArray)dictionary.getDictionaryObject(COSName.REASONS);
+
+        if (fields != null)
+        {
+            List<String> actuals = new ArrayList<String>();
+            for ( int i = 0; i < fields.size(); i++ )
+            {
+                String element = fields.getString(i);
+                if (element != null)
+                {
+                    if (element != null)
+                    {
+                        actuals.add(element);
+                    }
+                }
+            }
+            retval = new COSArrayList(actuals, fields);
+        }
+        return retval;
+    }
+
+    /**
+     * (Optional) An array of text strings that specifying possible reasons for signing
+     * a document. If specified, the reasons supplied in this entry replace those used
+     * by conforming products.
+     *
+     * @param reasons is a list of possible text string that specifying possible reasons
+     */
+    public void setReasonsd(List<String> reasons)
+    {
+        dictionary.setItem(COSName.REASONS, COSArrayList.converterToCOSArray(reasons));
+    }
+
+    /**
+     * <p>(Optional; PDF 1.6) A dictionary containing a single entry whose key is P
+     * and whose value is an integer between 0 and 3. A value of 0 defines the
+     * signatures as an author signature. The value 1 through 3 shall be used for
+     * certification signatures and correspond to the value of P in a DocMDP transform
+     * parameters dictionary.</p>
+     *
+     * <p>If this MDP key is not present or the MDP dictionary does not contain a P
+     * entry, no rules shall be defined regarding the type of signature or its
+     * permissions.</p>
+     *
+     * @return the mdp dictionary as PDSeedValueMDP
+     */
+    public PDSeedValueMDP getMDP()
+    {
+        COSDictionary dict = (COSDictionary)dictionary.getDictionaryObject(COSName.MDP);
+        PDSeedValueMDP mdp = null;
+        if (dict != null)
+        {
+            mdp = new PDSeedValueMDP(dict);
+        }
+        return mdp;
+    }
+
+    /**
+     * <p>(Optional; PDF 1.6) A dictionary containing a single entry whose key is P
+     * and whose value is an integer between 0 and 3. A value of 0 defines the
+     * signatures as an author signature. The value 1 through 3 shall be used for
+     * certification signatures and correspond to the value of P in a DocMDP transform
+     * parameters dictionary.</p>
+     *
+     * <p>If this MDP key is not present or the MDP dictionary does not contain a P
+     * entry, no rules shall be defined regarding the type of signature or its
+     * permissions.</p>
+     *
+     * @param mdp dictionary
+     */
+    public void setMPD(PDSeedValueMDP mdp)
+    {
+        if (mdp != null)
+        {
+            dictionary.setItem(COSName.MDP, mdp.getCOSObject());
+        }
+    }
+
+    /**
+     * <p>(Optional; PDF 1.6) A time stamp dictionary containing two entries. URL which
+     * is a ASCII string specifying the URL to a rfc3161 conform timestamp server and Ff
+     * to indicate if a timestamp is required or optional.</p>
+     *
+     * @return the timestamp dictionary as PDSeedValueTimeStamp
+     */
+    public PDSeedValueTimeStamp getTimeStamp()
+    {
+        COSDictionary dict = (COSDictionary)dictionary.getDictionaryObject(COSName.TIME_STAMP);
+        PDSeedValueTimeStamp timestamp = null;
+        if (dict != null)
+        {
+            timestamp = new PDSeedValueTimeStamp(dict);
+        }
+        return timestamp;
+    }
+
+    /**
+     * <p>(Optional; PDF 1.6) A time stamp dictionary containing two entries. URL which
+     * is a ASCII string specifying the URL to a rfc3161 conform timestamp server and Ff
+     * to indicate if a timestamp is required or optional.</p>
+     *
+     * @param timestamp dictionary
+     */
+    public void setTimeStamp(PDSeedValueTimeStamp timestamp)
+    {
+        if (timestamp != null)
+        {
+            dictionary.setItem(COSName.TIME_STAMP, timestamp.getCOSObject());
+        }
+    }
+
+    /**
+     * (Optional, PDF 1.6) An array of text strings that specifying possible legal
+     * attestations.
+     *
+     * @return the reasons that should be used by the signature handler
+     */
+    public List<String> getLegalAttestation()
+    {
+        List<String> retval = null;
+        COSArray fields = (COSArray)dictionary.getDictionaryObject(COSName.LEGAL_ATTESTATION);
+
+        if (fields != null)
+        {
+            List<String> actuals = new ArrayList<String>();
+            for ( int i = 0; i < fields.size(); i++ )
+            {
+                String element = fields.getString(i);
+                if (element != null)
+                {
+                    if (element != null)
+                    {
+                        actuals.add(element);
+                    }
+                }
+            }
+            retval = new COSArrayList(actuals, fields);
+        }
+        return retval;
+    }
+
+    /**
+     * (Optional, PDF 1.6) An array of text strings that specifying possible legal
+     * attestations.
+     *
+     * @param legalAttestation is a list of possible text string that specifying possible
+     * legal attestations.
+     */
+    public void setLegalAttestation(List<String> legalAttestation)
+    {
+        dictionary.setItem(COSName.LEGAL_ATTESTATION, COSArrayList.converterToCOSArray(legalAttestation));
+    }
+}

Propchange: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDSeedValue.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDSeedValueMDP.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDSeedValueMDP.java?rev=1451638&view=auto
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDSeedValueMDP.java (added)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDSeedValueMDP.java Fri Mar  1 16:33:56 2013
@@ -0,0 +1,102 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pdfbox.pdmodel.interactive.digitalsignature;
+
+import org.apache.pdfbox.cos.COSBase;
+import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.cos.COSName;
+
+/**
+ * <p>This MDP dictionary is a part of the seed value dictionary and define
+ * if a author signature or a certification signature should be use.</p>
+ *
+ * <p>For more informations, consider the spare documented chapter in the seed
+ * value dictionary in the ISO 32000 specification.</p>
+ *
+ * @author Thomas Chojecki
+ * @version $Revision: 1.1 $
+ */
+public class PDSeedValueMDP
+{
+
+    private COSDictionary dictionary;
+
+    /**
+     * Default constructor.
+     */
+    public PDSeedValueMDP()
+    {
+        dictionary = new COSDictionary();
+        dictionary.setDirect(true);
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param dict The signature dictionary.
+     */
+    public PDSeedValueMDP(COSDictionary dict)
+    {
+        dictionary = dict;
+        dictionary.setDirect(true);
+    }
+
+
+    /**
+     * Convert this standard java object to a COS object.
+     *
+     * @return The cos object that matches this Java object.
+     */
+    public COSBase getCOSObject()
+    {
+        return getDictionary();
+    }
+
+    /**
+     * Convert this standard java object to a COS dictionary.
+     *
+     * @return The COS dictionary that matches this Java object.
+     */
+    public COSDictionary getDictionary()
+    {
+        return dictionary;
+    }
+
+    /**
+     * Return the P value.
+     * 
+     * @return the P value
+     */
+    public int getP()
+    {
+        return dictionary.getInt(COSName.P);
+    }
+
+    /**
+     * Set the P value.
+     * 
+     * @param p the value to be set as P
+     */
+    public void setP(int p)
+    {
+        if (p < 0 || p > 3)
+        {
+            throw new IllegalArgumentException("Only values between 0 and 3 nare allowed.");
+        }
+        dictionary.setInt(COSName.P, p);
+    }
+}

Propchange: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDSeedValueMDP.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDSeedValueTimeStamp.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDSeedValueTimeStamp.java?rev=1451638&view=auto
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDSeedValueTimeStamp.java (added)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDSeedValueTimeStamp.java Fri Mar  1 16:33:56 2013
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pdfbox.pdmodel.interactive.digitalsignature;
+
+import org.apache.pdfbox.cos.COSBase;
+import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.cos.COSName;
+
+/**
+ * If exist, it describe where the signature handler can request a rfc3161
+ * timestamp and if it is a must have for the signature.
+ *
+ * @author Thomas Chojecki
+ * @version $Revision: 1.1 $
+ */
+public class PDSeedValueTimeStamp
+{
+
+    private COSDictionary dictionary;
+
+    /**
+     * Default constructor.
+     */
+    public PDSeedValueTimeStamp()
+    {
+        dictionary = new COSDictionary();
+        dictionary.setDirect(true);
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param dict The signature dictionary.
+     */
+    public PDSeedValueTimeStamp(COSDictionary dict)
+    {
+        dictionary = dict;
+        dictionary.setDirect(true);
+    }
+
+
+    /**
+     * Convert this standard java object to a COS object.
+     *
+     * @return The cos object that matches this Java object.
+     */
+    public COSBase getCOSObject()
+    {
+        return getDictionary();
+    }
+
+    /**
+     * Convert this standard java object to a COS dictionary.
+     *
+     * @return The COS dictionary that matches this Java object.
+     */
+    public COSDictionary getDictionary()
+    {
+        return dictionary;
+    }
+
+    /**
+     * Returns the URL.
+     * 
+     * @return the URL
+     */
+    public String getURL()
+    {
+        return dictionary.getString(COSName.URL);
+    }
+
+    /**
+     * Sets the URL.
+     * @param url the URL to be set as URL
+     */
+    public void setURL(String url)
+    {
+        dictionary.setString(COSName.URL, url);
+    }
+
+    /**
+     * Indicates if a timestamp is required.
+     * 
+     * @return true if a timestamp is required
+     */
+    public boolean isTimestampRequired()
+    {
+        return dictionary.getInt(COSName.FT, 0) != 0;
+    }
+
+    /**
+     * Sets if a timestamp is reuqired or not.
+     * 
+     * @param flag true if a timestamp is required
+     */
+    public void setTimestampRequired(boolean flag)
+    {
+        dictionary.setInt(COSName.FT, flag ? 1 : 0);
+    }
+}

Propchange: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDSeedValueTimeStamp.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDSignature.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDSignature.java?rev=1451638&r1=1451637&r2=1451638&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDSignature.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/PDSignature.java Fri Mar  1 16:33:56 2013
@@ -121,6 +121,21 @@ public class PDSignature implements COSO
     return dictionary;
   }
 
+  /**
+   * Set the dictionary type.
+   *
+   * @param type is the dictionary type.
+   */
+  public void setType(COSName type)
+  {
+    dictionary.setItem(COSName.TYPE, type);
+  }
+  
+  /**
+   * Set the filter.
+   * 
+   * @param filter the filter to be used
+   */
   public void setFilter(COSName filter)
   {
     dictionary.setItem(COSName.FILTER, filter);
@@ -136,56 +151,123 @@ public class PDSignature implements COSO
     dictionary.setItem(COSName.SUBFILTER, subfilter);
   }
 
+  /**
+   * Sets the name.
+   * @param name the name to be used
+   */
   public void setName(String name)
   {
     dictionary.setString(COSName.NAME, name);
   }
 
+  /**
+   * Sets the location.
+   * @param location the location to be used
+   */
   public void setLocation(String location)
   {
     dictionary.setString(COSName.LOCATION, location);
   }
 
+  /**
+   * Sets the reason.
+   * 
+   * @param reason the reason to be used
+   */
   public void setReason(String reason)
   {
     dictionary.setString(COSName.REASON, reason);
   }
 
+  /**
+   * Sets the contact info.
+   * 
+   * @param contactInfo the contact info to be used
+   */
+  public void setContactInfo(String contactInfo)
+  {
+    dictionary.setString(COSName.CONTACT_INFO, contactInfo);
+  }
+
+  /**
+   * Set the sign date.
+   * 
+   * @param cal the date to be used as sign date
+   */
   public void setSignDate(Calendar cal)
   {
-    dictionary.setDate("M", cal);
+    dictionary.setDate(COSName.M, cal);
   }
 
+  /**
+   * Returns the filter.
+   * @return the filter
+   */
   public String getFilter()
   {
-    return ((COSName)dictionary.getItem(COSName.FILTER)).getName();
+    return dictionary.getNameAsString(COSName.FILTER);
   }
 
+  /**
+   * Returns the subfilter.
+   * 
+   * @return the subfilter
+   */
   public String getSubFilter()
   {
-    return ((COSName)dictionary.getItem(COSName.SUBFILTER)).getName();
+    return dictionary.getNameAsString(COSName.SUBFILTER);
   }
 
+  /**
+   * Returns the name.
+   * 
+   * @return the name
+   */
   public String getName()
   {
     return dictionary.getString(COSName.NAME);
   }
 
+  /**
+   * Returns the location.
+   * 
+   * @return the location
+   */
   public String getLocation()
   {
     return dictionary.getString(COSName.LOCATION);
   }
 
+  /**
+   * Returns the reason.
+   * 
+   * @return the reason
+   */
   public String getReason()
   {
     return dictionary.getString(COSName.REASON);
   }
 
+  /**
+   * Returns the contact info.
+   * 
+   * @return teh contact info
+   */
+  public String getContactInfo()
+  {
+    return dictionary.getString(COSName.CONTACT_INFO);
+  }
+
+  /**
+   * Returns the sign date.
+   * 
+   * @return the sign date
+   */
   public Calendar getSignDate()
   {
     try
     {
-      return dictionary.getDate("M");
+      return dictionary.getDate(COSName.M);
     }
     catch (IOException e)
     {
@@ -193,32 +275,39 @@ public class PDSignature implements COSO
     }
   }
 
+  /**
+   * Sets the byte range.
+   * 
+   * @param range the byte range to be used
+   */
   public void setByteRange(int[] range) 
   {
     if (range.length!=4)
+    {
       return;
-
+    }
     COSArray ary = new COSArray();
     for ( int i : range )
     {
       ary.add(COSInteger.get(i));
     }
     
-    dictionary.setItem("ByteRange", ary);
+    dictionary.setItem(COSName.BYTERANGE, ary);
   }
 
   /**
-   * Read out the byterange from the file
+   * Read out the byterange from the file.
    * 
    * @return a integer array with the byterange
    */
   public int[] getByteRange()
   {
-    COSArray byteRange = (COSArray)dictionary.getDictionaryObject("ByteRange");
+    COSArray byteRange = (COSArray)dictionary.getDictionaryObject(COSName.BYTERANGE);
     int[] ary = new int[byteRange.size()];
     for (int i = 0; i<ary.length;++i)
+    {
       ary[i] = byteRange.getInt(i);
-    
+    }
     return ary;
   }
   
@@ -263,23 +352,34 @@ public class PDSignature implements COSO
     {
       // Filter < and (
       if(buffer[0]==0x3C || buffer[0]==0x28)
+      {
         byteOS.write(buffer, 1, c);
+      }
       // Filter > and )
       else if(buffer[c-1]==0x3E || buffer[c-1]==0x29)
+      {
         byteOS.write(buffer, 0, c-1);
-      else 
+      }
+      else
+      {
         byteOS.write(buffer, 0, c);
+      }
     }
     fis.close();
     
     return COSString.createFromHexString(byteOS.toString()).getBytes();
   }
   
+  /**
+   * Sets the contents.
+   * 
+   * @param bytes contents to be used
+   */
   public void setContents(byte[] bytes)
   {
     COSString string = new COSString(bytes);
     string.setForceHexForm(true);
-    dictionary.setItem("Contents", string);
+    dictionary.setItem(COSName.CONTENTS, string);
   }
   
   /**
@@ -291,18 +391,20 @@ public class PDSignature implements COSO
    */
   public byte[] getSignedContent(InputStream pdfFile) throws IOException
   {
-    COSFilterInputStream fis=null;
-    
-    try 
-    {
-    fis = new COSFilterInputStream(pdfFile,getByteRange());
-    return fis.toByteArray();
-    } 
-    finally 
-    {
-      if (fis != null)
-        fis.close();
-    }
+      COSFilterInputStream fis=null;
+      
+      try 
+      {
+          fis = new COSFilterInputStream(pdfFile,getByteRange());
+          return fis.toByteArray();
+      }
+      finally
+      {
+          if (fis != null)
+          {
+              fis.close();
+          }
+      }
   }
   
   /**
@@ -314,17 +416,45 @@ public class PDSignature implements COSO
    */
   public byte[] getSignedContent(byte[] pdfFile) throws IOException
   {
-    COSFilterInputStream fis=null;
-    
-    try 
-    {
-    fis = new COSFilterInputStream(pdfFile,getByteRange());
-    return fis.toByteArray();
-    } 
-    finally 
-    {
-      if (fis != null)
-        fis.close();
-    }
+      COSFilterInputStream fis=null;
+      try 
+      {
+          fis = new COSFilterInputStream(pdfFile,getByteRange());
+          return fis.toByteArray();
+      } 
+      finally 
+      {
+          if (fis != null)
+          {
+              fis.close();
+          }
+      }
+  }
+
+  /**
+   * PDF signature build dictionary. Provides informations about the signature handler.
+   *
+   * @return the pdf signature build dictionary.
+   */
+  public PDPropBuild getPropBuild()
+  {
+      PDPropBuild propBuild = null;
+      COSDictionary propBuildDic = (COSDictionary)dictionary.getDictionaryObject(COSName.PROP_BUILD);
+      if (propBuildDic != null)
+      {
+          propBuild = new PDPropBuild(propBuildDic);
+      }
+      return propBuild;
+  }
+
+  /**
+   * PDF signature build dictionary. Provides informations about the signature handler.
+   *
+   * @param propBuild the prop build
+   */
+      public void setPropBuild(PDPropBuild propBuild)
+  {
+    dictionary.setItem(COSName.PROP_BUILD, propBuild);
   }
 }
+

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDSignatureField.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDSignatureField.java?rev=1451638&r1=1451637&r2=1451638&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDSignatureField.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/form/PDSignatureField.java Fri Mar  1 16:33:56 2013
@@ -20,6 +20,7 @@ import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget;
+import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSeedValue;
 import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature;
 
 import java.io.IOException;
@@ -48,7 +49,7 @@ public class PDSignatureField extends PD
     {
         super(theAcroForm,field);
         // dirty hack to avoid npe caused through getWidget() method
-        getDictionary().setName( COSName.TYPE, "Annot" );
+        getDictionary().setItem( COSName.TYPE, COSName.ANNOT );
         getDictionary().setName( COSName.SUBTYPE, PDAnnotationWidget.SUB_TYPE);
     }
 
@@ -57,22 +58,23 @@ public class PDSignatureField extends PD
      *
      * @param theAcroForm The acroForm for this field.
      * @throws IOException If there is an error while resolving partial name for the signature field
+     *         or getting the widget object.
      */
     public PDSignatureField( PDAcroForm theAcroForm) throws IOException
     {
         super( theAcroForm );
-        getDictionary().setName("FT", "Sig");
+        getDictionary().setItem(COSName.FT, COSName.SIG);
         getWidget().setLocked(true);
         getWidget().setPrinted(true);
         setPartialName(generatePartialName());
-        getDictionary().setName( COSName.TYPE, "Annot" );
+        getDictionary().setItem( COSName.TYPE, COSName.ANNOT );
         getDictionary().setName( COSName.SUBTYPE, PDAnnotationWidget.SUB_TYPE);
     }
     
     /**
-     * Generate a unique name for the signature
+     * Generate a unique name for the signature.
      * @return
-     * @throws IOException
+     * @throws IOException If there is an error while getting the list of fields.
      */
     private String generatePartialName() throws IOException
     {
@@ -93,8 +95,9 @@ public class PDSignatureField extends PD
       }
 
       while(sigNames.contains(fieldName+i))
+      {
         ++i;
-      
+      }
       return fieldName+i;
     }
     
@@ -140,17 +143,17 @@ public class PDSignatureField extends PD
     }
     
     /**
-     * Add a signature dictionary to the signature field
+     * Add a signature dictionary to the signature field.
      * 
      * @param value is the PDSignature 
      */
     public void setSignature(PDSignature value) 
     {
-      getDictionary().setItem("V", value);
+      getDictionary().setItem(COSName.V, value);
     }
     
     /**
-     * Get the signature dictionary 
+     * Get the signature dictionary.
      * 
      * @return the signature dictionary
      * 
@@ -159,7 +162,42 @@ public class PDSignatureField extends PD
     {
       COSBase dictionary = getDictionary().getDictionaryObject(COSName.V);
       if (dictionary == null)
-        return null;
+      {
+          return null;
+      }
       return new PDSignature((COSDictionary)dictionary);
     }
+
+    /**
+     * <p>(Optional; PDF 1.5) A seed value dictionary containing information
+     * that constrains the properties of a signature that is applied to the
+     * field.</p>
+     *
+     * @return the seed value dictionary as PDSeedValue
+     */
+    public PDSeedValue getSeedValue()
+    {
+      COSDictionary dict = (COSDictionary)getDictionary().getDictionaryObject(COSName.SV);
+      PDSeedValue sv = null;
+      if (dict != null)
+      {
+          sv = new PDSeedValue(dict);
+      }
+      return sv;
+    }
+
+    /**
+     * <p>(Optional; PDF 1.) A seed value dictionary containing information
+     * that constrains the properties of a signature that is applied to the
+     * field.</p>
+     *
+     * @param sv is the seed value dictionary as PDSeedValue
+     */
+    public void setSeedValue(PDSeedValue sv)
+    {
+      if (sv != null)
+      {
+          getDictionary().setItem(COSName.SV, sv.getCOSObject());
+      }
+    }
 }