やっぱりPDFは編集しないほうがいいかな……


はい、只今PDFの解説を書いている途中でして、PDF Reference 1.7第6版とかめっちゃ読み返しているわけでして、このドキュメント初出が2006年秋なんですね。それはそうとして、本当は日本語で読みたいわけです。でもだ〜れも細かく解説してくれませんので仕方なく(ry
そんな事はどうでもいいんですが、多分いま書いてるのが5万字超えていますので、全体をまとめ終わった頃には50万字を超過するかもしれません。多分、薄い本にしてリリースすると思いますので、しばしお待ちいただけたらと思う次第です。

で、例のAdobe社がリリースしたリファレンスなのですが、何度か読んでまして、読むたびに以前読んだところを忘れてて毎回新鮮な気持ちで読み進められます(^-^;
まあ、英語が頭に入ってこないのはいつものことなので置いておいて、今回はリファレンスを読むだけでなく日本語に落とし込んでますのでチェックしてて気になったところをちょっと実験してみました。


まずはリファレンスからの抄訳部分を

PDFを編集する場合、元のデータはそのまま改変せず変更部分を追加します。ファイルが編集作業によって更新されるときに追加されるデータ領域は実際に追加または変更されたオブジェクトのみが含まれ、その部分に該当するクロスリファレンステーブルが追加・更新されます。

2.2.7 インクリメンタルアップデートの一節(かなり意訳というかご説明的な何かになっていますが…)なのですが、PDFを編集する際の挙動について書かれています。どういうことかというと、PDFのオリジナルの部分は変更されずにそのまま残され、編集結果は別途追加の領域に記述されます。その変更データをPDFのコンテンツストリームの一部として機能させるためにクロスリファレンステーブルを更新する事で編集結果を有効にします。
PDFというファイルフォーマットその性質上、多い場合数千ページのデータが含まれます。この一部分を編集した時に後続の部分をいちいち移動することは処理効率が悪くなります。これを防ぐためにPDFをでは変更部分を別途記述し、既存の部分と新しく追加した部分を参照するクロスリファレンステーブルを変更する事でデータ構造を大きく変化させないでに編集できるように考慮されているのです。

ということでちょっと試してみましょう。

Illustratorで作ったPDFをををAcrobat DCで開きました。

これを編集して保存しちゃいます。

さて、このPDFのxrefはどうなっているかというと…

xref
0 31
0000000000 65535 f
0000000016 00000 n
0000000144 00000 n
0000048192 00000 n
0000000000 00000 f
0000049805 00000 n
0000049612 00000 n
0000348632 00000 n
0000048243 00000 n
0000048669 00000 n
0000051681 00000 n
0000051568 00000 n
0000048857 00000 n
0000049051 00000 n
0000049099 00000 n
0000049689 00000 n
0000049720 00000 n
0000049926 00000 n
0000049951 00000 n
0000050101 00000 n
0000050168 00000 n
0000050453 00000 n
0000050534 00000 n
0000051755 00000 n
0000052010 00000 n
0000053473 00000 n
0000119061 00000 n
0000184649 00000 n
0000250237 00000 n
0000315825 00000 n
0000348655 00000 n
trailer

これが変更前のクロスリファレンステーブルです。ちなみに「0 31」という表記は0番目から31個参照テーブルがあるってことです。

xref
0 1
0000000000 65535 f
2 1
0000349619 00000 n
8 1
0000397666 00000 n
30 10
0000398094 00000 n
0000398286 00000 n
0000403861 00000 n
0000404000 00000 n
0000404181 00000 n
0000404206 00000 n
0000404525 00000 n
0000404592 00000 n
0000404877 00000 n
0000404960 00000 n
trailer


こちらは編集後

この編集では元の部分がほとんど残りませんので基本的な記述がある0000000000以外が全て参照先が変更されています。
新たに追加された部分が「2 1」の0000349619以降になりますのでその部分をバイナリエディタで表示すると……

はい、この様に編集前のEOF(End of File)以降に新しいXMPメタデータが見えています。ファイルを編集するとXMPメタデータも更新する必要がありますが、PDFはオリジナルコンテンツの変更を許容しません。ですからこの様にXMPメタデータ自体も新しいものが追加されます。以降、変更内容に従ってデータストリームが作られ一番最後にクロスリファレンステーブルが付加された上で新たにEOFが追加されます。
という事で、この旧EOF以降の新しく追記された部分をファイルから削除すると……

はい、見事にロールバックしました。この仕様は署名されたPDFが改変された場合、どこが改変されているのかが検証可能な便利な仕様なのですが、PDF内に古いデータ構造が完全な形で存在するためにディスク書き込みなどの際にファイル末端を飛ばしたりするとロールバックしてしまう可能性があります。そして、壊れ方によってはそういう事が起こっていることを作業者が認識できない可能性もあります。ってか、変更部分の容量そのまま積み上げてるので容量喰ってしまう方が嫌です。
故意にこんな事するやつは居ないでしょうからどうでもいいといえばそうなのですが、細かい調整も効きませんので変更が必要な場合、元のドキュメントに戻ってやり直すというのが安全でリソース的にも優しくなるのでおすすめです。

コメントを残す

メールアドレスが公開されることはありません。