Entry

PDF をシステムリソースの厳しい環境で読む際のお作法の話

2010年05月24日

こちらから。ちょっと気になったので,ひとり言。

まもなく日本でも発売されようとしているiPadは色々な意味で画期的なデバイスだが、あくまで位置づけはモバイル・コンピューターであり、パソコンではない。画面も大きく、CPUも高速になったとは言え、搭載するメモリ(RAM)の量はiPhone 3GSと同じだ。

そのため、メモリがふんだんにあるパソコン用に作ったPDFファイルを読もうとすると、メモリ不足でアプリが落ちたり、極端に遅くなったりしてしまう。

Life is beautiful: iPadに最適化したPDFファイルの作り方

おそらく,PDF の仕様書[PDF]を読んだことがある向きは,同じようにアレレと思うと思うんだけれども,PDF というのは,もともと二次記憶からちっとずつ読み込むことができるように設計されているんですね。

A PDF file should be thought of as a flattened representation of a data structure consisting of a collection of objects that can refer to each other in any arbitrary way. The order of the objects’ occurrence in the PDF file has no semantic significance. In general, an application should process a PDF file by following references from object to object, rather than by processing objects sequentially. This is particularly important for interactive document viewing or for any application in which pages or other objects in the PDF file are accessed out of sequence.

To support such random access to individual objects, every PDF file contains a cross-reference table that can be used to locate and directly access pages and other important objects within the file. The cross-reference table is stored at the end of the file, allowing applications that generate PDF files in a single pass to store it easily and those that read PDF files to locate it easily. By using the cross-reference table, the time needed to locate a page or other object is nearly independent of the length of the document, allowing PDF documents containing hundreds or thousands of pages to be accessed efficiently.

※強調はaian。

PDF Reference, Sixth Edition, version 1.7[PDF](p41)

version 1.3 の邦訳にもあるので,全部は訳しません。強調したところだけちょー訳しておきます。

一般に,アプリケーションプログラムは,オブジェクトをシーケンシャルに処理するのではなく,オブジェクトからオブジェクトへと(相互参照表の)参照にしたがって PDF ファイルを処理すべきである。これは特に,インタラクティブに文書を閲覧したり,PDF の各ページや各オブジェクトを順番に読まないアプリケーションにとって重要である。

つまるところ,PDF は相互参照表(cross-reference table)を読むことで,二次記憶にあるファイルにランダムアクセスすることができるから,それでやれ,とゆこと。もしそう実装されているとするなら,ページ単位で処理するアプリケーションの場合,最低限必要なメモリは,1ページ分読む分だけで済むはずです。

あたしゃかなり前に,あちこちの PDF ライブラリを評価したことがあるんですけれど,ちょっと見たところ,PDF ファイルをすべてメモリに読み込む実装が割と多かった記憶があります。どうしてそういうことをするのか,想像で言うと単に「楽だから」。ファイルを読んで,メモリ内に構文木を作ってしまえば,あとはポインタ経由で各ページにアクセスすることができます。これは,ファイルストリームをゴニョゴニョやったり,真面目に相互参照表をもとにしてアクセスするよりずっと楽です。マルチスレッドなアプリケーションとも相性がいいし,速度的にも速いはず。

しかし,iPhone や iPad のようなシステムリソースの厳しい環境で,普通の PC と同じように読むことはできない。そりゃ無理も出るだろう,とは思うわけです。あたしからしてみたら,iPhone や iPad に最適化された PDF というのは,各ページを平衡木で構成していて,でたらめな相互参照表を持っていないファイルだと言えます。巷のライブラリでは,後者の実装は割とあるけれども,前者はあまりやってないみたい(難しいから)。

もちろん,1ページに大きな画像がべったり張り付いている場合や,むやみに大量のフォントが埋め込まれている場合は,メモリを食うのも仕方ないとは思うんです。ま,それでも stream オブジェクトになっているはずだから,ある程度工夫はできそうだけれども(レンダリングしながら読むとか)。PDF ファイルを最適化するというよりは,ライブラリ側を最適化する方が先なんでねいか,とも。つらつら。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN