PDFlib

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

PDFlib で三種類のパスワードを設定する

PDF ではパスワードを設定して文書を暗号化したり、ページの印刷や文章のコピー等を制限することができます。これらの設定は PDFlib でも文書作成時に行うことができます (※)。ここでは、PDF で設定できるセキュリティ項目について解説した後、実際に PDFlib で PDF を作成します。

※ 既存の PDF 文書に対してパスワードを設定する場合、PDFlib PLOP を使用します。

設定できるパスワード

PDF に設定できるパスワードは下記の通りです。

  • PDF を開くためのパスワード
  • 添付ファイルを開くためのパスワード
  • 上記のパスワードやその他の権限を設定、変更するためのパスワード

Adobe 社では上記のパスワードをそれぞれ、文書を開くパスワード、添付ファイルを開くパスワード、権限パスワードと呼んでいます。対して PDFlib では文書を開くパスワードをユーザーパスワード、権限パスワードをマスターパスワード、添付ファイルを開くパスワードを添付パスワードと呼んでいます。

Adobe 社PDFlib
文書を開くパスワードユーザーパスワード
(userpassword)
権限パスワードマスターパスワード
(masterpassword)
添付を開くパスワード添付パスワード
(attachmentpassword)

また、PDFlib ではユーザーパスワードとマスターパスワードについて、Adobe Acrobat とは異なる制限があります。

  • ユーザーパスワードを設定する場合は必ずマスターパスワードも設定する必要がある
  • ユーザーパスワードとマスターパスワードを同じにすることはできない

これらは Adobe Acrobat にはない制限ですが、文書を開くパスワードさえ知っていればパスワードを外せてしまう事態を防ぐためと思われます。一方添付ファイルを開くパスワードについては、マスターパスワードがなくても設定することができます。

ユーザーパスワードや添付パスワードが設定された場合、PDFlib は出力ファイルを暗号化します。これにより、設定されたパスワードを知らないユーザーはファイルを見ることはできません。

設定できる権限

マスターパスワードを設定していると、PDF ビューワーの機能の一部を制限することができます。設定できる権限は以下の通りです。

  • 印刷の禁止、または高画質印刷を禁止
  • フォームフィールドの追加等の文書の変更を禁止
  • テキストやイメージのコピーを禁止
  • フォームフィールドへの記入を禁止
  • アクセシビリティのためのテキストやイメージの抽出を禁止
  • ページの挿入や削除、回転等の編集の禁止
  • 文書を開くパスワードを設定時、XMP メタデータは暗号化しないよう設定

これらの制限は PDF ファイルに付加情報として設定され、Adobe Acrobat 等多くの PDF ビューワーでは正しく適用されます。しかしながら、設定を無視するような PDF ビューワーもあり、その場合は適用されません。

サンプルコード

以下に文書を開くパスワードと添付パスワードを設定した PDF を出力するサンプルコードを記載します。文書を開くパスワード (ユーザーパスワード) を設定する場合、マスターパスワードも必ず設定する必要があります。

また、permissions オプションにより、PDF の印刷とテキストのコピーを制限しています。


/*
 * パスワードと権限を設定した PDF を作成するサンプルコード
 */
import java.io.*;
import com.pdflib.pdflib;
import com.pdflib.PDFlibException;

public class security {
    public static void main(String[] args) {
        pdflib p = null;
        int font;
        String optlist;

        try {
            p = new pdflib();

            p.set_option("searchpath=../data");
            p.set_option("searchpath=../resource/fonts");
            p.set_option("FontOutline={MS-Gothic=msgothic.ttc}");

            // 文書を開くパスワード (userpassword) と
            // 権限パスワード (masterpassword) を設定
            optlist = "userpassword=hoge masterpassword=fuga";

            // 印刷とコピーに関する権限を設定
            optlist += " permissions={noprint nocopy}";

            optlist += " attachments={{description={パスワード付き添付ファイル}" +
                       " filename={nesrin.jpg}}}";

            // 添付ファイルを開くパスワード (attachmentpassword) を設定
            optlist += " attachmentpassword=bar";

            font = p.load_font("MS-Gothic", "unicode", "");
            p.begin_document("security.pdf", optlist);
            p.begin_page_ext(0, 0, "width=a4.width height=a4.height");

            optlist = "font=" + font + " fontsize=24";
            p.fit_textline("パスワード付き PDF", 50, 700, optlist);

            p.end_page_ext("");
            p.end_document("");
            p.close_font(font);
        }
        catch (PDFlibException e) {
            System.err.println("例外が発生しました");
            System.err.println("例外コード: " + e.get_errnum());
            System.err.println("例外メッセージ: " + e.get_errmsg());
            System.err.println("API 名: " + e.get_apiname());
        }
        catch (Exception e) {
            System.err.println(e.getMessage());
        }
        finally {
            if (p != null)
                p.delete();
        }
    }
}
Java 1.7 / PDFlib 9
(Jan 30, 2018 - )
  • 取得したリンクの座標が見た目と合わない場合の対処法
  • お問合せ
  • PDFlib 6 からの移行