PDFlib

高度なPDFアプリケーションの開発を支援する定番プログラムライブラリー Supported by インフォテック株式会社

PLOP / PLOP DS サンプル集(クックブック)

本サンプルプログラムは、PDF の権限やパスワードの追加、ウェブ最適化を行う PLOP、 PDF に電子署名、タイムスタンプを付与する PLOP DS の基本的な機能を実際のプログラムで紹介したものです。

本サイトでダウンロードした PLOP、PLOP DS は、一部機能の制限を除き、評価版として無償でお使いいただけます。

手書き署名等の画像を用いた電子署名

サインや印影など、個人を特定できる署名の画像などを含む PDF 文書を、PDFlib と PLOP DS を用いて動的に生成する方法を示します。

このサンプルで使用した電子署名は信頼された認証局で発行されたものではないため、Adobe Acorbat 等で開くと「少なくとも 1 つの署名に問題があります。」と表示されますが、信頼された認証局で発行された電子署名を使うと「署名済みであり、すべての署名が有効です。」と表示されます。

また、このサンプルでは、PLOP パッケージに含まれていない PDFlib 必要としますが、PDFlib の無償評価版を当社 Web サイトからダウンロードすることができます。

必要な製品:PDFlib PLOP DS 及び PDFlib

 
/*
 * 手書き署名等の画像を用いた電子署名:
 * サインや印影など、個人を特定できる署名の画像などを含む PDF 文書を、
 * PDFlib と PLOP DS を用いて動的に生成する方法を示します。
 * このサンプルには、PLOP パッケージに含まれていない PDFlib を必要としますが、
 * PDFlib の無償評価版を当社 Web サイトからダウンロードすることができます。
 *
 * 必要な製品 : PDFlib PLOP DS 5 及び PDFlib 9
 * 必要なデータ : demo_signer_rsa_2048.p12
 *                demo_signer_rsa_2048.p12 は data ディレクトリにあります。
 *                demo_signer_rsa_2048.p12 のパスワードは demo です。
 */


 import java.io.*;
 import com.pdflib.PLOPException;
 import com.pdflib.plop;
 import com.pdflib.PDFlibException;
 import com.pdflib.pdflib;
 import java.text.DateFormat;
 import java.util.Date;
 
 public class dynamicsign {
     public static void main (String argv[]) {
         pdflib pdf = null;
         plop plop = null;
         
         try {
             byte[] contents;
             Date now = new Date();
             DateFormat fulldate = DateFormat.getDateInstance(DateFormat.LONG);
             DateFormat fulltime = DateFormat.getTimeInstance(DateFormat.LONG);
             
             String optlist;
             int doc, visdoc;
             
             /* 本サンプルに必要なデータが保存されているディレクトリを指定します。
              * 適宜変更してください。
              */
             String searchpath = "../data";
             
             final String out_filename = "hellosign.pdf";
             
             /* 基本的な署名オプション */
             String sign_opts =
             "ltv=try " + /* 長期検証(LTV)を保証するためには ltv=full を使います */
             /* PKCS11 を使用する場合は 
              * "engine=pkcs#11 digitalid={filename=cryptoki.dll}" を設定します
              */
             "engine=builtin digitalid={filename=demo_signer_rsa_2048.p12} password={demo} ";
             if (argv.length < 2) {
                 throw new Exception("usage: dynamicfile <infile> <outfilename>");
             }
             
             /* ----------- ステップ1: PDFlib を用いてメモリ内に動的に文書を生成します ---------- */
             
             pdf = new pdflib();
             
             /* メモリ内に新規 PDF 文書を生成します */
             pdf.begin_document("", ""); 
             
             pdf.set_info("Creator", "dynamicsign.java");
             pdf.set_info("Author", "Rainer Ploeckl");
             pdf.set_info("Title", "Dynamic signature visualization document");
             
             pdf.begin_page_ext(300, 50, "");
             /* 署名の視覚化のために動的テキストを準備します */
             pdf.fit_textline("Digitally signed " + fulldate.format(now) + 
             " at " + fulltime.format(now), 10, 10,
             "fontsize=10 fontname=Helvetica  encoding=unicode fillcolor=red");
             pdf.end_page_ext("");
             
             pdf.end_document("");
             contents = pdf.get_buffer();
             
             /* ----------- ステップ2 : PLOP DS を用いて文書に署名します ---------- */
             
             plop = new plop();
             
             optlist = "searchpath {" + searchpath + "} ";
             plop.set_option(optlist);
             
             /* メモリ内の文書データから PVF ファイルを生成します */
             plop.create_pvf("/pvf/visdoc.pdf", contents, "");
             
             if ((doc = plop.open_document(argv[0], "")) == -1) {
                 throw new Exception("Error: " + plop.get_errmsg());
             }
             /* PVF ファイルから視覚化された文書を開きます */
             if ((visdoc = plop.open_document("/pvf/visdoc.pdf", "")) == -1) {
                 throw new Exception("Error: " + plop.get_errmsg());
             }
             /* 基本となる署名オプションに field オプションを加えます */
             optlist = sign_opts + " field={visdoc=" +  visdoc + " rect={10 10 adapt adapt}} ";
             
             if (plop.prepare_signature(optlist) == -1) {
                 throw new Exception("Error: " + plop.get_apiname()
                             + ": " + plop.get_errmsg());
             }
             
             /* 出力ファイルを署名します */
             if (plop.create_document(argv[1], "input=" + doc) == -1) {
                 throw new Exception("Error: " + plop.get_apiname()
                             + ": " + plop.get_errmsg());
             }
             
             /* 文書ファイルを閉じます */
             plop.close_document(doc, "");
             
             /* 視覚化文書を閉じます */
             plop.close_document(visdoc, "");
             
             /* 入力文書を含んだ PVF ファイルを削除します */
             if (plop.delete_pvf("/pvf/visdoc.pdf") == -1) {
                 throw new Exception("Error: " + plop.get_errmsg());
             }
             
             
         } catch (PLOPException e) {
             System.err.println("PLOP exception occurred in dynamicsign sample:");
             System.err.println("[" + e.get_errnum() + "] " + e.get_apiname() +
                             ": " + e.get_errmsg());
         } catch (PDFlibException e) {
             System.err.println("PLOP exception occurred in dynamicsign sample:");
             System.err.println("[" + e.get_errnum() + "] " + e.get_apiname() +
                             ": " + e.get_errmsg());
         } catch (Exception e) {
             System.err.println(e);
         } finally {
             /* PLOP オブジェクトを削除します */
             if (plop != null) plop.delete();
         
             /* PDFlib オブジェクトを削除します */
             if (pdf != null) {
                 try { 
                     pdf.delete();
                 } catch (Exception e) {
                     System.exit(2);
                 }
             }
         }
     }
 }

関連ページ

  • PLOP DS の製品情報

    PLOP DS の機能、対応する PDF バージョン、利用用途等、製品情報について紹介しています。

  • PLOP DS 入門

    PLOP DS による電子署名の付与方法をサンプルプログラムを交えて詳しく説明しています。

(Apr 30, 2020)