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

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

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

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

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

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);
        }

PDFBoxを使ってプロパティを変更する

PDDocumentからPDDocumentInformationを取得して、更新すれば良い。

        try (PDDocument document = PDDocument.load(new File("input.pdf"))) {
            PDDocumentInformation info = document.getDocumentInformation();
            info.setCreator("新しい製作者");
            info.setAuthor("新しい著者");
            info.setCreationDate(Calendar.getInstance());
            info.setKeywords("新しいキーワード");
            info.setModificationDate(Calendar.getInstance());
            info.setSubject("新しい件名");
            info.setTitle("新しいタイトル");
            document.save(new File("output.pdf"));
        } catch (IOException e) {
            logger.error("Failed to write info.", e);
        }

commons-langのLocaleUtilsの問題

今まで、

Locale displayLocale = LocaleUtils.toLocale(key);

みたいな感じで、ロケールの文字列をLocaleに変換していたのだけど、Java 8とかだとzh_Hans_CNみたいなもので例外が発生することになる。というわけで、ICU4Jで

ULocale uLocale = new ULocale(key);
Locale displayLocale = uLocale.toLocale();

という感じで置き換えることで解決できる。

JavaMailの罠

Mavenリポジトリを無邪気にJavaMailを検索して使おうとすると

<dependency>
  <groupId>javax.mail</groupId>
   <artifactId>javax.mail-api</artifactId>
  <version>1.5.2</version>
</dependency>

とか、使っても良さそうに見える。だがしかし、こいつはJavaEE用のパッケージなので、com.sun系パッケージのものたちが入っていない…。つまり、クラスが見つからないと怒られるパターン…。というわけで、JavaEEじゃない環境では

<dependency>
 <groupId>com.sun.mail</groupId>
 <artifactId>javax.mail</artifactId>
 <version>1.5.2</version>
</dependency>

を使うのが良いみたい。