TikaのLanguageDetector

Tikaには文字列を渡すと、その言語を渡してくれる機能がある。使うためにはまずpom.xmlに以下の依存関係を追加する。

                <dependency>
                        <groupId>org.apache.tika</groupId>
                        <artifactId>tika-langdetect</artifactId>
                        <version>1.20</version>
                </dependency>

あとは、LanguageDetectorを生成して利用する。

import java.io.IOException;

import org.apache.tika.langdetect.OptimaizeLangDetector;
import org.apache.tika.language.detect.LanguageDetector;
import org.apache.tika.language.detect.LanguageResult;

public class LanguageDetectorExample {

    public String detectLanguage(String text) throws IOException {
        LanguageDetector detector = new OptimaizeLangDetector().loadModels();
        LanguageResult result = detector.detect(text);
        return result.getLanguage();
    }
}

上記はTikaにあるexampleコードだが、OptimaizeLangDetectorをnewして、loadModels()でLanguageDetectorを取得する。あとはLanguageDetectorに言語判定したいテキストを渡せば言語情報が返ってくる。

まぁ、とはいえ、そこそこ判定が外れる気もする…。

Ubuntu 18.04でCorretto 11を使う

Corretto 11プレビューが公開されたので、使ってみることにする。まず、java-commonを入れておく

$ sudo apt-get update && sudo apt-get install java-common

次にここからCorrettoをダウンロードする。今回はjava-11-amazon-corretto-jdk_11.0.2.9-1_amd64.debをインストールする。

$ wget https://d2jnoze5tfhthg.cloudfront.net/java-11-amazon-corretto-jdk_11.0.2.9-1_amd64.deb
$ sudo dpkg --install java-11-amazon-corretto-jdk_11.0.2.9-1_amd64.deb

インストールすると設定されるので、以下で確認。

$ java -version
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment Corretto-11.0.2.9.1 (build 11.0.2+9)
OpenJDK 64-Bit Server VM Corretto-11.0.2.9.1 (build 11.0.2+9, mixed mode)

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