Apryse の Java SDK を使用して PDF にデジタル署名を追加

現在、デジタル署名ほど普及しているものはありませんが、世界ではまだほとんどのドキュメントが物理的なペンと紙で署名されています。企業のプロセスがデジタル化されるにつれて、デジタル署名の成長は爆発的に増加し続け、アプリケーションがこのニーズをサポートすることがますます重要になっています。コンピュータ上で署名できる明らかな利点の他に、デジタル署名には、物理的な署名やインクと紙の署名の電子版といった、いくつかの利点があります。

  • 認証: デジタル署名により、署名者を正確に特定することができます。署名が有効であれば、ドキュメントを署名した人物を安全に特定できます。
  • 整合性: デジタル署名により、ドキュメントの内容が署名された後に変更されていないかを簡単に検証できます。
  • 否認不能性: デジタル署名により、署名者がドキュメントに署名したことを否定することができなくなります。

Apryse SDK は、デジタル署名を作成および管理するために使用できる強力なツールです。以下は、いくつかの利点です。

  • 署名フィールドのインポートおよびエクスポート: Apryse SDK は、XFDF/FDF ファイルから署名フィールドをインポートおよびエクスポートするために使用できます。これにより、既存のドキュメントワークフローに簡単に統合できます。
  • PKI 署名の組み込みサポート: Apryse SDK には PKI 署名 (および PFX デジタル証明書) の組み込みサポートが含まれています。これにより、安全で法的に拘束力のあるデジタル署名を簡単に作成できます。
  • カスタム署名ハンドラのサポート: Apryse SDK を使用すると、カスタム署名ハンドラを作成できます。これにより、デジタル署名の外観と動作をカスタマイズできます。
  • 画像、インク注釈、または完全にカスタムな外観で署名: Apryse SDK を使用すると、画像、インク注釈、または完全にカスタムな外観でドキュメントに署名できます。これにより、セキュリティが確保され、視覚的に魅力的なデジタル署名を作成できます。

まず初めに、電子署名とデジタル署名の重要な違いを知っておく必要があります。

電子署名とデジタル署名: 何が違うのでしょうか?

電子署名 (e-Signature) は、ドキュメントに表示される電子的な注釈です。著者のフィールド以外に、作成者に関する追加の識別可能な情報を含みません。この著者のフィールドは変更可能です。

デジタル署名は、より安全な電子署名の形式です。暗号アルゴリズムを使用して、ドキュメントの著者を一意に特定します。ドキュメントに対する変更は、注釈や電子署名を含めて、デジタル署名の検証を無効にします。

以下は、電子署名とデジタル署名の主な違いを要約しています。

特徴:
作成者に関する情報
セキュリティ
改ざん耐性
法的有効性

電子署名
著者フィールドのみ
安全性が低い
変更可能
管轄区域によって異なる

デジタル署名
著者の公開鍵
より安全
変更不可能
より広く受け入れられている

それでは、これらの違いを理解したところで、Apryse の Java SDK を使用して承認署名フィールドを追加し、すべてをデジタル署名する方法について説明していきます。

開発の準備

まず、Apryse 社のドキュメントにアクセスし、お使いのオペレーティング システム用の最新の SDK ビルドおよびテスト ファイルをダウンロードしてください。次に、ダウンロード後に無料で入手できるトライアル ライセンスを使用して、Apryse SDK を初期化します。詳細については、「はじめる」リンクを参照してください。

デジタル署名承認フィールドの追加

まず、ドキュメントに承認フィールドを追加する必要があります。これは、プロセスの次の参加者に、フィールドにデジタル署名する場所を示すために使用されます。

署名フィールドのない元のファイル

ファイルに直接署名ボックスを配置します。これは、ピクセル単位で高さと幅が設定された長方形になります。このコードは、PDF に署名注釈を配置し、出力を次の手順のために保存します。

// Initialize PDFNet
PDFNet.initialize(licenseKey);

// Open an existing PDF document
try (PDFDoc doc = new PDFDoc(input_file_path))
{
    // Create a signature field we can sign
    DigitalSignatureField approval_signature_field = doc.createDigitalSignatureField("ApryseApprovalSig");
    SignatureWidget widgetAnnotApproval = SignatureWidget.create(doc, new Rect(300, 287, 376, 306), approval_signature_field);

    // Add the signature widget to page 1 of the PDF
    Page page1 = doc.getPage(1);
    page1.annotPushBack(widgetAnnotApproval);

    // Save a new PDF with the signature field
    doc.save(output_file_path, SDFDoc.SaveMode.REMOVE_UNUSED, null);
}
catch (Exception e)
{
    System.err.println(e.getMessage());
    e.printStackTrace(System.err);
}

PDF に認定署名フィールドを追加

送信者と他の関係者の間に第三者が介在する特定のシナリオでは、認証局の使用が必須となります。ただし、使用ケースによっては、CA が利用できない場合や必要がない場合、代わりに自己署名証明書を使用できます。これは、Apryse のデジタル署名サンプルWebViewer デモで示されています。ただし、Apryse は CA サービスを提供していないため、特定の使用ケースで必要であれば、ユーザーが自身のデジタル署名ワークフローに CA を組み込む必要があります。

例として、PDF に証明書を追加します。まず、フィールドの権限をロックするために使用できるテキスト フィールドを追加する必要があります。また、一部の PDF エディターでは、そのフィールドをユーザーに分かりやすく適切に表示しない場合があるため、デジタル署名フィールドをウィジェットに追加することも重要です。ウィジェットの寸法を 0 に設定し、NoPrint/Invisible フラグを追加して不可視にします。次に、フィールド レベルの権限を制限された状態に設定し、ロゴをウィジェットに添付します。最後に、所在地、ウェブサイト、連絡先情報など、PDF の署名辞書に追加の情報を含めることができます。

// Open an existing PDF
PDFDoc doc = new PDFDoc(in_docpath);

Page page1 = doc.getPage(1);

// Create a text field that we can lock using the field permissions feature.
TextWidget annot1 = TextWidget.create(doc, new Rect(143, 440, 350, 460), "asdf_test_field");
page1.annotPushBack(annot1);

/* Create a new signature form field in the PDFDoc. The name argument is optional;
leaving it empty causes it to be auto-generated. However, you may need the name for later.
Acrobat doesn't show digsigfield in side panel if it's without a widget. Using a
Rect with 0 width and 0 height, or setting the NoPrint/Invisible flags makes it invisible. */
DigitalSignatureField certification_sig_field = doc.createDigitalSignatureField(in_cert_field_name);
SignatureWidget widgetAnnot = SignatureWidget.create(doc, new Rect(143, 287, 219, 306), certification_sig_field);
page1.annotPushBack(widgetAnnot);

// (OPTIONAL) Add an appearance to the signature field.
Image img = Image.create(doc, in_appearance_image_path);
widgetAnnot.createSignatureAppearance(img);

// Prepare the document locking permission level. It will be applied upon document certification.
certification_sig_field.setDocumentPermissions(DigitalSignatureField.DocumentPermissions.e_annotating_formfilling_signing_allowed);

// Prepare to lock the text field that we created earlier.
String[] fields_to_lock = {"asdf_test_field"};
certification_sig_field.setFieldPermissions(DigitalSignatureField.FieldPermissions.e_include, fields_to_lock);

certification_sig_field.certifyOnNextSave(in_private_key_file_path, in_keyfile_password);

// (OPTIONAL) Add more information to the signature dictionary.
certification_sig_field.setLocation("Denver, CO");
certification_sig_field.setReason("Document certification.");
certification_sig_field.setContactInfo("www.apryse.com");

// Save the PDFDoc. Once the method below is called, PDFNet will also sign the document using the information provided.
doc.save(in_outpath, SDFDoc.SaveMode.NO_FLAGS, null);

PDF にデジタル署名する

ドキュメントに承認フィールドが追加され、認証されたので、PDF にデジタル署名する準備が整いました。この例では、署名者用に作成したウィジェットとフィールドに署名の画像を適用します。より複雑な例や複数の署名 PDF ポートフォリオやページの場合、DigitalSignatureField をループして、同じまたは異なる署名セットを適用することができます。

// Open an existing PDF
PDFDoc doc = new PDFDoc(in_docpath);

// Retrieve the unsigned approval signature field.
Field found_approval_field = doc.getField(in_approval_field_name);
DigitalSignatureField found_approval_signature_digsig_field = new DigitalSignatureField(found_approval_field);

// (OPTIONAL) Add an appearance to the signature field.
Image img = Image.create(doc, in_appearance_img_path);
SignatureWidget found_approval_signature_widget = new SignatureWidget(found_approval_field.getSDFObj());
found_approval_signature_widget.createSignatureAppearance(img);

// Prepare the signature and signature handler for signing.
found_approval_signature_digsig_field.signOnNextSave(in_private_key_file_path, in_keyfile_password);

// The actual approval signing will be done during the following incremental save operation.
doc.save(in_outpath, SDFDoc.SaveMode.INCREMENTAL, null);

最終版のドキュメントには、デジタル的に信頼された署名が付いています。この署名は検証され、ドキュメントが署名後に改ざんされていないことが確認できます。

Apryse WebViewer を使用して検証

結論

以上で、デジタル署名されて検証された PDF の完成です!このガイドがお役に立てば幸いです。また、Apryse の Java デジタル署名ライブラリのドキュメントもご覧いただけます。

Apryse 製品の詳細は、弊社 Web サイトをご確認ください。

記事参照:
© 2024 Apryse
Adding a Digital Signature to a PDF with the Java SDK

タイトルとURLをコピーしました