レベル: 初級 Cameron Laird (Cameron@Lairds.com), Vice President, Phaseit, Inc.
2002年 9月 01日 PDFは、表示用として最高品質の出力が要求されるいろいろな分野で、標準的な仕様とみなされています。ほとんどのプログラマーは、PDFを「デスクトップ」テクノロジー、すなわちコンテンツ・スペシャリストが「名前を付けて保存 (SaveAs)」のときに選択するフォーマットと考えていますが、サーバーサイドでPDFを自動的に生成することで、文書管理を強力なものにすることも可能です。今月は、CameronがPDFに関する管理やプログラミングを行うために利用できるReportLabライブラリーを紹介します。
PDFについては、ご存じのことと思います。マーケティングの担当者が「きちんとした」パンフレットをほしいときとか、法務部門が改変されない文書を必要とする際、文書をPDF (Portable Document Format) で発行します。PDFは、文書をプラットフォームやデバイスに依存することなく作成、表示する目的で、アドビ (Adobe Systems) が定義した規格です。アドビは、共通のハードウェアを使うことで印刷の精度を向上させるPostScript (PS) を1984年に発表し、すばらしい成果を納めたわけですが、PDFは、そのPostScriptをベースにしています。基本的に、PDFの見え方 (appearance) は一定であり、Webブラウザーやプリンターなどのデバイスの違いによって見え方が変わることはありません。つまり、PDF文書の内容は「固定 (locked down)」された状態になっています。
これらの提案は、どれも厳密には真実でないのですが、ほとんどの目的では、充分それに近いものとなっています。また、PDFからは、通常、きれいな印刷が得られます。プレーン・テキストだけからなる文書の場合、大方どんなプリンターでも同じ体裁で印刷が可能です。
でも、それが皆さんとどんな関係があるというのでしょうか。皆さんは、おそらく、システム・プログラマーやサーバーサイド・プログラマーとして、PDFを単に中身のよくわからないコンテンツ・タイプの1つだと考えているのではないでしょうか。デスクトップ・ユーザーや文書のスペシャリストが、ときどき、皆さんのサーバーに置かれているPDFファイルを更新し、皆さんは、他のファイルと同じように、それらのファイルを扱っている、というわけです。皆さんが関与できるのは、そこまでと考えているのではないでしょうか。
プログラムによるPDF生成
でも、その関与の仕方では、サーバーサイドでPDFを処理するいろいろな面白い可能性が見逃されています。PDFを自動的に生成するようにすると、ソフトウェア・エンジニアリングのありとあらゆる技法を駆使できるようになります。たとえば、バージョン管理、抽象化、高品質のバックアップ、レグレッション・テストなどなどです。プログラムでPDFを生成するということは、配信されるものを管理できる方法でカスタマイズできることを意味します。おそらく、皆さんの組織でのPDFの扱いは、特定のワープロの使い方に長けた人に「メール・マージ」のような類の処理を行ってもらい、文書作成のパラメーターの設定をしてもらうというものではないでしょうか。それに対して、自動処理では、はるかに奥深いことまで行うことができます。
デスクトップ・ソフトウェア・ベンダーは、このことを部分的にしか認識していません。ワード・プロセッサーやデスクトップ・パブリッシングの数多くのパッケージが、PDF生成の少なくとも途中までの作業をサポートするスクリプティング機能を装備しています。会社によっては、PostScript画像を作成し、それをGhostscriptかそれと同様のパッケージを使ってPDFに変換しているところもあります。
しかし、PDFを自動生成する私のお気に入りの方法は、活発に維持管理されている3つのオープン・ソース・ライブラリー (ReportLab 、PJ 、PDFlib) のどれかを使用することです。これらのライブラリーは、どれもほぼ同等の性能を備えており、それらを使用したプロジェクトを、工夫することで成功させることができました。これら3つのライブラリーおよびそれ以外のツールへのリンク先は、稿末の参考文献に示してあります。
中でも、私が今一番よく使っているのがReportLabです。私が扱っている何メガ・バイトもあるPDFを処理でき、Pythonをスクリプト言語として採用するという表明は私に好都合ですし、私が日常必要としているすべての機能を装備している製品です。また、このライブラリーを開発・サポートしているReportLab社も、この事業を持続することを楽しんでいるように見受けられます。また、Pythonの対話型シェル (interactive shell) に統合できる点も好都合で、非常に快適な開発環境を構築することができます。以下、今月の「サーバー・クリニック」では、PDFプログラミングの初歩について説明したいと思います。
PDFの "Hello, world"
多分、皆さんのサーバーにはPythonが良好な形でインストールされているとは思いますが、最新のPythonかどうかは、Python.orgのダウンロード・ページで確認できます。バージョン2.2.1なら問題ありません。
Pythonがインストールしてあるとして、PDFプログラミングを始めるには、まずReportLabのダウンロード・ページを訪れてください。どんなに遅い通信速度でも、PythonとReportLab Toolkitをダウンロードしてインストールするのに、1時間もあれば充分です (これら2つのダウンロードのリンク先は、参考文献を参照してください)。
まずは、以下のような簡単なソース・コードのアプリケーションから始めるとよいでしょう。
Hello, worldを表示するだけのページを生成するためのソース・コード
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch
font = "Helvetica"
font_size = 26
text = "Hello, world"
x = 5.0 * inch
y = 8.0 * inch
destination_file = "/tmp/first.pdf"
my_canvas = canvas.Canvas(destination_file)
my_canvas.setFont(font, font_size)
my_canvas.drawRightString(x, y, text)
my_canvas.save()
|
これは、真っ白な用紙に1行の見出しを表示するだけのコードです。ありきたりながら、なんとなくそこに新しい世界があるのがわかります。フォントのスタイルやサイズ、内容、フォーマット設定を、すべてプログラミングできるという世界です。皆さんの組織がHelveticaでなくTimes New Romanを使うことにした場合、何千個もある文書をいちいちオープンしていき、変更を加え、保存し直すといったことを行わなくても、基本的に、構成を設定する代入文を1行変更し、すべてを生成し直せばよいわけです。他の文書の体裁についても同じことが言えます。たとえば、年配の読者を対象とした情報で活字を大きくしたい場合でも、アプリケーションでそれを自動化することができます。
といっても、何か意味のあることを実現するために独自のワード・プロセッサーを開発しなければならないわけではありません。ReportLabのライブラリーは、間口が広く奥深い製品で、そうしたことも可能ですが、PDFプログラミングをとてつもなく簡単にしてくれる簡便な手段 (shortcuts) もいくつかサポートしています。1つ目は、import_HTML メソッドです。これは、適当なHTMLソースをPDFページに変換してくれるメソッドです。多くのアプリケーションの場合、プロトタイプをHTMLで作成し、サンプル文書に対して「発行責任者の承認」をもらい、HTML生成のパラメーター設定を行い、そして最後に、以下のようにして文書を実装することができれば好都合です。
my_document.import_HTML(my_html_source) |
この方法だと、PDFへのコンテンツの流し込みを非常に高速に、完全にプログラムで実現でき、管理も簡単です。ReportLabの処理効率は非常に良好なもので、Web表示用のPDF文書は、どんなものでも即座に 生成できるため、快適です。したがって、適切な表示形式を維持しつつ、金融関係やエンジニアリング関係の重要な報告書に最新のデータを使用できることになります。もちろん、文書を印刷する際にも、同じカスタマイズ設定を適用できます。
PDF部品の連結
重宝するライブラリー関数の2つ目は、copyPages です。この関数は、既存のPDF文書をCanvas インスタンスの末尾に追加 (append) してくれます。copyPages を使えば、数多くの要素を連結する形で、PDF文書を簡単に構築することができます。
もっと高度な効果については、他のPDFツール・ベンダーと同様、ReportLabも、有料バージョンとして製品化しています。ReportLabの場合、PageCatcherという製品が、既存のPDF文書に注意書きを入れたり、ページの順番を変更したり、別の形で表示できるようにフォーマット変換を行ったり、(透かし模様などの) 背景を追加したり、PDFのフォームに書き込みを行う、といった機能をサポートしています。ReportLabは、〔マニュアルなどで〕PageCatcherの面白い使い方をいろいろと紹介しています。たとえば、米国税庁 (Internal Revenue Service: IRS) の申請書をプログラムで記入して作成する例などです。
私が重要だと感じたReportLabの最後の機能は、目次の管理です。アドビが「しおり (bookmarks)」とか「アウトライン」と呼んでいるナビゲーション機能は、オンライン文書の読者にとって、ありがたい機能です。ほとんどのPDFビューアーは、そのようなナビゲーション機能を、左端のウィンドウにメニューで表示します。ReportLabのリファレンス・マニュアル自体、しおり付き文書の好例となっています。copyPages などのReportLabの関数には、大きな文書にインポートする際にアウトラインを正しく処理するのか、それとも無視するのかを選択するためのオプションも用意されています。
まとめ
たとえば、「手作業で」文書を更新するような場合など、コンピューター上の作業が退屈でエラーが紛れ込みやすいと思われる場合には、処理を自動化する方法を捜すべきです。そうした態度の辿りつく先について疑問を感じる方は、LimoncelliとHoganの本についての私の書評 ("サーバー・クリニック"、2002年5月) を読み返してみてください。この本の著者たちは、原稿を用意する作業にすらmake の処理結果を用いたのでした。多くのシステム・プログラマーは認識していないようですが、PDF文書の管理作業には、自動化や抽象化を行う機会が満ち溢れています。皆さんのサーバーでも、ReportLabのライブラリーや、PDF処理が可能な他のツールを使って、PDFを細工できるようにしてみてはいかがでしょうか。そうすれば、もっと生産的なことに時間を割けるようになるのではないでしょうか。
今後「サーバー・クリニック」の記事では、この他、ExcelやWordの文書生成など、サーバーサイドの自動化に関して正当に評価されていないテーマを取り上げていきたいと思っています。
お断り: PDF関係の製品開発を専門とするいろいろな企業には、私が個人的に親しくしている人がたくさんいますが、私は、それらのどの会社とも金銭的な利害関係はなく、また通常の顧客として以外の契約関係をもったこともありません。
参考文献
PDFは、大きな大きなテーマです。しかし、PDFのことを何から何まで知っていないと、処理の自動化をうまく始めることができないというわけではありません。以下には、手始めに必要なもの以上の参考文献を示してあります。
- PDFは、PostScriptの派生物 (variation) と見ることができます。The history of PostScript (PostScriptの歴史) には、これら両者の年代的な関係が示されています。
-
The history of PDF (PDFの歴史) は、10年間の新しい技術的、商業的要求の中でのPDFの発展を説明しています。
-
AFPL Ghostscript は、関連するツールとともに、PostScriptおよびPDFのソフトウェア・インタープリターとして非常に人気があります。PostScriptの画像をオンラインで表示するための無料のビューアーとして最もよく知られています。
-
GSview は、Ghostscriptファミリーに含まれている、PDFファイルの表示・編集用のソフトウェアです。
-
ps2pdf は、PostScriptのソースをPDFに変換するオンライン・サービスです。その内部ではGhostscriptが使用されています。
-
PDFlib は、C、C++、C#、Java、Perl、PHP、Python、RPG、Tclなどなど、さまざまな開発言語との結合 (bindings) が可能な、PDF通の (PDF-aware) ライブラリーです。
-
ReportLab の文書関係の製品に、ReportLab Toolkit for PDF manipulationがあります。中でも、以下の製品が注目です。
-
Python 2.2.1 はダウンロードできます。
- 私のPDF関係の個人的なメモ・ページには、今月のコラムのテーマに関する新しいメモや参考文献を記してあります。
- CameronがこれまでdeveloperWorksに寄稿したコラムは、以下のとおりです。
- 皆さんが作成したPDFファイルを何かに利用したい場合には、ディジタル・コンテンツをいろいろなアプリケーションに統合するためのインフラストラクチャーとして、IBM Content Manager を利用することができます。
- developerWorks のLinuxゾーンには、他にもLinux関係の記事が多数掲載されています。
著者について  | 
|  | Cameronは、Phaseit, Inc. の常勤のコンサルタントです。オープン・ソースなどの技術的なトピックについて、数々の執筆や発言を行っています。Cameronのメール・アドレスはclaird@phaseit.net です。 |
記事の評価
|