見出し画像

PDFファイルの内部構造を見るためのツール

私は仕事でPDFファイルを開いてその内部構造を見る機会が多いです。
PDFの基本的なファイル構造は、ヘッダ/ボディ/相互参照表/トレーラーなどに分かれており、そのボディの中にPDFのオブジェクトが存在しています。ひとつのオブジェクトは「34 0 obj」のようにオブジェクト番号(34)と世代番号(0)と「obj」という文字列で始まり「endobj」で終わります。

PDFファイル自体はテキストエディターで開いて見ることができます。
下図は Visual Studio Code で開いたあるPDFファイルの一部です。オブジェクト番号の 32(青枠部分)と 33(緑枠部分)と 34(赤枠部分)を見ることができます。オブジェクト番号 32 と 33 はテキストとして見ることはできますが、オブジェクト番号 34 はストリームオブジェクトというタイプのオブジェクトで、そのままではどのような情報なのかが全くわかりません。

テキストエディターによるPDFファイルの中身の一部

Adobe の Acrobat(Readerではない)では下図のようにPDFファイルの内部構造を見ることができます。テキストエディターでは見ることができなかったオブジェクト番号34の中身も見ることができます。(コンテンツストリームと書かれているオレンジ色の部分です)
Acrobat の「ツール」から「印刷工程」を選択して「プリフライト」ー「オプション」ー「PDFの内部構造を参照…」を選ぶことでオブジェクト構造を見ることができるので、目的のオブジェクト番号のオブジェクトの中身を見ることができます。

Acrobatによる内部構造の参照

実は私が Acrobat で内部構造を見ることができることを知ったのは、PDFファイルの中身を見るようになってから数年後のことでした。そのため内部構造を参照するためにフリーソフトなど他のツールでGUIで操作できるものを探し出して使っていました。今回の記事はその遍歴や、私が普段使っていないツール(Windows限定)の紹介です。

PDF Analyst

私が前任者から教えてもらったのは PDF Analyst v1.20 という 2003 年製の古いツールでした。今も以下のページからダウンロードできます。
papy's softwarelibrary - PDF開発者用
下図のように目的のオブジェクト番号を選択するとその内容を表示することができます。ただしオブジェクト番号34のようなストリームオブジェクトの中身をデコードして表示してはくれません。

PDF Analyst v1.20

それを見るためには同じページにある PDF StreamDecoder v1.21 を使ってテキストファイルにデコードした内容を出力する必要があります。また、すべてのストリームオブジェクトをデコードできるわけではありません。

PDF StreamDecoder で出力したオブジェクト番号34の内容の一部

PDF StreamDecoder で出力したファイルから目的のオブジェクト番号の内容を探し出すのが大変です。オブジェクト番号34はPDFファイルの8ページ目にある2つのコンテンツストリームのうちの2番目のものであり、それが上図のものになります。

PDF Analyst は PDF ファイルのバージョン 1.4 までしか対応しておらず、私が使い始めた時点ですでに中身を見ることができないPDFファイルがたくさん流通してました。そのため新しいバージョンのPDFファイルも読めるツールを探す必要がありました。

PDF Stream Dumper

ということで最初に見つけたのが PDF Stream Dumper です。
PDF Stream Dumper
こちらからダウンロードできます。ここでは Version 0.9.624 がダウンロードできます。最終更新が 2010/07/21 となっています。こちらのページでは 2021/12/21 時点のもの(Version 0.9.627)がダウンロードできます。Supported Platforms が Win2k, XP, Vista, Win7 となっていますので、これももう古いものになります。

PDF Stream Dumper v0.9.624

これはストリームオブジェクトの中身も見ることができ、バージョン1.5以降のPDFファイルも見ることができます。結構長く使っていました。ただ UI はかなり独特でなかなか慣れることができませんでした。また上図の下部にある「PDF Path」欄のように日本語には対応できていません。

iText RUPS

その後に見つけたのが iText RUPS です。
こちらからダウンロードできます。現時点で最新バージョンは 7.2.5 です。
今のバージョンは7系ですが、私が使い始めたときは5系でした。現在も5系の最終バージョンの 5.5.9 がここからダウンロードできます。

iText RUPS

上図は古い Ver.5.5.9 でPDFファイルを開いて、オブジェクト番号34を選択した状態です。画面右側の「XRef」というタブがあるので、そこで Number が34 の行を選択すると、左側のツリーで 34 のオブジェクトまでツリーが展開され、右下の「Stream」というタブでその内容を見ることができます。
私の通常の使い方では、オブジェクト番号から探すのではなく、PDFのオブジェクトツリーの Root から問題がありそうなオブジェクトを探すということが多いので、前の PDF Stream Dumper よりも iText RUPS の方が使いやすいため、今ではこれを使っています。

バージョン7系もありますが、PDFファイルによっては画面右下にある「Console」タブに警告が表示されて、隣の「Debug Info」タブに Java のスタックトレースが表示されることが多くなりました。おそらく厳密にPDFを解析するようになったのかもしれません。私はとりあえずおとなしい 5.5.9 を使い続けています。

その他のツール

先に紹介した PDF Stream Dumper のページの下の方に Stack Overflow でPDFファイルの内部構造を見るためのツールについての記事が紹介されています。

その中でまず Mac 用として PDF Inspector があります。私は Mac を使っていないので動作させることはできません。ほかにもコマンドラインで操作するツールなどがいくつか紹介されています。GUI 操作が使えるツールもいくつかあり、iText RUPS もバージョン 5.5.6 が紹介されています。またこのページの先頭にも紹介している Acrobat でPDFファイルの内部構造を見る方法もありました。

PDF CanOpener

有償製品では PDF CanOpener の紹介があります。
Acrobat のプラグインということですが、私は使ったことないです。

PDFXplorer

PDFXplorer というツールの紹介もありました。こちらのページにあります。
DOWNLOADページを見ると最新が 1.0.0 で、最終更新が 2008/03/01 になっています。Windows10にインストールして起動してみると、「.NET Framework 3.5 (.NET 2.0 および 3.0 を含む)」をインストールする必要があると表示されます。「この機能をダウンロードしてインストールする」を選びインストールすると利用できるようになります。 

PDFXplorer 1.0.0

iText RUPS が Java で作られているため、この PDFXplorer の方が断然見やすいです。ただ単にPDFのツリー構造をたどってオブジェクトを見る分には十分な気がします。オブジェクトの内容をファイルに出力する機能もあります。画面下部に PDF4NET という有償製品のページへのリンクが定期的に右から左に流れて表示されるのがウザいですが。

ただやはり古いツールのため、暗号化されたPDFファイルは暗号化レベルが 128-bit AES(Acrobat 7.0 およびそれ以降)までしか読み込めないようです。256-bit AES(Acrobat X およびそれ以降)で暗号化されたファイルは読み込めませんでした。
ただ iText RUPS の Ver.5.5.9 も同様に 256-bit AES は読めませんでした。
Ver.7.2.5 も試しましたが、正しいパスワードを指定してもなぜか読み込むことができませんでした。

PDF Analyzer

他にも PDF Analyzer というツールの紹介もあります。現時点でのバージョンは 1.0.0.14 になっています。インストールして起動すると下図のようなユーザー登録求める画面が表示されます。とりあえず右上の×を押せば登録せずに利用できますが、毎回起動時に表示されます。

PDF Analyzer ユーザー登録画面

PDF Analyzer の画面も見やすいです。今まで紹介したツールと違うのが、画面左側にある「Preview」のタブで、開いているPDFファイルのプレビューができることです。ただし全て正しく表示できるわけではありません。罫線だけ表示されて文字列が表示されないという場合もありました。
また「Action」タブでは、開いているPDFファイルに含まれている画像を特定のフォルダーに出力する機能もあります。

PDF Analyzer Version 1.0.0.14

PDFファイルのオブジェクトのツリー構造からオブジェクトの中身を見る分には十分だと思います。ただオブジェクトの内容をファイル出力できないようなので、私の用途では機能が足りていないと思いました。

もっと頑張って探せば、他に良いものも見つかるのかもしれません。他に良いツールがあれば教えていただきたいです。


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