ABC PLOP ・ PLOP DS Version 4.1 PDF の線形化 ・ 最適化 ・ 保護 ・ デジ タ ル署名 Copyright © 1997-2011 PDFlib GmbH. All rights reserved. PDFlib GmbH Franziska-Bilek-Weg 9, 80339 München, Germany www.pdflib.com 電話 +49 • 89 • 452 33 84-0 FAX +49 • 89 • 452 33 84-99 疑問がおあ り の際は、 PDFlib メ ー リ ング リ ス ト と 、 tech.groups.yahoo.com/group/pdflib にある アー カ イ ブ を チ ェ ッ ク し て く だ さ い。 ラ イ セ ン スご希望の際の連絡先 : [email protected] 商用 PDFlib ラ イ セ ン ス保持者向けサポー ト : [email protected] (ラ イ セ ン ス番号をお知らせ く だ さ い) この出版物および こ こ に含まれた情報はあ り のま まに供給 さ れる ものであ り 、 通知な く 変更 さ れる こ と が あ り 、 また、 PDFlib GmbH によ る誓約 と し て解釈 さ れるべき ものではあ り ません。 PDFlib GmbH はいかな る誤 り や不正確に対 し て も責任や負担を全 く 負 う ものではな く 、 こ の出版物に関するいかな る類の (明示 的 ・ 暗示的または法定に関わ ら ず) 保障を も行 う ものではな く 、 そ し て、 いかな る そ し てすべての売買可 能性の保障 と 、 特定の目的に対する適合性 と 、 サー ド パーテ ィ の権利の侵害 と を明白に否認 し ます。 PDFlib と PDFlib ロ ゴは PDFlib GmbH の登録商標です。 PDFlib ラ イ セ ン ス保持者は PDFlib の名称 と ロ ゴ を彼 らの製品の文書内で用いる権利を与え られます。 ただ し 、 こ れは必須ではあ り ません。 Adobe ・ Acrobat ・ PostScript ・ XMP は Adobe Systems Inc. の商標です。 AIX ・ IBM ・ OS/390 ・ WebSphere ・ iSeries ・ zSeries は International Business Machines Corporation の商標です。 ActiveX ・ Microsoft ・ OpenType ・ Windows は Microsoft Corporation の 商標です。 Apple ・ Macintosh ・ TrueType は Apple Computer, Inc. の 商標 です。 Unicode ・ Unicode ロ ゴは Unicode, Inc. の 商標です。 Unix は The Open Group の 商標です。 Java ・ Solaris は Sun Microsystems, Inc. の 商標です。 HKS は the HKS brand association: Hostmann-Steinberg,. K+E Printing Inks, Schmincke の登録商標です。 他の企業の製品 と サービ ス名は他の商標やサービ スマー ク である 場合があ り ます。 PDFlib PLOP 及び PLOP DS は以下のサー ド パーテ ィ ソ フ ト ウ ェ アの改変 さ れた部分を含んでいます : Zlib 圧縮ラ イ ブ ラ リ 、 Copyright © 1995-2002 Jean-loup Gailly and Mark Adler Eric Young の書いた Cryptographic ソ フ ト ウ ェ ア 、 Copyright © 1995-1998 Eric Young ([email protected]) Cryptographic ソ フ ト ウ ェ ア、 Copyright © 1998-2002 The OpenSSL Project (www.openssl.org) Expat XML パーサ、 Copyright © 1998, 1999, 2000 Thai Open Source Software Center Ltd ICU International Components for Unicode、 Copyright © 1995-2009 International Business Machines Corporation and others PDFlib PLOP 及び PLOP DS は RSA Security, Inc. の MD5 メ ッ セージダ イ ジ ェ ス ト アルゴ リ ズムを含んでいます。 目次 0 初めての PLOP ・ PLOP DS 0.1 5 ソ フ ト ウ ェ ア を イ ン ス ト ール 5 0.2 PLOP/PLOP DS ラ イ セ ン スキーを適用 6 1 PLOP と PLOP DS の諸機能 11 1.1 概観 11 1.2 説明書 と 各サン プルへのロー ド マ ッ プ 13 1.3 暗号化 ・ 復号 ・ 権限 14 1.4 Web 最適化 (線形化) PDF 15 1.5 最適化 (軽量化) 16 1.6 破損 PDF のための修復モー ド 17 1.7 pCOS で文書情報を取得 18 1.8 文書情報項目を挿入 ・ 取得 19 1.9 XMP メ タ デー タ を挿入 ・ 抽出 20 1.10 PLOP DS で電子署名 22 1.11 PLOP の処理の詳細 24 2 PLOP ・ PLOP DS コ マ ン ド ラ イ ン ツール 27 2.1 PLOP ・ PLOP DS コ マ ン ド ラ イ ンオプ シ ョ ン 27 2.2 PLOP ・ PLOP DS コ マ ン ド ラ イ ンの作成例 32 3 PLOP ・ PLOP DS ラ イ ブ ラ リ の言語バイ ンデ ィ ング 33 3.1 C バイ ンデ ィ ング 33 3.2 C++ バイ ンデ ィ ング 36 3.3 COM バイ ンデ ィ ン グ 39 3.4 Java バイ ンデ ィ ング 40 3.5 .NET バイ ンデ ィ ン グ 42 3.6 Perl バイ ンデ ィ ング 43 3.7 PHP バイ ンデ ィ ング 44 3.8 Python バイ ンデ ィ ング 46 3.9 RPG バイ ンデ ィ ン グ 47 目次 3 4 PDF セキ ュ リ テ ィ 49 さ ま ざ ま な PDF セキ ュ リ テ ィ 機能 49 4.1 4.2 PLOP の PDF セキ ュ リ テ ィ 機能 53 4.3 コ マ ン ド ラ イ ン で PDF 文書を保護 56 5 PLOP DS に よ る電子署名 59 5.1 電子署名の基本概念 59 5.2 デジ タ ル ID の取得 と 管理 60 5.3 PLOP DS で PDF 文書に署名 63 5.4 PLOP DS の署名の暗号の詳細 66 5.5 Acrobat で電子署名を検証 67 6 pCOS イ ン タ フ ェ ース 71 7 PLOP ・ PLOP DS ラ イ ブ ラ リ API リ フ ァ レ ン ス 73 オプ シ ョ ン リ ス ト 73 7.1 7.2 一般関数 75 7.3 文書入力 ・ 出力関数 78 7.4 例外処理 87 7.5 オプ シ ョ ン処理 89 7.6 pCOS 関数 91 7.7 Unicode 変換関数 94 A PDFlib を PLOP または PLOP DS と 組み合わせる B PLOP ラ イ ブ ラ リ ク イ ッ ク リ フ ァ レ ン ス C 変更履歴 索引 4 目次 101 100 98 97 0 初めての PLOP ・ PLOP DS 0.1 ソ フ ト ウ ェ ア を イ ン ス ト ール PLOP と PLOP DS は、 Windows シ ス テ ム用は統合 イ ン ス ト ー ラ パ ッ ケージ と し て、 その他 すべての対応オペ レ ーテ ィ ン グ シ ス テ ム用は統合圧縮アーカ イ ブ と し て頒布 さ れてい ま す。イ ン ス ト ー ラ と アーカ イ ブの中には、PLOP/PLOP DS コ マ ン ド ラ イ ン ツール と PLOP/ PLOP DS ラ イ ブ ラ リ が入っ てお り 、 説明書 と 作成例 も 同梱 さ れてい ます。 パ ッ ケージ を イ ン ス ト ールま たは解凍 し た後は、 以下の手順を推奨 し ます。 > PLOP と PLOP DS の さ ま ざ ま な機能については、 その概略紹介が 1 章にあ り ます。 > PLOP/PLOP DS コ マ ン ド ラ イ ン ツールの利用者は、 その実行形式を ただちに使 う こ と がで き ます。 利用で き る オプシ ョ ンは 2.1 節 「PLOP ・ PLOP DS コ マ ン ド ラ イ ンオプ シ ョ ン」 (27 ページ) で説明 さ れてい る ほか、 PLOP コ マ ン ド ラ イ ン ツールにオプシ ョ ン を何 も 付けずに実行 し た と き に も 表示 さ れます。 > PLOP/PLOP DS ラ イ ブ ラ リ / コ ン ポーネ ン ト の利用者は、選んだ環境に応 じ て 3 章の中 のいずれかの節を読み、 イ ン ス ト ール さ れてい る 作成例に目を通すべ き です。 Windows では、 PLOP と PLOP DS のプ ロ グ ラ ミ ン グ作成例は、 ス タ ー ト メ ニ ュ ーか ら (COM ・ .NET の場合)、 あ る いは イ ン ス ト レーシ ョ ンデ ィ レ ク ト リ か ら (それ以外の言語バ イ ンデ ィ ン グの場合) 呼び出す こ と がで き ます。 PLOP ま たは PLOP DS の商用 ラ イ セ ン ス を入手 し た場合は、 次のページに従っ て、 自分 の ラ イ セ ン ス キーを適用す る 必要があ り ます。 評価版の制限 PLOP/PLOP DS の コ マ ン ド ラ イ ン ツール と ラ イ ブ ラ リ は、 商用 ラ イ セ ン ス がな く て も 、 完全動作す る 評価版 と し て使用す る こ と がで き ま す。 有効な ラ イ セ ン ス キーを適用 し ない と 、PLOP は unlicensed と い う テ キ ス ト を文書の メ タ デー タ に入れ込み、 文書の先頭に追加表紙ページ を挿入 し ます。 入力が PDF/X ま たは PDF/A のいずれかに準拠 し ていて も 、 場合に よ っ ては、 こ の表 紙ページが挿入 さ れ る こ と に よ っ て、 生成 さ れ る PDF 出力が、 PDF/X ま たは PDF/A に準 拠 し ない も のにな る こ と があ り ます。 こ の と き 、 非準拠 と な る のは こ の表紙ページだけで あ り 、 有効な ラ イ セ ン ス キーを適用すれば以後は こ の問題は発生 し ません。 こ の点を試す には、 こ の追加表紙ページは、 以下の条件の一方ない し 両方が真な ら ば挿入 さ れません。 > 暗号化を、 決ま っ たパ ス ワー ド 文字列 demo ま たは DEMO で行 う と き (userpassword ・ masterpassword オプシ ョ ン)。 > 電子署名の適用に用い る デジ タ ル ID のサブジ ェ ク ト 名 (共通名 ・ CN と も 呼ばれます) が、 demo ま たは DEMO を含む と き 。 試験に適 し たデジ タ ル ID が PLOP パ ッ ケージに 入っ てい ます。 pCOS の諸機能は、 評価モー ド では、 小 さ な文書に限定 さ れます (10 ページ未満かつ 1MB 未満)。 PLOP ま たは PLOP DS の未 ラ イ セ ン ス版は、 実用目的に使用 し てはな ら ず、 製品の評 価目的でのみ使用が許 さ れます。 こ の ソ フ ト ウ ェ ア を実用目的に使用する には、 有効な ラ イ セ ン ス が必要です。 0.1 ソ フ ト ウ ェ ア を イ ン ス ト ール 5 0.2 PLOP/PLOP DS ラ イ セ ン スキー を適用 PLOP/PLOP DS を実用目的に使用す る には、 有効な ラ イ セ ン ス が必要です。 ラ イ セ ン ス を購入 し た ら 、 追加表紙ページが出ない よ う に、 ま た任意のパ ス ワー ド が使え る よ う にす る ために、 自分の ラ イ セ ン ス キーを適用す る 必要があ り ます。 ラ イ セ ン ス キーの適用には い く つかの方法があ り ます。 以下に示す方法のいずれか を選んで く だ さ い。 PLOP_set_option( ) の frontpage オプシ ョ ン を false にす る と 、 有効な ラ イ セ ン ス キーが 見つか ら なかっ た と き は、 表紙ページは生成 さ れずに例外が発生 し ます。 注記 PLOP/PLOP DS ラ イ セ ン スキーはプ ラ ッ ト フ ォ ーム依存であ り 、 その購入対象のプ ラ ッ ト フ ォ ームでのみ使用で き ます。 PLOP DS ラ イ セ ン スキーでは PLOP の全機能が有効に な り ますが、 PLOP ラ イ セ ン スキーでは、 PLOP DS でのみ利用で き る署名機能は有効にな り ません。 Windows イ ン ス ト ー ラ Windows ユーザーは、 提供 さ れ て い る イ ン ス ト ー ラ を 使 っ て PLOP/PLOP DS を イ ン ス ト ールす る 際に ラ イ セ ン ス キ ー を 入力す る こ と が で き ま す。 Windowsでは こ の方法を推奨 し ます。レ ジ ス ト リ への書 き 込みア ク セ ス を持た ない場合や、 イ ン ス ト ー ラ を使え ない場合は、 以下に示す代替方式を参照 し て く だ さ い。 API 呼び出 し で実行時に ラ イ セ ン スキー を適用 動作時に ラ イ セ ン ス キーを設定す る 行 を、 自分の ス ク リ プ ト ま たはプ ロ グ ラ ム に追加 し ま す。 license パ ラ メ タ を、 PLOP オブ ジ ェ ク ト を イ ン ス タ ン ス化 し た直後に (すなわち、 PLOP_new( ) ま たは同等の呼び出 し の 後に) 設定す る 必要があ り ます。 具体的な文法は、 使 う プ ロ グ ラ ミ ン グ言語に よ り ます : > COM/VBScript の場合 : oPLOP.set_option "license=... あなたのライセンスキー ..." > .NET/C# の場合 : p.set_option("license=... あなたのライセンスキー ..."); > C ・ Python の場合 : PLOP_set_option(p, "license=... あなたのライセンスキー ..."); > C++ ・ Java の場合 : p.set_option("license=... あなたのライセンスキー ...") > Perl ・ PHP の場合 : $p->set_option("license=... あなたのライセンスキー ...") > RPG の場合 : d licenseopt s 20 c c eval callp licenseopt=%ucs2('license=... あなたのライセンスキー ...') PLOP_set_option(PLOP:licenseopt:0) ラ イ セ ン ス フ ァ イル を使用 実行時呼び出 し に よ っ て ラ イ セ ン ス キーを与え る のではな く 、テ キ ス ト フ ァ イ ル内に以下の形式に従っ て ラ イ セ ン ス キーを書 き 込む こ と も で き ます (PLOP デ ィ ス ト リ ビ ュ ー シ ョ ン に 含 ま れ て い る ラ イ セ ン ス フ ァ イ ル テ ン プ レ ー ト licensekeys.txt を使え ます)。 「#」 キ ャ ラ ク タ で始ま る 行は コ メ ン ト を内容 と し ますので無 視 さ れます。 2 行目は ラ イ セ ン ス フ ァ イ ル自体のバージ ョ ン情報を内容 と し ます : 6 0 章 : 初めての PLOP ・ PLOP DS # PDFlib GmbH製品のライセンシング情報 PDFlib license file 1.0 PLOP 4.1 ...あなたのライセンスキー ... ラ イ セ ン ス フ ァ イ ルには、 複数の PDFlib GmbH 製品の ラ イ セ ン ス キーを、 別々の行ご と に含め る こ と も で き ます。 ま た、 複数のプ ラ ッ ト フ ォ ーム用の ラ イ セ ン ス キーを含めて、 1 個の ラ イ セ ン ス フ ァ イ ルを複数のプ ラ ッ ト フ ォームで使い ま わす こ と も 可能です。 ラ イ セ ン ス フ ァ イ ルは以下の方法で設定で き ます : > licensekeys.txt と い う 名前の フ ァ イ ルが、 すべてのデフ ォ ル ト 位置内で検索 さ れます (「デフ ォ ル ト フ ァ イ ル検索パス」 (8 ページ) 参照)。 > licensefile パ ラ メ タ を set_option( ) API 関数で設定す る こ と も で き ます : p.set_option("licensefile=/path/to/licensekeys.txt"); > PLOP コ マ ン ド ラ イ ン ツールの--plopoptオプシ ョ ン を用いて、licensefileオプシ ョ ン を ラ イ セ ン ス フ ァ イ ルの名前 と と も に与え ます : plop --plopopt "licensefile /path/to/your/licensekeys.txt" ... パス名に空白キ ャ ラ ク タ が含まれ る 場合には、 パ ス を中括弧で囲 う 必要があ り ます : plop--plopopt "licensefile {/path/to/your/license file.txt}" ... > ラ イ セ ン ス フ ァ イ ルを指 し 示す環境(シ ェ ル)変数を設定す る こ と も で き ます。Windows では、 シ ス テ ム コ ン ト ロ ールパネルを用いて 「シ ス テム」 → 「詳細設定」 → 「環境変 数」 を選択 し ます。 Unix では、 下記の よ う な コ マ ン ド を適用 し ます : export PDFLIBLICENSEFILE=/path/to/licensekeys.txt > i5/iSeries シ ス テ ムでは、ラ イ セ ン ス フ ァ イ ルは ASCII でエン コ ー ド さ れてい る 必要があ り ます (asciifile オプシ ョ ン を参照) 。 ラ イ セ ン ス フ ァ イ ルは下記の よ う に指定で き ま す ( こ の コ マ ン ド は、 ス タ ー ト ア ッ ププ ロ グ ラ ム QSTRUP 内で指定す る こ と がで き 、 す べての PDFlib GmbH 製品について動作 し ます) : ADDENVVAR ENVVAR(PDFLIBLICENSEFILE) VALUE(/PLOP/4.1/licensefile.txt) LEVEL(*SYS) ラ イ セ ン スキー を レ ジ ス ト リ に Windows では、 ラ イ セ ン ス フ ァ イ ルの名前を下記レ ジ ス ト リ キーに書 き こ む こ と も で き ます : HKLM\SOFTWARE\PDFlib\PDFLIBLICENSEFILE あ る いは、 ラ イ セ ン ス キーを直接下記レ ジ ス ト リ キーのいずれかに書 き こ む こ と も 可能で す: HKLM\SOFTWARE\PDFlib\PLOP4\license HKLM\SOFTWARE\PDFlib\PLOP4\4.1\license MSI イ ン ス ト ー ラ は、 イ ン ス ト ール時に与え ら れた ラ イ セ ン ス キーを、 こ れ ら の項目の末 尾に書 き 込みます。 注記 64 ビ ッ ト Windows シス テム上で手作業で レ ジス ト リ を操作する際には注意が必要です。通 常、 64 ビ ッ ト PLOP バイ ナ リ は Windows レ ジ ス ト リ の 64 ビ ッ ト ビ ュ ー と と も に動作する のに対 し て、64 ビ ッ ト シ ス テム上で走る 32 ビ ッ ト PDFlib バイ ナ リ はレ ジス ト リ の 32 ビ ッ ト ビ ュ ー と と も に動作 し ます。 32 ビ ッ ト 製品に対する レ ジ ス ト リ キーを手作業で追加す る必要がある場合には、必ず、regedit ツールの 32 ビ ッ ト バージ ョ ン を使用 し て く だ さ い。 0.2 PLOP/PLOP DS ラ イ セ ン スキーを適用 7 これは 「ス タ ー ト 」 → 「 フ ァ イル名を指定 し て実行 ...」 ダ イ ア ログから下記のよ う に呼び 出す こ と がで き ます : %systemroot%\syswow64\regedit デ フ ォ ル ト フ ァ イル検索パス Unix ・ Linux ・ Mac OS X ・ i5/iSeries シ ス テ ム では、 フ ァ イ ルに対 し てパ ス ・ デ ィ レ ク ト リ 名を指定 し ていな く て も 、 い く つかのデ ィ レ ク ト リ がデ フ ォ ル ト で検索 さ れます。 以下のデ ィ レ ク ト リ が検索 さ れます : <rootpath>/PDFlib/PLOP/4.1/resource/cmap <rootpath>/PDFlib/PLOP/4.1/resource/codelist <rootpath>/PDFlib/PLOP/4.1/resource/glyphlst <rootpath>/PDFlib/PLOP/4.1/resource/fonts <rootpath>/PDFlib/PLOP/4.1/resource/icc <rootpath>/PDFlib/PLOP/4.1 <rootpath>/PDFlib/PLOP <rootpath>/PDFlib Unix ・ Linux ・ Mac OS X では、 <rootpath> は まず /usr/local へ置 き 換え ら れ、 ついで HOME デ ィ レ ク ト リ へ置 き 換え ら れます。 i5/iSeries では <rootpath> は空です。 ラ イ セ ン ス ・ リ ソ ース フ ァ イルのデ フ ォ ル ト フ ァ イル名 デフ ォ ル ト では、 デフ ォ ル ト 検索パ スデ ィ レ ク ト リ 内で下記の フ ァ イ ル名が検索 さ れます : licensekeys.txt (ライセンスファイル) こ の機能を利用すれば、環境変数や実行時オプシ ョ ン を設定せずに ラ イ セ ン ス フ ァ イ ルを 扱 う こ と が可能にな り ます。 i5/iSeries ・ zSeries におけ る マルチ シ ス テム ラ イ セ ン ス フ ァ イル i5/iSeries と zSeries 用 の ラ イ セ ン ス キーはシ ス テ ム固有なので、 マルチシ ス テ ム間で共有す る こ と はで き ま せ ん。 リ ソ ース共有を実現 し て、 マルチシ ス テ ムで共有で き る 単一の ラ イ セ ン ス フ ァ イ ルを 扱いたい と き は、 次の ラ イ セ ン ス フ ァ イ ル形式を用いれば、 複数のシ ス テ ム固有のキーを 単一の フ ァ イ ルに保持す る こ と がで き ます。 PDFlib license file 2.0 # Licensing information for PDFlib GmbH products PLOP 4.1 ...あなたのライセンスキー ... PLOP 4.1 ...あなたのライセンスキー ... ...マシン1に対するシリアル番号... ...マシン2に対するシリアル番号... 1 行目のバージ ョ ン番号を変え る こ と に留意 し て く だ さ い。 複数の ラ イ セ ン ス キーを列挙 し 、 それぞれ末尾に 8 桁の 16 進シ リ アル番号 (i5/iSeries の場合) ま たは 4 桁の 16 進 CPU ID (zSeries の場合) を記述 し ます。 さ ま ざ ま な ラ イ セ ン シ ン グオ プ シ ョ ン 1 台ない し 複数のサーバ上で PLOP を使用 し た り 、 PLOP を あ なた自身の製品 と と も に再頒布 し た り す る ための、 さ ま ざ ま な ラ イ セ ン シ ン グオプシ ョ ンが利用可能です。 ま た当社では、 サポー ト 契約 ・ ソ ース コ ー ド 契約 も 提供 し てい ます。 商用 PDFlib ラ イ セ ン ス の取得にご関心があ る 場合や、 ご質問があ る 場合は、 ご連絡 く だ さ い : PDFlib GmbH, Licensing Department Franziska-Bilek-Weg 9, 80339 München, Germany 8 0 章 : 初めての PLOP ・ PLOP DS www.pdflib.com 電話 +49 • 89 • 452 33 84-0 FAX +49 • 89 • 452 33 84-99 ラ イ セ ン ス に関す る お問い合わせ : [email protected] PDFlib ラ イ セ ン ス保持者向けサポー ト : [email protected] 0.2 PLOP/PLOP DS ラ イ セ ン スキーを適用 9 10 0 章 : 初めての PLOP ・ PLOP DS 1 PLOP と PLOP DS の諸機能 1.1 概観 PLOP には 2 つの種類があ り ます。 基本版の PLOP と 、 拡張版の PLOP DS です。 PLOP の諸機能 PLOP は、 以下の種類の PDF 処理機能を持っ てい ます。 > 保護 : PDF 文書を、 ユーザーパ ス ワー ド ま たはマ ス タ ーパ ス ワー ド (ない し 両方) で 暗号化 し ます。 PDF の暗号化を、 利用者がその文書のマ ス タ ーパ ス ワー ド を知っ てい れば除去 し ます。 権限設定 (印刷を許可 し ない、 テ キ ス ト 抽出を許可 し ない等) を、 利 用者がその文書のマ ス タ ーパス ワー ド を知っ ていれば追加 ・ 除去 し ます。 > PDF文書を線形化 し て、PDF フ ァ イ ルを Webサーバか ら 取得す る 際のビ ュ ーア体験を改 善 し ます (後述)。 > 冗長なオブジ ェ ク ト を減 ら す こ と に よ っ て、 PDF 文書のサ イ ズ を最適化 し ます。 > 破損 し てい る PDF 文書を修復 し ます。 > 内蔵の pCOS イ ン タ フ ェ ース を使っ て、文書のセキ ュ リ テ ィ 状態 (ユーザーパ ス ワー ド ま たはマ ス タ ーパス ワー ド で暗号化 さ れてい る ) ・ 権限設定や文書の メ タ デー タ 等、 さ ま ざ ま な特性に関す る 情報を取得 し ます。 > 定義済みやカ ス タ ムの文書情報項目を挿入 ・ 取得 し ます。 > XMP メ タ デー タ を挿入 ・ 取得 し ます。 PLOP DS の諸機能 PLOP DS は、 PLOP の全機能に加え て、 PDF 文書に電子署名を適用 す る 機能を提供 し ます。 こ の署名は Adobe Acrobat か Adobe Reader で検証す る こ と がで き ます。 署名は、 認証形式 PKCS#12 ま たは PFX のデジ タ ル ID か ら 作成す る こ と がで き ます。 Windows では、 Windows 認証ス ト アの中のデジ タ ル ID を使 う こ と も で き ます。 Windows 等 のプ ラ ッ ト フ ォームでは、PKCS#11 に対応 し た暗号 ト ー ク ン を用い る こ と も 可能です (ス マー ト カー ド ・ USB ス テ ィ ッ ク 等)。 利点 PDFlib PLOP と PLOP DS は以下の利点を提供 し ます。 > PLOP ・ PLOP DS の操作はすべて PDF/X ・ PDF/A 対応です。 すなわち、 も し 入力が こ の いずれかの規格に準拠 し てい る と き は、 出力は可能な限 り その同 じ 規格に準拠 し た も のにな る こ と が保証 さ れてい ます。 も し こ れが可能でない と き は (PDF/A 入力に対 し 暗号化を要求 し た場合等)、 その操作を拒否 さ せ る こ と も で き ます し 、 あ る いは規格識 別を除去 さ せ る こ と も で き ます。 > PLOP は ス タ ン ド ア ロ ンの ツールであ り 、サー ド パーテ ィ の ソ フ ト ウ ェ ア を一切必要 と せずに、 PDF の読み取 り ・ 暗号化 ・ 署名 ・ 書 き 出 し が可能です。 > PLOP は技術的に も 法的に も 、 サーバ上に投入す る こ と がで き 、 完全に ス レ ッ ド セーフ であ り 、 メ モ リ リ ー ク について も 検査 さ れてい ます。 PLOP は高負荷のサーバ利用を想 定 し て製作 さ れてお り 、 Web サーバ環境や大量バ ッ チ処理等での活用が可能です。 > PLOP には多 く のプ ラ ッ ト フ ォーム向けの も のがあ り 、い く つかのプ ロ グ ラ ミ ン グ環境 用の も のがあ り ます。 > 柔軟性を高め る ため、 PLOP は コ マ ン ド ラ イ ン ツール と し て も 、 さ ま ざ ま な開発言語用 のプ ロ グ ラ ミ ン グ ラ イ ブ ラ リ ( コ ン ポーネ ン ト ) と し て も 利用可能です。 1.1 概観 11 PLOP/PLOP DS の コ マ ン ド ラ イ ン ツ ール、 それ と も ラ イ ブ ラ リ PLOP/PLOP DS には、 さ ま ざ ま な開発言語用のプ ロ グ ラ ミ ン グ ラ イ ブ ラ リ (コ ン ポーネ ン ト ) と 、 バ ッ チ処理の ための コ マ ン ド ラ イ ン ツールがあ り ます。 ど ち ら も 機能の中身は同 じ ですが、 適 し た応用 の分野が異な り ます。 ラ イ ブ ラ リ と コ マ ン ド ラ イ ン ツールの ど ち ら を選ぶか、 以下にその ガ イ ド ラ イ ン を挙げます。 > PLOP/PLOP DS コ マ ン ド ラ イ ン ツールは、 PDF 文書のバ ッ チ処理に適 し てい ます。 プ ロ グ ラ ミ ン グは必要がな く 、強力な コ マ ン ド ラ イ ンオプシ ョ ン群が提供 さ れてお り 、そ れを使っ て複雑な ワー ク フ ロ ーに組み込む こ と がで き ます。 PLOP/PLOP DS コ マ ン ド ラ イ ン ツールは、 ラ イ ブ ラ リ の使用に対応 し ていない環境か ら も 呼び出す こ と がで き ます。 > PLOP/PLOP DS プ ロ グ ラ ミ ン グ ラ イ ブ ラ リ は、Active Server Pages (ASP)・Visual Basic ・ Java (サーブ レ ッ ト を含む) ・ PHP ・ RPG ・ プ レーン C ・ C++ アプ リ ケーシ ョ ン開発 と い っ た、 広 く 利用 さ れてい る さ ま ざ ま な開発環境に、 き れいに組み込む こ と がで き ま す。 PLOP/PLOP DS ラ イ セ ン ス は、 コ マ ン ド ラ イ ン ツール と ラ イ ブ ラ リ の両方を カバー し て い ます。 12 1 章 : PLOP と PLOP DS の諸機能 1.2 説明書 と 各サ ン プルへの ロ ー ド マ ッ プ PLOP の諸言語バ イ ン デ ィ ン グ用 ミ ニサン プル群 PLOP デ ィ ス ト リ ビ ュ ーシ ョ ンには、 対応す る すべての言語バ イ ンデ ィ ン グ用のシ ン プルなプ ロ グ ラ ミ ン グ作成例が多数含 ま れてい ます。 こ れ ら は以下の よ う に、 PLOP ラ イ ブ ラ リ に よ る 基本的な各種プ ロ グ ラ ミ ン グ タ ス ク のデモン ス ト レーシ ョ ン と な っ てい ます。 > サンプル encrypt では、暗号化 さ れていない PDF 文書を ユーザーパ ス ワー ド と マ ス タ ー パス ワー ド で暗号化 し てい ます。 > サンプル decrypt では、暗号化 さ れてい る PDF 文書を そのマ ス タ ーパ ス ワー ド を用いて 復号 し てい ます。 > サンプル noprint では、ア ク セ ス権限 noprint と nocopy を設定 し 、フ ァ イ ルを マ ス タ ーパ ス ワー ド で暗号化 し てい ます。 > サンプル dumper では pCOS イ ン タ フ ェース を用いて、フ ァ イ ルの各種一般プ ロ パテ ィ や、 暗号化状態に関す る 情報のほか、 文書情報 ・ XMP メ タ デー タ を収集 し てい ます。 > サンプル insertxmp では、フ ァ イ ルか ら XMP メ タ デー タ を読み取っ て、その XMP を PDF 文書に挿入 し てい ます。 試験用のサンプル XMP フ ァ イ ルを添付 し てい ます。 > サンプル linearize では、既存の PDF 文書に線形化を施 し 、ま た、文書情報項目を変更 し てい ます。 最適化処理はデフ ォ ル ト で有効にな っ てい る ため (電子署名を適用す る 際を除 く ) 、 すべ てのサンプルで最適化が暗黙の う ちにデモン ス ト レーシ ョ ン さ れます。 以下の ミ ニサンプルは、 PLOP DS で使用す る ための も のです。 > サンプル sign では、 既存の PDF 文書に電子署名を施す方法を示 し てい ます。 > hellosign では、PDFlib で文書を動的に作成 し 、それを PLOP に受け渡 し て( メ モ リ 上で)、 PLOP でそれに電子署名を施す方法を示 し てい ます。 こ の作成例の動作には PDFlib 製 品が必要ですが、それは PLOP パ ッ ケージには含まれていないのでご注意 く だ さ い。た だ し 、 無料評価版を当社 ウ ェ ブサ イ ト か ら 入手す る こ と がで き ます。 注記 Windows Vista ・ Windows 7 では、 これらの ミ ニサン プルはデ フ ォル ト で 「Program Files」 デ ィ レ ク ト リ に イ ン ス ト ール さ れます。 Windows Vista で新たに導入 さ れたセキ ュ リ テ ィ 方式によ り 、 こ れら のサン プルによ っ て作成 さ れた PDF 出力フ ァ イルは、 「互換性フ ァ イ ル」 の下で し か見え ません。 こ の問題を避ける ため、 作成礼をユーザーデ ィ レ ク ト リ に コ ピーする こ と を推奨 し ます。 PLOP コ マ ン ド ラ イ ン ツ ールの呼び出 し サン プル PLOP コ マ ン ド ラ イ ン ツ ールには さ ま ざ ま なオプシ ョ ンが用意 さ れてお り 、 その解説は 「PLOP ・ PLOP DS コ マ ン ド ラ イ ンオ プシ ョ ン」 (27 ページ) にあ り ます。 1 章の こ の後の各項や、 2.2 節 「PLOP ・ PLOP DS コ マ ン ド ラ イ ンの作成例」 (32 ページ) やその他の章に、 PLOP コ マ ン ド ラ イ ン ツールの呼 び出 し サンプルが含まれてい ます。 pCOS ク ッ ク ブ ッ ク pCOS ク ッ ク ブ ッ ク は、PLOP に内蔵 さ れてい る pCOS イ ン タ フ ェー ス のための コ ー ド 集です。 次の URL にあ り ます。 www.pdflib.com/pcos-cookbook pCOS イ ン タ フ ェース の詳細は、 PLOP パ ッ ケージに含まれてい る pCOS パ ス リ フ ァ レ ン ス で解説 し てい ます。 1.2 説明書 と 各サン プルへのロー ド マ ッ プ 13 1.3 暗号化 ・ 復号 ・ 権限 注記 PDF 文書の暗号化 ・ 復号および権限制限については、 詳 し く は 4 章で説明 し ています。 本 節では概観 と 、 手始めのい く つかの例を示すに と どめます。 権限設定 を取得 PLOP ラ イ ブ ラ リ に内蔵 さ れてい る pCOS プ ロ グ ラ ミ ン グ イ ン タ フ ェー ス を使えば、 PDF 文書の さ ま ざ ま な権限設定を取得す る こ と がで き ます。 必要な関数呼び 出 し と 引数は、 すべての PLOP パ ッ ケージに入っ てい る ミ ニサンプル dumper で見 る こ と がで き ます。 PLOP コ マ ン ド ラ イ ン ツールで こ れに対応す る オプシ ョ ンは- - info です (1.7 節 「pCOS で文書情報を取得」 (18 ページ) にあ る 例を参照)。 PLOP で文書 を暗号化 PLOP_create_file( ) で userpassword オプシ ョ ンか masterpassword オプシ ョ ン (ない し 両方) を指定すれば、 文書を暗号化す る こ と がで き ます。 ただ し ユー ザーパ ス ワ ー ド には必ずマ ス タ ーパ ス ワ ー ド が必要ですが、 その逆は真ではあ り ません。 PDF 文書の暗号化については、 そのサンプル コ ー ド を、 すべての PLOP パ ッ ケージに入っ てい る ミ ニサンプル encrypt で見 る こ と がで き ます。 PLOP コ マ ン ド ラ イ ン ツールで こ れ ら と 等価なオプシ ョ ンは- - user と - - master です。 例 : ユーザーパ ス ワー ド demo と マ ス タ ーパス ワー ド DEMO で フ ァ イ ルを暗号化 : plop --user demo --master DEMO --outfile encrypted.pdf input.pdf plop -u demo -m DEMO -o encrypted.pdf input.pdf PLOP で権限制限 を指定 PLOP_create_file( ) の permissions オプ シ ョ ン には さ ま ざ ま な キーワー ド を設定す る こ と がで き (表 4.3 (54 ページ) 参照)、 こ れに よ っ て権限制限を 指定す る こ と がで き ま す。 PDF 文書の権限設定の指定については、 そのサ ン プル コ ー ド を、すべての PLOP パ ッ ケージに入っ てい る ミ ニサンプル noprint で見 る こ と がで き ます。 PLOP コ マ ン ド ラ イ ン ツールで こ れ と 等価なオプシ ョ ンは- - permissions です。 ただ し 権限 設定には必ずマ ス タ ーパ ス ワー ド が必要です。 例 : 文書を マ ス タ ーパ ス ワー ド DEMO で暗号化 し 、 文書の印刷 と 内容の コ ピーを不許 可にす る : plop --master DEMO --permissions "noprint nocopy" --outfile encrypted.pdf input.pdf plop -m DEMO --permissions "noprint nocopy" -o encrypted.pdf input.pdf PLOP で文書を復号 PLOP_create_file( ) で password オプシ ョ ン に適切な ユーザーパ ス ワー ド かマ ス タ ーパ ス ワー ド を指定すれば、 文書を復号す る こ と がで き ます。 PDF 文書の 復号については、 その完全なサンプル コ ー ド を、 すべての PLOP パ ッ ケージに入っ てい る ミ ニサンプル decrypt で見 る こ と がで き ます。 PLOP コ マ ン ド ラ イ ン ツールで こ れ と 等価 なオプシ ョ ンは- - password です。 例 : 1 個の フ ァ イ ルを、 マ ス タ ーパ ス ワー ド DEMO で復号。 入力文書にア ク セ ス制限 が適用 さ れていて も 、 それ ら はすべて除去 さ れます (出力は復号 さ れ る ので) : plop --password DEMO --outfile decrypted.pdf encrypted.pdf plop -p DEMO -o decrypted.pdf encrypted.pdf 暗号化や復号については、 4.3 節 「 コ マ ン ド ラ イ ンで PDF 文書を保護」 (56 ページ) に も 作成例があ り ます。 14 1 章 : PLOP と PLOP DS の諸機能 1.4 Web 最適化 (線形化) PDF PLOP では、 PDF 文書に、 線形化 と い う 処理を施す こ と がで き ます。 そ こ か ら 生まれ る 特 性は、 「Web 表示用に最適化」 と Acrobat では呼ばれてい ます。 線形化は、 PDF フ ァ イ ル の中の さ ま ざ ま なオブジ ェ ク ト を認識 し て、 情報を付加 し 、 それに よ っ て表示を高速化す る も のです。 線形化 さ れていない PDF は、 ク ラ イ ア ン ト へま る ご と 転送す る 必要があ り ますが、 線 形化 さ れた PDF であれば、 Web サーバはバ イ ト サービ ン グ と い う 処理を用いて、 それを 1 ページずつ転送す る こ と が可能にな り ます。 こ れに よ っ て Acrobat (ブ ラ ウ ザのプ ラ グ イ ン と し て動作 し てい る ) は、 PDF 文書内の個々の部分を別々に取得す る こ と がで き る よ う にな り ます。 その結果 と し てユーザーは、 文書全体がサーバか ら ダ ウ ン ロ ー ド さ れおわ る ま で待た な く て も 、 その文書の最初の 1 ページの閲覧を開始する こ と がで き ます。 こ の こ と はユーザー体験の向上を も た ら し ます。 ただ し 、Web サーバが PDF デー タ を ス ト リ ーム転送す る 先はブ ラ ウ ザであ っ て、PLOP ではあ り ません。 逆に PLOP は、 バ イ ト サービ ン グ可能な PDF フ ァ イ ルを作 り 出すので す。 PDF のバ イ ト サービ ン グ を活用す る ためには、 以下のすべての要請が満た さ れ る 必要 があ り ます。 > PDF 文書が線形化 さ れてい る 必要があ り ます。こ れは PLOP で実現で き ます。線形化は、 暗号化ま たは復号 と 同時に、 一度で適用す る こ と がで き ます。 Acrobat では、 フ ァ イ ル が線形化 さ れてい る か を調べ る には、 その文書のプ ロ パテ ィ を見ます (「Web 表示用に 最適化 : はい」)。 > Web サーバがバ イ ト サービ ン グに対応 し てい る 必要があ り ます。 その基本 と な っ てい る バ イ ト レ ン ジプ ロ ト コ ルは HTTP 1.1 の一部ですので、 現在のすべての Web サーバ に実装 さ れてい ます。 > ユーザーがAcrobat を ブ ラ ウ ザのプ ラ グ イ ン と し て使っ ていて、かつAcrobatでページ ご と のダ ウ ン ロ ー ド を有効に し てい る 必要があ り ます (Acrobat 8/9/X : 「編集」 → 「環境 設定」 → [「一般 ...」 →] 「イ ン タ ーネ ッ ト 」 → 「Web 表示用に最適化を許可」)。 なお、 こ れはデフ ォ ル ト では有効にな っ てい ます。 PDF フ ァ イ ルが大 き ければ大 き いほ ど (ページ数で計 る にせ よ MB で計 る にせ よ )、 それ を Web で送受信す る と き 、 線形化の恩恵を よ り 多 く 受け る こ と にな り ます。 線形化 と 暗号化 / 復号 と は、 組み合わせて適用す る こ と が可能です。 ただ し 、 保護 さ れた フ ァ イ ルを線形化す る ためには、適切なマ ス タ ーパ ス ワー ド を与え る 必要があ り ます (表 4.2 参照)。 注記 PDF 文書を線形化する と 、 線形化情報が付け加え られる ため、 一般にそのフ ァ イルサイ ズ はわずかに増大 し ます。 こ の増大分は、 適用 さ れた最適化技法によ っ て、 帳消 し にな る こ と も な ら ない こ と も あ り ます (1.5 節 「最適化 (軽量化)」 (16 ページ) 参照)。 PLOP で PDF 文書 を線形化 PLOP_create_file( ) で linearize オプシ ョ ン を指定すれば、 線 形化処理を有効にす る こ と がで き ます。 PDF 文書の線形化については、 そのサンプル コ ー ド を、すべての PLOP パ ッ ケージに入っ てい る ミ ニサンプル linearize で見 る こ と がで き ま す。 PLOP コ マ ン ド ラ イ ン ツールで こ れ と 等価なオプシ ョ ンは- - webopt です。 例 : デ ィ レ ク ト リ 内のすべての PDF 文書を線形化 し ( こ れ ら はどれ も パ ス ワー ド が不要 と 前提)、 で き た フ ァ イ ルを タ ーゲ ッ ト デ ィ レ ク ト リ output へ コ ピー。 詳細度レベル 2 は、 すべての 入力 ・ 出力フ ァ イ ルについて、 その処理時に名前を印字 し ます : plop --verbose 2 --webopt --targetdir output *.pdf plop -v 2 -w -t output *.pdf 1.4 Web 最適化 (線形化) PDF 15 1.5 最適化 (軽量化) PDF 文書の処理過程において、 PLOP は、 他の さ ま ざ ま な操作に加え て、 以下の よ う な フ ァ イ ル最適化を施す こ と も で き ます。 > PLOP は、 同一デー タ の重複出現を検出 し て、 1 つを残 し て全部削除 し ます。 こ れは主 に フ ォ ン ト や画像が対象 と な り ますが、 それ以外の種類のデー タ について も 適用 さ れ る こ と があ り ます (ICC プ ロ フ ァ イ ル等や、 あ る いはページで さ え も 、 その内容が ま る ご と 同一であれば)。 埋め込まれてい る フ ォ ン ト や画像は、 も し 他の フ ォ ン ト や画像 の中身が ま っ た く 同 じ デー タ であれば、 削除 さ れ ます。 削除 し たデー タ への参照はす べて、 その フ ォ ン ト や画像を残 し た箇所への参照に置 き 換え ら れ ます。 た と えば、 複 数の PDF 文書を集めて一つの文書に し た場合、 も し それ ら に同 じ フ ォ ン ト が埋め込ま れていたな ら ば、 で き あがっ た PDF の中には余分な フ ォ ン ト デー タ が入っ てい ます。 PLOP はその冗長な フ ォ ン ト デー タ を削除 し て、その フ ォ ン ト のデー タ を 1 つだけ残 し ます。 > 使われていないオブジ ェ ク ト は、 ガベージ コ レ ク シ ョ ン と し て知 ら れ る 処理に よ っ て、 PDF フ ァ イ ルか ら 削除 さ れます。 場合に よ っ ては (Acrobat の 「名前を付けて保存 ...」 / 「別名で保存 ...」 コ マ ン ド でな く 「保存」 コ マ ン ド を使われてい る と ) Acrobat は、 変更情報を フ ァ イ ルに追加 し て、 文書の以前の状態を残 し た ま ま に し てい ます。 PLOP は、 文書の古いバージ ョ ンに まつわ る オブジ ェ ク ト をすべて削除 し ます。 > 出力は、 コ ンパ ク ト な文法を用いて書 き 出 さ れ ます。 た と えば、 不必要な ホ ワ イ ト ス ペース は除去 さ れ、 あ る 種の非効率な構造 (間接整数オブジ ェ ク ト ) は も っ と 効率的 な同等内容に置 き 換え ら れ、16 進文字列( イ ンデ ッ ク ス カ ラ ースペース のためのカ ラ ー パレ ッ ト 等) は も っ と コ ンパ ク ト なバ イ ナ リ 表現に置 き 換え ら れます。 PLOP では、情報の喪失につなが る よ う な最適化の仕方 (フ ォ ン ト の埋め込みをやめた り 、 画像を ダ ウ ンサンプル し た り 等) は一切行い ません。 入力 と ま っ た く 同 じ 品質で文書を表 示 し た り 印刷 し た り す る ために必要な情報がすべて、 出力内へ引き 継がれます。 PLOP で PDF 文書 を最適化 PLOP において最適化はデフ ォ ル ト で有効にな っ てい る の で、 有効にす る ためにオプシ ョ ン を与え る 必要は一切あ り ま せん。 ただ し 、 極限的なパ フ ォーマ ン ス要請に応え る 目的で、 こ の最適化処理を無効にする には、 PLOP_create_file( ) で optimize=none オプシ ョ ン を指定 し ます。 PLOP コ マ ン ド ラ イ ン ツールで こ れ と 等価な オプシ ョ ンは- - fast です。 例 : PLOP コ マ ン ド ラ イ ン ツールで文書を最適化 : plop --outfile optimized.pdf input.pdf plop -o optimized.pdf input.pdf 16 1 章 : PLOP と PLOP DS の諸機能 1.6 破損 PDF のための修復モー ド PLOP では、 破損を受けてい る PDF のための修復モー ド を実装 し てお り 、 あ る 種の破損文 書を も 処理す る こ と が可能にな っ てい ます。 し か し 稀には、 PLOP が修復で き ずに拒否 さ れ る 破損 PDF 文書 も あ り ます。 PLOP で PDF 文書 を修復 修復モー ド は、 破損を受けてい る 入力に PLOP が出会っ た と き に自動的に有効にな り ます。 し か し 、 PLOP_open_document( ) の repair=force オプシ ョ ン を使っ て、文書を開 く 際に何 も 問題が起 こ ら なか っ た場合に も 修復モー ド を強制す る こ と も で き ま す。 PLOP コ マ ン ド ラ イ ン ツ ール で こ れ と 等価 な オ プ シ ョ ン は - - inputopt repair=force です。 repair=none を指定 し て修復モー ド を無効にす る こ と も で き ます。 例 : PLOP コ マ ン ド ラ イ ン ツールで文書の再構築を強制 : plop --inputopt repair=force --outfile repaired.pdf damaged.pdf plop --inputopt repair=force -o repaired.pdf damaged.pdf 無効な XMP メ タ デー タ PLOP は XMP メ タ デー タ 内のあ る 種の問題を修復 し ます。 し か し 問題に よ っ ては修復で き ない も の も あ り ます。た と えば XML メ タ デー タ が XML パーシ ン グエ ラ ーを引 き 起 こ し た場合にはつねにその XMP は使用不能 と さ れます。 PLOP では、 無効な XMP に出会っ た場合の処理動作を制御す る ための xmppolicy オプシ ョ ン を提供 し てい ます。 詳 し く は 「無効な XMP メ タ デー タ の扱い」 (21 ページ) を参照 し て く だ さ い。 1.6 破損 PDF のための修復モー ド 17 1.7 pCOS で文書情報 を取得 pCOS イ ン タ フ ェース については詳 し く は pCOS パ ス リ フ ァ レ ン ス で解説 し てい ます。 こ の項では、 概要 と 、 い く つかの導入的な作成例を紹介 し ます。 PLOP ラ イ ブ ラ リ に内蔵 さ れてい る pCOS プ ロ グ ラ ミ ン グ イ ン タ フ ェ ー ス を使えば、 PDF 文書の さ ま ざ ま な特性を取得す る こ と がで き ます。 pCOS に よ る 文書情報の取得につ いては、 そのサ ン プル コ ー ド を、 すべての PLOP パ ッ ケージに入っ てい る ミ ニサ ン プル dumper で見 る こ と がで き ます。 PLOP コ マ ン ド ラ イ ン ツールで こ れ と 等価なオプシ ョ ン は- - info です。 例 : PDF 文書に関す る セキ ュ リ テ ィ 等の情報を表示 : plop --info *.pdf plop -i *.pdf こ のプ ロ グ ラ ム呼び出 し の出力結果は以下の よ う にな り ます : File name: PDF version: Encryption: Master pw: User pw: nocopy: nomodify: noannots: noassemble: noforms: noaccessible: nohiresprint: plainmetadata: Linearized: PDF/X status: PDF/A status: Tagged PDF: Signatures: Reader-enabled: PLOP-manual.pdf 1.6 No encryption false false false (copying is allowed) false (adding form fields and other changes is allowed) false (adding or changing comments or form fields is allowed) false (insert/delete/rotate pages, creating bookmarks is allowed) false (filling form fields is allowed) false (extracting text or graphics for accessibility is allowed) false (high-resolution printing is allowed) true (metadata is not encrypted) true none none false 0 false No. of pages: 90 No. of fonts: 8 embedded Type 1 CFF font TheSans-Plain embedded Type 1 CFF font TheSansExtraBold-Plain ...他のフォント群... CreationDate: Subject: Author: Creator: Producer: ModDate: Title: 'D:20100616003116Z' 'PDFlib PLOP: PDF Linearization, Optimization, Protection' 'PDFlib GmbH' 'FrameMaker 7.0' 'Acrobat Distiller 8.1.0 (Windows)' 'D:20070616021141Z' 'PDFlib PLOP and PLOP DS Manual' XMP meta data: is present 18 1 章 : PLOP と PLOP DS の諸機能 1.8 文書情報項目 を挿入 ・ 取得 PDF では、 文書に関す る 一般情報を持つ文書 メ タ デー タ と し て、 2 つの種類を利用す る こ と がで き ます : 文書情報項目 と XMP メ タ デー タ です。 文書情報項目 と は、 キーに文字列を関連づけた も のであ り 、 構造化 さ れていない何 ら かの情報を保持 し ます。 定義済みの情報キーであ る Subject ・ Title ・ Author ・ Keywords が 広 く 利用 さ れてい ますが、他に も 特定の目的のために任意のカ ス タ ム キーを定義す る こ と がで き ます。 文書情報項目は、 古 く てシ ンプルな種類の PDF メ タ デー タ であ る と い う こ と がで き ます。 PLOP を使えば、 新 し い文書情報項目を追加 し た り 、 既存の情報項目の値を書 き 換えた り す る こ と がで き ます。 定義済みの項目 も カ ス タ ムの項目 も 設定可能です。 入力文書の中 に XMP 文書 メ タ デー タ があ っ た場合は、 メ タ デー タ の整合性を保つために、 すべての定 義済み情報項目が自動的に XMP メ タ デー タ へ同期 さ れます。 PLOP で文書情報項目 を挿入 PLOP_create_file( ) で docinfo オプシ ョ ン を指定すれば、 文 書情報項目を設定す る こ と がで き ま す。 文書情報項目の設定については、 そのサ ン プル コ ー ド を、すべての PLOP パ ッ ケージに入っ てい る ミ ニサンプル linearize で見 る こ と がで き ます ( こ のサンプルでは線形化のほかに、 文書情報をいかに設定す る か も 例示 し てい ま す)。 例 : 定義済み文書情報項目 「Subject」 と 、 カ ス タ ム情報項目 「Department」 を指定。 なお、 「Product Manual」 を中カ ッ コ で囲っ て スペース キ ャ ラ ク タ を保護 し てい ます : docinfo={Department Techdoc Subject {Product Manual}} こ のオプシ ョ ンは PLOP コ マ ン ド ラ イ ン ツールに、 以下の よ う に - - outputopt オプシ ョ ン で与え る こ と も で き ます : plop --outputopt "docinfo={Department Techdoc Subject {Product Manual}}" --outfile output.pdf input.pdf plop --outputopt "docinfo={Department Techdoc Subject {Product Manual}}" -o output.pdf input.pdf PLOP で文書情報項目 を追加 PLOP ラ イ ブ ラ リ に内蔵 さ れてい る pCOS プ ロ グ ラ ミ ン グ イ ン タ フ ェース を使えば、 PDF 文書か ら 文書情報項目 (キー と 値) を取得す る こ と も で き ます。 必要な関数呼び出 し と 引数は、 すべての PLOP パ ッ ケージに入っ てい る ミ ニサンプ ル dumper で見 る こ と がで き ます。 PLOP コ マ ン ド ラ イ ン ツールで こ れに対応す る オプシ ョ ンは- - info です (1.7 節 「pCOS で文書情報を取得」 (18 ページ) にあ る 例を参照)。 1.8 文書情報項目を挿入 ・ 取得 19 1.9 XMP メ タ デー タ を挿入 ・ 抽出 XMP (Extensible Metadata Platform1) は、 さ ま ざ ま な定義済みプ ロ パテ ィ を持っ た XML フ レーム ワ ー ク の一種です。 し か し その名前が暗示す る よ う に、 XMP は、 個々の要請を 満たす目的で、カ ス タ ムの拡張ス キーマ を用いて拡張す る こ と も で き る よ う にな っ てい ま す。 XMP は文書情報項目 よ り も は る かに強力であ り 、 ま たた と えば PDF/A 標準規格では 必須 と さ れてい ます。 多 く の業界団体が、 XMP に基づいた規格を、 デジ タ ル イ メ ージ ン グやプ リ プ レ ス デー タ 交換等、 さ ま ざ ま な垂直ア プ リ ケーシ ョ ン のために策定 し てい ま す。 XMP に関す る よ り 詳 し い情報や、他の情報源への リ ン ク が www.pdflib.com/knowledgebase/xmp-metadata/ にあ り ます。 PLOP を使えば、 PDF 文書に XMP メ タ デー タ を挿入 し た り 、 PDF か ら XMP を抽出 し た り す る こ と がで き ます。 挿入 さ れた XMP の検証 も 行われ る ので、 生成 さ れ る 出力は必 ず有効であ る こ と が保証 さ れてい ます。 入力文書が PDF/A-1 標準規格に準拠 し てい る 場 合、 ユーザーが与え る XMP は、 PDF/A で定め ら れてい る XMP の諸規則に準拠 し ていな ければな り ません。 こ う し た規則 (XMP 拡張ス キーマの検証を含む) について も PLOP は 検査を行い ますので、 PDF/A-1 入力にユーザーか ら 与え ら れた XMP を加えた結果が必ず 準拠 PDF/A 出力にな る こ と が保証 さ れてい ます。 PLOP に よ る XMP の挿入は、 以下の状況や、 その他多 く の状況で利用す る こ と がで き ます (カ ッ コ 内は、 PLOP デ ィ ス ト リ ビ ュ ーシ ョ ンに含まれてい る サンプル XMP フ ァ イ ルの名前です)。 > XMP メ タ デー タ を PDF/A-1 文書に追加。PDF/A-1 規格で定義 さ れてい る XMP 拡張ス キーマに も 対応 し てい ます (machine_pdfa1.xmp)。 > デジ タ ル化 さ れた レ ガシ文書の ス キ ャ ン過程を記述 し た XMP メ タ デー タ を追加 (engineering.xmp)。 > Ghent Workgroup (GWG) Ad Ticket ス キームに従っ た XMP メ タ デー タ を追加 (gwg_ad_ticket.xmp)。 詳 し く は www.gwg.org/Jobtickets.phtml を参照 し て く だ さ い。 > 会社独自の XMP メ タ デー タ を追加 (acme.xmp)。 PLOP で XMP メ タ デー タ を挿入 メ タ デー タ を挿入す る ためには、有効な XMP メ タ デー タ を UTF-8形式で持つフ ァ イ ルを作成す る 必要があ り ます。PLOP_create_file( )でmetadata オプシ ョ ン を指定すれば、 XMP を挿入す る こ と がで き ます。 こ のオプシ ョ ン には、 い く つかのサブオプシ ョ ン も 用意 さ れてい ます。 PDF 文書への XMP の挿入については、 その サンプル コ ー ド を、 すべての PLOP パ ッ ケージに入っ てい る ミ ニサンプル insertxmp で見 る こ と がで き ます。 例 : gwg_ad_ticket.xmp と い う フ ァ イ ルか ら XMP メ タ デー タ を挿入 し て、 XMP 2004 標 準規格にて ら し てその XMP を検証 さ せ る : plop --outputopt "metadata={filename=gwg_ad_ticket.xmp validate=xmp2004}" --outfile output.pdf input.pdf plop --outputopt "metadata={filename=gwg_ad_ticket.xmp validate=xmp2004}" -o output.pdf input.pdf PLOP で XMP メ タ デー タ を抽出 PLOP ラ イ ブ ラ リ に内蔵 さ れてい る pCOS プ ロ グ ラ ミ ン グ イ ン タ フ ェース を使えば、PDF 文書か ら XMP メ タ デー タ を抽出す る こ と も で き ます。 必要な関数呼び出 し と 引数は、 すべて の PLOP パ ッ ケージ に入 っ て い る ミ ニ サ ン プル dumper で見 る こ と がで き ます。 ただ し 、 こ のサンプル dumper の中のサンプル コ ー ド は、 1. www.adobe.com/products/xmp を参照 20 1 章 : PLOP と PLOP DS の諸機能 実際に XMP メ タ デー タ を印字 し てい る のではな く 、単に文書内で見つか っ た XMP のサ イ ズ を報告 し てい る だけです。 PLOP コ マ ン ド ラ イ ン ツールを使っ て XMP メ タ デー タ を抽出す る こ と はで き ません。 当社では強力な pCOS コ マ ン ド ラ イ ン ツールを提供 し てお り 、 こ れを使えば PDF 内の情 報を抽出す る こ と が可能です。 無効な XMP メ タ デー タ の扱い PDF 文書は と き に、XML レベルで無効な、あ る いは XMP/ RDF レベルで無効な XMP メ タ デー タ を含んでい る こ と があ り ます。 PLOP はデフ ォ ル ト ではその よ う な文書を拒絶 し 処理を停止 し ます。 こ の よ う な入力文書について よ り 細かい 制御を行いたい場合は、 PLOP_open_document( ) に対 し て xmppolicy オプシ ョ ン を用いれ ば以下の場合を区別す る こ と がで き ます : > xmppolicy=rejectinvalid:デフ ォ ル ト では、無効な XMP があれば PLOP は PDF 出力を生成 し ません。 > xmppolicy=ignoreinvalid:無効な XMP を無視 し 、デバ ッ グ支援のために生成出力 XMP 内 に XMP パーシ ン グエ ラ ー メ ッ セージのテ キ ス ト を含め ます。こ のオプシ ョ ンでは PDF/ A ま たは PDF/X-3/4/5 出力は一切生成 さ れない こ と に留意 し て く だ さ い。 > xmppolicy=remove : こ れは、 望ま し く ない メ タ デー タ を削除する ために有用です。 た と えば、 無効な XMP メ タ デー タ に よ っ て文書群のバ ッ チ処理が中断 さ れ る のを防 ぐ に は、 入力文書内の無効な XMP が引 き 起 こ す問題を無視す る こ と がで き ます : plop --inputopt "xmppolicy=ignoreinvalid" --outfile output.pdf input.pdf plop --inputopt "xmppolicy=ignoreinvalid" -o output.pdf input.pdf 1.9 XMP メ タ デー タ を挿入 ・ 抽出 21 1.10 PLOP DS で電子署名 注記 PDF 文書に電子的に署名で き る機能は、 PLOP DS でのみ利用で き る ものであ り 、 基本版 の PLOP にはあ り ません。 注記 PDF 文書に対する電子文書については、 詳 し く は 5 章で説明 し ています。 本節では概観 と 、 手始めのい く つかの例を示すに と どめます。 署名の諸特性 を取得 PLOP ラ イ ブ ラ リ に内蔵 さ れてい る pCOS プ ロ グ ラ ミ ン グ イ ン タ フ ェース を使えば、 PDF 文書の署名の諸設定を取得す る こ と がで き ます。 必要な関数呼び 出 し と 引数は、pCOS ク ッ ク ブ ッ ク の interactive_elements/signatures ト ピ ッ ク にあ り ます。 PLOP コ マ ン ド ラ イ ン ツールで こ れに対応す る オプシ ョ ンは- - info です (1.7 節 「pCOS で 文書情報を取得」 (18 ページ) を参照)。 PLOP DS で文書に署名 署名を適用す る にはデジ タ ル ID が必要であ り 、こ れはフ ァ イ ル と し て、 ま たは Windows 証明書ス ト アの中で、 あ る いは暗号 ト ー ク ン上で (ス マー ト カー ド ・ USB ス テ ィ ッ ク 等) 得 る こ と がで き ます。 前者はデジ タ ル ID にア ク セ スす る ために パ ス ワー ド が必要ですが、Windows 証明書ス ト アは通常は Windows ロ グ イ ンで保護 さ れて い る のでパ ス ワー ド は不要です。 暗号 ト ー ク ンは多 く の場合 PIN で保護 さ れてい ます。 電子署名を適用す る には、 PLOP_create_file( ) で sign オプシ ョ ン を指定すれば よ く 、 こ れにはい く つかのサブオプシ ョ ン も 指定で き ます。 PDF 文書への署名については、 そのサ ンプル コ ー ド を、 すべての PLOP パ ッ ケージに入っ てい る ミ ニサンプル sign で見 る こ と がで き ます。 PLOP コ マ ン ド ラ イ ン ツールで こ れ と 等価なオプシ ョ ンは- - signopt です。 ミ ニサンプル hellosign では、 PDFlib で PDF 文書を動的に作成 し たのち、 PLOP DS で署名を 施す方法を示 し てい ます。 例 : フ ァ イ ル demo2048.p12 の中のデジ タ ル ID を使っ て、 PDF 文書に不可視の署名を 作成。 デジ タ ル ID に対す る パ ス ワー ド は、 フ ァ イ ル pw.txt に入っ てい ます : plop --signopt "digitalid={filename=demo2048.p12} passwordfile=pw.txt" --outfile signed.pdf input.pdf plop -S "digitalid={filename=demo2048.p12} passwordfile=pw.txt" -o signed.pdf input.pdf (Windows のみ) Windows 証明書ス ト アの中の証明書 (デフ ォ ル ト の ス ト ア 「My」 の中の) を使っ て、 PDF 文書に不可視の署名を作成。 こ こ では、 デジ タ ル ID はパ ス ワー ド を与え る 必要がない よ う に、あ なたの Windows ロ グ イ ンに よ っ て保護 さ れてい る こ と を前提 と し てい ます : plop --signopt "engine=mscapi digitalid={certstore={store=My subject={DEMO PLOP User 2048}}}" --outfile signed.pdf input.pdf plop -S "engine=mscapi digitalid={certstore={store=My subject={DEMO PLOP User 2048}}}" -o signed.pdf input.pdf (Windows 等、 PKCS#11 に対応 し たプ ラ ッ ト フ ォームのみ) 暗号 ト ー ク ンか ら のデジ タ ル ID を用いて、 PDF 文書に不可視の署名を作成 し ます。 ト ー ク ンに対す る PKCS#11 イ ン タ フ ェース は ラ イ ブ ラ リ cryptoki.dll に実装 さ れてお り 、 こ の ラ イ ブ ラ リ は ス マー ト カー ド のサプ ラ イ ヤーに よ っ て提供 さ れてい る 必要が あ り ま す。 デジ タ ル ID のパ ス ワ ー ド は pw.txt に入っ てい ます。 plop --signopt "engine=pkcs#11 digitalid={filename=cryptoki.dll} passwordfile=pw.txt" --outfile signed.pdf input.pdf 22 1 章 : PLOP と PLOP DS の諸機能 plop -S "engine=pkcs#11 digitalid={filename=cryptoki.dll} passwordfile=pw.txt" -o signed.pdf input.pdf 5.3 章には も っ と 署名に関す る 作成例があ り ます。 1.10 PLOP DS で電子署名 23 1.11 PLOP の処理の詳細 受け入れ可能な入力文書 PLOP は、 以下の種類の PDF を受け入れ、 処理、 生成 し ます : > PDF 1.4 (Acrobat 5) お よ びそれ よ り 古いすべてのバージ ョ ン > PDF 1.5 (Acrobat 6) > PDF 1.6 (Acrobat 7) > PDF 1.7 (Acrobat 8)。 技術的に ISO 32000-1 と 同等 > PDF 1.7 Adobe 拡張レベル 3 (Acrobat 9) > PDF 1.7 Adobe 拡張レベル 8 (Acrobat X) > PDF 2.0。 ISO 32000-2 で仕様化 さ れてい ます 行いたい操作に よ っ ては、暗号化文書に対 し てはパ ス ワー ド が必要にな り ます。PLOP は、 さ ま ざ ま な種類の破損 PDF 文書の修復を試みます。 入力文書 と 要求操作 と の、 あ る 種の 組み合わせには制約が課 さ れますので、 以下にそれを示 し ます。 PDF のバージ ョ ン 生成 さ れ る 出力文書の PDF バージ ョ ン番号は、入力文書の PDF バー ジ ョ ン番号 よ り も 低 く な る こ と は決 し て あ り ませんが、 以下に示す よ う に、 強制的に高い 番号へ上げ さ せ ら れ る こ と はあ り ます。 PDF 出力のバージ ョ ンは、 PLOP_create_file( ) の、 ま たは PLOP コ マ ン ド ラ イ ン ツールの - - outputopt オプシ ョ ンの、compatibility オプシ ョ ン で指定す る こ と がで き ます。 こ のオプシ ョ ンが指定 さ れていない と き は、 PLOP は入力文 書の PDF バージ ョ ン を使い ますが、 それは以下の規則に従っ て変更 さ れます : > 暗号化、すなわち userpassword・masterpassword・permissions オプシ ョ ンの う ちいずれ かが指定 さ れてい る と き は、 バージ ョ ンは PDF 1.4 へ押 し 上げ ら れます。 > 文書に電子的に署名す る と (sign オプシ ョ ン)、バージ ョ ンは PDF 1.3 へ押 し 上げ ら れま す。 > XMP メ タ デー タ を挿入す る と (metadata オプシ ョ ン)、バージ ョ ンは PDF 1.4 へ押 し 上 げ ら れます。 > permissions オプシ ョ ンで plainmetadata キーワー ド が指定 さ れてい る と 、バージ ョ ンは PDF 1.5 へ押 し 上げ ら れます。 PDF/A の実装根拠 以下の規格 と 文書が、 PLOP におけ る PDF/A 実装の根拠を成 し てい ます : > PDF/A 規格 (ISO 19005-1:2005) > 技術補遺 1 (ISO 19005-1:2005/Cor 1:2007) > 技術補遺 2 (ISO 19005-1:2005/Cor.2:2010) > PDF/A 技術セ ン タ ーが発行 し たすべての関連 TechNote 入力 PDF の特定の特性 を放棄 PDF 文書の特性の う ちのい く つかは、 PLOP の操作 と 衝 突す る 可能性があ り ます。 た と えば、 PDF/A 文書では暗号化を使 う こ と は許 さ れません。 PDF/A 入力に暗号化を かけ る よ う 指示 さ れた ら 、 PLOP はど の よ う にす る べ き で し ょ う か。 デ フ ォ ル ト で は PLOP は、 例 外 を 発 生 さ せ て そ の 操 作 を 拒 絶 し ま す。 し か し 、 PLOP_create_file( ) で、 ま たは PLOP コ マ ン ド ラ イ ン ツールの - - outputopt オプシ ョ ンで、 sacrifice と い う オプシ ョ ン を使えば、 行わせたい操作に対 し て、 入力特性 よ り も 高い優先 順位を与え る こ と がで き ます。 上記の例でいえば、 暗号化を許すために、 PDF/A 準拠項 目は文書か ら 除去 さ れます。 24 1 章 : PLOP と PLOP DS の諸機能 入力文書の特性 と 、 行わせたい操作 と の組み合わせは、 い く 通 り かあ り ます。 そのい ずれの組み合わせにおいて も 、 sacrifice オプシ ョ ン を使えば、 文書のあ る 特定の特性を放 棄す る こ と に よ っ て操作が許 さ れます (詳 し く は表 7.4 (81 ページ) 参照) : > PDF/A:PLOP は電子署名を、PDF/A 準拠なや り 方で適用 し ます。PDF/A-1a ま たは PDF/ A-1b 標準規格に準拠 し てい る 入力文書は、 署名を し た後 も PDF/A 準拠であ る こ と が 保証 さ れてい ます。し か し 、暗号化を施す こ と 、すなわちuserpassword・masterpassword・ permissions オプシ ョ ンのいずれか を指定す る こ と は、 PDF/A では暗号化が一切禁止 さ れてい る ため、 PDF/A 文書に対 し ては許 さ れません。 し か し sacrifice={pdfa1} オプシ ョ ン を指定すれば、 PDF/A 準拠を放棄す る こ と がで き ます。 > PDF/X : PDF/X-1a/3/4/5 では、 暗号化や、 ページ上に可視の署名フ ィ ール ド を置 く こ と は 許 さ れ て い ま せ ん。 こ う し た 状 況 で は PLOP は 例 外 を 発 生 さ せ ま す が、 sacrifice={pdfx} オプシ ョ ン を指定すれば、 PDF/X 準拠を放棄す る こ と がで き ます。 > 入力文書の中の既存の署名は引 き 継がれません (証明書の署名 も )。 既存の署名を壊 さ ない よ う にする ため、 PLOP は、 すでに 1 つない し 複数の署名を持っ てい る 文書に署名 をす る こ と を拒否 し ます。 PLOP_create_file( ) に対 し て、 ま たは PLOP コ マ ン ド ラ イ ン ツールの- - outputopt オプシ ョ ンに対 し て、sacrifice={signature} と い う オプシ ョ ン を指 定すれば、 既存の署名を放棄す る こ と がで き ます。 > PLOP は、 Appearance を持たない フ ォーム フ ィ ール ド (PDFlib 6 ま たは 7 で作成 さ れた フ ォ ーム フ ィ ール ド 等) を持っ た文書には署名を適用で き ないので、 その種の入力に 対 し ては例外を発生 さ せます。 その理由は、 Acrobat はフ ォーム フ ィ ール ド に対 し て欠 けてい る ア ピ ア ラ ン ス ス ト リ ーム を再構成す る 必要があ り 、 す る と ただちに署名は無 効にな っ て し ま う ためです。 こ の場合、 PLOP_create_file( ) に対 し て、 ま たは PLOP コ マ ン ド ラ イ ン ツールの- - outputopt オプシ ョ ンの中で、sacrifice={fields} と い う オプシ ョ ン を指定すれば、 すべての既存フ ォーム フ ィ ール ド を放棄す る こ と がで き ます。 > 暗号化 さ れていない文書の中に、 暗号化 さ れた フ ァ イ ル添付が入っ てい る と き 、 その パ ス ワ ー ド が 得 ら れ な い と 、 処 理 は デ フ ォ ル ト で は 停 止 し ま す。 こ の 場 合、 PLOP_create_file( ) に対 し て、 ま たは PLOP コ マ ン ド ラ イ ン ツールの - - outputopt オプ シ ョ ンの中で、 sacrifice={encryptedattachments} と い う オプシ ョ ン を指定すれば、 すべ ての暗号化 さ れた フ ァ イ ル添付を放棄す る こ と がで き ます。 こ のオプシ ョ ン を指定す る と 、 パス ワー ド が得 ら れない暗号化 さ れた フ ァ イ ル添付はすべて除去 さ れます。 入力文書か ら 無条件に失われ る特性 以下の入力文書の特性は、PLOP の ど の操作を施 し て も 失われます : > 入力文書が線形化 さ れてい る と き 、 その線形化はデフ ォ ル ト では失われ ます。 出力を 線形化す る には、 PLOP_create_file( ) に linearize オプシ ョ ン を、 ま たは PLOP コ マ ン ド ラ イ ン ツールに- - linearize オプシ ョ ン を与え ます。 > Reader 有効化 さ れた文書 : Reader 有効化 さ れてい る PDF 文書を PLOP で処理す る と 、 Reader 有効化 さ れていない出力が生成 さ れます。Reader 有効化 さ れた PDF を作れ る の は Adobe ソ フ ト ウ ェ アだけですので、 こ れを ど う にかす る 方法はあ り ません。 必要な一時デ ィ ス ク 容量 PLOP は入力 PDF 文書を読み込んで、 出力 PDF を書 き 出 し ま す。 出力文書は、 おお よ そ入力文書 と 同 じ デ ィ ス ク 容量を必要 と し ます (PLOP の最適化 処理に よ っ て冗長な情報が削除 さ れなければ) 。 多 く の場合、 こ れ よ り 多 く のデ ィ ス ク 容 量が必要にな る こ と はあ り ません。 し か し PLOP/PLOP DS は、 線形化か電子署名が有効 に さ れてい る と き には、 その操作のために追加の一時デ ィ ス ク 容量を必要 と し ます。 一時 フ ァ イ ルはデ フ ォ ル ト で は カ レ ン ト デ ィ レ ク ト リ に作成 さ れ ま すが、 こ れは PLOP_create_file( ) の tempdirname オプシ ョ ン で変え る こ と も で き ます。一時デー タ のデ ィ 1.11 PLOP の処理の詳細 25 ス ク 容量は、 おお よ そ入力フ ァ イ ルのサ イ ズに等 し く な り ます。 線形化 と イ ン コ ア PDF 生成 (すなわち出力フ ァ イ ル名を与えない) を と も に行 う と き は、 PLOP は、 おお よ そ入 力のサ イ ズの 2 倍の一時デ ィ ス ク 容量を必要 と し ます。 大容量 PDF 文書 多 く のユーザーはギガバ イ ト 単位の PDF 文書を扱 う 必要には迫 ら れな いで し ょ う が、 業務アプ リ ケーシ ョ ンのなかには、 大量の請求書や明細な ど を含む文書を 作成 し た り 処理 し た り す る 必要があ る も のがあ り ます。 PLOP 自体は生成す る 文書のサ イ ズにいかな る 制約 も 設けてい ませんが、 PDF Reference やい く つかの PDF 規格に よ っ て課 せ ら れ る い く つかの制限があ り ます : > 2 GB フ ァ イ ルサ イ ズ制限:PDF/A-1 な ど の規格では、フ ァ イ ルサ イ ズ を 2 GB ま でに制 限 し てい ます。一文書が こ の制限 よ り も 大き く な る 場合には、PLOP は PDF/A-1・PDF/ X-4 ・ PDF/X-5 出力を生成 し てい る と き には例外を発生 さ せます。 それ以外の場合で あれば 2 GB を超え る 文書を作成で き ます。 > 10 GB フ ァ イ ルサ イ ズ制限:PDF文書内の相互参照テーブルは、10進10桁すなわち 10101 バ イ ト ま でに制限 さ れてい ます。 こ れはお よ そ 9.3 GB にあ た り ます。 PLOP は こ の 制限を超え る 文書を作成す る こ と はで き ません。 > オブジ ェ ク ト の数 : 一文書内のオブジ ェ ク ト の数は全般的には PDF に よ っ て制限 さ れ てい ませんが、 PDF/A-1 ・ PDF/X-4 ・ PDF/X-5 規格では、 一文書内の間接オブジ ェ ク ト の数を 8,388,607 個ま でに制限 し てい ます。一文書が こ の制限を超え る オブジ ェ ク ト を必要 と す る と き は、 PLOP は PDF/A-1 ・ PDF/X-4 ・ PDF/X-5 出力を生成 し てい る と き には例外を発生 さ せます。 それ以外の場合であれば も っ と オブジ ェ ク ト の多い文書 も 作成で き ます。 PDF 内のオブジ ェ ク ト の数は、 ページ内容の複雑 さ や、 相互参照要 素の数な ど に依存 し ます。 シ ンプルな内容の大容量文書は通常、 ページ あ た り 4 ~ 10 個程度のオブジ ェ ク ト を持ち ますので、 100 ~ 200 万ページ程度の文書であれば こ の オブジ ェ ク ト 制限を超えずに作成す る こ と がで き ます。 26 1 章 : PLOP と PLOP DS の諸機能 2 PLOP ・ PLOP DS コ マ ン ド ラ イ ン ツール 2.1 PLOP ・ PLOP DS コ マ ン ド ラ イ ン オ プ シ ョ ン PLOP と PLOP DS に一体化 し た コ マ ン ド ラ イ ン ツールを使 う と 、 一切プ ロ グ ラ ミ ン グ を 行 う 必要な し に、 1 個ない し 複数の PDF 文書に対 し て、 暗号化 ・ 復号 ・ 最適化 ・ 修復 ・ 署 名を行 う こ と がで き ます。 さ ら に、 こ れを使っ て PDF 文書の状態を取得す る こ と も 可能 です。 PLOP のプ ロ グ ラ ム を、 豊富な コ マ ン ド ラ イ ン オプシ ョ ン で制御す る こ と がで き ま す。 こ れは 1 個ない し 複数の入力 PDF フ ァ イ ルに対 し て、 次の よ う に呼び出 さ れます (角 カ ッ コ 内の項目はオプシ ョ ナルです) : plop plop plop plop --help [ <一般のオプション群> ] --info [ --outfile <ファイル名> ] <ファイル名> ... [ <一般のオプション群> ] <変換オプション群> --outfile <ファイル名> <ファイル名> [ <一般のオプション群> ] <変換オプション群> --targetdir <パス名> <ファイル名>... PLOP コ マ ン ド ラ イ ン ツールは、PLOP ラ イ ブ ラ リ に乗っ か る 形で作 ら れてい ます。デフ ォ ル ト では PLOP は、 破損 し てい る こ と がわか っ た入力文書については修復を行い、 ま た、 出力の フ ァ イ ルサ イ ズが最小にな る よ う 最適化を行い ます。 ラ イ ブ ラ リ のオプシ ョ ン を、 7 章のオプシ ョ ン一覧に従っ て、- - inputopt・- - outputopt・- - plopopt オプシ ョ ン を使っ て与 え る こ と がで き ます。 表 2.1 にすべての PLOP コ マ ン ド ラ イ ン オプシ ョ ン を挙げます。 表 2.1 PLOP コ マ ン ド ラ イ ンオプ シ ョ ン一覧 オプ シ ョ ン 引数 機能 -- オプ シ ョ ン群の リ ス ト を終了 し ます。 これは、 フ ァ イル名が - キ ャ ラ ク タ で始ま る場合に有用です。 @filename1 オプ シ ョ ン群を記述 し た レ スポン ス フ ァ イルを指定 し ます。 文法の詳細 は、 「レ スポン ス フ ァ イル」 (30 ページ) を参照 し て く だ さ い。 レ スポ ン ス フ ァ イルは、 -- オプ シ ョ ンの前、 かつ最初の filename の前でのみ認 識 さ れ、 また、 他のオプ シ ョ ンの引数を置き換え る ために用いる こ と は で き ません。 2.1 PLOP ・ PLOP DS コ マ ン ド ラ イ ン オプ シ ョ ン 27 表 2.1 PLOP コ マ ン ド ラ イ ンオプ シ ョ ン一覧 オプ シ ョ ン 引数 機能 --compatibility, -c < バージ ョ ン > 生成 さ れる PDF 出力文書の PDF バージ ョ ン を設定 し ます : 1.4 PDF 1.4。 Acrobat 5 以上を必要 と し ます。 1.5 PDF 1.5。 Acrobat 6 以上を必要 と し ます。 1.6 PDF 1.6。 Acrobat 7 以上を必要 と し ます。 1.7 PDF 1.7。 ISO 32000-1 で仕様化 さ れてお り 、 Acrobat 8 以上を 必要 と し ます。 1.7ext3 PDF 1.7 拡張レ ベル 3。 Acrobat 9 以上を必要 と し ます。 1.7ext8 PDF 1.7 拡張レ ベル 8。 Acrobat X を必要 と し ます。 2.0 PDF 2.0。 ISO 32000-2 で仕様化 さ れています。 出力が暗号化 さ れている場合には、 こ れを用いて適切な暗号化アルゴ リ ズムが選ばれます。 こ の選ばれた PDF バージ ョ ンの対応 し う る最も 強 い暗号化アルゴ リ ズムが用い られます (AES 暗号化を強制する には 1.6 を指定 し ます)。 こ こ で選んだ PDF バージ ョ ンは、 他のオプ シ ョ ンに よ っ て、 表 7.4 (81 ページ) で詳述する規則に従っ て、 自動的に押 し 上 げ られる こ と があ り ます : デ フ ォル ト : 入力文書の PDF バージ ョ ン、 またはそれよ り 上の処理規 則が義務づけるバージ ョ ン。 --fast, -f 最適化ス テ ッ プ を無効に し て、 処理を高速化 し ます。 --help, -? (またはオ プシ ョ ンな し) 利用で き る オプ シ ョ ン を ま と めたヘルプ を表示 し ます。 --info, -i 入力フ ァ イルに対する状態情報を表示 し ます。 PDF 出力は生成 さ れませ ん。 --inmemory 入力フ ァ イル (複数可) を メ モ リ に読み込んで、 その上で処理 し ます。 こ れはシ ス テムによ っ ては劇的なパフ ォ ーマ ン ス向上を も た ら し ます。 --inputopt < オプ シ ョ ン リ スト > PLOP_open_document( ) 用のオプ シ ョ ン リ ス ト を指定で き ます (表 7.3 (78 ページ) 参照) --master2,3, -m < パスワー ド > 出力のマス タ ーパスワー ド 。 オプ シ ョ ン な し はパスワー ド な し を意味 し ます。 --noreplace, -n 出力フ ァ イルがすでに存在する と きは、 上書き さ れずに例外が発生 し ま す。 デ フ ォル ト : 出力フ ァ イルがすでに存在 し ていて も上書き さ れま す。 --outfile, -o < フ ァ イル名 > (--info の場合を除いて、 ち ょ う ど 1 個の入力文書が必須です。 --outfile と --targetdir のど ち らか 1 つを与え る必要があ り ます) 出力 フ ァ イル 名。 入力 と 出力のフ ァ イル名は異な る必要があ り ます。 --outputopt < オプ シ ョ ン リ スト > PLOP_create_file( ) 用のオプ シ ョ ン リ ス ト を指定で き ます (表 7.4 (81 ページ) 参照) --password2, -p < パスワー ド > 入力文書 (複数可) のためのユーザーパスワー ド またはマス タ ーパス ワー ド 。 こ のパスワー ド がすべての入力文書に対 し て使われます。 必要 なパスワー ド が入力文書に よ っ て異な る と きは、 それぞれ別個のプ ログ ラ ム呼び出 し で処理する必要があ り ます。 28 2 章 : PLOP ・ PLOP DS コ マ ン ド ラ イ ン ツール 表 2.1 PLOP コ マ ン ド ラ イ ンオプ シ ョ ン一覧 オプ シ ョ ン 引数 機能 --permissions2 ,3 < 権限群 > (--master が必須です) 出力文書に対する ア ク セス権限 リ ス ト 。 キー ワー ド noprint ・ nomodify ・ nocopy ・ noannots ・ noassemble ・ noforms ・ noaccessible ・ nohiresprint ・ plainmetadata を任意の数含みます (表 4.3 (54 ページ) 参照)。 こ の他に、 次のキーワー ド も使え ます (デ フ ォ ル ト : 権限制限な し ) : keep 入力文書の権限設定を引き継ぎ ます。 入力文書か ら引き継い だ権限設定に変更を加え る ために、 こ の設定にキーワー ド を 追加 し て修正条項 と する こ と も で き ます。 例 : keep noprint --plopopt < オプ シ ョ ン リ スト > PLOP_set_option( ) 用のオプ シ ョ ン リ ス ト を指定で き ます (表 7.7 (89 ページ) 参照)。 こ れを使 っ て、 license または licensefile オプ シ ョ ン を渡 す こ と が可能です。 --recsize, -R < ブ ロ ッ クサイ ズ> (MVS のみ) 出力フ ァ イルのレ コ ー ド サイ ズ。 デ フ ォ ル ト : 0 (非ブ ロ ッ ク) --tempfilename, -T < フ ァ イル名 > (MVS のみ) PLOP の内部処理に必要な一時フ ァ イルのフル フ ァ イル名。 空にする と 、 PLOP が一意な一時フ ァ イル名を生成 し ます。 PLOP が完 了 し た時に この一時フ ァ イルを削除するのはユーザー側の役割です。 デ フ ォル ト : 空 --tempdirname < ディ レク ト リ 名> PLOP の内部処理に必要な一時 フ ァ イルの作成 さ れるデ ィ レ ク ト リ の名 前。 空にする と 、 PLOP は一時 フ ァ イルを カ レ ン ト デ ィ レ ク ト リ に生成 し ます。 デ フ ォ ル ト : 空 --searchpath, -s1 < パス > (複数回指定可) フ ァ イルの検索 さ れるデ ィ レ ク ト リ の名前。 このパス はマ イ ナスキ ャ ラ ク タ 「-」 で始めてはいけません (その必要があ る と きは頭に ./ を付けます)。 デ フ ォ ル ト : カ レ ン ト デ ィ レ ク ト リ --signopt, -S < オプ シ ョ ン リ スト > (PLOP DS でのみ利用可能) 文書に電子的に署名する ための、 PLOP_create_file( ) の sign オプ シ ョ ン用のオプ シ ョ ン リ ス ト を指定で き ます (表 7.6 (84 ページ) 参照)。 --targetdir, -t < ディ レク ト リ 名> (--outfile と --targetdir のど ち ら か 1 つを与え る必要があ り ます) 出力 デ ィ レ ク ト リ 名。 このデ ィ レ ク ト リ はすでに存在 し ていなければな り ま せん。 --user, -u2,3 < パスワー ド > 出力のユーザーパスワー ド 。 オプ シ ョ ン な し はパスワー ド な し を意味 し ます。 --verbose, -v 0, 1, 2, 3 詳細度レ ベル (デ フ ォ ル ト : 1) : 0 出力な し 1 エ ラ ーのみ 2 エ ラ ー と フ ァ イル名 3 詳細レポー ト --webopt, -w PDF 出力を Web 配信のために線形化 し ます。 線形化は他の さ ま ざ ま な 処理オプ シ ョ ン と 組み合わせる こ と も で き ます し 、 単独で使 う こ と も で き ます。 デ フ ォ ル ト : 線形化 し ない 1. こ のオプ シ ョ ンは複数回与え る こ と も で き ます。 2. こ のオプ シ ョ ンはすべての入力 フ ァ イルに対 し て用い ら れます。 3. こ のオプ シ ョ ン を指定する と 出力は暗号化 さ れます。 これ ら の う ちのいずれか 1 つで も 与え る と 、 PLOP は出力を暗号化 し ます。 2.1 PLOP ・ PLOP DS コ マ ン ド ラ イ ン オプ シ ョ ン 29 PLOP コ マ ン ド ラ イ ン を組み立て る PLOP コ マ ン ド ラ イ ン を組み立て る 際には、 以下の 規則を守 る 必要があ り ます : > 入力フ ァ イ ルは、 searchpath と し て指定 さ れたすべてのデ ィ レ ク ト リ 内で検索 さ れま す。 > オプシ ョ ンに よ っ ては短縮形 も 利用で き 、 長いオプシ ョ ン と 混ぜ書 き も 可能です。 > 長いオプシ ョ ンは省略 も で き ますが、 ただ し その省略形は一意でな く てはな り ません (例 :- - plopopt のかわ り に- - plop)。 > 1 個のオプシ ョ ン を複数回書 く と 、 最後の も のだけが有効 と さ れます。 ただ し 、 表 2.1 で複数回与え る こ と も で き る と 注記 し てい る オプシ ョ ンについてはその限 り ではあ り ません。 > 入力 フ ァ イ ルの暗号化状態に よ っ て は、 処理の た めにはユーザーパ ス ワ ー ド か マ ス タ ーパ ス ワー ド が必要にな り ます。 こ れは- - password オプシ ョ ンで与え る 必要があ り ます。 PLOP は こ のパ ス ワー ド が、 要請 さ れた ア ク シ ョ ンに対 し て十分な も のかを調べ (表 4.2 参照)、 も し そ う でない と き は例外を発生 さ せます。 PLOP は、 ま だ ど の フ ァ イ ルを も 処理 し ない前に、 コ マ ン ド ラ イ ン全体を調べます。 コ マ ン ド ラ イ ン上の ど の位置のオプシ ョ ン で あ ろ う と 、 その中にオプシ ョ ン文法誤 り が見つ かっ た と き には、 ど の フ ァ イ ル も 一切処理 さ れません。 いずれかの フ ァ イ ルを処理で き な い と き は (必要なパ ス ワー ド がない等の原因で)、 エ ラ ー メ ッ セージが作成 さ れて、 PLOP は残 り の フ ァ イ ルの処理を継続 し ます。 フ ァ イル名 ブ ラ ン ク キ ャ ラ ク タ を含む フ ァ イ ル名は、 PLOP の よ う な コ マ ン ド ラ イ ン ツールで用い る 際には、 あ る 特殊な取 り 扱いが必要です。 ブ ラ ン ク キ ャ ラ ク タ を含むフ ァ イ ル名を処理す る ためには、 フ ァ イ ル名全体を ダブル ク ォー ト キ ャ ラ ク タ " で囲 う 必要が あ る のです。 ワ イ ル ド カー ド は標準的な流儀に従っ て使用で き ます。 た と えば *.pdf は、 所与のデ ィ レ ク ト リ 内において、 フ ァ イ ル名接尾辞 .pdf を持っ たすべての フ ァ イ ルを表 し ます。 なお、 シ ス テ ムに よ っ ては大文字 と 小文字は区別 さ れ、 シ ス テ ムに よ っ ては さ れ ません (すなわち、 *.pdf は *.PDF と 別扱いにな る 場合があ り ます)。 ま た Windows シ ス テ ムでは ワ イ ル ド カー ド は、ブ ラ ン ク キ ャ ラ ク タ を含むフ ァ イ ル名に対 し ては働かない こ と に注意 し て く だ さ い。 Windows では、 すべての フ ァ イ ル名オプシ ョ ンは Unicode 文字列を受け付け ます。 た と えばExplorer か ら フ ァ イ ルを コ マ ン ド プ ロ ンプ ト ウ ィ ン ド ウへ ド ラ ッ グ し た場合にはそ う な り ます。 レ スポ ン ス フ ァ イル オプ シ ョ ン は、 コ マ ン ド ラ イ ン で直接与え る 方法のほかに、 レ ス ポ ン ス フ ァ イ ルで与え る 方法 も あ り ます。 レ ス ポ ン ス フ ァ イ ルの内容は、 コ マ ン ド ラ イ ン の中で、 @filename オプシ ョ ンが見つかっ た位置に挿入 さ れます。 レ ス ポ ン ス フ ァ イ ルは、 オプシ ョ ン群 と 引数群を記述 し た シ ン プルテ キ ス ト フ ァ イ ル です。 以下の文法規則に従 う 必要があ り ます。 > オプシ ョ ン の複数の値は、 空白系文字、 すなわち スペース ・ ラ イ ン フ ィ ー ド ・ リ タ ー ン ・ タ ブのいずれかで区切 る 必要があ り ます。 > 空白系文字を含む値は、 ダブル ク ォーテーシ ョ ン マー ク 「"」 で囲 う 必要があ り ます。 > 値の最初 と 最後のダブル ク ォーテーシ ョ ン マー ク は切 り 捨て ら れます。 > ダブル ク ォ ーテーシ ョ ン マー ク を リ テ ラ ルに用い る ためには、 バ ッ ク ス ラ ッ シ ュ でマ ス ク し て 「\"」 と す る 必要があ り ます。 > バ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ を リ テ ラ ルに用い る ためには、 も う 1 個のバ ッ ク ス ラ ッ シ ュ でマ ス ク し て 「\\」 と す る 必要があ り ます。 30 2 章 : PLOP ・ PLOP DS コ マ ン ド ラ イ ン ツール レ ス ポ ン ス フ ァ イ ルは入れ子にす る こ と も で き ます。 すなわち、 レ ス ポ ン ス フ ァ イ ルの中 で @filename を用いて別の ラ イ セ ン ス フ ァ イ ルを参照する こ と も 可能です。 レ ス ポ ン ス フ ァ イ ルは、 フ ァ イ ル名 ・ パ ス ワー ド 引数に対 し て、 Unicode 文字列を含む こ と が可能です。 レ ス ポ ン ス フ ァ イ ルは UTF-8 ・ EBCDIC-UTF-8 ・ UTF-16 のいずれかの 形式で符号化す る こ と がで き 、 対応す る BOM で始ま っ てい る 必要があ り ます。 BOM が見 つか ら ない と き は、 レ ス ポ ン ス フ ァ イ ルの内容は、 zSeries では EBCDIC と し て、 それ以 外の i5/iSeries を含むすべてのシ ス テ ム では ISO 8859-1 (Latin-1) と し て解釈 さ れます。 終了 コ ー ド PLOP コ マ ン ド ラ イ ン ツールは終了 コ ー ド を返 し ますので、 それを使えば、 指示 し た操作が成功裏に実行 さ れたか ど う かを調べ る こ と がで き ます : > 終了 コ ー ド 0 : すべての コ マ ン ド ラ イ ンオプシ ョ ン と 入力フ ァ イ ルが、 成功裏に、 かつ 完全に処理 さ れた。 > 終了 コ ー ド 1 : 1 個ない し 複数のフ ァ イ ル処理エ ラ ーが起き たが、 処理は継続 さ れた。 > 終了 コ ー ド 2 : コ マ ン ド ラ イ ンオプシ ョ ン内に何 ら かのエ ラ ーが見つか っ た。処理はそ の特定の悪いオプシ ョ ンの位置で停止 し 、 ど の文書 も 一切処理 さ れていない。 2.1 PLOP ・ PLOP DS コ マ ン ド ラ イ ン オプ シ ョ ン 31 2.2 PLOP ・ PLOP DS コ マ ン ド ラ イ ンの作成例 以下の作成例は、 PLOP コ マ ン ド ラ イ ンオプシ ョ ンのい く つかの有用な組み合わせを示 し てい ます。 すべてのサンプルは 2 つの形式で示 し て あ り 、 1 番目ではすべてのオプシ ョ ン の長い形式を用いてい ますが、 2 番目では同等の短いオプシ ョ ン形式を用いてい ます。 こ の他に も 、 以下の節で作成例が得 ら れます : > 1 章 ( さ ま ざ ま な節) > 4.3 節 「 コ マ ン ド ラ イ ン で PDF 文書を保護」 (56 ページ) > 5.3 節 「PLOP DS で PDF 文書に署名」 (63 ページ) カ レ ン ト デ ィ レ ク ト リ 内のすべての PDF フ ァ イ ルに関す る セキ ュ リ テ ィ 等の情報を表示: plop --info *.pdf plop -i *.pdf デ ィ レ ク ト リ 内のすべての PDF 文書を線形化 し ( こ れ ら はどれ も パ ス ワー ド が不要 と 前 提)、 で き た フ ァ イ ルを タ ーゲ ッ ト デ ィ レ ク ト リ output へ コ ピー。 最適化はデフ ォ ル ト で 有効にな っ てい る (電子署名が同時に作成 さ れ る 場合を除 く ) ので、 フ ァ イ ルを線形化す る と 、 同時にそのサ イ ズは最適化 さ れます。 詳細度レベル 2 は、 すべての入力 ・ 出力フ ァ イ ルについて、 その処理時に名前を印字 し ます : plop --verbose 2 --webopt --targetdir output *.pdf plop -v 2 -w -t output *.pdf カ レ ン ト デ ィ レ ク ト リ 内のすべての フ ァ イ ルを、 同一のユーザーパ ス ワ ー ド demo と マ ス タ ーパ ス ワー ド DEMO で暗号化 し 、 で き た フ ァ イ ルを タ ーゲ ッ ト デ ィ レ ク ト リ output に 置 き ます : plop --targetdir output --user demo --master DEMO *.pdf plop -t output -u demo -m DEMO *.pdf フ ァ イ ル demo2048.p12 の中のデジ タ ル ID を使っ て、PDF 文書に不可視の署名を作成。デ ジ タ ル ID に対す る パ ス ワー ド は、 フ ァ イ ル pw.txt に入っ てい ます : plop --signopt "digitalid={filename=demo2048.p12} passwordfile=pw.txt" --outfile signed.pdf input.pdf plop -S "digitalid={filename=demo2048.p12} passwordfile=pw.txt" -o signed.pdf input.pdf 32 2 章 : PLOP ・ PLOP DS コ マ ン ド ラ イ ン ツール 3 PLOP ・ PLOP DS ラ イ ブ ラ リ の言 語バイ ンデ ィ ング こ の章では、 PLOP/PLOP DS ラ イ ブ ラ リ の、 各言語独特の諸側面を説明 し ます。 3.1 C バ イ ン デ ィ ン グ PLOP は、 C にい く つかの C++ モジ ュ ールを加えて記述 さ れてい ます。 C バ イ ンデ ィ ン グ を 使用す る には、 静的 ま た は共有 ラ イ ブ ラ リ (DLL/SO) を 使用す る こ と がで き 、 中央 PLOP イ ン ク ルー ド フ ァ イ ル ploplib.h を自分の ク ラ イ ア ン ト ソ ース モジ ュ ールに イ ン ク ルー ド す る 必要があ り ます。 あ る いは、 ploplibdl.h を用いて PLOP DLL を実行時に動的に 読み込む こ と も で き ます (詳 し く は次項を参照)。 注記 PLOP の C バイ ンデ ィ ング を使用する ア プ リ ケーシ ョ ンは、 C++ コ ンパイ ラ で リ ン ク を行 う 必要があ り ます。こ のラ イ ブ ラ リ は C++ で実装 さ れている部分をい く つか含んでい るか ら です。 C リ ン カ を使用する と 、 未解決の外部実体が生 じ る可能性があ り ます。 ただ し 、 必要なC++対応ラ イ ブ ラ リ 群に対 し て ア プ リ ケーシ ョ ンが明示的に リ ン ク さ れればこ の限 り ではあ り ません。 PLOP を実行時に読み込まれる DLL と し て使用 多 く の ク ラ イ ア ン ト では PLOP を、 静 的結合 ラ イ ブ ラ リ と し て、 ま たは リ ン ク 時に結合 さ れ る 動的 ラ イ ブ ラ リ と し て使用 し ます が、 DLL を実行時に読み込んで、 すべての API 関数へのポ イ ン タ を動的に取得す る こ と も 可能です。 こ れは特に、 必要時にのみ DLL を読み込むのに有用です。 PLOP では、 こ の動 的使用を実現す る ための特殊な機構を用意 し てい ます。 こ れは以下の規則に従っ て利用で き ます : > ploplib.h でな く ploplibdl.h を イ ン ク ルー ド し ます。 > PLOP_new( ) ・ PLOP_delete( ) でな く PLOP_new_dl( ) ・ PLOP_delete_dl( ) を使用 し ます。 > PLOP_TRY( ) ・ PLOP_CATCH( ) でな く PLOP_TRY_DL( ) ・ PLOP_CATCH_DL( ) を使用 し ます。 > 他のすべての PLOP 呼び出 し に対 し て関数ポ イ ン タ を使用 し ます。 > 追加モジ ュ ール ploplibdl.c を コ ンパ イ ル し 、で き たオブジ ェ ク ト フ ァ イ ルに対 し て自分 のアプ リ ケーシ ョ ン を リ ン ク し ます。 こ の動的読み込み機構は encryptdl.c サンプルで演示 さ れてい ます。 注記 DLL を実行時に読み込めるのは、 選ばれたプ ラ ッ ト フ ォ ーム上のみです。 例外処理 PLOP API では、 ラ イ ブ ラ リ が発生 さ せ る 例外に対処す る 機構を提供 し てい ま す。 こ れは、 C 言語にはネ イ テ ィ ブな例外処理がない こ と を補 う ためです。 PLOP_TRY( ) ・ PLOP_CATCH( ) マ ク ロ を 使用す る こ と に よ っ て、 例外が発生 し た と き にエ ラ ー処理 と ク リ ーン ア ッ プのための専用の コ ー ド 群が呼び出 さ れ る よ う に ク ラ イ ア ン ト コ ー ド を作 る こ と がで き ます。 こ れ ら のマ ク ロ は 2 つの コ ー ド セ ク シ ョ ン を作 り ます : 例外を発生 さ せ る 可能性のあ る コ ー ド を持っ た try 節 と 、 例外に対処す る コ ー ド を持っ た catch 節です。 try ブ ロ ッ ク 内で呼び出 さ れた API 関数のいずれかが例外を発生 さ せた と き は、 プ ロ グ ラ ムの実行は catch ブ ロ ッ ク の先頭ス テー ト メ ン ト へただちに引 き 継がれます。 PLOP ク ラ イ ア ン ト コ ー ド 内で以下の規則を守 る 必要があ り ます : > PLOP_TRY( ) と PLOP_CATCH( ) は必ず対にす る 必要があ り ます。 3.1 C バイ ンデ ィ ング 33 > PLOP_new( ) が例外を発生 さ せ る こ と は一切あ り ません。try ブ ロ ッ ク は有効な PLOP オ ブジ ェ ク ト ハン ド ルでのみ開始で き ますので、PLOP_new( ) への呼び出 し はあ ら ゆ る try ブ ロ ッ ク の外で行 う 必要があ り ます。 > PLOP_delete( ) が例外を発生 さ せ る こ と は一切あ り ませんので、try ブ ロ ッ ク の外で呼び 出 し て も 安全です。 catch 節の中で呼び出す こ と も で き ます。 > try ブ ロ ッ ク と catch ブ ロ ッ ク の両方で用い ら れ る 変数については特に注意が必要です。 コ ンパ イ ラ は 1 個のブ ロ ッ ク か ら 別のブ ロ ッ ク への制御の遷移について知 り ませんの で、 こ の場合には不適切な コ ー ド が生成 さ れ る 可能性があ り ます (レ ジ ス タ 変数最適 化な ど)。 幸い、こ の種の問題を避け る ための簡単な規則があ り ます:try ブ ロ ッ ク と catch ブ ロ ッ ク の両方で用い ら れ る 変数は volatile 宣言す る 必要があ り ます。 volatile キーワー ド を 使用す る こ と で、 コ ンパ イ ラ に対 し て、 危険な最適化を こ の変数に対 し て適用 し ない よ う 伝達す る こ と がでい ます。 > try ブ ロ ッ ク を去 る 場合には (return ス テー ト メ ン ト な ど に よ っ て、 すなわち対応す る PLOP_CATCH( ) への呼び出 し をバ イ パス し て)、 例外機構に知 ら せ る ために、 return ス テー ト メ ン ト の前に PLOP_EXIT_TRY( ) を呼び出す必要があ り ます。 > すべての PLOP 言語バ イ ンデ ィ ン グの場合 と 同様、例外が発生 し た と き には文書処理は 停止す る 必要があ り ます。 以下の コ ー ド は こ れ ら の規則を、 ク ラ イ ア ン ト コ ー ド 内で PLOP 例外を扱 う 典型的 イ デ ィ オム と と も に演示 し てい ます (完全なサンプルが PLOP パ ッ ケージ内にあ り ます) : if ((plop = PLOP_new()) == (PLOP *) 0) { printf("out of memory\n"); return(2); } PLOP_TRY(plop) { /* API関数群を直接または間接に呼び出すステートメント群 */ } PLOP_CATCH(plop) { printf("Error %d in %s() on page %d: %s\n", PLOP_get_errnum(plop), PLOP_get_apiname(plop), pageno, PLOP_get_errmsg(plop)); } PLOP_delete(plop); 名前文字列に対す る Unicode の扱い C 言語は Unicode にネ イ テ ィ ブに対応 し てい ませ ん。API 関数の文字列引数のなかには、名前文字列 と し て宣言 さ れてい る も の も あ り ます。 こ れ ら は、 length 引数の存在 と 、 文字列の先頭の BOM の存在に従っ て扱われます。 C で は、 length 引数が 0 でない と き は、 その文字列は UTF-16 と し て解釈 さ れます。 length 引 数が 0 の と き は、 その文字列は、 UTF-8 BOM で始ま っ ていれば UTF-8 と し て、 EBCDIC UTF-8 BOM で始ま っ ていれば EBCDIC UTF-8 と し て、 BOM が見つか ら なければ host エ ン コ ーデ ィ ン グ と し て (すべての EBCDIC ベース のプ ラ ッ ト フ ォームでは ebcdic と し て) 解釈 さ れます。 オ プ シ ョ ン リ ス ト に対す る Unicode の扱い オプシ ョ ン リ ス ト 内の文字列には特に注意 が必要です。 UTF-16 形式の Unicode 文字列 と し て表現す る こ と がで き ず、 バ イ ト 列 と し てのみ表現で き る か ら です。 こ の理由か ら 、 Unicode オプシ ョ ンに対 し ては UTF-8 が用い 34 3 章 : PLOP ・ PLOP DS ラ イ ブ ラ リ の言語バイ ンデ ィ ング ら れてい ます。 オプシ ョ ンの先頭に BOM を探す こ と に よ っ て、 PLOP はそれを ど の よ う に解釈す る か を決定 し ます。 こ の BOM を用いて文字列の形式が決定 さ れます。 よ り 厳密 には、 文字列オプシ ョ ンの解釈は以下の よ う に働 き ます : > オプシ ョ ンが UTF-8 BOM (\xEF\xBB\xBF) で始ま っ ていれば、 それは UTF-8 と し て解 釈 さ れます。 > オプシ ョ ンが EBCDIC UTF-8 BOM (\x57\x8B\xAB) で始ま っ ていれば、それは EBCDIC UTF-8 と し て解釈 さ れます。 > BOM が見つか ら ない と き は、その文字列は winansi と し て (EBCDIC ベース のプ ラ ッ ト フ ォームでは ebcdic と し て) 扱われます。 注記 PLOP_convert_to_unicode( ) ユーテ ィ リ テ ィ 関数を使 う と 、 UTF-16 文字列から UTF-8 文字 列を生成する こ と がで き ます。 これは Unicode 値を持つオプ シ ョ ン リ ス ト を作成するのに 有用です。 3.1 C バイ ンデ ィ ング 35 3.2 C++ バ イ ン デ ィ ン グ 注記 C++ で書かれた .NET ア プ リ ケーシ ョ ンについては、 C++ バイ ンデ ィ ングを通 じ てではな く 、 PLOP .NET DLL を直接利用する こ と を推奨 し ます (ただ し ク ロ ス プ ラ ッ ト フ ォ ームア プ リ ケーシ ョ ンの場合には C++ バイ ンデ ィ ングを利用するべき です)。 PLOP デ ィ ス ト リ ビ ュ ーシ ョ ンに、 この組み合わせを演示する .NET CLI と と も に使用する ための C++ サン プル コ ー ド があ り ます。 ploplib.h C ヘ ッ ダ フ ァ イ ルに加え て、 C++ 用のオブジ ェ ク ト 指向 ラ ッ パが PLOP ク ラ イ ア ン ト のために提供 さ れてい ます。 こ れは plop.hpp ヘ ッ ダ フ ァ イ ルを必要 と し てお り 、 こ のヘ ッ ダ フ ァ イ ルは ploplib.h を イ ン ク ルー ド し てい ます。plop.hpp はテ ンプ レー ト ベース の実装 と な っ てい ますので、 対応す る plop.cpp モジ ュ ールは不要です。 C++ オブジ ェ ク ト ラ ッ パを利用す る こ と で、 すべての PLOP 関数名に PLOP_ 接頭辞が付いた API 関数に よ る 関数的ア プ ロ ーチ を、 よ り オブジ ェ ク ト 指向のア プ ロ ーチへ置 き 換え る こ と がで き ま す。 PLOP を実行時に読み込まれ る DLL と し て使用 C 言語バ イ ンデ ィ ン グ と 同様、 C++ バ イ ンデ ィ ン グで も 、 PLOP を自分のアプ リ ケーシ ョ ンに実行時に動的に結合 さ せ る こ と が で き ます (「PLOP を実行時に読み込まれ る DLL と し て使用」 (33 ページ) を参照)。 動的 読み込みは、plop.hpp を イ ン ク ルー ド す る アプ リ ケーシ ョ ンモジ ュ ールを コ ンパ イ ルす る 際に下記の よ う に し て有効にす る こ と がで き ます : #define PLOPCPP_DL 1 こ れに加え、 追加モジ ュ ール ploplibdl.c を コ ンパ イ ル し 、 で き たオブジ ェ ク ト フ ァ イ ルに 対 し て自分の ア プ リ ケ ーシ ョ ン を リ ン ク す る 必要が あ り ま す。 動的読み込みの詳細は PLOP オブジ ェ ク ト 内に隠 さ れてい ますので、 それは C++ API に影響を与え ません : 動的 読み込みが有効に し て あ っ て も な く て も 、 すべての メ ソ ッ ド 呼び出 し は同 じ に見え ます。 注記 DLL を実行時に読み込めるのは、 選ばれたプ ラ ッ ト フ ォ ーム上のみです。 C++ の文字列処理 PLOP 4.1 では、 新 し い Unicode 対応の C++ バ イ ンデ ィ ン グ を導入 し てい ます。 新 し いテ ンプ レー ト ベース のアプ ロ ーチで、 文字列処理に関 し て以下の使用パ タ ーンが可能です : > C++ 標準 ラ イ ブ ラ リ 型 std::wstring の文字列が基本文字列型 と し て用い ら れます。 こ れ は、UTF-16 ま たは UTF-32 で符号化 さ れた Unicode キ ャ ラ ク タ を持つ こ と がで き ます。 こ れは PLOP 4.1 のデフ ォ ル ト 動作であ り 、 カ ス タ ムデー タ 型 (次項参照) が wstring に対 し て大 き な利点を持た ない限 り 、 新 し いアプ リ ケーシ ョ ン に対す る 推奨アプ ロ ー チです。 > 文字列処理のためのカ ス タ ム (ユーザー定義) デー タ 型を、 そのカ ス タ ムデー タ 型が basic_string ク ラ ス テ ンプ レー ト の イ ン ス タ ン ス化であ り 、 かつユーザーが与え る 変換 メ ソ ッ ド に よ っ て Unicode と の相互変換が可能であ る 限 り 、 用い る こ と がで き ます。 > プ レーン C++文字列を、PLOP 4.0 ま でのバージ ョ ンに対 し て開発 さ れた既存のC++ アプ リ ケーシ ョ ン と の互換性のために用い る こ と がで き ます。 こ の互換方式は、 既存アプ リ ケーシ ョ ン のためだけに用意 さ れてい ます ( ソ ース コ ー ド 互換性について下記注記 を参照)。 新 し い イ ン タ フ ェース は、 PLOP メ ソ ッ ド と や り と り さ れ る すべての文字列がネ イ テ ィ ブ wstring であ る と 見な し ます。 wchar_t デー タ 型のサ イ ズに よ っ て、 wstring は UTF-16 で (2 バ イ ト キ ャ ラ ク タ 群)、ま たは UTF-32 で(4 バ イ ト キ ャ ラ ク タ 群)符号化 さ れた Unicode 36 3 章 : PLOP ・ PLOP DS ラ イ ブ ラ リ の言語バイ ンデ ィ ング 文字列を内容 と し て持つ と 見な さ れます。 ソ ース コ ー ド 内の リ テ ラ ル文字列は、 ワ イ ド 文 字であ る こ と を示すために先頭に L を付け る 必要があ り ます。 リ テ ラ ル内で Unicode キ ャ ラ ク タ は \u ・ \U 文法で作成で き ます。 こ の文法は標準 ISO C++ に含まれてい る のですが、 コ ン パ イ ラ に よ っ て は こ れに対応 し て い な い も のが あ り ま す。 そ の場合には リ テ ラ ル Unicode キ ャ ラ ク タ は 16 進キ ャ ラ ク タ で作成す る 必要があ り ます。 ア プ リ ケーシ ョ ン を新 し い C++ バ イ ン デ ィ ン グに合わせて変更 PLOP 4.0 ま で の バー ジ ョ ンに対 し て開発 さ れた既存の C++ アプ リ ケーシ ョ ンは、 以下の よ う に し て PLOP 4.1 に合わせて変更す る こ と がで き ます : > TET C++ ク ラ スは pdflib 名前空間内に入 り ま し たので、ク ラ ス名を修飾す る 必要があ り ます。 いちいち pdflib::PLOP を書 く こ と を避け る ため、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン は PLOP メ ソ ッ ド を使 う 前に下記を追加す る べ き です : using namespace pdflib; > アプ リ ケーシ ョ ンの文字列処理を wstring へ切 り 替え ます。 こ れは外部情報源か ら の デー タ について も 当ては ま り ます。 し か し 、 ソ ー ス コ ー ド 内の文字列 リ テ ラ ル (オプ シ ョ ン リ ス ト も ) は、 L 接頭辞を頭に付け る 必要があ り ます。 た と えば const wstring docoptlist = L"password=foo"; > PLOP のエ ラ ー メ ッ セージ と 例外文字列(PLOP・PLOP::Exception ク ラ ス内の get_errmsg( ) メ ソ ッ ド ) を処理す る には、 適切な wstring 対応 メ ソ ッ ド (wcerr 等) を用い る 必要が あ り ます。 > PLOP C++バ イ ンデ ィ ン グで plop.cpp モジ ュ ールは必要な く な り ま し た。PLOPデ ィ ス ト リ ビ ュ ーシ ョ ンは こ のモジ ュ ールのダ ミ ー実装を含んでい ますが、 こ れは PLOP アプ リ ケーシ ョ ンのビル ド 処理か ら は除 く べ き です。 レ ガ シ ア プ リ ケーシ ョ ン と の完全 ソ ース コ ー ド 互換性 新 し い C++ バ イ ンデ ィ ン グはア プ リ ケーシ ョ ン レベルの ソ ース コ ー ド 互換性を志向 し て設計 さ れてい ますが、 ク ラ イ ア ン ト アプ リ ケーシ ョ ンは再 コ ンパ イ ルす る 必要があ り ます。 レ ガシアプ リ ケーシ ョ ンに対 し て完全な ソ ース コ ー ド 互換性を実現す る には以下の方法が用意 さ れてい ます : > plop.hpp を イ ン ク ルー ド す る 前に wstring ベース の イ ン タ フ ェース を下記の よ う に無効 化 し ます : #define PLOPCPP_PLOP_WSTRING 0 > plop.hpp を イ ン ク ルー ド す る 前に pdflib 名前空間を下記の よ う に無効化 し ます : #define PLOPCPP_USE_PDFLIB_NAMESPACE 0 C++ のエ ラ ー処理 PLOP API 関数は、 エ ラ ー発生時には C++ 例外を発生 さ せます。 こ れ ら の例外は ク ラ イ ア ン ト コ ー ド 内で C++ の try/catch 節を用いて キ ャ ッ チす る 必要があ り ます。さ ら な る エ ラ ー情報を提供す る ために、PLOP ク ラ ス はパブ リ ッ ク な PLOP::Exception ク ラ ス を提供 し てお り 、 こ の ク ラ ス は、 詳細なエ ラ ー メ ッ セージ、 例外番号、 例外を発生 さ せた PLOP API 関数の名前を取得す る ための メ ソ ッ ド を公開 し てい ます。 PLOP ルーチンが発生 さ せたネ イ テ ィ ブな C++ 例外は期待どお り に動作 し ます。 以下 の コ ー ド は、 PLOP が発生 さ せた例外を キ ャ ッ チ し ます : try { ...さまざまなPLOP命令... } catch (PLOP::Exception &ex) { 3.2 C++ バイ ンデ ィ ング 37 wcerr << L"Error " << ex.get_errnum() << L" in " << ex.get_apiname() << L"(): " << ex.get_errmsg() << endl; } 38 3 章 : PLOP ・ PLOP DS ラ イ ブ ラ リ の言語バイ ンデ ィ ング 3.3 COM バ イ ン デ ィ ン グ PLOP の COM 版を イ ン ス ト ール PLOP/PLOP DS を、 提供 さ れてい る Windows イ ン ス ト ー ラ で イ ン ス ト ール し ます。こ の イ ン ス ト ー ラ は適切な レ ジ ス ト リ 項目を作成 し 、PLOP コ ン ポーネ ン ト を Windows に登録 し て、 任意の COM 互換のプ ロ グ ラ ムか ら それを使え る よ う に し ます。 COM での例外処理 PLOP/PLOP DS コ ン ポーネ ン ト は、 COM の標準的な例外動作を実 装 し てお り 、 説明 メ ッ セージ と と も に COM 例外を発生 さ せます。 PLOP の利用者は、 標 準的なプ ロ グ ラ ミ ン グ手段を用いて こ の例外を と ら え、 それに対処す る こ と がで き ます。 PLOP の COM 版 を .NET で使用 PLOP の COM 版は .NET で、 PLOP.NET (3.5 節 「.NET バ イ ンデ ィ ン グ」 (42 ページ) 参照) のかわ り に使 う こ と も 可能です。 まず、 tlbimp.exe ユーテ ィ リ テ ィ を使っ て、PLOP の COM 版か ら .NET のアセ ンブ リ を作成す る 必要があ り ます : tlbimp plop_com.dll /namespace:plop_com /out:Interop.plop_com.dll こ のアセ ンブ リ を、自分の.NET アプ リ ケーシ ョ ンの中で使 う こ と がで き ます。Visual Studio .NET の中で plop_com.dll への参照を追加す る と 、 アセ ンブ リ が自動的に作成 さ れます。 以下の抜粋 コ ー ド では、 PLOP の COM 版を VB.NET で使 う 方法を示 し てい ます : Imports plop_com ... Dim p As plop_com.IPDF ... p = New PLOP() ... buf = p.get_buffer() 以下の抜粋 コ ー ド では、 PLOP の COM 版を C# で使 う 方法を示 し てい ます : using plop_com; ... static plop_com.IPDF p; ... p = New PLOP(); ... buf = (byte[])p.get_buffer(); こ の後の コ ー ド は、 PLOP の .NET 版 と 同様に書 く こ と がで き ます。 C# では、 get_buffer( ) の戻 り 値を キ ャ ス ト す る 必要があ る こ と に注意 し て く だ さ い。 なぜな ら 、 こ こ で COM オ ブジ ェ ク ト か ら 返 さ れ る VARIANT デー タ 型か ら は、 自動変換がないためです。 3.3 COM バイ ンデ ィ ング 39 3.4 Java バ イ ン デ ィ ン グ PLOP の Java 版 を イ ン ス ト ール PLOP/PLOP DS はネ イ テ ィ ブな C ラ イ ブ ラ リ と し て実 装 さ れてお り 、 Java には JNI (Java Native Interface) を通 じ て ア タ ッ チ し ます。 当然、 Java アプ リ ケーシ ョ ン を開発す る には、 JNI への対応を含んだ JDK が必要です。 PLOP バ イ ン デ ィ ン グが動作す る ためには、 PLOP の Java ラ ッ パ ラ イ ブ ラ リ と PLOP の Java パ ッ ケー ジが、 Java VM か ら 見え てい る 必要があ り ます。 PLOP の Java パ ッ ケージ Java の開発者に と っ て整合性のあ る ル ッ ク ア ン ド フ ィ ールを 保つため、 PLOP は次のパ ッ ケージ名を持っ た Java パ ッ ケージ と し て構成 さ れてい ます : com.pdflib.plop こ のパ ッ ケージは plop.jar フ ァ イ ルの中にあ り 、plop と い う 1 個の ク ラ ス を含んでい ます。 PLOP を さ ま ざ ま な Java 開発環境で使用す る にあ た っ ての最新情報が、readme.txt フ ァ イ ル内にあ る か も し れません。 こ のパ ッ ケージ を自分のアプ リ ケーシ ョ ンに与え る には、 自分の CLASSPATH 環境変数 に plop.jar を追加す る か、 ま たは Java コ ンパ イ ラ ・ ラ ン タ イ ムへの呼び出 し に -classpath plop.jar オプシ ョ ン を追加する か、 ない し はそれ と 同等の手順を Java IDE 内で踏む必要が あ り ます。 Java VM の設定 と し て、 java.library.path プ ロ パテ ィ にデ ィ レ ク ト リ の名前を設 定すれば、そのデ ィ レ ク ト リ でネ イ テ ィ ブ ラ イ ブ ラ リ が検索 さ れ る よ う にす る こ と がで き ます。 た と えば java -Djava.library.path=. encrypt こ のプ ロ パテ ィ の値は次の よ う に し て知 る こ と がで き ます : System.out.println(System.getProperty("java.library.path")); こ のほかに、 以下の よ う なプ ラ ッ ト フ ォーム独自の手順を踏む必要があ り ます : > Unix : ラ イ ブ ラ リ libplop_java.so を、 共有 ラ イ ブ ラ リ のためのデフ ォ ル ト の場所の う ち のいずれか 1 つに、 ま たは適切に設定 さ れたデ ィ レ ク ト リ に置 く 必要があ り ます。 > Mac OS X : ラ イ ブ ラ リ libplop_java.jnilib を、 共有 ラ イ ブ ラ リ のためのデフ ォ ル ト の場 所の う ちのいずれか 1 つに、 ま たは適切に設定 さ れたデ ィ レ ク ト リ に置 く 必要があ り ます。 > Windows: ラ イ ブ ラ リ plop_java.dll を、Windows のシ ス テ ムデ ィ レ ク ト リ に、ま たは PATH 環境変数に示 さ れてい る デ ィ レ ク ト リ に置 く 必要があ り ます。 PLOP サーブ レ ッ ト と Java ア プ リ ケーシ ョ ンサーバ PLOP/PLOP DS は、サーバサ イ ド の Java アプ リ ケーシ ョ ンに、 と り わけサーブ レ ッ ト に完全に適合 し てい ます。特定のサー ブ レ ッ ト エン ジ ンで PLOP を使用す る 際には、以下の設定上の き ま り を守 る 必要があ り ま す: > サーブ レ ッ ト エ ン ジ ンがネ イ テ ィ ブ ラ イ ブ ラ リ を探すデ ィ レ ク ト リ は、 ベン ダに よ っ て異な り ます。 よ く あ る 候補 と し ては、 シ ス テ ムデ ィ レ ク ト リ や、 背後の Java VM に 特有のデ ィ レ ク ト リ 、 サーブ レ ッ ト エン ジ ンの ロ ーカルデ ィ レ ク ト リ が挙げ ら れます。 自分のサーブ レ ッ ト エン ジ ンのベン ダか ら 提供 さ れてい る 説明書を見て く だ さ い。 > サーブ レ ッ ト を ロ ー ド す る のが特別な ク ラ ス ロ ーダで、 制限 さ れていた り 、 専用の ク ラ ス パ ス を使用 し ていた り す る こ と は よ く あ り ます。 サーブ レ ッ ト エ ン ジ ン に よ っ て 40 3 章 : PLOP ・ PLOP DS ラ イ ブ ラ リ の言語バイ ンデ ィ ング は、 特別なエン ジ ン ク ラ スパ ス を定義 し て、 PLOP パ ッ ケージが確実に見つか る よ う に す る 必要があ り ます。 PLOP デ ィ ス ト リ ビ ュ ーシ ョ ンには、 PLOP をサーブ レ ッ ト 内で使用 し てい る 例が入っ て い ます。 Java での例外処理 PLOP/PLOP DS の メ ソ ッ ド はすべて、 エ ラ ー時には PLOPException 型の例外を発生 さ せます。 PLOP の利用者は、 標準的な Java 言語の機能を使っ てその例外 を キ ャ ッ チ し 、 それに対処す る こ と がで き ます。 try { plop plop; /* ... さまざまなPLOP命令 ... */ } catch (PLOPException e) { System.err.println("暗号化: PLOP例外が発生しました:"); System.err.println(e.get_apiname() +": " + e.getMessage()); } finally { /* PLOPオブジェクトを削除 */ if (plop != null) plop.delete(); } 3.4 Java バイ ンデ ィ ング 41 3.5 .NET バ イ ン デ ィ ン グ 注記 PLOP を .NET Framework と と も に使用する ための さ ま ざ ま な種類 と オプ シ ョ ンに関する詳 し い情報が、 PDFlib-in-.NET-HowTo.pdf 文書にあ り ます。 この文書は、 デ ィ ス ト リ ビ ュ ー シ ョ ンパ ッ ケージにあるほか、 PDFlib Web サイ ト に も あ り ます。 PLOP の .NET 版は、 .NET に関連す る すべての概念に対応 し てい ます。 技術的用語でい う な ら ば、PLOP.NET 版は、.NET フ レーム ワー ク の制御下で走 る C++ ク ラ ス です (非マネー ジの PLOP コ ア ラ イ ブ ラ リ にマネージ ラ ッ パを付けた も の)。 厳密名を持つ静的 ラ イ ブ ラ リ と し てパ ッ ケージ さ れてい ます。 PLOP アセ ンブ リ (PLOP_dotnet.dll) には、 ラ イ ブ ラ リ 本体に加え て メ タ 情報が含まれてい ます。 PLOP の .NET 版 を イ ン ス ト ール PLOP を、 提供 さ れてい る Windows MSI イ ン ス ト ー ラ で イ ン ス ト ール し ます。 PLOP.NET MSI イ ン ス ト ー ラ は、 PLOP アセ ンブ リ と 追加デー タ フ ァ イ ル群 ・ 説明書 ・ サンプルを、 マシ ン上に対話的に イ ン ス ト ール し ます。 こ の イ ン ス ト ー ラ は PLOP の登録 も 行な っ て、 Visual Studio .NET の 「参照の追加」 ダ イ ア ロ グボ ッ ク ス の .NET タ ブで簡単に参照で き る よ う に し ます。 .NET でのエ ラ ー処理 PLOP.NET は .NET の例外に対応 し てお り 、実行時の問題が発生 し た と き には、 詳細なエ ラ ー メ ッ セージのついた例外を発生 さ せ ま す。 こ の よ う な例外を キ ャ ッ チ し て、 それに対 し て適切に対処す る のは、 ク ラ イ ア ン ト 側の役割です。 それを し ない と 、 .NET フ レーム ワー ク がその例外を キ ャ ッ チ し て、 通常はアプ リ ケーシ ョ ン を中 断 さ せます。 例外関連の情報 を 伝達す る た めに、 PLOP ではそれ自身の例外 ク ラ ス PLOP_dotnet. PLOPException を定義 し てお り 、 メ ンバ get_errnum ・ get_errmsg ・ get_apiname を持たせ てい ます。 PLOP を C++ ・ CLI と と も に使用 C++ で書かれた .NET アプ リ ケーシ ョ ン (共通言語基 盤= CLI に基づ く ) は、 PLOP C++ バ イ ンデ ィ ン グ を使用せずに直接 PLOP.NET DLL を利 用す る こ と がで き ます。その ソ ース コ ー ド は下記の よ う に PLOP を参照す る 必要があ り ま す: using namespace PLOP_dotnet; 42 3 章 : PLOP ・ PLOP DS ラ イ ブ ラ リ の言語バイ ンデ ィ ング 3.6 Perl バ イ ン デ ィ ン グ Perl 用 PLOP ラ ッ パは、 1 個の C ラ ッ パ と 2 個の Perl パ ッ ケージモジ ュ ールか ら 成 り ま す。 こ のモジ ュ ールの 1 個は各 PLOP API 関数 と 同等の も のを Perl で提供する も ので、 も う 1 個は PLOP オブジ ェ ク ト のための も のです。 C モジ ュ ールは、 Perl イ ン タ プ リ タ が実 行時に読み込む共有 ラ イ ブ ラ リ を、パ ッ ケージ フ ァ イ ルか ら い く ら かの助け を借 り て ビル ド す る ために用い ら れます。 Perl ス ク リ プ ト は共有 ラ イ ブ ラ リ モジ ュ ールを、 use ス テー ト メ ン ト を通 じ て参照 し ます。 PLOP の Perl 版 を イ ン ス ト ール Perl 拡張機構は共有 ラ イ ブ ラ リ を実行時に、DynaLoader モジ ュ ールを通 じ て読み込みます。 Perl 実行形式が、 共有 ラ イ ブ ラ リ に対応 し た形で コ ン パ イ ル さ れてい る 必要があ り ます (多 く の Perl 設定ではその よ う にな っ てい ます)。 PLOP バ イ ンデ ィ ン グが動作する ためには、Perl イ ン タ プ リ タ は PLOP Perl ラ ッ パ と モ ジ ュ ール plop_pl.pm ・ PDFlib/PLOP.pm を利用可能であ る 必要があ り ます。 以下に説明す る プ ラ ッ ト フ ォーム固有の方式のほかに、 Perl の @INC モジ ュ ール検索パ ス に、 -I コ マ ン ド ラ イ ンオプシ ョ ン を用いてデ ィ レ ク ト リ を追加す る こ と も 可能です : perl -I/path/to/plop encrypt.pl Unix Perl は、 plop_pl.so (Mac OS X では plop_pl.bundle) ・ plop_pl.pm ・ PDFlib/PLOP.pm を、 カ レ ン ト デ ィ レ ク ト リ 内で、 あ る いは下記 Perl コ マ ン ド で印字 さ れ る デ ィ レ ク ト リ 内 で検索 し ます : perl -e 'use Config; print $Config{sitearchexp};' Perl はサブデ ィ レ ク ト リ auto/plop_pl も 検索 し ます。上記 コ マ ン ド の典型的出力は下記の よ う にな り ます : /usr/lib/perl5/site_perl/5.10/i686-linux Windows PLOP は、 Perl 5 の Windows に対す る ActiveState ポー ト に も 対応 し てい ます。 こ れはActivePerl と も 呼ばれます。DLL plop_pl.dll と モジ ュ ール plop_pl.pm・PDFlib/PLOP.pm が、 カ レ ン ト デ ィ レ ク ト リ 内で、 あ る いは下記 Perl コ マ ン ド で印字 さ れ る デ ィ レ ク ト リ 内 で検索 さ れます : perl -e "use Config; print $Config{sitearchexp};" 上記 コ マ ン ド の典型的出力は下記の よ う にな り ます : C:\Program Files\Perl5.10\site\lib Perl での例外処理 PLOP の例外が発生す る と 、 Perl の例外が発生 し ます。 こ れは以下の よ う に、 eval シーケ ン ス を用いて捕捉 ・ 対処で き ます : eval { ...さまざまなPLOP命令... }; die "例外をキャッチしました: $@" if $@; 3.6 Perl バイ ンデ ィ ング 43 3.7 PHP バ イ ン デ ィ ン グ PLOP の PHP 版 を イ ン ス ト ール PLOP/PLOP DS は、PHP へ動的にア タ ッ チで き る C ラ イ ブ ラ リ と し て実装 さ れてい ます。PLOP は PHP のい く つかのバージ ョ ンに対応 し てい ま す。 ア ンパ ッ ク し た PLOP アーカ イ ブの中か ら 、 自分が使 う PHP のバージ ョ ンに合わせ て、 適切な PLOP ラ イ ブ ラ リ を選ぶ必要があ り ます。 PLOP を PHP で使 う 際の さ ま ざ ま な種別やオプシ ョ ンに関す る 詳 し い情報は、 PHP 用 の ロ ー ド 可能な PLOP モジ ュ ールを使用す る べき か ど う か と い う 問い も 含めて、PDFlib の Web サ イ ト にあ る PDFlib-in-PHP-HowTo 文書に掲載 し てい ます。こ れは主に PDFlib を PHP で使 う 際の こ と を述べてい ますが、 その説明は PLOP を PHP で使 う 場合について も 同様 に当ては ま り ます。 PHP を設定 し て、 外部の PLOP ラ イ ブ ラ リ についてわか ら せ る 必要があ り ます。 以下 の 2 つの選択肢があ り ます : > php.ini に以下のいずれかの行を追加 : extension=plop_php.so ; Unix・Mac OS X 用 extension=plop_php.dll ; Windows 用 PHP は こ の ラ イ ブ ラ リ を、 Unix の場合は php.ini 内の extension_dir 変数で指定 さ れて い る デ ィ レ ク ト リ で検索 し 、 Windows の場合はそ こ のほかに標準のシ ス テ ムデ ィ レ ク ト リ 群で も 検索 し ます。 ど のバージ ョ ンの PLOP の PHP バ イ ンデ ィ ン グ を イ ン ス ト ー ル し て あ る かは、 下記の 1 行の PHP ス ク リ プ ト で調べ る こ と がで き ます : <?phpinfo()?> こ れは、自分の現在の PHP 設定に関す る 長い情報ページ を表示 し ます。 こ のページで、 plop と 題 さ れたセ ク シ ョ ン を調べます。 も し こ のセ ク シ ョ ンに下記 PDFlib PLOP (PDF Linearization, Optimization, Protection) => enabled ( こ の後に PLOP のバージ ョ ン番号) があれば、 PLOP の PHP 版を正 し く イ ン ス ト ール で き てい ます。 > 自分の ス ク リ プ ト の先頭に、 以下のいずれかの行を書いて、 PLOP を動作時に ロ ー ド す る: dl("plop_php.so"); # Unix・Mac OS X 用 dl("plop_php.dll"); # Windows 用 PHP での フ ァ イル名処理 PDF や画像 ・ フ ォ ン ト 等のデ ィ ス ク フ ァ イ ルに対す る 無修飾 の フ ァ イ ル名 (パ ス要素のない) と 相対フ ァ イ ル名は、 PHP の Unix 版 と Windows 版 と で は、 扱われ方が異な り ます : > Unix 諸シ ス テ ムの PHP の場合、パ ス要素を持た ない フ ァ イ ルは、ス ク リ プ ト が置かれて い る デ ィ レ ク ト リ で検索 さ れます。 > Windows の PHP の場合、パ ス要素を持たない フ ァ イ ルは、PHP DLL が置かれてい る デ ィ レ ク ト リ でのみ検索 さ れます。 PHP 5 での例外処理 PHP 5 では、 構造化 さ れた例外処理に対応 し てい る ので、 PLOP の 例外は PHP の例外 と し て伝達 さ れます。 標準的な try/catch 技法を使っ て PLOP 例外を取 り 扱え ます : try { 44 3 章 : PLOP ・ PLOP DS ラ イ ブ ラ リ の言語バイ ンデ ィ ング ...さまざまなPLOP命令... } catch (PLOPException $e) { print "PLOP例外が発生しました:\n"; print "[" . $e->get_errnum() . "] " . $e->get_apiname() . ": " $e->get_errmsg() . "\n"; } catch (Exception $e) { print $e; } 3.7 PHP バイ ンデ ィ ング 45 3.8 Python バ イ ン デ ィ ン グ PLOP の Python 版 を イ ン ス ト ール Python の拡張機構は、 実行時に共有 ラ イ ブ ラ リ を読 み込む こ と に よ っ て動作 し ます。 PLOP バ イ ンデ ィ ン グが動作す る ためには、 Python イ ン タ プ リ タ が PLOP Python ラ ッ パ を 利用可能 で あ る 必要 が あ り ま す。 こ の ラ ッ パ は、 PYTHONPATH 環境変数内に挙げ ら れてい る デ ィ レ ク ト リ 群の中で検索 さ れます。 Python ラ ッ パの名前はプ ラ ッ ト フ ォームに よ っ て異な り ます : > Unix ・ Mac OS X : plop_py.so > Windows : plop_py.pyd Python のエ ラ ー処理 Python バ イ ンデ ィ ン グは、 PLOP エ ラ ーを ネ イ テ ィ ブな Python 例 外へ翻訳す る 特殊なエ ラ ーハン ド ラ を イ ン ス ト ール し ます。 こ の Python 例外は、 通常の try/catch 技法で扱え ます : try: ...さまざまなPLOP命令... except PLOPException: print 'PLOP例外をキャッチしました!' 46 3 章 : PLOP ・ PLOP DS ラ イ ブ ラ リ の言語バイ ンデ ィ ング 3.9 RPG バ イ ン デ ィ ン グ PLOP/PLOP DS では、 PLOP の関数を埋め込んだ ILE-RPG のプ ロ グ ラ ム を コ ンパ イ ルす る ために必要なすべてのプ ロ ト タ イ プ と い く つかの有用な定数を定義 し た /copy モジ ュ ー ルを提供 し てい ます。 Unicode 文字列の扱い PLOP の関数はすべて、 引数 と し て可変長の Unicode 文字列を と り ますので、%UCS2 ビル ト イ ン関数を用いてシ ン グルバ イ ト 文字列を Unicode 文字列に変 換す る 必要があ り ます。 PLOP 関数が返す文字列はすべて可変長の Unicode 文字列です。 %CHAR ビル ト イ ン関数を用いて、 こ れ ら の Unicode 文字列を シ ン グルバ イ ト 文字列に変 換 し て く だ さ い。 注記 %CHAR 関数 と %UCS2 関数は、文字列を Unicode か ら、 または Unicode へ変換する際に、 カ レ ン ト ジ ョ ブの CCSID を用います。 作成例は、 CCSID 37 (US EBCDIC) に基づいていま す。 オプ シ ョ ン リ ス ト 内の特別なキ ャ ラ ク タ の う ちのい く つかは ({ [ ] } 等)、 別のコ ー ド ページの下で これ らの作成例を動作 さ せる と 、 正 し く 変換 さ れない可能性があ り ます。 文字列はすべて可変長文字列 と し て渡 さ れますので、 さ ま ざ ま な関数で、 文字列長を明示 的に示す length 引数を渡 し てはいけ ません (可変長文字列の長 さ は、 文字列の先頭 2 バ イ ト に格納 さ れてい ます)。 PLOP の RPG プ ロ グ ラ ム を コ ンパ イル ・ バ イ ン ド す る PLOP 関数を RPG か ら 使用す る には、 コ ンパ イ ル さ れた PLOPLIB サービ ス プ ロ グ ラ ムが必要です。 PLOP 定義を コ ンパ イ ル時に イ ン ク ルー ド す る ためには、次の よ う に、自分の ILE-RPG プ ロ グ ラ ムの D スペ ッ ク 内でその名前を指定す る 必要があ り ます。 d/copy QRPGLESRC,PLOPLIB PLOP ソ ース フ ァ イ ル ラ イ ブ ラ リ が自分の ラ イ ブ ラ リ リ ス ト 上にない と き は、次の よ う に、 その ラ イ ブ ラ リ も 指定す る 必要があ り ます。 d/copy plopsrclib/QRPGLESRC,PLOPLIB 自分の ILE-RPG プ ロ グ ラ ム の コ ン パ イ ル を 開始す る 前に は、 PLOP に同梱 し て い る PLOPLIB サービ ス プ ロ グ ラ ム の入っ たバ イ ンデ ィ ン グデ ィ レ ク ト リ を作成 し てお く 必要 があ り ます。 下記の例では、 ラ イ ブ ラ リ PLOPLIB 内に PLOPLIB と い う バ イ ンデ ィ ン グ デ ィ レ ク ト リ を作成 し たい も の と し ます。 CRTBNDDIR BNDDIR(PLOPLIB/PLOPLIB) TEXT('PLOPlib Binding Directory') バ イ ンデ ィ ン グデ ィ レ ク ト リ を作成 し た後は、 PLOPLIB サービ ス プ ロ グ ラ ム を自分のバ イ ンデ ィ ン グデ ィ レ ク ト リ に追加す る 必要があ り ます。 下記の例では、 さ き に作成 し たバ イ ンデ ィ ン グデ ィ レ ク ト リ に ラ イ ブ ラ リ PLOPLIB 内のサービ ス プ ロ グ ラ ム PLOPLIB を追 加 し たい も の と し ます。 ADDBNDDIRE BNDDIR(PLOPLIB/PLOPLIB) OBJ((PLOPLIB/PLOPLIB *SRVPGM)) こ れで、 CRTBNDRPG コ マ ン ド (ま たは PDM 内でオプシ ョ ン 14) を用いて自分のプ ロ グ ラ ム を コ ンパ イ ルで き る よ う にな り ま し た : CRTBNDRPG PGM(PLOPLIB/ENCRYPT) SRCFILE(PLOPLIB/QRPGLESRC) SRCMBR(*PGM) DFTACTGRP(*NO) BNDDIR(PLOPLIB/PLOPLIB) 3.9 RPG バイ ンデ ィ ング 47 RPG でのエ ラ ー処理 ILE-RPG で書かれた PLOP ク ラ イ ア ン ト は、 ILE-RPG が提供す る monitor/on-error/endmon エ ラ ー処理機構を利用す る こ と がで き ます。 例外を見張 る も う 1 つの方法は、ILE-RPG 内の *PSSR グ ロ ーバルエ ラ ー処理サブルーチン を用い る こ と です。 例外が発生 し た際には、 ジ ョ ブ ロ グは、 エ ラ ー番号、 失敗 し た関数、 例外の理由を示 し ま す。 PLOP は、 呼び出 し 側プ ロ グ ラ ムへエ ス ケープ メ ッ セージ を送 り ます。 c * c * c : : * c * * c c 48 eval p=PLOP_new monitor eval doc=PLOP_open_document(p:%ucs2('/tmp/my.pdf'):inputoptlist) Error Handling on-error Do something with this error don't forget to free the PLOP object callp PLOP_delete(p) endmon 3 章 : PLOP ・ PLOP DS ラ イ ブ ラ リ の言語バイ ンデ ィ ング 4 PDF セキ ュ リ テ ィ 4.1 さ ま ざ ま な PDF セキ ュ リ テ ィ 機能 PDF 文書はパ ス ワー ド セキ ュ リ テ ィ で保護す る こ と がで き ます。こ れは以下の保護機能を 提供 し ます : > ユーザーパ ス ワ ー ド (開 く パ ス ワ ー ド と も 呼ばれ る ) を与え ない と フ ァ イ ルを開いて 閲覧で き ない よ う にす る 。 > マ ス タ ーパ ス ワ ー ド (所有者パ ス ワ ー ド ま たは権限パ ス ワ ー ド と も 呼ばれ る ) を与え ない と 、 セキ ュ リ テ ィ 設定、 すなわち諸権限 ・ ユーザーパ ス ワ ー ド ・ マ ス タ ーパ ス ワー ド を一切変更で き ない よ う にす る 。 ユーザーパ ス ワ ー ド と マ ス タ ーパ ス ワ ー ド を持つ フ ァ イ ルは、 その ど ち ら かのパス ワー ド を与えれば開いて閲覧で き ます。 > 権限設定は、 その PDF 文書に対す る 特定の動作 (印刷やテ キ ス ト 抽出等) を制限す る 。 > 添付パ ス ワ ー ド を指定す る と 、 文書自体の内容本体は暗号化せず、 フ ァ イ ル添付のみ を暗号化す る こ と がで き ます。 こ れ ら の保護機能の う ち 1 つで も 用いてい る PDF 文書は暗号化 さ れます。 文書のセキ ュ リ テ ィ 設定を Acrobat で表示ま たは変更す る には、 それぞれ 「フ ァ イル」 → 「文書のプ ロ 図 4.1 Acrobat で標準セキ ュ リ テ ィ 設定を 表示 (左) ・ 設定 (下) 4.1 さ ま ざ ま な PDF セキ ュ リ テ ィ 機能 49 パテ ィ ...」 → 「セキ ュ リ テ ィ 」 → 「詳細を表示 ...」 か 「設定を変更 ...」 を ク リ ッ ク し ます。 図 4.1 に Acrobat のセキ ュ リ テ ィ 設定ダ イ ア ロ グ を示 し ます。 暗号化アルゴ リ ズム と キー長 PDF の暗号化は、 以下の暗号化アルゴ リ ズ ム を利用 し て い ます : > RC4。 対称 ス ト リ ーム暗号です (すなわち、 同 じ アルゴ リ ズ ム を用いて暗号化 と 復号 がで き ます)。 RC4 はプ ロ プ ラ イ エ タ リ な アルゴ リ ズ ムです。 > AES (高度暗号化標準)。 規格 FIPS-197 で仕様化 さ れてい ます。 AES は さ ま ざ ま な応用 で利用 さ れてい る 最新のブ ロ ッ ク 暗号です。 実際の暗号化キーは扱いに く いバ イ ナ リ 列なので、それは も っ と ユーザーフ レ ン ド リ ーな プ レーン キ ャ ラ ク タ か ら 成 る パ ス ワー ド か ら 導出 さ れます。 PDF と Acrobat の発展の過程 のなかで、 PDF 暗号化方式は改良を重ね ら れ、 よ り 強力な アルゴ リ ズ ム、 よ り 長い暗号化 キー、 よ り 洗練 さ れたパ ス ワ ー ド を用い る よ う にな っ て き てい ます。 表 4.1 に、 すべての PDF バージ ョ ンについて、 暗号化キー と パ ス ワー ド の特徴を示 し ます。 表 4.1 PDF の各バージ ョ ンにおける暗号化アルゴ リ ズム ・ キー長 ・ パスワー ド PDF ・ Acrobat バージ ョ ン、 pCOS アルゴ リ ズム番号 暗号化アルゴ リ ズム と キー長 最大パスワー ド 長 と パス ワー ド エ ン コ ーデ ィ ング PDF 1.1 ~ 1.3 (Acrobat 2 ~ 4)、 アルゴ リ ズム 1 RC4 40 ビ ッ ト (弱い。 使用するべき ではあ り ません) 32 キ ャ ラ ク タ (Latin-1) PDF 1.4 (Acrobat 5)、 アルゴ リ ズム 2 RC4 128 ビ ッ ト 32 キ ャ ラ ク タ (Latin-1) PDF 1.5 (Acrobat 6)、 アルゴ リ ズム 3 PDF 1.4 と 同 じ 、 ただ し 暗号化方式の異な る 応用 32 キ ャ ラ ク タ (Latin-1) PDF 1.6 (Acrobat 7) ・ PDF 1.7 = ISO 32000-1 (Acrobat 8)、 アルゴ リ ズム 4 AES-128 32 キ ャ ラ ク タ (Latin-1) PDF 1.7ext3 (Acrobat 9)、 アルゴ リ ズム 9 AES-256 で、 パスワー ド の扱いに脆弱性が あ る もの 127 UTF-8 バイ ト (Unicode) PDF 1.7ext8 (Acrobat X) ・ PDF 2.0 = ISO 32000-2、 アルゴ リ ズム 11 AES-256 で、 パスワー ド の扱いが改良 さ れ た もの 127 UTF-8 バイ ト (Unicode) PDF の暗号化では、ユーザーま たはマ ス タ ーパ ス ワー ド を直接使っ て文書内容を暗号化す る のではな く 、パ ス ワー ド と 権限設定な ど を含む他の諸パ ラ メ タ と か ら 暗号化キーを算出 し てい ます。 実際に文書を暗号化す る のに用い ら れ る 暗号化キーの長 さ は、 パ ス ワー ド の 長 さ か ら は独立です (表 4.1 参照)。 パスワー ド PDF の暗号化は内部的に、 PDF バージ ョ ンに よ っ て 40 ・ 120 ・ 250 ビ ッ ト の いずれかの暗号化キーで動作 し ま す。 ユーザーが与え たパ ス ワ ー ド か ら バ イ ナ リ 暗号化 キーが導出 さ れます。 パ ス ワー ド には長 さ と エン コ ーデ ィ ン グの制約があ り ます : > PDF 1.7 (ISO 32000-1) ま では、 パ ス ワ ー ド は最大長 32 キ ャ ラ ク タ に限 ら れ、 Latin-1 エン コ ーデ ィ ン グ内のキ ャ ラ ク タ のみを含む こ と がで き ます。 > PDF 1.7ext3 では Unicode キ ャ ラ ク タ を導入 し 、最大長を、パス ワー ド の UTF-8 表現で 127 バ イ ト に押 し 上げま し た。 UTF-8 ではキ ャ ラ ク タ を可変長 1 ~ 4 バ イ ト に符号化 し ますので、 パ ス ワー ド 内に許 さ れ る Unicode キ ャ ラ ク タ の数は、 非 ASCII キ ャ ラ ク タ を含む場合には 127 よ り 少な く な り ます。 た と えば、 日本語キ ャ ラ ク タ は UTF-8 表 50 4 章 : PDF セキ ュ リ テ ィ 現では通常 3 バ イ ト を必要 と し ますので、 パ ス ワー ド 内で最大 42 個の日本語キ ャ ラ ク タ ま でが使え る こ と にな り ます。 あい ま い さ を避け る ために、 Unicode パ ス ワー ド は SASLprep と い う 処理 (RFC 3454 の Stringprep に基づ き RFC 4013 で仕様化 さ れてい ます) に よ っ て正規化 さ れます。 こ の処 理では、 非テ キ ス ト キ ャ ラ ク タ を除去 し 、 あ る 種のキ ャ ラ ク タ ク ラ ス を正規化 し ます (た と えば非 ASCII 空白キ ャ ラ ク タ は ASCII 空白キ ャ ラ ク タ U+0020 へマ ッ プ さ れます)。パ ス ワー ド は Unicode 正規形 KC へ正規化 さ れ、 パ ス ワー ド 内に右書 き キ ャ ラ ク タ と 左書 き キ ャ ラ ク タ が混在 し ていた場合に起 こ り う る あ い ま い さ を回避す る ために特殊な双方向 処理が施 さ れます。 PDF 暗号化の強度は、 暗号化キーの長 さ に よ っ てのみ決ま る のではな く 、 パ ス ワー ド の長 さ と 質に よ っ て も 左右 さ れます。名前や単語その ま ま な ど をパ ス ワー ド に使 う べ き で はない と い う こ と は広 く 知 ら れてい ます。 容易に推測で き た り 、 いわゆ る 辞書ア タ ッ ク に よ っ てシ ス テマテ ィ ッ ク にあ た ら れ る か ら です。 さ ま ざ ま な調査に よ れば、 かな り の数の パ ス ワー ド は配偶者やペ ッ ト の名前、 ユーザーの誕生日、 子供のニ ッ ク ネーム な ど を用い てお り 、 そのため容易に推測可能にな っ てい ます。 権限設定 PDF では、 文書の操作に関す る さ ま ざ ま な制限を符号化す る こ と がで き 、 こ れ ら は個別に承認ま たは拒否す る こ と がで き ます (ただ し 設定に よ っ ては互いに依存 し あ う も の も あ り ます) : > 印刷:印刷が許可 さ れていない と き は、Acrobat の印刷ボ タ ンは無効にな り ます。Acrobat は、 高解像度印刷 と 低解像度印刷の区別に対応 し てい ます。 低解像度印刷では、 個人 的な利用に し か適 さ ない よ う な、そのページのビ ッ ト マ ッ プ画像が生成 さ れますが、高 品位印刷 と 再 PDF 化はで き ません。 ビ ッ ト マ ッ プ印刷では出力品質が低 く な る だけで な く 、 印刷処理がかな り 遅 く な る こ と に も 留意 し て く だ さ い。 > 編集一般 : こ れを無効に さ れ る と 、 文書への変更は一切禁止 さ れ ます。 内容の抽出 と 印刷は許 さ れます。 > 内容の コ ピー と 抽出 : こ れを無効に さ れ る と 、 文書の内容を選択 し て ク リ ッ プボー ド へそれを コ ピー し て内容を再利用す る こ と が禁止 さ れ ます。 ア ク セシ ビ リ テ ィ イ ン タ フ ェース も 無効にな り ます。 こ の よ う な文書を Acrobat で検索す る 必要があ る と き は、 Acrobat の環境設定で 「承認済みプ ラ グ イ ンのみ」 を選択す る 必要があ り ます。 > コ メ ン ト と フ ォ ーム フ ィ ール ド の作成 : こ れを無効に さ れ る と 、 コ メ ン ト と フ ォ ーム フ ィ ール ド の追加 ・ 変更 ・ 削除が禁止 さ れ ます。 フ ォ ーム フ ィ ール ド への記入は許 さ れます。 > フ ォ ーム フ ィ ール ド への記入ま たは署名 : こ れを有効に さ れ る と 、 ユーザーはフ ォ ー ムに署名や記入はで き ますが、 フ ォーム フ ィ ール ド を作成す る こ と はで き ません。 > 内容ア ク セシ ビ リ テ ィ を有効にする : その文書の内容を ア ク セシ ビ リ テ ィ ソ フ ト ウ ェ ア (読み上げ ソ フ ト ウ ェ ア等) が利用す る こ と を許 し ます。 こ の設定は PDF 2.0 では 非推奨 と し て宣言 さ れてい ます : ア ク セシ ビ リ テ ィ 目的での内容抽出は内容の コ ピー と 抽出設定に基づ き ます。 > 文書の取 り ま と め : こ れを無効に さ れ る と 、 ページの挿入 ・ 削除 ・ 回転お よ び し お り ・ サム ネールの作成が禁止 さ れます。 印刷の禁止な ど、何 ら かのア ク セ ス制限を設定す る と 、Acrobat のそれに対応す る メ ニ ュ ー 項目が無効にな り ます。 し か し 、 こ れはサー ド パーテ ィ の PDF ビ ュ ーア な ど の ソ フ ト ウ ェ アで も そ う な る と は限 り ません。 文書内のア ク セ ス権限が実際に効力を持つか ど う かは、 PDF ツールの開発者にかか っ てい る のです。 実際、 い く つかの PDF ツールは権限設定を 全然無視す る こ と で知 ら れてい ます : 商用の PDF ク ラ ッ キ ン グ ツールを使えば、 いかな る ア ク セ ス制限 も 無効化す る こ と がで き ます。 こ れは暗号化の ク ラ ッ キ ン グ と は関係あ り 4.1 さ ま ざ ま な PDF セキ ュ リ テ ィ 機能 51 ません : パ ス ワー ド のない PDF フ ァ イ ルを、 画面では見 ら れて も 印刷はで き ない よ う に す る こ と は、 単に不可能なのです。 こ の こ と は ISO 32000-1 に下記の よ う に記 さ れてい ま す: 「ひ と たび文書が成功裡に開かれ復号 さ れれば、 準拠 リ ーダは技術的にその文書の内容 全体にア ク セス可能 と な る。暗号化辞書内で指定 さ れている文書権限設定群を強制で き る 性質の ものは PDF 暗号化の中に何 も ない。」 暗号化 さ れた文書構成要素 デフ ォ ル ト では、 PDF 暗号化はつねに 1 個の文書のすべて の構成要素を カバー し ます。 し か し 、 場合に よ っ ては、 文書内のい く つかの構成要素は暗 号化せず、 それ以外だけ を暗号化 し たい と き も あ り ます : > PDF 1.5 (Acrobat 6) では、 プ レーン テ キ ス ト メ タ デー タ と い う 機能が導入 さ れま し た。 こ の機能を使 う と 、 暗号化 さ れた文書に、 暗号化 さ れていない メ タ デー タ を入れ 込む こ と がで き ます。 こ れに よ っ て、 検索エ ン ジ ン が文書の メ タ デー タ を、 暗号化 さ れた文書か ら で も 取 り 出せ る よ う にす る こ と がで き ます。 > PDF 1.6 (Acrobat 7) か ら は、 保護 さ れていない文書の中の フ ァ イ ル添付であ っ て も 、 暗号化す る こ と が可能です。 こ れに よ っ て、 暗号化 さ れていない文書を、 秘密の添付 のための コ ン テナ と し て利用す る こ と がで き ます。 セキ ュ リ テ ィ 推奨項目 以下の こ と は、 で き る 暗号化が弱 く て ク ラ ッ ク さ れ る 可能性が あ り ますので、 避け る べ き です : > 1 ~ 6 キ ャ ラ ク タ か ら 成 る パ ス ワー ド は避け る べ き です。可能なすべてのパ ス ワー ド を 試す攻撃 (パ ス ワー ド に対す る ブルー ト フ ォース ア タ ッ ク ) に対 し て弱いか ら です。 > パ ス ワ ー ド は単な る 単語に似ていてはいけ ません。 可能な単語をすべて試す攻撃 (辞 書ア タ ッ ク ) に対 し て弱いか ら です。 パ ス ワ ー ド には非アルフ ァ ベ ッ ト キ ャ ラ ク タ を 含ませ る べ き です。 自分の配偶者やペ ッ ト の名前、 誕生日、 その他簡単に推測で き る 項目を使っ てはいけ ません。 > PDF 1.6 (Acrobat 4) ま での 40 ビ ッ ト RC4 アルゴ リ ズ ムは避け る べき です。可能なすべ てのキーを試す攻撃 (暗号化キーにいたい売 る ブルー ト フ ォ ース ア タ ッ ク ) に対 し て 弱いか ら です。 > 最新の AES アルゴ リ ズ ムのほ う が、 古い RC4 アルゴ リ ズ ム よ り も 望ま し いです。 > PDF 1.7ext3 (Acrobat 9) に従っ た AES-256 は避け る べ き です。 パ ス ワー ド チ ェ ッ ク ア ルゴ リ ズ ム に脆弱性を含んでい る こ と か ら 、 パ ス ワ ー ド に対す る ブルー ト フ ォ ース ア タ ッ ク が容易なためです。 こ のため、 Acrobat X と PLOP 4.1 では、 新 し い文書を保護 す る ために Acrobat 9 の暗号化は決 し て使用 し ません (既存の文書を復号す る ためにの み使用 し ます)。 ま と め る と 、 PDF 1.7ext8/PDF 2.0 に従っ た AES-256 か PDF 1.6/1.7 に従っ た AES-128 を 使用す る べ き です。ど ち ら を使 う かは Acrobat X が利用可能か ど う かに よ っ て決ま り ます。 パ ス ワー ド は 6 キ ャ ラ ク タ よ り も 長 く す る べ き であ り 、非アルフ ァ ベ ッ ト キ ャ ラ ク タ を含 ませ る べ き です。 Web 上の PDF を保護 PDF が Web で提供 さ れ る 場合には、 ユーザーは必ずその文書の ロ ーカル コ ピーを自分のブ ラ ウ ザで作 る こ と がで き ます。PDF 文書がユーザーに ロ ーカル コ ピーを と ら れない よ う にす る 方法はあ り ません。 52 4 章 : PDF セキ ュ リ テ ィ 4.2 PLOP の PDF セキ ュ リ テ ィ 機能 PLOP は、 Acrobat の標準のセキ ュ リ テ ィ 機能を、 PDF フ ァ イ ルに適用 し た り 、 PDF フ ァ イ ルか ら 除去 し た り し ます。 PLOP では、 ユーザーパ ス ワー ド と マ ス タ ーパ ス ワー ド を適 用す る こ と がで き 、 ま た、 ア ク セ ス権限を設定 し て、 Acrobat で文書を印刷で き ない よ う に し た り 、 テ キ ス ト を抽出で き ない よ う に し た り 、 文書を変更で き ない よ う に し た り す る こ と がで き ます。 文書を復号す る には、 適切なマ ス タ ーパ ス ワー ド が必要です。 暗号化アルゴ リ ズム と キー長 文書の保護に用い ら れ る 暗号化 ア ル ゴ リ ズ ム と キ ー長 は、 生成文書の PDF バージ ョ ンに依存 し ます。 生成文書の PDF バージ ョ ンは、 入力文書 の PDF バージ ョ ン と PLOP_create_file( ) の compatibility オプシ ョ ンに依存 し ます。 暗号化 アルゴ リ ズ ムは以下の よ う に選ばれます : > PDF バージ ョ ン 1.3 以下は、保護オプシ ョ ン userpassword・masterpassword・permissions のいずれかが適用 さ れていれば、 PDF 1.4 へ押 し 上げ ら れます。 RC4 40 ビ ッ ト は決 し て用い ら れません。 > PDF 1.4 ・ 1.5 : 128 ビ ッ ト キーに よ る RC4 暗号化の各種類が用い ら れます。 > PDF 1.6 ・ PDF 1.7 ・ PDF 1.7ext3 : AES-128 が用い ら れます。 なお、PDF 1.7ext3 (Acrobat 9) に従っ た AES-256 は、 既知の脆弱性があ り ますので決 し て用い ら れません。 > PDF 1.7ext8 ・ PDF 2.0 : Acrobat X に従っ た AES-256 が用い ら れます。 40 ビ ッ ト の暗号化キーが安全でない こ と は広 く 知 ら れてい ますので、 PLOP ではつねに 128 ビ ッ ト キーを用い、 40 ビ ッ ト キーを適用す る 暗号化は一切行い ません。 ただ し 、 40 ビ ッ ト 暗号化 さ れた文書は入力 と し ては受け付け ら れます。 さ ま ざ ま な PLOP の操作に必要なパスワー ド PDF 文書の権限設定に反映 さ れた作成者 の意図に厳密に従 う ためには、暗号化文書に対 し て あ ら ゆ る 操作を許すわけにはい き ませ ん。 PLOP は以下のルールに従っ て動作 し ます : > 暗号化の状態を pCOS 擬似オブジ ェ ク ト encrypt/algorithm で取得す る こ と は、パ ス ワー ド が ど う であれ、 つねに可能です。 > 文書のプ ロ パテ ィ を pCOS イ ン タ フ ェース で取得で き る か ど う かは、 pCOS モー ド に よ っ て決ま り ます。 た と えば、 XMP 文書 メ タ デー タ ・ 文書情報フ ィ ール ド ・ し お り ・ 注釈内容は、 その文書がユーザーパ ス ワ ー ド を必要 と し な ければ (あ る いはユーザー パ ス ワ ー ド のみが与え ら れてい る 場合) 、 マ ス タ ーパ ス ワ ー ド な し で取得で き ま す。 pCOS パ ス リ フ ァ レ ン ス で詳 し く 述べてい ます。 > ユーザーパ ス ワ ー ド ・ マ ス タ ーパ ス ワ ー ド ・ 権限設定を、 変更 ・ 除去す る には、 マ ス タ ーパス ワー ド が必要です。 > 暗号化 さ れた文書に対 し て、 線形化 ・ 最適化 ・ 修復 ・ 署名を行 う には (1.4 節 「Web 最 適化 (線形化) PDF」 (15 ページ) 参照)、 マ ス タ ーパ ス ワ ー ド が必要です。 表 4.2 に、 すべての操作について何が必要か を ま と め ま し た。 表 4.2 暗号 さ れた文書に対する さ ま ざ ま な操作のために必要なパスワー ド 知っ ている パスワー ド 暗号化の状態を取得 (pCOS 擬似オブ ジ ェ ク ト 「encrypt」) 文書情報 ・ XMP メ タ デー タ ・ し お り ・ 注釈内容を pCOS で取得 なし 可能 ユーザーパスワー ド が設定 不可 さ れていない と きのみ 不可 ユーザー 可能 可能 不可 パスワー ド ・ 権限 を変更 不可 線形化 ・ 最適化 ・ 修復 ・ 署名 4.2 PLOP の PDF セキ ュ リ テ ィ 機能 53 表 4.2 暗号 さ れた文書に対する さ ま ざ ま な操作のために必要なパスワー ド 知 っ ている パスワー ド 暗号化の状態を取得 (pCOS 擬似オブ ジ ェ ク ト 「encrypt」) 文書情報 ・ XMP メ タ デー タ ・ し お り ・ 注釈内容を pCOS で取得 パスワー ド ・ 権限 を変更 線形化 ・ 最適化 ・ 修復 ・ 署名 マス タ ー 可能 可能 可能 可能 PLOP でパスワー ド を設定 PLOP ラ イ ブ ラ リ API と PLOP コ マ ン ド ラ イ ンオプシ ョ ンで は、 元の PDF 文書を入力文書 と 呼び、 暗号化ま たは復号 さ れた生成物を出力文書 と 呼ぶ こ と に し ます (ど ち ら も 同 じ フ ァ イ ル名の場合 も あ り ますが) 。 入力文書が保護 さ れてい る 場合、 PLOP は表 4.2 に従っ て、 行いたい操作に よ っ てユーザーパ ス ワー ド かマ ス タ ー パ ス ワー ド のいずれかを必要 と し ます。 入力文書を成功裏に開 く こ と がで き たな ら ば (保 護 さ れていない文書だっ た場合、 ま たは正 し いパ ス ワ ー ド を与え た こ と に よ っ て) 、 出力 文書にはユーザーパ ス ワー ド ・ マ ス タ ーパス ワー ド ・ 権限設定を任意の組み合わせで適用 で き ます。 ただ し PLOP は、 ク ラ イ ア ン ト が出力文書のために与え る パ ス ワ ー ド につい て、 以下の よ う に作用 し ます : > ユーザーパ ス ワ ー ド か権限設定が与え ら れてい る のに、 マ ス タ ーパ ス ワ ー ド が与え ら れていない場合は、 通常の利用者がセ キ ュ リ テ ィ 設定を簡単に変え る こ と がで き 、 し たがっ て保護を破れて し ま い ます。 ですので PLOP は こ の状況を エ ラ ー と 見な し ます。 > ユーザーパ ス ワ ー ド と マ ス タ ーパ ス ワ ー ド が同一の場合、 ユーザー と フ ァ イ ルの所有 者 と の区別は も はや不可能 と な り 、 し たがっ てやは り 有効な保護は破れて し ま い ます。 PLOP は こ の状況をエ ラ ー と 見な し ます。 > AES-256 では Unicode パ ス ワー ド が許 さ れます。それ以外のすべての暗号化アルゴ リ ズ ム では、 Latin-1 文字セ ッ ト に限 ら れたパ ス ワ ー ド を必要 と し ます。 古い暗号化アルゴ リ ズ ムの場合に、与え ら れたパ ス ワー ド が Latin-1 文字セ ッ ト 外のキ ャ ラ ク タ を含んで い る と 、 例外が発生 し ます。 > パ ス ワー ド は、AES-256 では 127 UTF-8 バ イ ト ま でに、古い暗号化アルゴ リ ズ ムでは 32 キ ャ ラ ク タ ま でに切 り 落 と さ れます。 PLOP で権限 を設定 PLOP は、 表 4.3 に示す任意の権限設定を、 取得 ・ 設定 ・ 削除す る こ と がで き ます。 特記な き 限 り 、 すべての動作はデフ ォ ル ト では許 さ れます。 ア ク セ ス制 限を指定す る と 、Acrobat のそれに対応す る 機能が無効にな り ます。 ア ク セ ス制限は、ユー ザーパ ス ワ ー ド を設定 し な く て も 適用で き ま すが、 マ ス タ ーパ ス ワ ー ド は必要です。 表 4.3 に、 使え る 権限キー ワー ド を列挙 し ます。 表 4.3 PLOP_create_file( ) の permissions オプ シ ョ ンに対する ア ク セス制限キーワー ド 一覧 キーワー ド 説明 noprint Acrobat でその フ ァ イルが印刷で き な く な り ます。 nomodify Acrobat 上でユーザーがフ ォ ーム フ ィ ール ド を追加する こ と も 、 その他いかな る変更を加え る こ と も で き な く な り ます。 nocopy Acrobat で テキス ト やグ ラ フ ィ ッ ク を コ ピー ・ 抽出で き な く な り 、 ア ク セシ ビ リ テ ィ も無効にな り ます。 noannots Acrobat で注釈 ・ フ ォ ーム フ ィ ール ド を追加 ・ 変更で き な く な り ます。 noforms1 (noannots と 暗黙に見な さ れます) Acrobat で フ ォ ーム フ ィ ール ド への記入がで き な く な り ます。 noannots が指定 さ れていな く て も同様です。 noaccessible1 (PDF 2.0 では非推奨) Acrobat で テキス ト やグ ラ フ ィ ッ ク を ア ク セ シ ビ リ テ ィ 目的で抽出で き な く な り ます。 54 4 章 : PDF セキ ュ リ テ ィ 表 4.3 PLOP_create_file( ) の permissions オプ シ ョ ンに対する ア ク セス制限キーワー ド 一覧 キーワー ド noassemble 説明 1 (nomodify と 暗黙に見な さ れます) Acrobat でページの挿入 ・ 削除 ・ 回転および し お り ・ サムネー ルの作成がで き な く な り ます。 nomodify が指定 さ れていな く て も同様です。 nohiresprint1 Acrobat で高解像度印刷がで き な く な り ます。 noprint が指定 さ れていなければ、 印刷は 「画像 と し て印刷」 機能に制限 さ れ、 ページの低解像度版が印刷 さ れます。 plain- 暗号化 さ れた文書で も 、 文書の メ タ デー タ を暗号化 し ないま まに し ます。 metadata2 1. PDF 出力のバージ ョ ン番号を PDF 1.4 (Acrobat 5 以上が必要) へ押 し 上げます 2. PDF 出力のバージ ョ ン番号を PDF 1.5 (Acrobat 6 以上が必要) へ押 し 上げます PLOP で で き ない こ と 暗号化文書に対 し ては、 技術的に可能であ っ て も 、 文書の作成者 の意図を冒すので PLOP ではあ えて対応 し ていない操作がい く つかあ る と い う こ と を認識 す る こ と は重要です : > PLOP は ク ラ ッ カーツールではあ り ません。 こ れを利用 し て、 保護 さ れた文書に対 し 、 その (適切なユーザー ま たはマ ス タ ー) パ ス ワ ー ド を知 ら ずにア ク セ ス を得 る こ と は で き ません。 > PLOP では、 マ ス タ ーパ ス ワ ー ド な く し て権限設定を変え る こ と を許 し てい ません。 > PLOP では、 マ ス タ ーパス ワ ー ド な く し て、 ユーザーパ ス ワー ド ・ マ ス タ ーパ ス ワー ド を変更す る こ と を許 し てい ません。 > PLOP では、 ユーザーパ ス ワー ド かマ ス タ ーパ ス ワー ド な く し て、 暗号化 さ れた文書の 文書情報フ ィ ール ド を読みません。 > PLOP は PDF のパ ス ワー ド セキ ュ リ テ ィ に対応 し てい ますが、証明書ベース の暗号化に は対応 し てお ら ず、 ま たいかな る サー ド パーテ ィ の PDF 用の暗号化やデジ タ ル著作権 管理シ ス テ ム (Adobe Digital Editions や FileOpen 等) に も 対応 し てい ません。 > PLOP はデジ タ ル著作権管理(DRM)シ ス テ ム ではあ り ません。文書を個別の コ ン ピ ュ ー タ ・ ユーザ ・ CPU に紐付け る こ と はで き ません。 4.2 PLOP の PDF セキ ュ リ テ ィ 機能 55 4.3 コ マ ン ド ラ イ ン で PDF 文書 を保護 文書を暗号化す る には、 PLOP_create_file( ) で userpassword オプシ ョ ンか masterpassword オプシ ョ ン (両方で も 可) 指定 し ます。 ただ し 、 ユーザーパ ス ワー ド は必ずマ ス タ ーパ ス ワー ド を必要 と し ますが、 逆は真ではあ り ません。 PLOP ラ イ ブ ラ リ に よ る PDF 文書の保 護お よ び保護の除去については、 その完全なサンプル コ ー ド を、 すべての PLOP パ ッ ケー ジに入っ てい る encrypt ・ decrypt プ ロ グ ラ ミ ン グサンプルで見 る こ と がで き ます。 PLOP コ マ ン ド ラ イ ン ツールで こ れ と 等価なオプシ ョ ンは- - user と - - master です。 権限設定は、 PLOP_create_file( ) で permissions オプシ ョ ン を用いて指定で き ます。 コ マ ン ド ラ イ ン ツールで こ れ と 等価なオプシ ョ ンは- - permissions です。 注記 Windows では、 コ マ ン ド ラ イ ン上のパスワー ド は、 Latin-1 文字セ ッ ト 外の Unicode キ ャ ラ ク タ を含む こ と も可能です。 暗号化の例 以下のサンプル コ マ ン ド ラ イ ン呼び出 し では、コ マ ン ド ラ イ ン を長い も の と 短縮形の両方で示 し てい ます。 フ ァ イ ルを ユーザーパ ス ワー ド demo と マ ス タ ーパ ス ワー ド DEMO で暗号化 : plop --user demo --master DEMO --outfile encrypted.pdf input.pdf plop -u demo -m DEMO -o encrypted.pdf input.pdf カ レ ン ト デ ィ レ ク ト リ 内のすべての フ ァ イ ルを、 同一のユーザーパ ス ワ ー ド demo と マ ス タ ーパ ス ワー ド DEMO で暗号化 し 、 で き た フ ァ イ ルを タ ーゲ ッ ト デ ィ レ ク ト リ output へ 置く : plop --targetdir output --user demo --master DEMO *.pdf plop -t output -u demo -m DEMO *.pdf スペース キ ャ ラ ク タ を含むパ ス ワー ド は、 次の例の よ う に中カ ッ コ で (オプシ ョ ン リ ス ト 文法に従 う ために) 、 さ ら に ス ト レー ト な引用符で (シ ェ ル文法に従 う ために) く く る 必 要があ り ます。 文書を マ ス タ ーパ ス ワー ド two words で暗号化 : plop --master "{two words}" --outfile encrypted.pdf input.pdf plop -m "{two words}" -o encrypted.pdf input.pdf 復号の例 1 個のフ ァ イ ルを マ ス タ ーパ ス ワ ー ド DEMO で復号。入力文書にア ク セ ス制限 がかけ ら れていた と し て も 、 それ ら はすべて除去 さ れます (なぜな ら 出力は暗号化 さ れて いないので) : plop --password DEMO --outfile decrypted.pdf encrypted.pdf plop -p DEMO -o decrypted.pdf encrypted.pdf よ り 強い暗号化方式で再暗号化 PLOP を利用す る と 、短いキーや弱いパ ス ワー ド で暗号 化 さ れてい る 文書に、 も っ と 強い暗号化を施す こ と も で き ます。 古いパ ス ワー ド と 新 し い パ ス ワー ド を与え る 必要があ り ます。 PDF 1.6 出力互換を選択す る と 、 強い AES 暗号化が 有効にな り ます。 次の例では、 入力文書はマ ス タ ーパ ス ワー ド old で暗号化 さ れてい る と き に、 出力を マ ス タ ーパ ス ワー ド DEMO で AES 暗号化す る 場合を想定 し てい ます。 新 し いパ ス ワー ド は古いパ ス ワー ド と 同 じ で も か ま い ません。 も ち ろん、 実際には こ の例の よ う な短いパ ス ワー ド ではな く 、 強いパ ス ワ ー ド だけ を用い る べき です ( 「セキ ュ リ テ ィ 推 奨項目」 (52 ページ) 参照) : 56 4 章 : PDF セキ ュ リ テ ィ plop --compatibility 1.6 --password old --master DEMO --outputfile strong.pdf weak.pdf plop -c 1.6 -p old -m DEMO -o strong.pdf weak.pdf 権限設定 マ ス タ ーパ ス ワー ド DEMO と 、 権限設定 noprint ・ nocopy ・ noannots を、 デ ィ レ ク ト リ 内のすべての フ ァ イ ルに適用 し て、 で き た フ ァ イ ル を タ ーゲ ッ ト デ ィ レ ク ト リ output に置 く 。 入力文書で使われてい る 暗号化が何であ る かにかかわ ら ず、 AES 暗号化 が用い ら れます (PDF バージ ョ ン 1.6 に よ り 強制 さ れ る ので)。 詳細度レベル 2 では、 す べての入力 ・ 出力フ ァ イ ルの名前が、 処理 さ れ る につれて印字 さ れます : plop --verbose 2 --compatibility 1.6 --master DEMO --permissions "noprint nocopy noannots" --targetdir output *.pdf plop -v 2 -c 1.6 -m DEMO --permissions "noprint nocopy noannots" -t output *.pdf すべての権限設定を フ ァ イ ルか ら 除去 し 、 その結果を別の出力フ ァ イ ルへ、 同 じ マ ス タ ー パ ス ワー ド で コ ピー。 こ れには入力文書に対す る マ ス タ ーパ ス ワー ド が必要です : plop --password DEMO --master DEMO --outfile unrestricted.pdf protected.pdf plop -p DEMO -m DEMO -o unrestricted.pdf protected.pdf 文書を再暗号化 し (た と えば、 弱い暗号化を強い AES 暗号化に換えた り 、 弱いパ ス ワー ド を も っ と 良い も のに換えた り )、権限設定は入力文書の も のを複製。結果を別の出力フ ァ イ ルへ コ ピー。 こ れには入力文書に対す る マ ス タ ーパ ス ワー ド が必要です : plop --password DEMO --master LONGPASSWORD --permissions keep --outfile unrestricted.pdf protected.pdf plop -p DEMO -m LONGPASSWORD --permissions keep -o unrestricted.pdf protected.pdf 4.3 コ マ ン ド ラ イ ン で PDF 文書を保護 57 58 4 章 : PDF セキ ュ リ テ ィ 5 PLOP DS によ る電子署名 注記 PDF 文書に電子的に署名する機能は、 PDFlib PLOP DS でのみ利用可能であ り 、 基本版の PLOP にはあ り ません。 5.1 電子署名の基本概念 電子署名について詳 し く 説明す る こ と は こ のマニ ュ アルの範囲外です。 し か し 、 PLOP DS で PDF 文書に電子的に署名す る 際に役割を果たす最 も 重要な概念をい く つか挙げてい き ます。 電子署名は、 公開鍵暗号 (非対称暗号化 と も い う ) に基づいてい ま す。 そ こ では、 文 書に署名す る 人だけが知っ てい る 秘密鍵 と 、署名を検証す る ための誰 も が知っ てい る 公開 鍵が用い ら れます。 公開鍵は一般に、 いわゆ る 証明書フ ァ イ ルに入っ た状態で頒布 さ れ ます。 こ の証明書 フ ァ イ ルの中には、 署名者の公開鍵のほか、 その人の名前や具体的な連絡先が入っ てい ま す。 証明書の偽証を防 ぐ ため、 こ の情報パ ッ ケージは さ ら に、 人やその他の主体 (企業 ・ サーバ等) に対 し て証明書を発行 し てい る 、 信頼 さ れた第三者に よ っ て署名 さ れます。 こ の よ う な信頼 さ れた第三者を、 認証局 (CA) ま たは ト ラ ス ト セ ン タ (TC) と いい ま す。 認証局自身の証明書をルー ト 証明書 と いい ます。 こ れは通常、 認証局の ウ ェ ブサ イ ト で公 開 さ れて、 誰で も ダ ウ ン ロ ー ド で き る よ う にな っ てい ます。 こ れは、 認証局に よ っ て発行 さ れた証明書を その フ ィ ン ガープ リ ン ト に よ っ て検証す る ために必要です (後述)。 証明書は一般に、 X.509 形式で格納 さ れます。 証明書 と それに対応す る 秘密鍵の入っ た パ ッ ケージ をデジ タ ル ID と いい ますが、 こ れを証明書 と 区別す る こ と は重要です。 証明 書は誰にで も 自由に配布 し てか ま い ませんが、 デジ タ ル ID は し っか り 隠 さ なければいけ ません。 デジ タ ル ID の中の秘密鍵にア ク セ スす る (電子署名を行 う ために) には通常、 パ ス ワー ド ま たはパ ス フ レーズが必要です。 デジ タ ル ID の広 く 利用 さ れてい る 格納形式 は PKCS#12 と PFX です。 ただ し 証明書 と デジ タ ル ID は、 いつ も き ちん と 区別 さ れてい る と は限 り ません。 「証明書を使っ て文書に署名」 す る と い う 言い方をす る 人がい ますが、 実際はそれは 「デジ タ ル ID を使っ て署名」 と い う 意味で し ょ う 。 証明書には必ず、 それに関連づけ ら れたハ ッ シ ュ 値 (フ ィ ン ガープ リ ン ト と も い う ) が あ り 、 その証明書が真正か を ダブルチ ェ ッ ク す る ために利用で き ます。 認証局の証明書を 手作業で検証す る には、 その フ ィ ン ガープ リ ン ト を適当な ソ フ ト ウ ェ ア を使っ て読み取 り 、 それを他の何 ら かの (信頼で き る ) 手段で得たその認証局の フ ィ ン ガープ リ ン ト と 照 ら し 合わせ る 必要があ り ます。 証明書は一定の期間のみ有効です。 その有効期限が切れれ ばただちに証明書は無効にな り ます し 、 あ る いは、 認証局に よ っ て明示的に停止 さ れた場 合 も 無効 と な り ます。 証明書が停止 さ れ る 必要が生 じ る のは、 証明書の所有者が関連の機 関を去っ た と き や、 秘密鍵が漏れたか も し れない と き です。 公開鍵基盤 (PKI) は、 証明書を配布 し た り その有効性を検査 し た り す る ためのあ ら ゆ る 関連 タ ス ク を網羅 し た ソ フ ト ウ ェ ア環境です。 証明書の検査は、 オン ラ イ ン検査の場合 も あれば (オン ラ イ ン証明書状態プ ロ ト コ ル= OCSP と い う プ ロ ト コ ルを使用)、 停止 リ ス ト を用い る 場合 も あ り ます。 認証局 も PKI も 得 ら れない場合は、 自己署名証明書を使 う こ と も 可能です。 その場合は、 証明書の フ ィ ン ガープ リ ン ト を直接、 信頼で き る 転送手段 でや り と り す る 必要があ る ので、一般には小規模の利用者グループで し か現実的ではあ り ません。 5.1 電子署名の基本概念 59 5.2 デジ タ ル ID の取得 と 管理 電子署名作成のための各種暗号化エ ン ジ ン PLOP DS は さ ま ざ ま な暗号化エン ジ ンに対 応 し てい ます。 暗号化エン ジ ン と は、 電子署名の生成に必要な さ ま ざ ま な暗号機能を実装 し た ソ フ ト ウ ェ ア部品です。 暗号化エン ジ ン の選択は、 デジ タ ル ID の形式 と 保管場所、 お よ び他 の ソ フ ト ウ ェ ア や オ ペ レ ー テ ィ ン グ シ ス テ ム と の 統合 に 影響 を 与 え ま す。 PLOP DS は、 以下の暗号化エン ジ ンに対応 し てい ます。 > builtin エン ジ ン : すべてのプ ラ ッ ト フ ォームで利用可能です。 こ れは、 必要な暗号関 数群を PLOP DS のカーネル内に実装 し た も ので、 外部に一切依存 し ません。 こ のエン ジ ンはデフ ォ ル ト で有効ですが、 PLOP_create_file( ) の sign オプシ ョ ンでサブオプシ ョ ン engine=builtin を設定 し て明示的に選択する こ と も で き ます。 > mscapi エン ジ ン : Windows オペレーテ ィ ン グ シ ス テ ムに内蔵の Microsoft Cryptographic API を指 し ます (Windows でのみ利用可能)。 こ れを利用す る と 、 PLOP DS は、 Windows が提供す る 暗号 イ ン フ ラ ス ト ラ ク チ ャ や、 CAPI ド ラ イ バでア タ ッ チ さ れ る サー ド パー テ ィ の ソ フ ト ウ ェ ア ・ ハー ド ウ ェ ア と 共同す る こ と がで き ます。 mscapi エン ジ ン を選 択す る には、 PLOP_create_file( ) の sign オプシ ョ ン でサブオプシ ョ ン engine=mscapi を 設定 し ます。 > pkcs#11 エン ジ ン:暗号 ト ー ク ンへの統一 さ れた ア ク セ ス を提供す る PKCS#11 と い う ソ フ ト ウ ェ ア イ ン タ フ ェ ー ス を指 し ま す。 こ こ で ト ー ク ン と は、 ス マー ト カー ド ・ USB ス テ ィ ッ ク その他の暗号デバ イ ス を指 し ます。 ト ー ク ンは多 く の場合、 ソ フ ト ウ ェ ア 認証 よ り も 高いセキ ュ リ テ ィ を実現 し 、 多 く は PIN で保護 さ れてい ます。 こ のエン ジ ンはすべてのプ ラ ッ ト フ ォーム で利用で き る わけではあ り ません。 pkcs#11 エン ジ ン を 選択す る には、 PLOP_create_file( ) の sign オプシ ョ ンでサブオプシ ョ ン engine=pkcs#11 を設定 し ます。 > PLOP DS ユーザーは、 外部暗号化エ ン ジ ン (CE) を フ ッ ク ア ッ プす る こ と も で き ます。 こ れを利用す る と 、 証明書や署名の生成に関 し て カ ス タ ム な要請を実装 し 、 既存の暗 号化ハー ド ウ ェ ア ま たは ソ フ ト ウ ェ ア モ ジ ュ ール を フ ッ ク ア ッ プす る こ と がで き ま す。 CE イ ン タ フ ェ ー ス の解説 と そのバ イ ナ リ はお求めに応 じ て提供 し ま す。 標準の PLOP DS 内のバ イ ナ リ では CE イ ン タ フ ェ ース には対応 し てい ません。 デジ タ ル ID の対応形式 PLOP DS では、 PDF 文書に署名す る ためにデジ タ ル ID が必要 です。 デジ タ ル ID の中には、 署名者のデジ タ ル証明書のほかに、 それに対応す る 秘密鍵 が入っ てい ますので、 通常、 パス ワ ー ド やそれに類す る 手段で守 ら れてい ます。 PLOP DS は以下の種類のデジ タ ル ID に対応 し てい ます : > すべてのプ ラ ッ ト フ ォーム で、engine=builtin と 設定 し た場合:PKCS#12 形式(通常 .p12) か PFX 形式 (通常 .pfx) のデジ タ ル ID フ ァ イ ル > Windows 上で、 engine=mscapi と 設定 し た場合 : Windows 証明書ス ト ア内のデジ タ ル ID > PKCS#11 対応のすべてのプ ラ ッ ト フ ォームで、 engine=pkcs#11 と 設定 し た場合 : コ ン ピ ュ ー タ に接続 さ れてい る ス マー ト カー ド その他の暗号 ト ー ク ン (デバ イ ス) 上に格 納 さ れてい る デジ タ ル ID デジ タ ル ID の入手元 デジ タ ル ID を入手で き る 元は さ ま ざ ま あ り ます。 多 く の ID は、 電子 メ ールへの署名を想定 さ れてい ます。 こ う し た電子 メ ール ID を PLOP DS で使っ て PDF 文書を署名す る こ と も 可能です。 デジ タ ル ID を ど こ か ら 得 る かは、 必要な ID の個数 や (た と えば従業員ご と に 1 個ずつ、 あ る いは会社の ID を 1 個だけ)、 求め る 制御の自由 度に よ っ て選択で き ます : 60 5 章 : PLOP DS に よ る電子署名 図 5.1 Windows 証明書ス ト ア を管理 コ ン ソ ール (MMC) で管理 > ID を無償ま たは有償で発行 し てい る パブ リ ッ ク 認証局のいずれかか ら デジ タ ル ID を得 る。 > 自分のプ ラ イ ベー ト 認証局を構築 し て、デジ タ ル ID を自分で作成で き る よ う にす る 。認 証局 を 構築 で き る ソ フ ト ウ ェ ア パ ッ ケ ー ジ は さ ま ざ ま あ り ま す。 た と え ば無償の OpenSSL ソ フ ト ウ ェ アや (www.openssl.org 参照)、 Java の一部であ る keytool アプ リ ケーシ ョ ンや、 Microsoft Windows Server オペレーテ ィ ン グ シ ス テ ムの一部であ る 証明 書サービ ス な ど が挙げ ら れます。 > 自己署名証明書か ら デジ タ ル ID を作成す る 。Acrobat で自己署名証明書を作成す る には 次の よ う に し ます : Acrobat X : 「ツール」 → 「保護」 → 「その他の保護」 → 「セキ ュ リ テ ィ 設定」 → 「デジ タ ル ID」 → 「ID を追加」 → 「今す ぐ デジ タ ル ID を新規作成」 Acrobat 9 : 「ア ド バン ス ト 」 → 「セキ ュ リ テ ィ 設定」 → 「デジ タ ル ID」 → 「ID を追加」 → 「今す ぐ デジ タ ル ID を新規作成」 Acrobat 8 : 「ア ド バン ス ト 」 → 「セキ ュ リ テ ィ 設定」 → 「デジ タ ル ID」 → 「ID を追加」 → 「Acrobat で使用する Self-Sign デジ タ ル ID を作成」 その次の ス テ ッ プで、 タ ーゲ ッ ト と し て PKCS#12 のデ ィ ス ク フ ァ イ ルか、 Windows 証 明書ス ト ア を指定で き ます。 ど ち ら の方式 も PLOP DS で使え ます。 Windows 証明書ス ト ア を管理 Windows オペレーテ ィ ン グ シ ス テ ムでは、任意の数の証明 書を持つ こ と がで き 、 それ ら はい く つかの証明書ス ト アに ま と め ら れます (物理的にはレ ジ ス ト リ に格納 さ れます)。PFX 形式か PKCS#12 形式の新規証明書を イ ン ス ト ールす る に は、 証明書フ ァ イ ルを単にダブル ク リ ッ ク し て、 証明書の イ ン ポー ト ウ ィ ザー ド に従っ て いけば完了 し ます。 PLOP DS パ ッ ケージに入っ てい る デモ証明書で、 パ ス ワー ド demo で 試す こ と がで き ます。 Windows で証明書を表示 し た り ま と めた り す る には、Microsoft 管理 コ ン ソ ール (MMC) を使っ て次の よ う に し ます : > 「ス タ ー ト 」 → 「 フ ァ イル名を指定 し て実行 ...」 を ク リ ッ ク し 、 「mmc」 と 入力 し て、 OK を ク リ ッ ク し ます。 す る と 、 管理 コ ン ソ ールが起動 し ます。 > 「フ ァ イル」 メ ニ ュ ーで 「スナ ッ プ イ ンの追加 と 削除 ...」 を ク リ ッ ク し ます。 5.2 デジ タ ル ID の取得 と 管理 61 > 「利用で き る ス タ ン ド ア ロ ン スナ ッ プ イ ン」 で 「証明書」 を選択 し 、 「追加」 を ク リ ッ ク し ます。 > その次のダ イ ア ロ グで 「ユーザー ア カ ウン ト 」 を選択 し 、 「完了」 を ク リ ッ ク し ます。 あ る いは も し 、 「サービ ス ア カ ウ ン ト 」 か 「 コ ン ピ ュ ー タ ア カ ウ ン ト 」 に自分の証明 書を入れて あ る な ら 、 それを用い ます。 > 「OK」 を ク リ ッ ク し ます。 こ れで、 イ ン ス ト ール さ れてい る 証明書を閲覧で き る よ う にな り ま し た。 自分自身の証明 書は 「個人」 カ テ ゴ リ にあ り 、 こ れは PLOP DS において次のオプシ ョ ン リ ス ト で指定で き ます (--signopt コ マ ン ド ラ イ ンオプシ ョ ンに与え る か、 PLOP_create_file( ) の sign オプ シ ョ ンに与え る ) : engine=mscapi digitalid={certstore={store=My subject={Demo PLOP User 2048}}} 証明書の詳細を見 る には、 MMC で証明書を ダブル ク リ ッ ク し ます。 証明書を PFX 形式へ 書 き 出すには、 一覧の中の証明書を右 ク リ ッ ク し て、 「すべての タ ス ク 」 → 「エ ク スポー ト ...」 を ク リ ッ ク し ます。 す る と 、 証明書のエ ク ス ポー ト ウ ィ ザー ド が起動 し ます。 管理 コ ン ソ ールを利用 し て、証明書を取 り 込むする こ と も で き ます。証明書ス ト ア (「個 人」 等) を右 ク リ ッ ク し て、 「すべての タ ス ク 」 → 「イ ンポー ト ...」 を選択 し ます。 . Windows では、 以下のキー長が使え ます : > RSA アルゴ リ ズ ム : Microsoft Enhanced Cryptographic Provider で 384 ビ ッ ト か ら 16384 ビ ッ ト 、 Microsoft Base Cryptographic Provider で 384 ビ ッ ト か ら 512 ビ ッ ト 。 > DSA アルゴ リ ズ ム:512 ビ ッ ト か ら 1024 ビ ッ ト (Acrobat が 4096 ビ ッ ト ま での DSA を使え る の と は異な り ます) 図 5.2 Windows の証明書プ ロパテ ィ 62 5 章 : PLOP DS に よ る電子署名 5.3 PLOP DS で PDF 文書に署名 署名は PDF ではフ ォーム フ ィ ール ド と し て実装 さ れてい ます。 PDF の署名はつねに文書 全体に紐づいてお り (特定のページにではな く )、 次の 2 つの種類があ り ます : > 不可視署名 : ページ上で スペース を ま っ た く と り ません。 Acrobat で 「署名」 タ ブ を表 示 さ せ る と (Acrobat X : 「表示」 → 「表示切 り 替え」 → 「ナ ビ ゲーシ ョ ンパネル」 → 「署名 ...」。 Acrobat 8/9 : 「表示」 → 「ナビゲーシ ョ ンパネル」 → 「署名 ...」) 見 る こ と がで き ます。 > 可視署名 : 文書のいずれかのページの ど こ かに置かれた矩形の フ ォ ーム フ ィ ール ド を 用いてい ます。 ページ番号 ・ フ ィ ール ド 名 ・ フ ィ ール ド 座標を指定で き ます。 ど ち ら の種類の署名で も 、 ほかに も さ ま ざ ま なプ ロ パテ ィ を指定する こ と がで き ます。 た と えば位置や署名の理由、 連絡先情報等です。 PLOP DS を使っ て電子署名を行 う には、 デジ タ ル ID が必要です (5.2 節 「デジ タ ル ID の取得 と 管理」 (60 ページ) 参照)。 デジ タ ル ID ま たは ト ー ク ン を利用す る には、 そのパ ス ワー ド が必要です。 Windows 証明書ス ト アの中の個人の (ア カ ウ ン ト ご と の) デジ タ ル ID を利用す る 場合、 ID は Windows ロ グ イ ンで保護 さ れてい ます。 PLOP DS で署名を行 う 以下の例で、 PLOP DS の コ マ ン ド ラ イ ン ツール と ラ イ ブ ラ リ を 使っ て PDF 文書に電子的に署名を行 う 方法を示 し ます。 --signopt に与え てい る オプシ ョ ン リ ス ト は、 PLOP DS の API 関数 PLOP_create_file( ) (sign オプシ ョ ン) に与えれば、 自 分自身のプ ロ グ ラ ムの中で署名を作成す る こ と がで き ます。対応 し てい る すべての言語バ イ ンデ ィ ン グに対す る 完全なプ ロ グ ラ ミ ン グ作成例が、 PLOP DS パ ッ ケージに入っ てい ます。 こ れ ら の作成例では、 デジ タ ル ID フ ァ イ ル demo2048.p12 と demo2048.pfx のパ ス ワー ド が demo であ り 、 ま た、Windows 証明書ス ト アの中のデジ タ ル ID が架空のユーザー 名 DEMO PLOP user 2048 の も のであ る と 前提 し てい ます。 サンプルデジ タ ル ID フ ァ イ ル がデ ィ ス ト リ ビ ュ ーシ ョ ンパ ッ ケージに入っ てい ます。 PDF 文書に不可視署名を作成。 フ ァ イ ル demo2048.p12 のデジ タ ル ID を使用。 デジ タ ル ID のパ ス ワ ー ド はフ ァ イ ル pw.txt の中にあ る 場合 : plop --signopt "digitalid={filename=demo2048.p12} passwordfile=pw.txt" --outfile signed.pdf input.pdf plop -S "digitalid={filename=demo2048.p12} passwordfile=pw.txt" -o signed.pdf input.pdf 可視署名フ ィ ール ド を、 ページ 1 の左下部分に作成。 パ ス ワー ド demo は直接与え てい ま すが、 こ れはマルチユーザシ ス テ ムでは推奨 し ません。 なぜな ら パ ス ワー ド を含む コ マ ン ド ラ イ ンが他のユーザーに見え る か も し れないか ら です (Unix シ ス テ ム な ら ps コ マ ン ド 等で) : plop --signopt "appearance={fieldname=Signature1 rect={10 10 200 100} } digitalid={filename=demo2048.p12} password={demo}" --outfile signed.pdf input.pdf plop -S "appearance={fieldname=Signature1 rect={10 10 200 100} } digitalid={filename=demo2048.p12} password={demo}" -o signed.pdf input.pdf 注記 以下の Windows での作成例を動作 さ せるには、フ ァ イル demo2048.pfx 内のデジ タ ル ID を ダブルク リ ッ ク し て Windows 証明書ス ト アに イ ン ス ト ールする必要があ り ます。 (Windows のみ) PDF 文書に不可視署名を作成。 Windows 証明書ス ト アの証明書を使用 (デ フ ォ ル ト ス ト ア My の)。 こ こ では、 デジ タ ル ID は自分の Windows ロ グ イ ンに よ っ て保護 さ れてい る ため、 パ ス ワー ド を与え る 必要がない と 前提 し てい ます : 5.3 PLOP DS で PDF 文書に署名 63 plop --signopt "engine=mscapi digitalid={certstore={store=My subject={Demo PLOP User 2048}}}" --outfile signed.pdf input.pdf plop -S "engine=mscapi digitalid={certstore={store=My subject={Demo PLOP User 2048}}}" -o signed.pdf input.pdf (Windows のみ) PDF 文書に不可視署名を作成。 フ ァ イ ル demo2048.pfx の証明書を使用 : plop --signopt "engine=mscapi digitalid={filename=demo2048.pfx} passwordfile=pw.txt" --outfile signed.pdf input.pdf plop --S "engine=mscapi digitalid={filename=demo2048.pfx} passwordfile=pw.txt" -o signed.pdf input.pdf 不可視署名を作成 し 、 PDF を暗号化す る マ ス タ ーパ ス ワー ド SECRET と 、 デジ タ ル ID にア ク セ スす る パ ス ワー ド demo で文書を暗号化 : plop --master SECRET --signopt "digitalid={filename=demo2048.p12} password={demo}" --outfile signed.pdf input.pdf plop --m SECRET --S "digitalid={filename=demo2048.p12} password={demo}" -o signed.pdf input.pdf ス マー ト カ ー ド その他の暗号 ト ー ク ン で署名 PLOP DS 内の PKCS#11 エン ジ ン を用い る と 、 ス マー ト カー ド その他の暗号 ト ー ク ン上の証明書を利用す る こ と がで き ます。 そのた めには、 ト ー ク ン独自のプ ロ ト コ ルを実装 し てい る DLL ま たは共有 ラ イ ブ ラ リ が必要で す。 PKCS#11 DLL は ト ー ク ンのベン ダーか ら 、 その ド ラ イ バキ ッ ト に含まれた形で提供 さ れてい る 必要があ り ます。 それはシ ス テ ムに イ ン ス ト ール さ れてい る 必要があ り 、 かつ PLOP DS で利用可能にな っ てい る 必要があ り ます。 Windows の場合 こ れはすなわち、 DLL は、Windows のシ ス テ ムデ ィ レ ク ト リ か、PATH 環境変数に含まれてい る デ ィ レ ク ト リ か、 あ る いはカ レ ン ト デ ィ レ ク ト リ に コ ピー さ れてい る 必要があ る こ と を意味 し ます。 なお、 PKCS#11 DLL が他の DLL に依存 し てい る 可能性 も あ り ます。 その よ う な場合には、 ト ー ク ンのベン ダーが提供 し てい る 必要な DLL がすべて、 PLOP DS で利用可能にな っ てい る 必要があ り ます。 以下の作成例では、ベン ダー独自の PKCS#11 DLL を cryptoki.dll と し ます。実際の DLL の名前は こ れ と は異な る 可能性があ り ます。 PKCS#11 で指定 さ れた ト ー ク ンの中のデジ タ ル ID を用いて、 PDF 文書に不可視署名を作 成。 ト ー ク ンの PIN はフ ァ イ ル pw.txt に入っ てい る も の と し ます : plop --signopt "engine=pkcs#11 digitalid={filename=cryptoki.dll} passwordfile=pw.txt" --outfile signed.pdf input.pdf plop -S "engine=pkcs#11 digitalid={filename=cryptoki.dll} passwordfile=pw.txt" -o signed.pdf input.pdf PKCS#11 で指定 さ れた ト ー ク ンの中のデジ タ ル ID を用いて、 PDF 文書に不可視署名を作 成。 こ の コ マ ン ド では PIN は与えてお ら ず、 かわ り に ト ー ク ンの内蔵キーボー ド で ト ー ク ンの PIN を入力する 必要があ り ます : plop --signopt "engine=pkcs#11 digitalid={filename=cryptoki.dll}" --outfile signed.pdf input.pdf plop -S "engine=pkcs#11 digitalid={filename=cryptoki.dll}" -o signed.pdf input.pdf 64 5 章 : PLOP DS に よ る電子署名 ページ 1 の左下部分に可視署名フ ィ ール ド を作成。 ト ー ク ンの PIN 1234 を直接与え てい ま すが、 こ れはマルチユーザーシ ス テ ム では、 コ マ ン ド ラ イ ン がパ ス ワ ー ド ご と 他のユー ザーに見え る おそれがあ る ため、 推奨 し ません : plop --signopt "appearance={fieldname=Signature1 rect={10 10 200 100} } engine=pkcs#11 digitalid={filename=cryptoki.dll} password={1234}" --outfile signed.pdf input.pdf plop -S "appearance={fieldname=Signature1 rect={10 10 200 100} } engine=pkcs#11 digitalid={filename=cryptoki.dll} password={1234}" -o signed.pdf input.pdf ト ー ク ン上のデジ タ ル ID を選択 ス マー ト カー ド な ど の暗号 ト ー ク ン 1 個の中に、 複数 のデジ タ ル ID が入っ てい る 場合があ り ます。 た と えば、 1 個は電子 メ ールの暗号化用、 も う 1 個は文書への電子署名用 と い う よ う な場合です。 こ の場合には、 PLOP_create_file( ) の sign オプシ ョ ンの keyusage サブオプシ ョ ン を用いて、 PLOP DS 署名のための タ ーゲ ッ ト ID を選択す る こ と がで き ます。 こ れは、 証明書の KeyUsage 拡張内に符号化 さ れてい る 用 途フ ラ グに基づ き デジ タ ル ID を選択す る キーワー ド を受け付け ます (KeyUsage 拡張の詳 し い説明は RFC 3280 を参照 し て く だ さ い)。 た と えば、 ス マー ト カー ド の中に 2 個の ID があ り 、 nonrepudiation フ ラ グ を伴 う ID を署名に使 う 必要があ る と き は、 sign オプシ ョ ンに対 し て下記のサブオプシ ョ ン を用い る こ と がで き ます : digitalid={filename=cryptoki.dll keyusage={nonrepudiation=set}} デジ タ ル ID のロ ッ ク 解除 デジ タ ル ID は、電子署名を作成す る ための秘密鍵を保持 し て い る ため、 通常、 パ ス ワー ド ない し パ ス フ レーズ ま たは PIN で保護 さ れてい ます。 デジ タ ル ID を PLOP DS で使 う ために ロ ッ ク 解除す る には、 適切な認証を与え る 必要があ り ま す。 間違っ たパ ス ワー ド を与え た場合、 PLOP DS は例外を発生 さ せます。 デジ タ ル ID の ロ ッ ク 解除の具体的な方法は、 以下の よ う に、 選択 し てい る 暗号化エン ジ ンに よ っ て異な り ます。 > engine=builtin の と き :そのパ ス ワー ド を sign オプシ ョ ンの password サブオプシ ョ ンに 与え る 必要があ り ます。 PLOP DS コ マ ン ド ラ イ ン ツールを使 う 場合は、 パ ス ワー ド は 別フ ァ イ ルに入れて passwordfile サブオプシ ョ ン で別途与え る こ と を強 く 推奨 し ます。 パ ス ワ ー ド フ ァ イ ルを使わずにパ ス ワ ー ド を直接与え た場合、 他のユーザーがそれを 読め る 可能性があ り ます。 なぜな ら マルチユーザーシ ス テ ム では コ マ ン ド ラ イ ン が他 のユーザーに見え る か も し れないか ら です。 > engine=mscapi の と き :Windows 証明書ス ト アの中のデジ タ ル ID は、自分の証明書の設 定に よ っ ては、 自分の Windows ロ グ イ ンに よ っ て保護 さ れてい る ので、 パ ス ワー ド を さ ら に与え る 必要はあ り ません。 > engine=pkcs#11の と き :暗号 ト ー ク ンが ソ フ ト ウ ェ アか ら のパ ス ワー ド /PINの送信を許 し てい る 場合は、 engine=builtin の場合 と 同様に password オプシ ョ ン を与え る 必要が あ り ます (上述)。 ト ー ク ンが PIN やパ ス ワー ド の直接入力を必要 と し てい る 場合は、 password オプシ ョ ンは省略す る こ と がで き (あ る いは空文字列を与え)、 PIN は ト ー ク ンのキーボー ド に手入力す る 必要があ り ます。 パ ス ワ ー ド /PIN の具体的扱いは、 暗号 ト ー ク ンに よ っ て さ ま ざ ま です。 5.3 PLOP DS で PDF 文書に署名 65 5.4 PLOP DS の署名の暗号の詳細 署名の暗号化アルゴ リ ズム と キー長 署名生成の た め の暗号化 ア ル ゴ リ ズ ム と キ ー長 は、 デジ タ ル ID に よ っ て決定 さ れます (それ ら は、 ID の公開鍵 / 秘密鍵ペア を作成す る 際に指定 さ れてい ます)。PLOP DS では、以下のアルゴ リ ズ ム と キー長に対応 し てい ます。 > RSA、 キー最大長 4096 ビ ッ ト > DSA、キー最大長 4096 ビ ッ ト 。DSA では SHA-1 メ ッ セージダ イ ジ ェ ス ト のみ使え ます。 メ ッ セージ ダ イ ジ ェ ス ト (ハ ッ シ ュ 関数) 電子署名 を 生成す る た めに用い ら れ る メ ッ セージダ イ ジ ェ ス ト アルゴ リ ズ ム (ハ ッ シ ュ 関数) は、 い く つかの要因に よ っ て決定 さ れ ます。 PLOP DS は、 安全な SHA-256 アルゴ リ ズ ム を可能な限 り 用い る こ と を試みますが、 可能でない と き は SHA-1 を用い ます。 SHA-256 か SHA-1 かの選択は 2 つの要因に よ っ て行われます:SHA-256 実装が利用可 能であ る か ど う か と 、 生成 さ れ る PDF 出力の種類です。 SHA-256 が利用可能か ど う かは、 選択 し てい る 暗号化エン ジ ンに よ っ て決ま り ます : > engine=builtin の場合には、 SHA-256 はつねに利用可能です。 > engine=pkcs#11 の場合には、 SHA-256 が利用可能か ど う かは、 暗号 ト ー ク ンの能力に よ っ て決ま り ます。 ト ー ク ンの文書を参照す る か、 ト ー ク ン のベン ダーに問い合わせ て、 その ト ー ク ンの暗号機能に関す る 情報を得て く だ さ い。 > engine=mscapi の場合には、 SHA-256 が利用可能か ど う かは Windows のバージ ョ ンに よ っ て決ま り ます。 Microsoft の文書に よ る と 、 Windows XP SP3 以上では利用可能なは ずです。 し か し 、 XP SP3 で SHA-256 が利用可能でない場合があ り ます。 SHA-256 が利用可能な場合には、 生成 さ れ る PDF 出力が以下の条件を満たす と き にのみ 用い ら れます : > PDF 入力バージ ョ ン、 要求 さ れてい る 操作、 お よ び compatibility に基づ き 決定 さ れ る PDF 出力バージ ョ ンが 1.6 以上。 > PDF/A-1 出力を生成 し てい る 。こ れは上記の PDF 1.6 規則に対す る 特別な例外であ り 、 PDF/A 文書の安全な電子署名を可能にす る も のです。 SHA-256 アルゴ リ ズ ムが入手可能でない場合、 ま たは生成 さ れ る PDF 出力が上に挙げた 条件を満た さ ない場合には、 SHA-1 アルゴ リ ズ ムがかわ り に用い ら れます。 MD5 アルゴ リ ズ ムは充分に安全ではない と 考え ら れ ますので、 PLOP DS が署名に こ れを用い る こ と は決 し て あ り ません。 PLOP DS の暗号化の制約 PLOP DS は現在の と こ ろ、 以下の署名関連の機能には対応 し てい ません : > Certified PDF : こ れは特殊な署名の一種で、 作成者が文書の有効性を保証 し 、 それを他 人が後か ら 変更で き る も のです。 > 増分ア ッ プデー ト と 、 1 個の文書に複数の署名。 > 署名の見た目 : 可視署名フ ィ ール ド で表示 さ れ る テ キ ス ト ま たは画像を指定す る こ と はで き ません。 > 電子署名の適用は、 線形化 と 組み合わせ る こ と はで き ません。 66 5 章 : PLOP DS に よ る電子署名 5.5 Acrobat で電子署名 を検証 PLOP DS は、Acrobat の文書化 さ れた仕様に従っ た標準的な PDF 署名を作成 し ます。PLOP DS で作成 さ れた電子書名は、 検証す る ためにサー ド パーテ ィ の ソ フ ト ウ ェ ア を一切必要 と せず、 Acrobat Standard/Professional 8 以上か Acrobat Reader 8 以上で検証で き ます。 標 準の Acrobat 署名に対応 し たサー ド パーテ ィ の PDF 署名検証 ソ フ ト ウ ェ アで も 、PLOP DS で作成 さ れた書名を検証す る こ と が可能です。 署名が有効なのは、 以下の条件がすべて真の と き です : > 文書が署名 さ れた後に変改を受けていない。 > 署名に用い ら れてい る 証明書が有効であ る 。 証明書は、 期限切れ (証明書の中の有効 期限に よ っ て) の場合や、 停止 さ れてい る 場合 (オ ン ラ イ ン での試験ま たは停止 リ ス ト と の照合が必要) には無効です。 > 証明書が既知の人ま たは組織に属す る か、 ま たは よ く 知 ら れた認証局に よ っ て発行 さ れてい る (後述)。 Acrobat で PDF 署名を検証す る には次の よ う に し ます。 「署名」 タ ブ を開いて (「表示」 → 「ナビゲーシ ョ ンパネル」 → 「署名 ...」)、 署名を右 ク リ ッ ク し 、 そ し て 「署名を検証」 を 選択 し ます。 す る と ダ イ ア ロ グボ ッ ク ス が現れ、 そ こ に Acrobat は、 署名の検証状態ア イ コ ン を、 その他の情報 と と も に表示 し ます。 Acrobat では、 個々の署名 と 、 文書の署名ス テー タ ス ご と に、 さ ま ざ ま な ア イ コ ン を用いてい ます : > チ ェ ッ ク マー ク は、 その署名が有効であ る こ と を示 し ます。 こ れはすなわち、 そ の署名者がすでに認証 さ れてお り 、 文書が変改を受けていない と い う こ と です。 > 赤い× は、 その署名が無効であ る こ と を示 し ます。 こ れはすなわち、 その署名者 の証明書を認証で き なか っ た (期限切れや停止 さ れてい る な ど) か、 あ る いは文書が 変改を受けた と い う こ と です。 > 三角形 は、 その署名者のア イ デン テ ィ テ ィ を認証で き なか っ たか、 あ る いは文書 が署名 さ れた後に変改を受けてい る ために、 その文書に問題があ る こ と を示 し ます。 Acrobat 8 では署名の状態を、可視署名の フ ィ ール ド 領域に も 表示 し ます。 し か し 、Acrobat 9/X では個々の フ ィ ール ド には署名状態ア イ コ ンは表示 さ れな く な っ てお り 、 署名パネル (ウ ィ ン ド ウ 上端付近) と 「署名」 タ ブ ( ウ ィ ン ド ウ 左側) に し か表示 さ れ ません。 こ の 動作は混在環境では混乱を招 き かねませんので、 レ ジ ス ト リ キー HKEY_CURRENT_USER\Software\Adobe\Adobe Acrobat\10.0\Security\cPubSec\iDisplayValidIcon を値 0 (数字のゼ ロ ) に設定すれば、 以前の動作 (すなわち、 検証状態ア イ コ ンが各フ ィ ー ル ド に表示 さ れ る ) に戻す こ と がで き ます。 こ れに よ っ て、 Acrobat 9/X の動作が Acrobat 8 と 同様に戻 り ます。 Adobe が提供 し てい る Acrobat セキ ュ リ テ ィ ド キ ュ メ ン テーシ ョ ン には、 Acrobat の レ ジ ス ト リ 設定について、 よ り 詳 し く 記 さ れてい ます。 署名者の証明書に対す る信頼 を確立 さ せ る 文書への署名に用い ら れた証明書が信頼に 足 る と 認め る べ き であ る と Acrobat が確信で き る のは、 次のいずれかの場合です : > Acrobat に証明書が内蔵 さ れてい る 認証局 (CA) が発行 し た証明書は、 つねに信頼に足 る と し て受け入れ ら れます。 ただ し 、 内蔵 CA は ソ フ ト ウ ェ ア証明書を発行 し ないの で、 それを PLOP DS で利用する こ と はで き ません。 > Windows証明書ス ト アに内蔵 さ れた CAのいずれか1つが発行 し た証明書。自分の組織外 のエン ド ユーザーに対 し ては こ れが推奨方式です。 詳 し く は後述 し ます。 5.5 Acrobat で電子署名を検証 67 > その証明書がWindows証明書ス ト アにあ る 。こ のためにはユーザーが手作業で署名者の 証明書を Windows 証明書ス ト アに追加す る 必要があ る ので、 一般には組織環境で し か 実用的ではあ り ません。 > Acrobat を自分で手作業で設定 し て、 個々の署名者の証明者を受け入れ る よ う に、 ま た はあ る 特定の CA に よ っ て署名 さ れた証明書をすべて受け入れ る よ う にす る 。 こ れは 組織環境で推奨 し ます。 そのために必要な手順は後述 し ます。 Acrobat が Windows 証明書ス ト ア にア ク セ ス で き る よ う にす る Acrobat が Windows 証明 書ス ト アにア ク セ スす る よ う 設定 さ れていれば、 証明書ス ト アに入っ てい る CA で作成 さ れたすべての署名を Acrobat で検証で き ます。 こ れは Windows にすでに内蔵 さ れてい る CA のいずれか 1 つで も (制御 さ れた組織環境の外にい る ユーザーに推奨)、 カ ス タ ム CA で も (自分自身の組織 CA を運営 し ていて、 それをすべてのユーザーの証明書ス ト アに設 定で き る 場合に適 し てい る ) 可能です。 管理コ ン ソ ールでは、 こ れ ら の よ く 知 ら れた CA 図 5.3 署名プ ロパテ ィ (左) と Acrobat の証明書ビ ュ ーア (下) 68 5 章 : PLOP DS に よ る電子署名 の証明書は、 「信頼 さ れたルー ト 証明機関」 ス ト アか、 ま たは 「サー ド パーテ ィ ルー ト 証 明機関」 で見つけ る こ と がで き ます。 Windows に内蔵の CA を活用す る には次の手順を踏みます。 Windows に内蔵の商用 CA のいずれか 1 つか ら デジ タ ル ID を取得 し ます。 内蔵 CA の一覧を見 る には次の よ う に し ます。 管理 コ ン ソ ールを起動 し 、 署名スナ ッ プ イ ンがあ る 状態で (「Windows 証明書ス ト ア を管理」 (61 ページ) 参照) 、 「信頼 さ れたルー ト 認証機関」 → 「証明書」 を開 き ます。 す る と 、 何ダース も の商用 CA の一覧が現れます。 こ の一覧か ら 証明書を選んで、 その名 前を ダブル ク リ ッ ク し ます。 「証明書」 ダ イ ア ロ グで 「詳細設定」 を選び、 項目 「サブジ ェ ク ト 」 へス ク ロ ール し て、 それを ダブル ク リ ッ ク し ます。 す る と 、 その CA に連絡を と る のに十分な情報 (電子 メ ールア ド レ ス等) が表示 さ れ る はずです。 こ れ ら の CA のいずれ か 1 つか ら デジ タ ル ID を取得 し 、 そ し てそれを使っ て PLOP DS で PDF 文書に署名を行 い ます。 カ ス タ ム CA を Windows ス ト アに知 ら せ る には、 その証明書を取得 し 、 それを ダブル ク リ ッ ク し て、 そ し て Windows 証明書ス ト アへそれを取 り 込みます。 上記の ど ち ら の場合において も 、 Acrobat が選択 さ れた CA (ま たは Windows 証明書ス ト ア内の任意の CA) に よ っ て発行 さ れたすべての証明書を確実に受け入れ る よ う に し て お く 必要があ り ます。 Acrobat 8/9/X では次の手順を踏みます (図 5.4 参照)。 「編集」 → 「環境設定」 → [ 「一般 ...」 ] → 「セキ ュ リ テ ィ 」 → 「詳細環境設定 ...」 → 「Windows 統 合」 。 そ し て現れ る ダ イ ア ロ グで、 「以下の操作に対 し ては、 Windows 証明書ス ト アのす べてのルー ト 証明書を信頼 し ます : 」 と 書かれた下の 「署名を検証」 チ ェ ッ ク ボ ッ ク ス を オンに し ます。 個々の証明書 を受け入れ る 個々の証明書を、 信頼済みア イ デン テ ィ テ ィ の一覧に追加 す る には、 以下のいずれかの方法を用い ます (詳 し く は Acrobat のヘルプ を参照 し て く だ さ い) : > 証明書を Windows 証明書ス ト アに追加:証明書フ ァ イ ルを ダブル ク リ ッ ク し ます。す る と 、 証明書 を イ ン ス ト ールす る た め の ウ ィ ザー ド が現れ ま す。 加 え て、 Acrobat を Windows 証明書ス ト アにア ク セ スす る よ う 設定す る 必要があ り ます (上述)。 図 5.4 Acrobat を、 Windows 証明書ス ト アへア ク セ スする よ う 設定 5.5 Acrobat で電子署名を検証 69 > 証明書をデ ィ ス ク フ ァ イ ルかデ ィ レ ク ト リ サーバか ら 取 り 込む : Acrobat X では こ れは次の手順でで き ます : 「ツール」 → 「電子署名」 → 「その他の電子署名」 → 「信頼済み証明書 ...」 → 「連絡先 を追加」 → 「参照 ...」 Acrobat 8/9 : 「ア ド バン ス ト 」 → 「信頼済み証明書の管理 ...」 → 「連絡先を追加」 → 「参照 ...」 →証明書を選択→ 「信頼を編集 ...」 を ク リ ッ ク → 「信頼」 タ ブへ移 り 、 「次 の対象について こ の証明書を信頼 し ます : 」 の中の 「署名、 および信頼 さ れたルー ト 」 チ ェ ッ ク ボ ッ ク ス を選択 し ます。 > 署名 さ れた PDF か ら 証明書を取 り 込む : Acrobat 9/X では こ れは次の手順でで き ます。 署名 さ れた PDF を開 き 、 「署名」 タ ブ を開 き (Acrobat X : 「表示」 → 「表示切 り 替え」 → 「ナビゲーシ ョ ンパネル」 → 「署名」 。 Acrobat 8/9 : 「表示」 → 「ナビゲーシ ョ ンパ ネル」 → 「署名」 ) 、 署名を右 ク リ ッ ク し て 「プ ロパテ ィ 」 ま たは 「署名のプ ロパテ ィ を表示 ...」 を選択 し ます。 す る と 、 「署名のプ ロパテ ィ 」 ダ イ ア ロ グが現れ ます。 「要 約」 タ ブで 「証明書を表示」 を ク リ ッ ク し 、 「詳細」 タ ブへ移っ て証明書の フ ィ ン ガー プ リ ン ト を調べます (MD5 ま たは SHA-1 ダ イ ジ ェ ス ト 。 ま たは両方)。 も し こ の フ ィ ン ガープ リ ン ト が、 署名者か ら 自分へ信頼す る に足 る 手段で別途 も た ら さ れた署名 と 合致す る な ら ば、 「信頼」 タ ブへ移 り 、 「信頼済み証明書に追加」 を ク リ ッ ク し て、 最 後に 「 この証明書を信頼済みのルー ト と し て使用」 (Acrobat 9/X) ま たは 「署名、 およ び信頼 さ れたルー ト 」 (Acrobat 8) にチ ェ ッ ク を入れます。 あ る CA か ら 発行 さ れた証明書 を すべて受け入れる こ の方式は、 多 く の別々の個人が 皆同 じ CA ( よ く あ る のは組織の CA) か ら 発行 さ れた証明書を使っ て署名 し た文書を扱 う 場合に推奨 し ます。 その CA の証明書を取得 し て、 個々の証明書 と 同 じ 上述のや り 方で Acrobat へ取 り 込みます。 あ る いは、 Actobat か ら Windows 証明書ス ト アへのア ク セ ス を 許すな ら 、 Windows へ取 り 込む こ と も で き ます。 す る と Acrobat は、 こ の CA か ら 発行 さ れ る 証明書で作成 さ れ る すべての署名を受け入れ る よ う にな り ます。 70 5 章 : PLOP DS に よ る電子署名 6 pCOS イ ン タ フ ェ ース pCOS (PDFlib Comprehensive Object Syntax) イ ン タ フ ェース は、 PDF 文書のあ ら ゆ る セ ク シ ョ ンか ら 、 ページ内容を記述 し ない任意の、 ページ寸法 ・ メ タ デー タ ・ イ ン タ ラ ク テ ィ ブ要素等の情報を取得す る ための、 シ ンプルでエ レ ガ ン ト な機能群を提供 し ます。 pCOS イ ン タ フ ェース の利用例 と 、 pCOS パス文法の説明は、 別文書であ る pCOS パ ス リ フ ァ レ ン ス に含ま れてい ます。 さ ら な る 作成例が pCOS ク ッ ク ブ ッ ク にあ り ます : www.pdflib.com/pcos-cookbook/ 71 72 6 章 : pCOS イ ン タ フ ェ ース 7 PLOP ・ PLOP DS ラ イ ブ ラ リ API リ フ ァ レンス 7.1 オ プ シ ョ ン リ ス ト オプシ ョ ン リ ス ト は、 PLOP の操作を制御す る 強力かつ簡単な方式です。 多 く の API メ ソ ッ ド は、 大量の関数引数を必要 と す る のでな く 、 オプシ ョ ン リ ス ト (略 し て optlist) に 対応 し てい ま す。 こ れは、 任意の数のオプ シ ョ ン を含む こ と ので き る 文字列です。 オプ シ ョ ン リ ス ト は さ ま ざ ま なデー タ 型や、 配列の よ う な複合デー タ に対応 し てい ます。 多 く の言語においてオプシ ョ ン リ ス ト は、 必要な キーワ ー ド と 値を連結する こ と に よ っ て、 簡 単に組み立て る こ と がで き ます。 C プ ロ グ ラ マはオプシ ョ ン リ ス ト を組み立て る ために、 sprintf( ) 関数を使いたい と こ ろで し ょ う 。 1 個のオプシ ョ ン リ ス ト は、 次の形の対を 1 つ ない し 複数含みます。 名前 値(複数可) 名前 と 値の間、 お よ び複数の名前 / 値対ど う し の間は、 任意の空白類文字 (スペース ・ タ ブ ・ キ ャ リ ッ ジ リ タ ーン ・ ニ ュ ー ラ イ ン) で区切 る こ と がで き ます。 値は、 複数の値の リ ス ト か ら 成 る 場合 も あ り ます。 ま た、 名前 と 値の間は等号 「=」 で結ぶ こ と も で き ます : 名前=値 単純値 単純値は、 以下のデー タ 型のいずれか を用い る こ と がで き ます : > 論理値:true ま たは false。論理値のオプシ ョ ンで値が省略 さ れた と き は、値 true と 見な さ れます。 略記 と し て、 名前 false のかわ り に no 名前を用い る こ と も 可能です。 > 文字列 : 空白類文字ま たは 「=」 キ ャ ラ ク タ を含む文字列は、 { と } でか こ む必要があ り ます。 空文字列は {} で作れます。 キ ャ ラ ク タ { ・ } ・ \ は、 文字列の中身 と し たいな ら 、 前に \ キ ャ ラ ク タ を付け る 必要があ り ます。 > テ キ ス ト 文字列 : い く つかのオプシ ョ ン で用い ら れ る 特殊な文字列です。 文字列型の オプシ ョ ンの多 く は ASCII 値 し か受け入れ る こ と がで き ませんが、 テ キ ス ト 文字列は ASCII 以外に Unicode 値 も 保持す る こ と が可能です。 Unicode 対応の言語バ イ ンデ ィ ン グでは、単に任意の Unicode 値を そ う し たオプシ ョ ンに与え る こ と がで き ます。Unicode 非対応の言語バ イ ンデ ィ ン グでは、 文字列を UTF-8 と し て (i5/iSeries と zSeries では EBCDIC UTF-8 と し て) 解釈す る べ き な ら 、 ユーザーはテ キ ス ト 文字列の頭に UTF-8 BOM を付け る 必要があ り ます。 UTF-8 BOM がない と き は、 テ キ ス ト 文字列は auto エ ン コ ーデ ィ ン グで、 すなわち Windows の場合はカ レ ン ト コ ー ド ページ、 i5/iSeries の場 合はカ レ ン ト ジ ョ ブのエン コ ーデ ィ ン グ、 zSeries の場合は ebcdic、 Unix ・ Mac OS X の 場合は iso8859-1 で解釈 さ れます。 > キー ワー ド : 固定 さ れた キー ワー ド の定義済み リ ス ト の う ちの 1 つ > 浮動小数点値 ・ 整数 : 10 進の浮動小数点値ま たは整数。 小数点 と し ては点 と カ ン マが 使え ます。 > ハン ド ル : い く つかの内部オブジ ェ ク ト ハン ド ル、 た と えば文書やページのハン ド ル。 実際には こ れ ら は整数値です。 型に よ っ て、 ま た オプシ ョ ン の解釈に よ っ ては、 さ ら な る 制約が課 さ れ る 場合が あ り ま す。 た と えば、 整数や動小数点値は特定の値範囲に制限 さ れ る か も し れません し 、 ハン ド 7.1 オプ シ ョ ン リ ス ト 73 ルはそのオブジ ェ ク ト の種別に対 し て有効でなければな ら ない等です。オプシ ョ ンに対す る 制約条件は、 それぞれの関数の説明に記 し て あ り ます。 単純値のい く つかの例 (1 行目 は空白キ ャ ラ ク タ を含む文字列の例です) : password={secret string} linearize=true リ ス ト 値 リ ス ト 値は複数の値か ら 成 り 、それ ら の値は単純値かあ る いは ま た リ ス ト 値か も し れません。 リ ス ト は { と } でか こ まれます。 リ ス ト 値の例 : permissions={ noprint nocopy } 注記 バ ッ ク ス ラ ッ シ ュ \ キ ャ ラ ク タ は、 多 く のプ ログ ラ ミ ング言語において、 特殊な取 り 扱い が必要です。 74 7 章 : PLOP ・ PLOP DS ラ イ ブ ラ リ API リ フ ァ レ ン ス 7.2 一般関数 C PLOP * PLOP_new(void) 新規の PLOP コ ン テキス ト を作成 し ます。 戻り値 新規 コ ン テ キ ス ト へのハン ド ル、 ま たは十分な メ モ リ が得 ら れない場合は NULL。 コ ン テ キ ス ト は、 他のすべての API 関数に与え る 必要があ り ます。 バインディング オブジ ェ ク ト 志向言語では、新規 PLOP オブジ ェ ク ト が作成 さ れた と き には自動的に呼び 出 さ れ る ので、 得 ら れません。 Java void delete( ) C# void Dispose( ) C void PLOP_delete(PLOP *plop) PLOP コ ン テキス ト を削除 し 、 その内部 リ ソ ース をすべて解放 し ます。 詳細 コ ン テ キ ス ト 内のすべての開いてい る 文書は自動的に閉 じ ら れます。 し か し 、 文書が必要 な く な っ た時点で PLOP_close_document( ) でそれを閉 じ てお く のは良いプ ロ グ ラ ミ ン グ習 慣です。 バインディング C の場合、 こ の関数は PLOP_TRY( )/PLOP_CATCH( ) 節の中で呼び出 し てはいけ ません。 Java の場合、 こ の メ ソ ッ ド は PLOP の フ ァ イ ナ ラ イ ザ メ ソ ッ ド に よ っ て呼び出 さ れま す。 し か し 、 明示的に delete( ) を呼び出 し て適切な ク リ ーン ア ッ プ を行わせ る こ と を強 く 推奨 し ます。 例外が起 き た と き に も こ れは然 り です。 Perl ・ PHP ・ COM の場合、 こ の関数は PLOP オブジ ェ ク ト が破壊 さ れた と き に自動的 に呼び出 さ れます。 .NET の 場合、 非 マ ネ ー ジ の リ ソ ー ス を ク リ ー ン ア ッ プ す る た め に 処理 の 最後 で Dispose( ) を呼び出すべ き です。 C++ void create_pvf(string filename, const void *data, size_t size, string optlist) C# Java void create_pvf(String filename, byte[ ] data, String optlist) Perl PHP create_pvf(string filename, string data, string optlist) VB Sub create_pvf(filename As String, data, optlist As String) C void PLOP_create_pvf(PLOP *plop, const char *filename, int len, const void *data, size_t size, const char *optlist) メ モ リ 上で与え られたデー タ か ら、名前付きの仮想の読み取 り 専用のフ ァ イルを作成 し ま す。 filename (名前文字列) 仮想フ ァ イ ルの名前。 こ れは任意の文字列であ り 、 以後、 他の PLOP 読み出 し の中で こ の仮想フ ァ イ ルを参照す る ために用い る こ と がで き ます。 len (C 言語バ イ ンデ ィ ン グのみ) filename の UTF-16 文字列に対す る 長 さ (バ イ ト 単 位)。 len=0 の場合、 ヌ ル終端文字列を与え る 必要があ り ます。 7.2 一般関数 75 data 仮想フ ァ イ ルに し たいデー タ への参照。 COM の場合、 こ れは仮想フ ァ イ ルを構成 す る デー タ があ る バ イ ト のバ リ ア ン ト 型です。 C ・ C++ の場合、 こ れは メ モ リ 位置へのポ イ ン タ です。 Java の場合、 こ れはバ イ ト 配列です。 Perl ・ PHP の場合、 こ れは文字列です。 size (C・C++ のみ) デー タ を含む メ モ リ ブ ロ ッ ク のデー タ 長をバ イ ト 単位で表 し た も の。 optlist 詳細 表 7.1 に従っ たオプシ ョ ン リ ス ト 。 次のオプシ ョ ンが使え ます : copy。 こ の関数は、 繰 り 返 し 使用 さ れ る 電子 ID や XMP メ タ デー タ のために有用で し ょ う 。 仮想 フ ァ イ ルは、 入力フ ァ イ ルを用い る あ ら ゆ る API 関数に与え る こ と がで き ます。 こ こ う し た関数のなかには、デー タ が必要な く な る ま で仮想フ ァ イ ルに ロ ッ ク を かけ る も の も あ り ます。 仮想フ ァ イ ルは、 PLOP_delete_pvf( ) で明示的に、 ま たは PLOP_delete( ) で自動的に 削除 さ れ る ま で メ モ リ 上に保持 さ れます。 PLOP オブジ ェ ク ト はそれぞれ、 独自の PVF フ ァ イ ルの集合を保持 し ます。 仮想フ ァ イ ルは、 異な る PLOP オブジ ェ ク ト 間で共有す る こ と はで き ません。 別々の PLOP オブ ジ ェ ク ト を使用 し てい る マルチ ス レ ッ ド は、 PVF の使用を同期す る 必要はあ り ま せん。 filename が既存の仮想フ ァ イ ルを参照 し てい る と き は、 例外が発生 し ます。 こ の関数は、 filename がデ ィ ス ク 上の通常の フ ァ イ ルですでに使用 さ れてい る か ど う かはチ ェ ッ ク し ません。 copy オプシ ョ ン を与え ていない限 り 、対にな る PLOP_delete_pvf( ) への呼び出 し が成功 す る ま では、 与え たデー タ を呼び出 し 側で変更 し た り 解放 (削除) し た り し てはいけ ませ ん。 こ のルールに従わない と 、 ク ラ ッ シ ュ する 可能性が高いです。 表 7.1 PLOP_create_pvf( ) に対するオプ シ ョ ン一覧 オプ シ ョ ン 説明 copy (論理値) PLOP は、 与え られたデー タ の内部コ ピーを ただ ちに作 り ます。 こ の場合、 与えたデー タ を こ の呼び出 し の直後に呼び出 し 側で捨てて もかまいません。 COM ・ .NET ・ Java バイ ンデ ィ ン グの場合、 copy オプ シ ョ ンは自動的に true に設定 さ れます (それ以外のバイ ンデ ィ ングでのデ フ ォル ト : false)。 それ以外の言語バイ ンデ ィ ングでは、 copy オプ シ ョ ン を与えなければデー タ は コ ピー さ れません。 C++ int delete_pvf(string filename) C# Java int delete_pvf(String filename) Perl PHP int delete_pvf(string filename) VB Function delete_pvf(filename As String) As Long C int PLOP_delete_pvf(PLOP *plop, const char *filename, int len) 名前付きの仮想 フ ァ イルを削除 し 、 そのデー タ 構造を解放 し ます (ただ し 内容は解放 し ま せん)。 filename (名前文字列) PLOP_create_pvf( ) に与えたの と 同 じ 、 仮想フ ァ イ ルの名前。 len (C 言語バ イ ンデ ィ ン グのみ) filename の UTF-16 文字列に対す る 長 さ (バ イ ト 単 位)。 len=0 の場合、 ヌ ル終端文字列を与え る 必要があ り ます。 戻り値 対応す る 仮想フ ァ イ ルが存在 し てい る が ロ ッ ク さ れてい る と き は -1 (PHP では 0)、 それ 以外の と き は 1。 詳細 76 フ ァ イ ルが ロ ッ ク さ れていなければ、 PLOP はただちに、 filename に関連付け ら れていた デー タ 構造を削除 し ます。 filename が有効な仮想フ ァ イ ルを参照 し ていない と き は、 こ の 7 章 : PLOP ・ PLOP DS ラ イ ブ ラ リ API リ フ ァ レ ン ス 関数は無言の ま ま何 も し ません。 こ の関数への呼び出 し が成功 し た後は、 filename は再利 用す る こ と も で き ます。すべての仮想フ ァ イ ルは PLOP_delete( ) で自動的に削除 さ れます。 具体的な動作は、 対応す る PLOP_create_pvf( ) を呼び出 し た と き に copy オプシ ョ ン を 与え ていたか ど う かで異な り ます。 すなわち、 copy オプシ ョ ン を与え ていた場合は、 フ ァ イ ルの管理デー タ 構造 も フ ァ イ ル内容自体 (デー タ ) も 両方解放 さ れ ま すが、 そ う で な か っ た場合は内容は、 ク ラ イ ア ン ト 側で解放 さ れ る も の と 思われ ま すので解放 さ れ ま せ ん。 C++ double info_pvf(string filename, string keyword) C# Java double info_pvf(String filename, String keyword) Perl PHP float info_pvf(string filename, string keyword) VB Function info_pvf(filename As String, keyword As String) As Double C double PLOP_info_pvf(PDF *p, const char *filename, int len, const char *keyword) 仮想フ ァ イルか PDFlib 仮想フ ァ イルシス テム (PVF) の諸特性を取得 し ます。 filename (名前文字列) 仮想フ ァ イ ルの名前。 keyword=filecount の と き は、 filename は 空にす る こ と がで き ます。 len (C 言語バ イ ンデ ィ ン グのみ) filename の UTF-16 文字列に対す る 長 さ (バ イ ト 単 位)。 len=0 の場合、 ヌ ル終端文字列を与え る 必要があ り ます。 keyword 表 7.2 に従っ た キー ワー ド 。 表 7.2 PLOP_info_pvf( ) に対するキーワー ド 一覧 キーワー ド 説明 filecount カ レ ン ト PLOP オブ ジ ェ ク ト のために保持 さ れている PDFlib 仮想フ ァ イルシ ス テムの中のフ ァ イ ルの総数。 filename 引数は無視 さ れます。 exists そのフ ァ イルが PDFlib 仮想フ ァ イルシ ス テム内に存在する な ら (かつ削除 さ れていないな ら) 1、 し ないな ら 0 size (存在 し ている仮想 フ ァ イルに対 し てのみ) 指定 し た仮想 フ ァ イルのサイ ズをバイ ト 単位で。 iscopy (存在 し ている仮想 フ ァ イルに対 し てのみ) 指定 し た仮想 フ ァ イルが作成 さ れた際に copy オプ シ ョ ンが与え ら れたな ら 1、 そ う でないな ら 0。 lockcount (存在 し ている仮想 フ ァ イルに対 し てのみ) 指定 し た仮想 フ ァ イルに対 し て PLOP 関数群に よ っ て 内部的に設定 さ れた ロ ッ クの数。 ロ ッ ク カ ウン ト が 0 の と き にのみ フ ァ イルは削除で き ます。 詳細 こ の関数は、 仮想フ ァ イ ルか PDFlib 仮想フ ァ イ ルシ ス テ ム (PVF) の さ ま ざ ま な特性を返 し ます。 特性はキー ワー ド で指定 さ れます。 7.2 一般関数 77 7.3 文書入力 ・ 出力関数 注記 PLOP では現状、 1 個の PLOP オブ ジ ェ ク ト の中で同時に複数の文書を処理する こ と には 対応 し ていません。1 個の文書を PLOP_open_document*( ) 関数の う ちのいずれかで開いた 後に、 他の文書を開き たい場合は、 まず前者を閉 じ る必要があ り ます。 C++ int open_document(string filename, string optlist) C# Java int open_document(String filename, String optlist) Perl PHP int open_document(string filename, string optlist) VB Function open_document(filename As String, optlist As String) As Long C int PLOP_open_document(PLOP *plop, const char *filename, int len, const char *optlist) PDF 文書 (保護 さ れているか も し れない) を処理する ために開き ます。 filename (名前文字列。ただ し Unicode フ ァ イ ル名に対応 し てい る のは Windows 上のみ) 開 き たい PDF フ ァ イ ルの フルパ ス名。 Windows の場合、 必要な権限があれば (ASP で動 作 し てい る 場合はないか も し れない)、 UNC パ ス ま たは割 り 当て ら れたネ ッ ト ワー ク ド ラ イ ブ も 使え ます。 Unicode 非対応の言語バ イ ンデ ィ ン グの場合、 len=0 の フ ァ イ ル名はカ レ ン ト シ ス テ ム コ ー ド ページで解釈 さ れますが、 ただ し UTF-8 BOM が頭についてい る と き は、 UTF-8 ま たは EBCDIC UTF-8 と し て解釈 さ れます。 len (C 言語バ イ ンデ ィ ン グのみ) filename の UTF-16 文字列に対す る 長 さ (バ イ ト 単 位)。 len=0 の場合、 ヌ ル終端文字列を与え る 必要があ り ます。 optlist 表 7.3 に従っ たオプシ ョ ン リ ス ト (7.1 節 「オプシ ョ ン リ ス ト 」 (73 ページ) 参照)。 戻り値 エ ラ ーの場合は -1 (PHP では 0) 、 そ う でないな ら 文書ハン ド ル。 エ ラ ーの後は、 PLOP_get_errmsg( ) を呼び出 し て、そのエ ラ ーについて よ り 詳 し く 知 る こ と を推奨 し ます。 詳細 文書 が 暗号化 さ れ て い る 場合は、 そ の ユ ーザーパ ス ワ ー ド か マ ス タ ーパ ス ワ ー ド を password オプシ ョ ンで与え る 必要があ り ます。 ただ し 、 requiredmode オプシ ョ ンが指定 さ れてい る 場合は こ の限 り ではあ り ません。 表 7.3 PLOP_open_document*( ) に対する オプ シ ョ ン一覧 オプ シ ョ ン 説明 inmemory (論理値。 PLOP_open_document( ) のみ) true の場合、 PLOP は フ ァ イル全体を メ モ リ 内に読み込ん で、 そ こ でそれを処理 し ます。 こ れはシ ス テムによ っ ては (特に MVS) 非常なパフ ォ ーマ ン ス向 上につなが り ますが、 かわ り に メ モ リ を食います。 false の場合、 文書の部分部分が必要に応 じ て 都度都度デ ィ ス クか ら読まれます。 デ フ ォ ル ト : false password (文字列。 暗号化 さ れた文書に対 し ては、 requiredmode がある場合以外は必須) 文書のユーザーパ スワー ド かマス タ ーパスワー ド 。 表 4.2 (53 ページ) で述べた よ う に、 文書にどの操作を し たいか によ っ て、 その文書のユーザーパスワー ド が必要か、 マ ス タ ーパスワー ド が必要か、 それ と もパ スワー ド が必要ないかが決ま り ます。 EBCDIC プ ラ ッ ト フ ォ ームではパスワー ド は ebcdic エ ン コ ー デ ィ ン グか EBCDIC-UTF-8 で与え る必要があ り ます。 78 7 章 : PLOP ・ PLOP DS ラ イ ブ ラ リ API リ フ ァ レ ン ス 表 7.3 PLOP_open_document*( ) に対する オプ シ ョ ン一覧 オプ シ ョ ン 説明 repair (キーワー ド ) 破損 し た PDF 入力文書を ど う 扱 う かを指定 し ます。 文書を修復する と 通常の処理よ り 時間がかか り ますが、 あ る種の破損 PDF の処理がで き る よ う にな る可能性があ り ます。 ただ し 文書に よ っ ては、 修復で き ないほど破損 し ている こ と も あ り え ます (デ フ ォ ル ト : auto) : force 文書に問題があ ろ う と なかろ う と 、 無条件で文書の修復を試みます。 auto PDF を開 く 際に問題が検出 さ れた場合のみ文書を修復 し ます。 none 文書を修復する試みは行われません。 PDF 内に問題があ っ た場合は、 関数呼び出 し は失 敗 し ます。 requiredmode (キーワー ド ) 文書を開 く 際に受け入れ可能な最低限の pCOS モー ド (minimum/restricted/full)。 求めた pCOS モー ド よ り 結果の pCOS モー ド が低か っ た と きは、 呼び出 し は失敗 し ます。 呼び出 し が成功 し た場合、 結果の pCOS モー ド は少な く と も こ のオプ シ ョ ン で指定 し た も のであ る こ と が保証 さ れます。 ただ し 、 それよ り 高い可能性 も あ り ます。 た と えば、 暗号化 さ れていない文書 に対 し て requiredmode=minimum を指定 し た場合、 結果は full モー ド にな り ます。 デ フ ォ ル ト : full xmppolicy (キーワー ド ) 入力文書内の無効な文書レ ベル XMP の扱い を制御 し ます。 無効な XMP は、 標準識 別子を見つける こ と がで き ない こ と を暗黙に前提 し ますので、 た と えば PDF/A 文書がそれ と し て 扱われません。 使え るキーワー ド (デ フ ォ ル ト : rejectinvalid) : rejectinvalid 無効な XMP の場合には、 XML 解析エ ラ ー メ ッ セージ を含む例外を発生 さ せ、 処理を停 止 さ せます。 ignoreinvalid (sacrifice={pdfa1 pdfx} を暗黙に前提 し ます) 無効を、 XMP が存在 し ないかのよ う に扱い ます。 出力 XMP は、 文書情報項目に基づ き生成 さ れます。 また、 XML 解析エ ラ ー メ ッ セージ を <pdfx:invalid_source_XMP_exception> 要素内に入れ込みます。 remove 入力 XMP を、 有効であ っ て も な く て も無条件に無視 し ます。 出力 XMP は一から 生成 さ れます。 こ れは、 望ま し く ない メ タ デー タ を削除するのに有用で し ょ う 。 ただ し こ の場 合 も、 標準識別子 (PDF/A な どの) は入力 XMP から 読み込まれて出力へ複製 さ れま す。 C++ int open_document_callback(void *opaque, size_t filesize, size_t (*readproc)(void *opaque, void *buffer, size_t size), int (*seekproc)(void *opaque, long offset), const char *optlist) C int PLOP_open_document_callback(PLOP *plop, void *opaque, size_t filesize, size_t (*readproc)(void *opaque, void *buffer, size_t size), int (*seekproc)(void *opaque, long offset), const char *optlist) PDF 文書を (保護 さ れているかも し れない)、 ユーザーが与えた関数で開き ます。 opaque 何 ら かの不透明なデー タ 構造へのポ イ ン タ 。 readproc へ渡 さ れます。 PLOP は こ のポ イ ン タ やその背後のデー タ を使い ません。 filesize readproc 文書の長 さ をバ イ ト 単位で。 メ モ リ 位置 buffer にあ る 文書の任意の size バ イ ト の切れ端を与え る こ と ので き なければな ら ないプ ロ シージ ャ 。 こ のプ ロ シージ ャ は、 取得 し たバ イ ト 数を返 さ なければ な り ません。 seekproc 文書内の位置 offset へシー ク す る ためのプ ロ シージ ャ 。 こ のプ ロ シージ ャ はエ ラ ーが起 き た ら -1 を、 そ う でないな ら 0 を返 さ なければな り ません。 optlist 表 7.3 に従っ たオプシ ョ ン リ ス ト (7.1 節 「オプシ ョ ン リ ス ト 」 (73 ページ) 参照)。 7.3 文書入力 ・ 出力関数 79 戻り値 エ ラ ーの場合は -1 (PHP では 0) 、 そ う でないな ら 文書ハン ド ル。 エ ラ ーの後は、 PLOP_get_errmsg( ) を呼び出 し て、そのエ ラ ーについて よ り 詳 し く 知 る こ と を推奨 し ます。 バインディング C ・ C++ 言語バ イ ンデ ィ ン グでのみ利用可能です。 C++ int create_file(string filename, string optlist) C# Java int create_file(String filename, String optlist) Perl PHP int create_file(string filename, string optlist) VB Function create_file(filename As String, optlist As String) As Long C int PLOP_create_file(PLOP *plop, const char *filename, int len, const char *optlist) PDF 出力文書 (保護 さ れているか も し れない) を、 メ モ リ 内またはデ ィ ス ク フ ァ イル上に 作成 し ます。 filename (名前文字列。ただ し Unicode フ ァ イ ル名に対応 し てい る のは Windows 上のみ) 生成 し たい出力フ ァ イ ルの名前。 PLOP_open_document( ) に与えた入力フ ァ イ ル名 と は異 な っ てい る 必要があ り ま す。 こ れが空文字列の と き は出力は メ モ リ 内に生成 さ れ、 後で PLOP_get_buffer( ) で取 り 出せます。 MVS シ ス テ ムの場合、 空文字列は linearize オプシ ョ ン と 組み合わせては使え ません。 Unicode 非対応の言語バ イ ンデ ィ ン グの場合、 len = 0 の フ ァ イ ル名はカ レ ン ト シ ス テ ム コ ー ド ページで解釈 さ れますが、 ただ し UTF-8 BOM が頭についてい る と き は、 UTF-8 ま たは EBCDIC UTF-8 と し て解釈 さ れます。 len (C 言語バ イ ンデ ィ ン グのみ) filename の UTF-16 文字列に対す る 長 さ (バ イ ト 単 位)。 len=0 の場合、 ヌ ル終端文字列を与え る 必要があ り ます。 optlist 表 7.4 に従っ たオプシ ョ ン リ ス ト (7.1 節 「オプシ ョ ン リ ス ト 」 (73 ページ) 参照)。 戻り値 エ ラ ーの場合は -1 (PHP では 0) 、 そ う でないな ら 文書ハン ド ル。 エ ラ ーの後は、 PLOP_get_errmsg( ) を呼び出 し て、そのエ ラ ーについて よ り 詳 し く 知 る こ と を推奨 し ます。 詳細 80 こ の関数を呼び出す前には、PLOP_open_document*( ) 関数のいずれかが呼び出 さ れてい る 必要があ り ます。 も っ と も 最近の こ れ ら の関数のいずれかへの呼び出 し で開かれた文書が 処理 さ れます。ユーザーパ ス ワー ド と マ ス タ ーパ ス ワー ド について強い ら れ る 制約条件に ついては 4.2 節 「PLOP の PDF セキ ュ リ テ ィ 機能」 (53 ページ) を参照 し て く だ さ い。 userpassword ・ masterpassword ・ permissions のいずれかのオプシ ョ ンが与え ら れてい る と き は、 文書は暗号化 さ れます。 暗号化アルゴ リ ズ ムは、 入力文書の PDF バージ ョ ン と compatibility オプシ ョ ンに基づ き 選ばれます (「暗号化アルゴ リ ズ ム と キー長」 (53 ペー ジ) を参照)。 7 章 : PLOP ・ PLOP DS ラ イ ブ ラ リ API リ フ ァ レ ン ス 表 7.4 PLOP_create_file( ) に対する オプ シ ョ ン一覧 オプ シ ョ ン 説明 compatibility (キーワー ド ) 生成 さ れる PDF 出力文書の PDF バージ ョ ン を指定 し ます : 1.4 PDF 1.4。 Acrobat 5 以上を必要 と し ます。 1.5 PDF 1.5。 Acrobat 6 以上を必要 と し ます。 1.6 PDF 1.6。 Acrobat 7 以上を必要 と し ます。 1.7 PDF 1.7。 ISO 32000-1 で仕様化 さ れてお り 、 Acrobat 8 以上を必要 と し ます。 1.7ext3 PDF 1.7 拡張レ ベル 3。 Acrobat 9 以上を必要 と し ます。 1.7ext8 PDF 1.7 拡張レ ベル 8。 Acrobat X を必要 と し ます。 2.0 PDF 2.0。 ISO 32000-2 で仕様化 さ れています。 出力を暗号化する場合は、 こ れを用いて、 適切な暗号化アルゴ リ ズムが選択 さ れます。 選択 さ れ た PDF バージ ョ ンが対応 し ている可能な限 り 強い暗号化アルゴ リ ズムが用い られます (AES 暗号 化を強いるには 1.6 を用います)。 選択 し た PDF バージ ョ ンは、 他のオプ シ ョ ンに よ っ て、 以下の 規則に従 っ て自動的に押 し 上げ られる場合があ り ます : > 文書に電子的に署名する と (sign オプ シ ョ ン)、 バージ ョ ンは PDF 1.3 へ押 し 上げ ら れます。 > 暗号化、 すなわち userpassword ・ masterpassword ・ permissions オプ シ ョ ンの う ちのいずれかを指 定する と 、 バージ ョ ンは PDF 1.4 へ押 し 上げ られます。 > XMP メ タ デー タ を挿入する と (metadata オプ シ ョ ン)、 バージ ョ ンは PDF 1.4 へ押 し 上げ ら れま す。 > permissions オプ シ ョ ン で plainmetadata キーワー ド を指定する と 、バージ ョ ンは PDF 1.5 へ押 し 上 げ られます。 デ フ ォル ト : 入力文書の PDF バージ ョ ン、 または上述の規則によ っ て強制 さ れる上位バージ ョ ン。 docinfo (テキス ト 文字列の対の リ ス ト ) 出力文書の文書情報項目群を設定 し ます。 文書に文書 XMP メ タ デー タ がある場合は、 与えた文書情報項目は XMP へ も ミ ラ ー さ れます。 それぞれの対には、 項目 の名前 と その値が入っ ています。 以下の定義済みキー と カ ス タ ムキーを与え る こ と がで き ます (デ フ ォル ト : 文書情報項目は入力文書から コ ピー さ れます) : Subject 文書のサブ タ イ ト ル Title 文書の タ イ ト ル Author 文書の作成者 Keywords 文書の内容を表すキーワー ド Trapped 文書に ト ラ ッ ピ ングが適用 さ れているかど う かを示 し ます。 許 さ れる値は True ・ False ・ Unknown です。 PDF/X 入力の場合、 sacrifice に pdfx があ る な ら、 Unknown のみが許 さ れます。 Creator ・ CreationDate ・ Producer ・ ModDate ・ GTS_PDFXVersion ・ GTS_PDFXConformance ・ ISO_PDFEVersion 以外の任意の名前 ユーザー定義の フ ィ ール ド 名 (スペースキ ャ ラ ク タ を含んでいてはいけません)。 PLOP は任意の数のフ ィ ール ド に対応 し ています。 1 個のカ ス タ ム フ ィ ール ド 名は 1 度だけ与 え る必要があ り ます。 flush (キーワー ド ) 放出方針を設定 し ます。 こ れは メ モ リ 内生成 (すなわち空の filename) に対 し ての み有効であ り 、 PLOP_get_buffer( ) に よ っ て返 さ れるデー タ の量を決定 し ます。 linearize オプ シ ョ ンが true の と きは、 放出方針は none にする必要があ り ます (デ フ ォ ル ト : none) : none 返 さ れるバ ッ フ ァ は、 出力文書を構成するすべてのデー タ を含んでいる こ と が保証 さ れ ます。 content PLOP_get_buffer( ) は、 PDF 内容デー タ の比較的大き なかた ま り (具体的には 1 個の PDF ス ト リ ームオブ ジ ェ ク ト ) が処理 さ れる たびご と に停止 し 、 返 さ れるバ ッ フ ァ には 出力文書の部分部分 し か入っ ていません。 heavy PLOP_get_buffer( ) は比較的小 さ な分量ずつを処理 し 、 し たがっ て比較的ひんぱんに呼び 出 さ れます。 linearize ( 論理値。 sign ま たは linearize と と も に使 う こ と はで き ません) true の場合、 出力文書は線形化 さ れます。 MVS シ ス テムの場合、 こ のオプ シ ョ ンは メ モ リ 内生成 (すなわち空の filename) と 組み 合わせる こ と はで き ません。 デ フ ォ ル ト : false 7.3 文書入力 ・ 出力関数 81 表 7.4 PLOP_create_file( ) に対する オプ シ ョ ン一覧 オプ シ ョ ン 説明 master- (文字列) 文書のマ ス タ ーパスワー ド 。 これが空の場合、 マ ス タ ーパスワー ド は適用 さ れません。 EBCDIC プ ラ ッ ト フ ォ ームの場合、 パスワー ド は ebcdic エ ン コ ーデ ィ ングか EBCDIC-UTF-8 で与 え る必要があ り ます。 デ フ ォ ル ト : 空 password1 metadata (オプ シ ョ ン リ ス ト 。 linearize と 組み合わせる こ と は不可) 文書の XMP メ タ デー タ を与え ます。 PDF/A-1 ・ PDF/X 識別項目は、 こ の与え る XMP の中では許 さ れません。 こ のオプ シ ョ ン リ ス ト に は以下のオプ シ ョ ン を含む こ と がで き ます : filename (名前文字列。 必須) 妥当な XMP メ タ デー タ を UTF-8 形式で含む フ ァ イルの名前。 validate (キーワー ド ) XMP メ タ デー タ はキーワー ド に よ っ て検証 さ れます : none 検証な し xmp2004 XMP 2004 仕様に従っ て検証 pdfa1 xmp2004 と 同様ですが、 それに加え て定義済みプ ロパテ ィ と スキーマの試 験 と 、 PDF/A に従っ て拡張スキーマの検証も行います。 デ フ ォル ト : none。 ただ し 入力が PDF/A-1 に準拠 し ていてかつ sacrifice オプ シ ョ ンに pdfa1 が含まれていない場合は pdfa1 が強制 さ れます。 optimize (キーワー ド ) 文書を処理する際に適用 し たい最適化処置 (デ フ ォル ト : sign オプ シ ョ ンが与え ら れている場合は none、 そ う で ないな ら all) : all 実装 さ れているすべての最適化を適用。 none 最適化を一切適用 し ない。 こ れは若干速度を向上 さ せますが、 そのかわ り フ ァ イルサイ ズは大き く な り ます。 permissions (キーワー ド リ ス ト 。 masterpassword が必要) 出力文書のア ク セ ス権限 リ ス ト 。 noprint ・ nomodify ・ nocopy ・ noannots ・ noassemble ・ noforms ・ noaccessible ・ nohiresprint ・ plainmetadata キーワー ド を任意の数含む こ と がで き ます (表 4.3 (54 ページ) 参照)。 デ フ ォル ト : 空 recordsize (整数。 MVS のみ) 出力 フ ァ イルのレ コ ー ド サイ ズ。 デ フ ォル ト : 0 (非ブ ロ ッ ク出力) sacrifice (キーワー ド の リ ス ト ) こ のオプ シ ョ ン を用いる と 、 入力 PDF の特性 と 求め ら れた操作 と が衝突 し た場合の動作を制御する こ と がで き ます。 デ フ ォ ル ト では PLOP は、 衝突を検出 し た と き には一 切出力を生成せず、 例外を発生 さ せます。 し か し 、 処理を許すために、 文書の何 らかの特質を放 棄 さ せる こ と が可能です。 表 7.5 に挙げるキーワー ド に対応 し ています : これ らは、 入力 ト リ ガ と 操作 ト リ ガが両方 と も真でない限 り 無視 さ れます (デ フ ォル ト : 空の リ ス ト 、 すなわち衝突が起 き た場合は例外が発生 し 、 出力は一切生成 さ れない) : sign (オプ シ ョ ン リ ス ト 。 linearize と 組み合わせて使 う こ と はで き ません。 PLOP DS でのみ利用可能) 生成文書に、 表 7.6 に挙げるサブオプ シ ョ ンに従っ て署名 し ます。 tempdirname (文字列) PLOP の内部処理に必要な一時フ ァ イルが作成 さ れるデ ィ レ ク ト リ の名前。 空の場合、 PLOP は一時フ ァ イルを カ レ ン ト デ ィ レ ク ト リ に生成 し ます。 こ のオプ シ ョ ンは、 tempfilename オプ シ ョ ンが与え ら れている と きは無視 さ れます。 デ フ ォル ト : 空 tempfilename (文字列。 MVS のみ) PLOP の内部処理に必要な一時フ ァ イルの フルフ ァ イル名。 空の場合、 PLOP は一意な一時 フ ァ イル名を生成 し ます。 PLOP_close_document( ) の後で こ の一時フ ァ イルを 削除するのはユーザー側の役割です。 こ のオプ シ ョ ン を与えた場合、 filename 引数は空に し てはい けません。 デ フ ォル ト : 空 user- (文字列。 masterpassword オプ シ ョ ンが必要) 文書のユーザーパスワー ド 。 こ れが空の場合、 ユー ザーパスワー ド は適用 さ れません。 EBCDIC プ ラ ッ ト フ ォ ームの場合、 パスワー ド は ebcdic エ ン コ ーデ ィ ングか EBCDIC-UTF-8 で与え る必要があ り ます。 デ フ ォ ル ト : 空 password1 1. Winansi エ ン コ ーデ ィ ン グ外のキ ャ ラ ク タ は、 PDF 1.7 拡張レ ベル 3 以上を生成する場合にのみ許 さ れます。 82 7 章 : PLOP ・ PLOP DS ラ イ ブ ラ リ API リ フ ァ レ ン ス 表 7.5 PLOP_create_file( ) の sacrifice オプ シ ョ ンに対するサブオプ シ ョ ン一覧 オプ シ ョ ン 説明 encrypted(入力 ト リ ガ : 文書が暗号化 さ れていないが、 暗号化 さ れた フ ァ イル添付を 1 個ない し 複数含んで attachments いる。 操作 ト リ ガ : 暗号化 さ れた フ ァ イル添付に対する適切なパスワー ド が password オプ シ ョ ン で与え ら れていない) こ のキーワー ド を与え る と 、 パスワー ド の得 られない暗号化 さ れた フ ァ イ ル添付は削除 さ れます。 fields (入力 ト リ ガ : 文書の中に、 NeedAppearances=true のフ ォ ーム フ ィ ール ド がある。 操作 ト リ ガ : sign オプ シ ョ ン) こ のキーワー ド を与え る と 、 既存のフ ォ ーム フ ィ ール ド は削除 さ れます (既存 の署名フ ィ ール ド があ る と きはそれ も)。 pdfa1 (入力 ト リ ガ : 文書が PDF/A-1a:2005 か PDF/A-1b:2005 に準拠 し ている。 操作 ト リ ガ : userpassword ・ masterpassword ・ permissions オプ シ ョ ンの う ちのいずれか) このキーワー ド を与 え る と 、 PDF/A-1 入力を暗号化する こ と がで き ますが、 PDF/A-1 準拠項目は削除 さ れます (すな わち、 出力は PDF/A-1 である と 標識 さ れな く な り ます)。 pdfx (入力 ト リ ガ : 文書が PDF/X-1a か PDF/X-3/4/5 に準拠 し ている。 操作 ト リ ガ : ページ上の署名矩 形を持つ sign オプ シ ョ ン、 または userpassword ・ masterpassword ・ permissions オプ シ ョ ンの う ち のいずれか) こ のキーワー ド を与え る と 、 暗号化や、 可視署名フ ィ ール ド を BleedBox (BleedBox が存在 し ない と きは TrimBox/ArtBox) 内に追加する こ と が許 さ れますが、 PDF/X 準拠項目は削除 さ れます (すなわち、 出力は PDF/X である と 標識 さ れな く な り ます)。 signatures (入力 ト リ ガ : 文書の中に 1 個ない し 複数の署名があ る。 操作は任意) こ のキーワー ド を与え る と 、 無効な署名の入っ た出力を作成する こ と を避ける ために、 既存の署名はク リ ア さ れます (す なわち、 署名の値は削除 さ れますが、 対応する フ ォ ーム フ ィ ール ド は削除 さ れません)。 7.3 文書入力 ・ 出力関数 83 表 7.6 PLOP_create_file( ) の sign オプ シ ョ ンに対するサブオプ シ ョ ン一覧 (PLOP DS でのみ利用可能) オプ シ ョ ン 説明 appearance (オプ シ ョ ン リ ス ト ) 署名を保持する フ ォ ーム フ ィ ール ド の視覚表現を指定 し ます : fieldname (テキス ト 文字列 : ピ リ オ ド 「.」 キ ャ ラ ク タ で終わ っ てはいけません) 署名フ ィ ール ド の名前。 文書の中に こ の名前の署名フ ィ ール ド がある場合は、 それが署名のために用い ら れ ( こ の場合 page ・ rect は無視 さ れます)、 そ う でないな ら フ ィ ール ド が作成 さ れま す。 この名前の フ ィ ール ド が存在 し ているけれど も、 種別が Signature でなかっ た場合 は、 例外が発生 し ます。 デ フ ォル ト : Signature1 page (整数) 署名 フ ィ ール ド (可視であ ろ う と 不可視であ ろ う と ) が作成 さ れるページの番 号。 最初のページの番号は 1。 デ フ ォ ル ト : 1 rect (矩形) 署名 フ ィ ール ド の左下隅 と 右上隅の座標を PDF 座標で表 し た も の (1 単位は 1/ 72 イ ン チ)。 デ フ ォ ル ト : {0 0 0 0}、 こ の値で不可視署名を作成 さ れます contactinfo (テキス ト 文字列) 受取側が署名を検証する ために署名者に連絡を と れる よ う にする ために署名者 によ っ て与え られる情報 (電話番号等) digitalid (オプ シ ョ ン リ ス ト 。 必須) 署名者のデジ タ ル ID (証明書 と 秘密鍵) を、 以下のサブオプ シ ョ ンの いずれか 1 つのみで指定 し ます : filename (文字列) PKCS#12 形式 (engine=builtin ま たは CE イ ン タ フ ェ ースの場合のみ) ま たは PFX 形式のデジ タ ル ID フ ァ イルの名前。 PKCS#12 ・ PFX フ ァ イルは、 仮想フ ァ イル と し て、 すなわち メ モ リ デー タ に PLOP_create_pvf( ) で フ ァ イル名を割 り 当てて、 与え る こ と も で き ます。 engine=pkcs#11 の場合は、 こ のオプ シ ョ ン には、 ス マー ト カ ー ド 等暗 号 ト ー ク ン用の PKCS#11 DLL/ 共有ラ イ ブ ラ リ の名前を与え ます。 certstore (オプ シ ョ ン リ ス ト 。 engine=mscapi の場合のみ) Windows の証明書ス ト アの中の ID を 指 し 示すためのオプ シ ョ ン : subject (文字列。 必須) 与えた文字列が 「サブ ジ ェ ク ト 」 項目の中にあ る ID を探 し ます。 それは通常、 デジ タ ル ID の 「共通名」 (CN) 項目を保持 し ています。 store (文字列) 証明書ス ト アの名前 (よ く あ る名前 : My ・ root ・ trust ・ CA)。 デ フ ォ ル ト : My keyusage (オプ シ ョ ン リ ス ト 。 engine=pkcs#11 の場合のみ) 複数の ID が (スマー ト カ ー ド 等に) 存在 し ている と き に タ ーゲ ッ ト ID を選ぶための基準。 キーワー ド はそれぞれ、 KeyUsage 認証拡張の中のビ ッ ト 1 個に対応 し ています。 各キーワー ド の値はそれぞれ、 ID を選ぶ と き にその拡張ビ ッ ト が 1 であ るべき (set)、 0 であ るべき (clear)、 あ るい は無視するべき (ignore) と い う こ と を指定 し ます。 PLOP DS は、 こ の指定 さ れた基準 に合 う ID を使用 し ます。 合 う ID が見つから なか っ た と きは例外が発生 し ます。 次の キーワー ド が使え ます : clear ・ ignore ・ set。 どの項目も デ フ ォ ル ト は ignore です。 digitalsignature (キーワー ド ) digitalsignature キー用途拡張 (すなわち ビ ッ ト 0) の扱いを指 定するキーワー ド clear/ignore/set の う ち 1 つ。 nonrepudiation (キーワー ド ) nonrepudiation キー用途拡張 (すなわち ビ ッ ト 1) の扱い を指 定するキーワー ド clear/ignore/set の う ち 1 つ。 engine (キーワー ド ) 電子署名に使用する暗号化エ ン ジ ン を指定 し ます (デ フ ォル ト : builtin) : builtin 内蔵の暗号化エ ン ジ ン を使用 し ます。 デジ タ ル ID はデ ィ ス ク フ ァ イル (PFX ま たは PKCS#12) か ら取っ て く る必要があ り ます。 mscapi (Windows のみ) Microsoft Crypto API を暗号化エ ン ジ ン と し て使用 し ます。 デジ タ ル ID は証明書ス ト アから も デ ィ ス ク フ ァ イル (PFX のみ) から も取っ て こ ら れます。 pkcs#11 (一部プ ラ ッ ト フ ォ ームのみ) PKCS#11 イ ン タ フ ェ ース を用いて暗号 ト ー ク ンから 証明 書を取得 し ます。 対応する PKCS#11 DLL/ 共有ラ イ ブ ラ リ の名前を、 digitalid オプ シ ョ ンの filename サブオプ シ ョ ン で与えている必要があ り ます。 84 7 章 : PLOP ・ PLOP DS ラ イ ブ ラ リ API リ フ ァ レ ン ス 表 7.6 PLOP_create_file( ) の sign オプ シ ョ ン に対するサブオプ シ ョ ン一覧 (PLOP DS でのみ利用可能) オプ シ ョ ン 説明 location (テキス ト 文字列) 署名の行われた物理的な場所 password (文字列。 空で も可。 engine=builtin の場合は、 password か passwordfile のど ち ら か 1 つだけがか な ら ず必要。 他のエ ン ジ ンの場合は代替方式が使え る可能性があ り ます) デジ タ ル ID に対するパ スワー ド ない し パス フ レーズまたは PIN を指定。 engine=pkcs#11 の場合は、 こ のオプ シ ョ ンに暗号 ト ー ク ンのための PIN を与え る必要があ り ますが、 ただ し PIN を ト ー ク ン本体に対話的に入力す る必要のある場合は こ の限 り ではあ り ません (キーボー ド 付き ス マー ト カ ー ド リ ーダ等)。 EBCDIC プ ラ ッ ト フ ォ ームの場合、 パスワー ド は ebcdic エ ン コ ーデ ィ ングである と 見な さ れます。 passwordfile (文字列。 engine=builtin の場合は、 password か passwordfile のど ち らか 1 つだけがかな ら ず必要。 他のエ ン ジ ンの場合は代替方式が使え る可能性があ り ます) フ ァ イルの 1 行目 (ラ イ ン エ ン ド キ ャ ラ ク タ (複数可) を除 く ) が、 デジ タ ル ID に対するパスワー ド ない し パス フ レーズま たは PIN と し て用い られます。 EBCDIC プ ラ ッ ト フ ォ ームの場合、 パスワー ド フ ァ イルの内容は ebcdic エ ン コ ーデ ィ ングであ る と 見な さ れます。 reason (テキス ト 文字列) 文書に署名 し た理由 subfilter (キーワー ド ) PDF 署名の種類 (デ フ ォル ト : adbe.pkcs7.detached) : adbe.pkcs7.detached PKCS#7 署名済デー タ フ ィ ール ド 内にいかな るデー タ も カ プ セル化 さ れません。 こ の方 式は動的な文書変更に対応 し ますので、 た と えば日付フ ィ ール ド に JavaScript コ ー ド で 記入 し た り する こ と が可能です。 adbe.pkcs7.sha1 PKCS#7 署名済デー タ フ ィ ール ド 内にデー タ の SHA-1 ダ イ ジ ェ ス ト がカ プ セル化 さ れま す。 こ の方式は動的な文書変更に対応 し ません。 7.3 文書入力 ・ 出力関数 85 C++ const char *get_buffer(long *size) C# Java byte[ ] get_buffer( ) Perl PHP string get_buffer( ) VB Function get_buffer( ) As Variant C const char * PLOP_get_buffer(PLOP *plop, long *size) 出力文書の内容を メ モ リ か ら全部または一部取 り 出 し ます。 size C バ イ ンデ ィ ン グでのみ必須。 返 さ れ る バ ッ フ ァ の長 さ が格納 さ れ る メ モ リ 位置へ のポ イ ン タ 。 戻り値 出力デー タ の入っ たバ ッ フ ァ 。 COM の場合、 こ れは符号な し バ イ ト のバ リ ア ン ト 配列で す。 JavaScript で COM を使 う 場合、 返 さ れたバ リ ア ン ト 配列の長 さ を取得す る こ と は許 さ れてい ません (ただ し 、 それ以外の言語で COM を使 う 場合は可能です)。 ク ラ イ ア ン ト 側では、 他のいかな る PLOP ラ イ ブ ラ リ 関数を呼ぶ よ り も 前に、 こ のバ ッ フ ァ 内容を消 費す る 必要があ り ます。 詳細 PLOP_create_file( ) に空の フ ァ イ ル名を与え る こ と に よ っ て メ モ リ 内生成を要求 し て あ っ た場合は (そ う でないな ら 出力はフ ァ イ ルへ直接書き 出 さ れます)、 PDF 出力は こ の関数 に よ っ てのみ取 り 出す こ と がで き ます。 PLOP_get_buffer( ) は、 PLOP_close_document( ) を 呼び出す よ り も 前に呼び出す必要があ り ます。 PLOP_create_file( ) の flush オプシ ョ ンがそのデフ ォ ル ト 値 none を持っ てい る 場合、 返 さ れたバ ッ フ ァ には、 出力文書のすべてのデー タ が入っ てい る こ と が保証 さ れてい ます。 flush=content の場合、 PLOP_get_buffer( ) は、 PDF 内容デー タ の比較的大 き なかた ま り (具 体的には 1 個の PDF ス ト リ ームオブジ ェ ク ト ) が処理 さ れ る たびご と に停止 し 、 返 さ れ る バ ッ フ ァ には出力文書の部分部分 し か入っ てい ません。 flush=heavy の場合、 こ の関数 は比較的小 さ な分量ずつを処理 し 、 し たがっ て比較的ひんぱんに呼び出 さ れます。 flush=none でない限 り 、 PLOP_get_buffer( ) は、 空のバ ッ フ ァ を返すま で繰 り 返 し 呼び 出す必要があ り ます。 ク ラ イ ア ン ト 側では、 完全な出力文書を生成す る ためには、 返 さ れ た部分部分を連結 し てい く 必要があ り ます。 flush=none の場合は、 PLOP_get_buffer( ) は 1 回呼び出すだけで充分です。 C++ void close_document(int doc) C# Java close_document(int doc) Perl PHP close_document(long doc) VB Sub close_document(doc As Long) C void PLOP_close_document(PLOP *plop, int doc) 入力 ・ 出力文書を閉 じ ます。 doc 詳細 86 PLOP_open_document*( ) で得 ら れた有効な文書ハン ド ル。 こ の関数は、処理が完了 し た時に、かつ PLOP_delete( ) を呼び出す よ り 前に、 ク リ ーン ア ッ プのために呼び出す必要があ り ます。 7 章 : PLOP ・ PLOP DS ラ イ ブ ラ リ API リ フ ァ レ ン ス 7.4 例外処理 PLOP では、 ラ イ ブ ラ リ の例外を C 言語で取 り 扱 う ための追加の メ ソ ッ ド を提供 し てい ま す。 それ以外の PLOP の言語バ イ ンデ ィ ン グでは、 それぞれの言語のネ イ テ ィ ブの例外処 理シ ス テ ム を利用 し てい ます (try/catch 節等)。 言語 ラ ッ パは、 生成 さ れ る 例外オブジ ェ ク ト の中に、 例外の番号 ・ 説明 ・ API 関数名に関す る 情報を入れ込みます。 Java 言語バ イ ンデ ィ ン グの場合、 こ う し た項目は個別に取得す る こ と がで き ます。 PLOP 例外が発生 し た時には、 その PLOP オブジ ェ ク ト については PLOP_delete( ) 以外 の PLOP 関数は一切呼び出 し てはいけ ません。 Java と .NET 用の PLOP 言語バ イ ンデ ィ ン グでは別途、 PLOPException オブジ ェ ク ト を 定義 し てお り 、 こ れは詳細なエ ラ ー情報にア ク セ スす る ための メ ンバをい く つか提供 し て い ます。 C++ int get_errnum( ) C# Java int get_errnum( ) Perl PHP int get_errnum( ) VB Function get_errnum( ) As Long C int PLOP_get_errnum(PLOP *plop) も っ と も最近に発生 し た例外、 ない し 失敗 し た関数呼び出 し の原因の番号を得ます。 戻り値 例外のエ ラ ー番号。 バインディング .NET の場合、 こ の メ ソ ッ ド は PLOPException オブジ ェ ク ト の中の Errnum と し て も 利用可 能です。 Java の場合、こ の メ ソ ッ ド は PLOPException オブジ ェ ク ト の中の get_errnum( ) と し て も 利 用可能です。 C++ string get_errmsg( ) C# Java String get_errmsg( ) Perl PHP string get_errmsg( ) VB Function get_errmsg( ) As String C const char *PLOP_get_errmsg(PLOP *plop) も っ と も最近に発生 し た例外、ない し 失敗 し た関数呼び出 し の原因の説明テキス ト を得ま す。 戻り値 エ ラ ーを説明す る 文字列、ま たは も っ と も 最近の API 呼び出 し が何 ら エ ラ ーを発生 さ せな か っ た場合は空文字列。 バインディング .NET の場合、こ の メ ソ ッ ド は PLOPException オブジ ェ ク ト の中の Errmsg と し て も 利用可能 です。 Java の場合、こ の メ ソ ッ ド は PLOPException オブジ ェ ク ト の中の getMessage( ) と し て も 利 用可能です。 7.4 例外処理 87 C++ string get_apiname( ) C# Java String get_apiname( ) Perl PHP string get_apiname( ) VB Function get_apiname( ) As String C const char *PLOP_get_apiname(PLOP *plop) も っ と も最近の例外を発生 さ せた、 ない し 失敗 し た API 関数の名前を得ます。 戻り値 PLOP API 関数の名前。 バインディング .NET の場合、こ の メ ソ ッ ド は PLOPException オブジ ェ ク ト の中の Apiname と し て も 利用可 能です。 Java の場合、 こ の メ ソ ッ ド は PLOPException オブジ ェ ク ト の中の get_apiname( ) と し て も 利用可能です。 C PLOP_TRY(PLOP *plop) 例外処理 フ レームを セ ッ ト ア ッ プ し ます。 かな ら ず PLOP_CATCH( ) と 対にする必要があ り ます。 詳細 「例外処理」 (33 ページ) 参照。 C PLOP_CATCH(PLOP *plop) 例外をキ ャ ッ チ し ます。 かな ら ず PLOP_TRY( ) と 対にする必要があ り ます。 詳細 「例外処理」 (33 ページ) 参照。 C PLOP_EXIT_TRY(PLOP *plop) PLOP_TRY( ) の中か ら、 対応する PLOP_CATCH( ) 節へ入る こ と な く 抜ける こ と を、 例外機構 に通知 し ます。 詳細 「例外処理」 (33 ページ) 参照。 C PLOP_RETHROW(PLOP *plop) 例外を他のハン ド ラへ投げなお し ます。 詳細 「例外処理」 (33 ページ) 参照。 88 7 章 : PLOP ・ PLOP DS ラ イ ブ ラ リ API リ フ ァ レ ン ス 7.5 オ プ シ ョ ン処理 C++ void set_option(string optlist) C# Java void set_option(String optlist) Perl PHP set_option(string optlist) VB Sub set_option(optlist As String) C void PLOP_set_option(PLOP *plop, const char *optlist) PLOP のための 1 つない し 複数のグローバルオプ シ ョ ン を設定 し ます。 optlist 表 7.7 に従っ て グ ロ ーバルオプシ ョ ン を指定する オプシ ョ ン リ ス ト 。 1 つのオプ シ ョ ンが複数回与え ら れた場合、最後に出て き た も のがそれ よ り 前のすべて を上書 き し ま す。 1 つのオプシ ョ ン (searchpath 等) に対 し て複数の値を与え たい と き は、 すべての値 を 1 つの リ ス ト 引数に し て こ のオプシ ョ ンに与え ます。 詳細 表 7.7 で特記 し て あ る オプシ ョ ンについては、 こ の関数を複数回呼び出す こ と で値を蓄積 さ せ る こ と がで き ます。 特記 し ていないオプシ ョ ンについては、 新 し い値が古い値を上書 き し ます。 表 7.7 PLOP_set_option( ) に対するグ ローバルオプ シ ョ ン一覧 オプ シ ョ ン 説明 filenamehandling (キーワー ド 。 Windows では必須ではあ り ません) フ ァ イル名に対する タ ーゲ ッ ト エ ン コ ーデ ィ ン グ。 Windows では こ のオプ シ ョ ンは与え られた フ ァ イル名には適用 さ れますが、 生成 さ れる フ ァ イ ルの名前には適用 さ れません (デ フ ォル ト : Mac OS X では unicode、 それ以外では honorlang) : ascii 7 ビ ッ ト ASCII basicebcdic コ ー ド ページ 1047 に従っ た基本 EBCDIC、 ただ し Unicode 値 <= U+007E のみ basicebcdic_37 コ ー ド ページ 0037 に従っ た基本 EBCDIC、 ただ し Unicode 値 <= U+007E のみ honorlang 環境変数 LC_ALL ・ LC_CTYPE ・ LANG が utf8 ・ UTF-8 ・ cpXXXX ・ CPXXXX ・ iso8859-x ・ ISO-8859-x のいずれかを指定 し ていれば、 それが解釈 さ れて フ ァ イル名に適用 さ れま す。 legacy auto エ ン コ ーデ ィ ング (すなわち カ レ ン ト のシ ス テムエ ン コ ーデ ィ ン グ) を用いて、 フ ァ イル名を解釈 し 、 また honorlang パラ メ タ が設定 さ れている場合には LANG 変数を 解釈 し ます。 unicode (EBCDIC-) UTF-8 形式の Unicode エ ン コ ーデ ィ ン グ すべての有効な エ ン コ ーデ ィ ング名 PLOP に よ っ て認識 さ れる任意の (内部ま たはユーザー定義) エ ン コ ーデ ィ ング Unicode 非対応バイ ンデ ィ ングで UTF-8 BOM な し で length=0 で与え られた フ ァ イル名は、 こ の filenamehandling オプ シ ョ ンに従っ て解釈 さ れます。 license (文字列) ラ イ セ ン スキーを設定 し ます。 PLOP_open_document*( ) への初めての呼び出 し よ り も前 に設定する必要があ り ます。 licensefile (文字列) ラ イ セ ン スキー (複数可) の入っ た フ ァ イルの名前を設定 し ます。 ラ イ セ ン ス フ ァ イル は、 PLOP_open_document*( ) への初めての呼び出 し よ り も前に 1 度だけ設定で き ます。 あ るいは ラ イ セ ン ス フ ァ イルの名前は、 PLOPLICENSEFILE と い う 環境変数で与えた り 、 (Windows の場合) レ ジ ス ト リ で与えた り する こ と も可能です。 7.5 オプ シ ョ ン処理 89 表 7.7 PLOP_set_option( ) に対するグ ローバルオプ シ ョ ン一覧 オプ シ ョ ン 説明 frontpage (論理値) false の場合、 有効な ラ イ セ ン スキーが見つから ない と き に例外を発生 さ せます。 true の 場合、 0.1 節 「 ソ フ ト ウ ェ ア を イ ン ス ト ール」 (5 ページ) に従っ て評価モー ド で表紙が生成 さ れま す。 こ のオプ シ ョ ンは、 PLOP_open_document*( ) への初めての呼び出 し よ り も前に設定する必要 があ り ます。 有効な ラ イ セ ン スキーが見つかっ た と きは、 こ のオプ シ ョ ンは何の効果 も持ち ませ ん。 デ フ ォル ト : true searchpath1 (名前文字列の リ ス ト ) 読み込みたい フ ァ イルの入 っ たデ ィ レ ク ト リ の相対パス名か絶対パス名 (複数可)。 こ の検索パスは複数回設定する こ と がで き ます。 その場合、 項目は蓄積 さ れて、 設定 さ れた順に使用 さ れます。 空文字列を指定する と 、 それま での検索パス項目がすべて削除 さ れま す。 Windows の場合、 searchpath はレ ジ ス ト リ 項目で設定する こ と も可能です。 デ フ ォル ト : 空 shutdownstrategy (整数) すべての PLOP オブ ジ ェ ク ト に対 し て 1 度だけ割 り 当て られるグローバル リ ソ ースの解放 方針。 グローバル リ ソ ースはそれぞれ、 それが初めて必要 と さ れた時点で要求に よ っ て初期化 さ れます。 このオプ シ ョ ンは、 1 個のプ ロ セス内のすべての PLOP オブ ジ ェ ク ト に対 し て同一の値に 設定する必要があ り ます。 そ う し ない場合の動作は未定義です (デ フ ォル ト : 0) : 0 何個の PLOP オブ ジ ェ ク ト が リ ソ ース を使用 し ているかを参照カ ウ ン タ が追跡 し ます。 最後の PLOP オブ ジ ェ ク ト が削除 さ れて参照カ ウン タ がゼロにな っ た時点で、 リ ソ ース は解放 さ れます。 1 リ ソ ースはプ ロ セスの最後ま で保持 さ れます。 こ れは速度をわずかに向上 さ せる可能性 があ り ますが、 最後の PLOP オブ ジ ェ ク ト が削除 さ れた後に よ り 多 く の メ モ リ を必要 と し ます。 1. オプ シ ョ ンの値は複数回の呼び出 し に よ っ て蓄積 さ せる こ と が可能です。 90 7 章 : PLOP ・ PLOP DS ラ イ ブ ラ リ API リ フ ァ レ ン ス 7.6 pCOS 関数 PDF か ら オブジ ェ ク ト デー タ を取得す る ための完全な pCOS 文法に対応 し てい ます。詳 し い説明は pCOS パ ス リ フ ァ レ ン ス を参照 し て く だ さ い。 C++ double pcos_get_number(int doc, string path) C# Java double pcos_get_number(int doc, String path) Perl PHP double pcos_get_number(long doc, string path) VB Function pcos_get_number(doc as Long, path As String) As Double C double PLOP_pcos_get_number(PLOP *plop, int doc, const char *path, ...) 数値型か論理値型の pCOS パスの値を得ます。 doc path PLOP_open_document*( ) で取得 し た有効な文書ハン ド ル。 数値オブジ ェ ク ト か論理値オブジ ェ ク ト に対する 完全な pCOS パ ス。 追加の引数群 (C 言語バ イ ンデ ィ ン グのみ) key 引数にプ レース ホルダがあ る 場合、 そ れに対応す る 任意の数の追加パ ラ メ タ を与え る こ と がで き ます (%s で文字列、 %d で整 数。 %% を用い る と 1 個のパーセ ン ト 記号にな り ます)。 こ れ ら の引数を利用すれば、 可 変の数値や文字列値を含む複雑なパ ス をいちいち構成す る 手間が省け ます。プ レース ホル ダの数 と 型が、 与え る 追加パ ラ メ タ 群に一致す る よ う にする のは、 ク ラ イ ア ン ト 側の役割 です。 戻り値 pCOS パ ス で示 さ れたオブジ ェ ク ト の数値。 論理値の場合、 true な ら 1 が返 さ れ、 そ う で ないな ら 0 が返 さ れます。 C++ string pcos_get_string(int doc, string path) C# Java String pcos_get_string(int doc, String path) Perl PHP string pcos_get_string(long doc, string path) VB Function pcos_get_string(doc as Long, path As String) As String C const char *PLOP_pcos_get_string(PLOP *plop, int doc, const char *path, ...) 名前 ・ 文字列 ・ 論理値のいずれかの型の pCOS パスの値を得ます。 doc path PLOP_open_document*( ) で取得 し た有効な文書ハン ド ル。 名前 ・ 文字列 ・ 論理値のいずれかのオブジ ェ ク ト に対する 完全な pCOS パ ス。 追加の引数群 (C 言語バ イ ンデ ィ ン グのみ) key 引数にプ レース ホルダがあ る 場合、 そ れに対応す る 任意の数の追加パ ラ メ タ を与え る こ と がで き ます (%s で文字列、 %d で整 数。 %% を用い る と 1 個のパーセ ン ト 記号にな り ます)。 こ れ ら の引数を利用すれば、 可 変の数値や文字列値を含む複雑なパ ス をいちいち構成す る 手間が省け ます。プ レース ホル ダの数 と 型が、 与え る 追加パ ラ メ タ 群に一致す る よ う にする のは、 ク ラ イ ア ン ト 側の役割 です。 戻り値 pCOS パ ス で示 さ れたオブジ ェ ク ト の値の文字列。 論理値の場合、 文字列 true か false が 返 さ れます。 7.6 pCOS 関数 91 詳細 pCOS が フルモー ド で動作 し ていない と き 、 かつオブジ ェ ク ト の型が文字列の場合には、 こ の関数は例外を発生 さ せます。 例外 と し て、 /Info/* オブジ ェ ク ト 群 (文書情報キー) は 制限 pCOS モー ド で も nocopy=false か plainmetadata=true な ら 取得す る こ と がで き 、 ま た、 bookmarks[...]/Title と annots[...]/contents は制限 pCOS モー ド で も nocopy=false な ら 取得で き ます。 こ の関数では、 PDF 文書か ら 得 ら れ る 文字列はテ キ ス ト 文字列であ る と 前提 し てい ま す。 バ イ ナ リ デー タ の入っ た文字列オブジ ェ ク ト は、 こ れでな く PLOP_pcos_get_stream( ) で取得す る べ き で、 それな ら デー タ は一切変改 さ れません。 バインディング C バ イ ンデ ィ ン グ :返 さ れ る 文字列は、最大 10 項目を持つ リ ン グバ ッ フ ァ 内に格納 さ れま す。 10 個を超え る 文字列が ク エ リ さ れた と き には、 バ ッ フ ァ は再利用 さ れ ますので、 10 個を超え る 文字列を同時に利用 し たい場合には、 ク ラ イ ア ン ト 側でその文字列を複製 し て お く 必要があ り ます。 た と えば、 printf( ) 文の引数では こ の関数を最大 10 回ま で呼び出す こ と がで き ます。 同時に 10 個を超え る 文字列が使用 さ れないな ら ば、 その戻 り 文字列は 互いに独立であ る こ と が保証 さ れてい る か ら です。 C ・ C++ 言語バ イ ンデ ィ ン グ : 文字列は BOM のない UTF-8 形式で返 さ れます。 zSeries で は、 結果は BOM のない EBCDIC-UTF-8 形式で返 さ れます。 C バ イ ンデ ィ ン グ : 返 さ れた文字列は、 次に こ の関数を呼び出すま でのあいだ使用で き ま す。 Java ・ .NET : 結果は Unicode 文字列 と し て提供 さ れます。 も う テ キ ス ト がない と き は null オブジ ェ ク ト が返 さ れます。 Perl ・ PHP 言語バ イ ンデ ィ ン グ : 結果は UTF-8 文字列 と し て提供 さ れます。 も う テ キ ス ト がない と き は null オブジ ェ ク ト が返 さ れます。 RPG 言語バ イ ンデ ィ ン グ : 結果は EBCDIC-UTF-8 文字列 と し て提供 さ れます。 C++ const unsigned char *pcos_get_stream(int doc, int *length, string optlist, string path) C# Java byte[ ] pcos_get_stream(int doc, String optlist, String path) Perl PHP string pcos_get_stream(long doc, string optlist, string path) VB Function pcos_get_stream(doc as Long, optlist As String, path As String) C const unsigned char *PLOP_pcos_get_stream(PLOP *plop, int doc, int *length, const char *optlist, const char *path, ...) stream ・ fstream ・ 文字列のいずれかの型の pCOS パスの値を得ます。 doc PLOP_open_document*( ) で取得 し た有効な文書ハン ド ル。 length (C ・ C++ 言語バ イ ンデ ィ ン グのみ) 返 さ れ る ス ト リ ームデー タ の長 さ をバ イ ト 単 位で受け入れ る 変数へのポ イ ン タ 。 optlist path 表 7.8 に従っ てい く つかの取得オプシ ョ ン を指定す る オプシ ョ ン リ ス ト 。 ス ト リ ームオブジ ェ ク ト か文字列オブジ ェ ク ト に対す る 完全な pCOS パス。 追加の引数群 (C 言語バ イ ンデ ィ ン グのみ) key 引数にプ レース ホルダがあ る 場合、 そ れに対応す る 任意の数の追加パ ラ メ タ を与え る こ と がで き ます (%s で文字列、 %d で整 数。 %% を用い る と 1 個のパーセ ン ト 記号にな り ます)。 こ れ ら の引数を利用すれば、 可 変の数値や文字列値を含む複雑なパ ス をいちいち構成する 手間が省け ます。プ レース ホル 92 7 章 : PLOP ・ PLOP DS ラ イ ブ ラ リ API リ フ ァ レ ン ス ダの数 と 型が、 与え る 追加パ ラ メ タ 群に一致す る よ う にする のは、 ク ラ イ ア ン ト 側の役割 です。 戻り値 ス ト リ ームか文字列に入っ てい る 暗号化 さ れていない状態のデー タ 。 ス ト リ ーム ま たは文 字列が空の と き は、 返 さ れ る デー タ は空 (C ・ C++ では NULL) にな り ます。 オブジ ェ ク ト が stream 型の と き は、 すべての フ ィ ル タ が ス ト リ ームの内容か ら 除去 さ れます (すなわち、 実際の生デー タ が返 さ れます)。 オブジ ェ ク ト が fstream 型か文字列 型の と き は、 デー タ は PDF フ ァ イ ル内で見つか っ たその ま ま で返 さ れますが、 ただ し 例 外 と し て ASCII85 ・ ASCII-Hex フ ィ ル タ は除去 さ れます。 詳細 pCOS が フルモー ド で動作 し ていない と き 、 こ の関数は例外を発生 さ せます。例外 と し て、 /Root/Metadata オブジ ェ ク ト は制限 pCOS モー ド で も nocopy=false か plainmetadata=true な ら 取得す る こ と がで き ます。 path が stream ・ fstream ・ 文字列型のオブジ ェ ク ト を指 し ていない と き に も 例外が発生 し ます。 名前 と 違 っ て こ の関数は、 文字列型の オ ブ ジ ェ ク ト を 取得す る た め に も 使 え ま す。 PLOP_pcos_get_string( ) の場合、オブジ ェ ク ト を テ キ ス ト 文字列 と し て取 り 扱い ますが、そ れ と は違っ て こ の関数では、 返すデー タ に一切の変改を加え ません。 バ イ ナ リ 文字列デー タ は PDF 内で用い ら れ る こ と は稀で、 自動的に検出 し よ う と し て も 確実ではあ り ません。 ですので、文字列オブジ ェ ク ト をバ イ ナ リ デー タ と し て取得す る かテ キ ス ト と し て取得す る か、 考え て適切な関数を選ぶのはユーザー側の役割です。 バインディング COM : 多 く の ク ラ イ ア ン ト プ ロ グ ラ ム では、 ス ト リ ーム内容を保持す る ためにバ リ ア ン ト 型を用いてい ます。 JavaScript で COM を使 う 場合、 返 さ れたバ リ ア ン ト 配列の長 さ を 取得す る こ と は許 さ れてい ません (ただ し 、 それ以外の言語で COM を使 う 場合は可能で す)。 C ・ C++ 言語バ イ ンデ ィ ン グ : 返 さ れたデー タ バ ッ フ ァ は、 次に こ の関数を呼び出すま で のあいだ使用で き ます。 こ の関数を利用する と 、 PDF か ら埋め込み フ ォ ン ト デー タ を抽出で き ます。 フ ォ ン ト はそ れぞれの フ ォ ン ト ベ ン ダの ラ イ セ ン ス許諾下にあ り 、それぞれの知的所有権者の明示的な 許諾な し に再利用 し てはいけませんので、 利用者はこ のこ と に留意 し て く だ さ い。 関連す る ラ イ セ ン ス許諾を協議するにはお使いの フ ォ ン ト のベン ダに連絡 し て く だ さ い。 表 7.8 PLOP_pcos_get_stream( ) に対するオプ シ ョ ン一覧 オプ シ ョ ン 説明 convert (キーワー ド 。 非対応のフ ィ ル タ で圧縮 さ れている ス ト リ ームに対 し ては無視 さ れます) 文字列ま たはス ト リ ームの内容が圧縮 さ れるかど う かを制御 (デ フ ォ ル ト : none) : none 内容をバイ ナ リ デー タ と し て扱い、 一切変換 し ません。 unicode 内容を テキス ト デー タ と し て (すなわち PLOP_pcos_get_string( ) と 全 く 同様に) 扱い、 Unicode に規格化 し ます。 Unicode 非対応の言語バイ ンデ ィ ングの場合、 こ れはデー タ が BOM な し の UTF-8 形式に変換 さ れる こ と を意味 し ます。 こ のオプ シ ョ ンは、 PDF 内でめ っ たに使われないデー タ 型 「テキス ト ス ト リ ーム」 (JavaScript 等のために使われます。 ただ し JavaScript の大多数はス ト リ ームオブ ジ ェ ク ト で な く 文字列オブ ジ ェ ク ト 内に格納 さ れます) のために必要です。 7.6 pCOS 関数 93 7.7 Unicode 変換関数 C++ string convert_to_unicode(string inputformat, string input, string optlist) C# Java string convert_to_unicode(string inputformat, byte[ ] input, string optlist) Perl PHP string convert_to_unicode(string inputformat, string input, string optlist) VB Function convert_to_unicode(inputformat as String, input, optlist as String) As String C const char *PLOP_convert_to_unicode(PLOP *p, const char *inputformat, const char *input, int inputlen, int *outputlen, const char *optlist) 任意のエ ン コ ーデ ィ ングの文字列を、 さ ま ざ ま な形式の Unicode 文字列へ変換 し ます。 inputformat 入力文字列の解釈を指定す る Unicode テ キ ス ト 形式ま たはエン コ ーデ ィ ン グ名 : > Unicode テ キ ス ト 形式 : utf8 ・ ebcdicutf8 ・ utf16 ・ utf16le ・ utf16be ・ utf32 > すべての内部的に知 ら れてい る 8 ビ ッ ト エン コ ーデ ィ ン グ と 、ホ ス ト シ ス テ ム上で利用 可能なエン コ ーデ ィ ン グ と 、 日中韓エン コ ーデ ィ ン グ cp932 ・ cp936 ・ cp949 ・ cp950 > キー ワー ド auto は次の動作を指定 し ます:入力文字列に UTF-8 ま たは UTF-16 BOM が あ る 場合はそれを用いて適切な形式が決定 さ れ、 ない場合はカ レ ン ト のシ ス テ ム コ ー ド ページであ る と 見な さ れます。 input Unicode へ変換 し たい文字列 (COM ではバ リ ア ン ト ) inputlen (C 言語バ イ ンデ ィ ン グのみ) 入力文字列の長 さ をバ イ ト 単位で。 inputlen = 0 の場合には、 ヌ ル終端文字列を与え る 必要があ り ます。 outputlen (C 言語バ イ ンデ ィ ン グのみ) 返 さ れ る 文字列の長 さ (バ イ ト 単位で) が格納 さ れ る メ モ リ 位置への C ス タ イ ルのポ イ ン タ 。 optlist 入力の解釈 と Unicode 変換のためのオプシ ョ ン群を指定 し たオプシ ョ ン リ ス ト : > 表 7.9 に従っ た入力フ ィ ル タ オプシ ョ ン群 : charref ・ escapesequence > 表 7.9 に従っ た Unicode 変換オプシ ョ ン群 : bom ・ errorpolicy ・ inflate ・ outputformat 戻り値 指定 さ れた引数 と オプシ ョ ンに従っ て入力文字列か ら 生成 さ れた Unicode 文字列。 入力文 字列が、 指定 さ れ た入力形式に準拠 し て い な い と き (無効な UTF-8 文字列な ど) は、 errorpolicy=return の場合には空の出力文字列が返 さ れ、 errorpolicy=exception の場合には 例外が発生 し ます。 詳細 こ の関数は、 汎用の Unicode 文字列変換に有用で し ょ う 。 こ れは、 適切な Unicode コ ン バー タ を提供 し ていない環境で作業をす る ユーザーの便宜のために提供 さ れてい ます。 スコープ 任意 バインディング C バ イ ンデ ィ ン グ :返 さ れ る 文字列は、最大 10 項目を持つ リ ン グバ ッ フ ァ 内に格納 さ れま す。 10 個を超え る 文字列が変換 さ れた と き には、 バ ッ フ ァ は再利用 さ れますので、 10 個 を超え る 文字列を同時に利用 し たい場合には、 ク ラ イ ア ン ト 側でその文字列を複製 し てお く 必要があ り ます。 た と えば、 printf( ) 文の引数では こ の関数を最大 10 回ま で呼び出す こ と がで き ます。 同時に 10 個を超え る 文字列が使用 さ れないな ら ば、 その戻 り 文字列は互 いに独立であ る こ と が保証 さ れてい る か ら です。 94 7 章 : PLOP ・ PLOP DS ラ イ ブ ラ リ API リ フ ァ レ ン ス 表 7.9 PLOP_convert_to_unicode( ) に対するオプ シ ョ ン一覧 オプ シ ョ ン 説明 bom (キーワー ド 。 outputformat=utf32 の場合には無視 さ れます) バイ ト 順序マー ク (BOM) を出力文 字列に加え るかど う かの方針。 使え るキーワー ド (デ フ ォル ト : none) : add BOM を加え ます。 keep 入力文字列に BOM があ る な ら BOM を加え ます。 none BOM を加え ません。 optimize outputformat=utf8 または ebcdicutf8 かつ出力文字列が範囲 < U+007F. のキ ャ ラ ク タ の み含む場合以外には BOM を加え ます。 charref (論理値) true の場合、 数値 ・ 文字実体参照 と グ リ フ名参照の置き換え を有効に し ます。 デ フ ォ ル ト : false errorpolicy (キーワー ド ) 変換エ ラ ーの場合の動作 (デ フ ォル ト : exception) : return 文字参照が解決で き ない と き に代替キ ャ ラ ク タ が使用 さ れます。 変換エ ラ ーの場合に空 文字列が返 さ れます。 exception 変換エ ラ ーの場合に例外が発生 し ます。 escapesequence (論理値) true の場合、 文字列内のエ スケープ シーケ ン スの置き換え を有効に し ます。 デ フ ォル ト : false inflate (論理値。 inputformat=utf8 の場合のみ。 outputformat=utf8 の場合には無視 さ れます) true の場 合、 無効な UTF-8 入力文字列が来て も 例外が発生せず、 指定 さ れた出力形式のイ ン フ レー ト さ れ たバイ ト 文字列が生成 さ れます。 こ れはデバ ッ グのために有用で し ょ う 。 デ フ ォ ル ト : false outputformat (キーワー ド ) 生成 さ れる文字列の Unicode テキス ト 形式 : utf8 ・ ebcdicutf8 ・ utf16 ・ utf16le ・ utf16be ・ utf32。 空文字列は utf16 と 同等です。 デ フ ォ ル ト : utf16 Unicode 対応言語バイ ンデ ィ ング : 出力形式は utf16 を強制 さ れます。 C++ 言語バイ ンデ ィ ング : 次の出力形式のみ許 さ れます : utf8 ・ utf16 ・ utf32。 C++ string utf16_to_utf8(string utf16string) Perl PHP string utf16_to_utf8(string utf16string) C const char *PLOP_utf16_to_utf8(PLOP *p, const char *utf16string, int len, int *size) 非推奨。 PLOP_convert_to_unicode( ) を使用 し て く だ さ い。 C++ string utf8_to_utf16(string utf8string, string ordering) Perl PHP string utf8_to_utf16(string utf8string, string ordering) C const char *PLOP_utf8_to_utf16(PLOP *p, const char *utf8string, const char *ordering, int *size) 非推奨。 PLOP_convert_to_unicode( ) を使用 し て く だ さ い。 7.7 Unicode 変換関数 95 96 7 章 : PLOP ・ PLOP DS ラ イ ブ ラ リ API リ フ ァ レ ン ス A PDFlib を PLOP または PLOP DS と 組み合わせる PDFlib のバージ ョ ン番号に よ っ ては、 PLOP と PDFlib ・ PDFlib+PDI ・ PDFlib Personalization Server (PPS) を組み合わせ る こ と は意味があ る で し ょ う 。 表 7.10 に、 PDFlib フ ァ ミ リ に おけ る 暗号化 ・ 線形化 ・ 最適化 / 修復モー ド ・ 電子署名の機能の有無を ま と め ま し た。 自 分の PDFlib のバージ ョ ン の対応 し て い な い機能 を 必要 と す る あ ら ゆ る 場面におい て、 PLOP ま たは PLOP DS を PDFlib に組み合わせ る こ と は意味があ り ます。 表 7.10 さ ま ざ ま な PDFlib バージ ョ ンにおける暗号化 ・ 線形化 ・ 最適化 ・ 電子署名への対応 PDFlib バージ ョ ン 暗号化 線形化 最適化 / 修復 モー ド 電子署名 PDFlib/PDFlib+PDI/PPS 5 有 ― ― ― PDFlib/PDFlib+PDI/PPS 6 有 有 ― ― PDFlib/PDFlib+PDI/PPS 7 ・ 8 有 有 有 ― PLOP は、 PDF を動的に生成 し て後処理す る ために、 PDFlib と 容易に相互動作す る よ う 設 計 さ れてい ます。 こ の章では、 こ の 2 つの製品を結合する 方法を説明 し ます。 PDFlib で生 成 し た文書を、PLOP コ マ ン ド ラ イ ン ツールを使っ て後処理す る こ と も 可能ですが、PLOP ラ イ ブ ラ リ を使っ てそ う す る ほ う を推奨 し ます。 注記 PDFlib 7 ・ 8 ではフ ォ ーム フ ィ ール ド に対 し て Appearance ス ト リ ームを生成 し ないので、 フ ォ ーム フ ィ ール ド を含む PDFlib 生成文書に PLOP を使っ て署名する こ と は、 フ ォ ーム フ ィ ール ド を sacrifice オプ シ ョ ン で削除 し ない限 り で き ません。 フ ァ イルベース での結合 フ ァ イ ルベース方式は、非常に大き な PDF 文書を扱 う 場合や、 PDFlib/PLOP 結合の総 メ モ リ 要求を下げ る 必要があ る 場合に推奨 し ます。 単に、 適切な PDFlib ル ー チ ン で PDF フ ァ イ ル を デ ィ ス ク 上 に 生 成 し た 後、 そ れ を PLOP_open_ document( ) で処理 し ます。 メ モ リ ベース での結合 メ モ リ ベー ス 方式は比較的速いですが、 メ モ リ を比較的多 く 必 要 と し ます。 非常に大 き な文書を扱 う 場合を除いて、 こ れは Web アプ リ ケーシ ョ ンで動 的な PDF 生成や署名を行 う 場合に推奨 し ます。 PDFlib で PDF フ ァ イ ルをデ ィ ス ク 上に生 成す る のではな く 、 PDF_begin_document( ) に空の フ ァ イ ル名を与え る こ と に よ っ て イ ン コ アPDF生成を利用 し 、生成 さ れたPDFデー タ の入っ たバ ッ フ ァ の内容を PDF_get_buffer( ) で取 り 出 し 、 PLOP_create_pvf( ) で仮想フ ァ イ ルを作成 し ます。 こ の仮想フ ァ イ ルに用いた フ ァ イ ル名を、その後に PLOP_open_document( ) を用いて PLOP/PLOP DS へ渡 し ます。 こ う す る と 物理的な フ ァ イ ルをデ ィ ス ク 上に作成す る 必要があ り ません。 ただ し 、 PDFlib の バ ッ フ ァ 内容を複数の部分に分けて取 り 出す こ と はで き ません。なぜな ら PLOP/PLOP DS に は文書全体 を 1 個 の バ ッ フ ァ で 与 え る 必要 が あ る か ら で す。 で す の で、 PDF_end_document( ) と PDF_delete( ) と の間で PDF_get_buffer( ) を呼び出す必要があ り ま す。 すべての PLOP パ ッ ケージに入っ てい る hellosign プ ロ グ ラ ミ ン グサンプルでは、PDFlib を使っ て動的に PDF 文書を生成 し 、 それを PLOP に メ モ リ 内で渡 し て電子書名を適用す る 方法を示 し てい ます。 A PDFlib を PLOP または PLOP DS と 組み合わせる 97 B PLOP ラ イ ブ ラ リ ク イ ッ ク リ フ ァ レンス 以下の表は、 すべての PLOP API 関数の概観です。 頭に (C) がついてい る のは C プ ロ ト タ イ プを表 し てお り 、 Java 言語バ イ ンデ ィ ン グでは利用で き ません。 一般関数 関数プ ロ ト タ イ プ (C) PLOP * PLOP_new(void) ページ 75 void delete( ) 75 void create_pvf(string filename, const void *data, size_t size, string optlist) 75 int delete_pvf(string filename) 75 double info_pvf(String filename, String keyword) 77 文書入力 ・ 出力 関数プ ロ ト タ イ プ int open_document(String filename, String optlist) ページ 78 (C) int PLOP_open_document_callback(PLOP *plop, void *opaque, size_t filesize, size_t (*readproc)(void *opaque, void *buffer, size_t size), int (*seekproc)(void *opaque, long offset), const char *optlist) 79 int create_file(String filename, String optlist) 80 close_document(int doc) 86 byte[ ] get_buffer( ) 86 エ ラ ー処理 関数プ ロ ト タ イ プ int get_errnum( ) ページ 87 String get_errmsg( ) 87 String get_apiname( ) 88 オ プ シ ョ ン処理 関数プ ロ ト タ イ プ void set_option(String optlist) ページ 89 pCOS 関数 関数プ ロ ト タ イ プ double pcos_get_number(int doc, String path) 98 ページ 91 String pcos_get_string(int doc, String path) 91 byte[ ] pcos_get_stream(int doc, String optlist, String path) 92 B 章 : PLOP ラ イ ブ ラ リ ク イ ッ ク リ フ ァ レ ン ス Unicode 変換関数 関数プ ロ ト タ イ プ string convert_to_unicode(string inputformat, byte[ ] input, string optlist) ページ 94 B PLOP ラ イ ブ ラ リ ク イ ッ ク リ フ ァ レ ン ス 99 C 変更履歴 このマニ ュ アルの変更履歴 日付 変更 2011 年 03 月 04 日 > PLOP 4.1 ・ PLOP DS 4.1 のための メ ジ ャ ーオーバーホール 2008 年 12 月 05 日 > PLOP 4.0 ・ PLOP DS 4.0 の XMP ・ PVF ・ PKCS#11 (スマー ト カ ー ド ) 対応に関する 2007 年 07 月 15 日 > PLOP 3.0 と PLOP DS 3.0 に関する更新 更新 100 2004 年 09 月 27 日 > PLOP 2.1 に関する更新 2003 年 12 月 01 日 > 新 し い メ ジ ャ ー リ リ ース PLOP 2.0 に関する更新 2002 年 11 月 23 日 > Perl 用 PSP バイ ンデ ィ ン グの記述を追加 2002 年 11 月 07 日 > ILE-RPG での PSP の利用に関する節を追加 2002 年 10 月 22 日 > PSP 1.0.1 に関する若干の変更 2002 年 09 月 17 日 > PSP 1.0.0 に関する第一版 C 章 : 変更履歴 索引 B byteserving 15 C C++ と .NET 42 C++ バイ ンデ ィ ング 36 certified PDF 66 CLI 36 COM バイ ンデ ィ ング 39 C バイ ンデ ィ ング 33 D DSA に よ る署名 66 G Ghent Workgroup (GWG) 20 J Java バイ ンデ ィ ン グ 40 K KeyUsage 証明書拡張 65 M Microsoft Cryptographic API (MSCAPI) 60 N .NET バイ ンデ ィ ング 42 noaccessible 54 noannots 54 noassemble 55 nocopy 54 noforms 54 nohiresprint 55 nomodify 54 nonrepudiation keyusage フ ラ グ 65 noprint 54 P page-at-a-time ダウン ロー ド 15 pCOS 71 API 関数 91 ク ッ ク ブ ッ ク 13 PDF/A 24, 25 と XMP メ タ デー タ 20 PDF/X 25 PDFlib と PLOP/PLOP DS 97 PDF バージ ョ ン , 生成出力の 24 Perl バイ ンデ ィ ング 43 PFX 形式 60 PHP バイ ンデ ィ ング 44 PKCS#11 60, 64 PKCS#12 60 plainmetadata 55 PLOP DS の署名の暗号の詳細 66 PLOP_CATCH( ) 88 PLOP_close_document( ) 86 PLOP_convert_to_unicode( ) 94 PLOP_create_file( ) 80 PLOP_create_pvf( ) 75 PLOP_delete( ) 75 PLOP_delete_pvf( ) 76 PLOP_EXIT_TRY( ) 34, 88 PLOP_get_apiname( ) 88 PLOP_get_buffer( ) 86 PLOP_get_errmsg( ) 87 PLOP_get_errnum( ) 87 PLOP_info_pvf() 77 PLOP_new( ) 75 PLOP_open_document( ) 78 PLOP_open_document_callback( ) 79 PLOP_pcos_get_number( ) 91 PLOP_pcos_get_stream( ) 92 PLOP_pcos_get_string( ) 91 PLOP_RETHROW( ) 88 PLOP_set_option( ) 89 PLOP_TRY( ) 88 PLOP ・ PLOP DS コ マ ン ド ラ イ ン ツール オプ シ ョ ン 27 作成例 32 終了 コ ー ド 31 諸機能 11 PLOP ・ PLOP DS ラ イ ブ ラ リ API リ フ ァ レ ン ス 73 ク イ ッ ク リ フ ァ レ ン ス 98 諸機能 11 Python バイ ンデ ィ ング 46 R Reader 有効化 さ れた PDF 25 RPG バイ ンデ ィ ング 47 索引 101 RSA によ る署名 66 所有者パスワー ド 49 W す Web 最適化 PDF 15 ス ト リ ーム最適化 16 ス マー ト カ ー ド 64 X XMP メ タ デー タ 19, 20 プ レーン テキス ト 52 無効な 21 線形化 PDF 15 そ あ 増分ア ッ プデー ト 66 暗号化アルゴ リ ズム , 電子署名の 66 暗号化エ ン ジ ン 60 暗号化 さ れた フ ァ イル添付 25 暗号化フ ァ イル添付 52 暗号 ト ー ク ン 64 暗号の詳細 , PLOP DS の署名の 66 大容量 PDF 文書 26 い 一時デ ィ ス ク容量の必要量 25 イ ン ス ト ール , PLOP/PLOP DS 5 お オプ シ ョ ン リ ス ト 73 か 外部暗号化エ ン ジ ン 60 ガベージ コ レ ク シ ョ ン 16 き キー長 , 電子署名の 66 け 権限設定 51 権限パスワー ド 49 検証 , 電子署名を Acrobat で 67 さ 最適化 16 最適化 PDF 15 し 修復モー ド , 破損 PDF のための 17 終了 コ ー ド 31 証明書 , Windows で ま と める 61 商用ラ イ セ ン ス 8 署名→電子署名 署名 , PDF 文書に 63 102 せ 索引 た つ 使われていないオブ ジ ェ ク ト 16 て デジ タ ル ID 60 デジ タ ル署名→電子署名 電子署名 22, 59 Acrobat で検証 67 入力文書内の 25 添付パスワー ド 49 は バイ ト サービ ング 15 パスワー ド 49, 50 デジ タ ル ID の 65 パスワー ド フ ァ イル , デジ タ ル ID の 65 破損 し た入力 PDF 17 ハ ッ シ ュ関数 , 電子署名の 66 ひ 評価版 5 ふ フ ァ イル添付 暗号化 52 フ ォ ーム フ ィ ール ド , 入力文書の 25 フ ォ ン ト 最適化 16 文書情報項目 19 へ ページ ご と のダウン ロー ド 15 ほ 放棄 , 入力文書の特性を 24 ま マス タ ーパスワー ド 49 む 無効な XMP メ タ デー タ 21 め メ ッ セージダ イ ジ ェ ス ト , 電子署名の 66 ゆ ユーザーパスワー ド 49 ら ラ イ セ ン スキー 6 れ 例外処理 87 C の 33 レ スポン ス フ ァ イル 30 索引 103 ABC PDFlib GmbH Franziska-Bilek-Weg 9 80339 München, Germany www.pdflib.com 電話 +49 • 89 • 452 33 84-0 fax +49 • 89 • 452 33 84-99 疑問がおあ り の際は、 PDF メ ー リ ング リ ス ト と 、 tech.groups.yahoo.com/group/pdflib のアー カ イ ブ を チ ェ ッ ク し て く だ さ い ラ イ セ ン スに関するお問い合わせ [email protected] サポー ト [email protected] (お使いのラ イ セ ン ス番号をお書き く だ さ い)
© Copyright 2024 Paperzz