元ネタとしては、以前に書いた「Apache Tikaを使ってドキュメントの中身を取り出すPHPプログラム 」にてPDFファイル内のテキストを抽出しようとしたところ、PDFのセキュリティ関連の設定によって中身がうまく抽出できないケースがあったりして、Linux環境上で他にPDFの中身を取り出す方法は無いものかと調べていたらpoppler-utils内に含まれるpdftotextコマンドでうまく取り出せたよ、って話になります。
PDF内のテキストを取り出す
先に結論を書きましたが、pdftotextコマンドを使えばPDFファイル内のテキスト文を取り出すことが可能です。
pdftotextコマンドはpoppler-utilsというパッケージに含まれるため、存在しない場合はyum経由などでインストールしておきます。
# yum install poppler-utils
poppler-utilsにはpdftotext以外にもpdfinfoやpdftohtmlやpdftoppmコマンドなどが含まれています。
余談ですけど、pdf2psコマンドとかもあったりするのですが、こちらはpoppler-utilsパッケージ付属のものではなくghostscriptパッケージ付属のものです。
で、本題ですがPDFファイルからテキストデータを抽出したい場合は下記のように実行します。
$ pdftotext -raw hoge.pdf hoge.txt
上記によりhoge.pdfファイル内のテキストデータをhoge.txtに書き出してくれます。
PDFを開く際にパスワードをつけている場合は
$ pdftotext -upw yourpasswd hoge.pdf hoge
のようにパスワードを指定すれば開けたりします。
また、下記のようにセキュリティの設定をきつくしても抽出はできました(文章のメタデータにアクセスできないと書かれているのに何故)。
その外に便利なpoppler-utilsのコマンドたち
pdftotext以外にも幾つか使えそうなコマンドがあります。
PDFファイルの概要を知りたければpdfinfoコマンドが便利です。
$ pdfinfo test.pdf Title: ほげほげ計画書 Author: itboy Creator: PowerPoint 用 Acrobat PDFMaker 11 Producer: Adobe PDF Library 11.0 CreationDate: Thu Apr 21 10:01:28 2016 ModDate: Thu Apr 21 10:09:55 2016 Tagged: yes Pages: 5 Encrypted: yes (print:no copy:yes change:no addNotes:no) Page size: 822.12 x 538.68 pts File size: 308122 bytes Optimized: yes PDF version: 1.6
オプションをつければPDF内のメタデータを取り出すことも出来ます。
$ pdfinfo -meta test.pdf -snip- <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.4-c005 78.147326, 2015/04/27-13:03:03"> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pdf="http://ns.adobe.com/pdf/1.3/" xmlns:pdfx="http://ns.adobe.com/pdfx/1.3/"> <xmp:ModifyDate>2016-04-21T10:09:55+09:00</xmp:ModifyDate> <xmp:CreateDate>2016-04-21T10:01:28+09:00</xmp:CreateDate> <xmp:MetadataDate>2016-04-21T10:09:55+09:00</xmp:MetadataDate> <xmp:CreatorTool>PowerPoint 用 Acrobat PDFMaker 11</xmp:CreatorTool> <xmpMM:DocumentID>uuid:63c700ab-7219-4640-ac8d-8b4937b6a0dd</xmpMM:DocumentID> <xmpMM:InstanceID>uuid:5f189849-df3a-44ab-a78e-6c342c23d7fa</xmpMM:InstanceID> <dc:format>application/pdf</dc:format> <dc:title> <rdf:Alt> <rdf:li xml:lang="x-default">ほげほげ計画書</rdf:li> </rdf:Alt> </dc:title> -snip-
PDFファイルをHTMLファイルに変換したい場合はpdftohtmlコマンド。
pdftotextの出力結果をHTML形式にしてくれるのかと思ってましたがそうではなく、PDFをHTML表示に変換してくれるコマンドとなってます。
$ pdftohtml hoge.pdf hoge Page-1 Page-2 Page-3 Page-4
作成が完了するとHTMLファイルやPDF内で使われている画像ファイルなどが出力されます。
$ ls hoge-1_1.png hoge-2_2.jpg hoge-3_2.jpg hoge-3_5.png hoge-4_2.jpg hoge-4_5.png hoge-4_8.png hoge_ind.html hoge-1_2.jpg hoge-2_3.png hoge-3_3.png hoge-3_6.png hoge-4_3.png hoge-4_6.png hoge-4_9.jpg hoges.html hoge-2_1.png hoge-3_1.png hoge-3_4.png hoge-4_1.png hoge-4_4.png hoge-4_7.png hoge.html
ただし、結果のHTMLはオリジナルのレイアウトとかけ離れたファイルになったりしますので、あくまでHTMLファイルに変換するといった場合にしか使えそうにありません。
場合によっては、PDF内の画像を取り出したいといった場合に便利なのかもしれませんが。
PDFを画像ファイルに変換したい場合はpdftoppmコマンド。
こちらはPDFファイルをPPM(Portable PixMap file format)形式の画像に変換してくれるものなんですが、オプションでPNG形式にも変換 できます。
$ pdftoppm -r 100 -png hoge.pdf hoge
-rオプションはDPIを指定できるので解像度を適当なものに指定しましょう(デフォルトは150みたいです)。
変換すると各ページごとに画像ファイルが出来上がります。
$ ls hoge-1.png hoge-2.png hoge-3.png hoge-4.png
オプションで開始・終了ページや切り取り位置の指定などもできたりします。
PDFファイルをPDF以外の形式で見せたい場合やファイルのサムネイルを作りたいといった場合に便利かもしれません。
関連記事
Apache Tikaを使ってドキュメントの中身を取り出すPHPプログラム
[PHP] 簡単に画像の加工ができるintervention/image