提取图像和签名信息

The following code snippet also works with Aspose.PDF.Drawing library.

从签名字段提取图像

Aspose.PDF for .NET 支持使用 SignatureField 类对 PDF 文件进行数字签名,并且在签署文档时,您还可以为 SignatureAppearance 设置图像。现在,此 API 还提供了提取签名信息以及与签名字段关联的图像的功能。

为了提取签名信息,我们在 SignatureField 类中引入了 ExtractImage 方法。请查看以下代码片段,演示从 SignatureField 对象提取图像的步骤:

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ExtractImagesFromSignatureField()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();

    // Open PDF document
    using (var document = new Aspose.Pdf.Document(dataDir + "ExtractingImage.pdf"))
    {
        // Searching for signature fields
        foreach (var field in document.Form)
        {
            var sf = field as Aspose.Pdf.Forms.SignatureField;
            if (sf == null)
            {
                continue;
            }

            using (Stream imageStream = sf.ExtractImage())
            {
                if (imageStream != null)
                {
                    continue;
                }

                using (System.Drawing.Image image = System.Drawing.Bitmap.FromStream(imageStream))
                {
                    // Save the image
                    image.Save(dataDir + "output_out.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
                }
            }
        }
    }
}

提取签名信息

Aspose.PDF for .NET 支持使用 SignatureField 类对 PDF 文件进行数字签名。目前,我们也可以确定证书的有效性,但无法提取完整的证书。可以提取的信息包括公钥、指纹、颁发者等。

为了提取签名信息,我们在 SignatureField 类中引入了 ExtractCertificate 方法。请查看以下代码片段,演示从 SignatureField 对象提取证书的步骤:

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ExtractCertificate()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();

    // Open PDF document
    using (var document = new Aspose.Pdf.Document(dataDir + "ExtractSignatureInfo.pdf"))
    {
        // Searching for signature fields
        foreach (var field in document.Form)
        {
            var sf = field as Aspose.Pdf.Forms.SignatureField;
            if (sf == null)
            {
                continue;
            }
            // Extract certificate
            Stream cerStream = sf.ExtractCertificate();
            if (cerStream == null)
            {
                continue;
            }
            // Save certificate
            using (cerStream)
            {
                byte[] bytes = new byte[cerStream.Length];
                using (FileStream fs = new FileStream(dataDir + "input.cer", FileMode.CreateNew))
                {
                    cerStream.Read(bytes, 0, bytes.Length);
                    fs.Write(bytes, 0, bytes.Length);
                }
            }
        }
    }
}

You can use the PdfFileSignature.TryExtractCertificate method to extract a certificate stream or a X509Certificate2 object.

您可以获取文档签名算法的信息。

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private void GetSignaturesInfo()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();

    // Open PDF document
    using (var document = new Aspose.Pdf.Document(dataDir + "signed_rsa.pdf"))
    {
        using (var signature = new Aspose.Pdf.Facades.PdfFileSignature(document))
        {
            var sigNames = signature.GetSignatureNames();
            var signaturesInfoList =  signature.GetSignaturesInfo();
            foreach (var sigInfo in signaturesInfoList)
            {
                Console.WriteLine(sigInfo.DigestHashAlgorithm);
                Console.WriteLine(sigInfo.AlgorithmType);
                Console.WriteLine(sigInfo.CryptographicStandard);
                Console.WriteLine(sigInfo.SignatureName);
            }
        }
    }
}

上述示例的示例输出:

Sha256
Rsa
Pkcs7
Signature1

检查签名是否受损

您可以使用 SignaturesCompromiseDetector 类来验证数字签名是否受损。调用 Check() 方法检查文档的签名。如果未检测到签名受损,方法将返回 true。如果方法返回 false,您可以使用 HasCompromisedSignatures 属性检查是否存在受损签名,并通过 CompromisedSignatures 属性获取受损签名的列表。

要验证现有签名是否覆盖整个文档,请使用 SignaturesCoverage 属性。该属性可以具有以下值:

  • Undefined – 如果其中一个签名被明确标记为受损或覆盖检查失败。
  • EntirelySigned – 如果签名覆盖了整个文档。
  • PartiallySigned – 如果签名未覆盖整个文档且存在未签名的内容。

以下是保留 markdown 的翻译:


提取未签名内容

您可以使用 UnsignedContentAbsorber 类从文档中提取未签名的内容。如果已签名的文档被 非增量 修改,PDF 结构中的对象可能会重新排列,导致无法确定哪些部分最初已签名,哪些未签名。在这种情况下,吸收器将指示文档已被非增量修改。

如果文档是增量修改的,则我们可以检测出哪些内容已更改。遗憾的是,由于页面内容流被压缩,无法确定页面文本的具体哪一部分被更改,因此吸收器会将整页标记为已修改。

其他被跟踪的更改包括:

  • 对表单字段的更改
  • 对批注的更改
  • 对图像的更改
  • 对页面上显示的 XForm 的更改

如果批注、字段或 XForm 被修改且影响其外观,吸收器也会报告这些更改。处理结果由 UnsignedContentAbsorber.Result 类表示。

1. UnsignedContentAbsorber.Result

表示尝试从 PDF 文档获取未签名内容的结果。

属性 类型 描述
Success bool true 表示操作成功完成并已识别未签名内容(或文档没有签名)。
UnsignedContent UnsignedContentAbsorber.UnsignedContent 一个对象,包含未被签名覆盖的检测到的页面、表单字段、XForm 和批注的集合。
Message string 描述结果的文本信息。
Coverage SignaturesCoverage 签名的覆盖级别:UndefinedEntirelySignedPartiallySigned

2. UnsignedContentAbsorber.UnsignedContent

一个容器,保存所有未被数字签名 覆盖 的 PDF 文档元素。此类在 Result 中使用,并提供对检测对象的便捷访问。

属性 类型 描述
Pages List<Page> 一个页面列表,其内容未被签名覆盖(或在签名后被修改)。如果页面被视为已修改,则其 XForm 不会被检查,也不会出现在 XForms 列表中。
Forms List<WidgetAnnotation> 一个表单字段列表(文本字段、复选框等),这些字段在没有签名的情况下被添加或修改。
XForms Dictionary<int, XForm> 一个字典,键为页码,值为签名后被修改的 XForm 对象。
Annotations Dictionary<int, Annotation> 一个批注字典,键为页码,值为在没有签名的情况下被修改的批注。