2-4文書にセキュリティを設定する
これまでCookBook2(応用編)で作成してきたPDF帳票にセキュリティを設定してみましょう。
セキュリティの設定により以下の制限を持つPDF帳票をそれぞれ生成します。
- 閲覧のみ可能なPDF帳票
- 閲覧および印刷が可能なPDF帳票
- 表示の際にパスワード入力が必要なPDF帳票
まずはじめに「閲覧のみ可能なPDF帳票」の設定をおこないましょう。利用するAPIは以下の通りです。
【利用API-1】
クラス:UserAccessPermission
コンストラクタ:UserAccessPermission()
メソッド:setOwnerPassword(String ownerPassword)
【引数】
ownerPassword:PDF文書の権限パスワード
【用途】
PDF文書のセキュリティ設定を作成します。
【利用API-2】
クラス:Report
コンストラクタ:Report(File formFile, File datFile, OutPutStream fout, UserAccessPermission permission)
【引数】
formFile: テンプレートPDFファイル
datFile: フォーム定義ファイル
fout: 出力先
permission:セキュリティ情報
【用途】
セキュリティ情報を含んだ空のPDF帳票を準備します。
記述例
//UserAccessPermissionインスタンスを生成する
UserAccessPermission permission = new UserAccessPermission();
//このPDF帳票のセキュリティ設定変更時に必要な
//権限パスワードを設定する
permission.setOwnerPassword("testPassword");
//セキュリティ付PDF帳票のReportインスタンスを生成する
Report report = new Report(formFile, datFile, fout, permission);
記述されたコードはこちらをご覧下さい。
◎javaファイル:cookbook2/chapter2-4/ViewOnly.java
コードの追記が終了したら、プログラムを実行し生成されたPDF帳票を開いてみましょう。
閲覧のみが可能なことを確認してください。
◎出力されたPDF帳票:cookbook2/chapter2-4/ViewOnly.pdf
このPDF帳票の文書のプロパティ [セキュリティ] は以下のように表示されます。

先ほど作成したPDF帳票を印刷のみ実行可能としてみましょう。利用するAPIは以下の通りです。
【利用API】
クラス:UserAccessPermission
メソッド:enable(int bitToEnable)
【引数】
bitToEnable: セキュリティ設定の情報
【定数】
UserAccessPermission.PRINTING : 印刷(通常 - 暗号化レベル40bit, 低解像度 - 暗号化レベル128bit)
UserAccessPermission.DEGRADED_PRINTING : 印刷(低解像度 - 暗号化レベル128bitのみ)
UserAccessPermission.HIGHEST_QUARITY_LEVEL_PRINTING : 印刷(高解像度 - 暗号化レベル128bitのみ)
【用途】
PDF帳票に対してセキュリティ設定を行ないます。
記述例
UserAccessPermission permission = new UserAccessPermission();
//権限パスワードを設定する
permission.setOwnerPassword("testPassword");
//セキュリティ設定を行なう
permission.enable(UserAccessPermission.HIGH_QUARITY_LEVEL_PRINTING);
暗号化レベル
パーミッション設定を行なう際、暗号化レベルとして40bit、128bitを選択することが出来ます。
それぞれ以下のような違いがあります。
暗号化レベル | 互換性 |
40bit | Acrobat3.0およびAcrobat4.0 |
128bit | Acrobat5.0以上 |
- ※
- Acrobat9 から導入された、256bitAES暗号化方式へは対応しておりません。
ReportクラスのコンストラクタReport(File templatePdfFile, File datFile, OutputStream out,UserAccessPermission permission)を使用すると暗号化レベルとして128bitが使用されます。
暗号化レベルとして40bitを使用する場合にはコンストラクタReport(File templatePdfFile,File datFile, OutputStream out,int keyLength,UserAccessPermission permission)
を使用し、引数keyLengthに'40'を渡してください。
//暗号化レベルを40bitとして設定
Report report = new Report(form, dat, fout, 40, permission)
^^
【参考】
enable()メソッドに設定できる定数には印刷設定以外にも以下の設定が存在します。
詳細はこの下のコラム、チュートリアル・JavaDocをご覧ください。
UserAccessPermission.MODIFY
UserAccessPermission.MODIFY_COPY
UserAccessPermission.MODIFY_ANNOTATIONS
UserAccessPermission.FILL_IN_FORM_FIELDS
UserAccessPermission.EXTRACT
UserAccessPermission.ASSEMBLE
enable()メソッドとは逆の働きをするdisable()メソッドもAPIには準備されています。
詳細はこの下のコラム、チュートリアル・JavaDocをご覧ください。
記述されたコードはこちらをご覧下さい。
◎javaファイル:cookbook2/chapter2-4/ViewPrint.java
コードの追記が終了したら、プログラムを実行し生成されたPDF帳票を開いてみましょう。
閲覧のみが可能なことを確認してください。
◎出力されたPDF帳票:cookbook2/chapter2-4/ViewPrint.pdf
このPDF帳票の文書のプロパティ [セキュリティ] は以下のように表示されます。

最後に、これまで作成してきたPDF帳票を表示する際にパスワード入力が必要となるように変更してみましょう。利用するAPIは以下の通りです。
【利用API】
クラス:UserAccessPermission
メソッド:setUserPassword(String userPassword)
【引数】
userPassword:PDF文書のユーザパスワード
【用途】
PDF文書に対してユーザパスワードを設定します。
記述例
//ユーザパスワードを設定する
permission.setUserPassword("openPassword");
記述されたコードはこちらをご覧下さい。
◎javaファイル:cookbook2/chapter2-4/InputPassword.java
コードの追記が終了したら、プログラムを実行し生成されたPDF帳票を開いてみましょう。
開く際にパスワードの確認ダイアログが表示されることと設定したユーザパスワードの入力よって文書が開かれることを確認してください。
以下のようなダイヤログが表示されます。

◎出力されたPDF帳票:cookbook2/chapter2-4/InputPassword.pdf
Acrobatにおけるパーミッション設定
Acrobatでの代表的なパーミッション(印刷以外)の設定方法について以下に示しておきます。
参考にしてください。
(文字の抽出および注釈の操作については暗号化レベルによって設定が異なりますのでご注意下さい)
PDF文書に対して許可される操作 | プログラム内での設定内容 |
文字の抽出(暗号化レベル-128bit) | enable(UserAccessPermission.COPY)
enable(UserAccessPermission.EXTRACT) |
文字の抽出(暗号化レベル-40bit) | enable(UserAccessPermission.COPY) |
文書の変更 | enable(UserAccessPermission.MODIFY)
enable(UserAccessPermission.MODIFY_ANNOTATIONS) |
文書アセンブリ(ページ回転など) | enable(UserAccessPermission.ASSEMBLE) |
注釈の操作(編集、追加 - 暗号化レベル128bit) | enable(UserAccessPermission.MODIFY_ANNOTATIONS)
enable(UserAccessPermission.EXTRACT) |
注釈の操作(編集、追加 - 暗号化レベル40bit) | enable(UserAccessPermission.MODIFY_ANNOTATIONS) |
フィールドの入力 | enable(UserAccessPermission.FILL_IN_FORM_FIELDS) |
文字抽出以外の全ての操作 | enable(UserAccessPermission.MODIFY) enable(UserAccessPermission.MODIFY_ANNOTATIONS)
disable(UserAccessPermission.COPY) |