3

一些插件和程序可以做到这一点;是否有任何示例或教程如何使用.net 和 itextSharp 做到这一点?

我需要获取签名的 pdf 并在所有页面上盖章图像,并添加另一个签名。打开文件时,文件上的第一个签名必须有效。

提前致谢。

4

2 回答 2

8

当您要求打开文件时文档上的第一个签名必须有效时,我假设您首先谈论的是在当前的 Adob​​e Reader 版本中打开。

在这种情况下,您首先必须知道允许和不允许的更改取决于第一个签名本身。请查看此答案以获取有关 Adob​​e 自 Acrobat & Reader 版本 9 以来考虑的“允许和不允许的更改”的信息。

因此,要获取签名的 pdf 并在所有页面上标记图像并添加另一个签名并且不使过程中的初始签名无效(在 Adob​​e 软件的眼中),签名的 pdf 必须

  • 要么是未经认证的(即初始签名只是一个批准签名)

  • 或通过批注、表格填写和数字签名进行认证,允许(即初始签名是允许进行这些类型更改的认证签名),并有一个空的签名字段供您输入签名。

如果该签名的 pdf 已经包含多个签名,则它们都不会通过 Locking 信息添加任何额外的限制。

(此外,我假设 PDF 既不加密也不包含动态 XFA 表单;这会使事情变得更加复杂。)

如果满足这些要求,您可以使用PdfStamper从静态PdfStamper方法中检索到的

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

最终bool参数值必须在哪里true(即您必须在附加模式下工作以不使初始签名无效)。

使用它PdfStamper,您可以通过注释将图像添加到文档页面上。iText in Action — 第 2 版示例TimetableAnnotations3.java / TimetableAnnotations3.cs说明了如何添加注释PdfStampers.

然后你像往常一样添加你的签名,要么创建一个新的签名字段,要么使用一个空的。您可以在PDF 文档的数字签名白皮书中找到有关签名过程的详细信息;可以在 sourceforge上找到与该白皮书中的 Java 示例等效的 C# 示例。

PS:我在这个帖子里一直强调Adobe软件的眼光。在谈论经过认证的 PDF 时,Adobe 非常接近此处的PDF 标准。对于已签名但未经认证的 PDF,Adobe 应用与为认证文档指定的规则类似的规则。

于 2013-07-26T07:51:51.140 回答
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
于 2014-08-06T11:25:57.100 回答