Frequently used words (click to add to your profile)

javaandroidc++linuxc#objective-ccocoa誰得qtrubybathyscaphegamephpguicwindows翻訳pythonomegattwitterframeworkbtronarduinovb.net計画中(planning stage)directxpreviewertestゲームエンジンdom

Recent Chamber Activity

2019-04-30

Recent Wiki Changes

2019-04-30
2019-04-22
2019-04-20
2019-04-02
2019-03-29

Wiki Guide

Side Bar

PDFからテキストを抽出するプログラム

はじめに

全文検索エンジンでPDFも検索できるようにしたい場合や、PDFを音声で読み上げるソフトを作りたい場合は、PDFからテキストを抽出する処理を組み込む必要があります。 PDFからテキストを抽出するツールやライブラリは既にいくつもありますが、BSD、MIT、Apache License等の基本的に著作権表示のみを課すタイプのオープンソース ライセンスで、かつ、.Net Framework や Java 等の巨大なランタイムを必要としないものという条件を満たすものがありませんでしたので、 自分でがんばって作ってみました。 まだうまく抽出できないケースが結構多く、未完成品ですが、とりあえず現状のものを公開します。

ライセンス

extract_pdf は下記ライブラリを使用してます。各ライブラリのライセンスも併記しています。

  • extract_pdf 本体 : Boost License
  • dlib の unicode関連 : Boost License
  • zlib : zlib License
  • rapidjson : MIT License
  • unf : MIT License
  • openNurbs の Unicode -> UTF8変換関数: コピーレフトの無い独自ライセンス
  • pdf.js の コード変換テーブル群 : Apache License Version 2.0
  • Visual Studio用 stdint.h : BSD License

ダウンロード

extract_pdfダウンロード

ソフトの説明

extract_pdf は、 PDFの文書構造を解析してjson形式に変換した後、テキスト情報を抽出するという手順で処理します。 最終的に欲しいテキストデータだけでなく、中間形式であるjsonデータも出力できるようになっていますので、 PDFの文書構造を把握したい、という用途にも利用できるのではないかと思います。

使い方

[] は省略可能です。省略された場合は、その種類のファイルは出力されません。

  extract_pdf PDFファイル名 [ -T 出力テキストファイル名 ] [ -J jsonファイル名 ]

制約

PDFは、結構自由度の高い(PDFを作る側がやり易い)仕様になっていて、PDFを読む側を作るのは結構大変です。 テキストのエンコードの仕方だけを見ても何通りもあるようでして、このソフトではまだ全てのエンコード方法を網羅できていません。 つまり、エンコード方法によって、テキストが抽出できたりできなかったりします。 今のところ、下記パターンには対応したつもりです。

ただし、文書構造の解析に失敗する可能性があり、この条件を満たしていても適切に抽出できないかもしれません。 また、セキュリティ機能(印刷不可、テキスト抽出不可、等)に関するメカニズムをまだちゃんと理解してませんので、これを有効にしたPDFも読み取れません。 なお、変換がうまくいかない文字については、'.'(ビリオド)が書き込まれるようになってます。

各ライブラリの用途、流用箇所

  • dlib の unicode関連 : 出力テキストに極力合成文字が入らないようにするため、文字が合成文字かそうでないかの判別に使用してます。
  • zlib : PDFのテキスト情報の多くはzlib圧縮されているようなので、これを展開するために使用しています。
  • rapidjson : PDFの文書構造格納と、json形式への出力に使用しています。
  • unf : 出力テキストのUnicode正規化に使用しようと思っていますが、まだ有効化してません(組み込んではありますが、unfによる正規化は掛からないようになってます。ソースコードの微修正で有効化できる状態です)。
  • openNurbs の Unicode -> UTF8変換関数: UnicodeからUTF-8に変換する処理を流用しました。
  • pdf.js の コード変換テーブル群 : Adobe-Japan1、Adobe-Korea1、Adobe-CNS1、Adobe-GB1、MacExpertEncodingMacRomanEncodingStandardEncodingWinAnsiEncoding、及び各種グリフ(\ff、\Acircumflex等) から Unicode に変換するための処理と、正規化テーブルを流用しています。
  • Visual Studio用 stdint.h : Visual C++ 2008 で開発していますので、この環境で利用可能な stdint.h を導入しました。

参考サイト

PDFの構造や文字コード変換等を知るにあたり、たくさんのWebサイトのお世話になりました。貴重な情報を提供してくださり、ありがとうございます。

PDFの文書構造

各種ライブラリ

jsonパーサ(rapidjson)の使い方の参考になりました。
zlib の使い方で参考になりました。
Unicode正規化ライブラリ「UNF」を使わせて頂きました。

Unicode関連

UnicodeをUTF-8に変換する際の参考になりました。