見出し画像

PDFに埋め込まれたオリジナルのファイルを取り出す

はじめに

PDFは便利ですが、中身を自由に触れなくて不便に感じることはありませんか?特に画像や動画が埋め込まれている場合、自分の使い慣れたソフトで見たいなと思うことも少なくありません。

今回は埋め込みのファイル形式(画像、動画…)に関わらずオリジナルの状態(無損失)でファイルを取り出す方法を紹介します。

方法の解説

準備

処理対象のファイルを作業しやすいディレクトリにコピーします。例として以下としました。

  • 作業ディレクトリ: C:\test

  • 処理対象ファイル名: compressed.pdf

PDFを解凍する

普段意識することはありませんが、PDFは圧縮された状態になっていることが多いです。圧縮された状態だと扱いづらいため、PDFtkというツールを使って解凍します。

PDFtk(今回の用途であれば無料版で大丈夫です)をインストールしたら、対象のファイルにuncompressコマンドを実行します。

> pdftk compressed.pdf output uncompressed.pdf uncompress
pdftkで解凍して確認

無事解凍に成功し、非圧縮のPDFファイル(uncompressed.pdf)が手に入りました。

ファイルを取り出す

PDFの仕様として、埋め込まれたファイルは「streamオブジェクト」としてPDFファイル内にそのまま埋め込まれています。具体的にはPDFファイル中で「stream」と「endstream」に囲まれた位置に記載されています。

なのでそれらの情報を手がかりに「streamオブジェクト」をテキスト処理で切り出します。

MinGWの環境が手元にあるので、例としてテキスト処理の得意なPerlを使います。(正規表現が扱える言語であればどれでも同じようにできます。)

$ perl -0777 -ne '$i = 0; while($_ =~ /stream\n([\s\S]*?)\nendstream/g){open($fh, "> data" . $i++ . ".dat") or die("error :$!"); print $fh "$1";}' uncompressed.pdf

実行するとstreamオブジェクトがファイル出力されます。

streamオブジェクトの一覧

ファイルの正体を調べてリネームする

streamオブジェクトの正体を調べて正しい拡張子にリネームします。

MinGWでファイル形式を確認するfileコマンドを実行します。

$ file * | sort -V
compressed.pdf:   PDF document, version 1.7
data0.dat:        ASCII text
data1.dat:        lif file
data2.dat:        data
data3.dat:        ASCII text
data4.dat:        ASCII text
data5.dat:        ASCII text, with very long lines
data6.dat:        JPEG 2000 Part 1 (JP2)
data7.dat:        data
data8.dat:        data
data9.dat:        data
data10.dat:       Macromedia Flash data (compressed), version 9
data11.dat:       ISO Media, Apple iTunes Video (.M4V) Video
data12.dat:       Macromedia Flash data (compressed), version 9
data13.dat:       UTF-8 Unicode text, with very long lines
data14.dat:       ASCII text
data15.dat:       data
data16.dat:       data
data17.dat:       Microsoft ICM Color Profile
data18.dat:       ASCII text
data19.dat:       ASCII text
data20.dat:       ASCII text
data21.dat:       ASCII text
data22.dat:       ASCII text
data23.dat:       ASCII text
data24.dat:       ASCII text
data25.dat:       ASCII text
data26.dat:       ASCII text
data27.dat:       ASCII text
data28.dat:       lif file
data29.dat:       data
data30.dat:       ASCII text, with very long lines
data31.dat:       JPEG 2000 Part 1 (JP2)
uncompressed.pdf: PDF document, version 1.7

JPEG2000形式の画像(data6.dat、data31.dat)や、動画(data11.dat)などが確認できます。

試しに動画である「data11.dat」を「data11.m4v」にリネームし再生してみたところ、無事再生できました。

おわりに

PDFから無損失で元の埋め込みファイルを取り出す様子を紹介しました。

記事が面白ければ、スキやフォローをもらえると更新の励みになります。Twitterも運用中なのでこちらのフォローもよろしくお願いします。

この記事が気に入ったらサポートをしてみませんか?