如何在C#中使用iTextsharp检查PDF文件是否已签名?

-1 c# asp.net sign itext asp.net-mvc-4

我有一个PDF文件,我想检查它是否通过数字签名签名.使用iTextsharp,C#中的代码.

mkl*_*mkl 7

我建议看看官方的例子.

它们包含例如"SignatureInfo"的示例,其输出嵌入在PDF中的所有签名的多个信息项; 因此,他们特别确定文件是否完全签名.


你使用的是iTextSharp 5.5.x,你的关键代码就是这个

public void InspectSignatures(String path) {
    Console.WriteLine(path);
    PdfReader reader = new PdfReader(path);
    AcroFields fields = reader.AcroFields;
    List<String> names = fields.GetSignatureNames();
    SignaturePermissions perms = null;
    foreach (String name in names) {
        Console.WriteLine("===== " + name + " =====");
        perms = InspectSignature(fields, name, perms);
    }
    Console.WriteLine();
}
Run Code Online (Sandbox Code Playgroud)

(来自iTextSharp示例C5_02_SignatureInfo.cs)

如您所见,该方法AcroFields.GetSignatureNames()可以获取所有签名签名字段的名称.如果该列表非空,则PDF已签名.


如果您使用iText 7 for .Net,您的关键代码是:

public virtual void InspectSignatures(String path)
{
    // System.out.println(path);
    PdfDocument pdfDoc = new PdfDocument(new PdfReader(path));
    PdfAcroForm form = PdfAcroForm.GetAcroForm(pdfDoc, false);
    SignaturePermissions perms = null;
    SignatureUtil signUtil = new SignatureUtil(pdfDoc);
    IList<String> names = signUtil.GetSignatureNames();
    foreach (String name in names)
    {
        System.Console.Out.WriteLine("===== " + name + " =====");
        perms = InspectSignature(pdfDoc, signUtil, form, name, perms);
    }
    System.Console.Out.WriteLine();
}
Run Code Online (Sandbox Code Playgroud)

(来自iText 7 for .Net示例C5_02_SignatureInfo.cs)

如您所见,该方法SignatureUtil.GetSignatureNames()可以获取所有签名签名字段的名称.如果该列表非空,则PDF已签名.


顺便说一句,正如您未进一步指定的那样,我假设您指的是常规的集成PDF签名,特别是没有分离的签名或XFA签名.