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

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

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

*Linux:pdftotextコマンドでPDFからテキストを抽出 [#jb60be9d]

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

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

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

-xPDF:http://ja.wikipedia.org/wiki/Xpdf
-Poppler:http://ja.wikipedia.org/wiki/Poppler

この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


***使い方 [#a15f945e]

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

 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