PDFlib

高度なPDFアプリケーションの開発を支援する定番プログラムライブラリー Supported by インフォテック株式会社

PLOP / PLOP DS サンプル集(クックブック)

本サンプルプログラムは、PDF の権限やパスワードの追加、ウェブ最適化を行う PLOP、 PDF に電子署名、タイムスタンプを付与する PLOP DS の基本的な機能を実際のプログラムで紹介したものです。

本サイトでダウンロードした PLOP、PLOP DS は、一部機能の制限を除き、評価版として無償でお使いいただけます。

受信者の証明書に対する PDF 文書の暗号化

証明書による PDF の暗号化は、パスワードを用いた暗号化 の代わりとなる手段を提供します。 証明書による暗号化は、パスワードによる暗号化に比べて、以下の利点があります。
・パスワードを受信者へ配布する必要がない
・各受信者(または受信者のグループ)に対して、個別の権限制限を指定できる
 ※使用権が互いに異なるユーザーたちへの文書配布時に役立ちます
・受信者が権限のない第三者への文書パスワードを渡すことができない

証明書による PDF の暗号化は、例えば以下のような用途例が挙げられます。

グループ内での部外秘文書の配布

あるグループに所属する人が、グループ内のメンバー達と部外秘の書類(PDF)をやり取りしたい場合、 この PDF をグループ内メンバーの証明書によって暗号化することで、安全にやり取りをすることが可能です。

部外秘の文書を権限ごと(e.g. 編集可・署名のみ可)に区別して保護する

部外秘の文書が、あるグループ内のメンバー達に暗号化(保護)されて配布される際、 文書を一部のメンバー(上司など)のみ内容変更を許可し、それ以外のメンバー(一般社員など)は 電子的な署名のみを許可したい(内容変更不可)場合を想定します。 証明書による PDF の保護では、権限を付与することで、この区別を実現することができます。

デジタル著作権の管理

ある商業コンテンツが、有料で顧客に頒布されることを想定します。 顧客は、顧客が持つそれぞれの証明書に対して暗号化(保護)された PDF を受け取ります。 同じ文書を元に、顧客によって暗号化を変えた(顧客が持つ各証明書に対する暗号化を行うため)文書を作成できます。 また、権限制限の設定によって、顧客による文書改ざんを防ぐこともできます。

セキュアなストレージとアーカイビング

アーカイブが、暗号化(保護)が必要となる PDF 文書を受け取る場合、 この文書をアーカイブ所有者の証明書によって暗号化(保護)することで、安全に管理することができます。

インボイスや明細書の送付

顧客ごとのインボイス・明細書・取引書面などの文書は、その内容を保秘する必要があり、 その保護の手段として、顧客が持つ証明書による暗号化が挙げられます。 また、権限制限を設定することによって、顧客が文書を改竄することを防ぐことができます。

ここでは、PLOP を用いて、証明書による PDF の暗号化の例を示します。 この例では、証明書 demo_recipient_1.pem に対するデジタル ID (demo_recipient_1.p12) を持つ受信者には権限の制限をせず、 demo_recipient_2.pem、demo_recipient_3.pem に対するデジタル ID (demo_recipient_2.p12、demo_recipient_3.p12) をもつ受信者には、 権限を制限(フォームの入力及び署名のアクセス権限を付与し、他の権限は制限)しています。

サンプル受信者証明書群がパッケージに含まれています。 パッケージは、 この暗号化された文書を PLOP を用いて復号したり、Acrobat で開いたりするために必要となる、 照応するデジタル ID ファイル群も含んでいます。

すべてのデジ タル ID ファイル(demo_recipient_1.p12 等)に対するパスワードは demo です。

証明書 (*.pem)は、受信者に向けた PDF 文書の暗号化を行うために必要なファイルです。 公開鍵のみを含むため、証明書は自由に配布することができます。 暗号化されている文書を開くには、暗号化のために使用された証明書に照応する、デジタル ID を必要とします。 PDFlib PLOP はこのファイルを使用して PDF 文書を暗号化します。

デジタルID (*.p12) は、証明書と照応する秘密鍵を含むファイルです。 保護された文書を開くのに必要です。デモプログラムのため PLOP DS ではパッケージに同梱していますが、 通常は受信者の Adobe Acrobat (または Windows) の証明書ストアにのみ存在し、受信者に配布するものではありません。

今回のデモプログラムで暗号化した PDF 文書を開くには、PLOP パッケージに同梱されている demo_recipient_1.p12 等が必要です。 ダウンロードしたファイルをダブルクリックして、「証明書のインポートウェイザード」に従ってインストールします。 保存場所は「現在のユーザー」を選択し、パスワードは「demo」を入力します。

必要な製品:PDFlib PLOP 又は PDFlib PLOP DS

処理の流れ

①既存の PDF 文書を開く

open_document() 関数を使って、電子署名を付与したい既存の PDF ファイルを開きます。

②受信者証明書を指定する

add_recipient() 関数を使って、受信者証明書を certificate オプションで指定します。

③暗号化をした PDF を出力する

create_document() 関数で、オプションで指定したパスワードで保護した PDF を作成します。

④PDF 文書を閉じる

close_document() 関数で、PDF 文書を閉じれば、電子署名の付与は完了します。

ソースコードと出力結果

 
/*
 * 受信者の証明書に対する PDF 文書の暗号化:
 * 1 個ないし複数の受信者証明書に対して PDF 文書を暗号化します。
 * サンプル受信者証明書群がパッケージに含まれています。 
 * パッケージは、 この暗号化された文書を PLOP を用いて復号したり、Acrobat で開いたりするために必要となる
 * 照応するデジタル ID ファイル群も含んでいます。 
 * すべてのデジ タル ID ファイル(demo_recipient_1.p12 等)に対するパスワードは demo です。
 *
 * 必要な製品 : PDFlib PLOP 5 又は 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 certsec {
     public static void main (String argv[]) {
         plop plop = null;
         
         /* 本サンプルに必要なデータが保存されているディレクトリを指定する */
         String searchpath = "../data";
         
         /* 受信者の証明書とアクセス許可を設定する*/
         String[][] recipients = {

             /* 権限制限なし */
             { "../data/demo_recipient_1.pem", "" },
             
             /* フォームの入力及び署名のアクセス権限を付与し、 他の権限は制限する */
             { "../data/demo_recipient_2.pem", "nomodify nocopy noannots noassemble" },
             { "../data/demo_recipient_3.pem", "nomodify nocopy noannots noassemble" },
         };
         
         try {
             int doc;
             int r;
             String optlist;
             
             /* 実行ファイルに渡す引数(取込む既存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_errmsg());
             }
             
             /* ②受信者証明書を指定する */
             for (r = 0; r < recipients.length; r++) {
                 optlist = "certificate={filename={" + recipients[r][0] +
                                   "}} permissions={" + recipients[r][1] + "}";
                 
                 if (plop.add_recipient(optlist) == -1) {
                     /* 警告を出して、処理を続行する */
                     System.err.println("Warning: " + plop.get_errmsg());
                 }
             }
             
             /* ③暗号化をした PDF を出力する */
             optlist = "input=" + doc;
             if (plop.create_document(argv[1], optlist) == -1) {
                 throw new Exception("Error: "+ plop.get_errmsg());
             }
             
             /* ④PDF文書を閉じる */
             plop.close_document(doc, "");
         } catch (PLOPException e) {
             System.err.println("PLOP exception occurred in certsec 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();
         }
     }
 }


関連ページ

  • PLOP の製品情報

    PLOP の機能、対応する PDF バージョン、利用用途等、製品情報について紹介しています。

(Apr 30, 2020)