PDF Security(複数の電子署名) Javaサンプル
「PDF Security」ソフトは、PDF文書への電子署名と暗号化の機能をアプリケーションに追加します。
電子署名 ・ タイムスタンプ
PDF Securityは、電子署名の様々なタイプを適用します。PDF Securityは、PDF/Aに準拠した電子証明書失効情報(CRLやOCSPのデータ)の埋め込みや、RFC3161タイムスタンプを追加します。
PDF Securityは、証明書のルート(CA、中間)証明書や失効情報をチェックすることで電子署名の有効性を検証します。また、タイムスタンプによる検証も行います。
電子署名しないでタイムスタンプだけを埋め込めます。
PDF Securityは、証明書のルート(CA、中間)証明書や失効情報をチェックすることで電子署名の有効性を検証します。また、タイムスタンプによる検証も行います。
電子署名しないでタイムスタンプだけを埋め込めます。
暗号化・セキュリティ フラグ
PDF文書は、それが重要な場面で利用される場合、データの不正なアクセスや改竄から保護するために、暗号化やセキュリティ(アクセス許可)フラグなどを設定します。
機能概要はこちらです。
無償評価版のダウンロードとインストール
ライブラリ(評価版API)は無償でダウンロード(試用)できますので、PDF Security ダウンロード手順を参照してダウンロードください。
ファイルをダウンロードしてから、インストールもしくは適当なフォルダーに解凍します。以下のようなフォルダーができあがりますので、適宜ご利用ください。
サンプルのコンパイルおよび実行前に、jar/SECA.jarをCLASSPATHにコピーし、
bin/PdfSecureAPI.dllをPATHまたはjava.library.pathにコピーしてください。
また、無償評価版と共にダウンロードしたライセンスキーをbin/LicenseManager.exeを使って登録してください。 ライセンスキーの登録方法はこちらです。
ファイルをダウンロードしてから、インストールもしくは適当なフォルダーに解凍します。以下のようなフォルダーができあがりますので、適宜ご利用ください。
bin | ライブラリやライセンスマネージャーなど |
doc | 使用説明書やjavadocなど |
include | C/C++用のヘッダー(.h)ファイル |
jar | SECA.jar(Javaのラッパー) |
lib | C/C++用のlibファイル |
samples | 各種開発言語のサンプル |
また、無償評価版と共にダウンロードしたライセンスキーをbin/LicenseManager.exeを使って登録してください。 ライセンスキーの登録方法はこちらです。
PDFに複数の署名を適用する
PDF/A規格に準拠していて、変更できません。 さらに、二つの署名が施されています。 (署名前のPDF/A文書、署名後のPDF/A文書) |
PDF Tools 「PDF Security」電子署名ライブラリ(API)を使って、左のようにPDF/A文書に複数の電子署名を適用します。 単一の署名を施すには、PDF Security 解説とサンプルを参照してください。Acrobat Readerでの署名検証方法はこちらです。 |
複数署名の手順
複数の電子署名をPDF文書に適用するには、電子署名の都度PDF文書を作成(書き出し)しなければなりません。そのためPDF Securityには、メモリ上に(ファイルではなく)PDF文書を出力する機能を備えています。
この機能によって、複数の電子署名をより簡単に追加できます。
複数の署名は以下の手順に従って適用します。
複数の署名は以下の手順に従って適用します。
1. | PDF文書をハンドルするインスタンスを生成し、電子署名を施すPDF文書をファイルから読み込む。 |
2. | 電子署名のインスタンスを生成し、署名の詳細を指定する。 |
3. | ファイルから読み込んだPDFのインスタンスに準備した電子署名のインスタンスで電子署名を追加する。 |
4. | PDFのインスタンスをメモリに出力する。 |
5. | ファイルから作成したPDFのインスタンスとは別のPDFインスタンスを生成し、そこにメモリ上のPDFを読み込む。 |
6. | 2番目の電子署名のインスタンスを生成し、署名の詳細を指定する。 |
7. | メモリ上のPDFのインスタンスに、2番目の電子署名インスタンスで電子署名を追加する。 |
8. | 3つ以上の電子署名を追加する場合は、手順4と同様に電子署名を追加したPDFのインスタンスをメモリ上に出力し、それを読み込んで電子署名の追加を繰り返す。 |
9. | 最後の署名が追加されたPDFのインスタンスを、目的の名前でファイルに出力する。 |
手順1. PDFインスタンス生成
PDF文書のインスタンスを生成して、そこにファイルからPDF文書を読み込みます。
import com.pdftools.NativeLibrary.PERMISSION; import com.pdftools.seca.*; public class Dual { public static void main(String[] args) { try{ //入力ファイルを開く Secure doc1 = new Secure("input.pdf", null); doc1.setNoCache(true);
new Secure( ) | PDFSecurity のインスタンスを生成します。
| ||||
setNoCache( ) | 引数に応じてCRLなどをキャッシュしないようにします。 [省略可] |
手順2. 電子署名インスタンス生成と詳細指定
電子署名のインスタンスを生成し、電子証明書や印影その表示位置などを指定します。
//電子署名 float rect1[]={470,600,500,630}; //表示位置 Signature sig1 = new Signature(); //電子署名インスタンス //指定フォント sig1.setFontName1 = "C:\\Windows\\Fonts\\msgothic.ttc"; sig1.setFontName2 = "C:\\Windows\\Fonts\\msmincho.ttc"; //電子署名情報(電子署名検索情報) sig1.setName("Common Name"); //電子署名表示位置 sig1.setRect(rect1); //電子署名の背景画像 sig1.setImageFileName("hanko.png"); sig1.setText1("\t0.0 "); //電子署名表示内容 sig1.setText2("\t0.0 "); //タイムスタンプ(RFC3161) sig1.setTimeStampURL("http://ca21.trustss.jp/tsa/");
setName( ) |
電子署名に対応する電子証明書のCN(Common Name、所有者名)を指定します。 さらに詳しく証明書を指定する場合や、署名領域の内容を指定する場合は以下のコードを追加します。 sig1.setIssuer("CA21-3"); sig1.setSerialNumber("10 51"); sig1.setReason("受領済"); sig1.setLocation("東京"); |
setIssuer( ) | 電子署名に対応する電子証明書の発行者を指定します。 電子証明書の所有者名だけで証明書が特定できる場合は、この指定は必要ありません。しかし、電子証明書をシリアル番号で指定する場合は、所有者の指定が必須となります。 |
setSerialNumber( ) | 電子署名に対応する電子証明書を指定するために、シリアル番号と共に指定します。 |
setReason( ) | 電子署名の理由を指定します。 [省略可] |
setLocation( ) | 電子署名の場所を指定します。 [省略可] |
setRect( ) |
電子署名の領域を左下(x1,Y1)と右上(x2,y2)で指定します。単位はポイント(1ポイント=1/72インチ)です。 [省略可] A4サイズの場合は、左下(0,0)、右上(595,842)となります。 署名領域に画像を貼り付けずに枠線や背景色を指定する場合は、以下のコードを追加します。 setStrokeColor(pSignature, 10053120); setFillColor(pSignature, 6724095); |
setStrokeColor( ) | 電子署名領域に画像を指定しなかった場合に表示される境界線の色を指定します。 [省略可] |
setFillColor( ) | 電子署名領域に画像を指定しなかった場合に、その領域が塗りつぶされる色を指定します。 [省略可] |
setImageFileName( ) | 電子署名の領域に貼り付ける画像を指定します。 [省略可] |
setPageNo( ) | 電子署名領域を表示するページを指定します。 [省略可] -1を指定すると、最終のページに表示されます。また、省略した場合や存在しないページを指定した場合も、最終のページに表示されます。 |
setTimeStampURL( ) | 指定のタイムスタンプを電子署名と共に埋め込みます。 [省略可] |
署名領域に文字列を表示させたくない場合は、以下のコードを追加します。 setText1(pSignature, "\t0,0 "); setText2(pSignature, "\t0,0 "); | |
setText1( ) | 電子署名領域に表示される署名者の情報を指定する文字列にします。 表示位置と表示する文字列を以下の形式に従って指定します。 <TAB>X位置,Y位置<空白>文字列 [省略可] |
setText2( ) | 電子署名領域に表示される署名者以外の情報を指定する文字列にします。 指定方法は、setText1と同じ [省略可] |
注意)指定したタイムスタンプのURLは、テスト用のタイムスタンプを発行するTSAです。このTSAは無償・無登録で自由に使えますが、負荷によってはレスポンスが低下します。
手順3. PDFに電子署名を追加
PDFのインスタンスに電子署名を追加します。
doc1.addSignature(sig1);
addSignature( ) | 引数に指定した電子署名をPDFに追加します。 |
手順4. PDFをメモリに出力
電子署名されたPDFをメモリに出力します。
//署名したPDFをメモリに格納 doc1.saveInMemory(null, null, PERMISSION.ePermNoEncryption, 0, null, null);
saveInMemory( ) | PDFをメモリに出力します。以下のとおり引数を指定します。
|
手順5. 新たなPDFインスタンスを生成
新たなPDFのインスタンスを生成し、メモリ上のPDFを読み込みます。
//メモリのPDFを開く Secure doc2 = new Secure(); byte ps[] = doc1.getPdf(); doc2.openMem(ps, null); doc2.setNoCache(true);
new Secure( ) | 新たなPDFのインスタンスを生成します。 | ||||
getPdf( ) | メモリに格納されたPDF文書をバイトストリームとして読み出します。 | ||||
openMem( ) | メモリ中のPDF文書を読み込みます。
| ||||
noCache( ) | 引数に応じてCRLなどをキャッシュしないようにします。 [省略可] |
手順6. 次の電子署名インスタンスを生成
さらに追加する電子署名のインスタンスを生成し、署名の詳細を設定します。設定は、手順2と同様です。
//電子署名の追加 float rect2[]={470,565,500,595}; Signature sig2 = new Signature(); sig2.setName("Jiro Yamada"); sig2.setRect(rect2); sig2.setImageFileName("hs.png"); sig2.setText1("\t0.0 "); sig2.setText2("\t0.0 "); sig2.setTimeStampURL("http://ca21.trustss.jp/tsa/");
手順7. 次の電子署名を適用する
次の電子署名を適用します。手順3と同様です。
doc2.addSignature(sig2);
手順8. さらに電子署名を追加する場合
さらに電子署名を追加するには、手順4と同様にして結果をメモリに出力します。出力したPDFをさらに手順5と同様に別のPDFインスタンスに格納します。
そして、電子署名のインスタンスを準備し(手順6)、PDFに署名を追加(手順7)を繰り返します。
手順9. 結果をファイルに出力
電子署名が追加されたPDFをファイルに出力します。
//PDFをファイルに格納 doc2.saveAs("dual_sig.pdf", null, null, PERMISSION.ePermNoEncryption, 0, null, null); //終了 sig1.destroyObject(); doc1.destroyObject(); sig2.destroyObject(); doc2.destroyObject(); }catch(Throwable e){ e.printStackTrace(); } } }
saveAs( ) | 署名されたPDFをファイルに格納します。
|
ご質問、お問い合わせ
(記載の会社名および製品名は、各社の登録商標および商標です。)