Personal tools
You are here: Home ブログ takatsuka PDFBoxで日本語
Document Actions

PDFBoxで日本語

PDF文書からテキストを取り出す必要があって、Nutchでも使用されていることだし、PDFBoxというJavaのオープンソースを使うことにしました。

使い方は簡単で、読み取りたい文書のInputStreamやFileオブジェクトを渡してPDDocumentというオブジェクトを作ったら、後はPDFTextStripperというクラスのgetTextというメソッドにPDDocumentを渡すだけです。

ところが、やってみると、日本語の文書ではちっともテキストを出してくれません。

どうも、日本語のエンコーディングを諦めて何にも処理してくれていない風情でした。そもそもPDFのエンコーディングの決定方法とかも知らなかったのですが、日本語などはフォントに対するCMapというものでエンコーディングが決まるとか(ここら辺りは、PDFLibという商用ライブラリのマニュアルの4.7章で解説されていました。http://www.pdflib.com/jp/pdffiles/PDFlib-manual-J.pdf )。

で、PDFBoxでは、PDFontというクラスのstaticなcmapSubstitutionというMap型のフィールドでCMapを保持するみたいなのですが、日本語関係のCMapは一切、セットされていません。CMapそのものは、PDFBoxの配布の中の/Resource/cmapに一揃い用意されているのに。

ということで、半信半疑なままPDFontの中で日本語用のCMapもセットするようにしてみると、無事、テキストが出力されました。ひとまずは、めでたし。でも、試した日本語PDF文書は2つだけなので、幅広く大丈夫なのかは不明瞭なんですが。

Category(s)
Java,Open Source
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/takatsuka/pdfbox65e5672c8a9e/tbping

Re:PDFBoxで日本語

Posted by Anonymous User at 2006-01-20 01:12
私は現在、PDFファイルからテキストを抽出したいと思っているJava初学者です。
何とかググってPDFBoxの存在まで行き着きましたが、
英語ドキュメントとJava言語に振り回されて一向に進歩してません。
このエントリーのサンプルコードを公開していただけないでしょうか?
お願いいたします。

Re:PDFBoxで日本語

Posted by takatsuka at 2006-01-20 15:04
お尋ねの趣旨が、そもそもPDFBoxの基本的な利用方法に関する部分なのか、日本語文書でのテキスト抽出のためのPDFBoxのCMapに関する変更部分なのか、よくわかりませんので、一応、どちらも掲示しておきます。

(1) PDFBoxの基本的な利用方法

// 対象文書のInputStreamを作成します。
// とりあえずFileInputStreamクラスの例ですが、もちろん用途に応じて他のクラスでもいいでしょう。
InputStream inputStream = null;
try {
inputStream = new FileInputStream("対象文書のパス");
} catch (FileNotFoundException e) {
// 必要に応じたエラー処理
}

// PDDocumentオブジェクトを作成します。
PDDocument pdfDoc = null;
try {
pdfDoc = PDDocument.load(inputStream);
} catch (IOException e) {
// 必要に応じたエラー処理
}

// PDDocumentオブジェクトのテキストを抽出します。
String textInPDF = null; // 抽出テキスト
PDFTextStripper textStripper = new PDFTextStripper();
try {
textInPDF = textStripper.getText(pdfDoc);
} catch (IOException e) {
// 必要に応じたエラー処理
}


(2) 日本語処理のための変更内容

org.pdfbox.pdmodel.font.PDFontのstaticイニシャライザーに、以下を追加しました。その上で、PDFBoxの全体をビルドし直して使用しています。
cmapSubstitutions.put("90ms-RKSJ-H", "90ms-RKSJ-UCS2");
cmapSubstitutions.put("90ms-RKSJ-V", "90ms-RKSJ-UCS2");
cmapSubstitutions.put("90msp-RKSJ-H", "90ms-RKSJ-UCS2");
cmapSubstitutions.put("90msp-RKSJ-V", "90ms-RKSJ-UCS2");
cmapSubstitutions.put("90pv-RKSJ-H", "90pv-RKSJ-UCS2");
cmapSubstitutions.put("Adobe-Japan1-4", "Adobe-Japan1-UCS2");

但し、たまたま、こちらで発生した現象は回避できていますが、この処置が完全に正しいのかどうかは不明瞭です(要は私もよくわかっていません)。

Re:PDFBoxで日本語

Posted by Anonymous User 改め Zuchi at 2006-01-21 02:06
takatsuka さん ありがとうございます。

質問の仕方が悪かったようですが、知りたかったことは回答いただいた通りで、
1.PDFBoxを使ってのPDFからテキストファイルへの変換
2.日本語エンコーディング(CMap)のセットの仕方
に関してでした。

おかげさまで多少Java&Eclipseと格闘しましたが
とりあえず、希望していた動作を実現できました。
変換したかったPDFファイルには日本語もあったのですが、
CMapの設定をせずとも、なぜか何の問題もなく
テキスト形式に抽出することができました。

takatsukaさんのおかげでまた一歩作りたいJavaアプリに近づけました。
これからこのテキストファイルから必要箇所を抜き取ってMySQLに登録する
戦いに挑みます。

本当にありがとうございました。

Re:PDFBoxで日本語

Posted by Anonymous User at 2007-06-20 18:57
日本語エンコーディング(CMap)のセットの仕方に関してなのですが,EUC-Hを設定したいのですがどうすればよいか教えてください.
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.