PDFlib

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

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

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

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

生成した PDF に電子署名を付与

PDFlib を用いてメモリ内に動的に PDF 文書を生成して PLOP DS へ渡し、 PLOP DS で電子署名を行う方法を示します。

このサンプルで使用した電子署名は信頼された認証局で発行されたものではないため、Adobe Acorbat 等で開くと「少なくとも 1 つの署名に問題があります。」と表示されますが、信頼された認証局で発行された電子署名を使うと「署名済みであり、すべての署名が有効です。」と表示されます。

また、このサンプルは、 PLOP パッケージには含まれていない PDFlib 製品を必要としますが、PDFlib の無料評価版を当社 Web サイトから入手できます。

必要な製品:PDFlib PLOP DS / PDFlib

 
/*
 * 生成した PDF に電子署名を付与:
 * PDFlib を用いてメモリ内に生成した動的な文書に対して、PLOP DS を使って電子署名を付与します。
 * このサンプルには、PLOP  DS の他、PDF の生成を行う PDFlib が必要です。
 *
 * 必要な製品 : PDFlib PLOP DS 5 及び PDFlib
 * 必要なデータ : demo_signer_rsa_2048.p12
 *                demo_signer_rsa_2048.p12 は data ディレクトリにあります。
 *                demo_signer_rsa_2048.p12 のパスワードは demo です。
 */


 import java.io.*;
 import com.pdflib.PLOPException;
 import com.pdflib.plop;
 import com.pdflib.pdflib;
 
 public class hellosign {
     public static void main (String argv[]){
         pdflib pdf = null;
         plop plop = null;
         
         try {
             int font;
             byte[] contents;
             String optlist;
             int doc;
             
             /* 本サンプルに必要なデータが保存されているディレクトリを指定します. 適宜変更してください */
             String searchpath = "../data";
             
             final String out_filename = "hellosign.pdf";
             
             /* 基本的な署名オプション */
             String sign_opts =
                 "ltv=try " +  /* 長期検証(LTV)を保証するためには ltv=full を使います */
                 /* PKCS11 を使用する場合は 
                  * "engine=pkcs#11 digitalid={filename=cryptoki.dll}" を設定します
                  */
                  "engine=builtin digitalid={filename=demo_signer_rsa_2048.p12} password={demo} ";
             
             /* ----------- ステップ1: PDFlib を用いてメモリ内に動的に文書を生成します ---------- */
             
             pdf = new pdflib();
             
             /* メモリ内に新規 PDF 文書を生成します */
             pdf.begin_document("", ""); 
             
             pdf.set_info("Creator", "hellosign.java");
             pdf.set_info("Author", "Rainer Ploeckl");
             pdf.set_info("Title", "Hello world/signed (Java)");
             
             font = pdf.load_font("Helvetica-Bold", "winansi", "");
             
             pdf.begin_page_ext(595, 842, "");
             pdf.setfont(font, 24);
             pdf.set_text_pos(50, 700);
             pdf.show("Hello world/signed!");
             pdf.continue_text("(says Java)");
             pdf.end_page_ext("");
             
             pdf.end_document("");
             contents = pdf.get_buffer();
             
             /* ----------- ステップ2 : PLOP DS を用いて文書に署名します ---------- */
             
             plop = new plop();
             
             optlist = "searchpath {" + searchpath + "} ";
             plop.set_option(optlist);
             
             /* メモリ内の文書データから PVF ファイルを生成します */
             plop.create_pvf("/pvf/hello.pdf", contents, "");
             
             /* PVF ファイルから署名されていない文書を開きます */
             if ((doc = plop.open_document("/pvf/hello.pdf", "")) == -1) {
                 throw new Exception("Error: " + plop.get_errmsg());
             }
             
             /* 出力ファイルを署名します */
             if (plop.prepare_signature(sign_opts) == -1) {
                 throw new Exception("Error: " + plop.get_apiname() + ": " + plop.get_errmsg());
             }
             
             if (plop.create_document("hellosign.pdf", "input=" + doc) == -1) {
                 throw new Exception("Error: " + plop.get_apiname() + ": " + plop.get_errmsg());
             }
             
             /* 文書ファイルを閉じます */
             plop.close_document(doc, "");
             
             /* PVF ファイルを削除します */
             if (plop.delete_pvf("/pvf/hello.pdf") == -1) {
                 throw new Exception("Error: " + plop.get_errmsg());
             }
             
             
         } catch (PLOPException e) {
             System.err.println("PLOP exception occurred in hellosign 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();
         
             /* PDFlib オブジェクトを削除します */
             if (pdf != null) {
                 try { 
                     pdf.delete();
                 } catch (Exception e) {
                     System.exit(2);
                 }
             }
         }
     }
 }

関連ページ

  • PLOP DS の製品情報

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

  • PLOP DS 入門

    PLOP DS による電子署名の付与方法をサンプルプログラムを交えて詳しく説明しています。

(Apr 30, 2020)