PDFの日付フォーマットのパース

PDFのメタ情報として格納されている更新日時はModDateとして保存されているが、日付のフォーマットがD:20040401033456-05’00’のような感じでちょっと変わっている。

今回はJavaでこの形式をパースする方法を考える。考えると言っても、PDFBoxに含まれるDateConverter#toCalendar(String)を利用するだけで良い。

final Calendar cal = DateConverter.toCalendar("D:20040401033456-05'00'");

という感じで、Calendarオブジェクトが取得できる。

Ansible Vaultを使ってみる

セキュアな情報を含んだ情報をgitとかに素の状態で置いておけないので、Ansible Vaultはファイルを暗号化してくれるらしい。別にAnsible自体を使わなくても、ansible-vaultコマンドとして利用できるようなので試してみる。

まず、インストールしてみる。とはいえ、Pythonがある前提。

$ pip install ansible-vault

これでansible-vaultコマンドが利用できるようになる。ということで、適当なファイルを作ってencryptしてみる。

$ echo secret > password.txt
$ ansible-vault encrypt password.txt
New Vault password:
Confirm New Vault password:
Encryption successful
$ cat password.txt
$ANSIBLE_VAULT;1.1;AES256
...

という感じで、password.txtの中身が変わっているのが確認できる。今度は復号化をしてみる。

$ ansible-vault decrypt password.txt 
Vault password:
Decryption successful
$ cat password.txt
secret

パスワードはencrypt時に入力したものを入れる。password.txtが元に戻ったことを確認できた。

ansibleに関係なく手軽に利用できるので便利かもしれない。

PDFBoxを使って制限を設定する

AccessPermissionでいろいろと設定した後にStandardProtectionPolicyでOwnerパスワードを設定して、PDDocumentに渡せば良い。

        try (PDDocument document = PDDocument.load(new File("input.pdf"))) {
            AccessPermission ap = new AccessPermission();
            ap.setCanAssembleDocument(false);
            ap.setCanExtractContent(false);
            ap.setCanExtractForAccessibility(false);
            ap.setCanFillInForm(false);
            ap.setCanModify(false);
            ap.setCanModifyAnnotations(false);
            ap.setCanPrint(false);
            ap.setCanPrintDegraded(false);
            // ap.setReadOnly();
            StandardProtectionPolicy spp = new StandardProtectionPolicy("12345", "", ap);
            spp.setEncryptionKeyLength(128);
            document.protect(spp);
            document.save(new File("output.pdf"));
        } catch (IOException e) {
            logger.error("Failed to write info.", e);
        }