萌えハッカーニュースリーダー

2025/08/03 22:24 So you want to parse a PDF?

出典: https://eliot-jones.com/2025/8/pdf-parsing-xref
hakase
博士

やあ、ロボ子!今日はPDF解析について話すのじゃ。

roboko
ロボ子

PDF解析ですか、博士。PDFファイルって複雑な構造をしているんですよね。

hakase
博士

そう、ロボ子。PDFファイルは、バージョンヘッダー、クロスリファレンスへのポインタ、オブジェクトオフセット、トレーラー辞書から構成されているのじゃ。

roboko
ロボ子

クロスリファレンスって、確かオブジェクトの位置を特定するためのものですよね?

hakase
博士

その通り!PDFは、ファイル全体をスキャンせずにオブジェクトの位置を特定するために、クロスリファレンステーブル(xref)を使用するのじゃ。

roboko
ロボ子

なるほど。でも、仕様通りでないPDFファイルも多いみたいですね。

hakase
博士

そうなんじゃ。例えば、`%%EOF`マーカーがファイルの最後の行にないとか、オフセット宣言の前に改行がないとか、色々あるのじゃ。

roboko
ロボ子

`%%EOF`マーカーって、ファイルの終わりを示すものですよね。それが最後の行にない場合もあるんですね。

hakase
博士

そう、Adobe Acrobatでは、最後の1024バイト以内であれば良いらしいのじゃ。でも、それ以外の場合もあるからの。

roboko
ロボ子

他にも問題があるんですか?

hakase
博士

PDFコンテンツがゼロ以外のオフセットで始まる場合もあるのじゃ。バージョンヘッダーの前に不要なデータがある場合、ファイル内のすべてのバイトオフセットがずれてしまうのじゃ。

roboko
ロボ子

それは大変ですね。オフセットがずれると、正しい位置を特定するのが難しくなりますね。

hakase
博士

じゃから、バージョンヘッダーのオフセットをキャプチャして、最初のポインタが正しくない場合は、コンテンツ開始オフセットを加えて試す必要があるのじゃ。

roboko
ロボ子

なるほど、工夫が必要なんですね。他に興味深い問題はありますか?

hakase
博士

xrefテーブルの形式が正しくない場合もあるのじゃ。`xref`の後に改行がないとか、サブセクション内のオブジェクトエントリがヘッダーで宣言された数よりも多いとか。

roboko
ロボ子

それは解析する側からすると、かなり厄介ですね。

hakase
博士

そうなんじゃ。でも、テストされたすべてのPDFビューア(PDF.js、Adobe、Sumatra)は、これらのファイルを開くことができたらしいのじゃ。

roboko
ロボ子

それはすごいですね!ビューアが寛容に対応しているんですね。

hakase
博士

そういうことじゃ。PDF解析は奥が深いからの。ところでロボ子、PDFの中身を全部チョコレートでできたオブジェクトに置き換えるプログラムを作ってみないか?

roboko
ロボ子

ええと、博士?それはちょっと現実的ではないような… でも、面白そうですね!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search