« SFマガジン編集部編「SFが読みたい!2015年版」早川書房 | トップページ | SFマガジン2015年4月号 »

2015年2月27日 (金)

John Whitington「PDF構造解説」オライリージャパン 村上雅章訳

本書を先頭から読み進めるだげで、核となる概念を効率よく吸収でき、PDFというフォーマットの内部構造を理解できるようになります。そしてpdftk というフリーウェアの力を借りることで、テキストエディタを使って手作業でPDFファイルを作成したり、プログラムから直接PDFファイルを出力できるようにもなります。
  ――訳者まえがき

【どんな本?】

 PDF(Portable Document Format)は、文書形式の一つだ。主に印刷物など、レイアウトが決まった文書に向く。Adobe Systems が開発し、2008年7月に ISO 32000-1 として国際規格となった。

 インターネット上でも、官公庁が公開する資料や、一般に配布する申請用紙などで使われている。また、Microsoft Word や Adobe Photoshop などのコンピュータで作った文書を書籍化する際は、PDF で入稿する場合が多い。

 普及が進む PDF だが、その構造を知るのは難しい。公開の仕様書は膨大な頁数で、理解するには多くの前提知識が必要だ。この本は、「とりあえず大雑把にPDFの概略を掴みたい」という人向けに、「PDFとは何か」「どんな要素を持っているか」「どんな形式で記述しているか」を解説する。

【いつ出たの?分量は?読みやすい?】

 原書は PDF Explained, by John Whitington, 2012。日本語版は2012年5月22日初版第1刷発行。単行本ソフトカバー横一弾組みで本文約219頁。9ポイント37字×32行×219頁=約259,296字、400字詰め原稿用紙で約649枚だが、サンプル・コード/サンプル出力/イラスト/表などを多数収録しているので、実際の文字数は6~7割ほど。

 日本語の文章は少々堅い。オライリーの翻訳本では平均的なレベルかな? 内容の難しさは、評価がややこしいので後述。当然ながら、これ一冊でPDFの全てを賄う本ではない。詳しく知りたければ、正規のドキュメントを読もう。また、オライリーの本だけあって、プログラミングの経験がないと辛い。

【構成は?】

 1章~4章は必ず読もう。全体の基礎となる部分だ。5章以降は、気になる所だけを拾い読みすればいい。

  • 訳者まえがき/まえがき
  • 1章 はじめに
    • 1.1 簡単な歴史
      • 1.1.1 ページ記述言語
      • 1.1.2 PDFの開発
      • 1.1.3 PDFのメリット
      • 1.1.4 ISO規格
      • 1.1.5 特殊なPDF
      • 1.1.6 各バージョンの概要
    • 1.2 PDFファイルの内部はどうなっているのか?
      • 1.2.1 テキストとフォント
      • 1.2.2 ベクタイメージ
      • 1.2.3 ラスタイメージ
      • 1.2.4 カラースペース
      • 1.2.5 メタデータ
      • 1.2.6 ナビゲーション
      • 1.2.7 オプショナルコンテンツ
      • 1.2.8 マルチメディア
      • 1.2.9 対話型フォーム
      • 1.2.10 論理構造と再フロー 
      • 1.2.11 セキュリティ
      • 1.2.12 圧縮
    • 1.3 どういった人々がPDFを使うのか?
      • 1.3.1 印刷業界
      • 1.3.2 電子書籍と出版
      • 1.3.3 PDFのフォーム
      • 1.3.4 文書のアーカイブ
      • 1.3.5 ファイルフォーマットとして
    • 1.4 便利な無償のソフトウェア
  • 2章 簡単なPDFファイルの作成
    • 2.1 PDFの基本的なシンタックス
      • 2.1.1 ドキュメントコンテンツ
      • ページコンテンツ
      • ファイル構造
    • 2.2 ドキュメント構造
    • 2.3 要素を組み立てる
      • 2.3.1 ファイルヘッダ
      • 2.3.2 主となるオブジェクト
      • 2.3.3 グラフィックスコンテンツ
      • 2.3.4 カタログと相互参照テーブル、トレーラ
    • 2.4 すべてをまとめる
    • 2.5 補足
  • 3章 ファイル構造
    • 3.1 ファイルレイアウト
      • 3.1.1 ヘッダ
      • 3.1.2 本体
      • 3.1.3 相互参照テーブル
      • 3.1.4 トレーラ
    • 3.2 字句規約
    • 3.3 オブジェクト
      • 3.3.1 整数と実数
      • 3.3.2 文字列
      • 3.3.3 名前
      • 3.3.4 ブーリアン値
      • 3.3.5 配列
      • 3.3.6 辞書
      • 3.3.7 間接参照
    • 3.4 ストリームとフィルタ
    • 3.5 インクリメンタル更新
    • 3.6 オブジェクトと相互参照ストリーム
    • 3.7 直線化PDF
    • 3.8 PDFファイルの読み込み方法
    • 3.9 PDFファイルの書き出し方法
  • 4章 ドキュメント構造
    • 4.1 トレーラ辞書
    • 4.2 ドキュメント情報辞書
    • 4.3 ドキュメントカタログ
    • 4.4 ページとページリスト
    • 4.5 テキスト文字列
    • 4.6 日付
    • 4.7 すべてをまとめる
  • 5章 グラフィックス
    • 5.1 コンテンツストリームの内容を覗いてみる
    • 5.2 オペレータとグラフィックスの状態
    • 5.3 パスの生成と塗りつぶし
      • 5.3.1 ベジェ曲線
      • 5.3.2 図形の塗りつぶしとワインディング規則
    • 5.4 カラーとカラースペース
    • 5.5 変換
    • 5.6 クリッピング
    • 5.7 透明度
    • 5.8 シェードとパターン
    • 5.9 フォームXObject
    • 5.10 イメージXObject
  • 6章 テキストとフォント
    • 6.1 PDFにおけるテキストとフォント
    • 6.2 テキストの状態
    • 6.3 テキストの印字
      • 6.3.1 テキストの選択
      • 6.3.2 テキスト空間とテキストの位置決め
      • 6.3.3 テキストの描画
    • 6.4 フォントの定義と埋め込み
      • 6.4.1 PDFにおけるフォントタイプ
      • 6.4.2 Type1フォント
      • 6.4.3 フォントのエンコーディング
      • 6.4.4 フォントの埋め込み
    • 6.5 ドキュメントからテキストを抽出する
    • 6.6 リリース
  • 6.5章 日本語の取り扱い
    • 6.5.1 サンプルコード
    • 6.5.2 フォント辞書
      • 6.5.2.1 エンコーディング
    • 6.5.3 CIDフォント辞書
      • 6.5.3.1 CIDシステム情報
    • 6.5.4 フォントディスクリプタ
    • 6.5.5 ページのコンテンツ
  • 7章 ドキュメントのメタデータとネビゲーション
    • 7.1 しおりとデスティネーション
      • 7.1.1 デスティネーション
      • 7.1.2 ドキュメントアウトライン(しおり)
    • 7.2 XMLメタデータ
    • 7.3 注釈とハイパーリンク
    • 7.4 ファイルの添付
  • 8章 ドキュメントの暗号化
    • 8.1 はじめに
    • 8.2 暗号化辞書
    • 8.3 暗号化されたドキュメントの読み込み
    • 8.4 ドキュメントの暗号化と書き込み
    • 8.5 暗号化されたドキュメントの編集
  • 9章 pdftkを用いた作業
    • 9.1 コマンドラインシンタックス
    • 9.2 ドキュメントのマージ
      • 9.2.1 ファイルをマージした際に起こること
    • 9.3 ドキュメントの分割
      • 9.3.1 ファイルを分割した際に起こること
    • 9.4 スタンプと透かし
      • 9.4.1 スタンプを追加した際に起こること
    • 9.5 メタデータの抽出と設定
    • 9.6 ファイルの添付
    • 9.7 暗号化と復号化
      • 9.7.1 暗号化されたファイルの復号化
      • 9.7.2 ファイルの暗号化
    • 9.8 圧縮
  • 10章 PDFソフトウェアと参考文献
    • 10.1 PDFビューア
      • 10.1.1 Adobe Reader
      • 10.1.2 プレビュー
      • 10.1.3 Xpdf
      • 10.1.4 GSview
    • 10.2 ソフトウェアライブラリ
      • 10.2.1 JavaおよびC#向けのiText
      • 10.2.2 PHP向けのTCPDF
      • 10.2.3 Perlを用いたPDFの処理
      • 10.2.4 Mac OS X上のPDF
    • 10.3 フォーマットの変換
      • 10.3.1 PDFからPostScriptへ、またはその逆への変換
      • 10.3.2 PDFのラスタ化によるイメージへの変換
      • 10.3.3 ファイルの印刷によるPDFへの変換
    • 10.4 PDFの編集
      • 10.4.1 Adobe Acrobat
      • 10.4.2 Mac OS X のプレビューを用いた編集
    • 10.5 PDFとグラフィックスの参考文献
      • 10.5.1 ISO32000とPDFファイル形式
      • 10.5.2 PDF Hacks
      • 10.5.3 関連する話題
      • 10.5.4 フォーラムとディスカッション
      • 10.5.5 Adobeのウェブサイトにあるリソース
  • 付録A JavaScriptの埋め込み(古?一浩)
    • A.1 埋め込みの基本
      • A.1.1 文書アクションでのJavaScript埋め込み
      • A.1.2 フォームレベルでのJavaScript埋め込み
      • A.1.3 ページレベルでのJavaScript埋め込み
      • A.1.4 PDF読み込み時のJavaScript埋め込み
      • A.1.5 一括してJavaScriptを編集する
    • A.2 JavaScriptのデバッグ
      • A.2.1 デバッガーの起動
    • A.3 しおりを階層化テキストで書き出す
    • A.4 閲覧期限を限定する
    • A.5 閲覧回数を表示する
    • A.6 フルスクリーンモードにする
    • A.7 自動的にしおりを作成する
    • A.8 スライドショー
    • A.9 ゼロパディング
    • A.10 メニューの実行
    • A.11 アクション/バッチ処理
    • A.12 その他のJavaScript
    • A.13 JavaScriptコードを一括して削除する
  • 付録B 電子書籍に便利なツール集(千住治郎)
    • B.1 文字列を検索する――pdfgrep
      • B.1.1 poplerライブラリ
    • B.2 PDFを比較する――diffpdf
    • B.3 pdftkのGUI――pdfchain
    • B.4 WISIWYGなPDFエディタ――pdfedit
    • B.5 PDFの版管理機能――pdfresurrect
      • B.5.1 処理内容
      • B.5.2 pdfresurrectの機能
      • B.5.3 利用形態(案)
    • B.6 PerlのText::PDFモジュール
    • B.7 電子書籍の管理――calibre
  • 索引

【感想は?】

 以下三つの条件を全て満たす人向けの本だ。

  1. PDFに興味がある。
  2. プログラミングの経験がある。
  3. 文字や図形の描画について、多少の知識がある。

 加えて、できれば Adobe Illustrator を使い込んでいると、感覚を掴みやすいだろう。

 「PDFに興味がある」といっても、その程度は様々だ。だいたい、次の三段階に分かれるだろう。

  1. 「PDFとは何か」を知りたい
  2. 「PDFで何ができるか」を知りたい
  3. 「ソレはどうやればいいのか」を知りたい

 後の方ほど、細かく詳しい解説が必要になる。この本は、2. と 3. の中間あたりまでを満たす内容だ。「PDFで何ができるか」は、だいたい見当がつく。だが、実際にPDFを扱うプログラムを作るには、Adobe Systems から分厚い仕様書を手に入れる必要がある。

 基本的に「ザッと軽く流し読みして、細かい所は Adobe の仕様書を読んでね」という本である。これ一冊でPDFの全てを賄う本ではない。また、プログラミングの経験がないと、読んでもナニを言ってるのか見当もつかないだろう。B木は、まあわからなくても大きな問題はないだろうが、「相互参照テーブル」がわからないと、かなり厳しい。

 「軽く流し読み」が前提の本とはいえ、それぞれの章は、相応の前提知識が必要だ。

 2章~3章では、少なくともASCIIとUnicodeの違いがわかる程度には文字コードの知識が必要である。さすがに16進ダンプをスラスラ読める必要はないが、0x20と聞いて「ASCIIの空白ね」と分かる程度には知らないとマズい。少なくとも、テキスト・ファイルとバイナリ・ファイルの違いは分かっている必要がある。

 「5章 グラフィックス」では、「マイター結合」だの「ワインディング規則」だの「カラースペース」が出てくる。これらは Adobe Illustrator を使い慣れていたり、PostScript を知っていれば、雰囲気を掴みやすい。つかCTM(Current Transformation Matrix)がピンと来る人は滅多にいない…いや、CGの世界じゃ常識なのかな?

 「6章 テキストとフォント」も、相当に突っ込んだ話が次々と出てくる。「レディング」「カーニング」「グリフ」…。文書を作る際に、Microsoft Wrod ではなく、Adobe InDesign や Quark XPress を使う人向けの内容である。

 そんなわけで、全部を真面目に通して読む人は、滅多にいないだろう。大半の人は、1~4章を軽く流し読みして、5章以降は意味不明な所を飛ばしながら読む、そんな読み方になると思う。というか、全体を完全に理解しながら読める人は、素直に Adobe から正規の文書を手に入れた方がいい。

 私は「どうせ PostScript+αだろう」と思っていたんだが、だいぶ違うので驚いた。ラスタ画像がなきゃテキスト・ファイルな PostScript に比べ、PDFはヘッダから ox80 以上のバイトが出てくる。バイナリとテキストが混在した、ややこしい形式なのだ。

 単純な頁の並びかと思っていたが、終端近くに「各オブジェクトのバイト・オフセット」が入ってるし。これじゃテキトーに中身を入れ替えたら、ズレて使い物にならなくなるじゃん←ナニをするつもりだw いや書き換えたいじゃん、できれば sed や awk とかのコマンド一発で←をい

 「PDFなら文字の位置とかもズレないよね」と思っていたが、この本を読む限り、ズレる可能性は充分残ってるっぽい。

 というのも、各文字の送りなどはフォントに依存するんで、表示または印刷する環境に、必要なフォントがなかったり、フォントのバージョンが違ってたりすると、悲劇が起きる可能性はある。素直にPDFにフォントを埋め込んでおけば問題ないんだけど、日本語はフォント情報が膨大だしなあ。現場じゃどうやってるんだろ?

 まあいい。全般として、初心者向けとしては詳しすぎるしマニアックすぎ、プロ向けとしては詰めが甘い本である。プロが Adobe の仕様書を読む前に、全体の雰囲気を掴むために流し読みする、といった位置づけの本だろう。

【関連記事】

|

« SFマガジン編集部編「SFが読みたい!2015年版」早川書房 | トップページ | SFマガジン2015年4月号 »

パソコン・インターネット」カテゴリの記事

書評:科学/技術」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: John Whitington「PDF構造解説」オライリージャパン 村上雅章訳:

« SFマガジン編集部編「SFが読みたい!2015年版」早川書房 | トップページ | SFマガジン2015年4月号 »