PLOP / PLOP DS サンプル集(クックブック)
PLOP DS で署名を行うためにはデジタル ID が必要です。
デジタルID (*.p12) は、証明書とその証明書に照応する秘密鍵を含むファイルです。
電子署名を行ったり、 証明書を用いて保護
されている文書を復号したりするために必要です。
デジタル ID は、ファイルや Windows 証明書ストア内、
暗号トークン(スマートカードや USB スティック等)上で利用することができます。
デジタル ID は、主に以下の 3 つから取得することができます。
・パブリック認証局
・プライベート認証局(より大きな組織の場合)
・自己署名した証明書からデジタル ID を作成(試験目的や小規模グループ内での利用)
このページでは、PKCS#12 形式のデジタル ID ファイル (通常、拡張子が .p12 等)を用いて、
既存の PDF 文書に電子署名を行う方法を示します。
このサンプルで使用した電子署名は信頼された認証局で発行されたものではないため、Adobe Acorbat 等で開くと「少なくとも 1 つの署名に問題があります。」と表示されますが、信頼された認証局で発行された電子署名を使うと「署名済みであり、すべての署名が有効です。」と表示されます。
必要な製品:PDFlib PLOP DS
処理の流れ
①既存の PDF 文書を開く
open_document() 関数を使って、電子署名を付与したい既存の PDF ファイルを開きます。
②電子署名を作成する
prepare_signature() 関数で、オプションで指定したデジタル ID を用いて電子署名を作成します。
③電子署名を PDF に付与して出力する
create_document() 関数で、② で作成した電子署名を ① で開いた PDF に付与し、PDF を出力します。
④PDF文書を閉じる
close_document() 関数で、PDF 文書を閉じれば、電子署名の付与は完了します。
ソースコードと出力結果
/*
* 既存 PDF に電子署名を付与:
* 既存の PDF 文書に電子署名を行うサンプルです。
*
* 必要な製品 : PDFlib PLOP DS 5
* 必要なデータ : demo_signer_rsa_2048.p12
* demo_signer_rsa_2048.p12 は data ディレクトリにあります。
* demo_signer_rsa_2048.p12 のパスワードは demo です。
*/
import java.io.*;
import com.pdflib.plop;
import com.pdflib.PLOPException;
public class sign {
public static void main (String argv[]) {
plop plop = null;
/* 基本的な署名オプション */
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} ";
try {
/* 既存 PDF に関する変数を用意する */
String optlist;
String fieldoptlist = "";
String searchpath = "../data";
int doc;
/* 実行ファイルに渡す引数(取込む既存PDF名・出力するPDF名)のチェックを行う */
if (argv.length < 2) {
throw new Exception("usage: sign <filename> <outfilename>");
}
/* PLOP オブジェクトを作成する */
plop = new plop();
/* 読み込みたいファイルの入ったディレクトリを指定する */
optlist = "searchpath {" + searchpath + "} ";
plop.set_option(optlist);
/* ①既存の PDF 文書を開く */
if ((doc = plop.open_document(argv[0], "")) == -1) {
throw new Exception("Error: " + plop.get_apiname() + ": " + plop.get_errmsg());
}
/* 署名オプションを optlist 変数に代入する */
optlist = sign_opts;
/* ②電子署名を作成する */
if (plop.prepare_signature(optlist) == -1) {
throw new Exception("Error: " + plop.get_apiname() + ": " + plop.get_errmsg());
}
/* ③電子署名を PDF に付与して出力する */
if (plop.create_document(argv[1], "input=" + doc) == -1) {
throw new Exception("Error: " + plop.get_apiname() + ": " + plop.get_errmsg());
}
/* ④PDF文書を閉じる */
plop.close_document(doc, "");
} catch (PLOPException e) {
System.err.println("PLOP exception occurred in sign 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();
}
}
}
(Apr 30, 2020 - Dec 27, 2024)