民芸的プログラミング 〜ソフトウェア開発日記〜

アクセスカウンタ

zoom RSS バイナリエディタでPDFのフォント関連を書き換える、その方法

<<   作成日時 : 2008/01/20 23:05   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

普通にバイナリエディタでPDFを書き換えてしまうと、Adobe Readerで開く際にエラーが出るのではないかと、読者さんからコメントを頂いた。コメント欄を使ってお返事を書こうとしたけれど、長くなりそうなので、別途記事を一つ起こすことにした。PDFに細工するのに、Adobe Acrobatの機能で事足りない場合はこのテクニックがどうしても必要になる。このブログは私の備忘録でもあるので、やり方をしっかりメモしておくことにした。

まず、PDFファイルの構造を大まかに知っておく必要がある。前にも書いたかもしれないが。
PDFファイルは一般的に
・ヘッダ
・ボディ
・相互参照表
・トレーラ
の4つの部分から構成されている。
ヘッダは「%PDF-1.4」などというように、PDFのバージョン番号を現す1行だけ。
ボディは実際に画面に表示されるデータなどの本体。データは数字や文字列、ストリームといったオブジェクトという単位で管理されている。それぞれのオブジェクトが固有の番号(ID)を持ち、親子関係で結ばれ、全体ではツリー構造となっている。
相互参照表にはファイルのどの位置にどのオブジェクトがあるかが記録されており、これを使うことでファイル内から素早く目的のオブジェクトにアクセスすることができる。
トレーラはファイル全体のオブジェクト数だとか、オブジェクト・ツリーの根っこがどのオブジェクトであるかなどが記録されている。

ここで、安直にバイナリエディタでPDFを触ってしまうとどうなるか。運が良ければ何も起こらない。しかし、データの長さが変わるような変更を加えてしまうと、ファイル内でのオブジェクトの位置がずれてしまい、相互参照表が狂ってしまうことになる。Adobe Readerなどは多少はお利口なので、少々オブジェクトの位置がずれても「修復しています」とか画面に表示したうえで、何とかPDFを表示してくれたりもする。が、それでは格好悪いので、データを人に渡す際などはpdftkなどを使って相互参照表を作り直すことになってしまう。

しかし、私のように、ちょっとだけテストをしてみたい場合には、いちいちpdftkを持ち出すのも面倒だ(ちょっと面倒くさがりすぎのような気もするが)。そこで、安直な方法がある。
例えば「Ryumin-Light」を「MS-Mincho」にしたい場合、「Ryumin-Light」は12文字、「MS-Mincho」は9文字なので、データの長さが変わらないように「MS-Mincho 」(oの後ろにスペース3つ)としてやれば、オブジェクトの位置がずれず、相互参照表は崩れない。PDFデータ内において、スペースは読み飛ばされるので他の部分に影響はない。これはあくまで書き換え後のデータのほうが短いからできる技なのだが、使える箇所は多い。埋め込まれたフォントを一時的に使わなくする場合などにも使える。
ただし、これをやる際には、「まともな」バイナリエディタが必要になる点に注意してほしい。普通のテキストエディタでこの作業をやると、勝手に改行コードが書き換えられたりして相互参照表どおりの位置にオブジェクトを保存してやることができなくなったりするのだ。
あくまでバイナリエディタで作業しなければならない。

この作業に私は c.mos さん作のバイナリエディタ BZ ( http://www.zob.ne.jp/~c.mos/soft/bz.html )を愛用している。この場を借りて、c.mosさんに謝意を表明したい。

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
バイナリエディタでPDFのフォント関連を書き換える、その方法 民芸的プログラミング 〜ソフトウェア開発日記〜/BIGLOBEウェブリブログ
文字サイズ:       閉じる