トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

Linux:pdftotextコマンドでPDFからテキストを抽出

Last-modified: 2013-08-24 (土) 02:14:21 (2244d)
Top / Linux:pdftotextコマンドでPDFからテキストを抽出

Linux:pdftotextコマンドでPDFからテキストを抽出

apacheTikaをつかってPDFからテキストを抽出していたけど、縦書きのPDFがどうもうまいこと抽出できない事象に遭遇。

いろいろ調べたところ、CentOS6系では、popplerというPDFソフトウェアのコマンドラインツールでPDFからテキスト抽出ができるらしいということが分かった。

popplerとは、xPDFというOSSからフォークしたソフトらしい。

このPopplerはCentOS6系では標準で使用できるようです。

使えるかどうかはyumで確認できます。

# yum list poppler poppler-utils
Loaded plugins: fastestmirror, refresh-packagekit
Loading mirror speeds from cached hostfile
 * base: ftp.jaist.ac.jp
 * extras: ftp.jaist.ac.jp
 * updates: ftp.jaist.ac.jp
Installed Packages
poppler.x86_64          0.12.4-3.el6_0.1     @anaconda-CentOS-201111250358.x86_64/6.1 
poppler-utils.x86_64    0.12.4-3.el6_0.1     @anaconda-CentOS-201111250358.x86_64/6.1
Available Packages
poppler.i686            0.12.4-3.el6_0.1     base                                    

このpoppler-utilsにいろいろなコマンドが含まれています。

  • pdffonts
  • pdfimages
  • pdfinfo
  • pdftohtml
  • pdftops
  • pdftotext

このpdftotextコマンドを使用してPDFからテキストを抽出します。

ヘルプ出力は以下の通り。

Usage: pdftotext [options] <PDF-file> [<text-file>]
 -f <int>          : first page to convert
 -l <int>          : last page to convert
 -r <fp>           : resolution, in DPI (default is 72)
 -x <int>          : x-coordinate of the crop area top left corner
 -y <int>          : y-coordinate of the crop area top left corner
 -W <int>          : width of crop area in pixels (default is 0)
 -H <int>          : height of crop area in pixels (default is 0)
 -layout           : maintain original physical layout
 -raw              : keep strings in content stream order
 -htmlmeta         : generate a simple HTML file, including the meta information
 -enc <string>     : output text encoding name
 -listenc          : list available encodings
 -eol <string>     : output end-of-line convention (unix, dos, or mac)
 -nopgbrk          : don't insert page breaks between pages
 -opw <string>     : owner password (for encrypted files)
 -upw <string>     : user password (for encrypted files)
 -q                : don't print any messages or errors
 -v                : print copyright and version info
 -h                : print usage information
 -help             : print usage information
 --help            : print usage information
 -?                : print usage information

使い方

基本的な使い方は以下の通り。

pdftotext [PDFファイル] [出力先]

pdftotext test.pdf text.pdf.txt

ちなみに、出力先に「-」(ハイフン)を指定すると標準出力に出力します。

pdftotext test.pdf

ただ、オプションなしだと縦書きPDFは正しく出力されないようなので、「-raw」オプションを指定します。

pdftotext -raw test.pdf test.pdf.txt

これで出力すると、1文字ずつ改行されたテキストが出力されるので、改行を削除します。

pdftotext -raw test.pdf - | sed ':loop; N; $!b loop; ;s/\n//g'

こんな感じでいい感じの出力になります。

ちなみに、先頭のXバイトだけ出力する場合はこんな感じです。

pdftotext -raw test.pdf - | sed ':loop; N; $!b loop; ;s/\n//g' | cut -b 1-8096

さらに、inputディレクトリにあるすべのファイルを読み込んでoutputディレクトリに出力するスクリプトはこんな感じです。

IN_DIR="./input"
OUT_DIR="./output_cut"
LIST=`ls -1 ${IN_DIR}`

for LINE in ${LIST}
do
  pdftotext -raw ${IN_DIR}/${LINE} -| sed ':loop; N; $!b loop; ;s/\n//g' | cut -b 1-8096 -n > ${OUT_DIR}/${LINE}.txt
done

ふむふむ、簡単ですなw