画像と署名情報の抽出

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 ファイルにデジタル署名する機能をサポートしています。現在、証明書の有効性は判定できますが、証明書全体を抽出することはできません。抽出可能な情報は公開鍵、サムプリント、発行者などです。

署名情報を抽出するために、ExtractCertificate メソッドを SignatureField クラスに導入しました。以下のコードスニペットは、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);
                }
            }
        }
    }
}

PdfFileSignature.TryExtractCertificate メソッドを使用して、証明書ストリームまたは X509Certificate2 オブジェクトを抽出できます。

ドキュメントの署名アルゴリズムに関する情報を取得できます。

// 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 構造内のオブジェクトが再配置され、元々署名されていた部分とされていなかった部分を判別できなくなることがあります。そのような場合、Absorber はドキュメントが非増分に変更されたことを示します。

ドキュメントが増分的に変更された場合は、変更箇所を検出できます。残念ながらページコンテンツストリームは圧縮されているため、ページ上のテキストのどの部分が正確に変更されたかを特定することはできず、Absorber はページ全体を変更済みとしてマークします。

追跡されるその他の変更:

  • フォームフィールドの変更
  • アノテーションの変更
  • 画像の変更
  • ページ上に表示される XForm の変更

アノテーション、フィールド、または XForm が外観に影響を与える形で変更された場合、Absorber はそれらの変更も報告します。
処理結果は UnsignedContentAbsorber.Result クラスで表されます。

1. UnsignedContentAbsorber.Result

PDF ドキュメントから署名されていないコンテンツの取得を試みた結果を表します。

Property Type Description
Success bool 操作が正常に完了し、署名されていないコンテンツが特定された場合(またはドキュメントに署名がない場合)に true が返されます。
UnsignedContent UnsignedContentAbsorber.UnsignedContent 署名でカバーされていない検出されたページ、フォームフィールド、XForm、アノテーションのコレクションを含むオブジェクトです。
Message string 結果を説明するテキストメッセージです。
Coverage SignaturesCoverage 署名のカバレッジレベル: UndefinedEntirelySignedPartiallySigned

2. UnsignedContentAbsorber.UnsignedContent

デジタル署名で カバーされていない PDF ドキュメント要素すべてを保持するコンテナです。
このクラスは Result 内で使用され、検出されたオブジェクトへの便利なアクセスを提供します。

Property Type Description
Pages List<Page> 署名でカバーされていない(または署名後に変更された)ページのリストです。ページが変更済みと見なされた場合、その XForm はチェックされず、XForm リストには表示されません。
Forms List<WidgetAnnotation> 署名なしで追加または変更されたフォームフィールド(テキストフィールド、チェックボックス等)のリストです。
XForms Dictionary<int, XForm> キーがページ番号、値が署名後に変更された XForm オブジェクトである辞書です。
Annotations Dictionary<int, Annotation> キーがページ番号、値が署名なしで変更されたアノテーションである辞書です。