PLOP / PLOP DS サンプル集(クックブック)
既存の PDF 文書に文書タイムスタンプを付与する方法を示します。
文書タイムスタンプでは、その文書がいつから存在するかを時刻認証業務事業者が発行するタイムスタンプにより証明し、その後変更されていないことを Adobe Acrobat で検証することができます。
タイムスタンプ付き署名と
本ページで説明する文書レベルタイムスタンプは異なります。
文書レベルタイムスタンプは有効な署名そのものであり、デジタル ID を必要としません。
このサンプルで使用した電子署名は信頼された認証局で発行されたものではないため、Adobe Acorbat 等で開くと「少なくとも 1 つの署名に問題があります。」と表示されますが、信頼された認証局で発行された電子署名を使うと「署名済みであり、すべての署名が有効です。」と表示されます。
このサンプルで使用したタイムスタンプ局は PDFlib 製品の検証に使用してもらうことを目的に弊社が公開しているもので、国税関係書類のような公的な書類には使用できません。詳細は 検証用タイムスタンプサーバーについて をご確認ください。
必要な製品:PDFlib PLOP DS
処理の流れ
①既存の PDF 文書を開く
open_document() 関数を使って、文書タイムスタンプを付与したい既存の PDF ファイルを開きます。
②文書タイムスタンプを作成する
prepare_signature() 関数で、オプションで指定した文書タイムスタンプを作成します。
③文書タイムスタンプを PDF に付与して出力する
create_document() 関数で、② で作成した文書タイムスタンプを ① で開いた PDF に付与し、PDF を出力します。
④PDF文書を閉じる
close_document() 関数で、PDF 文書を閉じれば、文書タイムスタンプの付与は完了します。
ソースコードと出力結果
/*
* 既存 PDF に文書タイムスタンプを付与:
* 既存の PDF 文書に文書タイムスタンプを行うサンプルです。
*
* 必要な製品 : PDFlib PLOP DS 5
* 必要なデータ : RFC3161 に対応したタイムスタンプサーバー
* このサンプルでは https://www.infotek.co.jp/tsa を使用します。
*/
import java.io.*;
import com.pdflib.plop;
import com.pdflib.PLOPException;
public class doctimestamp {
public static void main (String argv[]) {
plop plop = null;
/* 文書タイムスタンプのための署名オプション */
String sign_opts =
"engine=builtin " +
"doctimestamp={source={ " +
" url={https://www.infotek.co.jp/tsa} " +
" sslverifypeer=false " +
"}}";
try {
/* 既存 PDF に関する変数を用意する */
String optlist;
String searchpath = "../data";
int doc;
/* 実行ファイルに渡す引数(取込む既存PDF名・出力するPDF名)のチェックを行う */
if (argv.length < 2) {
throw new Exception("usage: certsec <infile> <outfile>");
}
/* 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());
}
/* ②文書タイムスタンプを作成する */
if (plop.prepare_signature(sign_opts) == -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 doctimestamp 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();
}
}
}
(May 7, 2020 - Dec 27, 2024)