pdftkのuncompress機能の挙動についての留意点

このブログで何度も紹介しているが、PDFファイルをコマンドラインで操作するのに便利なpdftkというツールがある。日本語のファイル名が扱えないという問題があるものの、PDFファイルを分割したり、パスワードをかけたりといった用途に結構便利に使える。
そういった便利機能の一つにuncompress機能がある。
普通の人はPDFファイルのデータ構造など気にしないだろうが、お仕事でお客様のところに届けたPDFに異常が見つかったり(こちらではうまく表示されるのに、お客様のところではうまく表示されない)した場合には、最後の手段として、PDFの中身を目で確認する必要が生じたりする。
PDFファイルをバイナリエディタで開くと、ところどころテキストが埋まっているのが見えるが、全体構造はよく分からないはずだ。まれに圧縮のかかっていないPDFがあって、その場合は、普通のテキストエディタで簡単に開くことができたりする。が、今時のPDFはほとんど圧縮がかかっていて、これをどうにか展開しないと、PDFファイルの構造は人間の目では確認しようがないのだ。
そんなときにコマンドラインで「pdftk 元のファイル名 output 書き出すファイル名 uncompress」 とやると、PDFファイルの圧縮データが展開され、ごく一般的なテキストデータになるので、メモ帳など一般のテキストエディタで開いて中の構造を確認できるようになる。一部のデータはUTF16形式のままだったり、埋め込まれたフォントはバイナリデータのままだったりするのだが、それでも元の圧縮のかかったPDFよりははるかにとっつきやすい。
と、こういうようにして、私は今までpdftkを愛用してきたのだが、昨日、ちょっとした挙動に気付いたのでメモしておく。

私はてっきり、pdftkのuncompress機能は元のPDFの圧縮データ部分を展開するだけ(およびそれにともなうオブジェクト参照の補正)だと思っていたのだが、元の圧縮PDFと比較すると、PDF内のオブジェクトのID番号が変わっている。オブジェクトのファイル内での並び順も入れ代わっている。
単に圧縮された部分を展開しているだけではなく、PDF全体を一度パースして、そのパースしたデータを元に改めて新しい非圧縮のPDFを作ったうえで書き出しているようだ。意味は同じでもデータとしての見た目はまったく違うPDFが作られているのだ。
なので、uncompressで書き出されたデータを参照しながら、元のPDFをバイナリエディタで編集しようとすると、オブジェクトIDやデータの並びが変わっていて思わぬ落とし穴にはまることになる。
いや、すでに一度はまって大変な目にあったのだが。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック