2013-07-25 79 views
3

一些插件和程序可以執行此操作;有沒有任何示例或教程如何使用.net和itextSharp做到這一點?如何在不破壞以前的簽名的情況下簽名並簽名pdf已註冊

我需要採取簽署的PDF格式,並在所有頁面上蓋印圖像,並添加另一個簽名。 打開文件時,文檔上的第一個簽名必須有效。

在此先感謝。

+1

標記圖像...通過註釋或在內容中?如果初始簽名禁止,則僅添加另一個簽名是個問題。 – mkl

回答

8

當您需要文檔上的第一個簽名在打開文件時必須有效,我假定您首先談論的是打開當前的Adobe Reader版本。

在這種情況下,您首先必須意識到允許和不允許的更改取決於第一個簽名本身。請參閱this answer以瞭解Adobe從Adobe Acrobat &閱讀器第9版開始考慮的「允許和禁止的更改」信息。

因此,採取簽名的PDF和所有頁面上印記的圖像,並且還添加其他簽名並不能否定(在Adobe軟件的眼)的過程中初始簽名,簽署PDF必須

  • 或者是未經(即初始簽名僅是批准簽名)

  • 或爲與註釋認證,形式填充在和數字簽名,允許(即初始簽名是允許這些類型的更改的認證簽名)並且有一個空的簽名字段供您簽署。

如果該簽名的pdf已經包含多個簽名,則它們都不會通過鎖定信息添加任何其他限制。

(而且我假定PDF既不是加密的,也不包含動態XFA表單;將事情變得更加複雜化。)

如果這些要求得到滿足,你可以使用PdfStamper你從靜態PdfStamper方法來檢索

public static PdfStamper CreateSignature(PdfReader reader, Stream os, char pdfVersion, string tempFile, bool append) 

,其中最終bool參數值必須是true(即你必須努力工作以追加模式不壞初始簽名)。

使用此PdfStamper,您可以通過註釋在文檔頁面上添加圖像。iText in Action — 2nd Edition樣品TimetableAnnotations3.java/TimetableAnnotations3.cs說明如何使用PdfStampers.

添加註釋然後添加你的簽名像往常一樣,無論是創建一個新的簽名域或使用空單。您可以在白皮書Digital Signatures for PDF documents中找到簽署過程的詳細信息;可以找到相當於該白皮書中Java樣本的C#樣本here on sourceforge。PS:我在這篇文章中總是強調在Adobe軟件的眼中。在談論認證PDF時,Adobe在這裏很接近PDF standard。對於已簽名但未經認證的PDF,Adobe適用的規則類似於爲認證文檔指定的規則。

+1

ossum,它適用於我...謝謝... –

1
Public Function sign(keystore As String, level As Integer, src As String, name As String, dest As String, sig As String, pass As String) 
    ' Try 
    'Dim store As System.Security.Cryptography.X509Certificates.X509Store = New System.Security.Cryptography.X509Certificates.X509Store 
    'store.Open(System.Security.Cryptography.X509Certificates.OpenFlags.ReadOnly) 
    'Dim sel As System.Security.Cryptography.X509Certificates.X509Certificate2Collection 

    ' If sig <> "" And pass <> "" Then 
    Try 
     Dim y As Int16 = 200 
     ' For i As Integer = 0 To sel.Count - 1 
     Dim pdfReader As PdfReader = New PdfReader(src) 
     Dim signedPdf = New FileStream(dest, FileMode.Create) 
     Try 
      Dim cert As X509Certificate2 = New X509Certificate2(sig, pass) 
      Dim cp As Org.BouncyCastle.X509.X509CertificateParser = New Org.BouncyCastle.X509.X509CertificateParser() 
      Dim chain As Org.BouncyCastle.X509.X509Certificate() = New Org.BouncyCastle.X509.X509Certificate() {cp.ReadCertificate(cert.RawData)} 




      Dim stamper As PdfStamper 
      stamper = PdfStamper.CreateSignature(pdfReader, signedPdf, "0"c, Nothing, True) 
      Dim signatureAppearance As PdfSignatureAppearance = stamper.SignatureAppearance 
      'signatureAppearance.SignatureGraphic = Image.GetInstance(pathToSignatureImage) 
      signatureAppearance.SetVisibleSignature(name) 

      signatureAppearance.CertificationLevel = level 
      Dim externalSignature As IExternalSignature = New X509Certificate2Signature(cert, "SHA-1") 
      ' Dim digest As IExternalSignature = New BouncyCastleDigest 
      ' signatureAppearance.s 
      'signatureAppearance.SetVisibleSignature(New Rectangle(50,50,50, 
      signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.NAME_AND_DESCRIPTION 
      MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, Nothing, Nothing, Nothing, 0, CryptoStandard.CADES) 
      ' MakeSignature. 

      ' End If 

      ' Catch ex As Exception 
      'MsgBox(ex.Message) 
      ' End Try 
     Catch ex As Exception 

      MsgBox("Signature File Password is not correct for the user Id :" & error_userid) 
      'Exit Function 
     End Try 
    Catch ex As Exception 

    End Try 
    Return 0 
End Function 
相關問題