pdf.js:PDF を HTML5 と JavaScript で表示する
なぜ?
ソウルと台北での Firefox 4 リリースパーティーからカリフォルニアに戻る間に、私達はウェブプラットフォームでどんな事ができるかについてのクールなブレインストーミングで多くの時間をつぶしました。私達以前にそう考えた人は何人もいたでしょうが、私達はなぜ誰も HTML5 と JavaScript で PDF リーダーを実装しないのだろう、と疑問に思いました。PDF リーダーに必要とされる動作は、素早くテキストをレンダリングし、直線を描画し、画像を転送する事、そしてブラウザー上でも素早く表示する事です。ブラウザーはすでにこれらの作業に対して高度に最適化されているのです。
HTML5 に基づく PDF レンダラーを作る事ができれば、ウェッブプラットフォーム、特に canvas と SVG の API が PDF を効率的かつ忠実にレンダリングできるだけの成熟度を持っているか、という疑問への回答にもなります。
PDF をブラウザー内で表示する事は、ユーザー体験を確実に向上させるでしょう。ウェブには文字通り数百万の(数億の?) PDF が存在しており、多くのデバイスにおいて、PDF を読み込む際には異なったアプリケーションへの変更(例えば、OS X では Preview、Android では PDF View)が行われます。また、外部 PDF リーダーと多くのプラグインは、重要な PDF の機能、例えばコンテンツ内のリンクや fetch-as-you-go (HTTP の範囲リクエスト)などを充分にサポートしていません。
外部リーダーとプラグインは、独自の UI パラダイムを再発明しなければならず、その結果、例えばブラウザーで HTML ページをスクロールする方向と PDF リーダーでページをスクロールする方向が逆になるという事態が生じるのです。
私達は、HTML5 とは違って、PDF を ウェブの第一級市民として広めようとしているのではない、という事は特筆しておきます。私達が望んでいるのは、ウェブプラットフォーム上で作られたブラウザーネイティブな PDF レンダラーが、PDF を包含するウェブ技術になる事です。
利点
ブラウザーで PDF をレンダリングするには、ネイティブコードのプラグインを使用するのが通例でした。これは、Adobe 自身の PDF リーダーであっても、Adobe 以外の商用レンダラーであっても、あるいはオープンソースのもの(例えば Poppler)であっても同じでした。セキュリティの観点からすると、これは信頼されたコードベースを拡大する事であり、そのために Google の Chrome ブラウザーはコード・インジェクション攻撃を避けるために PDF レンダラーをサンドボックス化するという手間を強いられています。HTML5 に基づく実装なら、この種の問題が発生する事はありません。
プロジェクトの現状
私達は pdf.js の開発を、(github.com で)オープンにではあってもひっそりと、約1ヶ月の間、続けてきました。いくつかの大きな機能(Type1 フォントや、グラデーションなど)が完成してから、pdf.js についてより広くお知らせしようと考えていたのです。私達の作業がすぐに捕捉され、強い興味が示された事に、私達は驚きました。それで私達は、当初の予定よりも早くこの計画をブログで公開する事にしたのです。
私達のプロジェクトプランの一つとして、私達は、2009年の ACM SIGPLAN PLDI カンファレンスで行った Trace Compilation に関する論文 (訳注:リンク切れのようですが、後述される デモページ の文書と思われます)をピクセル単位で忠実にレンダリングする事を目標としています。この論文で述べられている Tracemonkey の作業によって JavaScript の JIT への道が開かれました。私達は pdf.js によってウェブプラットフォーム上にレガシーなフォーマットを実装するための扉が開かれるものと期待しています。
pdf.js のデモをご覧になりたいのであれば、この リンク をクリックして下さい。不具合や不自然なレンダリングもあるでしょうが、おおまかな所はご理解いただけると思います。Type1 の PostScript フォントはまだ実装されていませんが、Vivien Nicolas が作業中です。
この先、私達は HTML5 の canvas 要素に新たなインターフェースをいくつか追加しなければならず、PDF のスペックにある難しい機能を JavaScript で実装する方法を見つけなければなりません。技術的な概観については Chris の 記事 を、「シェーディング・パターン」のレンダリングに関する詳細は Shaon の 記事 を参照して下さい。
次には何が?
私達は、pdf.js によって、Firefox 内で「ネイティブに」 PDF をレンダリングするつもりです。直近の目標は、最もよく使われる PDF の機能を実装し、ウェブにある PDF の大多数を表示できるようにする事です。この目標には3ヶ月以内に到達できると考えています(現在のコードができるまでにかかった期間は1ヶ月弱であり、すでにかなりの数の PDF 機能をレンダリングする事ができています)。
まず、pdf.js を使用してインラインの PDF レンダリングを可能にする拡張機能を作成して、興味を持ったユーザーに提供するのが最初になるでしょうが(訳注:拡張機能は PDF Viewer として公開されています)、私達の最終的な目標はもちろん pdf.js を Firefox に同梱する事です(訳注:翻訳時で Firefox 15 のベータ版に同梱されています)。ユーザーにとっては、利便性が向上するばかりでなく、セキュリティの面でも改善になります。pdf.js は安全なウェブ言語しか使用せず、攻撃者が脆弱性を突けるようなネイティブコードは一切使用していません。
オープンソース
私達は pdf.js をコミュニティによって運営されるオープンソースのプロジェクトにしたいと思っています。Firefox には使用しますが、他にも多くのクールなアプリケーションがあるでしょう。Firefox 以外のブラウザーやウェブアプリケーションに組み込まれるのを見てみたいと思っています。標準に準拠したウェブ技術だけで書かれているので、標準に準拠したブラウザーであればコードは動作する筈です。ライセンスは非常にリベラルな三条項 BSD ライセンスであり、外部からの貢献者も歓迎します。pdf.js を改善するあなたのアイディアやコードを期待しています! github あるいは 私達の wiki に目を通すか、 IRC の #pdfjs で私達にご連絡ください。
Chris Jones と Andreas Gal (そして pdf.js チーム)