/* * 手書き署名等の画像を用いた電子署名: * サインや印影など、個人を特定できる署名の画像などを含む 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 オプション:長期検証(LTV)をするかどうかを指定する。 LTV を行う場合は full を指定する(デフォルト:try) */ "ltv=try " + /* engine オプション:電子署名を作成するための暗号化エンジンを指定(デフォルト:builtin) digitalid オプション:使用するデジタル ID を指定する password オプション:デジタル ID に対するパスワード等を指定する */ "engine=builtin digitalid={filename=demo_signer_rsa_2048.p12} password={demo} "; * 実行ファイルに渡す引数(取込む既存PDF名・出力するPDF名)のチェックを行う */ if (argv.length < 2) { throw new Exception("usage: dynamicfile "); } /* ----------- ステップ1: PDFlib を用いてメモリ内に動的に文書を生成します ---------- */ /* 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"); /* APDF 文書ページを開く */ pdf.begin_page_ext(300, 50, ""); /* C署名用のテキストを出力する */ pdf.fit_textline("Digitally signed " + fulldate.format(now) + " at " + fulltime.format(now), 10, 10, "fontsize=10 fontname=Helvetica encoding=unicode fillcolor=red"); /* DPDF ページを閉じる EPDF 文書を閉じる  */ pdf.end_page_ext(""); pdf.end_document(""); /* Fメモリ内にある PDF 文書データを取得 */ contents = pdf.get_buffer(); /* ----------- ステップ2 : PLOP DS を用いて文書に署名します ---------- */ /* PLOP オブジェクトを作成する */ plop = new plop(); /* 読み込みたいファイルの入ったディレクトリを指定する */ optlist = "searchpath {" + searchpath + "} "; plop.set_option(optlist); /* GPVF(PDFlib Virtual File System )ファイルを生成する */ plop.create_pvf("/pvf/visdoc.pdf", contents, ""); /* H電子署名を付与したい既存のPDF文書を開く */ if ((doc = plop.open_document(argv[0], "")) == -1) { throw new Exception("Error: " + plop.get_errmsg()); } /* IPVFファイルを開く */ if ((visdoc = plop.open_document("/pvf/visdoc.pdf", "")) == -1) { throw new Exception("Error: " + plop.get_errmsg()); } /* J電子署名を作成する */ 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()); } /* K電子署名を PDF に付与して出力する */ if (plop.create_document(argv[1], "input=" + doc) == -1) { throw new Exception("Error: " + plop.get_apiname() + ": " + plop.get_errmsg()); } /* LPDF文書を閉じる */ plop.close_document(doc, ""); /* MPVFファイルを削除する */ plop.close_document(visdoc, ""); 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); } } } } }