2005/12/28
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で日本語
何とかググってPDFBoxの存在まで行き着きましたが、
英語ドキュメントとJava言語に振り回されて一向に進歩してません。
このエントリーのサンプルコードを公開していただけないでしょうか?
お願いいたします。
Re:PDFBoxで日本語
(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で日本語
質問の仕方が悪かったようですが、知りたかったことは回答いただいた通りで、
1.PDFBoxを使ってのPDFからテキストファイルへの変換
2.日本語エンコーディング(CMap)のセットの仕方
に関してでした。
おかげさまで多少Java&Eclipseと格闘しましたが
とりあえず、希望していた動作を実現できました。
変換したかったPDFファイルには日本語もあったのですが、
CMapの設定をせずとも、なぜか何の問題もなく
テキスト形式に抽出することができました。
takatsukaさんのおかげでまた一歩作りたいJavaアプリに近づけました。
これからこのテキストファイルから必要箇所を抜き取ってMySQLに登録する
戦いに挑みます。
本当にありがとうございました。
Re:PDFBoxで日本語