Index: podofo/trunk/src/doc/PdfSignatureField.cpp
===================================================================
--- podofo/trunk/src/doc/PdfSignatureField.cpp	(revision 1701)
+++ podofo/trunk/src/doc/PdfSignatureField.cpp	(working copy)
@@ -151,4 +151,57 @@
     m_pSignatureObj->GetDictionary().AddKey(PdfName::KeyContents, PdfVariant(signatureData) );
 }
 
+void PdfSignatureField::SetSignatureLocation( const PdfString & rsText )
+{
+    if( !m_pSignatureObj )
+    {
+        PODOFO_RAISE_ERROR( ePdfError_InvalidHandle );
+    }
+    if(m_pSignatureObj->GetDictionary().HasKey(PdfName("Location")))
+    {
+        m_pSignatureObj->GetDictionary().RemoveKey(PdfName("Location"));
+    }
+    m_pSignatureObj->GetDictionary().AddKey(PdfName("Location"), rsText);
 }
+
+void PdfSignatureField::AddCerifiacionReference( PdfObject* pDocumentCatalog, EPdfCertPermission perm )
+{
+    if( !m_pSignatureObj )
+    {
+        PODOFO_RAISE_ERROR( ePdfError_InvalidHandle );
+    }
+
+    if (m_pSignatureObj->GetDictionary().HasKey(PdfName("Reference")))
+    {
+        m_pSignatureObj->GetDictionary().RemoveKey(PdfName("Reference"));
+    }
+
+    PdfObject *pSigRef = this->GetFieldObject()->GetOwner()->CreateObject( "SigRef" );
+    pSigRef->GetDictionary().AddKey(PdfName("TransformMethod"), PdfName("DocMDP"));
+
+    PdfObject *pTransParams = this->GetFieldObject()->GetOwner()->CreateObject( "TransformParams" );
+    pTransParams->GetDictionary().AddKey(PdfName("V"), PdfName("1.2"));
+    pTransParams->GetDictionary().AddKey(PdfName("P"), PdfVariant((pdf_int64)perm));
+    pSigRef->GetDictionary().AddKey(PdfName("TransformParams"), pTransParams);
+
+    if (pDocumentCatalog != NULL)
+    {
+        PdfObject permObject;
+        permObject.GetDictionary().AddKey("DocMDP", this->GetFieldObject()->GetDictionary().GetKey("V")->GetReference());
+
+        if (pDocumentCatalog->GetDictionary().HasKey(PdfName("Perms")))
+        {
+            pDocumentCatalog->GetDictionary().RemoveKey(PdfName("Perms"));
+        }
+
+        pDocumentCatalog->GetDictionary().AddKey(PdfName("Perms"), permObject);
+    }
+
+    PdfArray refers;
+    refers.push_back(*pSigRef);
+
+    m_pSignatureObj->GetDictionary().AddKey(PdfName("Reference"), PdfVariant(refers));
+}
+
+
+}
Index: podofo/trunk/src/doc/PdfSignatureField.h
===================================================================
--- podofo/trunk/src/doc/PdfSignatureField.h	(revision 1701)
+++ podofo/trunk/src/doc/PdfSignatureField.h	(working copy)
@@ -50,6 +50,13 @@
 
     void Init();
 public:
+
+    typedef enum {
+        ePdfCertPermission_NoPerms = 1,
+        ePdfCertPermission_FormFill = 2,
+        ePdfCertPermission_Annotations = 3,
+    } EPdfCertPermission;
+
     /** Create a new PdfSignatureField
      */
     PdfSignatureField( PdfPage* pPage, const PdfRect & rRect, PdfDocument* pDoc );
@@ -76,9 +83,22 @@
      */
     void SetSignatureReason(const PdfString & rsText);
 
+    /** Set location of the signature
+     *
+     *  \param rsText the location of signature
+     */
+    void SetSignatureLocation(const PdfString & rsText);
+
 	/** Date of signature
 	 */
 	void SetSignatureDate(const PdfDate &sigDate);
+
+    /** Add certification dictionaries and references to document catalog.
+     *
+     *  \param pDocumentCatalog the catalog of current document
+     *  \param perm document modification permission
+     */
+    void AddCerifiacionReference(PdfObject *pDocumentCatalog, EPdfCertPermission perm = ePdfCertPermission_NoPerms);
 };
 
 }
