3.14 サンプルプログラム(9) - PDF 文書のセキュリティ設定
概要
このサンプルプログラムでは3つのPDFファイルを生成し、それぞれに異なる種類のセキュリティ設定を行います。
| No. | 出力ファイル名 | 暗号化レベル | 認証方法 |
|---|---|---|---|
| (1) | Sample9-1.pdf | Acrobat7.0以上 / 128-bit AES | パスワード ※1 |
| (2) | Sample9-2.pdf | Acrobat9.0以上 / 256-bit AES ※2 | パスワード ※1 |
| (3) | Sample9-3.pdf | 証明書 ※3 | |
- ※1文書を開くパスワード、権限パスワードはアプリケーションにて設定します。
- ※2AES256で暗号化する場合は、<JRE_HOME>/lib/security/に、local_policy.jarとUS_export_policy.jarを置く必要があります(既にある場合は、制限を受けないものに入れ替える)。Oracle JRE 8 Update 161 以降、Oracle JDK 11以降、OpenJDK 11以降の場合は置き換えは不要です。
尚、同梱しているjce_policyのzipファイルはOracleのJDK/JRE用となります。jarファイルはお客様環境に合わせて対応バージョンのファイルを選択してください。
JRE7の場合 : bs-X.X.X/jce_policy/UnlimitedJCEPolicyJDK7.zip内のjarファイル
JRE8の場合 : bs-X.X.X/jce_policy/jce_policy-8.zip内のjarファイル
Oracle以外のJDK/JREの置き換え要否、置き換え方法につきましては各ベンダーにお問い合わせください。
- ※3
本プログラムで生成した添付の出力サンプルファイルを開くにはセキュリティ証明書の設定が必要です。
Adobe Acrobat Readerの[環境設定]-[署名]-[IDと信頼済み証明書]に<biz-Stream_home>/sample/java/someone.pfxと <biz-Stream_home>/sample/java/otherone.pfxのファイルを追加してください。
パスワードについては<biz-Stream_home>/sample/java/Sample9README.txtをご覧ください。
サンプル構成
ソースサンプル
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Hashtable;
import com.brainsellers.pdf.PDF;
import com.brainsellers.xml.JaxpXML;
import com.brainsellers.xml.common.XMLSuper;
public class Sample9 {
public static void main(String[] args) {
new Sample9(args);
System.exit(0);
}
public Sample9(String[] args) {
try {
// レイアウトファイル名
String layout = "${base-dir}/sample/java/Sample1.xml";
// レイアウト情報(XML)に渡すデータのセットを行う
// ("レイアウト情報(XML)のName属性で指定された名前","データ内容")をセットする
Hashtable<String, String> ht1 = new Hashtable<String, String>();
ht1.put("title", "Sample9-1");
ht1.put("company", "ブレインセラーズ・ドットコム株式会社");
ht1.put("address", "biz-Stream v5");
ht1.put("phone", "128-bit AES");
ht1.put("fax", "BY PASSWORD");
XMLSuper xml = null;
//
// (1) 暗号化レベル Acrobat7.0以上/128bit-AESのPDFファイルを作成
// パスワードによるセキュリティ
//
// (1-1) 入出力共にファイル名で指定する
xml = new JaxpXML(layout, "${base-dir}/sample/java/Sample9-1.pdf");
// (1-2) レイアウト情報(XML)の解析を行う
xml.parse();
// (1-3) <Layout>タグの幅と高さをページサイズとして使用する
xml.setPageSize();
// (1-4) 暗号化レベル: 128-bit AES
xml.setEncryptionLevel(PDF.ENCRYPTION_LEVEL_AES_128);
// (1-5) 文書を開く際のパスワード: "user"
xml.setUserPassword("user");
// (1-6) 権限パスワード: "master"
xml.setOwnerPassword("master");
// (1-7) レイアウト・デザイナ「テキスト、画像、およびその他の内容のコピーを有効にする」にチェックが入っていないのと同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「テキスト、画像、およびその他の内容のコピーを有効にする」
xml.setCopyPermission(false);
// (1-8) レイアウト・デザイナ「スクリーンリーダーデバイスのテクストアクセスを有効にする」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「スクリーンリーダーデバイスのテクストアクセスを有効にする」
xml.setAccessibility(false);
// (1-9) 変更の許可
// レイアウト・デザイナ「注釈の作成、フォームフィールドの入力と既存の署名フィールドに署名」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「変更を許可」コンボボックス-「注釈の作成、フォームフィールドの入力と既存の署名フィールドに署名」を選択
// xml.setChangeCommentFillinSigning();
// レイアウト・デザイナ「ページの挿入、削除、回転」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「変更を許可」コンボボックス-「ページの挿入、削除、回転」を選択
// xml.setChangeOnlyAssembly();
// レイアウト・デザイナ「フォームフィールドの入力と既存の署名フィールドに署名」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「変更を許可」コンボボックス-「フォームフィールドの入力と既存の署名フィールドに署名」を選択
// xml.setChangeOnlyFillinSigning();
// レイアウト・デザイナ「許可しない」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「変更を許可」コンボボックス-「許可しない」を選択
xml.setChangeNone();
// レイアウト・デザイナ「ページの抽出を除くすべての操作」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「変更を許可」コンボボックス-「ページの抽出を除くすべての操作」を選択
// xml.setChangeEditingCommentFieldAuthoring();
// (1-10) 印刷の許可
// パラメータ (印刷の可否, 印刷可の場合の解像度(true:高解像度, false:低解像度)) による印刷の設定
// xml.setPrintPermission(false, false);
// レイアウト・デザイナ「高解像度」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「印刷を許可」コンボボックス-「高解像度」
xml.setPrintFullyAllowed();
// レイアウト・デザイナ「低解像度(150dpi)」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「印刷を許可」コンボボックス-「低解像度(150dpi)」
// xml.setPrintLowResolution();
// レイアウト・デザイナ「許可しない」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「印刷を許可」コンボボックス-「許可しない」
// xml.setPrintNotAllowed();
// (1-11) Hashtableの値をセットする
xml.setValues(ht1);
// (1-12) 座標計算を行う
xml.calcDataSize();
// (1-13) データのセットおよび座標計算を行った後、PDFを生成する
xml.toPDF();
// (1-14) PDFを出力する
xml.close();
//
// (2) 暗号化レベル Acrobat9.0以上/256-bit AESのPDFファイルを作成
// パスワードによるセキュリティ
//
Hashtable<String, String> ht2 = new Hashtable<String, String>();
ht2.put("title", "Sample9-2");
ht2.put("company", "ブレインセラーズ・ドットコム株式会社");
ht2.put("address", "biz-Stream v5");
ht2.put("phone", "256-bit AES");
ht2.put("fax", "BY PASSWORD");
// (2-1) 入出力共にファイル名で指定する
xml = new JaxpXML(layout, "${base-dir}/sample/java/Sample9-2.pdf");
// (2-2) レイアウト情報(XML)の解析を行う
xml.parse();
// (2-3) <Layout>タグの幅と高さをページサイズとして使用する
xml.setPageSize();
// (2-4) 暗号化レベル: AES 256-bit
// jre/lib/security配下のlocal_policy.jar, US_export_policy.jarを変更しておく必要がある
xml.setEncryptionLevel(PDF.ENCRYPTION_LEVEL_AES_256);
// (2-5) 文書を開く際のパスワード: "user"
xml.setUserPassword("user");
// (2-6) 権限パスワード: "master"
xml.setOwnerPassword("master");
// (2-7) レイアウト・デザイナ「テキスト、画像、およびその他の内容のコピーを有効にする」にチェックが入っていないのと同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「テキスト、画像、およびその他の内容のコピーを有効にする」
xml.setCopyPermission(false);
// (2-8) レイアウト・デザイナ「スクリーンリーダーデバイスのテクストアクセスを有効にする」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「スクリーンリーダーデバイスのテクストアクセスを有効にする」
// (「内容のコピー」が「許可しない」の時、「アクセシビリティを有効にする」を「許可」と設定しても「許可しない」と表示される)
xml.setAccessibility(false);
// (2-9) 変更の許可
// レイアウト・デザイナ「注釈の作成、フォームフィールドの入力と既存の署名フィールドに署名」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「変更を許可」コンボボックス-「注釈の作成、フォームフィールドの入力と既存の署名フィールドに署名」を選択
// xml.setChangeCommentFillinSigning();
// レイアウト・デザイナ「ページの挿入、削除、回転」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「変更を許可」コンボボックス-「ページの挿入、削除、回転」を選択
// xml.setChangeOnlyAssembly();
// レイアウト・デザイナ「フォームフィールドの入力と既存の署名フィールドに署名」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「変更を許可」コンボボックス-「フォームフィールドの入力と既存の署名フィールドに署名」を選択
// xml.setChangeOnlyFillinSigning();
// レイアウト・デザイナ「許可しない」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「変更を許可」コンボボックス-「許可しない」を選択
xml.setChangeNone();
// レイアウト・デザイナ「ページの抽出を除くすべての操作」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「変更を許可」コンボボックス-「ページの抽出を除くすべての操作」を選択
// xml.setChangeEditingCommentFieldAuthoring();
// (2-10) 印刷の許可
// パラメータ (印刷の可否, 印刷可の場合の解像度(true:高解像度, false:低解像度)) による印刷の設定
// xml.setPrintPermission(false, false);
// レイアウト・デザイナ「高解像度」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「印刷を許可」コンボボックス-「高解像度」
// xml.setPrintFullyAllowed();
// レイアウト・デザイナ「低解像度(150dpi)」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「印刷を許可」コンボボックス-「低解像度(150dpi)」
// xml.setPrintLowResolution();
// レイアウト・デザイナ「許可しない」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「印刷を許可」コンボボックス-「許可しない」
xml.setPrintNotAllowed();
// (2-11) Hashtableの値をセットする
xml.setValues(ht2);
// (2-12) 座標計算を行う
xml.calcDataSize();
// (2-13) データのセットおよび座標計算を行った後、PDFを生成する
xml.toPDF();
// (2-14) PDFを出力する
xml.close();
//
// (3) 暗号化レベル Acrobat9.0以上/256-bit AESのPDFファイルを作成
// 証明書によるセキュリティ
//
Hashtable<String, String> ht3 = new Hashtable<String, String>();
ht3.put("title", "Sample9-3");
ht3.put("company", "ブレインセラーズ・ドットコム株式会社");
ht3.put("address", "biz-Stream v5");
ht3.put("phone", "256-bit AES");
ht3.put("fax", "BY cer file");
// (3-1) 入出力共にファイル名で指定する
xml = new JaxpXML(layout, "${base-dir}/sample/java/Sample9-3.pdf");
// (3-2) レイアウト情報(XML)の解析を行う
xml.parse();
// (3-3) <Layout>タグの幅と高さをページサイズとして使用する
xml.setPageSize();
// (3-4) 暗号化レベル: AES 256-bit
// jre/lib/security配下のlocal_policy.jar, US_export_policy.jarを変更しておく必要がある
xml.setEncryptionLevel(PDF.ENCRYPTION_LEVEL_AES_256);
// (3-5) マスタ証明書を設定する
xml.appendFullRecipient("${base-dir}/sample/java/someone.cer");
// (3-6) ユーザ証明書を設定する
xml.appendUserRecipient("${base-dir}/sample/java/otherone.cer");
// (3-7) 証明書を反映する
xml.setRecipients();
// (3-8) レイアウト・デザイナ「テキスト、画像、およびその他の内容のコピーを有効にする」にチェックが入っていないのと同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「テキスト、画像、およびその他の内容のコピーを有効にする」
xml.setCopyPermission(false);
// (3-9) レイアウト・デザイナ「スクリーンリーダーデバイスのテクストアクセスを有効にする」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「スクリーンリーダーデバイスのテクストアクセスを有効にする」
// ※ setCopyPermission(false) の時のみ、xml.setAccessibility(false)が有効になる
xml.setAccessibility(false);
// (3-10) 変更の許可
// レイアウト・デザイナ「注釈の作成、フォームフィールドの入力と既存の署名フィールドに署名」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「変更を許可」コンボボックス-「注釈の作成、フォームフィールドの入力と既存の署名フィールドに署名」を選択
// xml.setChangeCommentFillinSigning();
// レイアウト・デザイナ「ページの挿入、削除、回転」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「変更を許可」コンボボックス-「ページの挿入、削除、回転」を選択
// xml.setChangeOnlyAssembly();
// レイアウト・デザイナ「フォームフィールドの入力と既存の署名フィールドに署名」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「変更を許可」コンボボックス-「フォームフィールドの入力と既存の署名フィールドに署名」を選択
// xml.setChangeOnlyFillinSigning();
// レイアウト・デザイナ「許可しない」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「変更を許可」コンボボックス-「許可しない」を選択
xml.setChangeNone();
// レイアウト・デザイナ「ページの抽出を除くすべての操作」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「変更を許可」コンボボックス-「ページの抽出を除くすべての操作」を選択
// xml.setChangeEditingCommentFieldAuthoring();
// (3-11) 印刷の許可
// パラメータ (印刷の可否, 印刷可の場合の解像度(true:高解像度, false:低解像度)) による印刷の設定
// xml.setPrintPermission(false, false);
// レイアウト・デザイナ「高解像度」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「印刷を許可」コンボボックス-「高解像度」
// xml.setPrintFullyAllowed();
// レイアウト・デザイナ「低解像度(150dpi)」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「印刷を許可」コンボボックス-「低解像度(150dpi)」
xml.setPrintLowResolution();
// レイアウト・デザイナ「許可しない」と同等
// Acrobat DC/Reader DCにおける「文書のセキュリティ」-「印刷を許可」コンボボックス-「許可しない」
// xml.setPrintNotAllowed();
// (3-12) Hashtableの値をセットする
xml.setValues(ht3);
// (3-13) 座標計算を行う
xml.calcDataSize();
// (3-14) データのセットおよび座標計算を行った後、PDFを生成する
xml.toPDF();
// (3-15) PDFを出力する
xml.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
出力結果
