Linux:pdftotextコマンドでPDFからテキストを抽出
Last-modified: 2013-08-24 (土) 02:14:21 (3753d)
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