PDFlib PLOP DS 入門 - PDF文書に電子署名をする -
1. はじめに
PDFlib PLOP は、PDF ファイルのリニアライズ、最適化、修復、分析、暗号/復号化など多様な機能を持つツールです。また上位バージョンである PDFlib PLOP DS は PDF 文書への電子署名 (デジタル署名) 機能を実現します。
ここでは、PLOP DS の機能を用いて PDF ファイルにどのように電子署名を施すかをサンプルプログラムを用いて説明する PLOP DS 入門です。なお、PLOP DS は、コマンドラインツールでも電子署名を施すことが可能です。コマンドラインツールについてはマニュアル をご覧ください。
このサンプルプログラムでは、大きく次の点を実現しています。
- 既存の PDF に電子署名を施す
- 電子署名を視覚的に表現するためのイメージを表示する
- 電子署名を行う際、理由や場所といったプロパティを日本語で指定する
- 出来上がった PDF ファイルをメモリから直接クライアントに返す
なお、PDFlib 製品はライセンスを購入する前の状態でも試用版としてすべての機能を試すことができます。こちらのページ から PLOP をダウンロードし、実際に動作をご確認いただけます。
では、早速サンプルプログラムを見てみましょう。
2. 電子署名サンプル
下記のサンプルでは、
PDFlib 入門1 で作成した
PDF ファイル に電子署名を施すサンプルです。署名イメージに使用した PDF は
こちら からダウンロードすることができます。(
ソースコード (zip))
<?php
/* PLOP DS サンプルスクリプト simple_sig.php
* PDFlib 入門で作成した hello-j.pdf に電子署名を施します
* ※ BOM なし UTF-8 で保存してください
* (notepad で保存すると BOM が付いてしまいます)
* ※ 電子署名は PLOP DS に同梱されている demo_signer_rsa_2048.p12 を使います。
* demo_signer_rsa_2048.p12 は data ディレクトリにあります。
* demo_signer_rsa_2048.p12 のパスワードは demo です。
*/
/* 入力ファイル等のディレクトリとファイル名を指定
* (環境に合わせて書き換えてください)
*/
$input_dir = __DIR__;
$input = "hello-j.pdf";
$sign_dir = __DIR__ . "/../data";
$sign = "demo_signer_rsa_2048.p12";
$sign_image = "signature.pdf";
$output = "simple_sig.pdf";
/* PLOP オブジェクトを作成 */
$plop = new PLOP();
/* 上記で指定したディレクトリを検索対象に設定 */
$plop->set_option("searchpath=$input_dir");
$plop->set_option("searchpath=$sign_dir");
/* 入力ファイルと署名イメージの PDF を開く */
$doc = $plop->open_document($input, "");
$vis_doc = $plop->open_document($sign_image, "");
/* 電子署名する際のオプションを設定する */
$sign_opts =
"engine=builtin " .
"digitalid={filename={$sign}} " .
"password={demo} " .
"field={name=Signature1 rect={30 770 80 820} visdoc=$vis_doc} " .
"reason=\xEF\xBB\xBF文書を証明する " .
"location=\xEF\xBB\xBFインフォテック(株) ";
$plop->prepare_signature($sign_opts);
/* 電子署名を施した PDF を作成し、そのバッファを取得する */
$plop->create_document("", "input=$doc");
$buf = $plop->get_buffer();
/* 開いたファイルを閉じ、plop オブジェクトを破棄する */
$plop->close_document($vis_doc, "");
$plop->close_document($doc, "");
$plop = 0;
/* 作成した PDF のバッファをブラウザに返す */
$len = strlen($buf);
header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=$output");
print $buf;
PHP 5 / PLOP DS 5 (エンコーディングは UTF-8 を想定)
PLOP_prepare_signature() で電子署名する際に設定可能なオプションには以下のようなものがあります。
- engine:暗号化に使用するエンジンを指定します
- digitalid:電子署名に使用する署名ファイルを指定します
- password:署名ファイルのパスワードを指定します
- field:可視署名フィールドの名前、領域、署名イメージを指定します
- reason:署名プロパティの「理由」に表示する内容を指定します
- location:署名プロパティの「署名地」に表示する内容を指定します
reason および location に日本語を使用する場合、Perl や PHP では UTF-8 の文字列に BOM (\xEF\xBB\xBF) を付けて渡すか、ホストのコードページ (Windows の日本語環境では cp932) の文字列で渡す必要があります。このサンプルではソースコードを UTF-8 にし、BOM を付けて渡しています。Java や C# のように文字列が Unicode のプログラミング言語では BOM は必要ありません。
上記サンプルプログラムの結果は こちらからダウンロードできます。
このサンプルで使用した電子署名は信頼された認証局で発行されたものではないため、Adobe Acorbat 等で開くと「少なくとも 1 つの署名に問題があります。」と表示されますが、信頼された認証局で発行された電子署名を使うと「署名済みであり、すべての署名が有効です。」と表示されます。
電子署名を施すことで、この PDF が署名者によって署名されていることを証明することができます。また、署名後にこの PDF が変更されていないか検証することができます。
3. 最後に
いかがでしたでしょうか?ここではごく簡単な例で説明しましたが、PDFlib+PDI や PPS を使って見積書のような改ざんが許されない書類を作成し、PLOP DS で電子署名するといった実用的な使い方もできます。
PLOP DS はダウンロードページ#PLOP からダウンロードして試用することができます。皆様も是非お試しください。
(Oct 10, 2008 - Apr 30, 2020)