パーソナルビジネスソフトとお役立ち情報のサイト
PDFlib PLOP DS 入門 - PDF文書に電子署名をする -

1. はじめに

PDFlib PLOP は、Adobe PDF (Portable Document Format) 形式ファイルのリニアライズ、最適化、修復、分析、暗号/復号化など多様な機能を持つツールです。
拡張版である PDFlib PLOP DS は PDF 文書への電子署名(デジタル署名)機能を実現します。
ここでは、PDFlib PLOP DS の機能を用いて PDF ファイルにどのように電子署名を施すかをサンプルプログラムを用いて説明する PDFlib PLOP DS 入門です。なお、PDFlib PLOP DS は、コマンドラインツールでも電子署名を施すことが可能ですが、この点はマニュアルでも説明していますので、そちらをご覧ください。

このサンプルプログラムでは、大きく次の点を実現しています。

  • PDFlib を使用して PDF ファイルをメモリ上で作成する
  • 電子署名をビジュアルで表現するためのイメージを貼る
  • 電子署名を行う際、理由や場所といったプロパティに日本語を使用する
  • 出来上がった PDF ファイルをメモリから直接クライアントに返す

では、早速サンプルプログラムを見てみましょう。


電子署名サンプルプログラム - PDF 作成部分 -

<?php
  $p = new PDFlib();
  $p->begin_document("", "");

  $p->set_parameter("hypertextencoding", "winansi");
  $p->set_parameter("SearchPath", "/...../...../.....");

  $p->set_info("Creator", "simple_sig.php");
  $p->set_info("Author", "infoTek K.K.");
  $p->set_info("Title", "Simple Signature Program");

  $p->begin_page_ext(595, 842, "");

  $p->set_parameter("FontOutline", "MS-Mincho=msmincho.ttc");
  $font = $p->load_font("MS-Mincho", "unicode", "");
  $p->setfont($font, 16);
  $text = mb_convert_encoding("電子署名プログラム", "UCS-2LE", "euc-jp");
  $p->fit_textline($text, 50, 700, "");     # ... @

  $image = $p->load_image("auto", "signature.gif", "");
  $p->fit_image($image, 30, 770,            # ... A
                "boxsize {50 50} position {50 50} fitmethod auto");
  $p->rect(30, 770, 50, 50);
  $p->stroke();

  $p->end_page_ext("");
  $p->end_document("");
PHP5.2/PDFlib 7.0

2. スクリプトの解説 - PDF 作成部分 -

 ここまでは PDF を作成する PDFlib の一般的な PHP のプログラムと同じです。このプログラムでは、PHP ファイルを EUC-JP エンコーディングで保存しているために、テキストを出力する際 mb_convert_encoding を使用して EUC-JP から UCS-2LE に変換しているのが分かります。... @

また、電子署名をビジュアルに見せるために signature.gif を左上に配置し、枠で囲んでいます。... A 電子署名のイメージ

では、電子署名を施すコードを見てみましょう。


電子署名サンプルプログラム - PDF 作成部分 -

  $org = $p->get_buffer();                  # ... B

  $pl = new PLOP();
  $doc = $pl->open_document_mem($org, "");  # ... C
  $reason = mb_convert_encoding("文書を証明する", "utf-8", "euc-jp");
  $location = mb_convert_encoding("インフォテック(株)", "utf-8", "euc-jp");
  $pl->create_file("",                      # ... D
         "compatibility {1.7} " .           # ... E
         "masterpassword {plop} " .         # ... F
         "permissions {noprint nocopy} " .  # ... G
         "sign {" .                         # ... H
           "appearance {fieldname=Signature1 page=1 rect {30 820 80 770}} " .
           "digitalid {filename=demo1024.pfx} " .
           "password {demo} " .
           "reason {\xEF\xBB\xBF$reason} " .
           "contactinfo {tel +81 xxx xxx xxx} " .
           "location {\xEF\xBB\xBF$location} " .
           "}");

  $buf = $pl->get_buffer();                 # ... I

  $pl->delete();
  $p->delete();

  $len = strlen($buf);
  header("Content-type: application/pdf");
  header("Content-Length: $len");
  header("Content-Disposition: inline; filename=simple_sig.pdf");
  print $buf;
?>
PHP5.2/PDFlib 7.0

3. スクリプトの解説 - 電子署名の設定 -

 PLOP は、PDF ファイルを元に処理を行うため、元の PDF ファイル、またはファイルの内容が必要になります。初めの行は、作成した PDF ファイルの内容を取得するために、get_buffer() を用いています。... B

次に PLOP オブジェクトを作成し、open_document_mem に取得したファイルの内容を渡すことで元になる PDF 文書を開いています。... C

電子署名を適用し、新しい PDF ファイル(この場合はメモリ上)を作成している部分が create_file を呼び出している部分です。... D

順を追って説明します。

  • 作成する PDF のバージョンを 1.7 とします。... E
  • マスターパスワードを「plop」とします。... F
  • パーミションとして「noprint」と「nocopy」を指定します。... G
  • 電子署名を付与します。... H
    • appearance ... 「Signature1」という名称で署名フィールドを 1 ページ目の座標 (30,820)-(80,770) に配置
    • digitalid ... 電子署名ファイル名が「demo1024.pfx」と指定
    • password ... 上記電子署名ファイルのパスワードが「demo」と指定
    • reason ... 署名の理由を指定
    • contactinfo ... 署名者の連絡先情報を「tel +81 xxx xxx xxx」と指定
    • location ... 署名の場所を指定
password は pfx ファイルを作成した際に指定したパスワードです。ここで使用している demo1024.pfx は PDFlib 社が提供している署名ファイルのサンプルで、PDFlib PLOP をダウンロード・インストールしたディレクトリの data ディレクトリに格納されています。

reason および location には create_file を呼び出す直前に EUC-JP から UTF-8 に予め変換したテキストに \xEF\xBB\xBF を付け加えて指定しています。これは、BOM と呼ばれており、これに続くテキストが UTF-8 エンコーディングであることを表しています。

PDFlib PLOP で指定するオプションに漢字などの2バイトコードを使用する場合には、UTF-8 に変換する必要があり、かつ BOM を付加しなければなりません。

後は出来上がった PDF (イメージ) を get_buffer で取得して、I PDF としてクライアントに返すだけです。この部分は PDFlib の通常の処理と同様です。

上記サンプルプログラムの結果はこちらからダウンロードできます。

いかがでしたでしょうか?ここでは、ごく簡単な例で説明しましたが、PDF ファイルを作成する際に、PDFlib+PDI や PPS を使って見積書など、改ざんが許されない書類を作成することは容易に想像できると思います。

PDFlib PLOP DS は こちら からダウンロードして試用することができます。皆様も是非お試しください。


(Oct 10, 2008)



■ PDFlib の入門は こちら をご覧ください。