オープンソース」タグアーカイブ

PDFBoxでページ指定読み込み

久しぶりにJavaでPDFを読み込む必要が出たのでPDFBoxを使って読み込んでみた。

ページごとのテキストを抽出したかったがぱっとみページ単位のオブジェクトは見つからなかった。そのためページを指定して以下のイメージで読み込み。

        PDDocument pdf = null;
        try (FileInputStream pdfStream = new FileInputStream(parsePath)) {

            PDFParser pdfParser = new PDFParser(pdfStream);
            pdfParser.parse();
            pdf = pdfParser.getPDDocument();
            int pageNums = pdf.getNumberOfPages();

            PDFTextStripper textStripper = new PDFTextStripper();
            for (int currentPage = 1; currentPage <= pageNums; currentPage++) {
                textStripper.setStartPage(currentPage);
                textStripper.setEndPage(currentPage);
                String textInPDF = textStripper.getText(pdf);

とりあえず要望は満たしているけどかっこ悪い。

LibreOfficeのアップデート失敗&対処

さっきLibreOfficeを4.1.5にバージョンアップしようとしてダウンロード&インストールをしたけど「エラー 1303.インストーラがこのディレクトリへアクセスする権限を不足しています: [インストールディレクトリ]。これ以上インストールを継続できません。アドミニストレータ(管理者)としてログオンしてください、またはシステム管理者へご連絡ください。」というようなエラーが出て失敗。(その時メモしていないのでメッセージは若干違うかもしれません。)

ユーザーに管理者権限あるのにと思いつつ念のため管理者権限起動のコマンドプロンプトでインストーラーをたたいたけどこれも失敗。

(コマンドプロンプトを管理者として起動して以下を実行)
msiexec /i LibreOffice_4.1.5_Win_x86.msi

 

しょうがないので、以下の手順を踏んでインストールしたら成功

  1. 古いLibreOfficeいったんアンインストール
  2. PC再起動
  3. 管理者権限のあるユーザでLibreOffice_4.1.5_Win_x86.msiをダブルクリックしてインストール

LibreOfficeって自分の環境だと管理者権限のあるユーザでも再起動するまで操作できない権限がよくふぁからないフォルダ/ショートカットが出来る事があるので、そいつのせいでインストーラーがこけていたんだと想像。あれってなんなんだろう??

jsoupを使ってみた

オープンソースのHTMLパーサー(Java)であるjsoupを軽く使ったのでメモ。

ざっとさわった特徴は

  • みんなが大好きMITライセンス
  • jQueryっぽく扱いが楽(少なくとも簡単な利用だと)
  • 今年の1月までは開発すすんでいた(今はとまっている??)
  • ソースは小さめかつきれいめなので手を入れることになっても難しくなさそう
  • クラス名はDocumentとかかなり一般的なので自動補完でインポートを追加しようとすると他のものが選ばれること多いので保管候補は目視で選びながらぺちぺち追加したほうがいい

インストールはMavenで指定かjarにパスを通すのみ。使ったバージョン1.7.2では依存ライブラリ無くひとつのjarで事足りた。

<dependencies>
 ……
<dependency>
  <!-- jsoup HTML parser library @ http://jsoup.org/ -->
  <groupId>org.jsoup</groupId>
  <artifactId>jsoup</artifactId>
  <version>1.7.2</version>
</dependency>
 ……
</dependencies>

 

ぐりぐりとまわしながらJsoup.connect(url).get()とhtmlをクローラー的に取得していたら

java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.io.BufferedInputStream.fill(Unknown Source)

な感じにエクセプション発生

Jsoup.connect(url).timeout(0).get();

 としてとりあえずは回避。コネクション使いきっている状態と思うので運用機とかで使うなら

org.jsoup.helper.HttpConnectionの中いじるか、ulimitとか調整した方がいいと思う。