PDFからコマンド操作で画像を取り出す方法
スポンサーリンク
財務省やらかし案件がらみで。PDFを画像化するのではなく、内部に含まれる画像を取り出そうという話です。
財務省の公開しているPDF,差し替え前の黒塗りが外せる状態のPDFが入手できるとのこと。
これはOCRやり直しか……。
ページ数とPDF内の画像数は一致しているので、どうやら画像の上に黒い四角形をPDFの描画命令で重ねているっぽいです。
PDFを画像化するのではなく、PDFに1ページ1画像ずつ含まれている画像データを抜き出すと、黒塗り前の画像がそのまま入手できます。
文書をスキャンして、何かのツールで黒い四角形を重ねて、その後PDF出力の際にPDF出力用のソフトが下地とマスクを結合せずにPDF化したんでしょうか。
再発防止のためにも詳細を知りたいところ。
黒塗りが外せる方のPDFのメタデータによると、 "Creator"、”Producer"ともに、"Adobe Acrobat Standard DC 15.6.30413"。
ちなみに差し替え前のマスクが外せるファイルはPDFバージョン1.6。差し替え後のファイルはPDFバージョン1.5。面白い。
なお、スキャンした画像データの正しい黒塗りの仕方としては、黒くマスクしてレイヤー情報のない画像形式として出力して、そのあとPDF化すべきだったのかな。
Adobe Acrobat DCがあるなら、画像化する前に機密情報の削除ツールを使うべきだったのでは……。
詳細な手順:ASCII.jp:PDFファイルの見せたくない部分を完璧に墨で消す方法|柳谷智宣がAdobe Acrobat DCを使い倒してみた
前置きは以上。
PDFからの画像の取り出し
QPDF、Coherent PDFには画像抽出オプションはない。QPDFの方はできそうな気はするけど、バイナリデータの状態になってしまうと思う。
PythonのライブラリでやるならPDFMinerか。PDFのオブジェクトストリームだか何かの圧縮を外さないといけないと思う。
Popplerの付属コマンド
Popplerの付属コマンド、pdfimages
を使う。
PopplerをインストールするとおまけでPDF関連コマンドがついてくる。 mac環境ならHomebrew経由でインストールできる。
$ brew install poppler
デフォルトの出力形式はpbm
形式。-png
や-tiff
オプションで出力形式を変更できる。最後の引数に出力ファイルの接頭辞を指定する。スラッシュ区切りのパスを指定すると特定フォルダ以下に取り出した画像ファイルが保存される。
$ mkdir output $ pdfimages -png input.pdf output/image
上記の場合、
出力ファイル名のファイル名はimage-000.png
という形で先頭からの通し番号(ゼロからスタート)がつく。変更したい場合は-p
オプションをつけるとPDF側のページ番号を付きで出力される。
$ pdfimages -p -png 20180523p-1.pdf output/image
出力ファイル名はimage-001-000.png
。
画像は白黒反転しているのでImageMagickあたりで変換する。
mutool (mupdf)
mac環境でのインストールはコマンド一発。
$ brew install mupdf-tools
画像の抽出は、
$ mutool extract filename.pdf
または、
$ mutool extract filename.pdf 画像のオブジェクト番号
出力ファイル名はimg-1315.png
のようになる。1315
という数字はページ番号ではなくPDF内部での画像データのオブジェクト番号。
この場合、PDF内部でのオブジェクト番号を含んだファイル名となり、対応関係が非常にわかりにくい。
PDF内部でのオブジェクト番号と、ペー内での並び順は下記のコマンドで確認できる。
$ mutool info filename.pdf
なお、このツールでも抽出した画像は白黒反転している。
番外編
WebサービスでPDFから画像を取り出すものがある。あとは素直にAdobe Acrobat Pro DC。
ベルリンの会社が運営している?
まとめ
いろいろあるだろうと思ったら結局、Popplerとmutoolか。
まあ普通に外せましたよ、財務省様。誰がどういう経緯で気づいたんだろう。とりあえず交渉記録しかゲットしてませんが、他のもあるのか?
めんどいから流石に手を出しませんが。
後でもうちょっと読みやすく書き直す、かも。