ABC PDFlib, PDFlib+PDI, PPS A library for generating PDF on the fly Version 9.0.1 チ ュ ー ト リ アル C, C++, Cobol, COM, Java, .NET, Objective-C, Perl, PHP, Python, REALbasic, RPG, Ruby 用 Copyright © 1997–2013 PDFlib GmbH and Thomas Merz. All rights reserved. PDFlib ユーザーは本マニ ュ アルを内部利用のために印刷または電子的に複製する こ と を許諾 さ れます。 PDFlib GmbH Franziska-Bilek-Weg 9, 80339 München, Germany www.pdflib.com 電話 +49 • 89 • 452 33 84-0 FAX +49 • 89 • 452 33 84-99 疑問点がおあ り の場合は tech.groups.yahoo.com/group/pdflib にある PDFlib メ ー リ ン グ リ ス ト と アー カ イ ブ を ご覧 く だ さ い。 ラ イ セ ン ス取得のための連絡先 : [email protected] 商用 PDFlib ラ イ セ ン ス保持者向けサポー ト : [email protected] (ラ イ セ ン ス番号をお知らせ く だ さ い) この出版物および こ こ に含まれた情報はあ り のま まに供給 さ れる ものであ り 、 通知な く 変更 さ れる こ と が あ り 、 また、 PDFlib GmbH によ る誓約 と し て解釈 さ れるべき ものではあ り ません。 PDFlib GmbH はいかな る誤 り や不正確に対 し て も責任や負担を全 く 負 う ものではな く 、 こ の出版物に関するいかな る類の (明示 的 ・ 暗示的または法定に関わら ず) 保障を も行 う ものではな く 、 そ し て、 いかな る そ し てすべての売買可 能性の保障 と 、 特定の目的に対する適合性 と 、 サー ド パーテ ィ の権利の侵害 と を明白に否認 し ます。 PDFlib と PDFlib ロ ゴは PDFlib GmbH の登録商標です。 PDFlib ラ イ セ ン ス保持者は PDFlib の名称 と ロ ゴ を彼 らの製品の文書内で用いる権利を与え られます。 ただ し 、 こ れは必須ではあ り ません。 Adobe ・ Acrobat ・ PostScript ・ XMP は Adobe Systems Inc. の商標です。 AIX ・ IBM ・ OS/390 ・ WebSphere ・ iSeries ・ zSeries は International Business Machines Corporation の商標です。 ActiveX ・ Microsoft ・ OpenType ・ Windows は Microsoft Corporation の 商標です。 Apple ・ Macintosh ・ TrueType は Apple Computer, Inc. の 商標 です。 Unicode ・ Unicode ロ ゴは Unicode, Inc. の 商標です。 Unix は The Open Group の 商標です。 Java ・ Solaris は Sun Microsystems, Inc. の 商標です。 HKS は HKS 商標連合= Hostmann-Steinberg ・ K+E Printing Inks ・ Schmincke の登録商標です。 他の企業の製品 と サービ ス名は他の商標やサービ スマー ク である場合が あ り ます。 ソ フ ト ウ ェ ア ア プ リ ケーシ ョ ンやユーザー向け文書で表示 さ れる PANTONE® カ ラ ーは PANTONE 定義規格 と 一致 し ない場合があ り ます。 正確な色については最新の PANTONE Color Publication を ご覧 く だ さ い。 PANTONE® およびその他の Pantone, Inc. の商標は Pantone, Inc. に帰属 し ます。 © Pantone, Inc., 2003. Pantone, Inc. は PDFlib GmbH に対 し て PDFlib ソ フ ト ウ ェ ア と の組み合わせでのみ使用する ための頒布ラ イ セ ン ス さ れた色デー タ および/またはソ フ ト ウ ェ アの著作権者です。 PANTONE カ ラ ーデー タ および/また は ソ フ ト ウ ェ アは PDFlib ソ フ ト ウ ェ アの実行の部分 と し て以外に他のデ ィ ス ク上や メ モ リ 内へ複製 し ては いけません。 PDFlib は以下のサー ド パーテ ィ ソ フ ト ウ ェ アの変更 さ れた部分を含んでいます。 ICClib、 Copyright © 1997-2002 Graeme W. Gill GIF 画像デ コ ーダ、 Copyright © 1990-1994 David Koblas PNG 画像参照ラ イ ブ ラ リ (libpng)、 Copyright © 1998-2012 Glenn Randers-Pehrson Zlib 圧縮ラ イ ブ ラ リ 、 Copyright © 1995-2012 Jean-loup Gailly and Mark Adler TIFFlib 画像ラ イ ブ ラ リ 、 Copyright © 1988-1997 Sam Leffler、 Copyright © 1991-1997 Silicon Graphics, Inc. Eric Young の書いた Cryptographic ソ フ ト ウ ェ ア 、 Copyright © 1995-1998 Eric Young ([email protected]) Independent JPEG Group の JPEG ソ フ ト ウ ェ ア、 Copyright © 1991-1998, Thomas G. Lane Cryptographic ソ フ ト ウ ェ ア、 Copyright © 1998-2002 The OpenSSL Project (www.openssl.org) Expat XML パーサ、 Copyright © 1998, 1999, 2000 Thai Open Source Software Center Ltd ICU International Components for Unicode、 Copyright © 1995-2012 International Business Machines Corporation and others 参照 sRGB ICC カ ラ ープ ロ フ ァ イルデー タ 、 Copyright © 1998 Hewlett-Packard Company PDFlib は RSA Security, Inc. の MD5 メ ッ セージダ イ ジ ェ ス ト アルゴ リ ズムを含んでいます。 目次 0 PDFlib ラ イ セ ン スキーを適用 1 導入 11 15 1.1 各種文書 と サン プルへのロー ド マ ッ プ 15 1.2 PDFlib プ ログ ラ ミ ング 17 1.3 PDFlib/PDFlib+PDI/PPS 9 の新機能 19 1.4 PDFlib の機能 21 1.5 PDFlib+PDI の追加機能 25 1.6 PPS の追加機能 26 1.7 製品別機能一覧 27 2 PDFlib の言語バイ ンデ ィ ング 29 2.1 C バイ ンデ ィ ング 29 2.2 C++ バイ ンデ ィ ング 32 2.3 COM バイ ンデ ィ ン グ 35 2.4 Cobol バイ ンデ ィ ング 40 2.5 Java バイ ンデ ィ ング 41 2.6 .NET バイ ンデ ィ ン グ 44 2.7 Objective-C バイ ンデ ィ ング 47 2.8 Perl バイ ンデ ィ ング 49 2.9 PHP バイ ンデ ィ ング 52 2.10 Python バイ ンデ ィ ング 54 2.11 REALbasic バイ ンデ ィ ング 55 2.12 RPG バイ ンデ ィ ン グ 56 2.13 Ruby バイ ンデ ィ ング 58 3 PDF 文書を作成 3.1 PDFlib 3.1.1 3.1.2 3.1.3 3.1.4 61 プ ログ ラ ミ ングの一般的特徴 61 例外処理 61 PDFlib 仮想フ ァ イ ルシ ス テ ム (PVF) 63 リ ソ ース構成 と フ ァ イ ル検索 64 PDF 文書を メ モ リ 内に生成 70 目次 3 3.1.5 3.1.6 PDF 文書の最大サ イ ズ と その他の制限 71 EBCDIC ベース のプ ラ ッ ト フ ォームで PDFlib を使 う 72 3.2 ページ記述 73 3.2.1 座標系 73 3.2.2 ページサ イ ズ 75 3.2.3 直接パス と パス オブジ ェ ク ト 76 3.2.4 テ ンプ レー ト (フ ォーム XObject) 78 3.2.5 外部 PDF 文書内の参照ページ 79 3.3 暗号化 PDF 81 3.3.1 PDF のセキ ュ リ テ ィ 機能 81 3.3.2 PDF セキ ュ リ テ ィ を PDFlib で適用 84 3.4 高度な色処理 87 3.4.1 ICC プ ロ フ ァ イ ルに よ る 色管理 87 3.4.2 Pantone ・ HKS ・ カ ス タ ム ス ポ ッ ト カ ラ ー 90 3.4.3 パ タ ーン と ス ムーズシ ェーデ ィ ン グ 94 4 Unicode と レ ガシ エ ン コ ーデ ィ ング 95 Unicode の重要な諸概念 95 4.1 4.2 Unicode 対応言語バイ ンデ ィ ング 97 4.2.1 ネ イ テ ィ ブ Unicode 文字列のあ る 言語バ イ ンデ ィ ン グ 97 4.2.2 UTF-8 対応のあ る 言語バ イ ンデ ィ ン グ 97 4.3 非 Unicode 対応言語バイ ンデ ィ ング 99 4.4 シ ングルバイ ト (8 ビ ッ ト ) エ ン コ ーデ ィ ング 103 4.5 日本語 ・ 中国語 ・ 韓国語エ ン コ ーデ ィ ング 106 4.6 キ ャ ラ ク タ を指定 109 4.6.1 エ ス ケープシーケ ン ス 109 4.6.2 文字参照 110 5 フ ォ ン ト 処理 113 フ ォ ン ト 形式 113 5.1.1 TrueType フ ォ ン ト 113 5.1.2 OpenType フ ォ ン ト 113 5.1.3 WOFF フ ォ ン ト 114 5.1.4 SVG フ ォ ン ト 114 5.1.5 PostScript Type 1 フ ォ ン ト 115 5.1.6 SING フ ォ ン ト (グ リ フ レ ッ ト ) 115 5.1.7 CEF フ ォ ン ト 116 5.1.8 Type 3 フ ォ ン ト 116 5.1 5.2 Unicode のキ ャ ラ ク タ と グ リ フ 118 4 目次 5.2.1 5.2.2 5.2.3 グ リ フ ID 118 グ リ フ に対す る Unicode マ ッ ピ ン グ 118 Unicode 制御キ ャ ラ ク タ 120 5.3 テキス ト 処理パイ プ ラ イ ン 121 5.3.1 入力文字列を Unicode へ正規化 121 5.3.2 Unicode 値を グ リ フ ID へ変換 122 5.3.3 グ リ フ ID を転換 123 5.4 フ ォ ン ト を読み込む 125 5.4.1 テ キ ス ト フ ォ ン ト に対する エン コ ーデ ィ ン グ を選ぶ 125 5.4.2 記号フ ォ ン ト に対する エン コ ーデ ィ ン グ を選ぶ 127 5.4.3 5.4.4 5.4.5 5.4.6 例 : Wingdings 記号フ ォ ン ト 内のグ リ フ を選択 128 フ ォ ン ト を検索 131 Windows ・ OS X 上のホ ス ト フ ォ ン ト 136 予備フ ォ ン ト 138 5.5 フ ォ ン ト の埋め込み と サブ セ ッ ト 化 142 5.5.1 フ ォ ン ト の埋め込み 142 5.5.2 フ ォ ン ト のサブセ ッ ト 化 143 5.6 フ ォ ン ト 情報を ク エ リ 146 5.6.1 フ ォ ン ト 非依存のエン コ ーデ ィ ン グ ・ Unicode ・ グ リ フ名 ク エ リ 146 5.6.2 フ ォ ン ト 依存のエン コ ーデ ィ ン グ ・ Unicode ・ グ リ フ名 ク エ リ 147 5.6.3 コ ー ド ページ網羅性 と 予備フ ォ ン ト を ク エ リ 148 6 テキス ト 出力 6.1 151 テキス ト 出力方式 151 6.2 フ ォ ン ト メ ト リ ッ ク と テキス ト バ リ エーシ ョ ン 153 6.2.1 フ ォ ン ト と グ リ フ の メ ト リ ッ ク 153 6.2.2 カーニ ン グ 154 6.2.3 テ キ ス ト バ リ エーシ ョ ン 155 6.3 OpenType レ イ アウ ト 機能 158 6.3.1 対応 し てい る OpenType レ イ ア ウ ト 機能 158 6.3.2 テ キ ス ト 行 ・ テ キ ス ト フ ロ ーで OpenType レ イ ア ウ ト 機能 161 6.4 複雑用字系出力 165 6.4.1 複雑用字系 165 6.4.2 用字系 と 言語 167 6.4.3 複雑用字系のシ ェ ーピ ン グ 169 6.4.4 双方向組版 169 6.4.5 ア ラ ビ ア文字テ キ ス ト 組版 171 6.5 日本語 ・ 中国語 ・ 韓国語テキス ト 出力 173 6.5.1 TrueType ・ OpenType 日中韓フ ォ ン ト を用い る 173 6.5.2 EUDC ・ SING フ ォ ン ト に よ る 外字キ ャ ラ ク タ 174 目次 5 6.5.3 OpenType レ イ ア ウ ト 機能 と 高度な日中韓テ キ ス ト 出力 175 6.5.4 6.5.5 Unicode 異体字セ レ ク タ と 異体字シーケ ン ス 177 標準日中韓フ ォ ン ト 178 7 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む ラ ス タ 画像 181 7.1 7.1.1 7.1.2 基本的な画像処理 181 対応画像フ ァ イ ル形式 183 7.1.3 7.1.4 ク リ ッ ピ ン グパス 186 画像マ ス ク と 透過 187 7.1.5 画像に着色 190 7.2 SVG グ ラ フ ィ ッ ク 191 7.2.1 対応 SVG 種別 191 7.2.2 7.2.3 SVG 処理上の考慮事項 191 SVG グ ラ フ ィ ッ ク のサ イ ズ 193 7.2.4 7.2.5 フ ォ ン ト 選択 193 見つか ら ないフ ォ ン ト 、 見つか ら ないグ リ フ を扱 う 195 7.2.6 ベ ク ト ルグ ラ フ ィ ッ ク と テ キ ス ト だけではない SVG 内容 197 7.2.7 対応 し ていない SVG 機能 198 7.3 PDF ページ を PDI で取 り 込む 200 7.3.1 PDI の機能 と 用途 200 7.3.2 7.3.3 PDFlib+PDI を使用 200 文書 ・ ページ関連のチ ェ ッ ク 202 7.3.4 取 り 込んだ PDF 文書の具体的特徴 202 7.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置 205 7.4.1 単純にオブジ ェ ク ト を配置 205 7.4.2 7.4.3 オブジ ェ ク ト を点上か線上か枠内に配置 205 オブジ ェ ク ト の向 き を変え る 207 7.4.4 7.4.5 オブジ ェ ク ト を回転 208 ページサ イ ズの調整 209 7.4.6 配置 さ れた画像 と PDF ページに関す る 情報を ク エ リ 211 8 テキス ト と 表の組版 213 テキス ト 行を配置 ・ はめ込む 213 8.1 6 8.1.1 単純なテ キ ス ト 行配置 213 8.1.2 8.1.3 テ キ ス ト を枠内に位置付け 214 テ キ ス ト を枠へはめ込み 215 8.1.4 8.1.5 テ キ ス ト を文字で揃え る 217 ス タ ンプ を配置 218 8.1.6 8.1.7 リ ーダ を用い る 218 パス上テ キ ス ト 219 目次 181 8.1.8 影付 き テ キ ス ト 220 8.2 複数行のテキス ト フ ロー 221 8.2.1 テ キ ス ト フ ロ ーをはめ込み枠に配置 223 8.2.2 段落の組版のオプシ ョ ン 224 8.2.3 イ ン ラ イ ンオプシ ョ ン リ ス ト と マ ク ロ 225 8.2.4 タ ブ位置 228 8.2.5 番号付き リ ス ト と 段落間隔 228 8.2.6 制御キ ャ ラ ク タ と キ ャ ラ ク タ マ ッ ピ ン グ 230 8.2.7 ハ イ フ ネーシ ョ ン 232 8.2.8 標準改行アルゴ リ ズ ムの制御 233 8.2.9 高度な用字系固有の改行 237 8.2.10 テ キ ス ト をパ ス ・ 画像に回 り 込ませる 237 8.3 表の組版 242 8.3.1 単純な表を配置 243 8.3.2 表セルの さ ま ざ ま な内容 246 8.3.3 表 と 列の幅 248 8.3.4 さ ま ざ ま な種類の内容を持っ た表 249 8.3.5 表 イ ン ス タ ン ス 252 8.3.6 表組版のアルゴ リ ズ ム 255 8.4 範囲枠 258 8.4.1 テ キ ス ト 行を装飾 258 8.4.2 テ キ ス ト フ ロ ー内で範囲枠を用い る 259 8.4.3 範囲枠 と 画像 260 9 イ ン タ ラ ク テ ィ ブ機能 9.1 263 リ ン ク ・ し お り ・ 注釈 263 9.2 フ ォ ーム フ ィ ール ド と JavaScript 266 9.3 地理空間 PDF 271 9.3.1 地理空間 PDF を Acrobat で利用 271 9.3.2 地理座標系 と 投影座標系 271 9.3.3 座標系の例 272 9.3.4 Acrobat におけ る 地理空間 PDF の制約 273 10 文書交換 275 10.1 XMP メ タ デー タ 275 10.2 Web 最適化 (線形) PDF 277 10.3 タ グ付き PDF の基礎 278 10.3.1 論理構造ツ リ ー (構造 ヒ エ ラ ルキー) 279 10.3.2 標準 ・ カ ス タ ムエ レ メ ン ト 種別 282 10.3.3 ページ装飾 288 目次 7 10.3.4 10.3.5 10.3.6 10.3.7 テ キ ス ト 処理 289 代替テ キ ス ト ・ 置換テ キ ス ト ・ 略語拡張 291 印刷ス ト リ ーム順序 と 論理読み取 り 順序 293 Adobe Acrobat におけ る タ グ付き PDF の諸問題 294 10.4 タ グ付き PDF の高度な ト ピ ッ ク 297 10.4.1 自動表 タ グ付け 297 10.4.2 イ ン タ ラ ク テ ィ ブ要素 300 10.4.3 箇条書き 303 10.4.4 コ ン テ ン ツ を順序に と ら われず作成 305 10.4.5 タ グ付 き PDF ページ を PDI で取 り 込む 306 10.4.6 WCAG 2.0 のための PDFlib の さ ま ざ ま な技法 310 11 PDF のバージ ョ ン と 規格 317 11.1 Acrobat ・ PDF のバージ ョ ン 317 11.2 PDF 標準 ISO 32000 320 11.3 PDF/A によ る アー カ イ ビ ング 321 11.3.1 各種の PDF/A 規格 321 11.3.2 一般的必要条件 322 11.3.3 色 と 画像の必要条件 323 11.3.4 イ ン タ ラ ク テ ィ ブ機能に対す る 必要条件 326 11.3.5 レベル U 準拠のための追加の PDF/A の必要条件 326 11.3.6 レベル A 準拠のための追加の PDF/A の必要条件 327 11.3.7 PDF/A 文書を PDI で取 り 込み 328 11.3.8 PDF/A のための XMP 文書 メ タ デー タ 330 11.4 PDF/X によ る印刷出力 333 11.4.1 PDF/X 規格フ ァ ミ リ 333 11.4.2 一般的必要条件 334 11.4.3 色 と 画像の必要条件 335 11.4.4 イ ン タ ラ ク テ ィ ブ機能のための必要条件 338 11.4.5 PDF/X 文書を PDI で取 り 込む 338 11.5 PDF/VT によ る可変 ・ ト ラ ンザ ク シ ョ ン印刷 340 11.5.1 PDF/VT 規格 340 11.5.2 PDF/VT の諸概念 341 11.5.3 PDF/VT-1 と PDF/VT-2 を生成す る ための諸規則の要約 342 11.5.4 文書部分 ヒ エ ラ ルキー と 文書部分 メ タ デー タ (DPM) 345 11.5.5 反復する グ ラ フ ィ カル内容のための ス コ ープ ヒ ン ト 346 11.5.6 カプセル化 XObject 347 11.5.7 PDF/X ・ PDF/VT 文書を PDI で取 り 込む 349 11.5.8 PDF/VT-2s のための MIME ス ト リ ーム を作成 349 11.6 PDF/UA によ るユニバーサルア ク セシ ビ リ テ ィ 352 11.6.1 PDF/UA 規格 352 8 目次 11.6.2 タ グ付けの必要条件 353 11.6.3 コ ン テ ン ツ種別ご と の追加の必要条件 356 11.6.4 PDF/UA 文書を PDI で取 り 込む 357 12 PPS と PDFlib Block Plugin 359 12.1 PDFlib Block Plugin を イ ン ス ト ール 359 12.2 ブ ロ ッ ク概念の概要 361 12.2.1 文書デザ イ ン と プ ロ グ ラ ム コ ー ド と の分離 361 12.2.2 ブ ロ ッ ク プ ロ パテ ィ 361 12.2.3 PDF の フ ォーム フ ィ ール ド を利用 し ないのはなぜか 362 12.3 PDFlib Block Plugin で ブ ロ ッ ク を編集 364 12.3.1 ブ ロ ッ ク を作成 364 12.3.2 ブ ロ ッ ク プ ロ パテ ィ を編集 368 12.3.3 ページ間 ・ 文書間でブ ロ ッ ク を コ ピー 370 12.3.4 PDF フ ォーム フ ィ ール ド を PDFlib ブ ロ ッ ク に変換 371 12.3.5 Block Plugin のユーザー イ ン タ フ ェース を XML でカ ス タ マ イ ズ 374 12.4 Acrobat で ブ ロ ッ ク を プ レ ビ ュ ー 376 12.5 PPS で ブ ロ ッ クへ流 し 込み 381 12.6 ブ ロ ッ クのプ ロパテ ィ 386 12.6.1 管理プ ロ パテ ィ 386 12.6.2 長方形プ ロ パテ ィ 387 12.6.3 書式プ ロ パテ ィ 388 12.6.4 テ キ ス ト 作成プ ロ パテ ィ 391 12.6.5 テ キ ス ト 組版プ ロ パテ ィ 392 12.6.6 オブジ ェ ク ト はめ込みプ ロ パテ ィ 395 12.6.7 デフ ォ ル ト 内容のためのプ ロ パテ ィ 398 12.6.8 カ ス タ ムプ ロ パテ ィ 398 12.7 pCOS で ブ ロ ッ ク名 と プ ロパテ ィ を ク エ リ 399 12.8 ブ ロ ッ ク を プ ログ ラ ム的に作成 ・ 取 り 込む 401 12.8.1 POCA で PDFlib ブ ロ ッ ク を作成 401 12.8.2 PDFlib ブ ロ ッ ク を取 り 込む 402 12.9 PDFlib ブ ロ ッ ク の仕様 403 A 改訂履歴 索引 407 409 目次 9 10 目次 0 PDFlib ラ イ セ ン スキーを適用 評価版の制約 PDFlib GmbH に よ っ て提供 さ れ る PDFlib ・ PDFlib+PDI ・ PPS のすべてのバ イ ナ リ バージ ョ ンは、 商用 ラ イ セ ン ス を取得 し たか否かにかかわ ら ず、 完全に動作す る評 価版 と し て利用で き ま す。 た だ し 非 ラ イ セ ン ス 版は、 すべて の生成 さ れ る ページ上に、 www.pdflib.com と い う デモ ス タ ンプ を横断印字 し 、 ま た、内蔵の pCOS イ ン タ フ ェース は 小容量の文書 (10 ページ以下、 フ ァ イ ルサ イ ズ 1 MB 以下) に制限 さ れます。 非 ラ イ セ ン ス のバ イ ナ リ は、 業務目的に使用 し てはな ら ず、 こ の製品を評価す る ためにのみ使用で き ます。 PDFlib GmbH 製品はいずれ も 、 業務目的に使用す る には有効な ラ イ セ ン ス が必要で す。 PDFlib ラ イ セ ン ス の取得を ご検討いただいてい る 企業で、 評価段階やプ ロ ト タ イ プの デモ期間中に評価制約の除去を ご希望の場合は、[email protected] 宛に企業情報・プ ロ ジ ェ ク ト 内容を簡単に ご説明いただければ、 一時的な ラ イ セ ン ス キーを ご提供 し ま す (評価 キーの提供要請をお断 り す る 権利を私達は保持いた し ます。た と えば匿名に よ る ご希望の 場合等)。 PDFlib ・ PDFlib+PDI ・ PDFlib Personalization Server (PPS) は、 1 つのパ ッ ケージ と し て 頒布 さ れてはい ますが、 それぞれ異な る 製品であ り 、 別々の ラ イ セ ン ス キーを必要 と し ま す。 PDFlib+PDI の ラ イ セ ン ス キーは PDFlib に対 し て も 有効ですが、 その逆は無効であ り 、 ま た、 PPS の ラ イ セ ン ス キーは PDFlib+PDI と PDFlib に対 し て有効です。 すべての ラ イ セ ン ス キーはプ ラ ッ ト フ ォーム依存であ り 、購入 さ れた対象のプ ラ ッ ト フ ォーム で し か使用 で き ません。 PDFlib ま たは PDI の ラ イ セ ン ス キーを ご購入いただいた ら 、 それを適用 し てデモ ス タ ンプ を除去 し て く だ さ い。 ラ イ セ ン ス キーを設定する にはい く つかの方法があ り ます。 以 下にそれを解説 し ます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの general/license_key ト ピ ッ ク にあ り ます。 Windows イ ン ス ト ー ラ Windows イ ン ス ト ー ラ を使用す る 場合は、 製品を イ ン ス ト ール す る 際に、 ラ イ セ ン ス キーを入力す る こ と がで き ます。 こ の イ ン ス ト ー ラ は、 その ラ イ セ ン ス キーを レ ジ ス ト リ に追加 し ます (後述)。 ラ イ セ ン スキー を API 呼び出 し で実行時に適用 ス ク リ プ ト やプ ロ グ ラ ム に行を追加 し て、 ラ イ セ ン ス キーを実行時に設定す る よ う に し ます。 PDFlib オブジ ェ ク ト を イ ン ス タ ン ス化 し た直後に (C の場合 : PDF_new( ) の後に)、 license オプシ ョ ン を設定す る必要があ り ます。 具体的な文法は、 使用す る プ ロ グ ラ ミ ン グ言語に よ っ て異な り ます : > COM/VBScript ・ REALbasic の場合 : oPDF.set_option "license=...あなたのライセンスキー ..." > C++ ・ Java ・ .NET/C# ・ Python ・ Ruby の場合 : p.set_option("license=...あなたのライセンスキー ...") > C の場合 : PDF_set_option(p, "license=...あなたのライセンスキー ...") > Objective-C の場合 : [pdflib set_option: @"license=...あなたのライセンスキー ..."]; 11 > Perl ・ PHP の場合 : $p->set_option("license=...あなたのライセンスキー ...") > RPG の場合 : c ...') callp PDF_set_option(p:%ucs2('license=...あなたのライセンスキー ラ イ セ ン ス フ ァ イ ルを使用 実行時の呼び出 し で ラ イ セ ン ス キー を 与え る のでは な く 、 その ラ イ セ ン ス キーを テ キ ス ト フ ァ イ ルに入力 し てお く と い う 方法 も あ り ます。以下の形 式に従っ て く だ さ い (PDFlib のデ ィ ス ト リ ビ ュ ーシ ョ ンにはすべて、 ラ イ セ ン ス フ ァ イ ル テ ンプ レー ト licensekeys.txt が入っ てい る ので、 それを利用する こ と も で き ます)。 1 個の 「#」 キ ャ ラ ク タ で始ま る 行は、 注釈を内容 と し てお り 、 無視 さ れます。 2 行目は、 ラ イ セ ン ス フ ァ イ ル自体のバージ ョ ン情報を内容 と し てい ます : # Licensing information for PDFlib GmbH products PDFlib license file 1.0 PDFlib 9.0.1 ...あなたのライセンスキー ... こ の ラ イ セ ン ス フ ァ イ ル内には、 複数の PDFlib GmbH 製品に対す る ラ イ セ ン ス キー群を、 それぞれ別の行に記述す る こ と も で き ます。 ま た、 複数のプ ラ ッ ト フ ォームに対す る ラ イ セ ン ス キー群を内容 と し て持たせ る こ と に よ り 、 同一の ラ イ セ ン ス フ ァ イ ルを複数のプ ラ ッ ト フ ォームで共用す る こ と も 可能です。 ラ イ セ ン ス フ ァ イ ルは、 以下の方法で構成す る こ と がで き ます : > licensekeys.txt と い う 名前の フ ァ イ ルが、 すべてのデフ ォ ル ト 位置で検索 さ れます (13 ページ 「デフ ォ ル ト フ ァ イ ル検索パ ス」 を参照)。 > licensefile オプシ ョ ン を set_option( ) API 関数で設定する こ と も で き ます : p.set_option("licensefile={/ファイルへの/パス/licensekeys.txt}"); > ラ イ セ ン ス フ ァ イ ルを指 し 示す環境(シ ェ ル)変数を設定する こ と も で き ます。Windows では、 シ ス テ ムの コ ン ト ロ ールパネルを使っ て、 「シ ス テム」 → 「詳細」 → 「環境変数」 を選択 し ます。 Unix では、 以下の よ う な コ マ ン ド を適用 し ます : export PDFLIBLICENSEFILE=/ファイルへの/パス/licensekeys.txt > i5/iSeries では、 ラ イ セ ン ス フ ァ イ ルは ASCII で符号化 さ れてい る 必要があ り ます (asciifile オプシ ョ ン を参照)。 ラ イ セ ン ス フ ァ イ ルを以下の よ う に指定で き ます ( こ の コ マ ン ド は、 ス タ ー ト ア ッ ププ ロ グ ラ ム QSTRUP 内で指定す る こ と がで き、 すべての PDFlib GmbH 製品で動作 し ます) : ADDENVVAR ENVVAR(PDFLIBLICENSEFILE) VALUE('/PDFlib/9.0/licensefile.txt') LEVEL(*SYS) レ ジ ス ト リ 内へ ラ イ セ ン スキー Windows では、以下の レ ジ ス ト リ キーに ラ イ セ ン ス フ ァ イ ルの名前を書 き 込む と い う 方法 も あ り ます : HKLM\SOFTWARE\PDFlib\PDFLIBLICENSEFILE ま たは、以下の レ ジ ス ト リ キーの う ちのいずれか 1 つに ラ イ セ ン ス キーを直接書 き込む こ と も で き ます : HKLM\SOFTWARE\PDFlib\PDFlib9\license HKLM\SOFTWARE\PDFlib\PDFlib9\9.0.1\license 12 第 0 章 : PDFlib ラ イ セ ン スキーを適用 MSI イ ン ス ト ー ラ は、 ラ イ セ ン ス キーを、 こ れ ら のエン ト リ の末尾に書き 込みます。 注 64 ビ ッ ト Windows シ ス テム上で レ ジ ス ト リ を手作業で扱 う 際には注意 し て く だ さ い : 通 常どお り 、 64 ビ ッ ト の PDFlib バイ ナ リ は Windows レ ジ ス ト リ の 64 ビ ッ ト ビ ュ ー と と も に動作 し 、64 ビ ッ ト シ ス テム上で動作する 32 ビ ッ ト の PDFlib バイ ナ リ はレ ジ ス ト リ の 32 ビ ッ ト ビ ュ ー と と も に動作 し ます。 32 ビ ッ ト 製品に対する レ ジ ス ト リ キーを手作業で追 加する必要がある と きは、 必ず 32 ビ ッ ト 版の regedit ツールを使用 し て く だ さ い。 こ れは 「ス タ ー ト 」 ダ イ ア ログか ら以下によ っ て起動する こ と がで き ます : %systemroot%\syswow64\regedit デ フ ォ ル ト フ ァ イ ル検索パス Unix ・ Linux ・ OS X ・ i5/iSeries では、 パ ス ・ デ ィ レ ク ト リ 名を何 も 指定 し な く て も 、デフ ォ ル ト でい く つかのデ ィ レ ク ト リ で フ ァ イ ル群が検索 さ れ ます。 UPR フ ァ イ ル ( さ ら な る 検索パ ス を含んでい る 場合 も あ る ) を検索 し て読み込む前 に、 以下のデ ィ レ ク ト リ が検索 さ れます : <rootpath>/PDFlib/PDFlib/9.0/resource/cmap <rootpath>/PDFlib/PDFlib/9.0/resource/codelist <rootpath>/PDFlib/PDFlib/9.0/resource/glyphlst <rootpath>/PDFlib/PDFlib/9.0/resource/fonts <rootpath>/PDFlib/PDFlib/9.0/resource/icc <rootpath>/PDFlib/PDFlib/9.0 <rootpath>/PDFlib/PDFlib <rootpath>/PDFlib Unix ・ Linux ・ OS X では、 <rootpath> は、 まず /usr/local で、 ついで HOME デ ィ レ ク ト リ で置 き 換え ら れます。 i5/iSeries では <rootpath> は空です。 ラ イ セ ン ス フ ァ イ ル と リ ソ ース フ ァ イ ルに対す る デ フ ォ ル ト フ ァ イ ル名 デ フ ォ ル ト で、 以下の フ ァ イ ル名が、 デフ ォ ル ト 検索パ スデ ィ レ ク ト リ 群の中で検索 さ れます : licensekeys.txt pdflib.upr (ライセンスファイル) (リソースファイル) こ の機能を利用す る と 、 環境変数や ラ ン タ イ ム オプシ ョ ン を一切設定せずに ラ イ セ ン ス フ ァ イ ルを扱 う こ と も で き ます。 ア ッ プデー ト と ア ッ プ グ レ ー ド ア ッ プデー ト (あ る 製品の古いバージ ョ ン か ら その同 じ 製品の新 し いバージ ョ ンへの切 り 換え) かア ッ プグ レー ド (PDFlib か ら PDFlib+PDI ま たは PPS への、 ま たは PDFlib+PDI か ら PPS への切 り 換え) を購入 さ れた場合、 あ る いは ご自分のサポー ト 契約の一部 と し て新 し い ラ イ セ ン ス キーを受け取っ た場合には、 その ア ッ プデー ト かア ッ プ グ レ ー ド に対 し て受け取っ た新 し い ラ イ セ ン ス キーを適用す る 必 要があ り ます。 前の製品に対す る 古い ラ イ セ ン ス キーは利用で き な く な り ます。 ま だ ラ イ セ ン ス さ れてい ない機能を評価 いずれの機能 も 、 ソ フ ト ウ ェ アに対 し て ラ イ セ ン ス キーを一切適用せずに完全に評価で き ます。 し か し 、 あ る特定製品に対す る有効な ラ イ セ ン ス キーの適用後は、 それ よ り も 高いカ テ ゴ リ の機能は利用で き な く な り ます。 た と えば、 有効な PDFlib の ラ イ セ ン ス キーを イ ン ス ト ールす る と 、 PDI の機能を試用で き な く な り ます。 同様に、 PDFlib+PDI の ラ イ セ ン ス キーを イ ン ス ト ール し た後は、 パー ソ ナ ラ イ ゼーシ ョ ン機能 (ブ ロ ッ ク 関数群) を利用で き な く な り ます。 あ る 製品に対す る ラ イ セ ン ス キーがすでに イ ン ス ト ール さ れてい る 時は、 そのかわ り にダ ミ ーの ラ イ セ ン ス文字列 「0」 (数字のゼ ロ ) を設定すれば、 それ よ り も 高い製品 ク ラ 13 ス の機能を試用で き る よ う にな り ます。 そ う す る こ と に よ り 、 それ以前に無効に さ れた関 数が有効にな り 、 ま た、 すべてのページ を横断する デモ ス タ ンプが再び有効にな り ます。 さ ま ざ ま な ラ イ セ ン シ ン グオ プ シ ョ ン PDFlib の 1 台ない し 複数のサーバ上での利用や、 PDFlib を利用者自身の製品 と と も に再配布する こ と に対 し ては、それぞれ異な っ た ラ イ セ ン シ ン グ オプシ ョ ン を利用可能です。 サポー ト 契約や ソ ー ス コ ー ド 契約 も 提供 し てい ま す。 ラ イ セ ン シ ン グについての詳細情報 と PDFlib 購入申込フ ォームは PDFlib デ ィ ス ト リ ビ ュ ーシ ョ ンの中にあ り ます。 商用 PDFlib ラ イ セ ン ス のご購入に関心があ る 場合や、 ご 質問に関 し ては何で も 、 以下ま でご連絡 く だ さ い : PDFlib GmbH, Licensing Department Franziska-Bilek-Weg 9, 80339 München, Germany www.pdflib.com 電話 +49 ・ 89 ・ 452 33 84-0、 FAX +49 ・ 89 ・ 452 33 84-99 ラ イ セ ン ス に関す る お問い合わせ : [email protected] PDFlib ラ イ セ ン ス のサポー ト : [email protected] 14 第 0 章 : PDFlib ラ イ セ ン スキーを適用 1 導入 1.1 各種文書 と サン プルへのロ ー ド マ ッ プ PDFlib 製品の有効活用を支援する ために、 以下に挙げ る 資料を提供 し てい ます。 すべての言語バ イ ン デ ィ ン グ用の ミ ニサン プル ミ ニサン プル(hello・image・pdfclock 等) が、 すべてのパ ッ ケージに入っ てお り 、 すべての言語バ イ ンデ ィ ン グで利用可能です。 最 小限の コ ー ド で、 テ キ ス ト 出力 ・ 画像 ・ ベ ク ト ルグ ラ フ ィ ッ ク の出力例を示 し てい ます。 こ の ミ ニサンプルを使えば簡単に、PDFlib が正 し く イ ン ス ト ールで き てい る か ど う か を試 し た り 、 PDFlib アプ リ ケーシ ョ ンの書き 方を さ っ と 把握 し た り する こ と がで き ます。 すべての言語バ イ ン デ ィ ン グ用のス タ ー タ サン プル ス タ ー タ サ ン プ ル は、 す べ て の パ ッ ケージに入っ てお り 、 さ ま ざ ま な言語バ イ ンデ ィ ン グ で利用可能です。 主要な用途 で、 汎用的な出発点 と し て利用で き ます。 簡単なテ キ ス ト ・ 画像出力、 テ キ ス ト フ ロ ー ・ 表組版、 PDF/A ・ PDF/X ・ PDF/VT ・ PDF/UA 作成、 その他 さ ま ざ ま な用途を網羅 し てい ます。 こ の ス タ ー タ サンプルを見れば、 PDFlib 製品を使っ て特定の目的を達す る ための基 本技法を知 る こ と がで き ます。 こ の ス タ ー タ サンプルを見てみ る こ と を強 く 推奨 し ます。 PDFlib チ ュ ー ト リ アル PDFlib チ ュ ー ト リ アル (本マニ ュ アル) は、 すべてのパ ッ ケー ジに入っ てい る 1 個の PDF 文書であ り 、 重要なプ ロ グ ラ ミ ン グ概念を詳 し く 、 小 さ なサ ンプル コ ー ド を用いて説明 し てい ます。 コ ー ド を ス タ ー タ サンプル よ り も 拡張 し てい く に あ た っ ては、 こ の PDFlib チ ュ ー ト リ アル内の関連す る 内容を知っ てお く 必要があ り ます。 注 こ の PDFlib チ ュ ー ト リ アルでは、 作成例はたいてい Java 言語で示 さ れています (29 ペー ジ 「2 章 PDFlib の言語バイ ンデ ィ ング」 の言語ご と の作成例 と 、 別途その旨特記するい く つかの C 特有の作成例を除いて)。 具体的な文法は言語ご と に異な り ますが、 PDFlib プ ロ グ ラ ミ ングの基本概念は、 すべての言語バイ ンデ ィ ングについて同 じ です。 PDFlib リ フ ァ レ ン ス PDFlib リ フ ァ レ ン スは、 すべてのパ ッ ケージに入っ てい る 1 個の PDF 文書であ り 、 PDFlib アプ リ ケーシ ョ ンプ ロ グ ラ ミ ン グ イ ン タ フ ェース (API) を構成 す る すべての関数 ・ オプ シ ョ ン を簡明に記述 し てい ま す。 対応す る オプ シ ョ ン、 入力条 件、 その他従 う べ き プ ロ グ ラ ミ ン グ規則を調べ る には、 こ の PDFlib リ フ ァ レ ン ス が絶対 の規範です。こ れ以外の参照文書はどれ も 必ず し も 完全ではあ り ません。た と えば Javadoc の PDFlib API 一覧や、 php.net での PDFlib 関数一覧は不完全です。 PDFlib で作業す る 際に はかな ら ず、 こ の完全な PDFlib リ フ ァ レ ン ス を利用 し て く だ さ い。 pCOS パス リ フ ァ レ ン ス pCOS イ ン タ フ ェ ース を利用す る と 、 PDF 文書か ら さ ま ざ ま な 特性を ク エ リ す る こ と がで き ます。 pCOS は PDFlib+PDI ・ PPS に内蔵 さ れてい ます。 こ の pCOS パ ス リ フ ァ レ ン ス は、 PDF 文書内の個々の対象を指 し 示 し てその照応す る 値を取得 す る ために用い ら れ る パ ス文法の説明を内容 と し てい ます。 PDFlib ク ッ ク ブ ッ ク PDFlib ク ッ ク ブ ッ ク は、 いろいろ な課題を達成する ための PDFlib コ ーデ ィ ン グ断片を集めてい ます。 ク ッ ク ブ ッ ク の多 く の例は Java ・ PHP 用ですが、 簡単 に他のプ ロ グ ラ ミ ン グ言語に合わせ る こ と がで き ます。 なぜな ら PDFlib API は、 対応す る すべて言語バ イ ンデ ィ ン グについてほぼ等価だか ら です。 こ の PDFlib ク ッ ク ブ ッ ク は、サ ンプルプ ロ グ ラ ムの一覧 と し て保守 さ れてい ます。 以下の URL で利用可能です : 1.1 各種文書 と サン プルへのロー ド マ ッ プ 15 www.pdflib.com/pdflib-cookbook/ pCOS ク ッ ク ブ ッ ク pCOS ク ッ ク ブ ッ ク は、 PDFlib+PDI と PPS に含まれてい る pCOS イ ン タ フ ェ ース の コ ー ド 断片を集めてい ます。こ の pCOS イ ン タ フ ェース を利用す る と 、PDF 文書か ら さ ま ざ ま な特性を ク エ リ す る こ と がで き ます。 以下の URL で利用可能です : www.pdflib.com/pcos-cookbook/ TET ク ッ ク ブ ッ ク PDFlib TET (Text Extraction Toolkit =テ キ ス ト 抽出ツールキ ッ ト ) は、 PDF 文書か ら テ キ ス ト や画像を抽出す る ための別製品です。 こ れを PDFlib+PDI と 組み合 わ る と 、PDF 文書を その内容に応 じ て処理す る こ と がで き ます。TET ク ッ ク ブ ッ ク は、TET のための コ ー ド 断片を集めてい ます。 こ れは、 TET と PDFlib+PDI の組み合わせを演示す る サンプルのグループを含んでい ます。 た と えば、 ページ上のテ キ ス ト に応 じ て Web リ ン ク や し お り を追加 し た り 、 検索単語をハ イ ラ イ ト し た り 、 テ キ ス ト に応 じ て文書を分割 し た り 、目次を作成 し た り な ど です。こ の TET ク ッ ク ブ ッ ク は以下の URL で利用可能です: www.pdflib.com/tet-cookbook/ 16 第 1 章 : 導入 1.2 PDFlib プ ロ グ ラ ミ ン グ PDFlib と は PDFlib は、 Adobe の Portable Document Format (PDF) 形式の フ ァ イ ルを生 成す る こ と を可能にす る 開発 コ ン ポーネ ン ト です。 PDFlib は、 あ なた自身のプ ロ グ ラ ムに 対す る バ ッ ク エン ド と し て働 き ます。 アプ リ ケーシ ョ ンプ ロ グ ラ マーの役割 と し ては、 た だ処理 さ せたいデー タ を持っ て く れば よ く 、 後の仕事は PDFlib が全部引 き 継いで、 その デー タ を視覚化 し た PDF 出力を生成 し ます。 そのデー タ を視覚的に表現する PDF 出力の 生成処理は PDFlib がすべて請け負い ます。 PDFlib を使えば、 PDF の実際の内部構造を見 る こ と な し に、 さ ま ざ ま なや り 方で出力 を 組版す る こ と が で き ま す。 そ のデ ィ ス ト リ ビ ュ ーシ ョ ンパ ッ ケージは、 さ ま ざ ま な製品を 1 個のバ イ ナ リ に含んでい ます : > PDFlib : テ キ ス ト ・ ベ ク ト ルグ ラ フ ィ ッ ク ・ 画像 ・ ハ イ パーテ キ ス ト 要素を含んだ PDF 出力を作成す る ために必要な あ ら ゆ る 機能を持ち ます。 PDFlib は、 一行 ・ 複数行のテ キ ス ト 、 画像の配置、 表の作成のための強力な組版機能を そな えてい ます。 > PDFlib+PDI:PDFlib の全機能に加え、既存 PDF 文書内のページ を取 り 込んだ出力が生成 で き る PDF 取 り 込み ラ イ ブ ラ リ (PDI) と 、 取 り 込み文書か ら 任意の PDF オブジ ェ ク ト を ク エ リ す る (ページ上のすべての フ ォ ン ト を列挙 し た り 、 メ タ デー タ を ク エ リ し た り 、 その他 さ ま ざ ま な こ と をする ) ための pCOS イ ン タ フ ェ ース を含んでい ます。 > PDFlib Personalization Server (PPS) : PDFlib+PDI に加え、 PDFlib ブ ロ ッ ク に自動流 し 込 みを行 う 機能 も 持ち ます。 ブ ロ ッ ク と は、 ページ上のプ レース ホルダであ り 、 その中 にテ キ ス ト や画像や PDF ページ を流 し 込め る も のです。ブ ロ ッ ク は、Adobe Acrobat 用 PDFlib Block Plugin (OS X 版 ・ Windows 版あ り ) を用いて対話的に作成す る こ と がで き 、 その中に、 PPS を用いて自動的に流 し 込みを行い ます。 こ のプ ラ グ イ ン も PPS に 含まれてい ます。 PDFlib を使 う には PDFlib は さ ま ざ ま な プ ラ ッ ト フ ォ ー ム 上で利用可能です。 Unix ・ Windows ・ OS X のいずれで も 利用する こ と がで き 、 ま た、 IBM i5/iSeries ・ zSeries と いっ た EBCDIC ベース のシ ス テ ムで も 使え ます。 PDFlib は C 言語で書かれてい ますが、 それ 以外に も さ ま ざ ま な言語やプ ロ グ ラ ミ ン グ環境か ら 呼び出す こ と が可能です。 こ う し た言 語や環境を言語バ イ ンデ ィ ン グ と いい ます。 PDFlib の言語バ イ ンデ ィ ン グは、 イ ン タ ー ネ ッ ト と ス タ ン ド ア ロ ン両方の、現在広 く 使用 さ れてい る あ ら ゆ る アプ リ ケーシ ョ ン開発 言語を網羅 し てい ます。 その API (アプ リ ケーシ ョ ンプ ロ グ ラ ミ ン グ イ ン タ フ ェース) は 学習が容易であ り 、 かつ、 すべてのバ イ ンデ ィ ン グについて同等です。 現在、 以下のバ イ ンデ ィ ン グに対応 し てい ます : > COM : VB や、 VBScript か JScript に よ る ASP、 Windows Script Host な ど で利用 さ れます > ANSI C ・ C++ > Cobol (IBM zSeries) > Java : J2EE サーブ レ ッ ト ・ JSP を含みます > .NET : C# や VB.NET、 ASP.NET な ど で利用 さ れます > Objective-C (OS X ・ iOS) > PHP > Perl > Python > REALbasic > RPG (IBM i5/iSeries) > Ruby : Ruby on Rails を含みます 1.2 PDFlib プ ロ グ ラ ミ ング 17 PDFlib の使い道 PDFlib の利用目的 と し て まず挙げ ら れ る のは、 自分の ソ フ ト ウ ェ ア内 や Web サーバ上で PDF を動的に作成す る こ と です。Web サーバ上で HTML ページ を動的 に生成する の と 同 じ よ う に、 PDFlib プ ロ グ ラ ム を使っ て PDF を動的に生成 さ せ る よ う に すれば、 その中にユーザーか ら の入力を反映 さ せた り 、 Web サーバ上のデー タ ベース か ら 取得 し たデー タ な ど の動的デー タ を反映 さ せた り す る こ と がで き ます。 こ の PDFlib のア プ ロ ーチはい く つかの利点を提供 し ます : > PDFlib をデー タ 生成アプ リ ケーシ ョ ンに直接組み込め ます。 > こ の直接処理の採用に よ り 、PDFlib は PDF 生成手段 と し て最速であ り 、Web 用途に最適 です。 > PDFlib の ス レ ッ ド セーフ性 と 堅牢な メ モ リ ・ エ ラ ー処理が、 高パフ ォーマ ン ス なサー バアプ リ ケーシ ョ ンの運用に対応 し ます。 > PDFlib を さ ま ざ ま なオペレーテ ィ ン グ シ ス テ ム ・ 開発環境で利用で き ます。 PDFlib を使 う ための必要条件 PDFlib を使えば、 PDF の仕様にわず ら わ さ れずに PDF を 生成で き ます。 PDFlib は PDF の技術的な中身を な る べ く ユーザーか ら 隠 し てい ますが、 PDF に関す る 一般的理解はあ る に越 し た こ と はあ り ません。PDFlib を最大限活用 し よ う と す る アプ リ ケーシ ョ ンプ ロ グ ラ マーは、PDF の基本的グ ラ フ ィ ッ ク モデルをひ と と お り 理 解 し てい る こ と が理想です。 と はいえ、 アプ リ ケーシ ョ ンプ ロ グ ラ マー と し て相応の経験 があ り 、 画面表示や印刷用の何 ら かのグ ラ フ ィ ッ ク API の取扱経験があ る な ら ば、 PDFlib の API について も そ う 障害な く 会得で き る と 思われます。 18 第 1 章 : 導入 1.3 PDFlib/PDFlib+PDI/PPS 9 の新機能 PDFlib/PDFlib+PDI/PPS 9.0 と Block Plugin 5.0 の主な新機能 ・ 改良機能を以下に挙げます。 こ れ以外に も 多 く の新機能があ り ます。詳 し く は表 1.1 と PDFlib リ フ ァ レ ン ス を参照 し て く だ さ い。 PDF/A-2 ・ PDF/A-3 を作成 PDFlib は、アーカ イ ビ ン グのための PDF/A 規格の 2 つの新た な部分に対応 し ま し た。 PDF/A-2 は、 PDF 1.7 に基づいてお り 、 透過 ・ JPEG 2000 圧縮 ・ レ イ ヤーな ど多 く の機能をサポー ト し てい ます。 PDF/A-2 では PDF/A-1 ・ PDF/A-2 文書 の埋め込みが可能であ り 、 PDF/A-3 では任意の フ ァ イ ル形式の埋め込みが可能です。 タ グ付き PDF と PDF/UA を作成 タ グ付き PDF の作成が、 短縮 タ グ付けやページ装飾の 自動 タ グ付け と いっ た さ ま ざ ま な簡便機能に よ り 、 ずっ と 容易にな っ てい ます。 PDFlib の 表組版機能が、 自動的に表組みに タ グ付け し ます。 構造エ レ メ ン ト を含む タ グ付 き PDF 文書を PDI で取 り 込め ます。 ア ク セシブル文書を、 PDF/UA 規格 (Universal Accessibility =ユニバーサルア ク セシ ビ リ テ ィ ) に従っ て作成で き ます。 PDF/UA は、 PDF 1.7 に基づいてお り 、 タ グ付 き PDF を ア ク セ シ ビ リ テ ィ の た め に、 Web 界 に お け る WCAG 2.0 (Web Content Accessibility Guidelines = Web コ ン テ ン ツ ア ク セシ ビ リ テ ィ ガ イ ド ラ イ ン群) と 似た形で改良 し た も の です。 PDF/VT を作成 PDF/VT は、 可変 ・ ト ラ ンザ ク シ ョ ン印刷に最適化 さ れた PDF のための 規格です。PDFlib は、可変文書印刷(Variable Document Printing = VDP)のための ISO 166122 に従っ て PDF/VT-1 ・ PDF/VT-2 ・ PDF/VT-2s に準拠 し た出力を作成で き ます。 文書部 分 メ タ デー タ (Document Part Metadata = DPM) を、 PDF/VT 規格に従っ て添付で き ます。 スケー ラ ブルベ ク ト ルグ ラ フ ィ ッ ク (Scalable Vector Graphics = SVG) を取 り 込む PDFlib が、 SVG 形式のベ ク ト ルグ ラ フ ィ ッ ク を取 り 込みます。 SVG は、 Web 上でのベ ク ト ルグ ラ フ ィ ッ ク のための標準規格であ り 、すべての主要ブ ラ ウ ザが こ れに対応 し てい ます。 フ ォ ン ト 処理 と テキス ト 出力 PDFlib の フ ォ ン ト エン ジ ン と テ キ ス ト 処理が、 い く つか の面で改良 さ れてい ます : > 日中韓異体字グ リ フ のための表意文字異体字シーケ ン ス (ideographic variation sequences = IVS) > WOFF フ ォ ン ト (Web Open Font Format = Web オープン フ ォ ン ト 形式)、すなわち W3C が定めた、 TrueType ・ OpenType フ ォ ン ト のための新たな コ ン テナ形式 > SVG フ ォ ン ト 、 すなわち SVG 形式で表 さ れたベ ク ト ルフ ォ ン ト > CEF フ ォ ン ト (Compact Embedded Font = コ ンパ ク ト 埋め込みフ ォ ン ト )、すなわち SVG グ ラ フ ィ ッ ク 内に フ ォ ン ト を埋め込むために用い ら れ る OpenType の変種 > すべての Unicode 正規形 (NFC ・ NFKC 等) に対応 > 任意の数のデ ィ レ ク ト リ 内で見つか っ たすべての フ ォ ン ト について UPR フ ォ ン ト 構成 フ ァ イ ルを自動的に作成 PDFlib+PDI で PDF 文書を取 り 込む PDF 取 り 込み ラ イ ブ ラ リ PDI には以下の新機能があ り ます : > 構造エ レ メ ン ト を含む タ グ付き PDF 文書を取 り 込め ます。 > レ イ ヤー定義を取 り 込め ます。 1.3 PDFlib/PDFlib+PDI/PPS 9 の新機能 19 PDFlib Personalization Server (PPS) と Block Plugin PPS に は以下の新機能が あ り ま す: > 新たなブ ロ ッ ク 種別 「グ ラ フ ィ ッ ク 」 を用いて、PDFlib ブ ロ ッ ク に SVG グ ラ フ ィ ッ ク を 流 し 込め ます。 > PDFlib ブ ロ ッ ク に PPS で流 し 込みを行え る だけでな く 、PDFlib ブ ロ ッ ク を出力 PDF へ取 り 込む こ と も で き ます。 > 新たなブ ロ ッ ク プ ロ パテ ィ がい く つか導入 さ れてい ます。 PDFlib ブ ロ ッ ク を プ ロ グ ラ ム的に作成 PDFlib ブ ロ ッ ク を PDFlib Block Plugin で対話的 に作成で き る だけでな く 、 PDFlib ブ ロ ッ ク を PPS でプ ロ グ ラ ム的に作成す る こ と も で き ます。 取 り 込んだ文書の中の既存の PDFlib ブ ロ ッ ク を、 生成 PDF 出力へ コ ピーす る こ と も で き ます。 こ れ ら の機能は、 PPS のためのテ ンプ レー ト 自体を プ ロ グ ラ ム的に組み立て る 高度な文書構成ワ ー ク フ ロ ーを可能に し ます。 PDF オ ブ ジ ェ ク ト 作成 API (PDF Object Creation API = POCA) POCA は、 生成 PDF 出力 内に含 ま れ る 低 レ ベル PDF オブ ジ ェ ク ト を 作成す る た めの手段の集合 を 提供 し ま す。 POCA は以下の目的のために利用で き ます : > PDF/VT のための文書部分 メ タ デー タ (Document Part Metadata = DPM) を作成 > PPS で使用する ための PDFlib ブ ロ ッ ク をプ ロ グ ラ ム的に作成 > リ ッ チ メ デ ィ ア注釈 (Flash 等) のための引数 リ ス ト を作成 マルチ メ デ ィ ア コ ン テ ン ツ を埋め込む PDFlib は、 Flash ・ 音声 ・ 映像 ・ 3D コ ン テ ン ツ を 持つ リ ッ チ メ デ ィ ア注釈を作成で き ま す。 こ のマルチ メ デ ィ ア コ ン テ ン ツ を、 JavaScript と PDF ア ク シ ョ ンで制御で き ます。 以下の新たなマルチ メ デ ィ ア機能があ り ます : > リ ッ チ メ デ ィ ア注釈 > リ ッ チ メ デ ィ ア実行ア ク シ ョ ン > PDF ポー ト フ ォ リ オのカ ス タ ムプ レ ゼン テーシ ョ ンのためのFlashベース のナビ ゲー タ 暗号化アルゴ リ ズムの向上 PDFlib は、 Acrobat X/XI に従っ た PDF 文書暗号化に対応 し ま し た。 こ の暗号化方式は、 AES-256 に基づいてお り 、 PDF 1.7 Adobe 拡張レベル 8 と 、 ISO 32000-2 に基づ く PDF 2.0 で定め ら れてい ます。 その他の改良 以下の改良が実装 さ れてい ます : > 表 ・ テ キ ス ト フ ロ ー組版機能の改良 > 幾何図形か ら パ ス オブジ ェ ク ト を作成す る ための便利関数群 > JPEG 2000 ラ ス タ 画像を取 り 込むためのサポー ト を向上 > PDFlib 仮想フ ァ イ ルシ ス テ ム (PDFlib Virtual Filesystem = PVF) 内の フ ァ イ ルの詳細を クエ リ > 関数ス コ ープに関す る 多 く の制約を除去。 た と えば、 ページ ・ パ タ ーン ・ テ ン プ レー ト を任意にネ ス ト で き る よ う にな り ま し た。 20 第 1 章 : 導入 1.4 PDFlib の機能 表 1.1 に、 PDF を生成する ための機能を挙げます。 新機能 ・ 改良機能には注釈を付 し てい ます。 表 1.1 PDFlib の機能一覧 分類 機能 各種 PDF PDF 1.4 ~ PDF 1.7 拡張レ ベル 81 ・ PDF 2.0 (Acrobat 5 ~ XI) 線形化 (Web 最適化) PDF によ る、 Web 上でのバイ ト サービ ング 大容量出力、 任意の PDF フ ァ イルサイ ズ (10 GB 超も 可) PDF のための ISO 規格群 ISO 32000-1 : PDF 1.7 の標準化バージ ョ ン ISO 32000-2 ( ド ラ フ ト ) : PDF 2.01 ISO 15930 : PDF/X-1/3/4/5。 グ ラ フ ィ ッ ク アー ト 業界向け ISO 19005-1/2/3 : PDF/A-1/2/3。 アー カ イ ビ ング用 1 ISO 16612-2 : PDF/VT-1/2。 可変 ・ ト ラ ンザク シ ョ ン印刷用 1 ISO 14289-1 : PDF/UA-1。 ユニバーサルア ク セシ ビ リ テ ィ 用 1 フォン ト TrueType (TTF ・ TTC) ・ PostScript Type 1 フ ォ ン ト PostScript か TrueType のアウ ト ラ イ ン を持つ OpenType フ ォ ン ト (TTF ・ OTF) WOFF フ ォ ン ト (Web Open Font Format = Web オープ ン フ ォ ン ト 形式)、 すなわち W3C が 定めた、 Web 上の フ ォ ン ト のための コ ン テナ形式 1 CEF フ ォ ン ト (Compact Embedded Font = コ ンパ ク ト 埋め込み フ ォ ン ト )、 すなわち SVG 内 に フ ォ ン ト を埋め込むために用い られる OpenType の変種 1 SVG フ ォ ン ト 、 すなわち SVG 形式を用いてグ リ フ輪郭を記述 し た フ ォ ン ト 1 欧文 ・ 日中韓テキス ト 出力のための何ダース も の OpenType レ イ アウ ト 機能に対応。 例 : 合字 ・ ス モールキ ャ ピ タ ル ・ オール ド タ イ プ数字 ・ スワ ッ シ ュ キ ャ ラ ク タ ・ 簡体 / 繁体 ・ 縦書き字体 Windows か OS X シ ス テムに イ ン ス ト ール さ れている フ ォ ン ト (「ホス ト フ ォ ン ト 」) の直接 利用 あ ら ゆる種類のフ ォ ン ト の埋め込み。 TrueType ・ OpenType ・ Type 3 フ ォ ン ト のサブ セ ッ ト 化 ユーザー定義 (Type 3) フ ォ ン ト によ る ビ ッ ト マ ッ プ フ ォ ン ト やカ ス タ ムロ ゴ EUDC ・ SING フ ォ ン ト (グ リ フ レ ッ ト ) に よ る日中韓外字キ ャ ラ ク タ 予備フ ォ ン ト (足 り ないグ リ フ を補助の フ ォ ン ト から 取得) テキス ト 出力 さ ま ざ ま な フ ォ ン ト で テキス ト 出力。 テキス ト に下線 ・ 上線 ・ 取 り 消 し 線 フ ォ ン ト 内のグ リ フ を数値 ・ Unicode 値 ・ グ リ フ 名のいずれかで指定可能 カ ーニ ングに よ る文字間隔の改善 テキス ト を太字化 ・ 斜体化 ・ 影付き パス上テキス ト を作成 見つか ら ないグ リ フ の代替を構成可能 ア ク セシビ リ テ ィ タ グ付き PDF の作成によ る ア ク セ シ ビ リ テ ィ ・ ページ折 り 返 し 、 内容再利用の向上 すべての コ ン テ ン ツ配置関数に対 し て タ グ付け情報を直接与え る こ と に よ る簡単 タ グ付け 1 1.4 PDFlib の機能 21 表 1.1 PDFlib の機能一覧 分類 機能 表 ・ ページ装飾の自動 タ グ付け 1 ユニバーサルア ク セ シ ビ リ テ ィ 、 WCAG 2.0 (Web コ ン テ ン ツ ア ク セシ ビ リ テ ィ ガ イ ド ラ イ ン群) のための PDF/UA-11 構造エ レ メ ン ト 種別 ・ 属性の追加 1 国際化 ページ内容 ・ イ ン タ ラ ク テ ィ ブ要素 ・ フ ァ イル名に Unicode 文字列。 UTF-8 ・ UTF-16 ・ UTF-32 形式。 すべての Unicode 正規化形に対応 1 日本語 ・ 中国語 ・ 韓国語テキス ト のための日中韓フ ォ ン ト と CMap 多様な 8 ビ ッ ト ・ レ ガシ マルチバイ ト 日中韓エ ン コ ーデ ィ ング (Shift-JIS ・ Big5 等) に対 応 日中韓異体字グ リ フのための表意文字異体字シーケ ン ス (IVS) 1 日本語 ・ 中国語 ・ 韓国語テキス ト の縦書き ア ラ ビ ア語 ・ タ イ語 ・ デーヴ ァ ナーガ リ ー等の複雑用字系のキ ャ ラ ク タ シ ェ ーピ ング ア ラ ビ ア語 ・ ヘブ ラ イ語等の右書き用字系の双方向テキス ト 組版 SVG ベ ク ト ル グラ フ ィ ッ ク SVG 形式のベ ク ト ル画像を取 り 込み 1 画像 BMP ・ GIF ・ PNG ・ TIFF ・ JBIG2 ・ JPEG ・ JPEG 2000 ・ CCITT ラ ス タ 画像の埋め込み 画像情報を ク エ リ (ピ ク セルサイ ズ ・ 解像度 ・ ICC プ ロ フ ァ イル ・ ク リ ッ ピ ングパスな ど) TIFF ・ JPEG 画像内の ク リ ッ ピ ングパス を解釈 TIFF ・ PNG 画像内のアルフ ァ チ ャ ン ネル (透過) を解釈 画像マス ク (透過画像に色を適用)、 スポ ッ ト カ ラ ーを用いて画像に着色 グ レースケール ・ RGB (数値 ・ 16 進列 ・ HTML カ ラ ー名) ・ CMYK ・ CIE L*a*b* カ ラ ー 色 PANTONE® (PANTONE® Goe™ ・ PANTONE+ も) 1 ・ HKS® カ ラ ー対応内蔵 ユーザー定義スポ ッ ト カ ラ ー カ ラー マネジ メ ン ト ICC プ ロ フ ァ イルに よ る ICC ベース カ ラ ー。 ICC 4 プ ロ フ ァ イル対応 テキス ト ・ 図形 ・ ラ ス タ 画像のレ ン ダ リ ング イ ン テ ン ト PDF/A ・ PDF/X のための出力イ ン テ ン ト と し ての ICC プ ロ フ ァ イル アー カ イ ビ ング PDF/A-1a/1b ・ PDF/A-2a/b/u ・ PDF/A-3a/b/u PDF/A のための XMP 拡張スキーマ グラ フ ィ ッ ク アー ト PDF/X-1a ・ PDF/X-3 ・ PDF/X-4 ・ PDF/X-4p ・ PDF/X-5p ・ PDF/X-5pg 埋め込まれた、 ま たは外部参照 さ れた出力イ ン テ ン ト ICC プ ロ フ ァ イル PDF/X-5p ・ PDF/X-5pg のための外部グ ラ フ ィ カル内容 (参照 さ れたページ) テキス ト のオーバープ リ ン ト ・ ノ ッ ク アウ ト な どのための設定 可変文書印刷 (VDP) 22 第 1 章 : 導入 可変 ・ ト ラ ンザク シ ョ ン印刷のための PDF/VT-1 ・ PDF/VT-2 ・ PDF/VT-2s1 表 1.1 PDFlib の機能一覧 分類 機能 テキス ト フ ロー 組版 テキス ト を、 1 個ない し 複数の長方形内に、 ま たは任意形状領域内に組版。 ハイ フ ネー シ ョ ン (ユーザー定義ハイ フ ネーシ ョ ン位置が必要)、 フ ォ ン ト と 色の変更、 揃え方式、 タ ブ、 リ ーダ、 制御 コ マ ン ド を指定可能 言語固有処理で高度な改行 柔軟な画像貼 り 付け ・ 組版 画像または画像のク リ ッ ピ ングパスにテキス ト を回 り 込み 表組版 さ ま ざ ま なユーザー設定に従っ て表行 ・ 表列のサイ ズを自動計算 し て配置する表組版機能。 複数ページにわた る表も可能。 表セル内に、 一行か複数行テキス ト 、 画像、 ベ ク ト ルグ ラ フ ィ ッ ク 1、 PDF ページ、 パス オブ ジ ェ ク ト 、 注釈、 フ ォ ーム フ ィ ール ド を配置可能 表セルを、 枠線 ・ 背景色オプ シ ョ ン を指定 し て組版可能 柔軟なス タ ン プ機能 貼 り 付け画像等各種オブ ジ ェ ク ト の座標を参照する範囲枠の概念 ベク ト ル グラ フ ィ ッ ク 一般的な基本ベ ク ト ルグ ラ フ ィ ッ ク要素 : 線 ・ 曲線 ・ 円弧 ・ 楕円 ・ 長方形等 スムーズシ ェ ーデ ィ ング (カ ラ ーブ レ ン ド )、 パ タ ーン塗 り ・ 描線 透過 (不透明) ・ ブ レ ン ド モー ド 再利用可能なパスオブ ジ ェ ク ト 、 ク リ ッ ピ ングパス を画像か ら取 り 込み レ イ ヤー 表示を切 り 替え られるオプ シ ョ ナルなページ内容 注釈 ・ フ ォ ーム フ ィ ール ド を レ イ ヤー上に配置可 セキ ュ リ テ ィ 128/256 ビ ッ ト AES1 ま たは RC4 128 ビ ッ ト 暗号化を用いて PDF 文書ま たは添付を暗号化 Unicode パスワー ド 文書権限設定の指定 (印刷不可 ・ コ ピー不可等) インタ ラクテ ィ ブ 要素 フ ォ ーム フ ィ ール ド を作成。 すべてのフ ィ ール ド オプ シ ョ ン と JavaScript を設定可能 フ ィ ール ド 群からバー コ ー ド を作成 し お り ・ 注釈 ・ ページ を開 く / 閉 じ る等各種イ ベ ン ト に対する ア ク シ ョ ン を作成 し お り を作成。 さ ま ざ ま なオプ シ ョ ン ・ 制御を設定可能 ページ遷移効果 (シ ェ ー ド ・ モザイ ク等) PDF リ ン ク ・ 起動 リ ン ク (他の文書種別) ・ Web リ ン ク等、 あ ら ゆる種類の PDF 注釈を作 成 リ ン ク ・ し お り ・ 文書を開 く ア ク シ ョ ンに名前付き移動先 ページ ラ ベル (ページのシ ンボ リ ッ ク名) を作成 マルチ メ デ ィ ア PDF 内に 3D アニ メ ーシ ョ ン を埋め込み Flash ・ 音声 ・ 映像 ・ 3D コ ン テ ン ツ を PDF 内に埋め込み、 それを JavaScript で制御 1 PDF ポー ト フ ォ リ オのカ ス タ ムプ レゼン テーシ ョ ンのための Flash ベースのナビゲー タ 地理参照付き PDF 1 地理空間参照情報を持つ PDF を作成 1.4 PDFlib の機能 23 表 1.1 PDFlib の機能一覧 分類 機能 メ タ デー タ 文書情報 : 標準フ ィ ール ド ( タ イ ト ル ・ サブ タ イ ト ル ・ 作成者 ・ キーワー ド ) ・ ユーザー定 義フ ィ ール ド 文書情報フ ィ ール ド から 、 またはク ラ イ ア ン ト が与えた XMP ス ト リ ームか ら XMP メ タ デー タ を作成 TIFF ・ JPEG ・ JPEG 2000 画像 ・ SVG グ ラ フ ィ ッ ク 1 内の XMP 画像 メ タ デー タ を処理 プ ログ ラ ミ ング Cobol ・ COM ・ C ・ C++ ・ Objective-C ・ Java ・ .NET ・ Perl ・ PHP ・ Python ・ REALbasic ・ RPG ・ Ruby の言語バイ ンデ ィ ング 仮想 フ ァ イルシ ス テムに よ る イ ン メ モ リ 処理 (デー タ ベースの画像処理な ど) PDF 文書をデ ィ ス ク フ ァ イルまたは (Web サーバで) 直接 メ モ リ 上へ生成 1. PDFlib 9.0 の新機能 / 大幅改良機能 24 第 1 章 : 導入 1.5 PDFlib+PDI の追加機能 PDFlib+PDI ・ PPS には、 表 1.1 に示 し た基本的な PDF 生成機能に加え て、 表 1.2 に挙げ る 機能があ り ます。 表 1.2 PDFlib+PDI の追加機能 分類 機能 PDF 入力 (PDI) 既存 PDF 文書から ページ を取 り 込む PDF 1.7 拡張レ ベル 8 (Acrobat X/XI)1 ・ PDF 2.0 ま でのすべてのバージ ョ ンの PDF を取 り 込 み可能 すべての PDF 標準暗号化アルゴ リ ズムによ る暗号化文書を取 り 込み可能 1 取 り 込まれるページに関する情報を ク エ リ 取 り 込まれるページのページ寸法を転写 (BleedBox ・ TrimBox ・ CropBox 等) 複数の取 り 込まれた PDF 文書にわた る冗長なオブ ジ ェ ク ト (同一 フ ォ ン ト 等) を削除 異常な入力 PDF 文書を修復 取 り 込まれた PDF 文書か ら PDF/A ・ PDF/X 出力イ ン テ ン ト を コ ピー 構造 ヒ エ ラルキーを含む タ グ付き PDF 文書を取 り 込む 1 レ イ ヤー定義 (オプ シ ョ ナルな内容) を取 り 込む 1 pCOS イ ン タ フ ェ ース pCOS イ ン タ フ ェ ースで、 取 り 込まれる PDF 文書の詳細を ク エ リ 1. PDFlib+PDI 9.0 の新機能 / 大幅改良機能 1.5 PDFlib+PDI の追加機能 25 1.6 PPS の追加機能 表 1.3 に、 PDFlib Personalization Server (PPS) でのみ利用可能な機能を挙げます (表 1.1 に示 し た基本的な PDF 生成機能 と 表 1.2 に示 し た PDF 取 り 込み機能に加えて)。 表 1.3 PDFlib Personalization Server (PPS) の追加機能 分類 機能 可変文書印刷 (VDP) PDFlib ブ ロ ッ ク にテキス ト ・ 画像 ・ PDF デー タ ・ SVG ベ ク ト ルグ ラ フ ィ ッ ク 1 を流 し 込ん で PDF をパー ソ ナ ラ イ ズ PPS で PDFlib ブ ロ ッ ク を プ ロ グ ラ ム的に作成 1 取 り 込まれた文書から PDFlib ブ ロ ッ ク を コ ピー 1 PDFlib Block Plugin PDFlib Block Plugin で、 Windows ・ OS X 版 Acrobat 上で PDFlib ブ ロ ッ ク を対話的に作成 PPS ブ ロ ッ ク 流 し 込みを Acrobat 上で プ レ ビ ュ ー ブ ロ ッ ク を プ レ ビ ュ ー フ ァ イルへコ ピー 1 Acrobat 上で ブ ロ ッ ク を対話的に作成 ・ 編集する際のスナ ッ プグ リ ッ ド ブ ロ ッ ク コ ン テナの PDF/X ・ PDF/A プ ロパテ ィ を転写 1 PDF フ ォ ーム フ ィ ール ド を PDFlib ブ ロ ッ ク に変換 し て、 自動流 し 込み可能に テキス ト フ ローブ ロ ッ ク を連結 し て、 ブ ロ ッ ク であふれたテキス ト を次のブ ロ ッ クへ ブ ロ ッ ク プ ラ グ イ ンに PANTONE® ・ HKS® スポ ッ ト カ ラ ー名を内蔵 1 1. PDFlib Personalization Server 9.0 の新機能 / 大幅改良機能 26 第 1 章 : 導入 1.7 製品別機能一覧 表 1.4 は、 PDFlib フ ァ ミ リ の各種製品の機能一覧です。 基本的な PDF 生成 以下に挙げる も の以外すべて PPS API 関数 ・ 引数 ・ オプ シ ョ ン PDFlib+PDI 機能 PDFlib 表 1.4 製品別機能一覧 ○ ○ ○ 1 線形化 (Web 最適化) PDF PDF_end_document( ) の linearize オプ シ ョ ン ○ ○ ○ PDF を最適化 (効果的でない ク ラ イ ア ン ト コ ー ド と 、 最適化 さ れていない取 り 込 み PDF 文書に対 し てのみ意味を持ち ま す) PDF_end_document( ) の optimize オプ シ ョ ン ○1 ○ ○ 参照 さ れた PDF、 PDF/X-5g ・ PDF/X-5pg PDF_begin_template_ext( ) ・ PDF_open_pdi_page( ) ・ PDF_load_graphics( ) の reference オプ シ ョ ン ○1 ○ ○ ポー ト フ ォ リ オ作成のために PDF 文書を PDF_add_portfolio_file( ) の password オプ シ ョ ン 解析 ○1 ○ ○ PDF 取 り 込み (PDI) すべての PDI 関数 ― ○ ○ pCOS を用いて PDF か ら情報を ク エ リ すべての pCOS 関数 ― ○ ○ ブ ロ ッ ク に可変デー タ を流 し 込み PDF_fill_*block( ) ― ― ○ ブ ロ ッ ク を プ ログ ラ ム的に作成 PDF_poca_new( ) : オプ シ ョ ン usage=blocks ― ― ○ PDF_process_pdi( ) : オプ シ ョ ン ― action=copyblock または action=copyallblocks ― ○ ― ○ PDF_begin/end_page_ext( ) : オプション blocks ブ ロ ッ ク を生成出力へ コ ピー PPS で利用する ための PDFlib ブ ロ ッ ク を Acrobat 用 PDFlib Block Plugin 対話的に作成 ― 1. こ の機能には内部的に PDI を必要 と するので、 PDFlib ソ ース コ ー ド パ ッ ケージ では利用で き ません 1.7 製品別機能一覧 27 28 第 1 章 : 導入 2 PDFlib の言語バイ ンデ ィ ング 注 ス タ ー タ サン プルに目を通 さ れる こ と を強 く 推奨 し ます。 すべての PDFlib パ ッ ケージに 入っ ています。 ア プ リ ケーシ ョ ン開発の出発点 と し て有用です。 PDFlib プ ロ グ ラ ミ ングの 重要な点を多数網羅 し ています。 2.1 C バ イ ン デ ィ ン グ PDFlib は、C 言語にい く つかの C++ モジ ュ ールを加え た も ので書かれてい ます。PDFlib の C バ イ ンデ ィ ン グ を利用す る には、 静的ま たは共有 ラ イ ブ ラ リ (Windows ・ MVS 上の DLL) を使 う こ と がで き、 中心 と な る PDFlib イ ン ク ルー ド フ ァ イ ル pdflib.h を PDFlib の ク ラ イ ア ン ト の ソ ース モジ ュ ールに イ ン ク ルー ド す る 必要があ り ます。 あ る いは、 pdflibdl.h を 用いて PDFlib DLL を実行時に動的に読み込ませ る こ と も で き ます (詳 し く は次項参照)。 注 PDFlib の C バイ ンデ ィ ング を用いたア プ リ ケーシ ョ ンは、C++ リ ン カ で リ ン ク を行 う 必要 があ り ます。 なぜな ら、 PDFlib では、 C++ で実装 さ れた部分をい く つかイ ン クルー ド し て い る ためです。 C リ ン カ を用いる と 、 必要な C++ サポー ト ラ イ ブ ラ リ に対 し てア プ リ ケー シ ョ ンが明示的に リ ン ク さ れていない限 り 、未解決の外部参照エ ラ ーが出る可能性があ り ます。 デー タ 型 す。 引数は、表 2.1 に挙げ る デー タ 型に従っ て PDFlib API へ渡 さ れ る 必要があ り ま 表 2.1 C バイ ンデ ィ ングにおけるデー タ 型 API デー タ 型 C バイ ンデ ィ ングにおけ るデー タ 型 文字列デー タ 型 const char * (C 言語の NULL 文字列値 と 空文字列は等価 と 見な さ れます) バイ ナ リ デー タ 型 const char * C におけ る エ ラ ー処理 PDFlib は、 try ~ catch 節に よ る 構造化例外処理に対応 し てい ま す。 ですので、 C と C++ の ク ラ イ ア ン ト では、 PDFlib で発生 し た例外を キ ャ ッ チ し て、 そ の例外に対 し て適切に反応す る こ と がで き ます。 catch 節で ク ラ イ ア ン ト は、 問題の正 し い性質を記 し た文字列 と 、 一意な例外番号 と 、 例外を発生 さ せた PDFlib API 関数の名前 と を得 る こ と がで き ます。 例外処理を持つ PDFlib C ク ラ イ ア ン ト プ ロ グ ラ ムの一般的構造 は以下の よ う にな り ます : PDF_TRY(p) { ...いろいろなPDFlib命令... } PDF_CATCH(p) { printf("PDFlib例外がhelloサンプル内で発生しました:\n"); printf("[%d] %s: %s\n", PDF_get_errnum(p), PDF_get_apiname(p), PDF_get_errmsg(p)); PDF_delete(p); return(2); } 2.1 C バイ ンデ ィ ング 29 PDF_delete(p); PDF_TRY/PDF_CATCH は ト リ ッ キーなプ リ プ ロ セ ッ サマ ク ロ と し て実装 さ れてい ます。こ の う ちの ど ち ら かを う っ か り 入れ忘れ る と 、 コ ンパ イ ラ か ら 出 る エ ラ ー メ ッ セージは原因理 解が困難な も のにな っ て し ま う 可能性があ り ます。マ ク ロ は上記 と 正確に同 じ よ う に用い る よ う に し て く だ さ い。TRY節 と CATCH節の間には一切 コ ー ド を入れてはいけ ません(PDF_ CATCH( ) 以外)。 catch 節の重要な仕事は、PDF_delete( ) と PDFlib オブジ ェ ク ト へのポ イ ン タ と を用いて PDFlib の内部構造を解放する こ と です。 PDF_delete( ) は必要に応 じ て出力フ ァ イ ル も 閉 じ ます。 例外の後は PDF 文書は使用不能であ り 、 不完全 ・ 不整合な状態で取 り 残 さ れます。 も ち ろん、例外発生時に ど の よ う な動作を さ せ る のが適切かはアプ リ ケーシ ョ ンに依存 し ます。 C と C++ の ク ラ イ ア ン ト で例外を キ ャ ッ チ し ない場合、 例外発生時のデフ ォ ル ト 動作 は、 適切な メ ッ セージ を標準エ ラ ー出力な ど に出力 し て抜け る と い う も のです。 PDF 出力 フ ァ イ ルは未完成の状態で残 さ れ ます! こ れは ラ イ ブ ラ リ のルーチン と し て適切ではあ り ませんので、 エ ラ ー処理が重要な アプ リ ケーシ ョ ンでは PDFlib の例外処理機能を活用 す る こ と を強 く 推奨 し ます。 ユーザー定義の catch 節ではた と えば、 エ ラ ー メ ッ セージ を GUI ダ イ ア ロ グボ ッ ク ス に表示 し 、 停止以外の処置を と る こ と がで き る で し ょ う 。 volatile 変数 PDF_TRY( ) ブ ロ ッ ク と PDF_CATCH( ) ブ ロ ッ ク の両方で使 う 変数については 特に注意が必要です。 1 つのブ ロ ッ ク か ら 別のブ ロ ッ ク へ制御が移 る こ と について コ ンパ イ ラ は知 ら ないので、 こ の よ う な場合には不適切な コー ド を生成 し て し ま う 可能性があ り ます(レ ジ ス タ 変数の最適化等)。幸い、こ う し た問題を避け る には簡単な規則があ り ます: 注 PDF_TRY( ) ブ ロ ッ ク と PDF_CATCH( ) ブ ロ ッ ク の両方で使 う 変数は、 volatile 宣言するべき です。 volatile キー ワ ー ド を使 う と 、 変数に最適化 (危険をは ら む) を適用 し てはいけない と い う こ と を コ ンパ イ ラ に知 ら せ る こ と がで き ます。 try/catch ブ ロ ッ ク を ネ ス ト し て例外を再 throw PDF_TRY( ) は、 任意の深 さ にネ ス ト す る こ と が可能です。エ ラ ー処理を ネ ス ト し た場合、内側の catch ブ ロ ッ ク で例外を再 throw す る こ と に よ っ て外側の catch ブ ロ ッ ク を ア ク テ ィ ブにす る こ と がで き ます : PDF_TRY(p) { /* ... */ /* 外側のtryブロック */ PDF_TRY(p) /* 内側のtryブロック */ { /* ... */ } PDF_CATCH(p) /* 内側のcatchブロック */ { /* エラーをクリーンアップ */ PDF_RETHROW(p); } /* ... */ } PDF_CATCH(p) { 30 第 2 章 : PDFlib の言語バイ ンデ ィ ング /* 外側のcatchブロック */ /* さらにエラーをクリーンアップ */ PDF_delete(p); } 内側のエ ラ ーハン ド ラ で PDF_RETHROW( ) を呼び出す と 、 プ ロ グ ラ ムの実行はただちに外 側の PDF_CATCH( ) ブ ロ ッ ク の先頭ス テー ト メ ン ト へ移 り ます。 try ブ ロ ッ ク を途中で抜け る PDF_TRY( ) ブ ロ ッ ク を、 た と えば return ス テー ト メ ン ト に よ っ て抜けたい場合、 すなわちそれに照応す る PDF_CATCH( ) マ ク ロ への呼び出 し をバ イ パ スす る 場合は、 以下の よ う に PDF_EXIT_TRY( ) マ ク ロ を使っ て例外機構に通知す る必要 があ り ます。 こ のマ ク ロ か ら try ブ ロ ッ ク 末尾ま での間、 他の ラ イ ブ ラ リ 関数は一切呼び 出 し てはいけ ません : PDF_TRY(p) { /* ... */ if (error_condition) { PDF_EXIT_TRY(p); return -1; } } PDF_CATCH(p) { /* エラーをクリーンアップ */ PDF_RETHROW(p); } 実行時に読み込まれる DLL と し て PDFlib を利用 たいていの ク ラ イ ア ン ト では、 PDFlib を、 静的に結合 し た ラ イ ブ ラ リ と し て用い る か、 リ ン ク 時に結合 さ れ る ダ イ ナ ミ ッ ク ラ イ ブ ラ リ と し て用い る と 考え ら れ ますが、 それ以外の利用法 と し て、 PDFlib DLL を実行時 に読み込み、 全 API 関数へのポ イ ン タ を動的に取得す る こ と も で き ます。 こ の方法は特 に、 PDFlib DLL を必要時にのみ読み込みたい場合に有用であ り 、 ま た、 MVS 上で も 有用 です。 なぜな ら MVS では通例、 ラ イ ブ ラ リ は PDFlib に明示的に リ ン ク さ れず、 DLL と し て実行時に必要に応 じ て読み込まれ る か ら です。PDFlib では こ の よ う な動的な利用法を可 能にす る ための し く みを特に設け て あ り ま す。 それは以下の方法に し たが っ て利用 し ま す: > pdflib.h のかわ り に pdflibdl.h を イ ン ク ルー ド す る 。 > PDF_new( ) ・ PDF_delete( ) のかわ り に PDF_new_dl( ) ・ PDF_delete_dl( ) を用い る 。 > PDF_TRY( ) ・ PDF_CATCH( ) のかわ り に PDF_TRY_DL( ) ・ PDF_CATCH_DL( ) を用い る 。 > それ以外のすべての PDFlib 呼び出 し については関数ポ イ ン タ を用い る 。 > PDF_get_opaque( ) は使っ てはいけ ません。 > 追加のモジ ュ ール pdflibdl.c を コ ンパ イ ル し て、 アプ リ ケーシ ョ ン を それに リ ン ク さ せ る。 注 PDFlib DLL の実行時読み込みは、 限 られたプ ラ ッ ト フ ォ ームでのみ対応 し ています。 2.1 C バイ ンデ ィ ング 31 2.2 C++ バ イ ン デ ィ ン グ 注 C++ で書かれた .NET ア プ リ ケーシ ョ ンについては、 C++ バイ ンデ ィ ングを通 じ てではな く 、PDFlib .NET DLL を直接利用する こ と を推奨 し ます (例外 と し て、ク ロ ス プ ラ ッ ト フ ォ ー ムア プ リ ケーシ ョ ンの場合は C++ バイ ンデ ィ ング を使 う 必要があ り ます)。 PDFlib デ ィ ス ト リ ビ ュ ーシ ョ ンには、こ の組み合わせを演示する .NET CLI(Common Language Interface) で使 う C++ サン プルコ ー ド があ り ます。 pdflib.h C ヘ ッ ダ フ ァ イ ルに加え て、 C++ のためのオブジ ェ ク ト 指向の ラ ッ パが PDFlib ク ラ イ ア ン ト のために提供 さ れてい ます。こ れは pdflib.hpp ヘ ッ ダ フ ァ イ ルを必要 と し ます。 こ のヘ ッ ダ フ ァ イ ルは pdflib.h を イ ン ク ルー ド し てい ます。pdflib.hpp はテ ンプ レー ト ベー ス の実装を内容 と し て持っ てい ま すので、 照応す る .cpp モジ ュ ールは必要あ り ま せん。 C++ オブジ ェ ク ト ラ ッ パを用い る と 、 すべての PDFlib 関数名の PDF_ 接頭辞は、 よ り オブ ジ ェ ク ト 指向的な表現に置 き 換わ り ます。 デー タ 型 す。 引数は、表 2.2 に挙げ る デー タ 型に従っ て PDFlib API へ渡 さ れ る 必要があ り ま 表 2.2 C++ バイ ンデ ィ ングにおけるデー タ 型 API デー タ 型 C++ バイ ンデ ィ ングにおけ るデー タ 型 文字列デー タ 型 デ フ ォ ル ト では std::wstring、 ただ し カ ス タ マ イ ズ可能 (後述参照) バイ ナ リ デー タ 型 const char * C++ におけ る文字列処理 PDFlib 8 で、 新た な Unicode 対応 C++ バ イ ンデ ィ ン グが導入 さ れま し た。 新 し いテ ンプ レー ト ベース のアプ ロ ーチに よ り 、 文字列処理に関 し て以下の 利用パ タ ーンに対応 し てい ます : > C++標準 ラ イ ブ ラ リ 型std::wstringの文字列が基本文字列型 と し て用い ら れます。こ れは UTF-16 ま たは UTF-32 でエン コ ー ド さ れた Unicode キ ャ ラ ク タ 群を保持す る こ と がで き ます。 こ れが PDFlib 8 以降のデフ ォ ル ト 動作であ り 、 カ ス タ ムデー タ 型 (次項参照) が wstring よ り も 顕著な利点を提供す る のでない限 り 、 新 し いアプ リ ケーシ ョ ンにおい て推奨 さ れ る アプ ロ ーチです。 > 文字列処理にカ ス タ ム (ユーザー定義) デー タ 型を用い る こ と も で き ます。 ただ し 、 そ のカ ス タ ムデー タ 型が basic_string ク ラ ス テ ンプ レー ト の イ ン ス タ ン ス化であ り 、かつ ユーザーが提供す る 変換 メ ソ ッ ド を通 じ て Unicode への変換 と Unicode か ら の変換がで き る も のであ る必要があ り ます。 例 と し て、 UTF-8 文字列のためのカ ス タ ム文字列型 実装が PDFlib デ ィ ス ト リ ビ ュ ーシ ョ ンに含まれてい ます。 > プ レーン C++ 文字列を用い る こ と も で き ます。こ れは、PDFlib 7 ま でのバージ ョ ン を利 用 し て開発 さ れた既存 C++ アプ リ ケーシ ョ ン と の互換のためです。 こ の互換方式は既 存アプ リ ケーシ ョ ンのためにのみ推奨 さ れ る も のであ り 、 新規プ ロ ジ ェ ク ト には推奨 さ れません ( ソ ース コ ー ド 互換性については 33 ページ 「レ ガシ アプ リ ケーシ ョ ン と の フル ソ ース コ ー ド 互換」 を参照)。 新 し い イ ン タ フ ェ ース では、PDFlib メ ソ ッ ド に受け渡 さ れ る 文字列 と 、PDFlib メ ソ ッ ド か ら 受け取る 文字列はすべて、 ネ イ テ ィ ブ wstring であ る と 前提 し ます。 wchar_t デー タ 型 のサ イ ズに応 じ て、 wstring は UTF-16 (2 バ イ ト キ ャ ラ ク タ 群) か UTF-32 (4 バ イ ト キ ャ ラ ク タ 群) でエン コ ー ド さ れた Unicode 文字列を内容 と し て持つ と 見な さ れます。 ソ ース コ ー ド 内の リ テ ラ ル文字列は、 ワ イ ド 文字列であ る こ と を示すために接頭辞 L をつけ る 必 32 第 2 章 : PDFlib の言語バイ ンデ ィ ング 要があ り ます。 リ テ ラ ル内の Unicode キ ャ ラ ク タ は \u ・ \U 文法で作成で き ます。 こ の文 法は ISO C++ 規格に含まれてい ますが、 こ れに対応 し ていない コ ンパ イ ラ も あ り ます。 そ の場合には リ テ ラ ル Unicode キ ャ ラ ク タ は 16 進キ ャ ラ ク タ で作成す る必要があ り ます。 注 EBCDIC ベースのシ ス テム上では、wstring ベースのイ ン タ フ ェ ースのためのオプ シ ョ ン リ ス ト 文字列の整形は、 オプ シ ョ ン リ ス ト 内での EBCDIC と UTF-16 wstring の混在を避け る ために、 追加の変換が必要にな り ます。 こ の変換のための便利 コ ー ド と 説明が、 補足モ ジ ュ ール utf16num_ebcdic.hpp 内にあ り ます。 ア プ リ ケーシ ョ ン を新 し い C++ バ イ ン デ ィ ン グに合わせる PDFlib 7 ま でのバージ ョ ン を利用 し て開発 さ れた既存 C++ アプ リ ケーシ ョ ンは、 以下の よ う に し て適合 さ せ る こ と がで き ます : > PDFlib C++ ク ラ ス は pdflib 名前空間に属す る よ う にな り ま し たので、ク ラ ス名は修飾す る 必要があ り ます。 pdflib::PDFlib 構造を避け る ため、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン は PDFlib メ ソ ッ ド を使 う 前に以下を追加する 必要があ り ます : using namespace pdflib; > アプ リ ケーシ ョ ンの文字列処理を wstring に切 り 替え ます。 こ れは外部 ソ ース か ら の デー タ に主に影響 し ます。 し か し 、 オプシ ョ ン リ ス ト な ど、 ソ ース コ ー ド 内の文字列 リ テ ラ ルに も 、 L 接頭辞をつけ る 必要があ り ます。 例 : const wstring imagefile = L"nesrin.jpg"; image = p.load_image(L"auto", imagefile, L""); > PDFlib エ ラ ー メ ッ セージ と 例外文字列 (PDFlib ・ PDFlibException ク ラ ス の get_errmsg( ) メ ソ ッ ド ) を処理す る 際には、 適切な wstring 対応 メ ソ ッ ド (wcerr 等) を用い る必要 があ り ます。 > 非 Unicode 対応言語においてのみ必要な PDFlib メ ソ ッ ド の呼び出 し は除去 し ます。特に 以下を除去 し ます : p.set_parameter("hypertextencoding", "host"); > C++ バ イ ンデ ィ ン グにおいて、pdflib.cpp モジ ュ ールは必要な く な り ま し た。PDFlib デ ィ ス ト リ ビ ュ ーシ ョ ンには こ のモジ ュ ールのダ ミ ー実装が含まれてい ますが、 PDFlib ア プ リ ケーシ ョ ンのビル ド 処理か ら は こ れは除去す る 必要があ り ます。 レ ガ シ ア プ リ ケーシ ョ ン と の フ ル ソ ース コ ー ド 互換 新 し い C++ バ イ ンデ ィ ン グは、 ア プ リ ケーシ ョ ン レベルの ソ ース コー ド 互換を念頭に設計 さ れてい ますが、 ク ラ イ ア ン ト ア プ リ ケーシ ョ ンは再 コ ンパ イ ルす る 必要があ り ます。 PDFlib 7 以前を前提に開発 さ れた レ ガ シ ア プ リ ケーシ ョ ン において フ ル ソ ー ス コ ー ド 互換を実現す る には以下の方法があ り ます : > pdflib.hpp を イ ン ク ルー ド す る 前に、wstring ベース の イ ン タ フ ェース を以下の よ う に無 効化 し ます : #define PDFCPP_PDFLIB_WSTRING 0 > pdflib.hpp を イ ン ク ルー ド す る 前に、 PDFlib 名前空間を以下の よ う に無効化 し ます : #define PDFCPP_USE_PDFLIB_NAMESPACE 0 C++ におけ る エ ラ ー処理 PDFlib API 関数は、 エ ラ ー発生時には C++ 例外を発生 さ せま す。 こ の例外は ク ラ イ ア ン ト コ ー ド 内で C++ の try ~ catch 節を用いて キ ャ ッ チ さ れ る 必 2.2 C++ バイ ンデ ィ ング 33 要 が あ り ま す。 詳細 な エ ラ ー情報提供 の た め、 PDFlib ク ラ ス に は パ ブ リ ッ ク ク ラ ス PDFlib::Exception があ り ます。 こ のパブ リ ッ ク ク ラ ス は、 詳 し いエ ラ ー メ ッ セージ取得の ための メ ソ ッ ド と 、 例外番号取得のための メ ソ ッ ド と 、 例外を発生 さ せた API 関数の名前 を取得す る ための メ ソ ッ ド と を公開 し てい ます。 PDFlib ルーチンが発生 さ せ る C++ 準拠の例外は規則どお り に動作 し ます。 以下の コ ー ド 断片は、 PDFlib が発生 さ せた例外を キ ャ ッ チ し ます : try { ...いろいろなPDFlib命令... catch (PDFlib::Exception &ex) { wcerr << L"PDFlib例外がhelloサンプル内で発生しました: " << endl << L"[" << ex.get_errnum() << L"] " << ex.get_apiname() << L": " << ex.get_errmsg() << endl; } 実行時に読み込まれる DLL と し て PDFlib を利用 C 言語バ イ ンデ ィ ン グ と 同様、 C++ バ イ ンデ ィ ン グでは、PDFlib を自分のアプ リ ケーシ ョ ンに実行時に結合 さ せ る こ と も で き ま す (31 ページ 「実行時に読み込まれ る DLL と し て PDFlib を利用」 を参照)。 動的読み込 みは、pdflib.hpp を イ ン ク ルー ド す る アプ リ ケーシ ョ ンモジ ュ ールを コ ンパ イ ルす る 際に、 以下の よ う に し て有効にす る こ と がで き ます : #define PDFCPP_DL 1 こ れに加え て、 追加モジ ュ ール pdflibdl.c を コ ンパ イ ル し て、 で き る オブジ ェ ク ト フ ァ イ ルに自分のアプ リ ケーシ ョ ン を リ ン ク さ せ る 必要があ り ます。動的読み込みの詳細は こ の PDFlib オブジ ェ ク ト 内に隠蔽 さ れてい ますので、 こ れは C++ API に影響を与え ません : す べての メ ソ ッ ド 呼び出 し は、動的読み込みが有効に さ れてい る か否かにかかわ ら ず同 じ に 見え ます。 注 実行時の DLL 読み込みは、 一部のプ ラ ッ ト フ ォ ームでのみ利用で き ます。 34 第 2 章 : PDFlib の言語バイ ンデ ィ ング 2.3 COM バ イ ン デ ィ ン グ COM (Component Object Model)1 は、 相互作用す る さ ま ざ ま な ソ フ ト ウ ェ ア コ ン ポーネ ン ト のための言語非依存な規格です。 PDFlib の COM 実装は、 PDFlib コ ア をベース に し た DLL と し て ビル ド さ れてい ます。 こ の DLL ラ ッ パは PDFlib コ アの容器 と し て動作 し 、 PDFlib コ アの諸関数を呼び出す と と も に、 基幹 COM 機構 と のや り 取 り や、 登録 ・ タ イ プ ラ イ ブ ラ リ 関連の手続 き や、 COM の例外処理を行 う 役割を担っ てい ます。 PDFlib の COM ラ ッ パは、 技術的には以下に挙げ る よ う な特徴を持ち ます ( こ こ で用語の意味が理解で き な く て も PDFlib の利用には支障あ り ません) : > PDFlibは、ユーザー イ ン タ フ ェ ース を持たないWin32 イ ンプ ロ セ ス COMサーバ コ ン ポー ネ ン ト (オー ト メ ーシ ョ ンサーバ と も い う ) と し て動作 し ます。 > PDFlib は 「ボース ス レ ッ ド 」 コ ン ポーネ ン ト です。 すなわち、 アパー ト メ ン ト ス レ ッ ド コ ン ポーネ ン ト と し て も フ リ ース レ ッ ド コ ン ポーネ ン ト と し て も 扱 う こ と がで き ま す。 こ れに加え て、 PDFlib はフ リ ース レ ッ ド マーシ ャ ラ を集約 し ます。 簡単に言えば、 ク ラ イ ア ン ト は PDFlib のオブジ ェ ク ト を直接利用す る こ と がで き る ので (プ ロ ク シ / ス タ ブ対を経 る こ と な く )、 速度が向上す る と い う こ と です。 > PDFlib のバ イ ナ リ pdflib_com.dll は タ イ プ ラ イ ブ ラ リ を持つ自己登録 DLL です。 > PDFlib は状態を持ち ません。 すなわち、 プ ロ パテ ィ でな く メ ソ ッ ド の引数が用い ら れ ます。 > PDFlib の二重 イ ン タ フ ェース は、 事前バ イ ンデ ィ ン グ と 実行時バ イ ンデ ィ ン グの両方 に対応 し てい ます。 > PDFlib は リ ッ チエ ラ ー情報に対応 し てい ます。 PDFlib COM 版を イ ン ス ト ール PDFlib は、 COM コ ン ポーネ ン ト 対応の全環境で利用で き ます。 次の環境におけ る 利用例を後述 し ます : > Visual Basic > JScript に よ る Active Server Pages (ASP) > VBScript に よ る Windows Script Host (WSH) Active Server Page と Windows Script Host はど ち ら も JScript と VBScript に対応 し てい ます。 PDFlib は Visual Basic for Applications(VBA)な ど多 く の COM対応開発環境で も 動作 し ます。 PDFlib の イ ン ス ト ール手順は簡単かつ単純です。 以下に留意 し て く だ さ い : > NTFS パーテ ィ シ ョ ンに イ ン ス ト ールす る 場合、 PDFlib ユーザーは必ず、 イ ン ス ト ール し た デ ィ レ ク ト リ に対す る 読み取 り パー ミ ッ シ ョ ン と 、 …\PDFlib 9.0.1\bin\pdflib _ com.dll に対する 実行パー ミ ッ シ ョ ン と が必要です。 > イ ン ス ト ール実行時には、 シ ス テ ム の レ ジ ス ト リ に対す る 書 き 込みパー ミ ッ シ ョ ン が 必要です。 Administrator ない し Power Users グループの権限があれば通常充分です。 PDFlib の MSI イ ン ス ト ー ラ PDFlib は MSI パ ッ ケージ (Microsoft's Windows Installer) と し て入手可能です。 MSI パ ッ ケージは、 イ ン ス ト ール ・ 修復 ・ ア ン イ ン ス ト ール機能を提 供す る も のです。 PDFlib を MSI パ ッ ケージか ら イ ン ス ト ールする には、 単に .msi フ ァ イ ルを ダブル ク リ ッ ク す る か、 右 ク リ ッ ク し て 「 イ ン ス ト ール」 を選択 し ます。 PDFlib COM コ ン ポーネ ン ト の イ ン ス ト ール用に提供 さ れてい る プ ロ グ ラ ム を実行 さ せ る と 、 自動的に、 PDFlib で COM が完全利用で き る よ う にな り ます。 説明の完全を期す る ため、 以下、 PDFlib の利用に必要な実行時環境を挙げ ま す ( イ ン ス ト ールルーチ ン に よ っ て自動的に こ の よ う にな り ます) : 1. COM に関する、 よ り 詳細な情報は www.microsoft.com/com を参照。 2.3 COM バイ ンデ ィ ング 35 > PDFlib COM の DLL pdflib_com.dll を、 イ ン ス ト ール し たデ ィ レ ク ト リ へ コ ピー。 > PDFlib COM の DLL は Windows の レ ジ ス ト リ への登録が必要です。イ ン ス ト ー ラ は自己 登録 PDFlib DLL を使っ て登録を行い ます。 > PDFlib の ラ イ セ ン ス版を イ ン ス ト ール し た場合、 ラ イ セ ン ス キーを シ ス テ ムに入れ る 。 サ イ レ ン ト イ ン ス ト ール PDFlib を他の ソ フ ト ウ ェ アパ ッ ケージに含めて再配布す る 必 要のあ る 場合や、SMS の よ う な ツールで管理 さ れた多数のマシ ンに イ ン ス ト ールす る 必要 のあ る 場合には、 手動で PDFlib を各マシ ンに イ ン ス ト ールす る のは大変な作業で し ょ う 。 その よ う な場合 PDFlib はユーザー入力な し で自動 イ ン ス ト ール さ せ る こ と も 可能です。 MSI イ ン ス ト ー ラ はサ イ レ ン ト イ ン ス ト ールに対応 し てい ます。 た と えば、 コ マ ン ド ラ イ ンで次の コ マ ン ド を実行すれば、 ユーザー入力な し で PDFlib を イ ン ス ト ールで き ま す: msiexec.exe /I PDFlib-X.X.X-dotNET-COM.msi /qn ISP のサーバ上に PDFlib COM を デプ ロ イ イ ン タ ーネ ッ ト サービ ス プ ロ バ イ ダ (ISP) が ホ ス ト す る サーバへの ソ フ ト ウ ェ アの イ ン ス ト ールは、 ロ ーカルのマシ ンへの イ ン ス ト ー ル よ り も 通常困難が伴い ます。 ISP はたいていの場合、 顧客が何か新 し い ソ フ ト ウ ェ アの イ ン ス ト ールを希望 し た と き にはかな り 難色を示す も のだか ら です。 PDFlib は非常に ISP フ レ ン ド リ ーです。 なぜな ら Windows デ ィ レ ク ト リ も レ ジ ス ト リ も 汚 さ ないか ら です : > ただ 1つの DLL し か必要 と し ません。こ の DLL は、regsvr32 ユーテ ィ リ テ ィ を用いて適切 に登録 し さ えすれば、 任意のデ ィ レ ク ト リ に置いてお く こ と がで き ます。 > デ フ ォ ル ト ではほんの数個のプ ラ イ ベー ト な レ ジ ス ト リ エ ン ト リ し か作成 さ れ ま せ ん。 こ の レ ジ ス ト リ エ ン ト リ は、 レ ジ ス ト リ ツ リ ー 内 の HKEY_LOCAL_ MACHINE\SOFTWARE\PDFlib の下に置かれます。 必要に応 じ て手動作成 も で き ます。 > 必要な ら ば、PDFlib はプ ラ イ ベー ト な レ ジ ス ト リ エン ト リ も 一切な し で利用可能です。 ユーザーは、 レ ジ ス ト リ エ ン ト リ のないかわ り に、 set_option( ) を適切に呼び出 し て SearchPath ・ resourcefile ・ license オプシ ョ ン を設定す る必要があ り ます。 ただ し こ の場 合で も COM 機構自体が、 PDFlib イ ン ス ト ールのために レ ジ ス ト リ エン ト リ をい く つ か必要 と し ますので注意 し て く だ さ い。 PDFlib COM コ ン ポーネ ン ト を再配布 再配布可能 ラ イ セ ン ス を購入 し た開発者がPDFlib COM コ ン ポーネ ン ト を自分の製品 と と も に再配布 し たい場合は、 PDFlib イ ン ス ト ー ラ 全 体を完全に含めて配布 し た う えで、PDFlib イ ン ス ト ー ラ を自製品のセ ッ ト ア ッ プ過程の一 部 と し て走 ら せ る 必要があ り ます。 あ る いは以下のすべて を行 う 必要があ り ます : > PDFlib で イ ン ス ト ール さ れた フ ァ イ ル群を自製品の イ ン ス ト ールの中に組み込みま す。 PDFlib の必要フ ァ イ ル一覧は、 PDFlib の イ ン ス ト ール さ れたデ ィ レ ク ト リ を見れ ば簡単に知 る こ と がで き ます。 なぜな ら そ こ が、 PDFlib イ ン ス ト ー ラ が全フ ァ イ ルを 置 く 唯一の場所だか ら です。 > 必要な PDFlib の レ ジ ス ト リ キーを作成 さ せます。 そのためには、 pdflib.reg と い う 登録 フ ァ イ ルテ ン プ レー ト が提供 さ れてい る のでその中のエ ン ト リ を埋め、 そ し て自製品 の イ ン ス ト ール過程の中でそれを用い ます。 > pdflib_com.dll を呼び出 し て自己登録 さ せ る 必要があ り ます(た と えばregsvr32 ユーテ ィ リ テ ィ を利用)。 > ラ イ セ ン ス キーを、 set_option( ) で実行時に与え ます (11 ページ 「0 章 PDFlib ラ イ セ ン ス キーを適用」 も 参照) : oPDF.set_option("license=...あなたのライセンスキー ...") 36 第 2 章 : PDFlib の言語バイ ンデ ィ ング デー タ 型 す。 引数は、表 2.3 に挙げ る デー タ 型に従っ て PDFlib API へ渡 さ れ る 必要があ り ま 表 2.3 COM バイ ンデ ィ ングにおけるデー タ 型 API デー タ 型 COM 言語バイ ンデ ィ ングにおけ るデー タ 型 文字列デー タ 型 BSTR Delphi で COM の場合 : String (8 ビ ッ ト エ ン コ ーデ ィ ングの場合) ま たは WideString (Unicode の場合) バイ ナ リ デー タ 型 VT_ARRAY | VT_UI1 型のバ リ ア ン ト (符号な し バイ ト 群のバ リ ア ン ト 配列) COM におけ る エ ラ ー処理 PDFlib COM コ ン ポーネ ン ト のエ ラ ー処理は COM の規則に 従っ て行われます : PDFlib の例外が起き た時には COM の例外が発生 し 、 テ キ ス ト 形式の エ ラ ー説明が付加 さ れます。 それ と と も に、 PDFlib オブジ ェ ク ト に割 り 当て ら れていた メ モ リ が解放 さ れます。 COM の例外は PDFlib の ク ラ イ ア ン ト でキ ャ ッ チ し て処理で き ます。 その処理方法は、 ク ラ イ ア ン ト の環境が COM のエ ラ ー処理のために対応 し てい る 方法な ら ば何で も 使え ま す。 PDFlib の例外の し く みについては 61 ページ 「3.1.1 例外処理」 で詳述 し ます . Active Server Pages で PDFlib を使 う 外部 フ ァ イ ル使用時には (画像 フ ァ イ ルな ど) 、 ASP の MapPath 機能を使っ て、 ロ ーカルデ ィ ス ク 上のパス名を ASP ス ク リ プ ト 内で使え る パ スへマ ッ プす る 必要があ り ます。 PDFlib と と も に提供 し てい る ASP 利用例を参照 し て く だ さ い。 MapPath について詳 し く ない方は ASP の説明書 も 参照 し て く だ さ い。 絶対パ ス名を ASP ス ク リ プ ト 中で使っ てはいけ ません。 MapPath な し では動作 し ません。 注 UNC パス名は IIS では動作 し ません。 ASP ス ク リ プ ト を置 く デ ィ レ ク ト リ に対 し ては実行パー ミ ッ シ ョ ンが必要です。ま た、PDF 生成に イ ン コ ア方式を用いない場合は書 き 込みパー ミ ッ シ ョ ン も 必要です (提供 し てい る ASP 利用例では イ ン コ ア PDF 生成を利用)。 Active Server Pages 上の PDFlib_com と い っ た COM オブジ ェ ク ト の速度を向上 さ せ る には、ASP ページ上の ス ク リ プ ト コ ー ド 本体の外でオブジ ェ ク ト を イ ン ス タ ン ス化す る と い う 方法が あ り ま す。 そ う す る と 、 オブジ ェ ク ト にページ ス コ ープでな く セ ッ シ ョ ン ス コ ープ を与え る と い う 効果があ り ます。 具体的には、 次の よ う に CreateObject を用い る (次項の利用例の よ う に) のではな く 、 <%@ LANGUAGE = "JavaScript" %> <% var oPDF; oPDF = Server.CreateObject("PDFlib_com.PDF"); oPDF.begin_document("", ""); ... OBJECT タ グで RUNAT ・ ID ・ ProgID 属性を用いて PDFlib_com オブジ ェ ク ト を作成 し ます : <OBJECT RUNAT=Server ID=oPDF ProgID="PDFlib_com.PDF"> </OBJECT> <%@ LANGUAGE = "JavaScript" %> <% oPDF.begin_document("", ""); ... 2.3 COM バイ ンデ ィ ング 37 さ ら に速度向上 さ せ る には、 こ の手法を global.asa フ ァ イ ルに も 適用す る と い う 方法があ り ます。 そのためには Scope=Application 属性を用い ます。 こ れに よ り 、 オブジ ェ ク ト に アプ リ ケーシ ョ ン ス コ ープを与え る こ と にな り ます。 Visual Basic で PDFlib を使 う 外部の COM コ ン ポーネ ン ト を利用する 場合、 Visual Basic は事前 ( コ ンパ イ ル時の) バ イ ンデ ィ ン グ と 実行時 (事後の) バ イ ンデ ィ ン グの両方に対 応 し てい ます。ど ち ら の種類のバ イ ンデ ィ ン グ も PDFlib では可能ですが、事前バ イ ンデ ィ ン グのほ う を強 く 推奨 し ます。 事前バ イ ンデ ィ ン グ を さ せ る には以下の手順を踏みます : > VB プ ロ ジ ェ ク ト か ら PDFlib への参照を作成 し ます。 具体的には、 「プ ロ ジ ェ ク ト 」 メ ニ ュ ーの 「参照設定 ...」 コ マ ン ド を選択 し 、 「PDFlib_com」 コ ン ト ロ ールを選びます。 > オブジ ェ ク ト 変数を宣言す る 時は、一般的な Object 型ではな く 、PDFlib_com.PDF 型で宣 言 し ます : Dim oPDF As PDFlib_com.PDF Set oPDF = CreateObject("PDFlib_com.PDF") ' または: Set oPDF = New PDFlib_com.PDF 参照を作成 し て事前バ イ ンデ ィ ン グ を使 う こ と はい く つかの利点があ り ます : > VB が コー ド 中の スペ リ ン グの間違いをチ ェ ッ ク で き る。 > IntelliSense (自動ス テー ト メ ン ト 補完) や コ ン テ ク ス ト セ ン シテ ィ ブなヘルプが利用可 能。 > VB のオブジ ェ ク ト ブ ラ ウ ザで、すべての PDFlib メ ソ ッ ド が、それぞれの引数 と 簡単な 説明 と と も に表示 さ れ る 。 > VB のプ ロ グ ラ ムは、事前バ イ ンデ ィ ン グのほ う が実行時バ イ ンデ ィ ン グ よ り も ずっ と 高速に動作す る 。 Visual Basic での PDFlib プ ロ グ ラ ミ ン グは単純ですが、 一点だけ例外があ り ます。 Visual Basic 6 の、 Microsoft も 認めてい る バグのために、 い く つかの PDFlib 関数はその ま ま では 使え ません。 なぜな ら VB は、 い く つかの PDFlib メ ソ ッ ド の名前を VB の組み込み メ ソ ッ ド で誤っ てオーバ ラ イ ド し て し ま う のです。 た と えば、 次の コ ー ド を VB 6 で コ ンパ イ ル し て も う ま く い き ません : oPDF.circle 10, 10, 30 こ の問題を回避す る ため、 PDFlib API は次の よ う な等価 メ ソ ッ ド を持っ てい ます : pcircle (circleと等価) pscale (scaleと等価) あ る いは Microsoft テ ク ニ カルサポー ト の提案 し てい る以下の文法を使 う こ と も で き ます: oPDF.[circle] 10, 10, 30 問題を起 こ す メ ソ ッ ド 名を カ ッ コ に入れ る のが効 く よ う です。 すべての PDFlib 関数の う ち、 こ の問題を起 こ すのは次の関数だけです : circle scale 整数 と い う デー タ 型は、 PDFlib COM コ ン ポーネ ン ト では符号付き 32 ビ ッ ト 数を表 し ま す。 Visual Basic では こ れは long デー タ 型に照応 し ます。 ですので、 PDFlib API のマニ ュ アルが整数型の引数を指示 し てい る 場合、 Visual Basic のプ ロ グ ラ マーは こ れを long に翻 訳する 必要があ り ます ( も っ と も 、VB は int 値が与え ら れて も 正 し く それを翻訳 し ます)。 38 第 2 章 : PDFlib の言語バイ ンデ ィ ング Visual Basic プ ロ グ ラ ムは、 エ ラ ーが発生す る と 検知 し て対応で き ます。 Visual Basic で は、 例外のキ ャ ッ チは On Error GoTo 節で行われます : Sub main() Dim oPDF As PDFlib_com.PDF On Error GoTo ErrExit ...いろいろなPDFlib命令... End ErrExit: MsgBox Hex(Err.Number) & ": " & Err.Description End Sub .NET で PDFlib COM 版を使 う PDFlib.NET 版のかわ り に (44 ページ 「2.6 .NET バ イ ン デ ィ ン グ」 参照)、 PDFlib の COM 版を .NET で利用す る こ と も で き ます。 まず、 PDFlib COM 版か ら tlbimp.exe ユーテ ィ リ テ ィ で .NET アセ ンブ リ を作成す る 必要があ り ます : tlbimp pdflib_com.dll /namespace:pdflib_com /out:Interop.pdflib_com.dll こ のアセ ンブ リ を .NET アプ リ ケーシ ョ ン内で用い る こ と がで き ます。 Visual Studio .NET か ら pdflib_com.dll への参照を作成 し た場合は、 アセ ンブ リ は自動的に作成 さ れます。 以下の コ ー ド 断片は、 PDFlib COM 版を VB.NET で利用す る 方法を示 し ます : Imports PDFlib_com ... Dim p As PDFlib_com.IPDF ... p = New PDF() ... buf = p.get_buffer() 以下の コ ー ド 断片は、 PDFlib COM 版を C# で利用す る 方法を示 し ます : using PDFlib_com; ... static PDFlib_com.IPDF p; ... p = New PDF(); ... buf = (byte[])p.get_buffer(); 上記以外の コ ー ド は PDFlib の .NET 版 と 同様に動作 し ます。 C# では get_buffer( ) の結果 を変換 し なければな ら ない こ と に注意 し て く だ さ い。なぜな ら 、COM オブジ ェ ク ト に よ っ て返 さ れ る VARIANT デー タ 型か ら は自動変換が行われないためです(create_pvf( ) につい て も 同様の型変換が必要です)。 2.3 COM バイ ンデ ィ ング 39 2.4 Cobol バ イ ン デ ィ ン グ Cobol 用 PDFlib API では、 標準の C 名は使用で き ず、 かわ り に省略形の関数名を用い ま す。 その短縮関数名は こ こ には記 さ ないので、 相互参照一覧 (xref.txt) を別途参照 し て く だ さ い。た と えば PDF_load_font( ) のかわ り に短縮形 PDLODFNT を用い る必要があ り ます。 Cobol で書かれた PDFlib の ク ラ イ ア ン ト は PDFLBCOB オブジ ェ ク ト に静的に リ ン ク さ れてい ます。 こ のオブジ ェ ク ト は、 PDLBDLCB Load Module (DLL) を動的に ロ ー ド し ま す。 こ の DLL は、 PDNEW (PDF_new( ) に照応す る ) への最初の呼び出 し の際に PDFlib Load Module (DLL) を動的に ロ ー ド し ます。 PDFlib の内部構造が メ モ リ に新規に割 り 当 て ら れ、 その イ ン ス タ ン ス ハン ド ルが P 引数に格納 さ れます。 こ の引数は、 以後呼び出 し ご と に指定す る 必要があ り ます。 PDLBDLCB ロ ー ド モジ ュールは、 8 文字の Cobol 関数 と コ ア PDFlib ルーチン と の間の イ ン タ フ ェ ース を提供す る も のです。 こ のモジ ュ ールは ま た、 PDFlib の非同期な例外処理 と 、 Cobol が期待す る 一本槍な 「関数ご と に戻 り 値をチ ェ ッ ク す る 」 方式 と の間のマ ッ ピ ン グ を提供す る も ので も あ り ます。 注 PDLBDLCB と PDFLIB が、STEPLIB の使用を通 じ て COBOL プ ログ ラ ムから利用可能にな っ て いる必要があ り ます。 デー タ 型 PDFlib リ フ ァ レ ン ス内で使用 さ れてい る 各種デー タ 型は、 以下の例の よ う に Cobol デー タ 型へマ ッ プす る 必要があ り ます : 05 05 05 05 05 05 PDFLIB-A4-WIDTH WS-INT WS-FLOAT WS-STRING P RETURN-RC USAGE COMP-1 VALUE 5.95E+2. // float PIC S9(9) BINARY. // int COMP-1. // float PIC X(128). // const char * PIC S9(9) BINARY. // long * PIC S9(9) BINARY. // int * PDFlib API に渡 さ れ る Cobol 文字列はすべて、LOW-VALUES (NULL) 終端子のために 1 バ イ ト 多 く 格納領域を持たせて定義す る 必要があ り ます。 戻 り 値 PDFlib API の さ ま ざ ま な関数の戻 り 値は、 参照渡 し の ret と い う 引数を追加 し て お く こ と に よ っ て、 そ こ に格納 さ れて き ます。 各関数呼び出 し の結果が こ の引数に代入 さ れ る のです。 戻 り 値がゼ ロ の場合は、 その関数呼び出 し が正常に実行 さ れた こ と を意味 し ます。 それ以外の値は何 ら かのエ ラ ーの発生を示 し てお り 、 その場合 PDF の生成は続行 で き ません。 戻 り 値を何 も 返 さ ない関数 (戻 り 値型 void の C 関数) については、 こ の追加引数は用 い ら れません。 エ ラ ー処理 PDFlib の例外処理は Cobol 言語バ イ ンデ ィ ン グでは利用で き ません。そのか わ り すべての API 関数は、 エ ラ ーを示す戻 り コ ー ド (rc) 引数 と い う 追加の引数に対応 し てい ます。 rc 引数は参照渡 し であ り 、 問題発生の通知に用い ら れます。 非ゼ ロ 値は関数呼 び出 し 失敗を示 し ます。 40 第 2 章 : PDFlib の言語バイ ンデ ィ ング 2.5 Java バ イ ン デ ィ ン グ Java には、 ネ イ テ ィ ブ言語 コ ー ド を Java プ ロ グ ラ ムに接続で き る ポー タ ブルな仕組みが そなわっ てい ます。 こ れを Java Native Interface (JNI) と いい ます。 JNI は、 ネ イ テ ィ ブな C や C++ のルーチン を Java コ ー ド 内か ら 呼び出せ る プ ロ グ ラ ミ ン グ方式を提供 し ます。逆 の呼び出 し も 可能です。 各 C ルーチンは、 Java VM で利用可能 と す る には、 適切な コ ー ド に よ る ラ ッ パを必要 と し ます。成果物であ る ラ イ ブ ラ リ は、Java VM に読み込まれ る には、 共有オブジ ェ ク ト か動的オブジ ェ ク ト と し て生成 さ れ る必要があ り ます。 PDFlib は、 ラ イ ブ ラ リ を Java か ら 利用可能にする JNI ラ ッ パ コー ド を提供 し ます。 こ の技法に よ り 、 共有 ラ イ ブ ラ リ を Java VM か ら 読み込んで、 PDFlib を Java に接続 さ せ る こ と がで き ます。 ラ イ ブ ラ リ の実際の読み込みは、 pdflib Java ク ラ ス中の静的 メ ンバ関数 を介 し て実現 さ れます。 こ のため、 Java ク ラ イ ア ン ト では共有 ラ イ ブ ラ リ の取 り 扱いにい ちいちわず ら わ さ れ る こ と があ り ません。 PDFlib は安定かつ こ なれてい ますので、 ネ イ テ ィ ブ PDFlib ラ イ ブ ラ リ を Java VM に接 続 し て も 、Java アプ リ ケーシ ョ ンに安定性やセキ ュ リ テ ィ 上の制約が加わ る こ と はあ り ま せん。 む し ろ ネ イ テ ィ ブな実装に よ る 速度向上の利点があ り ます。 PDFlib Java 版を イ ン ス ト ール PDFlibバ イ ンデ ィ ン グが動作する には、Java VMが、PDFlib Java ラ ッ パ と PDFlib Java パ ッ ケージ を利用で き る よ う にす る 必要があ り ます。 PDFlib は 以下のパ ッ ケージ名を持つ Java パ ッ ケージ と し て ま と め ら れてい ます : com.pdflib.pdflib こ のパ ッ ケージは pdflib.jar フ ァ イ ルの中にあ っ て、 ク ラ ス pdflib ・ PDFlibException を内容 と し てい ま す。 こ のパ ッ ケージ を アプ リ ケーシ ョ ン で利用可能にす る には、 pdflib.jar を CLASSPATH 環境変数に追加す る 必要があ り ます。 ま たは、 Java コ ンパ イ ラ と ラ ン タ イ ムへ の呼び出 し の中に -classpath pdflib.jar オプシ ョ ン を加え る か、 こ れ と 等価の手順を Java IDE 中で踏む必要があ り ます。 JDK では、 Java VM が既知のデ ィ レ ク ト リ を検索す る よ う に設定す る こ と がで き ます。 具体的には、 java.library.path プ ロ パテ ィ にデ ィ レ ク ト リ の名 前を設定 し ます。 た と えば次の よ う に記述 し ます。 java -Djava.library.path=. pdfclock こ のプ ロ パテ ィ の値をチ ェ ッ ク す る には以下の よ う に し ます : System.out.println(System.getProperty("java.library.path")); 上記に加え、 プ ラ ッ ト フ ォームに よ っ て以下の手順を行 う 必要があ り ます : > Unix : libpdflib_java.so ラ イ ブ ラ リ (OS X の場合 : libpdflib_java.jnilib) は、 共有 ラ イ ブ ラ リ のためのデフ ォ ル ト 格納場所の う ちのいずれかに置 く か、 適切に設定 し たデ ィ レ ク ト リ に置 く 必要があ り ます。 > Windows : pdflib_java.dll ラ イ ブ ラ リ は、 Windows のシ ス テ ムデ ィ レ ク ト リ に置 く か、 PATH 環境変数で列挙 さ れたデ ィ レ ク ト リ に置 く 必要があ り ます。 J2EE ア プ リ ケーシ ョ ンサーバ と サーブ レ ッ ト コ ン テ ナで PDFlib を使 う PDFlib は、サー バサ イ ド の Java アプ リ ケーシ ョ ンに完全に適合 し てい ます。PDFlib デ ィ ス ト リ ビ ュ ーシ ョ ンには、 PDFlib を J2EE 環境で利用す る ためのサンプル コ ー ド と 設定が含まれてい ます。 以下の設定上の注意点に留意 し て く だ さ い : > サーバがネ イ テ ィ ブ ラ イ ブ ラ リ を さ が し に行 く デ ィ レ ク ト リ はベン ダーに よ っ て異な り ます。通常その候補 と な る 場所は、 シ ス テ ムデ ィ レ ク ト リ や、基盤 と な っ てい る Java 2.5 Java バイ ンデ ィ ング 41 VM に固有のデ ィ レ ク ト リ や、 サーバデ ィ レ ク ト リ です。 サーバベン ダーが提供す る マ ニ ュ アルをチ ェ ッ ク し て く だ さ い。 > アプ リ ケーシ ョ ンサーバ と サーブ レ ッ ト コ ン テナは し ば し ば特別な ク ラ ス ロ ーダ を用 いてい ますが、 それには制約があ っ た り 、 専用の ク ラ ス パ ス を利用 し ていた り す る 場 合があ り ます。 サーバのなかには、 特別な ク ラ ス パ ス を定義す る こ と に よ っ て PDFlib パ ッ ケージが確実に発見 さ れ る よ う に し なければな ら ない も のがあ り ます。 PDFlib の各サーブ レ ッ ト エン ジ ン ・ 各アプ リ ケーシ ョ ンサーバでの利用については、 詳細 は PDFlib デ ィ ス ト リ ビ ュ ーシ ョ ンの中の J2EE デ ィ レ ク ト リ 内の追加のマニ ュ アルを参照 し て く だ さ い。 デー タ 型 す。 引数は、表 2.4 に挙げ る デー タ 型に従っ て PDFlib API へ渡 さ れ る 必要があ り ま 表 2.4 Java バイ ンデ ィ ングにおけ るデー タ 型 API デー タ 型 Java バイ ンデ ィ ングにおけるデー タ 型 文字列デー タ 型 string バイ ナ リ デー タ 型 byte[] Java におけ る エ ラ ー処理 Java バ イ ンデ ィ ン グは、 PDFlib のエ ラ ーを ネ イ テ ィ ブ Java 例 外に翻訳 し ます。 例外が起き る と PDFlib は、 以下の ク ラ ス のネ イ テ ィ ブ Java 例外を発生 さ せます : PDFlibException Java 例外は通常の try/catch 技法で処理で き ます : try { ...いろいろなPDFlib命令... } catch (PDFlibException e) { System.err.print("PDFlib例外がhelloサンプル内で発生しました:\n"); System.err.print("[" + e.get_errnum() + "] " + e.get_apiname() + ": " + e.get_errmsg() + "\n"); } catch (Exception e) { System.err.println(e.getMessage()); } finally { if (p != null) { p.delete(); } } /* PDFlibオブジェクトを削除 */ PDFlib は適切な throws 節を宣言 し ますので、 ク ラ イ ア ン ト の コー ド では、 起 こ り う るす べての PDFlib 例外を キ ャ ッ チす る か、 それ ら を自分で宣言 し なければな り ません。 Unicode ・ レ ガ シ エ ン コ ーデ ィ ン グ変換 PDFlib ユーザーの便宜のため、こ こ でい く つか 便利な文字列変換方法を示 し ます。 詳 し く は Java の説明書を参照 し て く だ さ い。 以下の 42 第 2 章 : PDFlib の言語バイ ンデ ィ ング コ ン ス ト ラ ク タ はバ イ ト 配列か ら 、そのプ ラ ッ ト フ ォームのデフ ォ ル ト エン コーデ ィ ン グ を用いて Unicode 文字列を作成 し ます : String(byte[] bytes) 以下の コ ン ス ト ラ ク タ はバ イ ト 配列か ら 、 enc 引数で与え ら れたエン コ ーデ ィ ン グ (SJIS ・ UTF8 ・ UTF-16 等) を用いて Unicode 文字列を作成 し ます : String(byte[] bytes, String enc) 以下の String ク ラ ス の メ ソ ッ ド は Unicode 文字列を、 enc 引数で指定 さ れたエン コーデ ィ ン グに従っ た文字列に変換 し ます : byte[] getBytes(String enc) PDFlib の Javadoc 仕様書 PDFlib パ ッ ケージには、PDFlib の Javadoc 仕様書が含まれてい ます。 こ の Javadoc は、すべての PDFlib API メ ソ ッ ド の短い記述 し か含んでい ませんので、 詳 し く は PDFlib リ フ ァ レ ン ス を参照 し て く だ さ い。 PDFlib の Javadoc を Eclipse で設定す る には以下の よ う に操作 し ます : > パ ッ ケージ ・ エ ク ス プ ロ ー ラ ーで Java プ ロ ジ ェ ク ト を右 ク リ ッ ク し 、 「Javadoc ロ ケー シ ョ ン」 を選択 し ます。 > 「ブ ラ ウズ ...」 を ク リ ッ ク し て、 Javadoc が置かれてい る パ ス (PDFlib パ ッ ケージに含ま れてい ます) を選びます。 こ の手順をふめば、 「Java 参照」 パースペ ク テ ィ ブや 「ヘルプ」 メ ニ ュー等で PDFlib の Javadoc を ブ ラ ウ ズで き る よ う にな り ます。 Groovy で PDFlib を使 う PDFlib の Java バ イ ンデ ィ ン グは、 Groovy 言語で も 使 う こ と が で き ます。 その API 呼び出 し は Java の呼び出 し と 同等であ り 、 オブジ ェ ク ト の イ ン ス タ ン ス化だけが若干違い ます。PDFlib を Groovy で使 う 簡単な例が、PDFlib デ ィ ス ト リ ビ ュ ー シ ョ ンに含ま れてい ます。 2.5 Java バイ ンデ ィ ング 43 2.6 .NET バ イ ン デ ィ ン グ 注 PDFlib を .NET Framework で使 う にあた っ ての さ ま ざ ま な種類やオプ シ ョ ンに関する詳細 な情報が、PDFlib-in-.NET-HowTo.pdf 文書にあ り ます。これはデ ィ ス ト リ ビ ュ ーシ ョ ンパ ッ ケージにあるほか、 PDFlib Web サイ ト で も入手可能です。 PDFlib の .NET 版は、 .NET に関連す る あ ら ゆ る 概念に対応 し てい ます。 技術用語でいえ ば、 PDFlib .NET 版は、 .NET Framework の制御下で走る C++ ク ラ ス です (ア ン マネージな PDFlib コ ア ラ イ ブ ラ リ のためのマネージな ラ ッ パを持っ てい ます)。 こ れは、 厳密名を持 つ静的アセ ンブ リ と し て構成 さ れてい ます。 PDFlib アセ ンブ リ (pdflib_dotnet.dll) には、 ラ イ ブ ラ リ 本体 と メ タ 情報 と が含まれてい ます。 PDFlib .NET 版を イ ン ス ト ール 与え ら れてい る Windows MSI イ ン ス ト ー ラ で PDFlib を イ ン ス ト ール し ます。 PDFlib.NET の MSI イ ン ス ト ー ラ は、 PDFlib アセ ンブ リ と 補助デー タ フ ァ イ ル群 ・ 解説文書 ・ サンプルを、 マシ ンに対話的に イ ン ス ト ール し ます。 こ の イ ン ス ト ー ラ は PDFlib の登録 も 行っ て、 Visual Studio の 「参照の追加」 ダ イ ア ロ グボ ッ ク ス の .NET タ ブで PDFlib を簡単に参照で き る よ う に し ます。 デー タ 型 す。 引数は、表 2.5 に挙げ る デー タ 型に従っ て PDFlib API へ渡 さ れ る 必要があ り ま 表 2.5 .NET バイ ンデ ィ ングにおけ るデー タ 型 API デー タ 型 .NET バイ ンデ ィ ングにおけるデー タ 型 文字列デー タ 型 string バイ ナ リ デー タ 型 byte[ ] .NET におけ る エ ラ ー処理 PDFlib.NET は .NET の例外に対応 し てお り 、 実行時に問題が 発生す る と 、 詳細 な エ ラ ー メ ッ セー ジ を 持 っ た例外 を 発生 さ せ ま す。 こ う し た例外 を キ ャ ッ チ し て適切に対処す る のは ク ラ イ ア ン ト 側の役目です。 そ う し な い場合、 .NET Framework が例外を キ ャ ッ チ し て、 たいていはアプ リ ケーシ ョ ン を停止 さ せます。 PDFlib は、例外関連情報を伝え る ために、 メ ンバ get_errnum・get_errmsg・get_apiname を 持つ自前の例外 ク ラ ス PDFlib_dotnet.PDFlibException を 定義 し て い ま す。 PDFlib は IDisposable イ ン タ フ ェ ース を実装 し てい る ので、 ク ラ イ ア ン ト は Dispose( ) メ ソ ッ ド を呼 び出 し て ク リ ーン ア ッ プが可能です。 C# で PDFlib を使 う PDFlib.NET を C# プ ロ ジ ェ ク ト で使 う に は、 Visual C# .NET で PDFlib.NET アセ ンブ リ への参照を作成す る 必要があ り ます : 「プ ロ ジ ェ ク ト 」 → 「参照の 追加 ...」 → 「参照 ...」 で イ ン ス ト ールデ ィ レ ク ト リ か ら pdflib_dotnet.dll を選択 し ます。 コ マ ン ド ラ イ ン コ ンパ イ ラ では、次の例の よ う に し て PDFlib.NET を参照す る こ と がで き ます : csc.exe /r:..\..\bin\pdflib_dotnet.dll hello.cs ク ラ イ ア ン ト の コ ー ド では、 PDFlib が発生 さ せ る .NET 例外を、 通常の try ~ catch 構造 で処理で き ます : try { ...いろいろなPDFlib命令... 44 第 2 章 : PDFlib の言語バイ ンデ ィ ング catch (PDFlibException e) { // PDFlibが投げた例外をキャッチした Console.WriteLine("PDFlib例外がhelloサンプル内で発生しました:\n"); Console.WriteLine("[{0}] {1}: {2}\n", e.get_errnum(), e.get_apiname(), e.get_errmsg()); } finally { if (p != null) { p.Dispose(); } } VB.NET で PDFlib を使 う PDFlib.NET を VB.NET プ ロ ジ ェ ク ト で利用す る には、 Visual Basic .NET で PDFlib.NET アセ ンブ リ への参照を作成す る 必要があ り ます : 「プ ロ ジ ェ ク ト 」 → 「参照の追加 ...」 → 「参照 ...」 で イ ン ス ト ールデ ィ レ ク ト リ か ら pdflib_dotnet.dll を選択 し ます。 コ マ ン ド ラ イ ン コ ンパ イ ラ では、次の よ う に し て PDFlib.NET を参照す る こ と がで き ま す: vbc.exe /r:..\..\bin\pdflib_dotnet.dll hello.vb Visual Basic .NET は 2 種類の例外処理に対応 し てい ます : > 現代的な構造化例外処理 (C# の よ う な他の現代的言語で も 利用 さ れ る方式) > 古典的な非構造化例外処理 (Visual Basic 6.0 では こ れが唯一の例外処理方式) ク ラ イ ア ン ト の コ ー ド では、 PDFlib が発生 さ せる .NET 例外を ど ち ら の例外処理方式で処 理す る こ と も で き ますが、 その文法は互いに異な り ます。 構造化例外処理で例外を キ ャ ッ チす る 方式を推奨 し ます。 こ れは try ~ catch 節で動作 し ます : Try ...いろいろなPDFlib命令... Catch e As PDFlibException Console.WriteLine("PDFlib例外がhelloサンプル内で発生しました:") Console.WriteLine("[{0}] {1}: {2}", e.get_errnum(), e.get_apiname(), e.get_errmsg()) Finally If Not p Is Nothing Then p.Dispose() End If End Try 古典的な非構造化例外処理で例外を キ ャ ッ チす る には、 On Error GoTo 節を用い ます : Imports Microsoft.VisualBasic Public Shared Sub Main() On Error GoTo ErrExit ...いろいろなPDFlib命令... Exit Sub ErrExit: Console.WriteLine("PDFlib例外をキャッチしました: {0}", Err.Description) End Sub 2.6 .NET バイ ンデ ィ ング 45 C++ と CLI で PDFlib を使 う C++ で書かれた .NET アプ リ ケーシ ョ ン (共通言語基盤 CLI に基づ く ) は、 PDFlib C++ バ イ ンデ ィ ン グ を使わずに直接 PDFlib.NET DLL を利用で き ま す。 その ソ ース コ ー ド は PDFlib を以下の よ う に参照す る必要があ り ます : using namespace PDFlib_dotnet; Unicode ・ レ ガ シ エ ン コ ーデ ィ ン グ変換 PDFlib ユーザーの便宜のために、 便利な C# 文 字列変換方法を示 し ま し ょ う 。 詳 し く は .NET の説明書を参照 し て く だ さ い。 以下の コ ン ス ト ラ ク タ はバ イ ト 配列 (指定 さ れた変位 と 長 さ での) か ら 、 Encoding 引数で与え ら れた エン コ ーデ ィ ン グ を用いて Unicode 文字列を作成 し ます : public String(sbyte*, int, int, Encoding) 46 第 2 章 : PDFlib の言語バイ ンデ ィ ング 2.7 Objective-C バ イ ン デ ィ ン グ C ・ C++ 言語バ イ ンデ ィ ン グ を Objective-C1 で使 う こ と も で き ますが、 Objective-C 用の真 正言語バ イ ンデ ィ ン グ も あ り ます。 PDFlib フ レーム ワ ー ク には以下の種類があ り ます : > PDFlib : OS X 用 > PDFlib_ios : iOS 用 ど ち ら の フ レーム ワー ク も C・C++・Objective-C 用の言語バ イ ンデ ィ ン グ を含んでい ます。 OS X 上に PDFlib Objective-C 版を イ ン ス ト ール PDFlib を自分のアプ リ ケーシ ョ ンで使 う ためには、PDFlib.framework か PDFlib_ios.framework をデ ィ レ ク ト リ /Library/Frameworks へ コ ピーす る 必要があ り ます。PDFlib フ レーム ワー ク を別の場所に イ ン ス ト ールす る こ と も 可能ですが、 Apple の install_name_tool の使用が必要です。 こ の ツールについては こ こ では説明 し ません。PDFlib メ ソ ッ ド 定義を持つ PDFlib_objc.h ヘ ッ ダ フ ァ イ ルを アプ リ ケー シ ョ ン ソ ース コ ー ド 内で取 り 込む必要があ り ます : #import "PDFlib/PDFlib_objc.h" ま たは #import "PDFlib_ios/PDFlib_objc.h" デー タ 型 す。 引数は、表 2.6 に挙げ る デー タ 型に従っ て PDFlib API へ渡 さ れ る 必要があ り ま 表 2.6 Objective-C バイ ンデ ィ ングにおけるデー タ 型 API デー タ 型 Objective-C バイ ンデ ィ ングにおけるデー タ 型 文字列デー タ 型 NSString(nil は空文字列と等価) バイ ナ リ デー タ 型 NSData 引数命名規則 PDF メ ソ ッ ド 呼び出 し にあ た っ ては、 引数を、 以下の規則に従っ て与え る 必要があ り ます : > 1 番目の引数の値は、 メ ソ ッ ド 名の直後に、 コ ロ ン キ ャ ラ ク タ で区切っ て与え ます。 > その後の各引数については、 その引数の名前 と 値 ( こ れ も 互いに コ ロ ン キ ャ ラ ク タ で 区切っ て) を与え る 必要があ り ます。 引数名は、 PDFlib リ フ ァ レ ン ス か PDFlib_objc.h 内で見つけ る こ と がで き ます。 た と えば、 PDFlib リ フ ァ レ ン ス内の以下の行は : void begin_page_ext(double width, double height, String optlist) 以下の Objective-C メ ソ ッ ド に照応 し ます : - (void) begin_page_ext: (double) width height: (double) height optlist: (NSString *) optlist; よ っ て、 アプ リ ケーシ ョ ンか ら 以下の よ う な呼び出 し を行 う 必要があ る こ と にな り ます : [pdflib begin_page_ext:595.0 height:842.0 optlist:@""]; 1. developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html を参照 2.7 Objective-C バイ ンデ ィ ング 47 コ ー ド 補完のための XCode Code Sense は PDFlib フ レーム ワ ー ク で使用で き ます。 Objective-C におけ る エ ラ ー処理 Objective-C バ イ ンデ ィ ン グは、 PDFlib エ ラ ーを、 ネ イ テ ィ ブ Objective-C 例外へ翻訳 し ます。 実行時の問題が発生 し た と き には、 PDFlib は、 ク ラ ス PDFlibException のネ イ テ ィ ブ Objective-C 例外を発生 さ せます。こ の例外は通常の try/catch 機構で処理で き ます : @try { ...PDFlib命令群... } @catch (PDFlibException *ex) { NSString * errorMessage = [NSString stringWithFormat:@"PDFlib error %d in '%@': %@", [ex get_errnum], [ex get_apiname], [ex get_errmsg]]; NSAlert *alert = [[NSAlert alloc] init]; [alert setMessageText: errorMessage]; [alert runModal]; [alert release]; } @catch (NSException *ex) { NSAlert *alert = [[NSAlert alloc] init]; [alert setMessageText: [ex reason]]; [alert runModal]; [alert release]; } @finally { [pdflib release]; } get_errmsg メ ソ ッ ド のほかに、 例外オブジ ェ ク ト の reason フ ィ ール ド を使っ てエ ラ ー メ ッ セージ を取得す る こ と も で き ます。 48 第 2 章 : PDFlib の言語バイ ンデ ィ ング 2.8 Perl バ イ ン デ ィ ン グ Perl1 用 PDFlib ラ ッ パは、 C ラ ッ パフ ァ イ ル 1 個 と Perl パ ッ ケージモジ ュ ール 2 個で構成 さ れてい ます。 こ のモジ ュ ールの う ち 1 個は各 PDFlib API 関数の Perl 版を提供 し 、 も う 1 個は PDFlib オブジ ェ ク ト のための も のです。C モジ ュ ールは、Perl イ ン タ プ リ タ が実行時 に読み込む共有 ラ イ ブ ラ リ を ビル ド す る ために使われます。こ の処理には Perl パ ッ ケージ モジ ュ ール も 使用 さ れます。 Perl ス ク リ プ ト では use ス テー ト メ ン ト で共有 ラ イ ブ ラ リ モ ジ ュールを参照 し ます。 PDFlib Perl 版を イ ン ス ト ール Perl の拡張機構は共有 ラ イ ブ ラ リ を、実行時に DynaLoader モジ ュ ールを通 じ て読み込みます。 Perl の実行形式が、 共有 ラ イ ブ ラ リ 対応付 き で コ ンパ イ ル さ れてい る 必要があ り ます (大多数の Perl の設定ではそ う な っ てい ます)。 PDFlib バ イ ンデ ィ ン グが動作す る ためには、 Perl イ ン タ プ リ タ が PDFlib Perl ラ ッ パ と モジ ュ ール pdflib_pl.pm ・ PDFlib/PDFlib.pm を利用で き る よ う にな っ てい る必要があ り ま す。 以下に述べ る プ ラ ッ ト フ ォーム依存な方式を用い る こ と も で き ます し 、 -I コ マ ン ド ラ イ ンオプシ ョ ン を用いて Perl の @INC モジ ュ ール検索パ ス にデ ィ レ ク ト リ を追加す る こ と も で き ます : perl -I/path/to/pdflib hello.pl Unix Perl は、pdflib_pl.so (OS X の場合:pdflib_pl.bundle)・pdflib_pl.pm・PDFlib/PDFlib.pm を、 カ レ ン ト デ ィ レ ク ト リ で検索す る か、 以下の Perl コ マ ン ド で出力 さ れ る デ ィ レ ク ト リ で検索 し ます : perl -e 'use Config; print $Config{sitearchexp};' Perl は auto/pdflib_pl サブデ ィ レ ク ト リ も 検索 し ます。 上記 コ マ ン ド の一般的な出力は次 の よ う にな り ます。 /usr/lib/perl5/site_perl/5.10/i686-linux Windows PDFlib は、 Perl 5 の Windows への ActiveState ポー ト に対応 し てい ます。 こ れ はActivePerl2 と も 呼ばれます。DLL pdflib_pl.dll と モジ ュ ールpdflib_pl.pm・PDFlib/PDFlib.pm が、 カ レ ン ト デ ィ レ ク ト リ で検索 さ れ る か、 以下の Perl コ マ ン ド で出力 さ れ るデ ィ レ ク ト リ で検索 さ れます : perl -e "use Config; print $Config{sitearchexp};" 上記 コ マ ン ド の一般的な出力は次の よ う にな り ます。 C:\Program Files\Perl5.10\site\lib デー タ 型 す。 引数は、表 2.7 に挙げ る デー タ 型に従っ て PDFlib API へ渡 さ れ る 必要があ り ま 表 2.7 Perl バイ ンデ ィ ングにおけるデー タ 型 API デー タ 型 Perl バイ ンデ ィ ングにおけるデー タ 型 文字列デー タ 型 string 1. www.perl.com を参照。 2. www.activestate.com を参照。 2.8 Perl バイ ンデ ィ ング 49 表 2.7 Perl バイ ンデ ィ ングにおけ るデー タ 型 API デー タ 型 Perl バイ ンデ ィ ングにおけるデー タ 型 バイ ナ リ デー タ 型 string Perl におけ る エ ラ ー処理 Perl バ イ ンデ ィ ン グは、 PDFlib のエ ラ ーを ネ イ テ ィ ブ Perl 例 外に翻訳 し ます。 Perl の例外は、 適切な言語構造を適用す る こ と に よ り 取 り 扱 う こ と がで き ます。 すなわち、 問題の起 こ り そ う な箇所を次の よ う に挟みます : eval { ...いろいろなPDFlib命令... }; if ($@) { die("$0: PDFlib例外が発生しました:\n$@"); 文字列処理の複数の方式 アプ リ ケーシ ョ ン での必要に応 じ て、 UTF-8 ・ UTF-16 ・ レ ガ シエン コ ーデ ィ ン グのいずれで処理を行 う こ と も で き ます。以下の コー ド ス ニペ ッ ト 群は こ の 3 つの場合すべて を演示 し てい ます。 ど の例 も 同 じ 日本語の出力を作成 し ますが、 そ れぞれ違 う 形式の入力文字列を受け取っ てい ます。 1 つ目の例は Unicode UTF-8 で処理を行い、Unicode::String モジ ュ ールを使用 し てい ま す。 こ のモジ ュ ールは最新の Perl デ ィ ス ト リ ビ ュ ーシ ョ ンに含まれてお り 、 CPAN で入手 可能です。 Perl は内部処理を UTF-8 で行 う ので、 明示的な UTF-8 変換は不要です : use Unicode::String qw(utf8 utf16 uhex); ... $p->set_option("stringformat=utf8"); $font = $p->load_font("Arial Unicode MS", "unicode", ""); $p->setfont($font, 24.0); $p->fit_textline(uhex("U+65E5 U+672C U+8A9E"), $x, $y, ""); 2 つ目の例は Unicode UTF-16 で処理を行っ てい ます。 バ イ ト 順序は リ ト ルエンデ ィ ア ン です : $p->set_option("textformat=utf16le"); $font = $p->load_font("Arial Unicode MS", "unicode", ""); $p->setfont($font, 24.0); $p->fit_textline("\xE5\x65\x2C\x67\x9E\x8A", $x, $y, ""); 3 つ目の例は Shift-JIS で処理を行っ てい ます。 Windows 以外では、 文字列変換のために 90ms-RKSJ-H CMap を利用で き る 必要があ り ます : $p->set_option("searchpath={{../../../resource/cmap}}"); $font = $p->load_font("Arial Unicode MS", "cp932", ""); $p->setfont($font, 24.0); $p->fit_textline("\x93\xFA\x96\x7B\x8C\xEA", $x, $y, ""); Unicode ・ レ ガ シ エ ン コ ーデ ィ ン グ変換 PDFlib ユーザーの便宜のために、こ こ で便利な 文字列変換方法を示 し ます。 詳 し く は Perl の説明書を参照 し て く だ さ い。 以下の コ ン ス ト ラ ク タ はバ イ ト 配列か ら UTF-16 Unicode 文字列を作成 し ます : $logos="\x{039b}\x{03bf}\x{03b3}\x{03bf}\x{03c3}\x{0020}" ; 以下の コ ン ス ト ラ ク タ は Unicode キ ャ ラ ク タ 名か ら Unicode 文字列を作成 し ます : 50 第 2 章 : PDFlib の言語バイ ンデ ィ ング $delta = "\N{GREEK CAPITAL LETTER DELTA}"; Encode モジ ュ ールは多 く のエ ン コ ーデ ィ ン グに対応 し てお り 、 そのエ ン コ ーデ ィ ン グ間 変換のための イ ン タ フ ェース を持っ てい ます : use Encode 'decode'; $data = decode("iso-8859-3", $data); # レガシからUTF-8へ変換 2.8 Perl バイ ンデ ィ ング 51 2.9 PHP バ イ ン デ ィ ン グ PDFlib PHP 版を イ ン ス ト ール PDFlib を PHP1 で使 う 際の さ ま ざ ま な方式やオプシ ョ ン に関す る 詳細な情報は、 PDFlib-in-PHP-HowTo.pdf 文書に記載 し て あ り ま す。 こ の文書は デ ィ ス ト リ ビ ュ ーシ ョ ンパ ッ ケージに含まれてお り 、 ま た、 PDFlib ウ ェ ブサ イ ト に も 掲載 し て あ り ます。 PHP を設定 し て、 外部の PDFlib ラ イ ブ ラ リ について PHP が認識す る 必要があ り ます。 2 通 り の選択肢があ り ます : > php.ini に以下の行の う ちのいずれか を追加す る : extension=php_pdflib.so ; Unix・OS X用 extension=php_pdflib.dll ; Windows用 PHP は、 ラ イ ブ ラ リ を検索する と き、 Unix では php.ini の中の extension_dir 変数で指 定 さ れたデ ィ レ ク ト リ の中を捜 し 、 Windows ではその他に標準のシ ス テ ムデ ィ レ ク ト リ の中 も 捜 し ます。 ど のバージ ョ ンの PHP PDFlib バ イ ンデ ィ ン グが イ ン ス ト ール し て あ る か を確認す る には、 次の よ う な一行 PHP ス ク リ プ ト を用い ます : <?phpinfo()?> そ う す る と 、 カ レ ン ト の PHP の設定に関 し て、 長い情報ページが表示 さ れます。 こ の ページの中で PDFlib と い う 見出 し のセ ク シ ョ ン をチ ェ ッ ク し て く だ さ い。 > ス ク リ プ ト の先頭に以下の行の う ちのいずれか を書いて PDFlib を実行時に読み込む : dl("php_pdflib.so"); Unix用 dl("php_pdflib.dll"); Windows用 PHP に合わせた PDFlib 関数のエ ラ ー戻 り 値 PHP では、 関数内でのエ ラ ー発生時に値 0 (FALSE) を返す方式が用い ら れてい る ので、 PDFlib 関数はすべて、 エ ラ ー発生時に -1 で な く 0 を返す よ う 変更 し て あ り ます。 こ の変更については、 PDFlib リ フ ァ レ ン ス の関数解 説に記 し て あ り ます。 ただ し 61 ページ 「3 章 PDF 文書を作成」 の さ ま ざ ま な コー ド 断片 例では、 エ ラ ー時に -1 を返す通常の PDFlib の方式を用いてい る ので、 読む際には注意 し て く だ さ い。 PHP におけ る フ ァ イ ル名処理 PDF や画像な ど のデ ィ ス ク 上のパ ス の指定の無いフ ァ イ ル名や相対パ ス の フ ァ イ ル名は、 PHP の Unix 版 と Windows 版 と では異な っ た取 り 扱いを 受け ます : > Unix シ ス テ ム上の PHP は、パ ス部分を ま っ た く 持た ない フ ァ イ ルを、ス ク リ プ ト が置か れてい る デ ィ レ ク ト リ の中で検索 し ます。 > Windows 上の PHP は、パ ス部分を ま っ た く 持たない フ ァ イ ルを、PHP DLL が置かれてい る デ ィ レ ク ト リ の中でのみ検索 し ます。 プ ラ ッ ト フ ォームに依存 し ない フ ァ イ ル名の取 り 扱い を行 う には、 SearchPath 機能の利用 を強 く 推奨 し ます (64 ページ 「3.1.3 リ ソ ース構成 と フ ァ イ ル検索」 参照)。 デー タ 型 す。 引数は、表 2.8 に挙げ る デー タ 型に従っ て PDFlib API へ渡 さ れ る 必要があ り ま 1. www.php.net を参照。 52 第 2 章 : PDFlib の言語バイ ンデ ィ ング 表 2.8 PHP バイ ンデ ィ ングにおけるデー タ 型 API デー タ 型 PHP バイ ンデ ィ ングにおけ るデー タ 型 文字列デー タ 型 string バイ ナ リ デー タ 型 string PHP におけ る例外処理 PHP は構造化例外処理に対応 し てい る ため、 PDFlib 例外は PHP 例外 と し て発生 し ます。 PDFlib は ク ラ ス PDFlibException の例外を発生 さ せます。 こ の ク ラ ス は PHP の標準の Exception ク ラ ス を派生 さ せた も のです。 標準的な try ~ catch 技法 を用いて PDFlib 例外を扱 う こ と がで き ます : try { ...いろいろなPDFlib命令... } catch (PDFlibException $e) { print "PDFlib例外が発生しました:\n"; print "[" . $e->get_errnum() . "] " . $e->get_apiname() . ": " $e->get_errmsg() . "\n"; } catch (Exception $e) { print $e; } Unicode ・ レ ガ シ エ ン コ ーデ ィ ン グ変換 iconv モジ ュールを用いて文字列変換がで き ま す。 詳 し く は PHP の説明書を参照 し て く だ さ い。 Eclipse と Zend Studio での PDFlib 開発 PHP Development Tools(PDT)1は Eclipse と Zend Studio に よ る PHP 開発に対応 し てい ます。 PDT は、 以下に示す手順で、 状況依存ヘルプ に対応す る よ う 設定す る こ と がで き ます。 PDFlib を Eclipse 設定に追加 し て、すべての PHP プ ロ ジ ェ ク ト に知 ら れ る よ う に し ます: > 「Window」 → 「Preferences」 → 「PHP」 → 「PHP Libraries」 → 「New...」 を選択 し て ウ ィ ザー ド を起動 し ます。 > 「User library name」 に PDFlib と 入力 し 、 「Add External folder...」 を ク リ ッ ク し て フ ォ ル ダ bind\php\Eclipse PDT を選びます。 既存ま たは新規の PHP プ ロ ジ ェ ク ト で、 PDFlib ラ イ ブ ラ リ への参照を以下の よ う に追加 す る こ と がで き ます : > PHP Explorer で PHP プ ロ ジ ェ ク ト を右 ク リ ッ ク し 、「Include Path」 → 「Configure Include Path...」 を選択 し ます。 > 「Libraries」 タ ブへ行き 、 「Add Library...」 を ク リ ッ ク し 、 「User Library」 → 「PDFlib」 を 選択 し ます。 こ れ ら の手順をふめば、 PHP Explorer ビ ューの PHP Include Path/PDFlib/PDFlib ノ ー ド 配下 で PDFlib メ ソ ッ ド の一覧を閲覧で き る よ う にな り ます。 新 し い PHP コ ー ド を書いてい る 時、 Eclipse は、 すべての PDFlib メ ソ ッ ド に対す る コー ド 補完 と 状況依存ヘルプで支援 し ます。 1. www.eclipse.org/pdt を参照。 2.9 PHP バイ ンデ ィ ング 53 2.10 Python バ イ ン デ ィ ン グ PDFlib Python 版を イ ン ス ト ール Python1 の拡張機構は共有 ラ イ ブ ラ リ を実行時に読み 込む こ と に よ っ て動作 し ます。 PDFlib バ イ ンデ ィ ン グ を動作 さ せ る には、 以下の よ う に、 Python イ ン タ プ リ タ が Python 用 PDFlib ラ イ ブ ラ リ を利用で き る よ う にす る必要があ り ま す。 こ の ラ ッ パは、PYTHONPATH 環境変数に列挙 さ れたデ ィ レ ク ト リ 内で検索 さ れます。 Python ラ ッ パの名前はプ ラ ッ ト フ ォームに よ っ て異な り ます : > Unix ・ OS X : pdflib_py.so > Windows : pdflib_py.pyd PDFlib ラ イ ブ ラ リ のほかに、以下の フ ァ イ ル も ラ イ ブ ラ リ と 同 じ デ ィ レ ク ト リ に入れてお く 必要があ り ます : > PDFlib/PDFlib.py > PDFlib/__init__.py デー タ 型 す。 引数は、表 2.9 に挙げ る デー タ 型に従っ て PDFlib API へ渡 さ れ る 必要があ り ま 表 2.9 Python バイ ンデ ィ ングにおけるデー タ 型 API デー タ 型 Python バイ ンデ ィ ングにおけるデー タ 型 文字列デー タ 型 string バイ ナ リ デー タ 型 string Python におけ る エ ラ ー処理 PDFlib は、 PDFlib 例外を Python 例外に翻訳す る エ ラ ーハ ン ド ラ を イ ン ス ト ール し ます。Python 例外は通常の try/catch で取 り 扱 う こ と がで き ます: try: ...いろいろなPDFlib命令... except PDFlibException: print("PDFlib例外が発生しました:\n[%d] %s: %s" % ((p.get_errnum()), p.get_apiname(), p.get_errmsg())) finally: p.delete() 1. www.python.org を参照。 54 第 2 章 : PDFlib の言語バイ ンデ ィ ング 2.11 REALbasic バ イ ン デ ィ ン グ PDFlib REALbasic 版を イ ン ス ト ール REALbasic 用 PDFlib プ ラ グ イ ン (PDFlib.rbx) を、 REALbasic アプ リ ケーシ ョ ンが存在す る フ ォ ルダの中の Plugins と い う フ ォ ルダに コ ピー す る 必要があ り ます。 REALbasic 用 PDFlib プ ラ グ イ ンは、 単一のパ ッ ケージで頒布 さ れ、 以下の版を含んでい ます : > OS X Carbon (PowerPC ・ Intel) > Windows > Linux こ の こ と はつま り 、 OS X か Windows バージ ョ ン を使っ て、 すべての対応 し てい る プ ラ ッ ト フ ォームのためのアプ リ ケーシ ョ ン を ビル ド す る こ と がで き る こ と を意味 し ます。 ス タ ン ド ア ロ ンのアプ リ ケーシ ョ ン を生成す る 際、REALbasic は PDFlib プ ラ グ イ ンの中の適切 な部分を選択 し て、 そのプ ラ ッ ト フ ォ ーム で必要な部分だけ を、 生成 さ れ る ア プ リ ケー シ ョ ンの中に イ ン ク ルー ド し ます。 追加の REALbasic ク ラ ス PDFlib プ ラ グ イ ンは REALbasic のオブジ ェ ク ト 階層に 2 つの 新た な ク ラ ス を追加 し ます : > PDFlib ク ラ ス。 すべての PDFlib API メ ソ ッ ド を含んでい ます。 > PDFlibException ク ラ ス。RuntimeException か ら 派生 し た も ので、PDFlib が発生 さ せ る 例 外を扱 う のに使え ます (後述)。 PDFlib を使っ て、 コ ン ソ ールアプ リ ケーシ ョ ンだけでな く GUI アプ リ ケーシ ョ ン も 作成 す る こ と がで き ます。 PDFlib は コ ン ト ロ ールではないので、 REALbasic の コ ン ト ロ ールパ レ ッ ト に新た なア イ コ ンは イ ン ス ト ール さ れません。 し か し 、 PDFlib プ ラ グ イ ンが利用可 能であれば、 REALbasic は PDFlib の ク ラ ス と その関連 メ ソ ッ ド を認識 し ます。 た と えば、 ス テー ト メ ン ト 補完機能や引数チ ェ ッ ク 機能はPDFlib API メ ソ ッ ド に対 し て完全に動作 し ます。 デー タ 型 ます。 引数は、 表 2.10 に挙げ る デー タ 型に従っ て PDFlib API へ渡 さ れ る 必要があ り 表 2.10 REALbasic バイ ンデ ィ ングにおけ るデー タ 型 API デー タ 型 REALbasic バイ ンデ ィ ングにおけるデー タ 型 文字列デー タ 型 string バイ ナ リ デー タ 型 MemoryBlock REALbasic におけ る エ ラ ー処理 例外発生時には PDFlib は ク ラ ス PDFlibException のネ イ テ ィ ブな REALbasic 例外を発生 さ せます。PDFlib 例外は REALbasic の標準的技法で処理す る こ と がで き ます : try ~ catch ブ ロ ッ ク を用い る か (推奨)、 Exception ブ ロ ッ ク で処理す る かの ど ち ら かです。 2.11 REALbasic バイ ンデ ィ ング 55 2.12 RPG バ イ ン デ ィ ン グ PDFlib は、 PDFlib 関数を埋め込まれた ILE-RPG プ ロ グ ラ ム を コ ンパ イ ルす る ために必要 なすべてのプ ロ ト タ イ プ と い く つかの有用な定数 と を定義 し た /copy モジ ュールを提供 し てい ます。 Unicode 文字列処理 PDFlib が提供す る 関数はすべて、可変長の Unicode 文字列を引数 と し て用いてい る ので、%UCS2 ビル ト イ ン関数を使っ てシ ン グルバ イ ト 文字列を Unicode 文 字列に変換する 必要があ り ます。PDFlib の関数が返す文字列はすべて可変長の Unicode 文 字列です。 こ れ ら の Unicode 文字列を シ ン グルバ イ ト 文字列に変換する には %CHAR ビル ト イ ン関数を使い ます。 注 %CHAR ・ %UCS2 関数は、 カ レ ン ト ジ ョ ブの CCSID を使っ て文字列を Unicode と 変換 し ま す。 PDFlib に同梱の例では CCSID 37 (US EBCDIC) を ベース と し ています。 この例を これ 以外の コ ー ド ページ で走ら せる と 、 オプ シ ョ ン リ ス ト 内のい く つかの特殊キ ャ ラ ク タ ({ [ ] } 等) が正 し く 翻訳 さ れない こ と があ り ます。 すべての文字列は可変長文字列 と し て渡 さ れ る ので、文字列長を明示的に指定す る必要の あ る さ ま ざ ま な関数では length 引数を渡 し てはいけ ません (可変長文字列の長 さ は、 文 字列の先頭 2 バ イ ト に格納 さ れてい ます)。 PDFlib 用 RPG プ ロ グ ラ ム を コ ンパ イ ル ・ バ イ ン ド PDFlib 関数を RPG か ら 利用す る に は、 コ ンパ イ ル済みの PDFLIB ・ PDFLIB_RPG サービ ス プ ロ グ ラ ムが必要です。 PDFlib の 定義を コ ンパ イ ル時に イ ン ク ルー ド する には、 /copy メ ンバの名前を ILE-RPG プ ロ グ ラ ム の D スペ ッ ク の中で指定す る 必要があ り ます : d/copy QRPGLESRC,PDFLIB PDFlib ソ ース フ ァ イ ル ラ イ ブ ラ リ が ラ イ ブ ラ リ リ ス ト の先頭にない場合は、その ラ イ ブ ラ リ も 指定 し なければな り ません : d/copy PDFsrclib/QRPGLESRC,PDFLIB ILE-RPG プ ロ グ ラ ムの コ ンパ イ ルを開始す る 前に、PDFlib に同梱の PDFLIB・PDFLIB_RPG サービ ス プ ロ グ ラ ム を含むバ イ ン ド デ ィ レ ク ト リ を作成 し てお く 必要があ り ます。以下の 例は、 ラ イ ブ ラ リ PDFLIB の中の PDFLIB と い う バ イ ン ド デ ィ レ ク ト リ を作成 し たい場合 の指定です : CRTBNDDIR BNDDIR(PDFLIB/PDFLIB) TEXT('PDFlib Binding Directory') バ イ ン ド デ ィ レ ク ト リ を作成 し た後は、 PDFLIB ・ PDFLIB_RPG サービ ス プ ロ グ ラ ム をバ イ ン ド デ ィ レ ク ト リ に追加する 必要があ り ます。 次の例は、 さ き に作成 し たバ イ ン ド デ ィ レ ク ト リ に ラ イ ブ ラ リ PDFLIB の中のサービ ス プ ロ グ ラ ム PDFLIB を追加 し たい場合の指定 です。 ADDBNDDIRE BNDDIR(PDFLIB/PDFLIB) OBJ((PDFLIB/PDFLIB *SRVPGM)) ADDBNDDIRE BNDDIR(PDFLIB/PDFLIB) OBJ((PDFLIB/PDFLIB_RPG *SRVPGM)) こ れで、 CRTBNDRPG コ マ ン ド (ま たは PDM の中のオプシ ョ ン 14) を用いてプ ロ グ ラ ム を コ ンパ イ ルで き る よ う にな り ま し た : 56 第 2 章 : PDFlib の言語バイ ンデ ィ ング CRTBNDRPG PGM(PDFLIB/HELLO) SRCFILE(PDFLIB/QRPGLESRC) SRCMBR(*PGM) DFTACTGRP(*NO) BNDDIR(PDFLIB/PDFLIB) デー タ 型 ます。 引数は、 表 2.11 に挙げ る デー タ 型に従っ て PDFlib API へ渡 さ れ る 必要があ り 表 2.11 RPG バイ ンデ ィ ングにおけるデー タ 型 API デー タ 型 RPG バイ ンデ ィ ングにおけるデー タ 型 文字列デー タ 型 Unicode 文字列 (%ucs2 を使用) バイ ナ リ デー タ 型 data RPG におけ る エ ラ ー処理 ILE-RPG で書かれた PDFlib ク ラ イ ア ン ト では、 ILE-RPG が提 供す る monitor/on-error/endmon エ ラ ー処理機構を利用す る こ と がでい ます。 あ る いは、 ILE-RPG の *PSSR グ ロ ーバルエ ラ ー処理サブルーチン を用いて例外を モニ タ す る方法 も あ り ます。 ジ ョ ブ ロ グにはエ ラ ー番号 と 、 失敗 し た関数、 お よ び例外の原因が示 さ れ ます。 PDFlib は呼び出 し 側プ ロ グ ラ ムへエ ス ケープ メ ッ セージ を送 り ます。 c * c * c : : * c * * c c eval p=PDF_new monitor eval doc=PDF_begin_document(p:%ucs2('/tmp/my.pdf'):docoptlist) エラー処理 on-error このエラーについて何かします PDFlibオブジェクトの解放を忘れないように callp PDF_delete(p) endmon 2.12 RPG バイ ンデ ィ ング 57 2.13 Ruby バ イ ン デ ィ ン グ PDFlib Ruby 版を イ ン ス ト ール Ruby1 の拡張機構、 共有 ラ イ ブ ラ リ を動作時に読み込む こ と に よ っ て動作 し ます。 PDFlib バ イ ンデ ィ ン グが動作する には、 Ruby 用の PDFlib 拡張 ラ イ ブ ラ リ の場所を Ruby イ ン タ プ リ タ が知っ ていて利用で き る必要があ り ます。 たいて いの場合、 こ の ラ イ ブ ラ リ (Windows ・ Unix の場合 : PDFlib.so。OS X の場合 : PDFlib.bundle) が イ ン ス ト ール さ れ る 場所は、 ロ ーカル ruby イ ン ス ト ールデ ィ レ ク ト リ の site_ruby ブ ラ ンチの中であ り 、すなわち、次の よ う な名前のデ ィ レ ク ト リ の中に イ ン ス ト ール さ れます: /usr/local/lib/ruby/site_ruby/<バージョン>/ ただ し Ruby は、 こ れ以外のデ ィ レ ク ト リ へ も 拡張を探 し に行 き ます。 こ れ ら のデ ィ レ ク ト リ の一覧を取得する には、 次の ruby コ ールを用い る こ と がで き ます : ruby -e "puts $:" こ の一覧はたいていの場合、 カ レ ン ト デ ィ レ ク ト リ を含んでい ますので、 テ ス ト 目的にお いては、 PDFlib 拡張 ラ イ ブ ラ リ と ス ク リ プ ト を同 じ デ ィ レ ク ト リ に入れ る だけで よ いで し ょ う。 デー タ 型 ます。 引数は、 表 2.12 に挙げ る デー タ 型に従っ て PDFlib API へ渡 さ れ る 必要があ り 表 2.12 Ruby バイ ンデ ィ ングにおけるデー タ 型 API デー タ 型 Ruby バイ ンデ ィ ン グにおけるデー タ 型 文字列デー タ 型 string バイ ナ リ デー タ 型 string Ruby におけ る エ ラ ー処理 Ruby バ イ ンデ ィ ン グは、 PDFlib 例外を ネ イ テ ィ ブ Ruby 例外 に翻訳す る エ ラ ーハン ド ラ を イ ン ス ト ール し ます。 こ う し た Ruby 例外は、 通常の rescue 技法で扱 う こ と がで き ます : begin ...いろいろなPDFlib命令... rescue PDFlibException => pe print "PDFlib例外がhellpサンプル内で発生しました:\n" print "[" + pe.get_errnum.to_s + "] " + pe.get_apiname + ": " + pe.get_errmsg + "\n" end Ruby on Rails Ruby on Rails2 は、 Ruby に よ る Web 開発を実現す る オープン ソ ース フ レー ム ワ ー ク です。Ruby 用 PDFlib 拡張は Ruby on Rails で利用可能です。Ruby on Rails 用 PDFlib 作成例を実行す る には以下の手順に従っ て く だ さ い : > Ruby と Ruby on Rails を イ ン ス ト ール。 > コ マ ン ド ラ イ ンか ら 新規 コ ン ト ロ ー ラ を セ ッ ト ア ッ プ : $ rails new pdflibdemo $ cd pdflibdemo 1. www.ruby-lang.org/en を参照。 2. www.rubyonrails.org を参照。 58 第 2 章 : PDFlib の言語バイ ンデ ィ ング $ cp <PDFlibディレクトリ>/bind/ruby/<バージョン>/PDFlib.so vendor/ # .so/.dll/.bundleを使用 $ rails generate controller home demo $ rm public/index.html > config/routes.rb を編集 : ... # public/index.htmlを削除することを忘れないようにしてください root :to => "home#demo" > app/controllers/home_controller.rb を以下の よ う に編集 し て、PDF内容を作成す る ための PDFlib コ ー ド を挿入。 PDF 出力は メ モ リ 内に生成 し なければな ら ない こ と に留意 し て く だ さ い。 すなわち、 空の フ ァ イ ル名を begin_document( ) に与え る必要があ り ます。 出発点 と し て、 hello-rails.rb サンプル内の コ ー ド を利用で き ます : class HomeController < ApplicationController def demo require "PDFlib" begin p = PDFlib.new ... ...PDFlibアプリケーションコード、hello-rails.rbを参照... ... send_data p.get_buffer(), :filename => "hello.pdf", :type => "application/pdf", :disposition => "inline" rescue PDFlibException => pe # エラー処理 end end end > イ ン ス ト レーシ ョ ン を試験する には、 以下の コ マ ン ド で WEBrick サーバを起動 し 、 $ rails server > そ し てブ ラ ウ ザで http://0.0.0.0:3000 を表示 さ せます。生成 さ れた PDF 文書がブ ラ ウ ザ 内に表示 さ れます。 ロ ー カ ル PDFlib イ ン ス ト レ ーシ ョ ン PDFlib を Ruby on Rails だけで使いたいに も かかわ ら ず、 PDFlib を Ruby で一般利用で き る よ う グ ロ ーバルに イ ン ス ト ールす る こ と がで き な い場合は、 Rails ツ リ ー内の vendors デ ィ レ ク ト リ の中に PDFlib を ロ ーカルに イ ン ス ト ー ルす る と い う 方法があ り ます。 こ の方法は特に、 Ruby 拡張を一般利用で き る よ う イ ン ス ト ールす る 権限を持た ない場合に、 それで も PDFlib を Rails で扱いたい と い う と き に役立 ち ます。 2.13 Ruby バイ ンデ ィ ング 59 60 第 2 章 : PDFlib の言語バイ ンデ ィ ング 3 PDF 文書を作成 3.1 PDFlib プ ロ グ ラ ミ ン グの一般的特徴 ク ッ ク ブ ッ ク プ ログ ラ ミ ングの一般的な諸側面に関する コ ー ド サン プルが general カ テ ゴ リ にあ り ます。 PDFlib ク ッ ク ブ ッ クの 3.1.1 例外処理 あ る 種のエ ラ ーは、 多 く の言語で例外 と 呼ばれてい ます。 こ の呼び方は理にかな っ てい ま す。 そ う し たエ ラ ーは ま さ に例外であ っ て、 プ ロ グ ラ ムの動作中にそんなに頻繁には起 こ ら ないだろ う と 予想 さ れ る 類の も のだか ら です。 一般に採 ら れ る 方針 と し ては、 エ ラ ーが 頻繁に起 き そ う な関数呼び出 し については従来型のエ ラ ー伝達方式 (すなわち、 -1 等の 特殊な戻 り 値でエ ラ ーを示す) を用い る けれど も 、 まれに し か起 こ ら ないエ ラ ーで、 こ ん な特例に ま で場合分け を増や し て コ ー ド をやや こ し く す る の も ど う か と 思われ る よ う な 場合については例外方式を用い る 、 と い う のが普通です。 PDFlib のや り 方 も ま さ に こ れ と 同 じ です : た と えば、 かな り の頻度でエ ラ ーが起 き そ う な操作 と し ては : > 出力フ ァ イ ルを、 パー ミ ッ シ ョ ンがないのに開 こ う と す る > PDF を読み込みたい と き 、 間違っ た フ ァ イ ル名で開 こ う と する > 画像フ ァ イ ルが壊れてい る のに開 こ う と す る PDFlib では、こ の よ う なエ ラ ーを特殊な戻 り 値で示 し ます。それぞれの値は PDFlib リ フ ァ レ ン ス に示 し て あ り ます (たいていは -1。 ただ し PHP バ イ ンデ ィ ン グでは 0)。 エ ラ ー時 に -1 を返す と 解説に記 さ れてい る 関数についてはすべて、 アプ リ ケーシ ョ ン開発者の側 で こ のエ ラ ー コ ー ド をチ ェ ッ ク す る 必要があ り ます。 こ れに対 し て、 以下に挙げ る よ う なエ ラ ーは、 も っ と 深刻か も し れない、 し か し さ ほ ど頻繁には起 こ ら ないエ ラ ーです。 > 仮想 メ モ リ 不足 > ス コ ープ違反 (た と えば文書を開 く 前に閉 じ よ う と す る) > PDFlib API 関数に対す る 引数指定の誤 り (た と えば円を負の半径で描 こ う と す る )、 ま たはオプシ ョ ン指定の誤 り PDFlib が こ の よ う な状況を認識 し た と き には、特殊なエ ラ ー戻 り 値が呼び出 し 側に渡 る の ではな く 、 例外が発生 し ます。 知っ てお く べ き 重要な こ と と し て、 例外が発生す る と 、 そ れま で生成 さ せていた PDF 文書は完了で き な く な り ます。例外の後で安全に呼べ る メ ソ ッ ド は PDF_delete( ) ・ PDF_get_apiname( ) ・ PDF_get_errnum( ) ・ PDF_get_errmsg( ) だけです。 それ以外の PDFlib の メ ソ ッ ド を例外の後で呼んだ場合の結果は予測不能です。 例外の中 には以下の情報が含まれてい ます : > 一意なエ ラ ー番号。 > 例外を起 こ し た PDFlib API 関数の名前。 > 問題の詳細な ど を述べたテ キ ス ト 。 失敗 し た関数呼び出 し の原因を ク エ リ さ き に述べた よ う に、生成中の PDF 出力文書は、 例外が起 こ っ た ら かな ら ず放棄 し なければな り ません。 ただ し 、 関数が、 エ ラ ー値を返す こ と に よ っ て、 致命的でない問題を報告 し た場合には、 文書を続行す る こ と も で き ます。 ク ラ イ ア ン ト アプ リ ケーシ ョ ンは自由に、 プ ロ グ ラ ムの流れを調整 し た り 、 別のデー タ を 与えた り す る こ と で、 文書を続行す る こ と がで き ます。 た と えば、 あ る フ ォ ン ト の読み込 3.1 PDFlib プ ロ グ ラ ミ ングの一般的特徴 61 みがで き ない と き 、 たいていの ク ラ イ ア ン ト は文書を放棄 し て し ま う で し ょ う が、 ク ラ イ ア ン ト に よ っ ては、 別の フ ォ ン ト を使っ て何 と か し たい と い う 場合 も あ り え ます。 その よ う な と き は、問題が よ り 詳 し く 記 さ れたエ ラ ー メ ッ セージ を取得 し たい場合 も あ る で し ょ う 。 その よ う な場合には、 PDF_get_errnum( ) ・ PDF_get_errmsg( ) ・ PDF_get_apiname( ) 関 数を、 問題発生 し た関数呼び出 し の直後に呼び出す こ と がで き ます。 具体的には、 エ ラ ー 値 -1 (PHP の場合 : 0) を返 し て き た関数呼び出 し の直後に呼び出 し ます。 エ ラ ーポ リ シー PDFlib はエ ラ ー状況を検出する と 、い く つかの戦略の う ちの 1 つに従っ て反応 し ます。 こ れは errorpolicy オプシ ョ ン で構成で き ます。 エ ラ ー コー ド を返す可能性 のあ る 関数はすべて、 errorpolicy オプシ ョ ンに も 対応 し てい ます。 以下のエ ラ ーポ リ シー に対応 し てい ます : > errorpolicy=legacy: こ の設定は非推奨ですが、以前のバージ ョ ンの PDFlib と 互換な動作 を保証 し ます。 すなわち例外やエ ラ ー戻 り 値を、 fontwarning ・ imagewarning と い っ たオプシ ョ ン で制御す る 方式です。 こ れは、 PDFlib 6 と の ソ ース コ ー ド 互換性を要す る アプ リ ケーシ ョ ンについてのみ推奨 し ます。 新 し いアプ リ ケーシ ョ ン では使用す る べ き ではあ り ません。 legacy 設定はデフ ォ ル ト のエ ラ ーポ リ シーです。 > errorpolicy=return : エ ラ ー状況が検出 さ れた と き 、 いかな る 警告オプシ ョ ン に も よ ら ず、 各関数がエ ラ ー値 -1 (PHP の場合 : 0) を返 し ます。 アプ リ ケーシ ョ ン開発者は こ の戻 り 値をチ ェ ッ ク し て問題を突 き と め、 その問題に対 し て アプ リ ケーシ ョ ン ご と に適切な方法で対処す る 必要があ り ます。 こ のアプ ロ ーチではエ ラ ー処理に統一的な アプ ロ ーチがで き る ので、 推奨 し ます。 > errorpolicy=exception : エ ラ ー状況が検出 さ れた と き 、 例外を発生 さ せ ま す。 た だ し 、 出力文書は例外の後には不完全 と な り 使え な く な り ます。 こ の方式を使 う と 、 エ ラ ー 条件分岐を さ ぼっ て手軽にプ ロ グ ラ ミ ン グがで き ますが、 そのかわ り 問題が起 き る と 出力文書は、 た と えそれがアプ リ ケーシ ョ ン側で対処で き る 問題であ っ て も 失われて し ま い ます。 以下の コ ー ド 断片群は、 例外処理に関す る さ ま ざ ま な戦略を演示 し ます。 こ の さ ま ざ ま な 例は、 存在す る か し ないかわか ら ない フ ォ ン ト を読み込 も う と し てい ます。 errorpolicy=return の と き は、 戻 り 値がエ ラ ーか ど う かをチ ェ ッ ク す る 必要があ り ます。 それが失敗を示 し てい る と き は、 失敗の原因を ク エ リ す る こ と で、 状況を適切に さ ば く こ と がで き る で し ょ う : font = p.load_font("MyFontName", "unicode", "errorpolicy=return"); if (font == -1) { /* フォントハンドルが無効。しかしPDF出力は継続可能。*/ errmsg = p.get_errmsg(); /* 別のフォントを試すか諦める */ ... } /* フォントハンドルは有効。継続 */ errorpolicy=exception の と き は、 エ ラ ーが発生 し た ら 文書は放棄 し なければな り ません : font = p.load_font("MyFontName", "unicode", "errorpolicy=exception"); /* 例外が発生しなければフォントハンドルは有効。 * 例外が発生したら、PDF出力は継続できない */ ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の general/error_handling ト ピ ッ ク にあ り ます。 62 第 3 章 : PDF 文書を作成 警告 問題の状況に よ っ ては、 PDFlib がそれを内部的に検出 し て も 、例外を発生 さ せてプ ロ グ ラ ムの流れを さ え ぎ る 正当な理由にはな ら ない も の も あ り ます。例外を発生 さ せ る の ではな く 、 状況の説明が ロ グ記録 さ れます。 ロ グ記録は以下の よ う に有効にで き ます : p.set_option("logging={filename=private.log}"); 警告に関 し ては以下のアプ ロ ーチを推奨 し ます : > 開発局面では警告の ロ グ記録を有効に し て、 その ロ グ フ ァ イ ル内のすべての警告 メ ッ セージ を注意深 く 研究 し ます。 こ う し た警告は、 コ ー ド やデー タ にひそむ問題を示 し てい る 可能性があ り ますか ら 、 その原因を理解ない し 除去す る よ う 努めなければな り ません。 > 運用局面では警告の ロ グ記録を無効に し て、 問題が起 き た と き だけ再び有効に し ます。 3.1.2 PDFlib 仮想 フ ァ イ ルシ ス テム (PVF) ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの general/starter_pvf ト ピ ッ ク にあ り ます。 デ ィ ス ク 上の フ ァ イ ル と は別に、 ク ラ イ ア ン ト は、 PDFlib Virtual File System (PVF) と い う し く みを利用す る こ と も で き ます。 こ れを用い る と 、 メ モ リ 内のデー タ を直接供給す る こ と がで き る ので、 デ ィ ス ク のフ ァ イ ルを扱 う 必要が ま っ た く あ り ません。 こ れには速度 向上 と い う 利点があ り ます。 PVF はデー タ ベース か ら 取 り 出 し たデー タ 等の よ う に、 フ ァ イ ル と し てデ ィ ス ク 上に存在 し ていない時に も 活用で き ます。 ま たそれ以外に も 、 ク ラ イ ア ン ト の必要 と す るデー タ が、何 ら かの処理の結果 と し て メ モ リ 上にすでに存在 し てい る 場合に対 し て一般に有用です。 PVF の基本 コ ン セプ ト は、 仮想の読み取 り 専用フ ァ イ ルに名前を付けて、 それを通常 の フ ァ イ ル名 と ま っ た く 同 じ よ う に、あ ら ゆ る API 関数で使用で き る よ う にす る と い う も のです。 UPR の構成フ ァ イ ルで も 使用する こ と がで き ます。 仮想フ ァ イ ル名は、 ク ラ イ ア ン ト が任意に名づけ る こ と がで き ます。 も ち ろん、 仮想フ ァ イ ル名は、 通常のデ ィ ス ク の フ ァ イ ル と 名前衝突が起 こ ら ない よ う な も のに し なければな り ません。 そのため、 以下の よ う な体系的な命名規則を推奨 し ます (filename は、 ク ラ イ ア ン ト が名づけ る 部分で、 各 カ テ ゴ リ 内で一意な名前です) 。 ま た、 フ ァ イ ル名の拡張子について も 、 標準に従 う こ と を推奨 し ます : > ラ ス タ 画像フ ァ イ ル : /pvf/image/filename > フ ォ ン ト のア ウ ト ラ イ ンや メ ト リ ッ ク の フ ァ イ ル (実際の フ ォ ン ト 名を フ ァ イ ル名の 先頭部分 と し て用い る こ と を推奨) : /pvf/font/filename > ICC プ ロ フ ァ イ ル : /pvf/iccprofile/filename > PDF 文書 : /pvf/pdf/filename フ ァ イ ル名を指定 さ れて捜す時、 PDFlib は まず、 その指定 さ れた フ ァ イ ル名が既知の仮想 フ ァ イ ルのなかにあ る か ど う か をチ ェ ッ ク し ます。 その後に、 指定 さ れた フ ァ イ ルをデ ィ ス ク 上で開 こ う と し ます。 仮想 フ ァ イ ルの継続期間 仮想フ ァ イ ルでデー タ が提供 さ れた と き には、 それをす ぐ に 消費す る 関数 も あ る で し ょ う し 、 そのフ ァ イ ルの一部分だけ を まず読んで、 残 り の部分は 後の時点で使 う と い う 関数 も あ る で し ょ う 。 そのため、 各仮想フ ァ イ ルの継続期間につい ては細心の注意を払 う 必要があ り ます。 PDFlib は、 それぞれの仮想フ ァ イ ルに内部 ロ ッ ク をかけてお き 、 その内容が も う 必要な く な っ た時には じ めて ロ ッ ク を外 し ます。 そのデー タ を ただちに コ ピ ー し てお く よ う ク ラ イ ア ン ト が PDFlib に要求 し た場合 (PDF_create_ pvf( ) で copy オプシ ョ ン を指定) を除いては、 仮想フ ァ イ ルの内容を ク ラ イ ア ン ト が変 更 ・削除 ・解放す る こ と が許 さ れ る のは、PDFlib が ロ ッ ク が外 し た後に限 ら れます。PDFlib 3.1 PDFlib プ ロ グ ラ ミ ングの一般的特徴 63 は、 PDF_delete( ) が実行 さ れた と き には、 自動的にすべての仮想フ ァ イ ルを削除 し ます。 し か し 、 フ ァ イ ルの実際の内容 (仮想フ ァ イ ルの元デー タ ) はつねに ク ラ イ ア ン ト が解放 し なければいけ ません。 さ ま ざ ま な戦略 PVF では、 仮想フ ァ イ ルのための必要 メ モ リ の管理アプ ロ ーチは複数 あ り え ます。 ど のアプ ロ ーチで も 考慮の対処 と する べき こ と は、 PDFlib は、 仮想フ ァ イ ル 名を用いた API呼び出 し が終わっ た後で も ま だその仮想フ ァ イ ルの内容へのア ク セ ス を必 要 と する か も し れない と い う こ と と 、 PDF_end_document( ) の後であれば も う ア ク セ ス を 必要 と す る こ と は全 く ない と い う こ と です。 留意す る 必要があ る のは、 PDF_delete_pvf( ) を呼んで も 実際の フ ァ イ ルの内容が解放 さ れ る わけではな く (copy オプシ ョ ン を指定 し た場合は例外)、 その PVF フ ァ イ ル名を管理 し ていた照応す るデー タ 構造が解放 さ れ る だ けだ と い う こ と です。 よ っ て、 以下の よ う な戦略があ り え ます : > メ モ リ 使用を最小にす る :API 呼び出 し で仮想フ ァ イ ル名を用いた ら 、その直後に PDF_ delete_pvf( ) を呼ぶのが よ いで し ょ う 。 そ し て、 PDF_end_document( ) の後に ま た PDF_ delete_pvf( ) を呼ぶ こ と を推奨 し ます。 こ の 2 度目の呼び出 し が ど う し て必要か と い う と 、 最初の呼び出 し の時点では ま だ PDFlib か ら デー タ へア ク セ ス が必要だっ たか も し れず、 その よ う な場合はその時点では仮想フ ァ イ ルの ロ ッ ク 解除が拒否 さ れて し ま っ てい る ためです。 し か し 、 最初の呼び出 し ですでにデー タ が解放で き てい る 場合 も あ る わけで、 その よ う な場合で も 2 度目の呼び出 し は何 も 害にはな り ません。 ク ラ イ ア ン ト が フ ァ イ ルの内容を解放で き る のは PDF_delete_pvf( ) が成功 し た時だけなのです。 > 仮想フ ァ イ ルを再利用 し て速度を向上 さ せ る : ク ラ イ ア ン ト に よ っ ては、 同 じ デー タ (た と えばフ ォ ン ト 定義) を複数の出力文書に対 し て使い ま わ し たい こ と も あ る で し ょ う 。 その よ う な場合には、 同 じ フ ァ イ ル内容に対 し て何度 も 作成 ・ 削除を繰 り 返すの は賢明ではあ り ません。 その仮想フ ァ イ ルを使っ てほかに も ま だ PDF 出力文書を生成 し たい う ちは、 PDF_delete_pvf( ) は呼び出 さ ないでお く のが よ いで し ょ う 。 > 手抜 き プ ロ グ ラ ミ ン グ: メ モ リ 使用量が気にな ら なければ、ク ラ イ ア ン ト がPDF_delete_ pvf( ) を全然呼ばない よ う に し て も か ま い ません。 こ の場合 PDFlib は、 PDF_delete( ) が 呼ばれた時点で、 すべての開かれた ま ま の仮想フ ァ イ ルを内部的に削除 し ます。 ど の場合で も 、 ク ラ イ ア ン ト が照応す る デー タ を解放で き る のは、 PDF_delete_pvf( ) が成 功裏に帰っ て き た時か、 PDF_delete( ) の後だけです。 PDF 出力を仮想 フ ァ イ ル内に作成 PVF は、 ユーザーデー タ を PDFlib に与え る だけでな く 、 PDFlib が生成 し た PDF 文書デー タ を保持する こ と も で き ます。 こ れは、 PDF_begin_ document( ) に createpvf オプシ ョ ン を与え る こ と に よ っ て実現で き ます。その PVF フ ァ イ ル名は以後、 別の PDFlib API 関数に与え る こ と がで き ます。 こ れはた と えば、 PDF 文書 を PDF ポー ト フ ォ リ オへ入れ込むために生成す る と き に有用です。PDFlib が作成 し た PVF デー タ を直接取得する こ と はで き ませんので、 メ モ リ か ら PDF デー タ を取 り 出すには、能 動ま たは受動 イ ン コ ア PDF 生成を用い ます (70 ページ 「3.1.4 PDF 文書を メ モ リ 内に生 成」 参照)。 3.1.3 リ ソ ース構成 と フ ァ イ ル検索 高度な応用アプ リ ケーシ ョ ンでは、PDFlib に さ ま ざ ま な リ ソ ース を利用 さ せ る 必要があ り ます。 た と えばフ ォ ン ト フ ァ イ ル ・ ICC カ ラ ープ ロ フ ァ イ ルな ど です。 PDFlib の リ ソ ース 管理を、 プ ラ ッ ト フ ォームに依存 し ない、 カ ス タ マ イ ズの容易な も のにす る ためには、 構 成フ ァ イ ルを作成 し てお く こ と がで き ます。 構成フ ァ イ ルの中には、 利用可能な さ ま ざ ま な リ ソ ース と その照応す る デ ィ ス ク フ ァ イ ル名を記述 し てお く のです。 こ の よ う な静的な 64 第 3 章 : PDF 文書を作成 構成フ ァ イ ルだけではな く て、 PDF_set_option( ) に よ る リ ソ ース の追加を用いた動的な実 行時構成 を 行 う こ と も 可能です。 構成 フ ァ イ ルに関 し て は PDFlib は、 Unix PostScript Resource (UPR) と い う 簡単なテ キ ス ト 形式を用いてい ます。 ただ し 元の UPR 形式を、 独 自の目的のために多少拡張 し て あ り ます。 こ の、 PDFlib で用い る 形の UPR フ ァ イ ル形式 については後述 し ます。 enumeratefonts オプシ ョ ン を用い る と 、PDFlib に、検索パ ス上に存在す る すべての フ ォ ン ト を収集 さ せ る こ と がで き ます (66 ページ 「フ ァ イ ル検索 と SearchPath リ ソ ース カ テ ゴ リ 」 を参照)。 saveresources オプシ ョ ン を用い る と 、 PDFlib リ ソ ース のカ レ ン ト リ ス ト を フ ァ イ ルへ書 き だす こ と がで き ます : /* フォントディレクトリを検索パスに追加 */ p.set_option("searchpath={{C:/fonts}}"); /* 検索パス上のすべてのフォントをなめてUPRファイルを作成 */ p.set_option("enumeratefonts saveresources={filename={C:/fonts/pdflib.upr}}"); リ ソ ースの カ テ ゴ リ PDFlib の対応 し てい る リ ソ ース カ テ ゴ リ を表 3.1 に挙げます。多 く のカ テ ゴ リ は、 リ ソ ース名 (PDFlib API 内で も ちい る ための) を、 仮想かデ ィ ス ク ベース の フ ァ イ ルへマ ッ プす る も のです。 表 3.1 にあ る も の以外の リ ソ ース カ テ ゴ リ は無視 さ れ ま す。 カ テ ゴ リ 名は大文字 ・ 小文字区別 さ れ ま す。 その値は名前文字列 と し て扱われ ま す。 すなわち、 ASCII か UTF-8 (行頭に BOM 付 き ) で、 あ る いは zSeries の場合には EBCDIC-UTF-8 で符号化す る こ と がで き ます。 Unicode 値は、 HostFont リ ソ ース で各国語 の フ ォ ン ト 名を指定す る のに有用で し ょ う 。 表 3.1 PDFlib で使え る リ ソ ース カ テ ゴ リ カテゴ リ 形式 説明 SearchPath pathname デー タ フ ァ イルのあ るデ ィ レ ク ト リ の相対または絶対パス名 CMap cmapname=filename 日中韓エ ン コ ーデ ィ ングのための CMap フ ァ イル FontAFM fontname=filename AFM 形式の PostScript フ ォ ン ト メ ト リ ッ ク フ ァ イル FontPFM fontname=filename PFM 形式の PostScript フ ォ ン ト メ ト リ ッ ク フ ァ イル FontOutline fontname=filename PostScript ・ TrueType ・ OpenType ・ WOFF ・ CEF の う ちいずれ かのフ ォ ン ト アウ ト ラ イ ン フ ァ イル Encoding encodingname=filename 8 ビ ッ ト エ ン コ ーデ ィ ングま たは コ ー ド ページのテーブルを 持っ たテキス ト フ ァ イル HostFont fontname=hostfontname シ ス テムに イ ン ス ト ール さ れてい る フ ォ ン ト の名前 (通常、 両方の フ ォ ン ト 名は等 し い) FontnameAlias aliasname=fontname PDFlib がすでに知っ ている フ ォ ン ト に対 し て エ イ リ ア ス を作 成 ICCProfile profilename=filename ICC カ ラ ープ ロ フ ァ イル名 UPR フ ァ イ ル形式 UPR フ ァ イ ルはテ キ ス ト フ ァ イ ルであ り 、 その構造は非常に単純で、 テ キ ス ト エデ ィ タ で簡単に書 く こ と がで き ま す し 、 自動生成 さ せ る こ と も で き ま す。 ま ず、 その文法を見てみま し ょ う : > それぞれの行は最大 1023 キ ャ ラ ク タ ま で。 > 行末のバ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ 「\」 は、 行終端を キ ャ ン セル し ます。 こ れは行を 延長 し たい と き に使え ます。 3.1 PDFlib プ ロ グ ラ ミ ングの一般的特徴 65 > パーセ ン ト 「%」 キ ャ ラ ク タ は、 行末ま での注釈を開始 さ せます。 行デー タ の一部であ る (すなわち注釈を開始 さ せない) パーセ ン ト キ ャ ラ ク タ は、直前にバ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ を付けて保護す る 必要があ り ます。 > 行終端 を 保護す る バ ッ ク ス ラ ッ シ ュ と 、 パーセ ン ト キ ャ ラ ク タ を 保護す る バ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ と の直前のバ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ 群は、 行デー タ の一部で あ る な ら 二重にす る 必要があ り ます。 > ピ リ オ ド 「.」 を単独で用い る と 、 セ ク シ ョ ンの終了を意味 し ます。 > すべてのエン ト リ は、 大文字 ・ 小文字を区別 し ます。 > スペース は、 リ ソ ース名中 と フ ァ イ ル名中をのぞ く あ ら ゆ る箇所で無視 さ れます。 > リ ソ ース の名前を値は、 等号 「=」 を一切含んではいけ ません。 > 1 個の リ ソ ース が複数回定義 さ れた場合は、最後の定義がそれ以前の定義を上書 き し ま す。 UPR フ ァ イ ルは以下の部分か ら 成っ てい ます : > フ ァ イ ルの種類を示すおま じ ない行。 次の形を と り ます : PS-Resources-1.0 > フ ァ イ ル中で記述 さ れ る すべての リ ソ ース カ テ ゴ リ を一覧に し たセ ク シ ョ ン。 省略可 能です。 各行に 1 つずつ リ ソ ース カ テ ゴ リ を記述 し ます。 こ の一覧は、 ピ リ オ ド 1 個 だけの行に よ っ て終了 し ます。利用可能な リ ソ ース カ テ ゴ リ については後述 し ます。こ の省略可能なセ ク シ ョ ンが存在 し ない場合であ っ て も 、1 個の ピ リ オ ド キ ャ ラ ク タ は存 在す る 必要があ り ます。 > フ ァ イ ルのは じ めに挙げ ら れた リ ソ ース カ テ ゴ リ それぞれについてセ ク シ ョ ンが 1 つ ずつ。 各セ ク シ ョ ンは、 リ ソ ース カ テ ゴ リ を示す 1 行で始ま り 、 その後に、 利用可能 な リ ソ ース を記述す る 行が任意の行数つづ き ます。 こ の一覧は、 ピ リ オ ド 1 個だけの 行に よ っ て終了 し ます。 各 リ ソ ース デー タ 行には リ ソ ース の名前を書 き ます (等号は ク ォー ト す る 必要があ り ます)。 その リ ソ ース がフ ァ イ ル名を必要 と する 場合には、 等 号の後に こ の名前を付け加え る 必要があ り ます。 リ ソ ー ス エ ン ト リ に列挙 さ れた フ ァ イ ルを PDFlib が さ がす時には SearchPath (以下を参照) が適用 さ れます。 フ ァ イ ル検索 と SearchPath リ ソ ース カ テ ゴ リ PDFlib は さ ま ざ ま なデー タ ア イ テ ム を デ ィ ス ク 上の フ ァ イ ルか ら 読み込みます。 た と えば ラ ス タ 画像 ・ フ ォ ン ト ア ウ ト ラ イ ン ・ フ ォ ン ト メ ト リ ッ ク 情報 ・ PDF 文書 ・ ICC カ ラ ープ ロ フ ァ イ ルな ど です。 相対パ ス名で も 絶対パ ス名で も ない、 パ ス指定を ま っ た く つけないフ ァ イ ル名を用い る こ と も で き ます。 SearchPath リ ソ ース カ テ ゴ リ を使 う と 、必要なデー タ フ ァ イ ルのあ るデ ィ レ ク ト リ のパ ス 名の一覧を指定す る こ と がで き ます。 何か フ ァ イ ルを開かなければな ら ない と き 、 PDFlib は、 ま ずそ の ま ま の フ ァ イ ル名で フ ァ イ ル を 開 こ う と し ま す。 こ の試みが失敗す る と 、 PDFlib は、SearchPath リ ソ ース カ テ ゴ リ で指定 さ れたデ ィ レ ク ト リ 群の中でその フ ァ イ ル が開けないか ど う か、 成功す る ま で一つ一つ試 し ます。 SearchPath 項目を蓄積 さ せ る こ と も で き 、 それ ら は逆順に検索 さ れます (後の時点で設定 さ れたパ ス ほ ど、 も っ と 早 く に設 定 さ れた も の よ り も 先に検索 さ れ る )。 こ の機能を使 う と 、 PDFlib のアプ リ ケーシ ョ ン を、 プ ラ ッ ト フ ォーム依存な フ ァ イ ルシ ス テ ム体系か ら 解き 放つ こ と がで き ます。検索パ ス エ ン ト リ を設定す る には以下の よ う に し ます : p.set_option("SearchPath={{/パス/パス/ディレクトリ1}}"); p.set_option("SearchPath={{/パス/パス/ディレクトリ2}}"); 検索パ ス を複数設定す る こ と も で き 、 ま た、 複数のデ ィ レ ク ト リ 名を 1 回の呼び出 し の中 で与え る こ と も で き ます。空白キ ャ ラ ク タ を含んだデ ィ レ ク ト リ 名に よ る問題を避け る た 66 第 3 章 : PDF 文書を作成 めに、 エン ト リ が 1 個だけの場合に も 中カ ッ コ を二重に用い る こ と を推奨 し ます。 空の文 字列 リ ス ト (例 : {{}}) は、 既存のすべての検索パス を、 デフ ォ ル ト 項目 も 含めて削除 し ます。 こ の検索を無効にする には、 フルパ ス に よ る 指定を PDFlib 関数の中に書き ます。 なお、 SearchPath リ ソ ー ス カ テ ゴ リ の機能は以下の よ う にプ ラ ッ ト フ ォ ーム依存にな っ てい ま す: > Windows の場合、PDFlib はレ ジ ス ト リ か ら の項目群で SearchPath を初期化 し ます。以下 の レ ジ ス ト リ エン ト リ にパス名の リ ス ト を セ ミ コ ロ ン 「;」 で区切っ て指定す る こ と が 可能です。 こ れ ら は以下の順序で検索 さ れます : HKLM\SOFTWARE\PDFlib\PDFlib9\9.0.1\SearchPath HKLM\SOFTWARE\PDFlib\PDFlib9\SearchPath HKLM\SOFTWARE\PDFlib\SearchPath > COM イ ン ス ト ー ラ は、 こ の SearchPath レ ジ ス ト リ エン ト リ を、 以下のデ ィ レ ク ト リ で 初期化 し ます (PDFlib を別の場所に イ ン ス ト ール し た場合には同様のデ ィ レ ク ト リ ) : C:\Program Files\PDFlib\PDFlib 9.0.1\resource > i5/iSeries では、 SearchPath リ ソ ース カ テ ゴ リ は以下の値で初期化 さ れます : /PDFlib/PDFlib/9.0/resource/icc /PDFlib/PDFlib/9.0/resource/fonts /PDFlib/PDFlib/9.0/resource/cmap /PDFlib/PDFlib/9.0 /PDFlib/PDFlib /PDFlib こ れ ら のエ ン ト リ の最後の も のは特に、 複数の製品に対す る ラ イ セ ン ス フ ァ イ ルを格 納す る ために有用です。 デ フ ォ ル ト フ ァ イ ル検索パス Unix ・ Linux ・ OS X ・ i5/iSeries シ ス テ ムでは、 パ ス ・ デ ィ レ ク ト リ 名を一切指定 し な く て も 、い く つかのデ ィ レ ク ト リ がデフ ォ ル ト で フ ァ イ ル検索 さ れます。 UPR フ ァ イ ル (追加の検索パ ス を内容 と し て持つ可能性のあ る ) を検索 し て読 み取 る 前に、 以下のデ ィ レ ク ト リ が検索 さ れます : <rootpath>/PDFlib/PDFlib/9.0/resource/cmap <rootpath>/PDFlib/PDFlib/9.0/resource/codelist <rootpath>/PDFlib/PDFlib/9.0/resource/glyphlst <rootpath>/PDFlib/PDFlib/9.0/resource/fonts <rootpath>/PDFlib/PDFlib/9.0/resource/icc <rootpath>/PDFlib/PDFlib/9.0 <rootpath>/PDFlib/PDFlib <rootpath>/PDFlib Unix ・ Linux ・ OS X では、 <rootpath> は まず /usr/local へ置 き 換え ら れ、 ついで HOME デ ィ レ ク ト リ へ置 き 換え ら れます。 i5/iSeries では、 <rootpath> は空です。 デ フ ォ ル ト フ ァ イ ル名 と ラ イ セ ン ス フ ァ イ ル ・ リ ソ ース フ ァ イ ル デフ ォ ル ト では、 以 下の フ ァ イ ル名が、 デフ ォ ル ト 検索パ スデ ィ レ ク ト リ 群の中で検索 さ れます : licensekeys.txt pdflib.upr (ライセンスファイル。MVSの場合: license) (リソースファイル。MVSの場合: upr) 3.1 PDFlib プ ロ グ ラ ミ ングの一般的特徴 67 こ の機能を利用す る と 、 ラ イ セ ン ス フ ァ イ ルを、 環境変数や実行時オプシ ョ ン を一切設定 し ないで扱 う こ と がで き ます。 サン プル UPR フ ァ イ ル UPR 構成フ ァ イ ルの作成例を以下に挙げます : PS-Resources-1.0 . SearchPath /usr/local/lib/fonts C:/psfonts/pfm C:/psfonts /users/kurt/my_images . FontAFM Code-128=Code_128.afm . FontPFM Corporate-Bold=corpb___.pfm Mistral=c:/psfonts/pfm/mist____.pfm . FontOutline Code-128=Code_128.pfa ArialMT=Arial.ttf . HostFont Wingdings=Wingdings . ICCProfile highspeedprinter=cmykhighspeed.icc . UPR リ ソ ース フ ァ イ ルを検索 組み込み リ ソ ー ス (た と えば PDF コ ア フ ォ ン ト ・ sRGB ICC プ ロ フ ァ イ ル) やシ ス テ ム リ ソ ース (た と えばホ ス ト フ ォ ン ト ) だけが使われ る 場合 には、 UPR 構成フ ァ イ ルは必要 と は さ れません。 なぜな ら 、 と り たてて構成がな く て も 、 必要な リ ソ ース をすべて PDFlib が見つけ ら れ る か ら です。 それ以外の リ ソ ー ス を 使い た い場合は、 そ の リ ソ ー ス を 指定す る た めに、 PDF_set_ option( ) (後述) を呼び出すか、 UPR リ ソ ー ス フ ァ イ ルに記述 し ま す。 こ の フ ァ イ ルを、 PDFlib は、 最初の リ ソ ース が要求 さ れた時に自動的に読み込みます。 その過程は詳 し く は 以下の と お り です : > Unix シ ス テ ム ・ OS X ・ i5/iSeries では、 パ ス ・ デ ィ レ ク ト リ 名を一切指定 し な く て も 、 デフ ォ ル ト でい く つかのデ ィ レ ク ト リ で ラ イ セ ン ス ・ リ ソ ース フ ァ イ ルが検索 さ れ ま す。 UPR フ ァ イ ルを検索 し て読み取 る 前に、 以下のデ ィ レ ク ト リ が検索 さ れます ( こ の順に) : <rootpath>/PDFlib/PDFlib/9.0/resource/icc <rootpath>/PDFlib/PDFlib/9.0/resource/fonts <rootpath>/PDFlib/PDFlib/9.0/resource/cmap <rootpath>/PDFlib/PDFlib/9.0 <rootpath>/PDFlib/PDFlib <rootpath>/PDFlib Unix シ ス テ ム と OS X では、 <rootpath> は、 まず /usr/local で、 ついで HOME デ ィ レ ク ト リ で置 き 換え ら れます。 i5/iSeries では <rootpath> はは空です。 こ の機能を利用す 68 第 3 章 : PDF 文書を作成 れば、 環境変数や実行時オプシ ョ ン を一切指定せずに ラ イ セ ン ス フ ァ イ ル ・ UPR フ ァ イ ル ・ リ ソ ース を取 り 扱 う こ と も で き ます。 > 環境変数 PDFLIBRESOURCE が定義 さ れていれば、その値を PDFlib は、読み込むべ き UPR フ ァ イ ルの名前 と し ます。 こ の フ ァ イ ルが読み込めない と き は例外が発生 し ます。 > 環境変数 PDFLIBRESOURCE が定義 さ れていない場合、PDFlib は以下の名前の フ ァ イ ルを 開 こ う と し ます : upr (MVSの場合。データセットが期待される) pdflib/<バージョン>/fonts/pdflib.upr (IBM i5/iSeriesの場合) pdflib.upr (Windows・Unix・その他すべてのシステムの場合) こ の フ ァ イ ルが読み込めない と き は例外は発生 し ません。 > Windows では上記以外に PDFlib は以下の レ ジ ス ト リ エン ト リ を読み込 も う と し ます。以 下の順に検索 さ れます : HKLM\Software\PDFlib\PDFlib8\9.0.1\resourcefile HKLM\Software\PDFlib\PDFlib8\resourcefile HKLM\Software\PDFlib\resourcefile そ し て こ れ ら のエ ン ト リ の値を、 用い る べ き リ ソ ー ス フ ァ イ ルの名前 と し ます。 こ の フ ァ イ ルが読み込めない と き は例外が発生 し ます。 64 ビ ッ ト Windows シ ス テ ム上で レ ジ ス ト リ を手作業で扱 う 際には注意が必要です : 通常どお り 、 64 ビ ッ ト の PDFlib バ イ ナ リ は Windows レ ジ ス ト リ の 64 ビ ッ ト ビ ュ ー と と も に動作 し 、 64 ビ ッ ト シ ス テ ム上 で動作す る 32 ビ ッ ト の PDFlib バ イ ナ リ はレ ジ ス ト リ の 32 ビ ッ ト ビ ュ ー と と も に動作 し ます。32 ビ ッ ト 製品に対す る レ ジ ス ト リ キーを手作業で追加す る必要があ る と き は、 必ず 32 ビ ッ ト 版の regedit ツールを使用 し て く だ さ い。 こ れは 「ス タ ー ト 」 ダ イ ア ロ グか ら 以下に よ っ て起動す る こ と がで き ます : %systemroot%\syswow64\regedit > ク ラ イ ア ン ト 側で resourcefile オプシ ョ ン を明示的に設定す る こ と で リ ソ ース フ ァ イ ル を PDFlib に実行時に読み込ませ る こ と も で き ます。 以下の よ う に記述 し ます : p.set_option("resourcefile={/パス/パス/pdflib.upr}"); こ の呼び出 し は任意の回数繰 り 返す こ と がで き ます。 その場合、 リ ソ ース エ ン ト リ が 蓄積 さ れてい き ます。 リ ソ ース を実行時に構成 UPR フ ァ イ ルを使っ た構成だけではな く 、 ソ ース コ ー ド 中で PDF_set_option( ) を使っ て直接個々の リ ソ ース を構成す る こ と も で き ます。 こ の関数はカ テ ゴ リ 名 と それに照応す る リ ソ ース エン ト リ を と り ます。 リ ソ ース記述の部分は、 UPR リ ソ ース フ ァ イ ルで こ のカ テ ゴ リ のセ ク シ ョ ンに書 く の と 同 じ よ う に書 き ます。 た と えば : p.set_option("FontAFM={Foobar-Bold=foobb___.afm}"); p.set_option("FontOutline={Foobar-Bold=foobb___.pfa}"); 注 フ ォ ン ト 構成の詳 し い説明は 131 ページ 「5.4.4 フ ォ ン ト を検索」 を参照 し て く だ さ い。 リ ソ ース値を ク エ リ リ ソ ース エン ト リ を設定す る だけでな く 、PDF_get_option( ) を使っ て ク エ リ す る こ と も で き ます。 カ テ ゴ リ 名を キー と し て、 リ ソ ース の番号 (1 か ら 開始) を オプシ ョ ン と し て指定 し ます。 た と えば以下の呼び出 し : idx = p.get_option("SearchPath", "resourcenumber=" + n); sp = p.get_string(idx, ""); 3.1 PDFlib プ ロ グ ラ ミ ングの一般的特徴 69 は、 SearchPath リ ス ト 内の n 番目のエン ト リ を取得 し ます。 要求 さ れた カ テ ゴ リ に対 し て 利用可能なエン ト リ の数 よ り も n が大 き い と き は、 空文字列が返 さ れます。 返 さ れた文字 列は、 何 ら かの API 関数が次に呼び出 さ れ る ま で有効です。 3.1.4 PDF 文書を メ モ リ 内に生成 フ ァ イ ル上に PDF 文書を生成す る だけではな く 、 PDFlib を使っ て メ モ リ 内に直接 PDF を 生成 さ せ る こ と も で き ます ( イ ン コ ア生成 と いい ます) 。 こ の技法は、 何 ら デ ィ ス ク ベー ス の入出力が伴わ な い た めに速度の面で利点が あ り ま す し 、 PDF 文書 を た と えば直接 HTTP で流 し た り す る こ と も で き ます。 Web 管理者が聞いて特に喜びそ う なのは、 自分の サーバにテ ン ポ ラ リ PDF フ ァ イ ルを散 ら か さ れずに済む と い う こ と で し ょ う 。 生成 さ れ る デー タ は、 定期的に少 し ずつ集め る こ と も で き ます し (た と えば各ページ がで き る ご と に)、 最後に ま る ご と PDF 文書にな っ てか ら ひ と かた ま り で取 り 出す こ と も で き ます (PDF_end_document( ) の後で) 。 PDF デー タ の細切れでの生成お よ び消費には い く つかの利点があ り ます。 第一に、 デー タ 全体が メ モ リ 内に収ま る必要がないので、 メ モ リ 必要量が小 さ く て済みます。 第二に、 こ の方式では速度 も 上が る 可能性があ り ます。 なぜな ら 、 遅い接続でデー タ を伝送 し てい る 場合で も 、 最初の 1 チ ャ ン ク を送 り 出 し てい る 間に、 次の 1 チ ャ ン ク が も う 生成中だか ら です。 ただ し 、 生成 さ れ るデー タ の総量は文 書全体がで き あが る ま でわか り ません。 createpvf オプシ ョ ン を用い る と 、PDF デー タ をデ ィ ス ク フ ァ イ ルへ書 き 込む こ と な く 、 メ モ リ 内へ生成 し 、 その後それを PDFlib に渡す こ と がで き ます (64 ページ 「PDF 出力を 仮想フ ァ イ ル内に作成」 参照)。 能動 イ ン コ ア PDF 生成 イ ン タ フ ェ ース PDF デー タ を メ モ リ 内に作成す る には、 PDF_ begin_document( ) で空の フ ァ イ ル名を指定 し 、 PDF_get_buffer( ) でデー タ を取得 し ます : p.begin_document("", ""); ...文書を作成... p.end_document(""); buf = p.get_buffer(); ... バッファ内のPDFデータを利用 ... p.delete(); 注 バ ッ フ ァ 内の PDF デー タ はバイ ナ リ デー タ と し て扱 う 必要があ り ます。 こ れは 「能動」 モー ド と 捉え ら れます。 なぜな ら 、 バ ッ フ ァ 内容をいつ取 り 出 し たいかを ク ラ イ ア ン ト 側で決めてい る か ら です。能動モー ド はすべての対応言語バ イ ンデ ィ ン グで 利用可能です。 注 C と C++ のク ラ イ ア ン ト では、 返っ て き たバ ッ フ ァ を解放 し てはいけません。 受動 イ ン コ ア PDF 生成 イ ン タ フ ェ ース 「受動」 モー ド は、 C と C++ の言語バ イ ンデ ィ ン グでのみ利用可能です。 こ の場合、 ユーザーは、 1 つの コールバ ッ ク 関数を イ ン ス ト ー ル し ます (PDF_open_document_callback( ) を通 じ て)。 こ の関数は、 PDFlib に よ っ て、 予 測不可能な さ ま ざ ま な時点で呼ばれます。PDF デー タ が消費 さ れ る のを待っ てい る 時には いつで も 呼ばれ る こ と にな り ます。 放出 ( ラ イ ブ ラ リ か ら ク ラ イ ア ン ト への PDF デー タ の転送) に関す る タ イ ミ ン グ上の、 ひいてはバ ッ フ ァ 容量上の束縛条件は、 ク ラ イ ア ン ト 側で構成する こ と がで き る ので、 柔軟性が非常に高 く な っ てい ます。 環境に よ っ て、 PDF 文書を ま る ご と 一度に取 り 出すのが好都合な場合 も あ る で し ょ う し 、複数のチ ャ ン ク に分 け る のが よ い場合 も あ る で し ょ う し 、た く さ んの コ マ切れに分けて PDFlib の内部文書バ ッ 70 第 3 章 : PDF 文書を作成 フ ァ 量 を 抑 え る のが望 ま し い場合 も あ る で し ょ う 。 放出の手法 を 設定す る には、 PDF_ open_document_callback( ) で flush オプシ ョ ンの値を指定 し ます。 3.1.5 PDF 文書の最大サ イ ズ と その他の制限 PDF 文書のサ イ ズ 多 く のユーザーはギガバ イ ト 単位の PDF 文書を扱 う 必要には迫 ら れ ないで し ょ う が、 業務アプ リ ケーシ ョ ンのなかには、 大量の請求書や明細な ど を含む文書 を作成 し た り 処理 し た り す る 必要があ る も のがあ り ます。PDFlib 自体は生成す る 文書のサ イ ズにいかな る 制約 も 設けてい ませんが、 PDF Reference やい く つかの PDF 規格に よ っ て 課せ ら れ る い く つかの制限があ り ます : > 2 GB フ ァ イ ルサ イ ズ制限:PDF/A では、フ ァ イ ルサ イ ズ を 2 GB ま でに制限 し てい ます。 1 文書が こ の制限 よ り も 大 き く な る と き は、 PDFlib は PDF/A ・ PDF/X-4/5 モー ド では 例外を発生 さ せます。 それ以外の場合であれば 2 GB を超え る 文書を作成で き ます。 > 10 GB フ ァ イ ルサ イ ズ制限:PDF 文書は伝統的に、相互参照テーブルに よ っ て内部的に、 10 進 10 桁すなわち 1010-1 バ イ ト ま でに制限 さ れて き ま し た。 こ れはお よ そ 9.3 GB に あ た り ます。 し か し 、 圧縮オブジ ェ ク ト ス ト リ ーム を用いれば こ の制約は超え る こ と がで き ます。 10 GB を超え る 出力文書を作成 し よ う と す る な ら 、 PDF 1.5 以上が必要で す。 圧縮オブジ ェ ク ト ス ト リ ームはいずれにせ よ フ ァ イ ル全体のサ イ ズ を低減 さ せま すが、 objectstreams 実装の一部であ る 圧縮相互参照ス ト リ ームは も はや 10 進 10 桁の 制限下には置かれず、 し たがっ て 10 GB を超え る PDF 文書の作成を可能に し ます。 > オブジ ェ ク ト の数 : 一文書内のオブジ ェ ク ト の数は全般的には PDF に よ っ て制限 さ れ てい ませんが、 PDF/A ・ PDF/X-4 ・ PDF/X-5 規格では、 一文書内の間接オブジ ェ ク ト の数を 8,388,607 個に制限 し てい ます。一文書が こ の制限を超え る オブジ ェ ク ト を必要 と する と き は、 PDFlib は PDF/A-1 ・ PDF/X-4 ・ PDF/X-5 モー ド では例外を発生 さ せま す。 それ以外の場合であれば も っ と オブジ ェ ク ト の多い文書を作成で き ます。 PDF 内 のオブジ ェ ク ト の数は、 ページ内容の複雑 さ や、 相互参照要素の数な ど に依存 し ます。 シ ンプルな内容の大容量文書は通常ページ あ た り 4 ~ 10 個のオブジ ェ ク ト を持ち ます ので、100 ~ 200 万ページ程度の文書であれば、規格が要求す る こ のオブジ ェ ク ト 制限 を超えずに作成す る こ と がで き ます。 PDF の制限 PDFlib は、特定の実体に制約を課す こ と に よ っ て、PDF Reference か Acrobat、 ま たは何 ら かの PDF 規格に よ っ て課せ ら れ る 制限に準拠する PDF 出力を作成 し ます。 こ れ ら の制限を以下に記 し ます。 以下の制限が、 値を然 る べ く 変更す る こ と に よ っ て強制 さ れます : > PDF 内におけ る 最小の絶対浮動小数点値:0.000015。 こ れ よ り 小 さ な絶対値を持つ数は 0 へ置換 さ れます。 > (PDF 1.4。ただ し それ よ り 新 し い PDF バージ ョ ンにはあ ては ま り ません)PDF 内におい て浮動小数点数 と し て表現で き る 最大の絶対値 : 32767.0。 こ れ よ り 大 き な絶対値を持 つ数は、 その最 も 近い整数へ置換 さ れます。 PDFlib は、 PDF 出力フ ァ イ ルサ イ ズに関 し ては静的な制限を何 ら 持ち ま せん。 ただ し 、 PDF 形式が特定の制限を課 し てい ます。 ですので、 以下のいずれか 1 つの制限を超え る と 、 例外が発生 し ます : > PDF 内において許容 さ れ る 最大の数値 : 2,147,483,647 > ハ イ パーテ キ ス ト 文字列の最大長 : 65535 > ページ上のテ キ ス ト 文字列の最大長 : kerning=false かつ wordspacing=0 の場合には 32,763 バ イ ト (すなわち、 CID フ ォ ン ト の場合には 16,381 キ ャ ラ ク タ )。 そ う でない な ら 4095 キ ャ ラ ク タ 3.1 PDFlib プ ロ グ ラ ミ ングの一般的特徴 71 > 以下のオプシ ョ ンの リ ス ト エン ト リ は最大 8191 個に制限 さ れてい ます : views, namelist, polylinelist, fieldnamelist, itemnamelist, itemtextlist, children, group > PDF/A-1/2/3 と PDF/X-4/5 内におけ る 最大間接オブジ ェ ク ト 数 : 8,388,607 3.1.6 EBCDIC ベースのプ ラ ッ ト フ ォ ームで PDFlib を使 う PDF フ ァ イ ル形式の中のオペレー タ と 制御構造は ASCII ベース であ り 、 z/OS ・ USS ・ MVS オペレーテ ィ ン グ シ ス テ ム を搭載 し た i5/iSeries・zSeries と いっ た EBCDIC ベース のプ ラ ッ ト フ ォームでは正 し く 動作 し ません (ただ し zLinux は ASCII ベース ですので こ の限 り で はあ り ません)。 し か し 、 特別な メ イ ン フ レームバージ ョ ンの PDFlib を利用すれば、 ASCII ベース の PDF オペレー タ と EBCDIC の (ま たはそれ以外の) テ キ ス ト 出力 と を混ぜ る こ と がで き ます。 こ う し た EBCDIC セーフ なバージ ョ ンの PDFlib は、 さ ま ざ ま なオペレー テ ィ ン グ シ ス テ ムやマシ ン アーキ テ ク チ ャ で利用可能です。 PDFlib の さ ま ざ ま な機能を EBCDIC ベース のプ ラ ッ ト フ ォームで活用す る ためには、 以下のア イ テ ムは EBCDIC テ キ ス ト 形式で与え ら れ る こ と が期待 さ れます( よ り 具体的に は、 i5/iSeries では コ ー ド ページ 037 で、 zSeries では コ ー ド ページ 1047 で) : > PFA フ ォ ン ト フ ァ イ ル ・ UPR 構成フ ァ イ ル ・ AFM フ ォ ン ト メ ト リ ッ ク フ ァ イ ル > エン コ ーデ ィ ン グ フ ァ イ ル ・ コ ー ド ページ フ ァ イ ル > PDFlib 関数の文字列引数 > 入出力フ ァ イ ル名 > 環境変数 (実行環境が対応 し てい る 場合) > PDFlib のエ ラ ー メ ッ セージ も EBCDIC 形式で生成 さ れます (Java 以外)。 ASCII 形式の入力テ キ ス ト フ ァ イ ル (PFA ・ UPR ・ AFM ・ エン コ ーデ ィ ン グ) を使いたい 場合は、 asciifile オプシ ョ ン を true に設定 し ます (デフ ォ ル ト は、 zSeries では false、 i5/ iSeries では true)。 す る と PDFlib は、 こ れ ら の フ ァ イ ルが ASCII エン コ ーデ ィ ン グで書か れてい る と 期待する よ う にな り ます。 ただ し その場合で も 、 文字列引数はやは り EBCDIC エン コ ーデ ィ ン グであ る と 期待 さ れます。 こ れに対 し 、 以下のア イ テ ムはつねにバ イ ナ リ モー ド で取 り 扱 う 必要があ り ます (す なわち、 いかな る 変換 も 行っ てはいけ ません) : > PDF 入出力フ ァ イ ル > PFB フ ォ ン ト ア ウ ト ラ イ ン フ ァ イ ル ・ PFM フ ォ ン ト メ ト リ ッ ク フ ァ イ ル > TrueType ・ OpenType フ ォ ン ト フ ァ イ ル > 画像フ ァ イ ル ・ ICC プ ロ フ ァ イ ル 72 第 3 章 : PDF 文書を作成 3.2 ページ記述 3.2.1 座標系 PDF のデフ ォ ル ト 座標系が PDFlib の内部では用い ら れてい ます。 デフ ォ ル ト 座標系 (デ フ ォ ル ト ユーザースペース と も い う ) では、 ページの左下隅に原点があ り 、 DTP ポ イ ン ト を単位 と し て用いてい ます : 1 pt = 1/72 inch = 25.4/72 mm = 0.3528 mm 1 番目の座標は右へ向か っ て増加 し 、 2 番目の座標は上へ向か っ て増加 し ます。 PDFlib の ク ラ イ ア ン ト プ ロ グ ラ ム では、 こ のデフ ォ ル ト ユーザー ス ペー ス を回転 ・ 拡縮 ・ 並行移 動 ・ 斜形化 さ せ る こ と に よ っ て、 新 し いユーザー座標を作る こ と も で き ます。 こ う し た変 形に対応す る 関数はそれぞれ PDF_rotate( ) ・ PDF_scale( ) ・ PDF_translate( ) ・ PDF_skew( ) で す。 座標系を変更 し た場合、 グ ラ フ ィ ッ ク ・ テ キ ス ト 関数の中の座標はすべて新 し い座標 系に従っ て指定 し なければな り ません。 座標系は、 各ページの最初でデフ ォ ル ト 座標系に 再設定 さ れます。 メ ー ト ル座標を用い る メ ー ト ル座標を、 座標系を拡縮す る こ と に よ っ て簡単に使え ま す。 縮尺は、 上記の DTP ポ イ ン ト の定義 よ り 導かれます : p.scale(28.3465, 28.3465); こ の呼び出 し の後は、 PDFlib はすべての座標を セ ンチ メ ー ト ル単位 と し て解釈 し ます ( イ ン タ ラ ク テ ィ ブ機能については例外、 後述)。 こ れは 72÷2.54 = 28.3465 だか ら です。 関連す る 機能 と し て、 PDF_begin/end_page_ext( ) で userunit オプ シ ョ ン を 指定 し て (PDF 1.6) ページ全体に対す る 縮尺 を 与え る こ と も で き ま す。 た だ し ユーザー座標は、 Acrobat での最終的なページ表示に対 し てのみ効力を持つ も のであ り 、 PDFlib で座標の拡 縮を行 う も のではあ り ません。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの general/metric_topdown_coordinates ト ピ ッ ク に あ り ます。 イ ン タ ラ ク テ ィ ブ要素の座標 イ ン タ ラ ク テ ィ ブ関数には、作成 し たいテ キ ス ト 注釈・ リ ン ク ・ フ ァ イ ル注釈の長方形の座標を与え る 必要があ り ます。 PDF では、 ハ イ パーテ キ ス ト の関数のための座標はつねにデフ ォ ル ト 座標系で記述 さ れてい る と 見な さ れます。ユー ザー座標系 (変形 さ れてい る か も し れない) で記述 さ れてい る と 見な さ れ る こ と はあ り ま せん。 こ れは非常にやっ かいですので、 PDFlib には、 ユーザー座標が指定 さ れて も それを PDF が認め る 形式に自動変換す る 機能が あ り ま す。 こ の自動変換 を 有効にす る には、 usercoordinates オプシ ョ ン を true に設定 し ます : p.set_option("usercoordinates=true"); リ ン ク ・ フ ィ ール ド の長方形 と し ては、 その縁がページの縁に平行な も のに し か PDF で は対応 し ていないので、 拡縮 ・ 回転 ・ 並行移動 ・ 斜形化に よ っ て座標系が変形 し てい る と き には与え ら れた長方形は形を調整 し な ければな り ません。 こ の よ う な場合、 PDFlib で は、 その長方形を囲 う 、 かつ縁がページの縁 と 平行な最小の長方形を計算 し ます。 そ し て こ れをデフ ォ ル ト 座標に変換 し 、 その結果の値を、 与え ら れた座標のかわ り に用い ます。 要す る に大局的に言っ て ど んな効果があ る か と いえば、 usercoordinates オプシ ョ ンが true に設定 さ れていれば、ページ内容に対 し て も イ ン タ ラ ク テ ィ ブ要素に対 し て も 同 じ 座 標系が使え る と い う こ と です。 3.2 ページ記述 73 座標を視覚化 PDFlib のユーザーが PDF の座標系を扱 う のを支援す る ために、 PDFlib の デ ィ ス ト リ ビ ュ ーシ ョ ンには grid.pdf と い う PDF フ ァ イ ルが含まれてい ます。 こ の PDF フ ァ イ ルは、 よ く 使われ る い く つかのページサ イ ズの座標を視覚化す る も のです。 望みの サ イ ズのページ を何か透明な も のに印刷すれば、PDFlib での開発のために有用な道具にな る か も し れません。 ページ座標は、 Acrobat では以下の よ う に し て視覚化で き ます : > カー ソ ル座標を表示す る には以下を用い ます : Acrobat X/XI : 「表示」 → 「表示切 り 替え」 → 「カ ー ソ ル座標」 Acrobat 9 : 「表示」 → 「カ ー ソル座標」 > 座標は、Acrobat で現在選択 さ れてい る 単位で表示 さ れます。表示単位を変更す る には、 Acrobat 9/X/XI では次の よ う に操作 し ます : 「編集」 → 「環境設定」 (→ 「一般 ...」) → 「単位 と ガ イ ド 」 を選択 し て、 ポ イ ン ト ・ イ ンチ ・ ミ リ ・ パ イ カ ・ セ ンチ メ ー ト ルの う ちのいずれか を選びます。 ただ し 、 表示 さ れ る 座標系はページの左上隅が原点であ り 、 PDF のデフ ォ ル ト であ る 左下 隅の原点 と は異な る ので注意が必要です。 Acrobat の座標表示 と 合わせた座標系を選ぶ方 法については 74 ページ 「下向 き 座標を用い る」 を参照 し て く だ さ い。 オ ブ ジ ェ ク ト を回転 重要な こ と は、 一度ページ上に描いた も のは変更がで き ない と い う こ と です。 PDFlib には、 回転 ・ 並行移動 ・ 拡縮 ・ 斜形化の関数があ り ますが、 こ う し た 関数は、 すでに存在 し てい る も のに対 し ては効力を持たず、 それ以降に描かれ る も のに対 し てだけ効力があ り ます。 テ キ ス ト ・ 画像 ・ 取 り 込み PDF ページ を回転 さ せ る のは簡単で、 PDF_fit_textline( ) ・ PDF_fit_textflow( ) ・ PDF_fit_image( ) ・ PDF_fit_pdi_page( ) で rotate オプシ ョ ン を指定 し ま す。 こ う し たオブジ ェ ク ト を それぞれのはめ込み枠内で 90 度の倍数だけ回転 さ せ る のは、 こ れ ら の関数の orientate オプシ ョ ン で可能です。 以下の例は傾き 45 度のテ キ ス ト を生成 し ます : p.fit_textline("回転テキスト", 50.0, 700.0, "rotate=45"); ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の text_output/rotated_text ト ピ ッ ク にあ り ます。 ベ ク ト ルグ ラ フ ィ ッ ク の回転は、 一般の変形関数 PDF_translate( ) ・ PDF_rotate( ) を利用す れば可能です。 以下の例は、 左下隅を (200, 100) に持つ、 回転 さ れた長方形を作成 し ます。 描 き たい長方形の隅へ座標原点を変更 し 、 座標系を回転 さ せて、 長方形を (0, 0) に配置 し てい ます。 save と restore では さ む こ と に よ り 、 縦置 き テ キ ス ト の作成を完了 し た後、 簡 単に元の座標系に戻っ てオブジ ェ ク ト の配置を継続で き ます : p.save(); p.translate(200, 100); p.rotate(45.0); p.rect(0.0, 0.0, 75.0, 25.0); p.stroke(); p.restore(); /* 原点を長方形の隅へ移動*/ /* 座標を回転させる */ /* 回転された長方形を描く */ 下向 き座標を用い る PDF の上向 き 座標系 と は違っ て、 グ ラ フ ィ ッ ク 環境のなかには下 向 き 座標を用いてい る も の も あ る ので、 そち ら を採用 し たい開発者 も い る で し ょ う 。 その よ う な座標系は PDFlib の変換関数で簡単に設定す る こ と がで き ます。 と こ ろが、 こ の変 換はテ キ ス ト 出力に対 し て も 効力を持つので (テ キ ス ト が簡単に上下ひっ く り 返 り ます)、 74 第 3 章 : PDF 文書を作成 テ キ ス ト が裏返 し にな っ て し ま わない よ う にす る には、ほかに も 何 ら かの呼び出 し を行 う こ と が必要にな り ます。 下向き 座標が簡単に利用で き る よ う にす る ため、 PDFlib では、 あ る 特殊なモー ド に対 応 し てい ます。 こ のモー ド では、 すべての関連す る 座標に対 し てそれぞれ異な る解釈が適 用 さ れます。 こ の topdown 機能は、 PDFlib ユーザーが下向 き 座標系でご く 自然に作業が 行え る よ う にす る ために設け ら れてい ます。 具体的には、 ページの左下隅に原点 (0, 0) が あ っ て y 座標が上向 き に増加す る デフ ォ ル ト PDF 座標系を扱 う のではな く 、 ページの左 上隅に原点があ っ て y 座標が下向 き に増加す る 修正座標系を用い ます。ページで こ の下向 き座標系を利用す る には、 PDF_begin_page_ext( ) で topdown オプシ ョ ン を指定 し ます : p.begin_page_ext(595.0, 842.0, "topdown"); 説明の完全を期す る ため、 下向 き 座標系を設定 し た場合の効果を以下に詳 し く 挙げます。 以下の よ う な 「絶対座標」 は、 通常 と 何 も 変わ ら ないや り 方でユーザー座標に翻訳 さ れます : > 関数の引数の う ち、 各関数の説明の中で 「座標」 と 書かれてい る も のすべて。 例 : PDF_ moveto( ) の x ・ y 。 PDF_circle( ) の x ・ y 。 PDF_rect( ) の x ・ y ( し か し width ・ height は 含まず!)。 PDF_add_note( ) の llx ・ lly ・ urx ・ ury。 「相対座標」 の値は、 下向 き 座標に合 う よ う 内部変換 さ れます : > テ キ ス ト (正の文字サ イ ズ を持つ も の) は、 ページ上端に向か っ て配置 さ れます。 > マニ ュ アルの中で、 長方形や枠な ど について 「左下隅」 と 言っ てい る 場合は、 ページ 上で も そ う な る よ う に翻訳 さ れます。 > 回転角が指定 さ れてい る 場合は、 その回転の中心は依然 と し てユーザー座標系の原点 (0, 0) です。 右回 り 回転はやは り 右回 り と し て表示 さ れます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの general/metric_topdown_coordinates ト ピ ッ ク に あ り ます。 3.2.2 ページサ イ ズ ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの pagination/page_sizes ト ピ ッ ク にあ り ます。 規格ページサ イ ズ PDF_begin/end_page_ext( ) の width ・ height オプシ ョ ンには、 絶対値 か、 ま たはシ ン ボ リ ッ ク なページサ イ ズ名を指定で き ます。 後者は、 < 規格 >.width ・ < 規 格 >.height の形を と り ます。 こ こ で < 規格 > は標準判型のいずれかです (小文字で。 例 : a4.width)。 ページサ イ ズの限界 PDF や PDFlib では、 利用で き る ページサ イ ズについてはいかな る 制約 も 課 し てい ませんが、 Acrobat の実装のほ う で、 ページサ イ ズに関す る プ ロ グ ラ ム的 な限界が存在 し て し ま っ てい ます。 こ の こ と か ら 留意すべ き なのは、 他の PDF イ ン タ プ リ タ では も っ と 大 き なサ イ ズや も っ と 小 さ なサ イ ズの文書を扱 う こ と がで き た と し て も 、 何 も 怪 し むに足 ら ない と い う こ と です。 Acrobat のページサ イ ズ制限を表 3.2 に示 し ます。 PDF 1.6 以上では、 PDF_begin/end_page_ext( ) で userunit オプシ ョ ン を用いて、 ページに 対す る グ ロ ーバルな縮尺を指定す る こ と も で き ます。 さ ま ざ ま なページサ イ ズ枠 PDFlib の開発者の多 く は、 ページの幅 と 高 さ を指定す る だ けで済みますが、 なかには高度な アプ リ ケーシ ョ ン で ( と り わけプ リ プ レ ス業務では) 、 それ以外の PDF の枠エン ト リ を記述 し たい と き も あ る で し ょ う 。 PDFlib では、 PDF のす 3.2 ページ記述 75 表 3.2 Acrobat の最小 ・ 最大ページサイ ズ PDF 表示 ソ フ ト 最小ページサイ ズ 最大ページサイ ズ Acrobat 5 以上 1/24" = 3 pt = 0.106 cm 200" = 14400 pt = 508 cm Acrobat 7 以上で userunit オプ シ ョ ン を指定 3 ユーザー単位 14 400 ユーザー単位 userunit の最大値は 75 000 なので、 可能なページサイ ズは最大 14 400×75 000 = 1 080 000 000 ポ イ ン ト = 381 km べての枠エン ト リ に対応 し てい ます。PDFlib の ク ラ イ ア ン ト で指定で き る エン ト リ を以下 に挙げます (それぞれの定義は PDF リ フ ァ レ ン ス よ り )。 こ う し た項目はあ る 種の環境で 有用です : > MediaBox: ページの幅 と 高 さ を指定す る ために用い ら れ、通常私達がページサ イ ズ と し て と ら えてい る も のを記述 し ます。 > CropBox: ページの内容が切 り 抜かれ る 領域。Acrobat は こ のサ イ ズ を画面表示 と 印刷の 際に利用 し ます。 > TrimBox: 完成ページの領域を指定 (裁ち切 り 後の)。 > ArtBox: ページ上で意味のあ る 内容が占め る 領域。 こ れがアプ リ ケーシ ョ ン ソ フ ト ウ ェ アで利用 さ れ る こ と は稀です。 > BleedBox: 印刷所環境で出力 さ れ る と き にページの内容が切 り 抜かれ る 領域。印刷所工 程での裁ち切 り の不正確 さ を考えに入れて少 し ゆ と り を持たせて囲んで も よ い。 PDFlib では、 上記の ど の値 も 利用す る こ と はな く 、 ただ出力フ ァ イ ルに記録す る 機能を持 つだけです。 デフ ォ ル ト では PDFlib は、 ページの幅 と 高 さ の指定か ら MediaBox を生成 し ますが、 それ以外のエン ト リ を生成 し ません。 以下の コー ド 断片は、 新 し いページ を開始 さ せた後、 CropBox の 4 つの値を設定 し ます : /* カスタムCropBoxを持つ新規ページを開始 */ p.begin_page_ext(595, 842, "cropbox={10 10 500 800}"); 3.2.3 直接パス と パス オ ブ ジ ェ ク ト パ ス と は、 任意の数の直線 ・ 長方形 ・ 円 ・ ベジ エ曲線 ・ 楕円弧でで き た輪郭です。 パ ス は、 つながっ ていない部分を複数含む こ と がで き ます。 こ う し た部分をサブパ ス と いい ま す。 パ ス に対 し て適用で き る 操作はい く つかあ り ます : > 描線。 パ ス に沿っ て線を描 き ます。 ク ラ イ ア ン ト が与え た、 描画に関す る オプシ ョ ン (た と えば色や線幅) を用い ます。 > 塗 り 。 パ ス で囲われた領域全体を塗 り ます。 ク ラ イ ア ン ト が与え た、 塗 り に関す る オ プシ ョ ン を用い ます。 > 切 り 抜 き 。 以後の描画の可視領域を限定 し ま す。 具体的には、 カ レ ン ト 切 り 抜 き 領域 (デフ ォ ル ト では無限定) が、 カ レ ン ト 切 り 抜 き領域 と パ ス で囲われた領域 と の交差部 分に と っ て替わ ら れます。 > ただパ ス を終了。 見えないパ ス がで き ます。 それで も PDF フ ァ イ ルの中には存在 し て い ます。 こ れが有用な場合は稀です。 直接パス 関数 PDF_moveto( ) ・ PDF_lineto( ) ・ PDF_rect( ) 等を用いて、 カ レ ン ト ページや その他の内容ス ト リ ーム (テ ンプ レー ト ・ Type 3 グ リ フ記述等) へただちに書かれ る直接 パ ス を構築す る こ と も で き ます。パ ス を構築 し た直後に、それを PDF_stroke ( )・ PDF_fill( ) ・ PDF_clip( ) のいずれか 1 つお よ び関連す る 関数で処理す る必要があ り ます。 こ れ ら の関数 76 第 3 章 : PDF 文書を作成 はパ ス を消費 し 削除 し ます。 パス を複数回使 う 唯一の方法は、 PDF_save( ) と PDF_restore( ) を用い る こ と です。 直接パ ス を作成 し ておいて上記の操作を何 も 適用 し ない と エ ラ ーにな り ます。 PDFlib の ス コ ープ体系に従えば、 ク ラ イ ア ン ト は こ の制約に自然に従 う こ と にな り ます。 パ ス の 書式属性 (色 ・ 線幅等) を変えたい場合はかな ら ず、 描画操作の開始前に行 う 必要があ り ます。 こ の規則を一言で言えば 「パ ス記述の途中で、 書式を変え てはいけ ません」。 パ ス を ただ作成 し ただけではページには何 も 現れ ません。 塗 り か描線をパ ス に適用 し なければ目に見え る 結果は得 ら れません : p.set_graphics_option("strokecolor=red"); p.moveto(100, 100); p.lineto(200, 100); p.stroke(); たいていのグ ラ フ ィ ッ ク 関数では、 カ レ ン ト 点 と い う 概念を利用 し てい ます。 こ れは、 描 画に用いてい る ペンの位置 と 捉え る こ と がで き ます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの graphics/starter_graphics ト ピ ッ ク にあ り ます。 パスオ ブ ジ ェ ク ト パ ス オブジ ェ ク ト は、 直接パ ス よ り も 便利で強力な も のです。 パ ス オブジ ェ ク ト は、 パ ス を構築す る ためのすべての描画操作を カプセル化 し ます。 パ ス オブ ジ ェ ク ト は PDF_add_path_point( ) で作成す る こ と がで き、 あ る いは、 画像 ク リ ッ ピ ン グ パ ス を 含んでい る 画像 フ ァ イ ルか ら 抽出す る こ と も で き ま す (後述) 。 PDF_add_path_ point( ) では、 パ ス構築を実現す る ためのい く つかの便利なオプシ ョ ン を使 う こ と も で き ます。パ ス オブジ ェ ク ト を作成 し た ら 、それは さ ま ざ ま な目的に利用する こ と が可能です: > パス オブジ ェ ク ト を、PDF_draw_path( ) を用いてページ記述上で利用す る こ と がで き ま す。 すなわち塗っ た り 、 描線 し た り 、 ク リ ッ ピ ン グパ ス と し て用いた り す る こ と がで き ます。 > パ ス オブジ ェ ク ト を、 テ キ ス ト フ ロ ーの回 り こ み形状 と し て用い る こ と がで き ま す : テ キ ス ト が任意の形状の内部 ま た は外部 を 回 り こ む よ う に組 ま れ ま す (237 ページ 「8.2.10 テ キ ス ト をパ ス ・ 画像に回 り 込ませる 」 参照)。 > テ キ ス ト をパ ス上に配置す る こ と も で き ます。 すなわち、 キ ャ ラ ク タ 群がパ ス の直線 や曲線に沿っ て並べ ら れます (219 ページ 「8.1.7 パス上テ キ ス ト 」 参照)。 > パス オブジ ェ ク ト を表セル内に配置す る こ と がで き ます。 直接パ ス と 異な り 、 パ ス オブジ ェ ク ト は PDF_delete_path( ) で明示的に削除 さ れ る ま で複 数回利用す る こ と がで き ます。 パ ス に関す る 情報は PDF_info_path( ) で取得で き ます。 以 下の コ ー ド 断片は、 円を含む単純なパス形状を作成 し 、 それをページ上の異な る 2 箇所に 描線 し 、 最後にそれを削除 し ます : path = p.add_path_point( -1, 0, 100, "move", ""); path = p.add_path_point(path, 200, 100, "control", ""); path = p.add_path_point(path, 0, 100, "circular", ""); p.draw_path(path, 0, 0, "stroke"); p.draw_path(path, 400, 500, "stroke"); p.delete_path(path); パ ス オブジ ェ ク ト をいちいち描画操作で作成す る のではな く 、取 り 込み画像か ら ク リ ッ ピ ン グパ ス を抽出す る こ と も で き ます : 3.2 ページ記述 77 image = p.load_image("auto", "image.tif", "clippingpathname={path 1}"); /* 画像のクリッピングパスからパスオブジェクトを作成 */ path = (int) p.info_image(image, "clippingpath", ""); if (path == -1) throw new Exception("エラー : クリッピングパスが見つかりません!"); p.draw_path(path, 0, 0, "stroke"); 3.2.4 テ ン プ レ ー ト ( フ ォ ーム XObject) PDF 内のテ ン プ レ ー ト ( フ ォ ーム XObject) PDFlib では、 技術用語で フ ォ ーム XObject と 呼ばれ る PDF の機能に対応 し てい ます。 し か し こ の用語は、 対話的な フ ォーム と ま ぎ ら わ し いため、 私達は こ の機能を 「テ ン プ レー ト 」 と 呼び ます。 PDFlib のテ ン プ レ ー ト は、 ページ外のバ ッ フ ァ と 捉え る こ と がで き 、 そ こ ではテ キ ス ト ・ ベ ク ト ル ・ 画像の操作 が行え ます (ページ上で直接操作す る のではな く ) 。 テ ンプ レー ト がで き た ら 、 それは ラ ス タ 画像の よ う に使 う こ と がで き 、 任意の回数、 任意のページに貼 り 付け る こ と が可能で す。 画像同様、 テ ン プ レ ー ト には拡縮や斜形化な ど の幾何学的変形を施す こ と がで き ま す。 1 つのテ ン プ レ ー ト を複数のページで使っ た場合には (ない し は同 じ ページで複数 回)、 テ ンプ レー ト を構成す る PDF オペレー タ は実際には PDF フ ァ イ ル中に 1 回 し か書 かれていないので、 PDF 出力フ ァ イ ルサ イ ズの節約にな り ます。 テ ンプ レー ト は、 複数の ページに繰 り 返 し 現れ る も のに対 し て推奨 さ れます。 た と えば、 毎ページ同 じ 背景や、 企 業 ロ ゴや、 CAD ソ フ ト ・ 地図作成 ソ フ ト の吐 き 出す図記号な ど です。 テ ンプ レー ト は、 ク リ ッ ピ ン グパ ス を持っ た ラ ス タ 画像を複数回配置する 場合に も 推奨 さ れます。テ ンプ レー ト を作成す る には以下の方法があ り ます : > PDF_begin_template_ext( ) で直接。 > ベ ク ト ルグ ラ フ ィ ッ ク か ら PDF_load_graphics( ) と templateoptions オプシ ョ ンで間接的 に。 > ラ ス タ 画像か ら PDF_load_image( ) と createtemplate オプシ ョ ンで間接的に。 こ のオプ シ ョ ンがない と 、 PDF_load_image( ) は、 画像 XObject と い う 同様の PDF 構造を作成 し ます。 注 PDF_open_pdi_page( ) で取 り 込まれた PDF ページ も PDF フ ォ ーム XObject を作成 し ます が、 こ れはテ ン プ レー ト 関数ではな く PDI 関数で扱われます。 テ ン プ レ ー ト を PDFlib で用い る テ ンプ レー ト は、 ラ ス タ 画像 と ま っ た く 同様に、 PDF_ fit_image( ) 関数でページ上ま たは他のテ ンプ レー ト 上に貼 り 付け る こ と がで き ます (205 ページ 「7.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置」 参照)。 一般に、 PDFlib でテ ンプ レー ト を作成 ・ 活用す る 場合には以下の よ う な コ ー ド にな り ます : /* テンプレートを定義 */ template = p.begin_template_ext(template_width, template_height, ""); ...いろいろなテキスト・ベクトル・グラフィック関数を用いてテンプレート上に描画... p.end_template_ext(0, 0); ... p.begin_page(page_width, page_height); /* テンプレートを利用 */ p.fit_image(template, 0.0, 0.0, ""); ...いろいろなページ描画操作を追加... p.end_page(); ... p.close_image(template); 78 第 3 章 : PDF 文書を作成 あ ら ゆ る テ キ ス ト ・ グ ラ フ ィ ッ ク ・ 色関数がテ ンプ レー ト 上では使え ます。 ただ し 、 以下 の関数は、 テ ンプ レー ト を作成 し てい る 間には使っ てはいけ ません : > PDF_begin_item( ) と 、 さ ま ざ ま な関数の tag オプシ ョ ン :構造エ レ メ ン ト はテ ンプ レー ト 内では作成で き ません。 > すべての イ ン タ ラ ク テ ィ ブ関数 : こ れ ら は、 配置 し たい文書ページ上で定義 し なけれ ばな ら ず、 テ ンプ レー ト の一部 と し て生成す る こ と はで き ません。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの general/repeated_contents ト ピ ッ ク にあ り ます。 3.2.5 外部 PDF 文書内の参照ページ ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの pdfx/starter_pdfx5g ト ピ ッ ク にあ り ます。 PDF 文書は、 外部文書内のページへの参照を含む こ と がで き ます : こ の (拡縮や回転 さ れ た) 参照ページは文書の一部ではあ り ませんが、 他のページ内容 と 全 く 同 じ よ う に表示 ・ 印刷 さ れ ます。 こ れを利用す る と 、 再利用す る グ ラ フ ィ ッ ク 内容 ( ロ ゴ ・ 表紙ページ等) を、 その照応す る PDF デー タ を含め る こ と な く 参照す る こ と がで き ます。 PDFlib は、 強 い参照に、 すなわち、 参照ページが内部 メ タ デー タ を通 じ て同定 さ れ る参照に対応 し てい ます。 参照ページが得 ら れない と き や、 メ タ デー タ と 整合 し ない と き は、 参照ページでは な く 代理画像が表示 さ れます。 こ の機能を技術用語では参照 XObject と いい ます。 参照ページ を Acrobat で用い る 参照ページは PDF/X-5g ・ PDF/X-5pg の重要な要素で す。 生成 さ れ る (新 し い) 文書を コ ン テナ文書 と いい、 参照ページがあ る外部 PDF 文書 を参照先フ ァ イ ル と いい ます。 参照ページ を表示する には、 Acrobat を以下の よ う に正 し く 構成す る こ と が重要です : > 「編集」 → 「環境設定」 → 「一般 ...」 → 「ページ表示」 → 「参照 XObject タ ーゲ ッ ト を表 示」 : 「つねに」 に設定 (設定 「PDF-X/5 準拠の もののみ」 は、 Acrobat X/XI のバグのた め動作 し ません)。 > 「編集」 → 「環境設定」 → 「一般 ...」 → 「ページ表示」 → 「参照 さ れる フ ァ イルの場 所」 : 参照先フ ァ イ ルがあ る デ ィ レ ク ト リ の名前を入力。 > 「編集」 → 「環境設定」 → 「一般 ...」 → 「セキ ュ リ テ ィ (拡張)」 → 「セキ ュ リ テ ィ 特権 の場所」 → 「フ ォルダのパス を追加」 : コ ン テナ文書があ るデ ィ レ ク ト リ の名前を追加。 こ れは 「拡張セキ ュ リ テ ィ を有効にする」 の設定にかかわ ら ず行 う 必要があ り ます。 参照先ページは、 コ ン テナ PDF 内部でその フ ァ イ ル名 と ページ番号が指定 さ れてお り 、以 下の条件すべて を満たす と き にのみ代理でな く それが表示 さ れます : > コ ン テナ文書が Acrobat の構成に従っ て信頼 さ れてい る 。 > 指定 さ れたデ ィ レ ク ト リ 内で参照先フ ァ イ ルが見つか っ た。 > 参照先フ ァ イ ルがパス ワー ド を一切要求せず、 エ ラ ーな く 開 く こ と がで き る。 > コ ン テナ文書内で指定 さ れた参照ページのページ番号が参照先フ ァ イ ル内に存在 し て いる。 > PDF/X-5 のみ:参照先内の ID と 特定の XMP メ タ デー タ エン ト リ 群が、コ ン テナ文書内 のその照応す る エン ト リ 群 と 整合す る 必要があ り ます。 こ れ ら の条件に 1 つで も 違反 し てい る と き は、 参照先ページでな く 代理が表示 さ れます。 Acrobat はいかな る エ ラ ー メ ッ セージ も 出 し ません。 参照先ページの代理 PDFlib は、 以下のオブジ ェ ク ト のいずれか を、 参照ページに対す る プ レース ホルダ (代理) と し て用い る こ と がで き ます : 3.2 ページ記述 79 > 別の取 り 込み PDF ページ (参照先を単純化 し た も の等)。外部参照先に対す る 代理 と し て用い ら れ る PDF ページは、 参照先ページ と 同 じ ページ寸法であ る 必要があ り ます。 > SVG グ ラ フ ィ ッ ク を templateoptions オプシ ョ ンで : こ の場合には、 グ ラ フ ィ ッ ク の元 サ イ ズは、 参照先ページのサ イ ズ と 縦横比に調整 さ れます。 > テ ン プ レー ト 。 た と えば、 対角線の入っ た長方形 と い っ た単純な幾何学形状。 テ ン プ レー ト は、 参照先ページのサ イ ズ と 縦横比に調整 さ れます。 以下の コ ー ド 断片は、 外部ページへの参照を持っ た代理テ ンプ レー ト を構築 し ます : proxy = p.begin_template_ext(0, 0, "reference={filename=target.pdf pagenumber=1 strongref=true}"); if (proxy == -1) { /* エラー */ } ...テンプレート内容を構築... p.end_template_ext(0, 0); 代理は、 ページ上に通常どお り に配置す る こ と がで き ます。 それは、 外部参照先への参照 を保持 し ます。 80 第 3 章 : PDF 文書を作成 3.3 暗号化 PDF 3.3.1 PDF のセキ ュ リ テ ィ 機能 PDF 文書は、以下の保護機能を提供す る パ ス ワー ド セキ ュ リ テ ィ に よ っ て保護す る こ と が で き ます : > ユーザーパ ス ワ ー ド (開 く パ ス ワ ー ド と も 呼ばれ ます) が、 フ ァ イ ルを閲覧す る ため に開 く ために必要。 ユーザーパ ス ワ ー ド を持つフ ァ イ ルのみが、 ク ラ ッ キ ン グか ら 安 全です! > マ ス タ ーパ ス ワ ー ド (所有者ま たは権限パ ス ワ ー ド と も 呼ばれ ます) が、 権限、 ユー ザー ま たはマ ス タ ーパ ス ワ ー ド と い っ た セ キ ュ リ テ ィ 設定 を 変更す る た めに必要で す。 ユーザーパ ス ワ ー ド と マ ス タ ーパ ス ワ ー ド を持っ た フ ァ イ ルは、 いずれかのパ ス ワ ー ド を与え る こ と に よ っ て、 閲覧す る ために開 く こ と がで き ます。 > 権限設定が、 PDF 文書に対す る 、 印刷やテ キ ス ト 抽出 と いっ た特定の操作を制限 し ま す。 > 添付パ ス ワ ー ド を、 文書自体の本体内容ではな く 、 フ ァ イ ル添付だけ を暗号化す る た めに与え る こ と がで き ます。 PDF 文書が こ れ ら の保護機能のいずれか一つで も 使用 し てい る場合には、それは暗号化 さ れます。 文書のセキ ュ リ テ ィ 設定を Acrobat で表示 し た り 変更 し た り す る ためには、 それ ぞれ 「フ ァ イル」 → 「プ ロパテ ィ ...」 → 「セキ ュ リ テ ィ 」 → 「詳細を表示 ...」 ま たは 「設 定を変更 ...」 を ク リ ッ ク し ます。 暗号化アルゴ リ ズム と キー長 PDF の暗号化は、 以下の暗号化アルゴ リ ズ ム を活用 し て い ます : > RC4 : 対称 ス ト リ ーム暗号 (すなわち、 暗号化 と 復号に同一のアルゴ リ ズ ム を使用で き る )。 RC4 はプ ロ プ ラ イ エ タ リ のアルゴ リ ズ ムです。 > AES (Advanced Encryption Standard):規格 FIPS-197 で仕様化 さ れた形の も のです。AES は、 さ ま ざ ま な応用に使用 さ れてい る 現代的ブ ロ ッ ク 暗号です。 実際の暗号化キーは扱いに く いバ イ ナ リ 列ですので、 それは、 プ レーン な キ ャ ラ ク タ 群か ら 成 る、 よ り ユーザーフ レ ン ド リ ーなパ ス ワ ー ド か ら 導出 さ れます。 PDF と Acrobat の開 発の過程につれて、 PDF の暗号化方式は、 よ り 強力な アルゴ リ ズ ム と 、 よ り 長い暗号化 キー、 よ り 洗練 さ れたパ ス ワー ド を使用す る 方向へ改良 さ れて き ま し た。 表 3.3 に、 すべ ての PDF バージ ョ ンに対する 、 暗号化 と 、 キー ・ パス ワ ー ド 特性を詳述 し ます。 表 3.3 各 PDF バージ ョ ンにおける暗号化アルゴ リ ズム ・ キー長 ・ パスワー ド PDF と Actoba のバージ ョ ン、 pCOS アルゴ リ ズム番号 暗号化アルゴ リ ズム と キー長 最大パスワー ド 長 と パス ワー ド エ ン コ ーデ ィ ング PDF 1.1 ~ 1.3 (Acrobat 2 ~ 4)、 アルゴ リ ズム 1 RC4 40 ビ ッ ト (脆弱な アルゴ リ ズム。 使用する べき で ない) 32 キ ャ ラ ク タ (Latin-1) PDF 1.4 (Acrobat 5)、 アルゴ リ ズ ム2 RC4 128 ビ ッ ト 32 キ ャ ラ ク タ (Latin-1) PDF 1.5 (Actobat 6)、 アルゴ リ ズ ム3 PDF 1.4 と 同 じ 、 ただ し 暗号化方式の異な る応用 32 キ ャ ラ ク タ (Latin-1) PDF 1.6 (Actobat 7) ・ PDF 1.7 = ISO 32000-1 (Acrobat 8)、 アルゴ リ ズム 4 AES-128 32 キ ャ ラ ク タ (Latin-1) 3.3 暗号化 PDF 81 表 3.3 各 PDF バージ ョ ンにおける暗号化アルゴ リ ズム ・ キー長 ・ パスワー ド PDF と Actoba のバージ ョ ン、 pCOS アルゴ リ ズム番号 暗号化アルゴ リ ズム と キー長 最大パスワー ド 長 と パス ワー ド エ ン コ ーデ ィ ング PDF 1.7ext3 (Acrobat 9)、 アルゴ リ ズム 9 パスワー ド 処理に脆弱性を持 っ た AES-256 (使 用するべき でない) 127 UTF-8 バイ ト (Unicode) PDF 1.7ext8 (Acrobat X/XI) ・ PDF パスワー ド 処理が改善 さ れた AES-256 2.0 = ISO 32000-2、 アルゴ リ ズム 11 127 UTF-8 バイ ト (Unicode) PDF の暗号化は、ユーザーま たはマ ス タ ーパ ス ワー ド を直接用いて文書内容を暗号化す る のではな く 、 パ ス ワ ー ド と 、 権限設定な ど その他のデー タ か ら 暗号化キーを算出 し ます。 文書の暗号化に実際に用い ら れ る 暗号化キーの長 さ は、パ ス ワー ド の長 さ か ら は独立です (表 3.3 参照)。 パスワー ド PDF の暗号化は、 内部的には、 PDF のバージ ョ ンに よ っ て、 40 ・ 128 ・ 256 ビ ッ ト のいずれかの暗号化キーで処理 さ れてい ま す。 こ のバ イ ナ リ 暗号化キーは、 ユー ザーが与え たパ ス ワ ー ド か ら 導出 さ れます。 こ のパス ワー ド には、 長 さ と エン コ ーデ ィ ン グに制約があ り ます : > PDF 1.7 (ISO 32000-1) 以前は、 パ ス ワー ド は最大長 32 キ ャ ラ ク タ に制約 さ れ、 かつ Latin-1 エン コ ーデ ィ ン グのキ ャ ラ ク タ のみを内容 と す る こ と がで き ます。 > PDF 1.7ext3 で、Unicode キ ャ ラ ク タ が導入 さ れ、最大長 も 、パス ワー ド の UTF-8 表現で 127 バ イ ト へ拡張 さ れま し た。 UTF-8 では、 キ ャ ラ ク タ を 1 ~ 4 バ イ ト の可変長で符 号化 し ますので、 パ ス ワー ド 内に許 さ れ る Unicode キ ャ ラ ク タ の数は、 それが非 ASCII キ ャ ラ ク タ を含む場合には 127 よ り 少な く な り ます。 た と えば、 日本語のキ ャ ラ ク タ は通常、 UTF-8 表現では 3 バ イ ト を必要 と し ますので、 日本語 42 キ ャ ラ ク タ ま でをパ ス ワー ド 内で使用で き る わけです。 曖昧 さ を避け る ために、 Unicode パ ス ワー ド は、 SASLprep (RFC 3454 内の Stringprep に基 づいた RFC 4013 で仕様化 さ れた) と い う 処理に よ っ て正規化 さ れます。 こ の処理は非テ キ ス ト キ ャ ラ ク タ を除去 し 、 かつ特定のキ ャ ラ ク タ ク ラ ス を正規化 し ます (た と えば、 非 ASCII の空白キ ャ ラ ク タ は ASCII の空白キ ャ ラ ク タ U+0020 へマ ッ プ さ れます)。 パ ス ワー ド は Unicode 正規化形 NFKC に正規化 さ れ、パ ス ワー ド 内に右書 き と 左書 き のキ ャ ラ ク タ 群が混在 し ていた場合に起 こ り う る 曖昧 さ を避け る ために特別な双方向処理が施 さ れ ま す。 PDF 暗号化の強度は、 暗号化キーの長 さ に よ っ てのみ決ま る のではな く 、 パ ス ワー ド の長 さ と 質に よ っ て も 決ま り ます。 名前や単な る単語な どは、 パ ス ワー ド と し て使用す る べ き ではない こ と が広 く 知 ら れてい ます。 なぜな ら こ れ ら は簡単に推測 さ れた り 、 いわゆ る 辞書攻撃を使っ て シ ス テマチ ッ ク に試行 さ れ う る か ら です。 さ ま ざ ま な調査に よ れば、 かな り の数のパ ス ワ ー ド と し て、 配偶者やペ ッ ト の名前、 ユーザーの誕生日、 子供のあだ 名な ど が選ばれてお り 、 従っ て容易に推測可能 と な っ てい ます。 権限設定 PDF は、 文書の操作に関す る さ ま ざ ま な制約を符号化す る こ と がで き、 こ れ は個別に許可 し た り 禁止 し た り す る こ と がで き ます (設定に よ っ ては他の設定に依存す る も の も あ り ますが) : > 印刷 : 印刷が許可 さ れていなければ、 Acrobat の印刷ボ タ ンは無効の ま ま にな り ます。 Acrobat は、 高解像度印刷 と 低解像度印刷の区別に対応 し てい ます。 低解像度印刷は、 ページのビ ッ ト マ ッ プ化 さ れた画像を生成 し 、 こ れは私的利用にのみ適 し てい ますが、 82 第 3 章 : PDF 文書を作成 高解像度での複製がで き ない よ う にな っ てい ます。 ビ ッ ト マ ッ プ印刷は、 低い出力品 質 と な る のみな ら ず、 印刷処理をかな り 遅 く さ せ る こ と に も 留意 し て く だ さ い。 > 一般的な変更 : こ れが無効 と さ れた場合、 文書の改変は一切禁 じ ら れ ます。 内容の抽 出 と 印刷は許 さ れます。 > 内容の コ ピー と 抽出 : こ れが無効 と さ れた場合、 文書内容を再利用 し よ う と し て内容 を 選択 し て それ を ク リ ッ プ ボー ド へ コ ピ ーす る こ と は禁 じ ら れ ま す。 ア ク セ シ ビ リ テ ィ イ ン タ フ ェース も 無効にな り ます。 こ の よ う な文書を Acrobat で検索す る 必要が あ る 場合には、 Acrobat の一般環境設定で 「承認 さ れたプ ラ グ イ ンのみを使用」 設定を 選択す る 必要があ り ます。 > 注釈 と フ ォ ーム フ ィ ール ド のオーサ リ ン グ : こ れが無効 と さ れた場合、 注釈 と フ ォ ー ム フ ィ ール ド を 追加 し た り 、 変更 ・ 削除 し た り す る こ と は禁 じ ら れ ま す。 フ ォ ー ム フ ィ ール ド への記入は許 さ れます。 > フ ォ ーム フ ィ ール ド 記入ま たは署名 : こ れが有効 と さ れた場合、 ユーザーはフ ォ ーム に署名 ・ 記入で き ますが、 フ ォーム フ ィ ール ド を作成す る こ と はで き ません。 > 内容ア ク セシ ビ リ テ ィ を有効にする : ア ク セシ ビ リ テ ィ ソ フ ト ウ ェ ア (ス ク リ ーン リ ー ダ等) に文書内容の使用を許 し ます。 こ の設定は、 PDF 2.0 では非推奨であ る と 宣言 さ れてお り 、 ア ク セシ ビ リ テ ィ 目的での内容抽出は、 「内容のコ ピー と 抽出」 設定に基づ き ます。 > 文書の組み立て : こ れが無効 と さ れてい る と 、 ページ を挿入 し た り 、 削除 ・ 回転 し た り す る こ と と 、 し お り ・ サム ネールを作成す る こ と が禁 じ ら れます。 文書に対 し て、 「印刷禁止」 と いっ た ア ク セ ス制限を指定す る と 、 Acrobat 内の各機能 も 無 効にな り ます。 ただ し 、 こ れはサー ド パーテ ィ の PDF ビ ュ ーア等の ソ フ ト ウ ェ アについ て も そ う であ る と は限 り ません。 ア ク セ ス権限に従 う か ど う かは、 PDF ツールの開発者次 第なのです。 実際、 い く つかの PDF ツールは、 権限設定を ま る で無視す る こ と が知 ら れ てお り 、 有償で入手可能な PDF ク ラ ッ キ ン グ ツールを利用すれば、 すべてのア ク セ ス制 限を無効にす る こ と が可能です。 こ れは、 暗号を ク ラ ッ ク す る 話 と は関係がな く 、 PDF フ ァ イ ル を表示可能 と す る 限 り 、 それが印刷 さ れない よ う にす る 方法は存在 し ないので す。 こ の こ と は ISO 32000-1 に以下の よ う に説明 さ れてい ます : 「ひ と たび文書が開かれて成功裡に復号 さ れれば、 準拠 リ ーダは技術的には文書の内容 全体へのア ク セス を有する。暗号化辞書内に指定 さ れた文書権限群を強制する実質は、PDF 暗号化内には何 も存在 し ない。」 暗号化文書構成要素 デフ ォ ル ト では、 PDF 暗号化はつねに文書のすべての構成要素を 網羅 し ます。 し か し 、 文書のい く つかの構成要素だけ を暗号化 し 、 それ以外は暗号化 し た く ない と い う 利用場面 も 存在 し ます : > PDF 1.5 (Acrobat 6) で、 プ レーン テ キ ス ト メ タ デー タ と い う 機能が導入 さ れま し た。 こ の機能を使 う と 、 暗号化文書は、 暗号化 さ れていない文書 XMP メ タ デー タ を内容 と し て持つ こ と がで き ます。 こ れは、 検索エ ン ジ ン が暗号化文書か ら も 文書 メ タ デー タ を取得で き る よ う にす る ためです。 > PDF 1.6 (Acrobat 7) 以降、 フ ァ イ ル添付を暗号化 し て、 それ以外は文書を保護 し ない と い う こ と が可能にな り ま し た。 こ の方法に よ り 、 保護 さ れていない文書を、 機密の 添付のための入れ物 と し て利用す る こ と がで き ます。 セキ ュ リ テ ィ 推奨事項 ユーザーパ ス ワ ー ド (文書を開 く ために必要な) を持っ た PDF のみが ク ラ ッ キ ン グか ら 安全であ る こ と に留意 し て く だ さ い。 ク ラ ッ ク さ れ る おそれのあ る暗号化を し て し ま わないためには、 以下の推奨事項を守 るべ き です : 3.3 暗号化 PDF 83 > 1 ~ 6 キ ャ ラ ク タ か ら 成 る パ ス ワー ド は避け る べき です。 なぜな ら それは、すべての可 能なパ ス ワ ー ド を試行す る 攻撃 (パ ス ワ ー ド に対す る ブルー ト フ ォ ース攻撃) に対 し て脆いか ら です。 > パ ス ワ ー ド は、 プ レーン テ キ ス ト な単語には似ていないべ き です。 なぜな ら そのパ ス ワ ー ド は、 すべてのプ レーン テ キ ス ト な単語を試行す る 攻撃 (辞書攻撃) に対 し て脆 いか ら です。 パ ス ワ ー ド は非アルフ ァ ベ ッ ト のキ ャ ラ ク タ を含むべ き です。 自分の配 偶者やペ ッ ト の名前、 誕生日な ど、 容易に突 き と め ら れ る ア イ テ ム を用いてはいけ ま せん。 > 現代的な AES アルゴ リ ズ ムが、 以前の RC4 アルゴ リ ズ ム よ り も 望ま し いです。 > PDF 1.7ext3 (Acrobat 9) に従っ た AES-256 は避け るべ き です。 なぜな ら 、 それはパ ス ワ ー ド チ ェ ッ ク アルゴ リ ズ ム に脆弱性があ り 、 パ ス ワ ー ド に対す る ブルー ト フ ォ ー ス 攻撃が可能にな っ てい る か ら です。 こ の理由か ら 、 Acrobat X と PDFlib では、 新規文 書を保護す る ためには Acrobat 9 の暗号化を決 し て使用 し ません (既存の文書を復号す る 際にのみ使用)。 ま と め る と 、 Acrobat X 以上が得 ら れ る か ど う かに応 じ て、 PDF 1.7ext8-PDF 2.0 に従っ た AES-256 か、 ま たは PDF 1.6/1.7 に従っ た AES-128 を使用す る べ き です。 パ ス ワー ド は、 6 キ ャ ラ ク タ よ り も 長 く す る べ き であ り 、 かつ非アルフ ァ ベ ッ ト キ ャ ラ ク タ を含むべ き で す。 Web 上の PDF を保護 \PDF が Web で提供 さ れ る 場合には、 ユーザーは自分のブ ラ ウ ザ で、その文書の ロ ーカル コ ピーを作 る こ と がつねに可能です。ユーザーに PDF 文書の ロ ー カル コ ピーを保存 さ せない方法は存在 し ません。 3.3.2 PDF セキ ュ リ テ ィ を PDFlib で適用 PDFlib は、 PDF 文書を生成する 際に、 標準のセキ ュ リ テ ィ 機能を適用す る こ と がで き ま す。 保護 さ れた PDF 文書か ら 、 PDFlib+PDI か PDFlib Personalization Server (PPS) でペー ジ を取 り 込むには、 マ ス タ ーパ ス ワ ー ド か shrug オプシ ョ ン が必要です。 文書のプ ロ パ テ ィ を pCOS イ ン タ フ ェ ース で ク エ リ する 際には、 pCOS モー ド で制御 さ れます。 た と え ば、 XMP 文書デー タ ・ 文書情報フ ィ ール ド ・ し お り ・ 注釈内容は、 その文書がユーザー パ ス ワ ー ド を必要 と し ない場合には (ま たはユーザーパ ス ワー ド のみが与え ら れた場合に は)、 マ ス タ ーパ ス ワ ー ド な し で取得で き ます。 こ れについては pCOS パ ス リ フ ァ レ ン ス で さ ら に詳 し く 説明 し てい ます。 注 PDF 文書を、 PDFlib 製品で Reader 有効化する (た と えば Acrobat Reader で注釈を許す) こ と はで き ません。 暗号化アルゴ リ ズム と キー長 文書を保護す る ために使用 さ れ る 暗号化アルゴ リ ズ ム と キー長は、 生成 さ れ る 文書の PDF バージ ョ ンに依存 し 、 こ の PDF バージ ョ ンは さ ら に、 PDF_begin_document( ) の compatibility オプシ ョ ンに依存 し ます。 暗号化アルゴ リ ズ ムは 以下の よ う に選択 さ れます : > PDF 1.4 ・ 1.5 : 128 ビ ッ ト キーに よ る RC4 暗号化のそれぞれの種類が使用 さ れます。 > PDF 1.6 ・ PDF 1.7 ・ PDF 1.7ext3 : AES-128 が使用 さ れます。 なお、PDF 1.7ext3 (Acrobat 9) に従っ た AES-256 は、 既知の脆弱性のために決 し て使用 さ れません。1 > PDF 1.7ext8 ・ PDF 2.0 : Acrobat X に従っ た AES-256 が使用 さ れます。 1. PDF 1.7ext3 (Acrobat 9) に従 っ た AES-256 を、PDFDocEncoding 外のパスワー ド キ ャ ラ ク タ と 組み合わせて、PDFlib 8 で使用 し た場合には、 Unicode パスワー ド に よ る強力な AES 暗号化を許すために compatibility=1.7ext8 と 設定 するか、 あ る いはパスワー ド を PDFDocEncoding 内のキ ャ ラ ク タ に制限する必要があ り ます。 84 第 3 章 : PDF 文書を作成 40 ビ ッ ト 暗号化は安全ではないので、 PDFlib はつねに 128 ビ ッ ト キーを使用 し 、 40 ビ ッ ト キーは決 し て暗号化には適用 し ま せん。 ただ し 、 40 ビ ッ ト 暗号化 さ れた文書は、 PDFlib+PDI ・ PPS に対する 入力 と し ては受け付け ら れます。 パスワー ド を PDFlib で設定 パ ス ワ ー ド は、 PDF_begin_document( ) の userpassword ・ masterpassword オプシ ョ ンで設定で き ます。 PDFlib は、 生成 さ れ る文書のために ク ラ イ ア ン ト が与えたパ ス ワー ド と 、 以下の方式で相互作用 し ます : > ユーザーパ ス ワ ー ド か権限設定が与え ら れていなが ら 、 マ ス タ ーパ ス ワ ー ド が与え ら れていない場合には、 通常のユーザーが簡単にセキ ュ リ テ ィ 設定を変更す る こ と がで き る ので、いかな る 保護 も 無効 と な り ます。 こ の理由か ら 、PDFlib は こ の状況を エ ラ ー と 見な し ます。 > ユーザーパ ス ワ ー ド と マ ス タ ーパ ス ワ ー ド が同 じ の場合には、 そ の フ ァ イ ルのユー ザー と 所有者の区別が も はやつかないので、 こ の場合 も 効果的な保護は無効 と な り ま す。 PDFlib は こ の状況を エ ラ ー と 見な し ます。 > Unicode パス ワー ド は AES-256 で許 さ れます。それ よ り 古いすべての暗号化アルゴ リ ズ ムは、 Latin-1 文字集合に制限 さ れたパ ス ワー ド を必要 と し ます。 古い暗号化アルゴ リ ズ ムに対 し て、与え ら れたパス ワ ー ド が Latin-1 文字集合外のキ ャ ラ ク タ を含む場合に は、 例外を発生 さ せます。 > パス ワー ド は、AES-256 の場合には 127 UTF-8 バ イ ト に、それ よ り 古い暗号化アルゴ リ ズ ムの場合には 32 キ ャ ラ ク タ に切 り 落 と さ れます。 権限を PDFlib で設定 操作制限は PDF_begin_document( ) の permissions オプシ ョ ンで設 定す る こ と がで き ます。 それは操作制限の入っ た 1 個ない し 複数の文字列で構成 さ れま す。 permissions オプシ ョ ン を設定す る 際には masterpassword オプシ ョ ン も 設定 し なけれ ばな り ません。 なぜな ら そ う でなければ Acrobat ユーザーは簡単に権限設定を取 り 除 く こ と がで き て し ま う か ら です。 デフ ォ ル ト ではすべての操作が許可 さ れてい ます。 操作制限 を指定す る と Acrobat のその機能は無効にな り ます。 操作制限はユーザーパ ス ワー ド な し で適用す る こ と がで き ます。 以下の例の よ う に スペース で区切れば、 複数の制限キーワー ド を指定す る こ と も で き ます : p.begin_document(filename, "masterpassword=abcd1234 permissions={noprint nocopy}"); 表 3.4 に、 使え る すべての操作制限キーワ ーを挙げます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの general/permission_settings ト ピ ッ ク にあ り ま す。 表 3.4 PDF_begin_document( ) の permissions オプ シ ョ ンに対する操作制限キーワー ド キーワー ド 解説 noprint Acrobat が、 フ ァ イルの印刷を拒みます。 nomodify Acrobat が、 ユーザーに よ る フ ォ ーム フ ィ ール ド の追加やその他あ ら ゆる変更を拒みます。 nocopy Acrobat が、 テキス ト やグ ラ フ ィ ッ ク の コ ピーや抽出を拒み、 ア ク セシ ビ リ テ ィ イ ン タ フ ェ ース を無効に し ます。 noannots Acrobat が、 コ メ ン ト や フ ォ ーム フ ィ ール ド の追加 ・ 変更を拒みます。 noforms (noannots を暗黙に前提 し ます) Acrobat が、 noannots が指定 さ れていな く て も 、 フ ォ ーム フ ィ ール ド への記入を拒みます。 3.3 暗号化 PDF 85 表 3.4 PDF_begin_document( ) の permissions オプ シ ョ ンに対する操作制限キーワー ド キーワー ド 解説 noaccessible (PDF 2.0 では非推奨) Acrobat が、 ア ク セシ ビ リ テ ィ を目的 と し た テキス ト やグ ラ フ ィ ッ ク の抽出を拒みます。 noassemble (nomodify を暗黙に前提 し ます) Acrobat が、 nomodify が指定 さ れていな く て も、 ページの 挿入 ・ 削除 ・ 回転や し お り ・ サムネールの作成を拒みます。 nohiresprint Acrobat が、 高解像度印刷を拒みます。 noprint が指定 さ れていない場合は、 印刷は 「画像 と し て印刷」 機能に制限 さ れます。 すなわち その場合、 ページが低解像度に変換 さ れた も のを印刷する こ と し かで き ません。 plainmetadata (PDF 1.5) 暗号化文書で も、 文書の メ タ デー タ を暗号化 し ないま まに し ます。 こ れは XMP メ タ デー タ にのみ影響 し 、 文書情報フ ィ ール ド には影響 し ません。 暗号化 フ ァ イ ル添付 PDF 1.6 以上では、 文書が保護 さ れていな く て も 、 添付フ ァ イ ルだ け を 暗 号 化 す る こ と も で き ま す。 こ れ を 実 現す る に は、 PDF_begin_document( ) で attachmentpassword オプシ ョ ン を与え ます。 86 第 3 章 : PDF 文書を作成 3.4 高度な色処理 PDFlib リ フ ァ レ ン ス に、 対応 し てい る 色空間の一覧 と 説明があ り ます。 こ れは、 広 く 使わ れてい る RGB ・ CMYK 色空間を含んでい ます。 こ の節では、 色処理の よ り 複雑な面を説 明 し ます。 ク ッ ク ブ ッ ク 色の諸側面に関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ クの color カ テ ゴ リ にあ り ます。 色空間の使用の概要については、 ク ッ ク ブ ッ クの color/starter_color ト ピ ッ ク を参照 し て く だ さ い。 3.4.1 ICC プ ロ フ ァ イ ルに よ る色管理 PDFlib は、ICC プ ロ フ ァ イ ル と レ ン ダ リ ン グ イ ン テ ン ト に よ る い く つかの色管理に対応 し てい ます。 ICC プ ロ フ ァ イ ルは、 色管理 さ れた ワー ク フ ロ ー と 、 PDF/X ・ PDF/A と いっ た多 く の PDF 規格において、 重要な役割を担い ます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの color/iccprofile_to_image ト ピ ッ ク にあ り ます。 ICC プ ロ フ ァ イ ル International Color Consortium (ICC)1 は、 入力デバ イ スや出力デバ イ ス の色の特徴を指定す る ための フ ァ イ ル形式を定義 し ま し た。こ の ICC カ ラ ープ ロ フ ァ イ ルは、 工業標準 と 捉え ら れてお り 、 すべての主要な色管理シ ス テ ム と アプ リ ケーシ ョ ンの ベン ダーが こ れに対応 し てい ます。 PDFlib は、 表 3.5 に挙げ る 使用場面について、 ICC プ ロ フ ァ イ ルに よ る 色管理に対応 し てい ます。 色管理は、 色指定の中の構成要素の数を変え ません (RGB か ら CMYK へ等)。 注 主要な印刷環境のための ICC カ ラ ープ ロ フ ァ イルは、 www.pdflib.com でダウン ロー ド で き るほか、 その他の無料 ICC プ ロ フ ァ イルへの リ ン ク も掲載 し ています。 表 3.5 ICC プ ロ フ ァ イルの さ ま ざ ま な使用場面 使用場面 使用する API 関数 ・ オプ シ ョ ン ページ上のテキス ト と ベ ク ト ルグ ラ フ ィ ッ ク に ICC ベースの色空間を設定 PDF_get/set_option( ) で iccprofilegray/rgb/cmyk および PDF__setcolor( ) で colorspace=iccbasedgray/rgb/cmyk 色オプ シ ョ ン で iccbased キーワー ド 取 り 込んだ画像に ICC プ ロ フ ァ イルを適用 PDF_load_image( ) : オプ シ ョ ン iccprofile グ レースケースか RGB か CMYK デー タ を ICC ベースの色空間へマ ッ プする ためのデ フ ォル ト 色空間を設定 PDF_begin_page_ext( ) : オプ シ ョ ン defaultgray/rgb/cmyk PDF/X ま たは PDF/A の出力イ ン テ ン ト を、 参 照または埋め込み ICC プ ロ フ ァ イルで指定 PDF_load_iccprofile( ) : オプ シ ョ ン usage=outputintent 透過計算のためのブ レ ン ド 色空間を指定 PDF_begin/end_page_ext( ) ・ PDF_open_pdi_page( ) ・ PDF_begin_ template_ext( ) ・ PDF_load_graphics( ) で templateoptions : オプ シ ョ ン transparencygroup、 サブオプ シ ョ ン colorspace 画像内に埋め込まれた ICC プ ロ フ ァ イルを処理 PDF_load_image( ) : オプ シ ョ ン honoriccprofile 画像内に埋め込まれた ICC プ ロ フ ァ イルを ク エ リ PDF_info_image( ) で keyword=iccprofile ICC プ ロ フ ァ イル内の色要素の数を ク エ リ PDF_get_option( ) でキーワー ド icccomponents 1. www.color.org を参照。 3.4 高度な色処理 87 受け入れ可能な ICC プ ロ フ ァ イ ル カ ラ ープ ロ フ ァ イ ルは、そのプ ロ フ ァ イ ルの ICC バー ジ ョ ン番号、 そのデバ イ ス ク ラ ス、 その色空間に関 し て、 特定の条件を満たす必要があ り ます。 ICC バージ ョ ン番号は以下に限 ら れてい ます : > PDF 出力互換性 1.4 : ICC バージ ョ ン 2.x > PDF 出力互換性 1.5 以上 : ICC バージ ョ ン 2.x ま たは 4.x 表 3.6 に、 ICC プ ロ フ ァ イ ルに関す る デバ イ ス ク ラ ス と 色空間の要請に関す る 、 その用途 に応 じ た追加の要請を詳述 し ます。 表 3.6 さ ま ざ ま な用途について受け入れ可能な ICC プ ロ フ ァ イル 使用場面 デバイ ス ク ラ ス 色空間 PDF/X のための出力イ ン テ ン ト prtr Gray, RGB, CMYK PDF/A のための出力イ ン テ ン ト prtr, mntr Gray, RGB, CMYK 透過グループ prtr, mntr, scnr, spac Gray, RGB, CMYK ICC プ ロ フ ァ イルのその他すべての用途 prtr, mntr, scnr, spac Gray, RGB, CMYK, Lab ICC プ ロ フ ァ イ ルを検索 PDFlib は、PDF_load_iccprofile( ) に与え ら れた profilename 引数 を用い、 以下の手順を踏んで ICC プ ロ フ ァ イ ルを検索 し ます : > profilename=sRGB な ら ば、PDFlib はその内部 sRGB プ ロ フ ァ イ ルを用い、検索は打ち切 ら れます。 > ICCProfile リ ソ ース カ テ ゴ リ 内に profilename と い う 名前の リ ソ ース があ る か ど う かを チ ェ ッ ク し ます。 も し あれば、 その値を フ ァ イ ル名 と し て以下の手順で用い ます。 そ の よ う な リ ソ ース がない場合は、 profilename を フ ァ イ ル名 と し て直接用い ます。 > 前の手順で決定 さ れた フ ァ イ ル名を用い、以下の組み合わせを 1 つずつ順に試 し てみ る こ と に よ り 、 デ ィ ス ク 上の フ ァ イ ルを検索 し ます : <ファイル名> <ファイル名>.icc <ファイル名>.icm <colordir>/<ファイル名> (Windows・OS Xのみ) <colordir>/<ファイル名>.icc (Windows・OS Xのみ) <colordir>/<ファイル名>.icm (Windows・OS Xのみ) Windows では colordir は、オペレーテ ィ ン グ シ ス テ ムがデバ イ ス依存 ICC プ ロ フ ァ イ ル を 格 納 し て い る デ ィ レ ク ト リ を 示 し ま す (た と え ば C:\Windows\System32\ spool\drivers)。 OS X では colordir と し て以下のパ ス が試み ら れます : /System/Library/ColorSync/Profiles /Library/ColorSync/Profiles /Network/Library/ColorSync/Profiles ~/Library/ColorSync/Profiles sRGB 色空間 と sRGB ICC プ ロ フ ァ イ ル PDFlib は、 sRGB と 呼ばれ る 工業規格の RGB 色 空間に対応 し てい ます。 こ れは、 さ ま ざ ま な ソ フ ト ウ ェ アやハー ド ウ ェ アのベン ダーが こ れに対応 し てお り 、 デジ タ ルス チルカ メ ラ の よ う な消費者向け RGB デバ イ スやカ ラ ープ リ ン タ ・ モニ タ の よ う な事務機器におけ る 簡単な色管理のために広 く 利用 さ れてい ます。 PDFlib は sRGB 色空間に対応 し てお り 、 必要な ICC プ ロ フ ァ イ ルデー タ を内蔵 し てい ま す。 ですか ら sRGB プ ロ フ ァ イ ルを ク ラ イ ア ン ト が別途構成す る 必要はな く 、 あ え て構成 88 第 3 章 : PDF 文書を作成 し な く て も つ ね に 利 用 可 能 で す。 こ れ を 利 用 す る に は、 PDF_load_iccprofile( ) を profilename=sRGB で呼び出 し ます。 便利な シ ョ ー ト カ ッ ト と し て、 PDF_load_iccprofile( ) で作成 さ れた ICC ハン ド ルが期待 さ れ る すべての場所において、かわ り にキー ワー ド srgb を与え る こ と も で き ます。 sRGB プ ロ フ ァ イ ルは、 デバ イ ス ク ラ ス mntr (出力デバ イ ス) に属 し ます。 すなわち、 こ れは PDF/A に対す る 出力 イ ン テ ン ト と し ては使用で き ますが、 PDF/X に対す る 出力 イ ン テ ン ト と し ては使用で き ません。 画像 (ICC タ グ付き画像) 内の埋め込みプ ロ フ ァ イ ルを用い る 画像の な か に は、 そ の 画像のカ ラ ー値の特徴を記述 し た ICC プ ロ フ ァ イ ルが埋め込まれてい る こ と があ り ます。 た と えば、埋め込まれた ICC プ ロ フ ァ イ ルは、画像デー タ の生成に用い ら れた ス キ ャ ナの 色特性を記述す る こ と がで き ます。 PDFlib では、 PNG ・ JPEG ・ TIFF 各画像フ ァ イ ル形式 の中に埋め込まれた ICC プ ロ フ ァ イ ルを扱 う こ と がで き ます。 honoriccprofile オプシ ョ ン が true に設定 さ れてい る 場合 (デフ ォ ル ト ではそ う な っ てい ます)、 画像内に埋め込まれ てい る ICC プ ロ フ ァ イ ルはその画像か ら 抽出 さ れ、 PDF 出力内に埋め込まれて、 Acrobat がその画像に適用で き る よ う に さ れます。 こ の処理は、画像への ICC プ ロ フ ァ イ ルの タ グ 付け と 呼ばれ る こ と も あ り ます。 PDFlib は画像のピ ク セル値に変更は加え ません。 PDF_info_image( ) のキー ワ ー ド iccprofile を使 う と 、 画像内に埋め込ま れてい る プ ロ フ ァ イ ルに対す る ICC プ ロ フ ァ イ ルハン ド ルを得 る こ と がで き ます。 こ れは、 同 じ プ ロ フ ァ イ ルを複数の画像に適用す る 必要があ る 場合に有用です。 未知の ICC プ ロ フ ァ イ ル内の色要素数をチ ェ ッ ク す る には icccomponents オプシ ョ ン を用い ます。 外部 ICC プ ロ フ ァ イ ルを画像に適用 画像に埋め込まれてい る ICC プ ロ フ ァ イ ルを使 う のではな く 、 外部プ ロ フ ァ イ ルを各画像に適用す る こ と も で き ます。 そのためには PDF_ load_image( ) の iccprofile オプシ ョ ンでプ ロ フ ァ イ ルハン ド ルを与え ます。 ページ記述に対 し て ICC ベース色空間 テ キ ス ト やベ ク ト ル グ ラ フ ィ ッ ク の カ ラ ー値 は、 プ ロ フ ァ イ ルに よ っ て指定 さ れ る ICC ベース の色空間で直接指定す る こ と がで き ま す。 ま ずは色空間を、 iccprofilegray ・ iccprofilergb ・ iccprofilecmyk の う ちのいずれかのオ プシ ョ ンの値 と し てICCプ ロ フ ァ イ ルハン ド ルを与え る こ と に よ っ て設定す る必要があ り ます。 つづいて、 ICC ベース のカ ラ ー値を、 iccbasedgray ・ iccbasedrgb ・ iccbasedcmyk の う ちのいずれかの色空間キー ワー ド と と も に、 PDF_setcolor( ) の色オプシ ョ ンに与え る こ と がで き ます : p.set_option("errorpolicy=return"); icchandle = p.load_iccprofile("myCMYK", "usage=iccbased"); if (icchandle == -1) { return; } p.set_graphics_option("fillcolor={iccbased=" + icchandle + " 0 1 0 0}"; デバ イ ス カ ラ ー を ICC ベースのデ フ ォ ル ト 色空間へマ ッ プ PDF には、 ページ記述中の デバ イ ス依存な グ レー ・ RGB ・ CMYK の色をデバ イ ス独立カ ラ ーへマ ッ プす る機能があ り ます。 こ れを利用す る と 、 その ま ま ではデバ イ ス依存な カ ラ ー値に対 し て、 正確な測色指 定 を 与 え る こ と が で き ま す。 こ の 方 式 で カ ラ ー 値 を マ ッ プ す る に は、 DefaultGray ・ DefaultRGB・DefaultCMYK の う ちのいずれかの色空間定義を与え る 必要があ り ます。PDFlib で こ れを実現す る には、 PDF_begin_page_ext( ) の defaultgray ・ defaultrgb ・ defaultcmyk オ 3.4 高度な色処理 89 プシ ョ ン を設定 し て、 ICC プ ロ フ ァ イ ルハン ド ルを その照応す る 値 と し て与え ます。 以下 の例では、 sRGB 色空間を、 テ キ ス ト ・ 画像 ・ ベ ク ト ルグ ラ フ ィ ッ ク のデフ ォ ル ト RGB 色 空間 と し て設定 し てい ます : p.begin_page_ext(595, 842, "defaultrgb=srgb"); デフ ォ ル ト 色空間が外部 ICC プ ロ フ ァ イ ルに由来す る 場合には、プ ロ フ ァ イ ルハン ド ルを まず作成す る 必要があ り ます : /* ICCプロファイルハンドルを作成 */ icchandle = p.load_iccprofile("myRGB", "usage=iccbased"); p.begin_page_ext(595, 842, "defaultrgb=" + icchandle); PDF/X ・ PDF/A のための出力 イ ン テ ン ト 出力デバ イ ス (プ リ ン タ ) のプ ロ フ ァ イ ルを用 いて、PDF/X ま たは PDF/A のための出力条件を指定する こ と がで き ます。そのためには、 PDF_load_iccprofile( ) への呼び出 し で usage=outputintent を指定 し ます。 PDF/A に対 し て は、 プ リ ン タ ま たはモニ タ プ ロ フ ァ イ ルを出力 イ ン テ ン ト と し て指定で き ます。 詳 し く は 333 ページ 「11.4 PDF/X に よ る 印刷出力」 と 321 ページ 「11.3 PDF/A に よ る アーカ イ ビ ン グ」 を参照 し て く だ さ い。 透過グループのためのブ レ ン ド 色空間 ペー ジ 上の透過 オ ブ ジ ェ ク ト の レ ン ダ リ ン グ は、 transparencygroup オプシ ョ ンの colorspace サブオプシ ョ ンに色ブ レ ン ド 計算のため の適切な色空間を与え る こ と に よ っ て向上 さ せ る こ と がで き ます。PDF/X-4/5 と PDF/A2/3 に対 し ては、 こ の目的のために ICC プ ロ フ ァ イ ルハン ド ルを与え る こ と がで き ます。 デバ イ ス独立な CIE L*a*b* カ ラ ー 色空間名 lab を与えれば、デバ イ ス独立な カ ラ ー値を CIE 1976 L*a*b* 色空間で指定す る こ と がで き ます。L*a*b* 色空間の色は、 範囲 0 ~ 100 の 輝度値 1 個 と 、 範囲 -127 ~ 128 のカ ラ ー値 2 個 と で指定 さ れます。 lab 色空間に用い ら れ る 光源は D50 です (日中光 5000 K、 2゜ 測定)。 レ ン ダ リ ン グ イ ン テ ン ト PDFlib ク ラ イ ア ン ト がデバ イ ス独立な カ ラ ー値を指定で き る と はい っ て も 、 あ る 出力デバ イ ス がその要求 さ れた色を正確に再現で き る と は限 り ま せ ん。 その よ う な場合には、 色域圧縮 と い う 処理に よ る代替を行 う と い う 妥協が必要にな り ます。 色域圧縮 と は、 色の分布範囲を狭めて、 特定のデバ イ ス で再現で き る よ う な小 さ な 範囲にす る こ と です。 レ ン ダ リ ン グ イ ン テ ン ト は こ の処理を制御す る ために用い ら れ ま す。 レ ン ダ リ ン グ イ ン テ ン ト を指定す る には、 個々の画像に対 し ては、 PDF_load_image( ) に renderingintent オプシ ョ ン を与え ます。 ま た、 レ ン ダ リ ン グ イ ン テ ン ト はテ キ ス ト やベ ク ト ルグ ラ フ ィ ッ ク に対 し て も 指定す る こ と がで き 、そのためには PDF_create_gstate( ) に renderingintent オプシ ョ ン を与え ます。 3.4.2 Pantone ・ HKS ・ カ ス タ ムスポ ッ ト カ ラ ー PDFlib はス ポ ッ ト カ ラ ーに対応 し てい ます (技術的には、 PDF では特色 (Separation) 色 空間 と し て知 ら れてい る のですが、 通常、 separation と い う 用語はプ ロ セ ス カ ラ ーに対 し て も 用い ら れます) 。 ス ポ ッ ト カ ラ ー と は、 プ ロ セ ス カ ラ ーの混色領域外にあ る カ ス タ ム カ ラ ーの印刷に用い ら れ る も のです。 ス ポ ッ ト カ ラ ーは名前で指定 さ れ、 PDF ではつねに 代替色を伴い ます。 代替色は、 その ス ポ ッ ト カ ラ ーに近い色が選ばれますが、 ま っ た く 同 じ 色ではあ り ません。 Acrobat では こ の代替色を用いて、 画面表示やス ポ ッ ト カ ラ ー非対 応機 (事務用プ リ ン タ な ど) への印刷を行い ま す。 印刷機では、 要求 さ れた ス ポ ッ ト カ 90 第 3 章 : PDF 文書を作成 ラ ーが適用 さ れ、文書内で用い ら れてい る その他すべてのプ ロ セ ス カ ラ ー と と も に印刷 さ れます。 PDFlib は、 さ ま ざ ま な組み込みス ポ ッ ト カ ラ ー ラ イ ブ ラ リ に も 対応 し てい ます し 、 カ ス タ ム (ユーザー定義) ス ポ ッ ト カ ラ ーに も 対応 し てい ます。 ス ポ ッ ト カ ラ ー名が PDF_ makespotcolor( ) に よ っ て要求 さ れ る と 、 PDFlib は まず、 その要求 さ れた ス ポ ッ ト カ ラ ー が PDFlib 組み込み ラ イ ブ ラ リ の う ちのいずれかの中で見つか る か ど う か をチ ェ ッ ク し ま す。 も し 見つかれば、 PDFlib は代替色に関 し て、 組み込まれた値を用い ます。 見つか ら な い場合、 その ス ポ ッ ト カ ラ ーはユーザー定義色 と 見な さ れ る ので、 ク ラ イ ア ン ト 側でそれ に対 し て適切な代替カ ラ ー値を与え る 必要があ り ます(カ レ ン ト カ ラ ーを通 じ て)。ス ポ ッ ト カ ラ ーには濃度を指定す る こ と がで き ます。 すなわち、 0 か ら 1 ま でのパーセ ン ト 値 と と も に用い る こ と がで き ます。 デフ ォ ル ト では、 組み込みス ポ ッ ト カ ラ ーはカ ス タ ム代替値で再定義す る こ と はで き ません。 し か し 、 こ の動作は spotcolorlookup オプシ ョ ン で変更す る こ と がで き ます。 こ れを使 う と 、古いアプ リ ケーシ ョ ンが異な る 色定義を用いてい る よ う な場合 と の互換性が と れます し 、 ま た、 Pantone カ ラ ーに対す る PDFlib の Lab 代替値を扱 う こ と ので き ない ワー ク フ ロ ーにおいて も 有用です。 PDFlib は、 PDF/X か PDF/A の準拠レベルが選択 さ れてい る と 、 自動的に適切な代替 色を生成 し ます (333 ページ 「11.4 PDF/X に よ る 印刷出力」 参照)。 カ ス タ ム ス ポ ッ ト カ ラ ーに関 し ては、選択 さ れた PDF/X か PDF/A の準拠レベル と 互換の代替色を与え る のは ユーザー側の役割 と な り ます。 注 組み込み Pantone®・HKS® スポ ッ ト カ ラ ーのデー タ と その照応する商標については、PDFlib ソ フ ト ウ ェ ア での使用のための ラ イ セ ン ス を PDFlib GmbH は各商標権者から取得 し てい ます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの color/spot_color ト ピ ッ ク にあ り ます。 Pantone® カ ラ ー Pantone カ ラ ーは世界的に有名で広 く 利用 さ れてい ます。PDFlib は、Pantone Matching System® (ス ウ ォ ッ チ総数 26,000 色) に完全対応 し てい ます。 表 3.7 に示すデジ タ ルカ ラ ー ラ イ ブ ラ リ にあ る すべての カ ラ ー ス ウ ォ ッ チ名が 利用で き ます。 PDFlib のお客様は、 Pantone ス ポ ッ ト カ ラ ーの 全一覧のテ キ ス ト フ ァ イ ルを、 私達のサポー ト か ら 得 る こ と がで き ます。 ス ポ ッ ト カ ラ ー名は大文字 ・ 小文字を区別 し ます。 上記の 例 と 同様に大文字を使っ て く だ さ い。 旧形式の カ ラ ー名接頭 辞 CV ・ CVV ・ CVU ・ CVC ・ CVP も 使用す る こ と がで き ます。 こ れ ら は、 その照応す る 新 し いカ ラ ー名に変換 さ れます。 ただ し 、 preserveoldpantonenames オプシ ョ ンが true の場 合には変換 さ れません。 PANTONE と い う 接頭辞は必ず、 例示 し た よ う に ス ウ ォ ッ チ名につ け る 必要があ り ます。 一般に、 Pantone カ ラ ー名は次の方式に従っ て構成す る 必要があ り ます : PANTONE <id> <paperstock> こ こ で <id> は色の識別子であ り (た と えば 185)、<paperstock> は利用す るペーパース ト ッ ク の頭文字です (た と えば C は coated =コ ー ト 紙)。 ス ウ ォ ッ チ名を構成す る 各要素の間 には スペース を 1 つずつ入れ る 必要があ り ます。PANTONE 接頭辞では じ ま る名前の ス ポ ッ ト カ ラ ーが要求 さ れたに も かかわ ら ず、 その名前が有効な Pantone カ ラ ーを表 し ていな 3.4 高度な色処理 91 かっ た場合には、 警告が ロ グ記録 さ れます。 以下の コ ー ド ス ニペ ッ ト は、 あ る Pantone カ ラ ーを濃度値 70 パーセ ン ト で用いた例です : p.set_graphics_option("fillcolor={ spotname {PANTONE 281 U} 0.7 }"); 注 こ こ で示 し た Pantone® カ ラ ーは Pantone の定義標準 と 一致 し ない こ と があ り ます。 正確 な色については現在の Pantone カ ラ ー発行物を参照 し て く だ さ い。 Pantone® およびその 他の Pantone, Inc. の諸商標は Pantone, Inc. の所有物です。 © Pantone, Inc., 2003. 表 3.7 PDFlib に内蔵の Pantone スポ ッ ト カ ラ ー ラ イ ブ ラ リ カ ラーラ イ ブ ラ リ名 カ ラ ー名の例 注 PANTONE ソ リ ッ ド /コ ー ト 紙 PANTONE 185 C PANTONE ソ リ ッ ド /コ ー ト 紙 -336 New PANTONE 2071 C PANTONE ソ リ ッ ド /上質紙 PANTONE 185 U PANTONE ソ リ ッ ド /上質紙 -336 New PANTONE 2071 U PANTONE ソ リ ッ ド /マ ッ ト コ ー ト 紙 PANTONE 185 M PANTONE プ ロ セス/コ ー ト 紙 PANTONE DS 35-1 C PANTONE プ ロ セス/上質紙 PANTONE DS 35-1 U PANTONE プ ロ セス/コ ー ト 紙 (EURO) PANTONE DE 35-1 C PANTONE プ ロ セス/上質紙 (EURO) PANTONE DE 35-1 U 2006 年 5 月追加 PANTONE パス テル/コ ー ト 紙 PANTONE 9461 C 2006 年追加分の新色を含む PANTONE パス テル/上質紙 PANTONE 9461 U 2006 年追加分の新色を含む PANTONE メ タ リ ッ ク/ コ ー ト 紙 PANTONE 871 C 2006 年追加分の新色を含む PANTONE カ ラ ーブ リ ッ ジ CMYK (PC) PANTONE 185 PC PANTONE ソ リ ッ ド を プ ロ セス/ コ ー ト 紙に置 き換え PANTONE カ ラ ーブ リ ッ ジ CMYK (EURO) PANTONE 185 EC PANTONE ソ リ ッ ド を プ ロ セス/ コ ー ト 紙 (EURO) に置き換え PANTONE カ ラ ーブ リ ッ ジ/上質紙 PANTONE 185 UP 2006 年 7 月追加 PANTONE ヘキサク ローム/コ ー ト 紙 PANTONE H 305-1 C 非推奨。 廃止予定 PANTONE ヘキサク ローム/上質紙 PANTONE H 305-1 U 非推奨。 廃止予定 2012 年追加の 336 色 2012 年追加の 336 色 PANTONE ソ リ ッ ド イ ン ヘキサ ク ローム PANTONE 185 HC /コー ト 紙 PANTONE ソ リ ッ ド ト ゥ プ ロ セス/ コ ー PANTONE 185 PC ト紙 PANTONE カ ラ ーブ リ ッ ジ CMYK (PC) で置き 換え PANTONE ソ リ ッ ド ト ゥ プ ロ セス/ コ ー PANTONE 185 EC ト 紙 (EURO) PANTONE カ ラ ーブ リ ッ ジ CMYK (EURO) で置 き換え PANTONE Goe / コ ー ト 紙 92 第 3 章 : PDF 文書を作成 PANTONE 42-1-1 C 2008 年追加の 2058 色。 非推奨 表 3.7 PDFlib に内蔵の Pantone スポ ッ ト カ ラ ー ラ イ ブ ラ リ カ ラーラ イブ ラ リ名 カ ラ ー名の例 注 PANTONE Goe /上質紙 PANTONE 42-1-1 U 2008 年追加の 2058 色。 非推奨 HKS® カ ラ ー HKS カ ラ ーシ ス テ ムは ド イ ツ な ど の欧州諸国で 広 く 利用 さ れてい ます。 PDFlib は HKS カ ラ ーに完全対応 し て い ま す。 以下のデジ タ ルカ ラ ー ラ イ ブ ラ リ (Farbfächer) に あ る カ ラ ース ウ ォ ッ チ名がすべて利用可能です (カ ッ コ 内にサン プルス ウ ォ ッ チ名を示 し ます)。 > HKS K (Kunstdruckpapier) 、グ ロ ス アー ト 紙用、88 色 (HKS 43 K) > HKS N (Naturpapier)、 ナチ ュ ラ ル紙用、 86 色 (HKS 43 N) > HKS E (Endlospapier)、 連続ス テーシ ョ ナ リ 用 / コ ー ト 、 88 色 (HKS 43 E) > HKS Z (Zeitungspapier)、 ニ ュ ース プ リ ン ト 用、 50 色 (HKS 43 Z) PDFlib のお客様は、 HKS ス ポ ッ ト カ ラ ーの全一覧のテ キ ス ト フ ァ イ ルを、 私達のサポー ト か ら 得 る こ と がで き ます。 ス ポ ッ ト カ ラ ー名は大文字 ・ 小文字を区別 し ます。 上記の例 と 同様に大文字を使っ て く だ さ い。 HKS と い う 接頭辞は必ず、 例示 し た よ う に ス ウ ォ ッ チ名につけ る 必要があ り ま す。 一般に、 HKS カ ラ ー名は、 以下の方式の う ちのいずれかに従っ て構成す る 必要があ り ます : HKS <id> <paperstock> こ こ で <id> は色の識別子であ り (た と えば 43)、 <paperstock> は利用す るペーパース ト ッ ク の頭文字です(た と えば N は natural 紙)。ス ウ ォ ッ チ名を構成す る HKS・<id>・<paperstock> 各要素の間には スペース を 1 つずつ入れ る 必要があ り ます。上記 2 番目の方式は ラ イ ブ ラ リ か ラ イ ブ ラ リ の中の色に対 し てのみ用い る こ と がで き ます。HKS 接頭辞では じ ま る 名前 の ス ポ ッ ト カ ラ ーが要求 さ れたに も かかわ ら ず、 その名前が有効な HKS カ ラ ーを表 し て いなか っ た場合には、 警告が ロ グ記録 さ れ ま す。 以下の コ ー ド ス ニペ ッ ト は、 あ る HKS カ ラ ーを濃度値 70 パーセ ン ト で用いた例です : p.set_graphics_option("fillcolor={ spotname {HKS 38 E} 0.7 }"); ユーザー定義スポ ッ ト カ ラ ー 上述の組み込みス ポ ッ ト カ ラ ーのほかに、 PDFlib ではカ ス タ ム ス ポ ッ ト カ ラ ーに も 対応 し てい ます。 こ れは、 任意の名前 と (ただ し 組み込みの色 と かち合 う 名前は使え ません) 代替色を持つ こ と がで き ます。 こ の代替色は、 画面表示 と 低品位印刷に用い ら れますが、 高品位の色分版には用い ら れません。 カ ス タ ム ス ポ ッ ト カ ラ ーに適切な代替色を与え る のは ク ラ イ ア ン ト 側の役割です。 ス ポ ッ ト カ ラ ーは、 fillcolor/strokecolor テ キ ス ト ま たはグ ラ フ ィ ッ ク 書式オプシ ョ ン と その他の色関連オプシ ョ ンで設定で き ます。 代替色は、 ス ポ ッ ト カ ラ ー定義内で直接与え る こ と がで き ます : fillcolor={spotname={CompanyColor} 1.0 {cmyk 0.2 1.0 0.2 0}} あ る いは、 ス ポ ッ ト カ ラ ーは PDF_setcolor( ) で定義す る こ と も 可能です。 こ の場合には、 カ レ ン ト 塗 り 色が代替色 と し て用い ら れます。代替色設定のために呼び出 し が 1 つ多 く 必 要であ る と い う 点を除けば、 カ ス タ ム ス ポ ッ ト カ ラ ーの定義 と 利用は、 組み込みス ポ ッ ト カ ラ ーの利用 と 同様に行 う こ と がで き ます : 3.4 高度な色処理 93 p.setcolor("fill", "cmyk", 0.2, 1.0, 0.2, 0); spot = p.makespotcolor("CompanyColor"); p.setcolor("fill", "spot", spot, 1, 0, 0); /* 代替CMYK値を定義 */ /* そこからスポットカラーを作成 */ /* スポットカラーを塗り色に設定 */ 3.4.3 パ タ ー ン と スムーズシ ェ ーデ ィ ン グ 単色の色のかわ り に、パ タ ーンやス ムーズシ ェーデ ィ ン グ を特殊な色 と し て利用す る こ と も で き ます。 任意の物の描線や塗 り に使用で き ます。 パ タ ー ン パ タ ーンは、任意の数の塗 り 操作を 1 つの実体に ま と めた も のに よ っ て定義 さ れます。 こ のグループは任意の他の物の塗 り や描線に用い る こ と がで き 、 塗 り の場合は全 域内に、 描線の場合はパ ス 上に グループが コ ピ ー (縦横に並ぶ) さ れ ま す。 パ タ ーン を 使っ た作業では次の手順を踏みます : > まず、PDF_begin_pattern( ) と PDF_end_pattern( ) の間でパ タ ーン を定義 し なければな り ません。 パ タ ーンの定義にはたいていの画像オペレー タ が利用で き ます。 > PDF_begin_pattern( ) に よ っ て返 さ れたパ タ ーンハン ド ルは、PDF_set_graphics_option( ) ま たは PDF_setcolor( ) でオプシ ョ ン fill/strokecolor を用いて、 パ タ ーン を カ レ ン ト カ ラ ー と し て設定す る ために用い る こ と がで き ます。 PDF_begin_pattern( ) の painttype 引数に よ っ て、 パ タ ーン定義がそれ自身の色指定を含む こ と がで き る か ど う かが決ま り ます。 painttype が 1 の場合、 パ タ ーン定義はそれ自身の 色指定を含ま なければな ら ず、 つねに見た目が同 じ にな り ます。 painttype が 2 の場合、 パ タ ーン定義は色指定を一切含んでいてはな り ません。そのパ タ ーンが塗 り や描線に使われ る と き には、 カ レ ン ト の塗 り や描線の色が適用 さ れます。 注 パ タ ーンはスムーズシ ェ ーデ ィ ングに基づいて定義する こ と も で き ます (後述)。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の graphics/fill_pattern・images/tiling_pattern ト ピ ッ ク にあ り ます。 スムーズシ ェ ーデ ィ ン グ ス ムーズ シ ェ ーデ ィ ン グは、 カ ラ ーブ レ ン ド やグ ラ デ ィ エ ン ト と も いい、 あ る 色か ら 別の色へ連続的に遷移する も のの こ と を言い ます。 2 つの色は同 じ 色空間で指定す る 必要があ り ます。 PDFlib は ス ムーズシ ェーデ ィ ン グについて、 2 種類 の方向をサポー ト し てい ます : > 線形シ ェーデ ィ ン グ。 線に沿っ て定義 さ れます。 > 放射シ ェーデ ィ ン グ。 2 つの円の間に定義 さ れます。 シ ェ ーデ ィ ン グは 2 つの色の間の遷移 と し て定義 さ れます。 1 番目の色にはつねにカ レ ン ト 塗 り 色が用い ら れます。 2 番目の色は PDF_shading( ) の c1 ・ c2 ・ c3 ・ c4 引数で与え ら れ ます。 こ の数値は、 PDF_setcolor( ) の記述に従っ た 1 番目の色の色空間で解釈 さ れます。 PDF_shading( ) を呼び出す と 、 シ ェーデ ィ ン グオブジ ェ ク ト のハン ド ルが返 さ れます。 こ れは 2 つの方式のいずれかで利用す る こ と がで き ます : > PDF_shfill( ) で領域を塗 り ます。こ の メ ソ ッ ド を使え る のは、塗 り たい対象の形がシ ェー デ ィ ン グの形 と 同 じ と き です。 こ の関数はその名前 と 違い、 物の内部を塗 る だけでは な く 、 その外部に対 し て も 効力を持ち ます。 こ の動作は PDF_clip( ) で変更で き ます。 > よ り 複雑な物の塗 り に用い る シ ェーデ ィ ン グパ タ ーン を定義 し ます。具体的には、PDF_ shading_pattern( ) を呼び出 し てシ ェーデ ィ ン グに基づいたパ タ ーン を作成 し 、 こ のパ タ ーン を任意の物の塗 り や描線に用い ます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の color/color_gradient ト ピ ッ ク にあ り ます。 94 第 3 章 : PDF 文書を作成 4 Unicode と レ ガシエ ン コ ーデ ィ ング こ の章では、 Unicode やその他のエン コ ーデ ィ ン グ方式に関す る 基礎的な情報を提供 し ま す。 PDFlib におけ る テ キ ス ト 処理は Unicode 規格に大き く 依存 し てい ますが、 さ ま ざ ま な レ ガシエン コ ーデ ィ ン グに も 対応 し てい ます。 4.1 Unicode の重要な諸概念 キ ャ ラ ク タ と グ リ フ テ キ ス ト を扱 う 際には、 以下の概念を は っ き り 区別す る こ と が大 切です : > キ ャ ラ ク タ は、 言語の中で情報を伝達す る 最小の単位です。 代表的な例は ラ テ ン アル フ ァ ベ ッ ト の文字、 中国語の表意文字、 日本語の音節文字です。 キ ャ ラ ク タ は意味を 持ち ます : すなわち キ ャ ラ ク タ は意味実体です。 > グ リ フは、 さ ま ざ ま な視覚表現で、 1 個ない し 複数のキ ャ ラ ク タ を表 し ます。 グ リ フは 外見を持ち ます : すなわち グ リ フは表現実体です。 キ ャ ラ ク タ と グ リ フ の間に一対一の対応は存在 し ません。た と えば合字は 1 つのグ リ フ で すが、2 つ以上のキ ャ ラ ク タ を表現 し ます。か と 思えば、1 つのグ リ フ が場面に よ っ て別々 のキ ャ ラ ク タ を表す こ と も あ り ます (キ ャ ラ ク タ には同 じ 形の も のがあ り ます。 図 4.1 参 照)。 BMP と PUA 以下の用語が Unicode ベース の環境では頻繁に登場 し ます : > 基本多言語面(Basic Multilingual Plane = BMP):Unicode の範囲 U+0000 ~ U+FFFF 内の コ ー ド 点か ら 成 り ます。 Unicode 規格は こ のほかに も 多 く の コー ド 点を、 追加面群、 す なわち範囲 U+10000 ~ U+10FFFF 内に含んでい ます。 > 私用領域(Private Use Area = PUA):私用のために予約 さ れてい る 複数の Unicode 領域か ら 成 り ま す。 PUA の コ ー ド 点は一般的なや り と り には利用で き ま せん。 なぜな ら 、 Unicode 規格では こ の領域の中にいかな る キ ャ ラ ク タ を も 指定 し ていないか ら です。基 本多言語面は PUA 領域 U+E000 ~ U+F8FF を含んでい ます。 第 15 面 (U+F0000 ~ U+FFFFD) と 第 16 面 (U+100000 ~ U+10FFFD) は私用のためにすっか り 予約 さ れて い ます。 図 4.1 グ リ フ とキャ ラ ク タ の関係 4.1 Unicode の重要な諸概念 95 Unicode のエ ン コ ーデ ィ ン グ形式 (UTF 形式) Unicode 標準は各キ ャ ラ ク タ に数 ( コ ー ド 点) を割 り 当ててい ます。 こ の数を コ ン ピ ュ ー タ 処理で使 う には、 何 ら かの方式で表現 し なければな り ません。Unicode 標準では こ れを エン コーデ ィ ン グ形式 と 呼びます (旧称 : 変換形式)。 こ の用語はフ ォ ン ト のエン コ ーデ ィ ン グ と 混同 し てはいけ ません。 Unicode は 以下のエン コ ーデ ィ ン グ形式を定義 し てい ます : > UTF-8: こ れは可変幅の形式で、 コ ー ド 点は 1 ~ 4 バ イ ト で表 さ れます。範囲 U+0000 ~ U+007F の ASCII キ ャ ラ ク タ は範囲 00 ~ 7F のシ ン グルバ イ ト で表 さ れます。 範囲 U+00A0 ~ U+00FF の Latin-1 キ ャ ラ ク タ は 2 バ イ ト で表 さ れ、 その第一バ イ ト はつね に 0xC2 か 0xC3 にな り ます ( こ れ ら の値は Latin-1 で  と à を表 し ます)。 > UTF-16 : 基本多言語面 (BMP) の コ ー ド 点は 1 つの 16 ビ ッ ト 値で表 さ れます。補助多言 語面の コ ー ド 点、すなわち範囲 U+10000 ~ U+10FFFF の コ ー ド 点は 16 ビ ッ ト 値のペア で表 さ れます。 こ の よ う なペア をサ ロ ゲー ト ペア と いい ます。 1 つのサ ロ ゲー ト 値は、 範囲 D800 ~ DBFF の高位サ ロ ゲー ト 値 1 つ と 範囲 DC00 ~ DFFF の低位サ ロ ゲー ト 値 1 つか ら 成っ てい ます。 高位 と 低位のサ ロ ゲー ト 値はサ ロ ゲー ト ペアの中にのみ現れ、 他の場面で使われ る こ と はあ り ません。 > UTF-32 : 各 コ ー ド 点は 1 つの 32 ビ ッ ト 値で表 さ れます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の text_output/process_utf8 ト ピ ッ ク にあ り ます。 Unicode のエ ン コ ーデ ィ ン グ体系 と バ イ ト 順序マー ク (BOM) コ ン ピ ュ ー タ ア ー キ テ ク チ ャ は種類に よ っ て、 バ イ ト の並べ方が違い ます。 すなわちバ イ ト が よ り 大 き な値 (16 ビ ッ ト や 32 ビ ッ ト ) を構成す る と き 、 最上位バ イ ト を最初に格納す る方式 (ビ ッ グエン デ ィ ア ン) と 、 最下位バ イ ト を最初に格納す る 方式 ( リ ト ルエ ンデ ィ ア ン) があ り ます。 ビ ッ グエンデ ィ ア ン アーキ テ ク チ ャ の代表例は PowerPC であ り 、一方 x86 アーキ テ ク チ ャ は リ ト ルエンデ ィ ア ンです。UTF-8 と UTF-16 はシ ン グルバ イ ト よ り 大 き な値を用いてい ま すので、 やは り バ イ ト の並べ方を論 じ る 必要が出て き ま す。 エ ン コ ーデ ィ ン グ体系は (上述のエン コ ーデ ィ ン グ形式 と は違 う ので注意)、エン コーデ ィ ン グ形式に加え てバ イ ト 順序を指定 し ます。 た と えば UTF-16BE は、 UTF-16 でバ イ ト 順序はビ ッ グエンデ ィ ア ン と い う 意味です。 バ イ ト 順序があ ら か じ めわか ら ない と き は、 それを指定す る 手段 と し て コ ー ド 点 U+FEFF があ り ま す。 こ れをバ イ ト 順序マー ク (BOM) と いい ます。 BOM は UTF-8 では不要ですが、 存在 し ていて も よ く 、 それを利用 し てバ イ ト ス ト リ ーム を UTF8 と 同定す る こ と も で き ます。 さ ま ざ ま なエン コ ーデ ィ ン グ形式に対する BOM の表 し 方 を表 4.1 に示 し ます。 表 4.1 さ ま ざ ま な Unicode エ ン コ ーデ ィ ング形式に対するバイ ト 順序マー ク エ ン コ ーデ ィ ング形式 バイ ト 順序マー ク (16 進) WinAnsi における視覚表現1 UTF-8 EF BB BF  UTF-16 ビ ッ グエ ンデ ィ ア ン FE FF þÿ UTF-16 リ ト ルエ ンデ ィ ア ン FF FE ÿþ UTF-32 ビ ッ グエ ンデ ィ ア ン 00 00 FE FF ■■þÿ UTF-32 リ ト ルエ ンデ ィ ア ン FF FE 00 00 ÿþ■■ 1. 黒四角 ■ は null バイ ト を意味 し ます。 96 第 4 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング 4.2 Unicode 対応言語バ イ ン デ ィ ン グ PDFlib API の機能のなかには、 使用す る 言語バ イ ンデ ィ ン グが Unicode 対応か ど う かに よ っ て変化す る も のがあ り ます。 こ の概念を こ の節 と 次の節で解説 し ます。 4.2.1 ネ イ テ ィ ブ Unicode 文字列のあ る言語バ イ ン デ ィ ン グ プ ロ グ ラ ミ ン グ言語が Unicode 文字列を ネ イ テ ィ ブに用いてい る 場合に、 そのバ イ ンデ ィ ン グ を Unicode 対応 と 呼ぶ こ と に し ます。以下の PDFlib 言語バ イ ンデ ィ ン グは Unicode 対 応です : > C++ > COM > .NET > Java > Objective-C > Python > REALbasic > RPG こ う し た環境での文字列処理は単純です : 文字列はすべて、 ネ イ テ ィ ブな UTF-16 形式の Unicode 文字列 と し て PDFlib カーネルに与え ら れます。 こ う し た言語の ラ ッ パは、 ク ラ イ ア ン ト か ら 与え ら れ る Unicode 文字列を正 し く 取 り 扱 う こ と がで き 、 ま た、 い く つかの PDFlib のオプシ ョ ン を自動的に設定 し ます。 こ の こ と か ら 以下の結果が生 じ ます : > ク ラ イ ア ン ト が与え る 文字列はすべて、Unicode エン コ ーデ ィ ン グかつ UTF-16 形式で PDFlib に も た ら さ れます。 > API 解説内のいろいろ な文字列種別 (内容文字列 ・ ハ イ パーテ キ ス ト 文字列 ・ 名前文字 列) ど う し の違い は意味 を 持 ち ま せ ん。 オ プ シ ョ ン textformat ・ hypertextformat ・ hypertextencoding は不必要であ り 、 かつ許 さ れません。 テ キ ス ト フ ロ ーオプシ ョ ンは 強制的に true にな り ます。 > ページの内容には unicode エン コーデ ィ ン グ を用い る こ と が、 エン コーデ ィ ン グ を Unicode 対応言語で取 り 扱 う う えで も っ と も 簡単な方法です。ただ し 8 ビ ッ ト エン コ ー デ ィ ン グや、 記号フ ォ ン ト のシ ン グルバ イ ト テ キ ス ト も 、 使いた ければ使 う こ と がで き ます。 > 日中韓フ ォ ン ト に非 Unicode レ ガシ CMap を用い る こ と は (106 ページ 「4.5 日本語 ・ 中 国語 ・ 韓国語エン コ ーデ ィ ン グ」 参照) で き ません。 なぜな ら 、 ラ ッ パがつねに Unicode を PDFlib カーネルに与え る か ら です。 Unicode CMap のみが利用可能です。 要す る に基本的には、 ク ラ イ ア ン ト はネ イ テ ィ ブ Unicode 文字列を PDFlib API 関数に与え る こ と がで き 、 その際に別途構成は必要ない と い う こ と です。 4.2.2 UTF-8 対応のあ る言語バ イ ン デ ィ ン グ ネ イ テ ィ ブ Unicode 文字列デー タ 型を持た ないプ ロ グ ラ ミ ン グ言語であ っ て も 、 Unicode 文字列を UTF-8 形式で取 り 扱 う こ と が可能です。 以下の PDFlib 言語バ イ ンデ ィ ン グは、 stringformat=utf8オプシ ョ ン を設定す る こ と に よ っ てUnicode対応にす る こ と がで き ます: > C > Cobol > Perl 4.2 Unicode 対応言語バイ ンデ ィ ング 97 > PHP > Ruby こ れ ら の言語バ イ ンデ ィ ン グの う ちのいずれかで作業をする 場合には、UTF-8 が推奨 さ れ ます。 新規 PDFlib オブジ ェ ク ト を作成 し た直後に以下の関数呼び出 し を用いれば、 言語 バ イ ンデ ィ ン グ を Unicode 対応にす る こ と がで き ます : p.set_option("stringformat=utf8"); アプ リ ケーシ ョ ン内で Unicode 処理が必要な場合には、 上記の呼び出 し を用いて言語バ イ ンデ ィ ン グ を UTF-8 に基づいて Unicode 対応にす る こ と を推奨 し ます。 こ の呼び出 し の 後には、言語バ イ ンデ ィ ン グは Unicode 対応バ イ ンデ ィ ン グであ る かの よ う に動作 し ます。 ただ し 、 ク ラ イ ア ン ト は必ず UTF-8 文字列をすべての API 関数に与え る 必要があ り ます。 こ の呼び出 し には以下の結果 も あ り ます : > API におけ る すべての文字列、 すなわち名前文字列 ・ 内容文字列 ・ ハ イ パーテ キ ス ト 文 字列 ・ オプシ ョ ン リ ス ト は、 BOM あ り かな し の UTF-8 形式 と 見な さ れます。 > C言語バ イ ンデ ィ ン グの場合には、length引数に 0 よ り 大 き な値が与え ら れた と き には、 関数引数 と し ての名前文字列は依然 と し て UTF-16 と し て解釈 さ れます。 Unicode 変換 文字列を Unicode 以外のエ ン コ ーデ ィ ン グで扱わな ければな ら ない場合 は、 それを PDFlib に渡す前には、 UTF-8 か UTF-16 形式の Unicode に変換す る 必要があ り ます。 こ れは、 PDF_convert_to_unicode( ) を用いて、 あ る いは言語独自の方式で実現で き ます。 29 ページ 「2 章 PDFlib の言語バ イ ンデ ィ ン グ」 に、 代表的な言語バ イ ンデ ィ ン グで提供 さ れてい る 有用な Unicode 文字列変換方法を詳 し く 説明 し て あ り ます。 98 第 4 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング 4.3 非 Unicode 対応言語バ イ ン デ ィ ン グ 以下の PDFlib 言語バ イ ンデ ィ ン グは、 デフ ォ ル ト では Unicode 対応ではあ り ません : > C (ネ イ テ ィ ブな文字列デー タ 型な し ) > Cobol (ネ イ テ ィ ブな文字列デー タ 型な し ) > Perl > PHP > Ruby こ れ ら の言語バ イ ンデ ィ ン グ を stringformat オプシ ョ ンで Unicode 対応にす る こ と を推奨 し ます (97 ページ 「4.2.2 UTF-8 対応のあ る 言語バ イ ンデ ィ ン グ」 参照)。 こ の節の残 り は、 上記の言語のいずれか一つで書かれた、 かつオプシ ョ ン stringformat=utf8 を設定 し ないアプ リ ケーシ ョ ンについてのみ意味を持ち ます。 Unicode 変換 PDFlib は、 UTF-8 ・ UTF-16 ・ UTF-32 文字列間の変換を行な っ た り 、 任意 のエン コ ーデ ィ ン グか ら BOM の有無を選択 し て Unicode への変換を行っ た り す る こ と の で き る PDF_convert_to_unicode( ) 関数を提供 し てい ます。 BOM 付 き UTF-8 形式は、 C ユーザーに と っ て、 PDFlib がその よ う な文字列を BOM を 通 じ て 自 動 的 に 認 識 す る と い う 利 点 が あ り ま す。 こ れ に よ っ て、 フ ォ ン ト を encoding=unicode で読み込む こ と 、 お よ びハ イ パーテ キ ス ト 文字列を hypertextencoding= unicode で取 り 扱 う こ と 、 名前文字列を usehypertextencoding=true で取 り 扱 う こ と が可能 と な り 、 ひいては完全な Unicode ワー ク フ ロ ーが実現で き ます。 29 ページ 「2 章 PDFlib の言語バ イ ンデ ィ ン グ」 の言語ご と の節に、 代表的な言語バ イ ンデ ィ ン グで提供 さ れてい る 有用な Unicode 文字列変換方法を詳 し く 説明 し て あ り ます。 Unicode 処理 と 文字列種別 Unicode 文字列は、非 Unicode 対応言語で も 使用で き ますが、 文字列処理は少 し 複雑にな り 、 文字列の種別に依存 し ます。 PDFlib API は、 内容文字列 ・ ハ イ パーテ キ ス ト 文字列 ・ 名前文字列 ( こ れ ら の呼称は歴史的な誤称です) と い う 文字列 種別を使用 し ます。 引数 と オプシ ョ ンは、 PDFlib リ フ ァ レ ン ス内で、 こ れ ら の種別のいず れか一つ と し て示 さ れてい ます。 こ れ ら の文字列種別の取 り 扱いを、 表 4.2 に ま と め る と と も に、 以下の各項で解説 し ます。 表 4.2 さ ま ざ ま な文字列種別に対する文字列処理の概要 文字列種別 サン プル引数 ・ オプ シ ョ ン 関連オプ シ ョ ン / 解釈 内容文字列 PDF_fit_textline( ) ・ PDF_add_textflow( ) の text 引数。 textformat encoding ハイパーテ キス ト 文字 列 > PDF_add_table_cell( ) の fieldname オプ シ ョ ン > PDF_define_layer( ) の name オプ シ ョ ン > PDF_create_action( ) の destname オプ シ ョ ン > PDF_create_bookmark( ) の text 引数 hypertextformat 名前文字列 > PDF_begin_document( ) ・ PDF_create_pvf( ) の filename usehypertextencoding, 引数 hypertextencoding filenamehandling > PDF_load_font( ) の fontname 引数 > PDF_load_iccprofile( ) の profilename 引数 4.3 非 Unicode 対応言語バイ ンデ ィ ング 99 表 4.2 さ ま ざ ま な文字列種別に対する文字列処理の概要 文字列種別 サン プル引数 ・ オプ シ ョ ン オプ シ ョ ン リ ス ト 内の 文字列 関連オプ シ ョ ン / 解釈 BOM 付き : UTF-8 BOM な し : 文字列種別に よ る 内容文字列 内容文字列は、ユーザーが特定の フ ォ ン ト で選んだエン コーデ ィ ン グに従っ てページ内容 (ページ記述) を作成す る ために用い ら れ ます。 PDFlib リ フ ァ レ ン ス の中 で、ページ内容関数におけ る text と い う 名前の関数引数はすべて こ の種類に属 し ます。内 容文字列は特定フ ォ ン ト 内のグ リ フ に よ っ て表現 さ れますので、使用可能な キ ャ ラ ク タ の 範囲はフ ォ ン ト / エン コ ーデ ィ ン グの組み合わせに依存 し ます。 内容文字列の解釈は、 PDF_load_font( ) の textformat オプシ ョ ン (後述) と encoding 引 数ま たはオプシ ョ ンに よ っ て制御 さ れます。textformat=auto な ら ば( こ れがデフ ォ ル ト )、 unicode ・ glyphid エン コ ーデ ィ ン グ と UCS-2 ・ UTF-16 CMap に対 し ては utf16 形式が用い ら れます。 それ以外のすべてのエン コ ーデ ィ ン グに対 し ては形式は bytes にな り ます。 C 言語では、 UTF-16 文字列の長 さ を length 引数で別途与え る 必要があ り ます。 ハ イ パーテキス ト 文字列 ハ イ パーテ キ ス ト 文字列は、 し お り や注釈な ど の イ ン タ ラ ク テ ィ ブ機能のために用い ら れ る も のであ り 、 PDFlib リ フ ァ レ ン ス では 「ハイパーテキス ト 文字列」 と し て示 し てい ま す。 イ ン タ ラ ク テ ィ ブ機能のための関数の多 く の引数やオプ シ ョ ンが こ の種類に属すほか、 それ以外に も 若干 こ の種類に属す る も のがあ り ます。 表示 で き る キ ャ ラ ク タ の範囲は、 Acrobat で利用可能な フ ォ ン ト やオペレーテ ィ ン グ シ ス テ ム と いっ た外部要因に依存 し ます。 ハ イ パーテ キ ス ト 文字列の解釈は hypertextformat ・ hypertextencoding オプシ ョ ン (後 に詳述) に よ っ て制御 さ れ ま す。 hypertextformat=auto な ら ば ( こ れがデ フ ォ ル ト ) 、 hypertextencoding=unicode の場合には utf16 形式が用い ら れ、 それ以外の場合には bytes が用い ら れます。 C 言語では、 UTF-16 文字列の長 さ を length 引数で別途与え る必要があ り ます。 名前文字列 名前文字列は、 外部フ ァ イ ル名 ・ フ ォ ン ト 名 ・ ブ ロ ッ ク 名な ど のために用い ら れ る も のであ り 、 PDFlib リ フ ァ レ ン ス では 「名前文字列」 と し て示 し てい ます。 こ れは ハ イ パーテ キ ス ト 文字列 と わずかに違い ます。 フ ァ イ ル名は特殊な場合です : オプシ ョ ン filenamehandling は、 API に与え ら れた フ ァ イ ル名を ロ ーカルフ ァ イ ルシ ス テ ムで使用で き る 文字列へど の よ う に PDFlib が変換す る か を指定 し ます。 名前文字列の解釈は、 名前文字列 と わずかに異な っ てい ます。 デフ ォ ル ト では名前文 字列は host エン コ ーデ ィ ン グで解釈 さ れます。 し か し 、 名前の先頭に UTF-8 BOM があ る と き は、それは UTF-8 と し て(先頭に EBCDIC UTF-8 BOM があ る と き は EBCDIC UTF8 と し て) 解釈 さ れます。 usehypertextencoding=true な ら 、 hypertextencoding で指定 さ れ たエン コ ーデ ィ ン グが名前文字列に も 適用 さ れます。 こ れはた と えば、 フ ォ ン ト やフ ァ イ ルの名前を Shift-JIS で指定する のに使え ます。hypertextencoding=unicode の場合は、PDFlib は UTF-16 文字列を前提 し ますので、 2 個の null バ イ ト で終了す る 必要があ り ます。 C では、 UTF-8 文字列に対 し ては length 引数は 0 でなければな り ません。 0 以外な ら 文字列は UTF-16 と し て解釈 さ れます。 それ以外のすべての非 Unicode 対応の言語バ イ ン デ ィ ン グでは、 API 関数に length 引数はないので、 名前文字列はかな ら ず UTF-8 形式で 100 第 4 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング 与え る必要があ り ます。 Unicode の名前文字列を作成す る には、 文字列を UTF-8 へ変換す る 必要があ り ます。 内容文字列 と ハ イ パーテキス ト 文字列に対す る テキス ト 形式 Unicode 文字列は、 UTF8 ・ UTF-16 ・ UTF-32 のいずれかの形式で、 任意のバ イ ト 順序で与え る こ と がで き ま す。 形式 の 選 択 は、 textformat オ プ シ ョ ン で ペー ジ 記述 の 全 テ キ ス ト に 対 し て、 hypertextformat オプシ ョ ン で イ ン タ ラ ク テ ィ ブ要素群に対 し て制御す る こ と がで き ます。 こ の両オプシ ョ ンで対応 し てい る 値を表 4.3 に示 し ます。 [hyper]textformat オプシ ョ ンの デフ ォル ト は auto で す。 名 前 文 字 列 群 に 対 し て 同 じ 動作 を 強制す る に は usehypertextencoding オプシ ョ ン を用い ます。 hypertextencoding オプシ ョ ンのデフ ォ ル ト は auto です。 表 4.3 textformat ・ hypertextformat オプ シ ョ ンに対する値 [hyper]textformat 説明 bytes 文字列の 1 バイ ト が 1 キ ャ ラ ク タ に照応 し ます。 これは主に 8 ビ ッ ト エ ン コ ーデ ィ ング と 記号フ ォ ン ト で有用です。 文字列の先頭に UTF-8 BOM があ る と きは、 評価 さ れたのち除去 さ れます。 utf8 文字列は UTF-8 形式であ る と 期待 さ れます。 不正な UTF-8 列があ っ た と きは、 glyphcheck=error な ら 例外が発生 し 、 そ う で なければ削除 さ れます。 ebcdicutf8 文字列は、 EBCDIC コ ー ド さ れた UTF-8 形式である と 期待 さ れます (iSeries ・ zSeries の み)。 utf16 文字列は UTF-16 形式であ る と 期待 さ れます。 文字列の先頭に Unicode バイ ト 順序マー ク (BOM) がある と きは、 評価 さ れたのち除去 さ れます。 BOM がない と きは、 その文字列は マ シ ンのネ イ テ ィ ブ なバイ ト 順序であ る と 期待 さ れます (Intel x86 アーキテ ク チ ャ ではネ イ テ ィ ブ なバイ ト 順序は リ ト ルエ ンデ ィ ア ン で、 一方 Sparc ・ PowerPC シ ス テムではビ ッ グエ ンデ ィ ア ン)。 utf16be 文字列は UTF-16 形式で、 バイ ト 順序はビ ッ グエ ンデ ィ ア ン である と 期待 さ れます。 バイ ト 順序マー ク について特別な扱いはあ り ません。 utf16le 文字列は UTF-16 形式で、 バイ ト 順序は リ ト ルエ ンデ ィ ア ン である と 期待 さ れます。 バイ ト 順序マー ク について特別な扱いはあ り ません。 auto 内容文字列 : 8 ビ ッ ト エ ン コ ーデ ィ ング と 非 Unicode CMap に対 し ては bytes と 等価で、 ワ イ ド キ ャ ラ ク タ 指定 (unicode か glyphid、 または UCS2 か UTF16 の CMap) に対 し ては utf16 と 等価です。 ハイパーテキス ト 文字列 : BOM 付きの UTF-8 ・ UTF-16 文字列は検知 さ れます (C では UTF-16 文字列はダ ブル null で終了する必要があ り ます)。 文字列の先頭に BOM がない と き は、 8 ビ ッ ト エ ン コ ーデ ィ ン グの文字列 と し て、hypertextencoding オプ シ ョ ンに従っ て解 釈 さ れます。 こ の設定に し ておけば、 Unicode を ネ イ テ ィ ブに用いないたいていの環境で、 適切な テキス ト 解釈がで き る よ う にな り ます。 textformat の設定はあ ら ゆ る エン コ ーデ ィ ン グに対 し て効果があ り ますが、 と り わけ unicode エン コ ーデ ィ ン グに対 し て有用です。 エン コーデ ィ ン グ と textformat の さ ま ざ ま な組み合わせに対す る テ キ ス ト 文字列の解釈を表 4.4 で説明 し ます。 内容文字列内の コ ー ド ま たは Unicode 値が、 選ばれた フ ォ ン ト 内の適切な グ リ フ で表現で き ない場合について は、オプシ ョ ン glyphcheck が PDFlib の動作を制御 し ます(122 ページ 「グ リ フ置換」参照)。 4.3 非 Unicode 対応言語バイ ンデ ィ ング 101 オ プ シ ョ ン リ ス ト オプシ ョ ン リ ス ト 内の文字列については、特別な注意が必要です。 な ぜな ら 非 Unicode 対応の言語バ イ ンデ ィ ン グでは、 それは UTF-16 形式の Unicode 文字列 と し て 表現で き ず、 バ イ ト 文字列 と し て し か表現で き な い か ら です。 こ の理由か ら 、 Unicode のオプシ ョ ンに対 し ては UTF-8 が用い ら れます。 PDFlib はオプシ ョ ンの先頭の BOM を見 る こ と で、 それを ど う 解釈す る か を決定 し ます。 BOM を用いて文字列の形式が 決定 さ れ、 そ し て文字列の種類 (上述の内容文字列 ・ ハ イ パーテ キ ス ト 文字列 ・ 名前文字 列) を用いて適切なエン コ ーデ ィ ン グが決定 さ れます。 具体的には、 文字列オプシ ョ ンの 解釈は以下の よ う に動作 し ます : > オプシ ョ ンの先頭に UTF-8 BOM (0xEF 0xBB 0xBF) があ る な ら 、 それは UTF-8 と し て 解釈 さ れます。 EBCDIC ベース のシ ス テ ムの場合 : オプシ ョ ンの先頭に EBCDIC UTF8 BOM (0x57 0x8B 0xAB) があ る な ら 、 それは EBCDIC UTF-8 と し て解釈 さ れます。 > BOM が見つか ら ない と き は、 文字列の解釈は文字列の種類に依存 し ます : >内容文字列は、適用可能な encoding オプシ ョ ンか、その照応す る フ ォ ン ト のエン コー デ ィ ン グ (ど ち ら か存在す る ほ う ) に従っ て解釈 さ れます。 >ハ イ パーテ キ ス ト 文字列は、 hypertextencoding オプシ ョ ンに従っ て解釈 さ れます。 >名前文字列は、usehypertextencoding=true な ら hypertext の設定に従っ て、そ う でなけ れば auto エン コ ーデ ィ ン グで解釈 さ れます。 表 4.4 エ ン コ ーデ ィ ング と テキス ト 形式の関係 [hypertext]encoding textformat=bytes textformat=utf8 ・ utf16 ・ utf16be ・ utf16le すべての文字列種別 : auto 103 ページ 「自動エ ン コ ーデ ィ ング」 の項を参照 unicode と UCS2 か UTF16 の CMap 8 ビ ッ ト コ ー ド は U+0000 ~ U+00FF の Unicode 値 選ばれた テキス ト 形式に従っ て エ ン コ ー ド さ れた任意 の Unicode 値 1 その他全 CMap (非 Unicode ベース) 選ばれた CMap に従 う 任意のシ ングル ・ マルチバイ ト コ ー ド PDFlib は例外を発生 さ せます 8 ビ ッ ト と builtin 8 ビ ッ ト コー ド 選ばれたエ ン コ ーデ ィ ン グに従 っ て Unicode 値を 8 ビ ッ ト コ ー ド に変換 し ます1。 内容文字列でない と き や、 フ ォ ン ト 内に 8 ビ ッ ト エ ン コ ーデ ィ ングが見つか ら ない と きは、 PDFlib は例外を発生 さ せます (8 ビ ッ ト エ ン コ ーデ ィ ングが得ら れるのは Type 1 ・ Type 3 フ ォ ン ト )。 glyphid 8 ビ ッ ト コ ー ド は 0 ~ 255 のグ リ Unicode 値はグ リ フ ID と し て解釈 さ れます2 フ ID 内容文字列のみ : 1. その Unicode キ ャ ラ ク タ が フ ォ ン ト 内で得 ら れない と きは、 PDFlib は glyphcheck オ プ シ ョ ン に従 っ て、 例外を発生 さ せる か、 ま たはそれを置き換え ます。 2. そのグ リ フ ID が フ ォ ン ト 内で見つか ら ない と きは、 PDFlib は glyphcheck 設定に従 っ て、 例外を発生 さ せるか、 ま たはそれ を グ リ フ ID 0 に置き換え ます。 なお、 キ ャ ラ ク タ { } はオプシ ョ ン リ ス ト 内の文字列内では特別な扱いを要 し 、 文字列オ プシ ョ ン内で用い る と き はキ ャ ラ ク タ \ を前につけ る 必要があ り ます。 こ の要請は、ShiftJIS の よ う な レ ガシエン コ ーデ ィ ン グについて も 効いて き ます : バ イ ト 値 0x7B と 0x7D が 出現する と き は必ず、 前に 0x5C をつけなければな り ません。 こ の理由か ら 、 UTF-8 を オ プシ ョ ンで使 う こ と を推奨 し ます (Shift-JIS 等の レ ガシエン コーデ ィ ン グでな く )。 102 第 4 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング 4.4 シ ン グルバ イ ト (8 ビ ッ ト ) エ ン コ ーデ ィ ン グ 注 こ の節の情報は Unicode ワー ク フ ローでは必要ではないで し ょ う 。 8 ビ ッ ト エン コ ーデ ィ ン グ (シ ン グルバ イ ト エン コ ーデ ィ ン グ と も いい ます) は、 バ イ ト 値 0x01 ~ 0xFF を それぞれ、 BMP (すなわち U+0000 ~ U+FFFF) 内の Unicode 値を持つ 1 つのキ ャ ラ ク タ へマ ッ プ し ます。 同時に使え る キ ャ ラ ク タ は 255 種類ま でです。 なぜな ら コ ー ド 0 (ゼ ロ ) は .notdef キ ャ ラ ク タ U+0000 のために予約 さ れてい る か ら です。PDFlib は、 以下のエン コ ーデ ィ ン グの内蔵定義を持っ てい ます : winansi (cp1252と等しい。iso8859-1のスーパーセット), macroman (オリジナルMacintosh文字集合), macroman_apple (macromanとほぼ同じ、ただし通貨をユーロで置き換え), ebcdic (EBCDICコードページ1047), ebcdic_37 (EBCDICコードページ037), pdfdoc (PDFDocEncoding), iso8859-1, iso8859-2, iso8859-3, iso8859-4, iso8859-5, iso8859-6, iso8859-7, iso8859-8, iso8859-9, iso8859-10, iso8859-13, iso8859-14, iso8859-15, iso8859-16,s cp1250, cp1251, cp1252, cp1253, cp1254, cp1255, cp1256, cp1257, cp1258 ホ ス ト エ ン コ ーデ ィ ン グ 特殊なエン コ ーデ ィ ン グ host は固定 し た意味を持たず、 環境 のプ ラ ッ ト フ ォームに よ っ て、 以下の 8 ビ ッ ト エン コーデ ィ ン グへマ ッ プ さ れます : > MVS か USS を持つ IBM zSeries では ebcdic へマ ッ プ さ れます。 > IBM i5/iSeries では ebcdic_37 へマ ッ プ さ れます。 > Windows では winansi へマ ッ プ さ れます。 > それ以外のすべてのシ ス テ ムでは iso8859-1 へマ ッ プ さ れます。 ホ ス ト エン コ ーデ ィ ン グが有用なのは何 と いっ て も 、プ ラ ッ ト フ ォーム非依存のテ ス ト プ ロ グ ラ ムや、 その他の単純なプ ロ グ ラ ム を書 く と き です。 製品版でのホ ス ト エン コーデ ィ ン グ の使用は推奨 し ま せんので、 何 ら かの適切なエ ン コ ーデ ィ ン グ に置 き 換え る べ き で す。 自動エ ン コ ーデ ィ ン グ PDFlib は、 特定の環境に対 し て も っ と も 自然なエ ン コ ーデ ィ ン グ を手間な く 指定で き る し く みに対応 し てい ます。エン コーデ ィ ン グ名 と し て キーワー ド auto を与え る と 、 プ ラ ッ ト フ ォームや環境に よ っ て、 以下のテ キ ス ト フ ォ ン ト 用 8 ビ ッ ト エン コ ーデ ィ ン グ を指定 し た こ と にな り ます : > Windows の場合 : カ レ ン ト のシ ス テ ム コー ド ページ (詳 し く は後述) > Unix・OS X の場合:iso8859-1 (ただ し OS X 上の LWFN PostScript フ ォ ン ト では auto は macroman へマ ッ プ さ れます) > IBM i5/iSeries の場合: カ レ ン ト ジ ョ ブのエン コ ーデ ィ ン グ (IBMCCSID000000000000) > IBM zSeries の場合 : ebcdic (= コ ー ド ページ 1047) 記号フ ォ ン ト では、 キー ワー ド auto は builtin エン コーデ ィ ン グへマ ッ プ さ れます (127 ページ 「5.4.2 記号フ ォ ン ト に対す る エン コ ーデ ィ ン グ を選ぶ」 参照)。 自動エン コーデ ィ ン グは多 く の場面で便利ですが、 その半面、 こ の方式を用いた PDFlib ク ラ イ ア ン ト プ ロ グ ラ ムは他の環境では使え な く な り ます。 auto エン コ ーデ ィ ン グは、 非 Unicode 対応の言語バ イ ンデ ィ ン グでは、 名前文字列の デフ ォ ル ト エン コ ーデ ィ ン グ と し て用い ら れてい ます (99 ページ 「4.3 非 Unicode 対応言 語バ イ ンデ ィ ン グ」 参照)。 なぜな ら こ れが フ ァ イ ル名な ど に一番適切だか ら です。 4.4 シ ングルバイ ト (8 ビ ッ ト ) エ ン コ ーデ ィ ング 103 シ ス テム コ ー ド ページ を流用 PDFlib は、 コ ー ド ページ定義を シ ス テ ムか ら 取得す る こ と がで き ます。 こ の機能を利用すれば、 コ ー ド ページの実装作業を し な く てすむので と て も 便利です。 組み込みエン コ ーデ ィ ン グやユーザー定義エ ン コ ーデ ィ ン グの名前を PDF_ load_font( ) に与え る のではな く 、 ただ、 シ ス テ ムが知っ てい る エ ン コ ーデ ィ ン グ名を利 用すれば よ いのです。 こ の機能が利用で き る のはい く つかの限 ら れたプ ラ ッ ト フ ォーム上 だけであ り 、 そのエン コ ーデ ィ ン グ文字列の文法はプ ラ ッ ト フ ォーム依存です : > Windows では、エン コ ーデ ィ ン グ名は cp< 番号 > です。こ こ で < 番号 > は、シ ス テ ムに イ ン ス ト ール さ れてい る 任意のシ ン グルバ イ ト コ ー ド ページの番号です (マルチバ イ ト の Windows コ ー ド ページについては 173 ページ 「6.5.1 TrueType ・ OpenType 日中韓フ ォ ン ト を用い る」 参照) : font = p.load_font("Helvetica", "cp1250", ""); シ ン グルバ イ ト コ ー ド ページは内部の 8 ビ ッ ト エン コーデ ィ ン グに変換 さ れ る のに対 し 、 マルチバ イ ト コ ー ド ページは実行時に unicode へマ ッ プ さ れます。 テ キ ス ト は、 選 んだ コ ー ド ページ と 互換の形式で与え る 必要があ り ます (た と えば cp932 に対 し ては SJIS)。 > IBM i5/iSeries では、 任意の Coded Character Set Identifier (CCSID) が使え ます。 CCSID は文字列 と し て与え る 必要があ り 、PDFlib は、与え ら れた コ ー ド ページ番号に IBMCCSID と い う 接頭辞をつけ ます。 ま た PDFlib は、 コ ー ド ページ番号が 5 文字に満た ない と き には頭に 0 を補い ます。 コ ー ド ページ番号 と し て 0 (ゼ ロ ) を与え る と 、 カ レ ン ト ジ ョ ブのエン コ ーデ ィ ン グが用い ら れ る こ と にな り ます : font = p.load_font("Helvetica", "273", ""); > USS か MVS を持つ IBM zSeries では、任意の Coded Character Set Identifier(CCSID) が使 え ます。 CCSID は文字列 と し て与え る 必要があ り 、 PDFlib は、 与え ら れた コ ー ド ペー ジ名に一切変更を加えずその ま ま シ ス テ ムに渡 し ます。 font = p.load_font("Helvetica", "IBM-273", ""); ユーザー定義 8 ビ ッ ト エ ン コ ーデ ィ ン グ 定義済みエン コ ーデ ィ ン グのほか、 PDFlib は ユーザー定義 8 ビ ッ ト エン コ ーデ ィ ン グに も 対応 し てい ます。こ れを使いたいのは、PDFlib の内部で得 ら れない何かの文字集合を扱いたい と き です。 た と えば、 PDFlib 内部で対応 し てい る の と は違 う EBCDIC 文字集合を扱 う こ と も で き ます。 PDFlib は、 PostScript グ リ フ 名で定義 さ れたエン コ ーデ ィ ン グ テーブルに対応 し てい る ほか、 Unicode 値で定義 さ れた テーブルに も 対応 し てい ます。 ユーザー定義エン コーデ ィ ン グ を PDFlib プ ロ グ ラ ム内で利用で き る よ う にす る には、 以下 の 作業 を あ ら か じ め行 う 必要 が あ り ま す (あ る い は エ ン コ ーデ ィ ン グ は、 PDF_ encoding_set_char( )) を使っ て実行時に構築す る こ と も で き ます) : > エン コ ーデ ィ ン グの記述を単純なテ キ ス ト 形式で作成す る。 > そのエン コ ーデ ィ ン グ を PDFlib リ ソ ース と し て (64 ページ 「3.1.3 リ ソ ース構成 と フ ァ イ ル検索」 参照) 構成す る 。 > エン コ ーデ ィ ン グが使 う すべてのキ ャ ラ ク タ に対応 し た フ ォ ン ト を与え る 。 エン コ ーデ ィ ン グ フ ァ イ ルは、 グ リ フ名 と コ ー ド を 1 行ずつ列挙 し た も のです。 エン コー デ ィ ン グ定義の冒頭部分は以下の よ う にな り ます : % PDFlib用エンコーディング定義。グリフ名を使用 % 名前 コード Unicode(オプション) space 32 0x0020 104 第 4 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング exclam ... 33 0x0021 Unicode 値が指定 さ れていない と き は、 PDFlib はその内部テーブルの中で適切な Unicode 値を さ が し ます。 グ リ フ名でな く Unicode 値を指定す る こ と も で き ます : % PDFlib用コードページ定義。Unicode値を使用 % Unicode コード 0x0020 32 0x0021 33 ... エ ン コ ーデ ィ ン グ か コ ー ド ページの フ ァ イ ルの内容は、 以下の規則に従 う 必要があ り ま す: > 注釈はパーセ ン ト キ ャ ラ ク タ 「%」 で始ま り 、 行末で終わ り ます。 > 各行内の先頭エン ト リ は PostScript グ リ フ名か 16 進 Unicode 値です。Unicode 値は、接頭 辞 0x と 16 進 4 桁 (大文字で も 小文字で も ) で構成 さ れます。 その後に、 空白キ ャ ラ ク タ と 、 16 進 (0x00 ~ 0xFF) か 10 進 (0 ~ 255) の文字 コ ー ド が続 き ます。 オプシ ョ ン と し て、 グ リ フ名に よ る エン コ ーデ ィ ン グ フ ァ イ ルの場合は、 その照応す る Unicode 値を 3 列目に持つ こ と も で き ます。 > エ ン コ ーデ ィ ン グ フ ァ イ ル内で述べ ら れていない文字 コ ー ド には、 未定義 と 見な さ れ ます。 あ る いは未定義位置に対 し ては、 Unicode 値 0x0000 かキ ャ ラ ク タ 名 .notdef を 与え る こ と も 可能です。 > エン コ ーデ ィ ン グか コ ー ド ページの フ ァ イ ルの中のUnicode値はすべて U+FFFF よ り も 小 さ く なければな り ません。 4.4 シ ングルバイ ト (8 ビ ッ ト ) エ ン コ ーデ ィ ング 105 4.5 日本語 ・ 中国語 ・ 韓国語エ ン コ ーデ ィ ン グ 注 こ の節の情報は Unicode ワー ク フ ローでは必要ではないで し ょ う 。 歴史的に、 非常に多 く の日中韓エン コ ーデ ィ ン グ方式が、 無数の規格化団体や企業に よ っ て開発 さ れて き ま し た。 日中韓テ キ ス ト におけ る エン コ ーデ ィ ン グの概念は、 欧文テ キ ス ト の場合 よ り は る かに複雑なので、単な る 8 ビ ッ ト エン コーデ ィ ン グでは も はや不充分で す。 そのかわ り と し て PDF では、 キ ャ ラ ク タ コ レ ク シ ョ ン と キ ャ ラ ク タ マ ッ プ (CMap) と い う 概念に対応 し て フ ォ ン ト 内のキ ャ ラ ク タ を組織化 し てい ます。 注 CMapは主に レ ガシ日中韓エ ン コ ーデ ィ ングに対 し て用い られます。Unicodeベースのワー ク フ ローでは必要あ り ません。 PDF_convert_to_unicode( ) 関数を使 う と 、 レ ガシ日中韓エ ン コ ーデ ィ ングの文字列を Unicode へ変換で き ます。 代表的な日中韓エ ン コ ーデ ィ ン グのための定義済み CMap 定義済みの日中韓 CMap を 表 4.5 に示 し ます。 こ れ ら は、 OS X ・ Windows ・ Unix シ ス テ ムで使われ る 日中韓エン コ ー デ ィ ン グの多 く に対応 し てい る ほか、ベン ダー独自エン コーデ ィ ン グに も い く つか対応 し てい ます。 た と えば日本語な ら Shift-JIS ・ EUC ・ ISO 2022、 中国語な ら GB ・ Big5、 韓国語 な ら KSC な ど です。 Unicode CMap も すべての ロ ケールについて利用可能です。 表 4.5 日本語 ・ 中国語 ・ 韓国語テキス ト のための定義済み CMap ロ ケール CMap 名 文字集合 と テキス ト 形式 日本語 UniJIS-UCS2-H, -V Adobe-Japan1 キ ャ ラ ク タ コ レ ク シ ョ ンの Unicode (UCS-2) エ ン コ ーデ ィ ン グ UniJIS-UCS2-HW-H UniJIS-UCS2-H と 同 じ だが、 プ ロポーシ ョ ナルの欧文文字が半角の形に置き UniJIS-UCS2-HW-V 換わっ ている 中国語 簡体字 UniJIS-UTF16-H UniJIS-UTF16-V 83pv-RKSJ-H Adobe-Japan1 キ ャ ラ ク タ コ レ ク シ ョ ンの Unicode (UTF-16BE) エ ン コ ー デ ィ ング。 JIS X 0213:1000 文字集合の全キ ャ ラ ク タ へのマ ッ ピ ング を含む。 Mac、 JIS X 0208 文字集合+漢字 Talk6 拡張、 Shift-JIS、 Script Manager コ ー ド1 90ms-RKSJ-H 90ms-RKSJ-V Microsoft コ ー ド ページ 932 (charset 128)、 JIS X 0208 文字集合+ NEC ・ IBM 拡張 90msp-RKSJ-H 90msp-RKSJ-V 90ms-RKSJ-H と 同 じ だが、 半角英字を プ ロポーシ ョ ナル形に替えた もの 90pv-RKSJ-H Mac、 JIS X 0208 +漢字 Talk7 拡張、 Shift-JIS、 Script Manager コ ー ド 1 Add-RKSJ-H, -V JIS X 0208 文字集合+富士通 FMR 拡張、 Shift-JIS エ ン コ ーデ ィ ング EUC- H, -V JIS X 0208 文字集合、 EUC-JP エ ン コ ーデ ィ ング Ext-RKSJ-H, -V JIS C 6226 (JIS78) 文字集合+ NEC 拡張、 Shift-JIS エ ン コ ーデ ィ ング H, V JIS X 0208 文字集合、 ISO-2022-JP エ ン コ ーデ ィ ング UniGB-UCS2-H UniGB-UCS2-V Adobe-GB1 キ ャ ラ ク タ コ レ ク シ ョ ンの Unicode (UCS-2) エ ン コ ーデ ィ ング UniGB-UTF16-H UniGB-UTF16-V Adobe-GB1 キ ャ ラ ク タ コ レ ク シ ョ ンの Unicode (UTF-16BE) エ ン コ ーデ ィ ン グ。 GB18030-2000 文字集合の全キ ャ ラ ク タ へのマ ッ ピ ング を含む。 GB-EUC-H GB-EUC-V Microsoft コ ー ド ページ 936 (charset 134)、 GB 2312-80 文字集合、 EUC-CN エ ン コ ーデ ィ ン グ GBpc-EUC-H GBpc-EUC-V Macintosh、 GB 2312-80 文字集合、 EUC-CN エ ン コ ーデ ィ ング、 Script Manager コ ー ド 2 GBK- EUC- H, -V Microsoft コ ー ド ページ 936 (charset 134)、 GBK 文字集合、 GBK エ ン コ ー デ ィ ング GBK-EUC-H と 同 じ だが、 半角英字を プ ロポーシ ョ ナル形に替え、 コ ー ド 0x24 へ元 (エ) のかわ り に ド ル ($) を マ ッ プ し た もの。 GBKp-EUC-H GBKp-EUC-V 106 第 4 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング 表 4.5 日本語 ・ 中国語 ・ 韓国語テキス ト のための定義済み CMap ロ ケール 中国語 繁体字 CMap 名 文字集合 と テキス ト 形式 GBK2K-H, -V GB 18030-2000 文字集合、 1 ・ 2 ・ 4 バイ ト 混在エ ン コ ーデ ィ ング UniCNS-UCS2-H UniCNS-UCS2-V Adobe-CNS1 キ ャ ラ ク タ コ レ ク シ ョ ンの Unicode (UCS-2) エ ン コ ーデ ィ ン グ UniCNS-UTF16-H UniCNS-UTF16-V Adobe-CNS1 キ ャ ラ ク タ コ レ ク シ ョ ンの Unicode (UTF-16BE) エ ン コ ーデ ィ ング。 HKSCS-2001 (2 ・ 4 バイ ト 文字 コ ー ド ) の全キ ャ ラ ク タ へのマ ッ ピ ン グ を含む。 B5pc-H, -V Macintosh、 Big Five 文字集合、 Big Five エ ン コ ーデ ィ ング、 Script Manager コー ド 2 HKscs-B5-H1 1 HKscs-B5-V 韓国語 Hong Kong SCS (Supplementary Character Set)、 Big Five の文字集合 と エ ン コ ーデ ィ ングに対する拡張 ETen-B5-H, -V Microsoft コ ー ド ページ 950 (charset 136)、 Big Five 文字集合+ ETen 拡張 ETenms-B5-H ETenms-B5-V ETen-B5-H と 同 じ だが、 半角英字を プ ロポーシ ョ ナル形に替えた もの CNS-EUC-H, -V CNS 11643-1992 文字集合、 EUC-TW エ ン コ ーデ ィ ング UniKS-UCS2-H, -V Adobe-Korea1 キ ャ ラ ク タ コ レ ク シ ョ ンの Unicode (UCS-2) エ ン コ ーデ ィ ン グ UniKS-UTF16-H, -V Adobe-Korea1 キ ャ ラ ク タ コ レ ク シ ョ ンの Unicode (UTF-16BE) エ ン コ ー デ ィ ング KSC-EUC-H, -V KS X 1001:1992 文字集合、 EUC-KR エ ン コ ーデ ィ ング KSCms-UHC-H KSCms-UHC-V Microsoft コ ー ド ページ 949 (charset 129)、 KS X 1001:1992 文字集合にハング ル 8822 種を加えた も の、 Unified Hangul Code (UHC) エ ン コ ーデ ィ ング KSCms-UHC-HW-H KSCms-UHC-HW-V KSCpc-EUC-H KSCms-UHC-H と 同 じ だが、 プ ロポーシ ョ ナル形英字を半角に替えた も の Mac、 KS X 1001:1992 文字集合+ Mac OS KH 拡張 ・ Script Manager コ ー ド 3 注 Unicode 対応の言語バイ ンデ ィ ングは、 Unicode CMap (UCS2 か UTF16) にのみ対応 し て います。 それ以外の CMap を使 う こ と はで き ません (109 ページ 「4.6 キ ャ ラ ク タ を指定」 参照)。 CMap 構成 定義済み CMap の 1 つを用いて日本語 ・ 中国語 ・ 韓国語 (日中韓) テ キ ス ト を作成す る には、 PDFlib は、 その照応す る CMap フ ァ イ ルを必要 と し ます。 入っ て く る テ キ ス ト を処理 し て、日中韓エン コーデ ィ ン グ を Unicode へマ ッ プす る ためです。CMap フ ァ イ ルは別パ ッ ケージで入手で き ます。 以下の よ う に イ ン ス ト ールす る 必要があ り ます : > Windows では CMap フ ァ イ ルは、 PDFlib の イ ン ス ト レーシ ョ ンデ ィ レ ク ト リ 内の resource/cmap デ ィ レ ク ト リ に置いておけば、 自動的に見つけ ら れます。 > それ以外のシ ス テ ムでは CMap フ ァ イ ルは、任意の好都合なデ ィ レ ク ト リ に置 く こ と が で き 、 実行時に SearchPath を設定する こ と で、 CMap フ ァ イ ルを手動で構成す る必要 があ り ます : p.set_option("SearchPath={{/パス/パス/resource/cmap}}"); 日中韓 CMap フ ァ イ ルの検索先を構成す る 方式ではな く 、 適切な SearchPath 定義を含む UPR 構成フ ァ イ ルを指す よ う PDFLIBRESOURCEFILE 環境変数を設定する こ と も で き ます。 カ ス タ ム日中韓 フ ォ ン ト のための コ ー ド ページ PDFlib は表 4.6 に挙げ る コ ー ド ページ に対応 し てい ます。 Windows では PDFlib は さ ら に、 シ ス テ ムに イ ン ス ト ール さ れてい る 任意の日中韓 コ ー ド ページに対応 し てい ます。 4.5 日本語 ・ 中国語 ・ 韓国語エ ン コ ーデ ィ ング 107 表 4.6 日中韓 コ ー ド ページ (textformat=auto か textformat=bytes で用い る必要があ り ます) 108 ロ ケール コ ー ド ページ 形式 文字集合 日本語 cp932 Shift-JIS JIS X 0208:1997 + Microsoft 拡張 中国語簡体字 cp936 GBK GBK 中国語繁体字 cp950 Big Five Big Five + Microsoft 拡張 韓国語 cp949 UHC KS X 1001:1992 +残 り 8822 種のハングル拡張 cp1361 Johab Johab 第 4 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング 4.6 キ ャ ラ ク タ を指定 環境に よ っ てはプ ロ グ ラ マーは、 ソ ース コ ー ド を 8 ビ ッ ト エン コ ーデ ィ ン グ (winansi ・ ebcdic 等) で書 く こ と を要求 さ れます。 こ の場合、 8 ビ ッ ト 符号化 さ れたテ キ ス ト の中へ、 一部分だけ Unicode キ ャ ラ ク タ 群を含め る のは厄介な問題です。 こ の状況か ら 開発者を救 う ため、 PDFlib では、 テ キ ス ト を表す補助手段がい く つか使え ます。 4.6.1 エ ス ケープ シーケ ン ス PDFlib は、 エスケープ シーケ ン ス ( こ れは実際には誤称です : バ ッ ク ス ラ ッ シ ュ置換 と い う 用語のほ う が よ いで し ょ う ) と い う し く みを通 じ てテ キ ス ト 文字列内に任意の値を簡単 に入れ込め る 方式に対応 し てい ます。 た と えば、 テ キ ス ト ブ ロ ッ ク のデフ ォ ル ト テ キ ス ト 内で \t シーケ ン ス を使えば、 直接キーボー ド 入力では無理か も し れない タ ブキ ャ ラ ク タ が入れ ら れます。 同様にエ ス ケープシーケ ン ス は、 記号フ ォ ン ト におけ る コー ド を表すに も 便利です し 、エ ス ケープシーケ ン ス を持たない言語バ イ ンデ ィ ン グにおいては リ テ ラ ル 文字列を あ ら わすに も 便利です。 エ ス ケープシーケ ン ス は、 シーケ ン ス を 1 個のバ イ ト 値へ置換す る命令です。 シーケ ン ス は、 文字列のカ レ ン ト エ ン コ ーデ ィ ン グ内のバ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ 「\」 に対 す る コ ー ド で開始 し ます。 エ ス ケープシーケ ン ス の置換か ら 得 ら れ る バ イ ト 値を表 4.7 に 示 し ます。 ASCII と EBCDIC のプ ラ ッ ト フ ォーム では違 う も の も あ り ます。 エ ス ケープ シーケ ン ス で表せ る のは、 0 ~ 255 のバ イ ト 値だけです。 い く つかのプ ロ グ ラ ミ ン グ言語 と 異な り 、 PDFlib のエ ス ケープシーケ ン ス はその種類 に応 じ てつねに固定長 と な り ます。ですのでシーケ ン ス の終了キ ャ ラ ク タ は必要あ り ませ ん。 表 4.7 エ スケープ シーケ ン ス と バイ ト 値一覧 シーケ ン ス 長さ OS X ・ Windows ・ Unix EBCDIC プ ラ ッ ト フ ォ ーム 広 く 知ら れる解釈 \f 2 0C 0C フ ォ ーム フ ィ ー ド \n 2 0A 15/25 ラインフ ィード \r 2 0D 0D キ ャ リ ッ ジ リ タ ーン \t 2 09 05 水平 タ ブ \v 2 0B 0B ラインタブ \\ 2 5C E0 バッ クスラ ッ シュ \xNN 4 バイ ト 値を表す 16 進 2 桁。 例 : \xFF \NNN 4 バイ ト 値を表す 8 進 3 桁。 例 : \377 エ ス ケープシーケ ン ス はデフ ォ ル ト では置換 さ れません。エ ス ケープシーケ ン ス を文字列 において使 う には、escapesequence オプシ ョ ン を明示的に true に設定す る必要があ り ます: p.set_option("escapesequence=true"); こ のグ ロ ーバルオプシ ョ ンは、 それ以降に使用 さ れ る すべての名前文字列 ・ ハ イ パーテ キ ス ト 文字列 ・ 内容文字列に影響を与え ますが、 それは望む と こ ろ ではない場合 も あ る か も し れません。 エ ス ケープシーケ ン ス を内容文字列に限定する ためには、 かわ り に以下のテ キ ス ト オプシ ョ ン を用い ます : 4.6 キ ャ ラ ク タ を指定 109 p.set_text_option("escapesequence=true"); オプ シ ョ ン を 設定す る のではな く 、 PDF_convert_to_unicode( ) を 用い て文字列内のエ ス ケープシーケ ン ス を置き 換え る こ と も で き ます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の fonts/escape_sequences ト ピ ッ ク にあ り ます。 エ ス ケープシーケ ン ス はすべての内容文字列 ・ ハ イ パーテ キ ス ト 文字列 ・ 名前文字列内 で、BOM 検出の後に、 し か し タ ーゲ ッ ト 形式への変換の前に、評価 さ れます。textformat= utf16le か utf16be な ら エ ス ケープシーケ ン ス は、 選ばれた形式に従っ て 2 バ イ ト 値 と し て 表す必要があ り ます。 エ ス ケープシーケ ン ス内の各キ ャ ラ ク タ は 2 バ イ ト で表現 さ れ、 そ の う ち 1 バ イ ト は値 0 にな り ます。 textformat=utf8 な ら 、 生成 コ ー ド は UTF-8 に変換 さ れません。 エ ス ケープシーケ ン ス が解決で き ない と き には (\x の後の 16 進数が不正等)、 例外が 発生 し ます。 内容文字列については こ の動作は、 glyphcheck ・ errorpolicy 設定で制御 さ れ ます。 エ ス ケープシーケ ン ス を有効に し てい る と き は、 バ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ を含む Windows のパ ス名に注意 し て く だ さ い。 4.6.2 文字参照 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の fonts/character_references ト ピ ッ ク にあ り ま す。 文字参照は、 置換シーケ ン ス を Unicode 値で置換する 命令です。 参照シーケ ン ス は、 カ レ ン ト エン コ ーデ ィ ン グ内のア ンパサン ド キ ャ ラ ク タ 「&」 の コー ド で開始 し 、 セ ミ コ ロ ン キ ャ ラ ク タ 「;」 の コ ー ド で終了 し ます。 タ ーゲ ッ ト Unicode 値を表現す る ためにい く つか の方式が利用可能です : HTML 文字参照 PDFlib は、 HTML 4.0 で定義 さ れてい る すべての文字実体参照に対応 し てい ます。 数値文字参照は 10 進 ・ 16 進記法で与え る こ と がで き ます。 HTML 文字参照の 全一覧は以下の場所にあ り ます : www.w3.org/TR/REC-html40/charset.html#h-5.3 例: ­ € < > & Α U+00AD U+00AD U+00AD U+00AD U+00AD U+0391 ソフトハイフン ユーログリフ (実体名) 小なり記号 大なり記号 アンパサンド記号 ギリシャ文字? 数値文字参照 Unicode キ ャ ラ ク タ に対す る 数値文字参照 も HTML 4.0 で定義 さ れてい ま す。 こ れはハ ッ シ ュ キ ャ ラ ク タ 「#」 と 10 進ま たは 16 進の数値を必要 と し 、 16 進数値の は小文字か大文字の 「X」 キ ャ ラ ク タ を頭につけ ます。 例 : ­ ­ å å 110 U+00AD U+00AD U+00AD U+00E5 ソフトハイフン ソフトハイフン 文字aの上に小さな丸 (10進) 文字aの上に小さな丸 (16進、小文字x) 第 4 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング å € € U+00E5 文字aの上に小さな丸 (16進、大文字X) U+20AC ユーログリフ (16進) U+20AC ユーログリフ (10進) 注 128 ~ 159 (10 進) すなわち 0x80 ~ 0x9F (16 進) の コ ー ド 点は、 winansi コ ー ド 点を参 照 し ません。 Unicode では こ れ らは、 印刷可能キ ャ ラ ク タ でな く 制御キ ャ ラ ク タ を参照 し ます。 PDFlib 独自の実体名 PDFlib では、 以下のグループの Unicode 制御キ ャ ラ ク タ に対 し て、 カ ス タ ムの文字実体参照を使 う こ と がで き ます : > 表 6.4 に挙げ る デフ ォ ル ト シ ェーピ ン グ動作を オーバ ラ イ ド す る ための制御キ ャ ラ ク タ 群。 > 表 6.5 に挙げ る デフ ォ ル ト 双方向組版を オーバ ラ イ ド す る ための制御キ ャ ラ ク タ 群。 > 表 8.1 に挙げ る テ キ ス ト フ ロ ーの改行 と 組版のための制御キ ャ ラ ク タ 群。 例: &linefeed; &hortab; &ZWNJ; U+000A ラインフィード制御キャラクタ U+0009 水平タブ U+200C ゼロ幅非接合子 グ リ フ 名参照 グ リ フ名は以下の ソ ース か ら 導かれます : > 代表的な グ リ フ名は内蔵 リ ス ト 内で検索 さ れます > フ ォ ン ト 独自のグ リ フ名はカ レ ン ト フ ォ ン ト 内で検索 さ れ ます。 こ の種類の文字参照 は必ずフ ォ ン ト を必要 と す る ので、 内容文字列でのみ動作 し ます。 グ リ フ名参照を同定す る ために、 実際の名前はア ンパサン ド キ ャ ラ ク タ 「&」 の後に ピ リ オ ド キ ャ ラ ク タ 「.」 を必要 と し ます。 例 : &.three; &.mapleleaf; &.T.swash; U+0033 数字3の代表的グリフ名 (PUA Unicode値)Cartaフォントにおけるカスタムグリフ名 (PUA Unicode値)2番目のピリオドキャラクタはグリフ名の一部です グ リ フ名に よ る 文字参照は以下のシナ リ オで有用です : > フ ォ ン ト 独自グ リ フ名に よ る 文字参照は、 内容文字列内で異体字 (ス ワ ッ シ ュ キ ャ ラ ク タ 等) や、 特定の Unicode セマ ン テ ィ ク ス を持たないグ リ フ (記号 ・ ア イ コ ン ・ 装 飾) を選ぶのに有用です。 ただ し 、 等幅数字をは じ め と する 多 く の機能は、 OpenType 機能で も っ と 簡単に実装で き ます (158 ページ 「6.3 OpenType レ イ ア ウ ト 機能」 参照)。 > Adobe グ リ フ リ ス ト 内の名前 (uniXXXX ・ u1XXXX の形の も の も )、 お よ び特定の共通の 「名前誤 り 」 グ リ フ名は、 内容文字列 と ハ イ パーテ キ ス ト 文字列でつねに受け入れ ら れ ます。 バ イ ト 値参照 数値を文字参照で与え る こ と も で き ます。こ れは記号フ ォ ン ト 内のグ リ フ を指定す る のに有用で し ょ う 。 こ の方式では、 ハ ッ シ ュ キ ャ ラ ク タ 「#」 を加えた 10 進ま たは 16 進数が必要です。 こ こ で 16 進数は小文字か大文字の 「X」 キ ャ ラ ク タ を頭に付け ます。 例 (Wingdings フ ォ ン ト を前提) : &.#x9F; &.#159; Wingdingsフォントのビュレット記号 Wingdingsフォントのビュレット記号 4.6 キ ャ ラ ク タ を指定 111 文字参照を用い る 文字参照はデフ ォ ル ト では置換 さ れ ま せんので、 内容文字列内で文 字参照を用い る には、 charref オプシ ョ ン を明示的に true に設定す る必要があ り ます。 例 : p.set_option("charref=true"); font = p.load_font("Helvetica", "winansi", ""); if (font == -1) { ... } p.setfont(font, 24); p.show_xy("Price: 500€", 50, 500); こ のグ ロ ーバルオプシ ョ ンは、 それ以降に使用 さ れ るすべての名前文字列 ・ ハ イ パーテ キ ス ト 文字列 ・ 内容文字列に影響を与え ますが、 それは望む と こ ろではない場合 も あ る か も し れ ま せん。 文字参照を内容文字列に限定す る ためには、 かわ り に以下のテ キ ス ト オプ シ ョ ン を用い ます : font = p.load_font("Helvetica", "winansi", ""); if (font == -1) { ... } p.set_text_option("charref=true font=" + font + " fontsize=24"); p.show_xy("Price: 500€", 50, 500); 文字参照を使 う う えでのその他の注意点を挙げます : > 文字参照は、 内容文字列 ・ ハ イ パーテ キ ス ト 文字列 ・ 名前文字列のいずれで も 使え ま す。 例外 と し て、 フ ォ ン ト 独自グ リ フ名参照は上述の よ う に内容文字列でのみ動作 し ます。 > 文字参照はbuiltin エン コーデ ィ ン グのテ キ ス ト 内では置換 さ れません。し か し 、unicode エン コ ーデ ィ ン グ を用い る こ と に よ っ て記号フ ォ ン ト に対 し て文字参照を使 う こ と は で き ます。 > 文字参照はオプシ ョ ン リ ス ト 内では置換 さ れません。 ただ し 、 Unichar デー タ 型のオプ シ ョ ン内では認識 さ れます。 こ の場合、 「&」 ・ 「;」 修飾は外す必要があ り ます。 こ の認 識はつねに有効であ り 、 charref オプシ ョ ンには従い ません。 > 非 Unicode 対応言語バ イ ンデ ィ ン グでは、 textformat=utf16 ・ utf16be ・ utf16le の と き は 文字参照は 2 バ イ ト 値で表す必要があ り ます。encoding=unicode かつ textformat=bytes の と き は文字参照は ASCII で表す必要があ り ます (EBCDIC ベース のプ ラ ッ ト フ ォー ム で も )。 > 文字参照が解決で き ない と き (&# の後に無効な 10 進数があ る と き や、& の後に未知の 実 体 名 が あ る と き 等) は 例 外 が 発 生 し ま す。 内 容 文 字 列 に つ い て は こ の 動 作 は glyphcheck ・ errorpolicy 設定で制御 さ れます。 glyphcheck=none の場合は、 参照シーケ ン ス がその ま ま生成出力に現れます。 112 第 4 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング 5 フ ォ ン ト 処理 5.1 フ ォ ン ト 形式 5.1.1 TrueType フ ォ ン ト 各種 TrueType フ ォ ン ト 形式 PDFlib はベ ク ト ルベース の TrueType フ ォ ン ト に 対応 し てい ます。 PDFlib は TrueType フ ォ ン ト について以下の フ ァ イ ル形式に 対応 し てい ます : > Windows の TrueType フ ォ ン ト (*.ttf)。欧文・記号・日中韓フ ォ ン ト を含みます。 > TrueType コ レ ク シ ョ ン (*.ttc)。1 つの フ ァ イ ルの中に複数の フ ァ イ ルが入っ てい ます。TTC フ ァ イ ルは通常、日中韓フ ォ ン ト を グループ化する ために用 い ら れますが、 1 つの欧文フ ォ ン ト の複数の メ ンバを 1 個の フ ァ イ ルにパ ッ ケージす る のに も 用い ら れてい ます。 > エン ド ユーザー定義キ ャ ラ ク タ (EUDC) フ ォ ン ト (*.tte) 。 Microsoft の eudcedit.exe ツールで作 ら れます。 > OS X 上では、 シ ス テ ムに イ ン ス ト ール さ れた TrueType フ ォ ン ト (.dfont を含めて) は すべて PDFlib で も 使え ます。 TrueType フ ォ ン ト 名 フ ォ ン ト フ ァ イ ルを扱 う 際には、 フ ォ ン ト に任意の API 名を割 り 当て る こ と も で き ます (131 ページ 「フ ォ ン ト デー タ の ソ ース」 参照)。 こ の名前は、 フ ォ ン ト を読み込む際に用い ら れ、その フ ォ ン ト の フ ァ イ ル名やその フ ォ ン ト の内部名 と は異 な っ ていて も か ま い ません。 生成 さ れた PDF では、 TrueType フ ォ ン ト の名前が PDFlib (や Windows) で用い てい た名前 と 異な る こ と が あ り ま す。 こ れは正常で あ り 、 PDF は TrueType の PostScript 名を用いてい る と い う 事実に よ る も のです。 PostScript 名は本当の TrueType と は異な り ます (例 : TimesNewRomanPSMT に対 し て Times New Roman)。 5.1.2 OpenType フ ォ ン ト OpenType フ ォ ン ト 形式は、 PostScript と TrueType 技術を結合 し た も のです。 こ れは TrueType フ ァ イ ル形式の拡張 と し て実装 さ れてお り 、統一形式を提供 し ま す。 OpenType フ ォ ン ト は、 合字やス ワ ッ シ ュ キ ャ ラ ク タ 等、 テ キ ス ト 出力の改 善に利用で き る オプシ ョ ナルなテーブル (158 ページ 「6.3 OpenType レ イ ア ウ ト 機能」 参照) のほか、 複雑用字系シ ェ ーピ ン グのためのテーブルを含む こ と も で き ます (165 ページ 「6.4 複雑用字系出力」 参照)。 OpenType フ ォ ン ト は、すべてのプ ラ ッ ト フ ォーム上で動作す る 単一の コ ン テナ形式を 提供 し てい ますが、 OpenType には以下の よ う に さ ま ざ ま な種類があ り 、 こ れが混乱の元 にな る こ と も あ り ますので、 それを理解 し てお く こ と も 有用で し ょ う : > ア ウ ト ラ イ ン形式:OpenType フ ォ ン ト は、TrueType と PostScript のいずれをベース と し た グ リ フ記述 も 内容 と し て持つ こ と がで き ま す。 PostScript ベース のほ う は Compact Font Format (CFF) や Type 2 と も 呼ばれ、 たいてい *.otf 接尾辞をつけて用い ら れま す。 Windows Explorer は OpenType フ ォ ン ト をつねに 「O」 ロ ゴで表示 し ます。 > TrueType フ ォ ン ト と 、TrueType ア ウ ト ラ イ ン を持っ た OpenType フ ォ ン ト と は、と も に *.ttf 接尾辞を用いてい る 可能性があ る ため、 容易には見分けがつ き ません。 こ の識別 の難 し さ か ら 、 Windows Explorer は右記の基準で動作 し ます : .ttf フ ォ ン ト が電子署名 5.1 フ ォ ン ト 形式 113 を含んでい る な ら ば、 それは 「O」 ロ ゴ で表示 さ れ、 そ う でな ければそれは 「TT」 ロ ゴ で表示 さ れます。 し か し 、 電子署名は OpenType フ ォ ン ト において必須なわけでは あ り ませんので、 こ れはプ レーン な旧来の TrueType フ ォ ン ト と OpenType フ ォ ン ト と を見分け る 有用な基準 と し ては利用で き ません。 > CID (キ ャ ラ ク タ ID) アーキ テ ク チ ャ が日中韓フ ォ ン ト に対 し て用い ら れてい ます。 現 代の CID フ ォ ン ト は、 PostScript ア ウ ト ラ イ ン を持つ OpenType *.otf フ ォ ン ト と し て パ ッ ケージ さ れてい ます。 実用的な観点か ら は、 こ れはプ レーン な OpenType フ ォ ン ト と 見分けがつ き ません。 Windows Explorer は OpenType CID フ ォ ン ト をつねに 「O」 ロ ゴ で表示 し ます。 フ ァ イ ル名の接尾辞 も 、 Windows Explorer に よ っ て 表示 さ れ る ロ ゴ も 、 フ ォ ン ト 内に OpenType レ イ ア ウ ト 機能があ る か ど う かについては何 も 語 ら ない こ と に留意 し て く だ さ い。 詳 し く は 158 ページ 「6.3 OpenType レ イ ア ウ ト 機能」 を参照 し て く だ さ い。 5.1.3 WOFF フ ォ ン ト WOFF(Web Open Font Format=Webオープン フ ォ ン ト 形式)は、TrueType フ ォ ン ト と OpenType フ ォ ン ト のための、 単純な圧縮フ ァ イ ル形式です。 こ れは、 既存の フ ァ イ ル形式のための新 し い コ ン テナ形式 と し て捉え る こ と が で き ま すが、 新 た な タ イ ポ グ ラ フ ィ 機能 を 一切提供 し ま せん。 WOFF は、Web 上での使用のために設計 さ れた も ので、小 さ な フ ォ ン ト フ ァ イ ルサ イ ズ を 実現す る ために、 圧縮機能 と サブセ ッ ト 化機能を提供 し てい ます。 WOFF は W3C 勧告で 説明 さ れてい ます : WOFF の仕様は以下にあ り ます : www.w3.org/TR/WOFF WOFF フ ォ ン ト は通常、 フ ァ イ ル名拡張子 .woff を用いてい ます。 PDFlib は、 背後の TrueType ま たは OpenType フ ォ ン ト に対応 し てい る 限 り において、 WOFF フ ォ ン ト に対応 し てい ます。 た と えば、 TrueType ビ ッ ト マ ッ プ フ ォ ン ト が WOFF と し てパ ッ ケージ さ れた も のには対応 し てい ません。 Windows ・ Mac OS X オペレーテ ィ ン グ シ ス テ ムは WOFF フ ォ ン ト に対応 し ていないので、 こ れはホ ス ト フ ォ ン ト と し ては使 用で き ません。 5.1.4 SVG フ ォ ン ト SVG フ ォ ン ト は、SVG フ ォ ン ト 定義を内容 と し て持つプ レーン な SVG グ ラ フ ィ ッ ク フ ァ イ ルです (191 ページ 「7.2 SVG グ ラ フ ィ ッ ク 」 も 参照)。 SVG フ ォ ン ト は通常、 SVG グ ラ フ ィ ッ ク 内での利用のための ス タ ン ド ア ロ ン な リ ソ ー ス と し て用い ら れ ま すが、 他の形式 と 同様に、 すなわち SVG グ ラ フ ィ ッ ク 内での利用に必ず し も 関係な く 、 PDFlib へ読み込む こ と も で き ま す。 PDFlib は、 SVG フ ァ イ ル内の最初の font エ レ メ ン ト を使用 し 、 その フ ァ イ ル内にた と え グ ラ フ ィ ッ ク 内容が存在 し て も 無視 し ます。 フ ォ ン ト が見つかっ た場合には、 SVG 内で 指定 さ れた名前を内部的に持つ Type 3 フ ォ ン ト が生成 さ れます。 生成 さ れた フ ォ ン ト は、ユーザー定義の Type 3 フ ォ ン ト の よ う に扱われます(116 ペー ジ 「5.1.8 Type 3 フ ォ ン ト 」 参照)。 ユーザー指定の リ ソ ース名を内部 SVG フ ォ ン ト 名に 結びつけ、 両方の名前を用いてその フ ォ ン ト を読み込め る よ う にす る FontnameAlias リ ソ ース が自動的に作成 さ れます。 SVG フ ォ ン ト は通常、 フ ァ イ ル名拡張子 .svg を用いて い ます。 114 第 5 章 : フ ォ ン ト 処理 5.1.5 PostScript Type 1 フ ォ ン ト PostScript ア ウ ト ラ イ ン ・ メ ト リ ッ ク フ ァ イ ル形式 PostScript Type 1 フ ォ ン ト はかな ら ず 2 つの部分に分かれてい ます:ア ウ ト ラ イ ンデー タ 本体 と メ ト リ ッ ク 情報です。 PDFlib は、 PostScript Type 1 のア ウ ト ラ イ ンデー タ と メ ト リ ッ ク デー タ のための以下の フ ァ イ ル形式に対応 し てい ます : > プ ラ ッ ト フ ォーム非依存な AFM (Adobe Font Metrics) 形式 と 、 Windows 固有の PFM (Printer Font Metrics) フ ォ ン ト 形式。 > プ ラ ッ ト フ ォーム独立な PFA (Printer Font ASCII) 形式 と 、Windows 独自の PFB (Printer Font Binary) 形式。 ど ち ら も PostScript Type 1 形式の フ ォ ン ト ア ウ ト ラ イ ン情報用の 形式です。 > OS X 上では、 リ ソ ース を利用 し た PostScript Type 1 フ ォ ン ト 、 すなわち LWFN (LaserWriter Font) ア ウ ト ラ イ ン フ ォ ン ト に も 対応 し てい ます。 こ の種の フ ォ ン ト には フ ォ ン ト スーツ ケース (FOND リ ソ ース。 FFIL と も い う ) がついてお り 、 その中に メ ト リ ッ ク デー タ が入っ てい ます (ス ク リ ーン フ ォ ン ト も 入っ てい ますが PDFlib はそれ は無視 し ます)。 > PostScript ホ ス ト フ ォ ン ト を扱 う 際には、 LWFN はその フ ォ ン ト スーツ ケース と 同 じ デ ィ レ ク ト リ に置かれてい る 必要があ り 、 かつ 5+3+3 規則に従っ て命名 さ れてい る必 要があ り ます。 PostScript フ ォ ン ト 名 フ ォ ン ト フ ァ イ ルを扱 う 際には、任意のエ イ リ ア ス を利用で き ま す (131 ページ 「フ ォ ン ト デー タ の ソ ース」 参照)。 フ ォ ン ト の内部名を知 り たい と き、 そ れを取得で き る 方法はい く つかあ り ます : > フ ォ ン ト ア ウ ト ラ イ ン フ ァ イ ル (*.pfa か *.pfb) を開き 、 そのエン ト リ /FontName の後 の文字列を探 し ます。 こ のエン ト リ か ら 、 最初のキ ャ ラ ク タ (\) を省いて、 残 り のキ ャ ラ ク タ を フ ォ ン ト 名 と し て使い ます。 > Windows と OS X では、 フ ォ ン ト フ ァ イ ルを ダブル ク リ ッ ク す る と 、 その フ ォ ン ト のサ ンプルが現れて フ ォ ン ト の PostScript 名 も 表示 さ れます。 > AFM メ ト リ ッ ク フ ァ イ ルを開 き 、 そのエン ト リ FontName の後の文字列を探 し ます。 注 PostScript 名は Windows の フ ォ ン ト メ ニ ュ ー名 と はかな り 違 う こ と があ り ます。た と えば 「AvantGarde-Demi」 (PostScript 名) は 「AvantGarde, Bold」 (Windows のフ ォ ン ト メ ニ ュ ー 名) と な り ます。 5.1.6 SING フ ォ ン ト (グ リ フ レ ッ ト ) SING フ ォ ン ト (Smart Independent Glyphlets) は、 技術的には OpenType フ ァ イ ル形式の 拡張です。 SING フ ォ ン ト は、 日中韓テ キ ス ト におけ る 外字問題、 すなわち Unicode や広 く 用い ら れてい る 日中韓 レ ガ シエ ン コ ーデ ィ ン グ のいずれに も エ ン コ ー ド さ れていない カ ス タ ム な グ リ フ に対す る解決策 と し て開発 さ れた も のです。 SING アーキ テ ク チ ャ に関 す る 詳細を知 る には、Adobe Glyphlet Development Kit (GDK) for SING Gaiji Architecture を以 下の場所か ら ダ ウ ン ロ ー ド す る こ と がで き ます : www.adobe.com/devnet/opentype/gdk/topic.html SING フ ォ ン ト はたいてい、 1 個のグ リ フ だけ を内容 と し て持ち ます (あわせて縦書 き 字体 も 含む こ と も あ り ます)。 こ の 「 メ イ ン」 グ リ フ の Unicode 値は、 PDFlib で取得す る こ と がで き 、 それにはグ リ フ ID を要求 し 、 ついで こ のグ リ フ ID に対す る Unicode 値を要求 し ます : 5.1 フ ォ ン ト 形式 115 maingid = (int) p.info_font(font, "maingid", ""); uv = (int) p.info_font(font, "unicode", "gid=" + maingid); SING フ ォ ン ト を、 PDF_load_font( ) の fallbackfonts オプシ ョ ンの forcechars オプシ ョ ンの gaiji サブオプシ ョ ン を用いて予備フ ォ ン ト と し て利用す る こ と を推奨 し ます。 詳 し く は 174 ページ 「6.5.2 EUDC ・ SING フ ォ ン ト に よ る 外字キ ャ ラ ク タ 」 を参照 し て く だ さ い。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の fonts/starter_fallback ト ピ ッ ク にあ り ます。 廉価な FontLab SigMaker ツールを利用 し て、既存の画像や他フ ォ ン ト 内のグ リ フ をベース に SING フ ォ ン ト を生成す る こ と も で き ます : www.fontlab.com/font-utility/sigmaker/ 5.1.7 CEF フ ォ ン ト CEF フ ォ ン ト 形式 (Compact Embedded Font) は、 SING フ ォ ン ト と 非常に似てい ます。 こ れは、 PostScript ア ウ ト ラ イ ン を持つ OpenType フ ォ ン ト のサブセ ッ ト か ら 成っ てい ます が、 ただ し 通常の OpenType フ ォ ン ト と は異な り 、 CEF フ ォ ン ト は共通 TrueType フ ォ ン ト テーブルを含んでい ません。 CEF フ ォ ン ト は主に Adobe アプ リ ケーシ ョ ンに よ っ て使 用 さ れてい ます。CEF フ ォ ン ト はたいてい SVG グ ラ フ ィ ッ ク 内に埋め込まれてい ますが、 ス タ ン ド ア ロ ン フ ァ イ ル と し て存在す る こ と も あ り ます。 その場合には通常、 フ ァ イ ル名 拡張子 .cef を用いてい ます。 PDFlib は CEF フ ォ ン ト を、 ほぼ OpenType フ ォ ン ト と 同様 に取 り 扱い ます。 5.1.8 Type 3 フ ォ ン ト 他のすべての フ ォ ン ト 形式 と は異な り 、Type 3 フ ォ ン ト はデ ィ ス ク フ ァ イ ルか ら 取得 さ れ る のではな く 、 標準 PDFlib グ ラ フ ィ ッ ク 関数群を用いて実行時に定義 さ れ る 必要があ り ます。 Type 3 フ ォ ン ト は以下の用途で有用です : > ビ ッ ト マ ッ プフ ォ ン ト 。 > ロ ゴ等のカ ス タ ム グ ラ フ ィ ッ ク を、 シ ンプルなテ キ ス ト 操作命令で簡単に印刷可能。 > いずれの定義済みの フ ォ ン ト やエ ン コ ーデ ィ ン グ で も 入手で き な い日本語の外字 (ユーザー定義キ ャ ラ ク タ )。 Type 3 フ ォ ン ト の定義の中では、 PDFlib のベ ク ト ルグ ラ フ ィ ッ ク ・ ラ ス タ 画像の機能が すべて使え ます し 、 テ キ ス ト 出力の機能で さ えすべて使 う こ と がで き る ので、 Type 3 フ ォ ン ト のキ ャ ラ ク タ の中身に関 し ては制約は何 も あ り ません。 PDF 取 り 込み ラ イ ブ ラ リ PDI と 組み合わせれば、 さ ま ざ ま な描画の組み合わせを 1 枚の PDF のページ と し て取 り 込ん で、 それを用いて Type 3 フ ォ ン ト のキ ャ ラ ク タ を定義す る こ と さ え可能です。 し か し 、 Type 3 フ ォ ン ト が最 も し ば し ば利用 さ れ る のはビ ッ ト マ ッ プグ リ フ のためであ り 、それは こ れが PDF 内でグ リ フ に ラ ス タ 画像を使え る 唯一の フ ォ ン ト 形式だか ら です。 以下の例 は、 単純な Type 3 フ ォ ン ト を定義 し てい ます : p.begin_font("Fuzzyfont", 0.001, 0.0, 0.0, 0.001, 0.0, 0.0, ""); p.begin_glyph_ext(-1, "glyphname=circle width=1000 boundingbox={0 0 1000 1000}"); p.arc(500, 500, 500, 0, 360); p.fill(); p.end_glyph(); p.begin_glyph_ext(-1, "glyphname=ring width=400 boundingbox={0 0 400 400}"); p.arc(200, 200, 200, 0, 360); 116 第 5 章 : フ ォ ン ト 処理 p.stroke(); p.end_glyph(); p.end_font(); ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの fonts/starter_type3font ・ fonts/type3_ bitmaptext ・ fonts/type3_rasterlogo ・ fonts/type3_vectorlogo ト ピ ッ ク にあ り ます。 こ う し た フ ォ ン ト は PDFlib の中に登録 さ れ、 その名前は PDF_load_font( ) に与え る こ と が で き ます。 その際、 その Type 3 フ ォ ン ト の中のグ リ フ の名前を含むエン コーデ ィ ン グ も 一緒に指定す る 必要があ り ます。Type 3 フ ォ ン ト を扱 う 時は以下の こ と に留意 し て く だ さ い: > フ ォ ン ト が encoding=unicode で読み込まれてい る場合、そのグ リ フは、その Unicode 値 で、 あ る いは &.< グ リ フ 名 > の形のグ リ フ名参照で指定で き ます。 た と えば : &.circle; > フ ォ ン ト が encoding=builtin で読み込まれてい る場合、文字 コー ド を用いて グ リ フ を指 定で き ます。 こ の場合、 各グ リ フ の コ ー ド は、 グ リ フ が作成 さ れた順序に照応 し ます。 .notdef グ リ フはつねに コ ー ド 0 を持ち ます。 > Unicode 値のみが指定 さ れ、グ リ フ名が指定 さ れていない場合、PDFlib は、GXXX の形の グ リ フ名を生成 し ます。 こ こ で XXX は、 生成グ リ フ の 10 進番号です。 > Type 3 フ ォ ン ト 内で ビ ッ ト マ ッ プ を定義する には、inline 画像オプシ ョ ン を用い る こ と を推奨 し ます。 interpolate 画像に対する オプシ ョ ンは、 Type 3 ビ ッ ト マ ッ プ フ ォ ン ト の画面上 と 印刷上の見映え を向上 さ せ る ために有用で し ょ う 。 > 普通の ビ ッ ト マ ッ プデー タ を用いて キ ャ ラ ク タ を定義す る 場合、 ビ ッ ト マ ッ プ中の使 われていない ピ ク セルは、 背景にかかわ ら ず白 く 印刷 さ れ ます。 こ れを避けて、 元の 背景色が透けて見え る よ う にす る には、 ビ ッ ト マ ッ プ画像を作成す る際に mask オプ シ ョ ン を用い ます。 > PDF 読み込み機能を持つ さ ま ざ ま な ソ フ ト ウ ェ アが持つ制約のため、 テ キ ス ト 出力内 で使われ る キ ャ ラ ク タ は、 すべて実際に フ ォ ン ト 中で定義 さ れていなければな り ませ ん : 文字 コ ー ド x を任意のテ キ ス ト 出力関数で表示 し たい場合、 エン コーデ ィ ン グの 位置 x に glyphname があ る な ら ば、 その glyphname は PDF_begin_glyph_ext( ) で定義 さ れていなければな り ません。 > PDF 読み込み機能を持つ ソ フ ト ウ ェ アのなかには、 その照応す る グ リ フ名が フ ォ ン ト 中で定義 さ れていない コ ー ド が用い ら れ る 場合、 .notdef と い う 名前のグ リ フ を必要 と す る も のがあ り ます。 .notdef グ リ フ があ り さ えすれば よ く 、 その中身は空のグ リ フ定 義でか ま い ません。 > Type 3 グ リ フ定義は、 アセ ン ダやデ ィ セ ン ダな ど、 タ イ ポグ ラ フ ィ 的なプ ロ パテ ィ を 一切提供 し ません。 ただ し 、 PDF_load_font( ) でその照応す る オプシ ョ ン を用いれば設 定で き ます。 5.1 フ ォ ン ト 形式 117 5.2 Unicode のキ ャ ラ ク タ と グ リ フ 5.2.1 グ リ フ ID フ ォ ン ト はグ リ フ の集合であ り 、 各グ リ フ がその輪郭に よ っ て定義 さ れてい ます。 PDFlib は、 フ ォ ン ト 内の各グ リ フ に番号を割 り 当て ます。 こ の番号を グ リ フ ID ま たは GID と い い ま す。 GID 0 (ゼ ロ ) は、 すべての フ ォ ン ト 形式におい て .notdef グ リ フ を指 し ま す。 .notdef グ リ フ の見た目はフ ォ ン ト 形式やベン ダに よ っ て異な り ますが、 よ く あ る 実装は 空白グ リ フ か白四角か四角バ ッ テ ンです。 最高の GID は、 その フ ォ ン ト 内のグ リ フ数 よ り 1 少ない数であ り 、 こ れは PDF_info_font( ) の numglyphs キー ワー ド で ク エ リ す る こ と がで き ます。 グ リ フ ID の割 り 当て方はフ ォ ン ト 形式に よ っ て異な り ます : > TrueType・OpenType フ ォ ン ト はすでに内部 GID を含んでい ますので、PDFlib は こ の GID を用い ます。 > CID キー付 き OpenType 日中韓フ ォ ン ト では、 CID が GID と し て用い ら れます。 > それ以外の フ ォ ン ト 種別については、 PDFlib がグ リ フ に、 フ ォ ン ト 内のその照応す る ア ウ ト ラ イ ン記述の順番に従っ て付番 し ます。 PDFlib では、 Unicode な ど のエン コ ーデ ィ ン グではな く GID でグ リ フ を選ぶ こ と も で き ま す (127 ページ 「グ リ フ ID エン コ ーデ ィ ン グ」 参照)。 直接 GID 指定は、 グ リ フ数を ク エ ル し て全グ リ フ を なめ る こ と で フ ォ ン ト の概観表を印刷する 等、特殊な応用でのみ有用で す。 5.2.2 グ リ フ に対す る Unicode マ ッ ピ ン グ Unicode マ ッ ピ ン グ PDFlib は、 各 GID に一意な Unicode 値を割 り 当て ます。 こ のマ ッ ピ ン グ処理はフ ォ ン ト 形式に よ っ て異な り ますので、対応 し てい る フ ォ ン ト 種別ご と に以 下の各項で解説 し てい ます。 各 GID には一意な Unicode 値が割 り 当て ら れますが、 その逆 は必ず し も 真ではあ り ません。 すなわち、 あ る 1 つのグ リ フ が複数の Unicode 値を表す こ と も あ り ます。 多 く の TrueType ・ OpenType フ ォ ン ト で よ く あ る 例は、 空グ リ フ が U+0020 の空白 と U+00A0 の ノ ーブ レー ク スペース の両方を表す場合や、1 つのグ リ フ が U+2126 の オーム記号 と U+03A9 のギ リ シ ャ 文字 Ω を表す場合です。 複数の Unicode 値が フ ォ ン ト 内 の 同一の グ リ フ を 指 し て い る 場合、 PDFlib は そ の フ ォ ン ト 内 で最初 に見つ か っ た Unicode 値を割 り 当て ます。 マ ッ プ な し グ リ フ と 私用領域 (PUA) 場 合 に よ っ て は、 あ る 特 定 の グ リ フ に 対 す る Unicode 値を フ ォ ン ト が提供 し ていない こ と があ り ます。 こ の場合には、PDFlib は Unicode 私用領域 (95 ページ 「4.1 Unicode の重要な諸概念」 参照) 内の値を そのグ リ フ に割 り 振 り ます。 こ の よ う な グ リ フ を マ ッ プ な し グ リ フ と いい ます。 フ ォ ン ト 内のマ ッ プな し グ リ フ の数は、 PDF_info_font( ) の unmappedglyphs キー ワー ド で ク エ リ す る こ と がで き ます。 マ ッ プな し グ リ フ は、 フ ォ ン ト の検索性 と テ キ ス ト 抽出を司 る ToUnicode CMap 内では Unicode 置換キ ャ ラ ク タ U+FFFD で表 さ れます。 結果 と し てマ ッ プな し グ リ フは、 生成 さ れた PDF か ら テ キ ス ト と し て正 し く 抽出で き な く な り ます。 PDFlib が PUA 値を マ ッ プな し グ リ フ に割 り 振っ てい く 際には、 以下のプール内の若い 値か ら 順に用いてい き ます : > 基本 と な る のは基本多言語面 (BMP) 内の Unicode PUA 領域、 すなわち範囲 U+E000 ~ U+F8FF です。 必要であれば こ れに加え、 第 15 面 (U+F0000 to U+FFFFD) 内の PUA 値 も 用い ら れます。 118 第 5 章 : フ ォ ン ト 処理 > その フ ォ ン ト が内部的にすでに割 り 振っ てい る PUA 値は、新たな PUA 値を作成す る 際 には用い ら れません。 > Adobe 領域 U+F600 ~ F8FF 内の PUA 値は用い ら れません。 生成 さ れ る PUA 値は、1 つの フ ォ ン ト 内で一意です。 あ る フ ォ ン ト 内のグ リ フ に対 し て生 成 さ れ る PUA 値の割 り 振 り は、 他の フ ォ ン ト か ら は独立です。 TrueType ・ OpenType ・ SING フ ォ ン ト に対す る Unicode マ ッ ピ ン グ PDFlib は、 フ ォ ン ト の cmap テーブル内で見つか っ た Unicode マ ッ ピ ン グ を保持 し ます (cmap の選択は、 PDF_load_font( ) に与え る エン コ ーデ ィ ン グに依存 し ます)。1 つのグ リ フ が複数の Unicode 値に対 し て用い ら れてい る 場合、PDFlib はその フ ォ ン ト 内で見つか っ た最初の Unicode 値 を用い ます。 cmap が何の Unicode マ ッ ピ ン グ も 提供 し ていないグ リ フ については、PDFlib はそのグ リ フ名を post テーブル (その フ ォ ン ト 内にあれば) 内でチ ェ ッ ク し 、 Type 1 フ ォ ン ト に ついて後述す る よ う にそのグ リ フ名に基づいて Unicode マ ッ ピ ン グ を決定 し ます。 場合に よ っ ては、 cmap も post テーブル も その フ ォ ン ト 内のすべてのグ リ フ に対す る Unicode 値を提供 し ていない こ と があ り ます。こ れは Unicode 規格外の異体字(ス ワ ッ シ ュ キ ャ ラ ク タ 等) ・ 拡張合字 ・ 非テ キ ス ト 記号について あ ては ま り ます。 こ の場合 PDFlib は、 118 ページ 「マ ッ プな し グ リ フ と 私用領域 (PUA)」 で述べた よ う に問題のグ リ フ に PUA 値を割 り 当て ます。 Type 1 フ ォ ン ト に対す る Unicode マ ッ ピ ン グ Type 1 フ ォ ン ト は明示的な Unicode マ ッ ピ ン グ を内蔵 し てお ら ず、 各グ リ フ に一意な名前を割 り 当ててい ます。 PDFlib は こ のグ リ フ名に基づいて Unicode 値の割 り 当て を試みます。 そのためには内蔵の、 さ ま ざ ま な言語 や用字系に対 し て広 く 用い ら れ る 7,000 種を超すグ リ フ名に対す る Unicode マ ッ ピ ン グ を 内容 と し て持つマ ッ ピ ン グ テーブルが使われ ま す。 こ のマ ッ ピ ン グ テーブルには Adobe Glyph List (AGL)1 内のお よ そ 4,200 種のグ リ フ名が含まれてい ます。 し か し 、 Type 1 フ ォ ン ト は こ の内蔵マ ッ ピ ン グ テーブルに含まれていないグ リ フ名を含んでい る こ と があ り 、 こ れは と り わけ記号フ ォ ン ト について顕著です。 こ の場合 PDFlib は、 118 ページ 「マ ッ プ な し グ リ フ と 私用領域 (PUA)」 で述べた よ う に問題のグ リ フ に PUA 値を割 り 当て ます。 Type 1 フ ォ ン ト に対する メ ト リ ッ ク が PFM フ ァ イ ルか ら 読み込まれ、PFB ま たは PFA ア ウ ト ラ イ ン フ ァ イ ルが得 ら れない と き は、PDFlib はその フ ォ ン ト のグ リ フ名を知 る こ と がで き ません。 こ の場合、 PDFlib は Unicode 値を PFM フ ァ イ ル内のエン コ ーデ ィ ン グ (charset) エン ト リ に基づいて割 り 当て ます。 Type 3 フ ォ ン ト に対す る Unicode マ ッ ピ ン グ Type 3 フ ォ ン ト も グ リ フ名に基づいてい ますので、 Type 1 フ ォ ン ト と 同様に扱われます。 ただ し 重要な違いは、 Type 3 フ ォ ン ト ではグ リ フ 名はユーザーの制御下に あ る (直接的に uv 引数を通 じ て、 ま たは間接的に PDF_begin_glyph_ext( ) の glyphname オプシ ョ ン を通 じ て) と い う こ と です。 ですので、 ユーザー定義 Type 3 フ ォ ン ト 内のグ リ フ に対 し ては、 適切な Unicode 値か、 あ る いは適 切な AGL グ リ フ名を与え る こ と を強 く 推奨 し ます。 こ れに よ っ て、 正 し い Unicode 値が PDFlib に よ っ て必ず割 り 当て ら れ る よ う にな り 、 生成 さ れ る PDF 文書内でテ キ ス ト が検 索可能にな り ます。 1. AGL は partners.adobe.com/public/developer/en/opentype/glyphlist.txt にあ り ます。 5.2 Unicode のキ ャ ラ ク タ と グ リ フ 119 5.2.3 Unicode 制御キ ャ ラ ク タ 制御キ ャ ラ ク タ は、 いかな る グ リ フ を も 表 さ ず、 何 ら かの組版情報の伝達に用い ら れ る Unicode 値です。 PDFlib は、 以下のグループの Unicode 制御キ ャ ラ ク タ を処理 し ます : > デフ ォ ル ト シ ェーピ ン グ動作を オーバ ラ イ ド す る ための制御キ ャ ラ ク タ 群(表 6.4 に挙 げ る ) と 、 デフ ォ ル ト 双方向組版をオーバ ラ イ ド する ための制御キ ャ ラ ク タ 群 (表 6.5 に挙げ る )は、テ キ ス ト 行・テ キ ス ト フ ロ ー内の複雑用字系のシ ェ ーピ ン グ と OpenType レ イ ア ウ ト 機能の処理を制御 し ます。 こ れ ら の制御キ ャ ラ ク タ は、 評価 さ れた後に削 除 さ れます。 > 表 8.1 に挙げ る 改行 と テ キ ス ト フ ロ ー組版のための組版制御キ ャ ラ ク タ 。こ れ ら の制御 キ ャ ラ ク タ は、 評価 さ れた後に削除 さ れます。 > こ れ以外の範囲 U+0001 ~ U+0019 ・ U+007F ~ U+009F の Unicode 制御キ ャ ラ ク タ は replacementchar キ ャ ラ ク タ で置換 さ れます。 フ ォ ン ト が制御キ ャ ラ ク タ に対す る グ リ フ を含んでいた と し て も 、そのグ リ フは通常は視 覚化 さ れません。 なぜな ら PDFlib が制御キ ャ ラ ク タ を除去す る か ら です ( こ の規則の例 外 と し て &NBSP; と &SHY; は除去 さ れません)。 ただ し 、 encoding=glyphid の場合は制御 キ ャ ラ ク タ はテ キ ス ト 内に保持 さ れ、 視覚出力を生み出す こ と がで き ます。 120 第 5 章 : フ ォ ン ト 処理 5.3 テキス ト 処理パ イ プ ラ イ ン ク ラ イ ア ン ト アプ リ ケーシ ョ ンは、 ページ出力 し たいテ キ ス ト を PDFlib に与え ます。 こ のテ キ ス ト は、 ア プ リ ケーシ ョ ン個別の何 ら かのエ ン コ ーデ ィ ン グ と 形式に従っ てエ ン コ ー ド さ れてい ます。 し か し 、 PDFlib の内部処理は Unicode 規格に基づいてお り 、 ま た最 終テ キ ス ト 出力はフ ォ ン ト 固有のグ リ フ ID を必要 と し ます。 ですので PDFlib は、 ページ 内容のために与え ら れ る 文字列を テ キ ス ト 処理パ イ プ ラ イ ンの中で 3つの過程を経て処理 し ます : > 入力コ ー ド を Unicode 値へ正規化。こ の処理は選択 さ れてい る エン コ ーデ ィ ン グに よ り 制約を受け ます。 > Unicode 値を フ ォ ン ト 固有のグ リ フ ID へ変換。こ の処理はその フ ォ ン ト 内で利用可能な グ リ フ に よ り 制約を受け ます。 > グ リ フ ID を転換。 こ の処理は出力エン コ ーデ ィ ン グに よ り 制約を受け ます。 テ キ ス ト 処理パ イ プ ラ イ ンの こ れ ら 3 つの過程は、 い く つかの下部処理を含んでお り 、 そ れはオプシ ョ ンで制御す る こ と がで き ます。 5.3.1 入力文字列を Unicode へ正規化 以下の ス テ ッ プが、 encoding=glyphid と 非 Unicode CMap 以外のすべてのエン コ ーデ ィ ン グに対 し て実行 さ れます : > Unicode 対応言語バ イ ンデ ィ ン グ : シ ン グルバ イ ト エン コ ーデ ィ ン グが指定 さ れてい る と き は、UTF-16 テ キ ス ト は高次バ イ ト を捨て る こ と でシ ン グルバ イ ト テ キ ス ト へ変換 さ れます。 > Windows : マルチバ イ ト テ キ ス ト (cp932 等) を Unicode へ変換 し ます。 > エ ス ケープシーケ ン ス (109 ページ 「4.6.1 エ ス ケープシーケ ン ス」 参照) を、 その照 応す る 数値へ置 き 換え ます。 > 文字参照を解決 し 、 それを その照応す る Unicode 値へ置 き換え ます (110 ページ 「4.6.2 文字参照」 お よ び次項参照)。 > シ ン グルバ イ ト エ ン コ ーデ ィ ン グ : シ ン グルバ イ ト テ キ ス ト を、 指定 さ れたエ ン コ ー デ ィ ン グに従っ て Unicode へ変換 し ます。 > normalize オプシ ョ ンに応 じ て、 テ キ ス ト を、Unicode 正規化形 (NFC 等) の う ちの一つ へ正規化。 さ ま ざ ま な フ ォ ン ト 形式やキ ャ ラ ク タ の種別に対す る Unicode の割 り 当てについて詳 し く は、 118 ページ 「5.2.2 グ リ フ に対す る Unicode マ ッ ピ ン グ」 を参照 し て く だ さ い。 グ リ フ 名に よ る文字参照 フ ォ ン ト 内のグ リ フは、その照応す る Unicode 値を あ ら か じ め 知 る こ と がで き ない (PDFlib が実行時に PUA 値を割 り 振 る ので) も のがあ り 、 その よ う な グ リ フは直接指定す る こ と がで き ません。 その よ う な グ リ フ を指定する には、 グ リ フ名 に よ る文字参照を使 う こ と がで き ます。 文法の解説は 110 ページ 「4.6.2 文字参照」 を参 照 し て く だ さ い。 こ れ ら の参照は、 その照応す る Unicode 値へ置 き換え ら れます。 文字参照が内容文字列内で用い ら れてい る と き は、 PDFlib はその指定 さ れた グ リ フ を カ レ ン ト フ ォ ン ト 内で見つけ よ う と 試み、 そ し てその参照を そのグ リ フ の Unicode 値へ置 き 換え ます。 指定 さ れた グ リ フ が フ ォ ン ト 内で見つか ら ない と き は、 PDFlib は Unicode 値 を決定す る ためにその内蔵グ リ フ名テーブルを検索 し ます。 こ の Unicode 値は さ ら に、 適 切な グ リ フ が フ ォ ン ト 内で得 ら れ る か ど う かをチ ェ ッ ク す る ために使われます。その よ う な グ リ フ が見つか ら ない と き は、 動作は glyphcheck ・ errorpolicy 設定で制御 さ れます。 文 字参照は、 glyphid ・ builtin エン コ ーデ ィ ン グでは使 う こ と がで き ません。 5.3 テキス ト 処理パイ プ ラ イ ン 121 5.3.2 Unicode 値を グ リ フ ID へ変換 前項で決定 さ れた Unicode 値は、 い く つかの理由に よ り 変更が必要な場合があ り ます。 以 下の ス テ ッ プは、 以下の よ う に処理 さ れ る encoding=glyphid と 非 Unicode CMap 以外のす べてのエン コ ーデ ィ ン グに対 し て実行 さ れます : > 非 Unicode CMap の場合 : 無効な コ ー ド 列はつねに例外を発生 さ せます。 > encoding=glyphid の場合 : 無効な グ リ フ ID は、replacementchar (glyphcheck=replace の と き) かグ リ フ ID 0 (glyphcheck=none) へ置 き換え ら れます。 glyphcheck=error の と き は例外が発生 し ます。 予備 フ ォ ン ト か ら のキ ャ ラ ク タ を強制 Unicode 値 を、 fallbackfonts オ プ シ ョ ン の forcechars サブオプシ ョ ンに従っ て置 き 換えて、その照応す る 予備フ ォ ン ト のグ リ フ ID を 決定 し ます。 詳 し く は 138 ページ 「5.4.6 予備フ ォ ン ト 」 を参照 し て く だ さ い。 異体字シーケ ン ス を解決 フ ォ ン ト に よ っ ては、 Unicode キ ャ ラ ク タ の後に、 そのキ ャ ラ ク タ の特定の グ リ フ 異体字 を 選択す る 異体字セ レ ク タ が続 き う る も のが あ り ま す (177 ページ 「6.5.4 Unicode 異体字セ レ ク タ と 異体字シーケ ン ス」 参照)。 その フ ォ ン ト がその 異体字シーケ ン ス のための異体字グ リ フ を内容 と し て持っ てい る 場合には、元のグ リ フ ID ではな く その異体字グ リ フ のグ リ フ ID が用い ら れます。 グ リ フ ID へ変換 Unicode 値を、 118 ページ 「5.2.2 グ リ フ に対す る Unicode マ ッ ピ ン グ」 で決定 さ れ る マ ッ ピ ン グに従っ て グ リ フ ID へ変換 し ます。 Unicode 値に照応す る グ リ フ ID が フ ォ ン ト 内に見つか ら ない と き は、その次の ス テ ッ プは glyphcheck オプシ ョ ンに よ っ て異な り ます : > glyphcheck=none : グ リ フ ID 0 が用い ら れます。すなわち、.notdef グ リ フ がテ キ ス ト 出 力内で用い ら れます。 .notdef グ リ フ が視覚的形状を内容 と し て持つ場合 (たいていは 白四角か四角バ ッ テ ン) には、 問題の起き た キ ャ ラ ク タ が PDF ページ上で目に見え る よ う にな り ます。 それが望ま し いか ど う かは場合に よ る で し ょ う 。 > glyphcheck=replace ( こ れがデフ ォ ル ト ) : 警告 メ ッ セージが ロ グ記録 さ れ、 PDFlib は、 マ ッ プで き ない Unicode 値を後述のグ リ フ置換機構に よ っ て置 き 換え よ う と 試みます。 > glyphcheck=error : PDFlib はエ ラ ーを発生 さ せます。 errorpolicy=return の場合には、 こ れはすなわち関数呼び出 し がテ キ ス ト 出力を一切作成せずに終了す る こ と を意味 し 、 PDF_add/create_textflow( ) が -1 (PHP の場合:0) を返す こ と を意味 し ます。errorpolicy= exception の場合は例外が発生 し ます。 グ リ フ 置換 glyphcheck=replace の場合は、 マ ッ プで き ない Unicode 値は再帰的に以下の よ う に置き 換え ら れます : > マ ス タ ーフ ォ ン ト を読み込んだ際に指定 し た予備フ ォ ン ト の中で、その Unicode 値に対 す る グ リ フ が検索 さ れ ます。 各フ ォ ン ト に対 し て予備フ ォ ン ト は複数指定す る こ と も で き る ので、 こ こ では任意の数の フ ォ ン ト が関わ る 可能性があ り ます。 予備フ ォ ン ト の う ちの 1 つでグ リ フ が見つか っ た と き はそれが使われます。 > タ イ ポグ ラ フ ィ 的に類似のグ リ フ を、PDFlib の内蔵置換テーブル内の Unicode 値に従っ て選びます。 こ の内蔵 リ ス ト か ら こ れ ら の置換のい く つか を以下に抜粋 し ます。 リ ス ト 内の 1 番目のキ ャ ラ ク タ が フ ォ ン ト 内で見つか ら ない と き 、 それは 2 番目のキ ャ ラ ク タ へ置 き換え ら れます : 122 U+00A0 (ノーブレークスペース) U+0020 (空白) U+00AD (ソフトハイフン) U+002D (ハイフン-マイナス) 第 5 章 : フ ォ ン ト 処理 U+2010 (ハイフン) U+002D (ハイフン-マイナス) U+03BC (ギリシャ文字μ) U+00C5 (マイクロ記号) U+212B (オングストローム記号) U+00B5 (欧文Aの上に丸) U+220F (多項総乗演算子) U+03A0 (ギリシャ文字?) U+2126 (オーム記号) U+03A9 (ギリシャ文字Ω) 内蔵テーブルに加えて、 全角キ ャ ラ ク タ U+FF01 ~ U+FF5E は、 フ ォ ン ト 内で全角字 体が得 ら れない場合には、 その照応する ISO 8859-1 キ ャ ラ ク タ (すなわち U+0021 ~ U+007E) へ置き 換え ら れます。 > Unicode の合字を、その構成グ リ フ群へ分解 し ます(例:U+FB00 欧文合字 ff を シーケ ン ス U+0066 f ・ U+0066 f へ置 き 換え)。 > 同 じ Unicode セマ ン テ ィ ク ス を持つグ リ フ を、 そのグ リ フ名に従っ て選びます。 特に、 ピ リ オ ド で区切 ら れた グ リ フ名接尾辞はすべて、 その照応す る グ リ フ が得 ら れない と き は除去 さ れます (例 : A.swash を A へ置 き 換え。 g.alt を g へ置 き換え)。 こ れ ら の方式がいずれ も Unicode 値に対する グ リ フ を与え ない と き は、replacementchar オ プシ ョ ンが以下の よ う に評価 さ れます : > replacementchar=auto の ( こ れがデフ ォ ル ト です) 場合には、キ ャ ラ ク タ U+00A0 ( ノ ー ブ レー ク スペース) と U+0020 (空白) が試 さ れます。 こ れ ら さ え も 得 ら れない と き は、 グ リ フ ID 0 (グ リ フ な し 記号) が使われます。 > Unicode キ ャ ラ ク タ が replacementchar と し て指定 さ れてい る 場合には、それが元のキ ャ ラ ク タ のかわ り に用い ら れます。 > replacementchar=drop の場合には、そのキ ャ ラ ク タ は入力ス ト リ ームか ら 除去 さ れ、出 力は作成 さ れません。 > replacementchar=error の場合には、 例外が発生 し ます。 こ れを利用す る と 、 読めない テ キ ス ト 出力を避け る こ と がで き る で し ょ う 。 ま た こ れは PDF/A と PDF/A-4/5 では 強制 さ れます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの fonts/glyph_replacement ト ピ ッ ク にあ り ます。 5.3.3 グ リ フ ID を転換 決定 さ れた グ リ フ ID は ま だ最終的な も のではあ り ません。 なぜな ら 最終出力を作成す る 前に、 い く つかの転換を行わなければな ら ない可能性があ る か ら です。 具体的に ど の よ う な転換が必要かは、 フ ォ ン ト やい く つかのオプシ ョ ンに よ っ て異な り ます。 以下の ス テ ッ プは、 非 Unicode CMap で keepnative=true の場合を除き 、 すべてのエン コーデ ィ ン グに対 し て行われます。 縦書き グ リ フ 縦書 き モー ド の フ ォ ン ト では、い く つかのグ リ フは縦書 き字体へ置 き換わ る可能性があ り ます。 こ の置換は、 フ ォ ン ト 内に vert OpenType レ イ ア ウ ト 機能テーブル が必要です。 OpenType レ イ ア ウ ト 機能 OpenType 機能は、 合字 ・ ス ワ ッ シ ュ キ ャ ラ ク タ ・ ス モール キ ャ ピ タ ルをは じ め と す る さ ま ざ ま な タ イ ポグ ラ フ ィ バ リ エーシ ョ ン を、 1 個ない し 複数 のグ リ フ ID を他の値へ置 き 換え る こ と に よ っ て作成す る こ と がで き ます。OpenType 機能 については 158 ページ 「6.3 OpenType レ イ ア ウ ト 機能」 で解説 し てい ます。 OpenType レ イ ア ウ ト 機能は、 適切な フ ォ ン ト に対 し てのみ有効であ り (161 ページ 「OpenType レ イ ア ウ ト 機能のための要件」 参照)、 かつ features オプシ ョ ンに従っ て適用 さ れます。 5.3 テキス ト 処理パイ プ ラ イ ン 123 複雑用字系のシ ェ ー ピ ン グ シ ェ ー ピ ン グは、 テ キ ス ト の順序を替え、 ま た、 キ ャ ラ ク タ の位置に よ っ て適切な字体の グ リ フ を決定 し ま す (例 : ア ラ ビ ア文字キ ャ ラ ク タ の頭 字 ・ 中字 ・ 尾字 ・ 単独形) 。 こ れは適切な フ ォ ン ト に対 し てのみ有効であ り (167 ページ 「シ ェ ーピ ン グのための要件」 参照)、 かつ shaping オプシ ョ ンに従っ て適用 さ れます。 124 第 5 章 : フ ォ ン ト 処理 5.4 フ ォ ン ト を読み込む 5.4.1 テキス ト フ ォ ン ト に対す る エ ン コ ーデ ィ ン グ を選ぶ フ ォ ン ト は、 明示的に PDF_load_font( ) 関数で読み込む こ と も で き 、 あ る いは暗黙的に、 PDF_add/create_textflow( )やPDF_fill_textblock( ) と いっ た特定の関数にfontname・encoding オプシ ョ ン を与え る こ と で読み込む こ と も で き ます。 ど の よ う な方式を用いて フ ォ ン ト を 読み込むのかにかかわ ら ず、 適切なエ ン コ ーデ ィ ン グ を指定す る 必要が あ り ま す。 エ ン コ ーデ ィ ン グは以下を決定 し ます : > PDFlib が与え ら れ る テ キ ス ト を ど のテ キ ス ト 形式であ る と 見なすか。 > フ ォ ン ト 内の ど のグ リ フ が使え る か。 > ページ上のテ キ ス ト と フ ォ ン ト 内のグ リ フデー タ が PDF 出力文書内に ど の よ う に格納 さ れ る か。 PDFlib のテ キ ス ト 処理は Unicode 規格1 に基づいてい ます。 こ れは ISO 10646 と ほぼ等価 です。 今ど き の開発環境の多 く が Unicode 規格に対応 し てい ますので、 Unicode 文字列を 使っ てで き る だけ簡単に PDF 出力を作成で き る よ う にす る こ と が私た ちの目標です。 た だ し 、 Unicode を扱わない開発者はそのアプ リ ケーシ ョ ン を Unicode へ切 り 替え る 必要は あ り ません。 レ ガシエン コ ーデ ィ ン グ も 使 う こ と がで き る か ら です。 ど のエ ン コ ーデ ィ ン グ を選ぶかは、 フ ォ ン ト や、 得 ら れ る テ キ ス ト デー タ や、 い く つ かのプ ロ グ ラ ミ ン グ的側面に よ っ て決ま り ます。 以下 こ の項では、 さ ま ざ ま な分類のエン コーデ ィ ン グの概観を示す こ と で、 適切なエン コ ーデ ィ ン グ を選ぶための助け と し ます。 Unicode エ ン コ ーデ ィ ン グ encoding=unicode と する と 、Unicode 文字列を PDFlib に渡す こ と がで き ます。 こ のエン コ ーデ ィ ン グはすべてのフ ォ ン ト 形式に対 し て使え ます。 利用 す る 言語バ イ ンデ ィ ン グに よ っ て、 そのプ ロ グ ラ ミ ン グ言語 (Java 等) が提供 し てい る Unicode 文字列デー タ 型を利用で き る 場合 も あれば、 Unicode を UTF-8 ・ UTF-16 ・ UTF32 のいずれかの形式で リ ト ルエンデ ィ ア ン ・ ビ ッ グエ ンデ ィ ア ンのいずれかのバ イ ト 順 序で内容 と し て持つバ イ ト 配列を用い る 場合 も あ り ます (C 等)。 encoding=unicode では、フ ォ ン ト 内のすべてのグ リ フ が指定で き、複雑用字系のシ ェー ピ ン グ と OpenType レ イ ア ウ ト 機能を使 う こ と がで き ます。PDFlib は、要求 さ れた Unicode 値に対す る グ リ フ を フ ォ ン ト が含んでい る か ど う かをチ ェ ッ ク し ます。グ リ フ が得 ら れな い と き は、 代替グ リ フ を同一フ ォ ン ト か別フ ォ ン ト か ら 持っ て来 る こ と がで き ます (138 ページ 「5.4.6 予備フ ォ ン ト 」 参照)。 非 Unicode 対応の言語バ イ ンデ ィ ン グでは、PDFlib はデフ ォ ル ト ではテ キ ス ト が UTF16 エン コ ー ド さ れてい る と 見な し ます。 し か し 、 textformat=bytes を指定すればシ ン グル バ イ ト 文字列を与え る こ と がで き ます。 こ の場合、 こ のバ イ ト 値はキ ャ ラ ク タ U+0001 ~ U+00FF を、 すなわち基本欧文キ ャ ラ ク タ 群を持つ先頭 Unicode ブ ロ ッ ク (ISO 8859-1 と 等価) を表 し ます。 ただ し 、 文字参照を利用すれば、 こ の範囲の外の Unicode 値を シ ン グ ルバ イ ト テ キ ス ト 内で指定す る こ と も 可能です。 PDF 内のい く つかの フ ォ ン ト 形式 (Type 1、 Type 3、 グ リ フ名に基づ く OpenType フ ォ ン ト ) は、 シ ン グルバ イ ト テ キ ス ト にのみ対応 し てい ます。 し か し 、 PDFlib では こ う し た 種類の フ ォ ン ト で も 255 種類を超え る キ ャ ラ ク タ を扱え る よ う 工夫 し てい ます。 encoding=unicode の難点は、 昔な が ら の シ ン グ ルバ イ ト やマルチバ イ ト のエ ン コ ー デ ィ ン グのテ キ ス ト を用い る こ と がで き ない (ISO 8859-1 を除き ) こ と です。 1. www.unicode.org を参照。 5.4 フ ォ ン ト を読み込む 125 シ ン グルバ イ ト エ ン コ ーデ ィ ン グ 8 ビ ッ ト エン コ ーデ ィ ン グ (シ ン グルバ イ ト エン コー デ ィ ン グ と も い う ) は、 テ キ ス ト 文字列内の各バ イ ト を 1 個のキ ャ ラ ク タ へマ ッ プ し ます ので、 同時に扱え る キ ャ ラ ク タ は 255 種類ま でに制限 さ れます (値 0 は利用で き ません)。 こ の種類のエン コ ーデ ィ ン グはすべての フ ォ ン ト 形式に対 し て使え ます。 PDFlib は、 選ば れたエ ン コ ーデ ィ ン グに合っ た グ リ フ を フ ォ ン ト が含んでい る か ど う か を チ ェ ッ ク し ま す。 使え る グ リ フ の数が最低限の数に届かない と き は、 PDFlib は警告 メ ッ セージ を ロ グ記 録 し ます。選ばれたエン コ ーデ ィ ン グに対 し て使え る グ リ フ が フ ォ ン ト 内で ま っ た く 得 ら れない と き は、 フ ォ ン ト 読み込みは 「font doesn't support encoding」 と い う メ ッ セージ を 出 し て失敗 し ます。 PDFlib は、 要求 さ れた入力値に対す る グ リ フ を フ ォ ン ト が含んでい る か ど う かをチ ェ ッ ク し ます。 グ リ フ が得 ら れない と き は、 代替グ リ フ を同一フ ォ ン ト か別 フ ォ ン ト か ら 持っ て来 る こ と がで き ます (138 ページ 「5.4.6 予備フ ォ ン ト 」 参照)。 非 Unicode 対応の言語バ イ ンデ ィ ン グでは、 PDFlib はデフ ォ ル ト ではテ キ ス ト がシ ン グルバ イ ト エン コ ー ド さ れてい る と 見な し ます。 し か し 、 textformat=utf8 か utf16 を指定 すれば UTF-8 か UTF-16 文字列を与え る こ と がで き ます。 8 ビ ッ ト エン コ ーデ ィ ン グについて詳 し く は 103 ページ 「4.4 シ ン グルバ イ ト (8 ビ ッ ト ) エン コ ーデ ィ ン グ」 で解説 し てい ます。 こ れは さ ま ざ ま な ソ ース か ら 持っ て来 る こ と がで き ます : > 103 ページ 「4.4 シ ン グルバ イ ト (8 ビ ッ ト ) エン コ ーデ ィ ン グ」 に従っ た大量の定義済 みエ ン コ ーデ ィ ン グ。 こ れは さ ま ざ ま な シ ス テ ム と さ ま ざ ま な ロ ケールで利用 さ れて い る 最 も 重要なエン コ ーデ ィ ン グ群を網羅 し てい ます。 > ユーザー定義エ ン コ ーデ ィ ン グ。 こ れは、 外部フ ァ イ ルで与え る か、 ま たは実行時に PDF_encoding_set_char( ) で動的に構築す る こ と がで き ます。こ のエン コーデ ィ ン グは、 グ リ フ名か Unicode 値に基づ く こ と がで き ます。 > オペレーテ ィ ン グ シ ス テ ム か ら 持っ て き たエ ン コ ーデ ィ ン グ。 シ ス テムエ ン コ ーデ ィ ン グ と も いい ます。 こ の機能は、 Windows と IBM i5/iSeries ・ zSeries で利用可能です。 シ ン グルバ イ ト エン コ ーデ ィ ン グの難点は、キ ャ ラ ク タ やグ リ フ の数に限 り があ る こ と で す。 こ の理由か ら 、 複雑用字系のシ ェーピ ン グ と OpenType レ イ ア ウ ト 機能はシ ン グルバ イ ト エン コ ーデ ィ ン グに対 し ては使え ません。 ビル ト イ ン エ ン コ ーデ ィ ン グ encoding=builtin を指定 し て、 記号フ ォ ン ト 内の非テ キ ス ト グ リ フ に対す る シ ン グルバ イ ト コ ー ド を使 う と い う 方法 も あ り ます。フ ォ ン ト の内部エ ン コ ーデ ィ ン グの形式はフ ォ ン ト の種類に よ っ て異な り ます : > TrueType:エン コ ーデ ィ ン グは、フ ォ ン ト のシ ン ボ リ ッ ク cmap に、すなわち cmap テー ブル内の (3, 0) エン ト リ に基づいて作成 さ れます。 > OpenType フ ォ ン ト はエン コ ーデ ィ ン グ を CFF テーブル内に含んでい る こ と があ り ま す。 > PostScript Type 1 フ ォ ン ト はつねにエン コ ーデ ィ ン グ を含んでい ます。 > Type 3 の場合、エン コ ーデ ィ ン グはフ ォ ン ト の先頭 255 グ リ フ に よ っ て定義 さ れます。 フ ォ ン ト が ビル ト イ ンエン コ ーデ ィ ン グ を何 ら 含んでいない と き は、フ ォ ン ト 読み込みは 失敗 し ます (OpenType 日中韓フ ォ ン ト 等)。 PDF_info_font( ) で symbolfont キーを用い る こ と も で き ます。 こ れが false を返 し たな ら 、 その フ ォ ン ト はテ キ ス ト フ ォ ン ト であ り 、 広 く 利用 さ れてい る シ ン グルバ イ ト エ ン コ ーデ ィ ン グのいずれかで読み込む こ と も で き ます。 symbolfont キーが true を返 し た な ら それはで き ません。 その よ う な記号フ ォ ン ト 内のグ リ フは、各グ リ フ に照応す る コ ー ド がわか っ てい る場合にのみ利用す る こ と が可能 です (127 ページ 「5.4.2 記号フ ォ ン ト に対する エン コ ーデ ィ ン グ を選ぶ」 参照)。 126 第 5 章 : フ ォ ン ト 処理 非 Unicode 対応の言語バ イ ンデ ィ ン グでは、 PDFlib はデフ ォ ル ト ではテ キ ス ト がシ ン グルバ イ ト 形式であ る と 見な し ます。 こ れは、 い く つかの記号フ ォ ン ト での指定に伝統的 に使われてい る シ ン グルバ イ ト 値を使え る と い う 利点が あ り ま す。 こ れは他のエ ン コ ー デ ィ ン グでは不可能です。 し か し 、 textformat=utf16 等を指定すればテ キ ス ト を Unicode 形式で与え る こ と がで き ます。 encoding=builtin の難点は、 シ ン グルバ イ ト エン コー ド さ れたテ キ ス ト 内では文字参照 が使え ない こ と です。 マルチバ イ ト エ ン コ ーデ ィ ン グ こ の種類のエ ン コ ーデ ィ ン グは日中韓フ ォ ン ト に、 す なわち日本語 ・ 中国語 ・ 韓国語のキ ャ ラ ク タ 群を持つ TrueType ・ OpenType CID フ ォ ン ト に対 し て使え ます。 こ れ ら の用字系で使 う ために さ ま ざ ま なエン コーデ ィ ン グ方式が開発 さ れて き ま し た。 日本語では Shift-JIS ・ EUC、 中国語では GB ・ Big5、 韓国語では KSC 等 です。マルチバ イ ト エン コ ーデ ィ ン グは Adobe CMap か Windows コー ド ページで定義 さ れ てい ます (106 ページ 「4.5 日本語 ・ 中国語 ・ 韓国語エン コ ーデ ィ ン グ」 参照)。 こ れ ら の伝統的エン コ ーデ ィ ン グは、 Unicode CMap を除 き 、 非 Unicode 対応言語バ イ ンデ ィ ン グでのみ使 う こ と がで き ます。 Unicode CMap は encoding=unicode と 等価です。 非 Unicode 対応の言語バ イ ンデ ィ ン グでは、 PDFlib はデフ ォ ル ト (textformat=bytes) ではテ キ ス ト がマルチバ イ ト バ イ ト エン コ ー ド さ れてい る と 見な し ます。 マルチバ イ ト エン コ ーデ ィ ン グでは、 keepnative オプシ ョ ン true がな ら ば、 テ キ ス ト はユーザーか ら 与え ら れた も のがその ま ま PDF 出力へ書き 込まれます。 マルチバ イ ト エン コ ーデ ィ ン グの難点は、 PDFlib は入力テ キ ス ト について文法的有効 性のみをチ ェ ッ ク し 、与え ら れたテ キ ス ト に対す る グ リ フ が フ ォ ン ト 内で得 ら れ る か ど う かはチ ェ ッ ク し ない点です。 ま た、 Unicode テ キ ス ト を与え る こ と も で き ません。 なぜな ら PDFlib は Unicode 値を それに照応す る マルチバ イ ト 列へ変換す る こ と がで き ないか ら です。 かつ、 文字参照、 OpenType レ イ ア ウ ト 機能、 複雑用字系のシ ェーピ ン グ も 利用で き ません。 グ リ フ ID エ ン コ ーデ ィ ン グ PDFlib では encoding=glyphid をすべての フ ォ ン ト 形式に対 し て使え ます。 こ のエン コ ーデ ィ ン グでは、 118 ページ 「5.2.1 グ リ フ ID」 で解説す る 付 番方式を用いて、 フ ォ ン ト 内のすべてのグ リ フ が指定で き ます。 数値グ リ フ ID は 0 か ら 始ま り 、 理論上の最大値は 65,565 です (その よ う な大量のグ リ フ を持つフ ォ ン ト はあ り ませんが)。最大グ リ フ ID 値は PDF_info_font( ) で maxcode キーを用いて ク エ リ で き ます。 非 Unicode 対応の言語バ イ ンデ ィ ン グでは、 PDFlib はデフ ォ ル ト (textformat=utf16) ではテ キ ス ト がダブルバ イ ト バ イ ト エン コ ー ド さ れてい る と 見な し ます。 PDFlib は、 与え ら れた グ リ フ ID が フ ォ ン ト 内で有効であ る か ど う か をチ ェ ッ ク し ま す。 複雑用字系のシ ェーピ ン グ と OpenType レ イ ア ウ ト 機能が使え ます。 グ リ フ ID は特定の フ ォ ン ト に固有の も のであ り 、 場合に よ っ ては PDFlib に よ っ て作 成 さ れ る こ と も あ る ので、encoding=glyphidは一般に通常のテ キ ス ト 出力には適 し ません。 こ のエン コ ーデ ィ ン グの主な用途は、 フ ォ ン ト の全グ リ フ一覧を印刷す る こ と です。 5.4.2 記号 フ ォ ン ト に対す る エ ン コ ーデ ィ ン グ を選ぶ 記号フ ォ ン ト は、 記号 ・ ロ ゴ ・ ピ ク ト グ ラ ム な ど の非テ キ ス ト グ リ フ群を内容 と し て持つ フ ォ ン ト です。 こ れは、 テ キ ス ト フ ォ ン ト にはないい く つかの問題を提起 し ます。 背景に あ る 問題は、Unicode 規格は一般にあ えて記号グ リ フ をエン コ ー ド し ていない こ と です(広 く 利用 さ れてい る ZapfDingbats フ ォ ン ト 内のグ リ フ等、 こ の規則には例外 も あ り ますが)。 記号フ ォ ン ト を Unicode ワー ク フ ロ ーに適合 し て利用で き る よ う にする ため、 TrueType ・ OpenType フ ォ ン ト はたいていそのグ リ フ に私用領域 (PUA) 内の Unicode 値を割 り 当て 5.4 フ ォ ン ト を読み込む 127 てい ます。 Unicode マ ッ ピ ン グ テーブルがない こ と か ら 、 PostScript Type 1 フ ォ ン ト は こ れを行えず、 一般にそのグ リ フ を選ぶのに欧文キ ャ ラ ク タ の コー ド を用いてい ます。 すべ ての フ ォ ン ト 形式において、 記号グ リ フはたいていカ ス タ ムのグ リ フ名を持っ てい ます。 こ う し た状況か ら 、 記号フ ォ ン ト 内のグ リ フ の選択に関 し て以下の よ う な結果が生 じ ます : > 記号 TrueType・OpenType フ ォ ン ト は encoding=unicode で最 も 良 く 読み込め ます。グ リ フ に割 り 当て ら れてい る PUA 値がわかっ てい る 場合には、 記号グ リ フ を選ぶためにテ キ ス ト 内で こ の値を与え る こ と がで き ます。 そのためにはその フ ォ ン ト 内の PUA 割 り 当てがあ ら か じ めわか っ てい る 必要があ り ます。 > PDFlib は記号 PostScript Type 1 フ ォ ン ト に対 し て PUA 値を内部的に割 り 振 り ますので、 こ の PUA 値は事前にはわか り ません。 > 記号フ ォ ン ト 内のグ リ フ を 8 ビ ッ ト コ ー ド を使っ て指定 し たい場合には、 フ ォ ン ト を encoding=builtin で読み込んで、テ キ ス ト 内で 8 ビ ッ ト コー ド を与え る こ と がで き ます。 た と えば、 数字 4 ( コー ド 0x34) は ZapfDingbats フ ォ ン ト 内でチ ェ ッ ク マー ク 記号を 選びます。 記号フ ォ ン ト を encoding=unicode で使 う ためには、適切な Unicode 値を テ キ ス ト で用い る 必要があ り ます : > Symbol フ ォ ン ト 内のキ ャ ラ ク タ はすべて正 し い Unicode 値を持っ てい ます。 > ZapfDingbats フ ォ ン ト 内のキ ャ ラ ク タ は範囲U+2007~U+27BF の Unicode値を持っ てい ます。 > Wingdings ・ Webdings 等の Microsoft の記号フ ォ ン ト は、範囲 U+F020 ~ U+F0FF の PUA Unicode 値を用いてい ます (charmap アプ リ ケーシ ョ ンは こ れを シ ン グルバ イ ト コ ー ド で表 し ますが)。 > それ以外の フ ォ ン ト については、フ ォ ン ト 内の個々のグ リ フ に対す る Unicode 値を あ ら か じ め知っ てお く か、 ま たは実行時に PDF_info_font( ) で (例 : PostScript Type 1 フ ォ ン ト の場合はグ リ フ名を与え て) 決定す る必要があ り ます。 制御キ ャ ラ ク タ 表 8.1 に挙げ る 範囲 U+0001 ~ U+001F の Unicode 制御キ ャ ラ ク タ は、 encoding=builtin で も テ キ ス ト フ ロ ー内で使え ます。 0x20 未満の コ ー ド は、 記号フ ォ ン ト がその コ ー ド に対す る グ リ フ を持たないな ら ば、 制御キ ャ ラ ク タ と し て解釈 さ れます。 こ れは大多数の記号フ ォ ン ト にあ ては ま り ます。 ラ イ ン フ ィ ー ド キ ャ ラ ク タ に対す る コ ー ド は ASCII と EBCDIC と で異な っ てい ますの で、 EBCDIC シ ス テ ム上で リ テ ラ ルな キ ャ ラ ク タ 0x0A を使 う こ と は避け、 オプシ ョ ン escapesequence=true を用いて PDFlib のエ ス ケープシーケ ン ス \n を使 う こ と を推奨 し ま す。 こ の \n は PDFlib API ま で届 く 必要があ る こ と に留意 し て く だ さ い。 た と えば C では \\n と 書 く 必要があ り ます。 文字参照 文字参照は記号フ ォ ン ト に対 し て使 う こ と がで き ます。し か し 記号フ ォ ン ト は 一般に、 文字参照を開始す る ア ンパサン ド キ ャ ラ ク タ U+0026 「&」 に対す る グ リ フ を含ん でい ません。 コ ー ド 0x26 も 、 フ ォ ン ト 内の既存のグ リ フへマ ッ プで き ないので使え ませ ん。 ですので記号フ ォ ン ト は、 文字参照を使 う 必要があ る と き は、 encoding=unicode で読 み込む必要があ り ます。 文字参照は encoding=builtin では動作 し ません。 5.4.3 例 : Wingdings 記号 フ ォ ン ト 内のグ リ フ を選択 記号フ ォ ン ト 内のキ ャ ラ ク タ を選択す る には さ ま ざ ま な方法があ り 、なかには望みの出力 が得 ら れない も の も あ り ますので、 例を見てみま し ょ う 。 128 第 5 章 : フ ォ ン ト 処理 フ ォ ン ト 内のキ ャ ラ ク タ を理解 ま ず、 フ ォ ン ト 内の、 タ ーゲ ッ ト と す る キ ャ ラ ク タ に ついてい く つかの情報を収集 し ま し ょ う 。 こ れには Windows の 「文字 コ ー ド 表」 アプ リ ケーシ ョ ン を利用 し ます (図 5.1 参照) : > 「文字 コ ー ド 表」 は、 Wingdings フ ォ ン ト 内のグ リ フ群を表示 し ますが、 それは 「詳細表 示」 内で Unicode へのア ク セ ス を一切与え ません。 こ れは、 こ の フ ォ ン ト が内容 と し て持っ てい る 記号グ リ フ群に対 し て、 標準化 さ れた Unicode 値が一切登録 さ れていな い と い う 事実に よ る 結果です。 そのかわ り に、 こ の フ ォ ン ト 内のグ リ フ群は私用領域 (PUA) 内のダ ミ ー Unicode 値を使用 し てい ますが、 「文字 コ ー ド 表」 アプ リ ケーシ ョ ンは こ れ ら の値を明 ら かに し ません。 > 「文字 コ ー ド 表」 ウ ィ ン ド ウ の左下隅を見 る と 、あ る いはマ ウ ス を smileface キ ャ ラ ク タ の上に乗せ る と 、 「文字 コ ー ド : 0x4A」 と 表示 さ れ ま す。 こ れは こ の グ リ フ のバ イ ト コ ー ド です。 こ の コ ー ド は、Winansi エン コーデ ィ ン グ内の大文字の J キ ャ ラ ク タ に照応 し てい ます。 た と えば、 こ のキ ャ ラ ク タ を ク リ ッ プボー ド へ コ ピー し て、 その ク リ ッ プボー ド 内容 を、 テ キ ス ト のみの ア プ リ ケ ーシ ョ ン へ貼 り 付け る と 、 そ の結果は、 そ の照応す る Unicode 値 U+004A すなわち キ ャ ラ ク タ J と な り ます。 に も かかわ ら ず、 こ れは こ の キ ャ ラ ク タ の Unicode 値ではあ り ませんので、 Unicode ワ ー ク フ ロ ー内で U+004A ま た は J を用いて こ れを選択す る こ と はで き ません。 > こ の フ ォ ン ト 内で内部的に使用 さ れてい る Unicode キ ャ ラ ク タ は 「文字コ ー ド 表」 には 表示 さ れません。 し か し 、 Microsoft が提供 し てい る 記号フ ォ ン ト は、 以下の単純な規 則を用いてい ます : Unicode値 = U+F000 + (「文字コード表」に表示される文字コード) こ の こ と か ら 、smileface グ リ フ に対 し ては Unicode 値 U+F04A と の結果が得 ら れます。 > その照応す る グ リ フ名は、 フ ォ ン ト エデ ィ タ や同様の ツールで取得で き ます。 こ の例 ではそれは smileface です。 PDF_info_font( ) を使っ て、 Unicode 値 ・ グ リ フ名 ・ コー ド のいずれか を ク エ リ す る こ と も で き ます。 147 ページ 「5.6.2 フ ォ ン ト 依存のエン コ ーデ ィ ン グ ・ Unicode ・ グ リ フ名 ク エ リ 」 を参照 し て く だ さ い。 記号キ ャ ラ ク タ を PDFlib で指定 タ ーゲ ッ ト と す る キ ャ ラ ク タ に関 し て得 ら れ る 情報に 応 じ て、 Windings の smileface グ リ フ を選択す る 方法はい く つかあ り ます : > その フ ォ ン ト 内のそのキ ャ ラ ク タ に割 り 当て ら れてい る PUA Unicode 値がわか っ てい る な ら 、 数値文字参照を使え ます (110 ページ 「数値文字参照」 参照) :  textformat=utf8 で作業 し てい る 場合には、その照応する 3 バ イ ト UTF-8 列を使え ます: \xEF\x81\x8A Unicode 値は、 encoding=builtin と textformat=bytes の組み合わせでは使え ません。 > 文字 コ ー ド がわか っ てい る な ら 、バ イ ト 値参照を使え ます (111 ページ 「バ イ ト 値参照」 参照) : &.#x4A; 5.4 フ ォ ン ト を読み込む 129 図 5.1 Windows の文字 コ ー ド 表 で Wingdings フ ォ ン ト 非 Unicode 対応言語バ イ ンデ ィ ン グでは、 encoding=builtin かつ textformat=bytes な ら ば、 文字 コ ー ド を直接指定で き ます : J \x4A > グ リ フ名がわか っ てい る な ら 、 グ リ フ名参照を使え ます (111 ページ 「グ リ フ名参照」 参照) : &.smileface; グ リ フ名は、 encoding=builtin と textformat=bytes の組み合わせでは使え ません。 表 5.1 に、 Java ・ .NET な ど Unicode 対応言語バ イ ンデ ィ ン グの場合の方法を挙げます。 表 5.1 Unicode 対応言語バイ ンデ ィ ング (Java 等) で Wingdings フ ォ ン ト 内の smileface グ リ フ を指定 エン コー デ ィ ング 追加オプ シ ョ ン 入力文字列 \uF04A unicode 1 ページ上の印字結果 ☺ charref  ☺ charref &.#x4A; ☺ charref &.smileface; ☺ 2 (な し ) \x4A (な し ) J escapesequence builtin (encoding=unicode で上記 と 同 じ ) 1. U+F04A に対する、 Java な ど多 く の Unicode 対応言語での文字列文法 2. バイ ト コ ー ド \x4A に対する Winansi キ ャ ラ ク タ 130 第 5 章 : フ ォ ン ト 処理 表 5.2 に、 C な ど非 Unicode 対応言語バ イ ンデ ィ ン グの場合の方法を挙げます。 表 5.2 非 Unicode 対応言語バイ ンデ ィ ング (C 等) で Wingdings フ ォ ン ト 内の smileface グ リ フ を指定 エン コー デ ィ ング textformat 追加オプ シ ョ ン utf16 入力文字列 \xF0\x4A 1  ☺ charref &.#x4A; ☺ charref &.smileface; ☺ ï•ã 2 ☺ \xEF\x81\x8A 4 ☺ escapesequence3 unicode 5 (な し ) escapesequence \x4A (な し ) charref  ☺ bytes &.#x4A; ☺ charref &.smileface; ☺ J (な し ) \x4A (な し ) J escapesequence utf16, utf8 builtin bytes ☺ charref utf8 bytes ページ上の印字結果 (encoding=unicode で上記 と 同 じ ) charref  charref &.#x4A; charref &.smileface; escapesequence ⌧ ⌧ J ☺ \x4A ☺ 1. バイ ト 順序に応 じ て、\xF0\x4A か \x4A\xF0 のいずれかで表す必要があ り ます。なお、\x は C のエ スケープ文法を示 し ています 2. 3 バイ ト 列 \xEF \x81 \x8A に対する Winansi キ ャ ラ ク タ 群 3. escapesequence オ プ シ ョ ンは、 プ ロ グ ラ ミ ン グ言語が直接のバイ ト 値のための文法を全 く 提供 し ていない場合にのみ必要 です。 4. U+F04A に対する 3 バイ ト UTF-8 列 5. バイ ト コ ー ド \x4A に対する Winansi キ ャ ラ ク タ 5.4.4 フ ォ ン ト を検索 フ ォ ン ト デー タ の ソ ース 先述の よ う に、 フ ォ ン ト は明示的に PDF_load_font( ) 関数で読 み込む こ と も で き ます し 、 あ る いは暗黙的に、 さ ま ざ ま なテ キ ス ト 出力関数に fontname ・ encoding オプシ ョ ン を与え て読み込む こ と も で き ます。フ ォ ン ト のネ イ テ ィ ブな名前を使 う こ と も で き ます し 、 フ ォ ン ト デー タ の場所を決定す る ために用い ら れ る任意のカ ス タ ム 名 を 扱 う こ と も で き ま す。 カ ス タ ム フ ォ ン ト 名は文書内で一意で あ る 必要が あ り ま す。 PDF_info_font( ) で、 こ の フ ォ ン ト 名は apiname キーで ク エ リ す る こ と がで き ます。 5.4 フ ォ ン ト を読み込む 131 同 じ フ ォ ン ト 名で PDF_load_font( ) を続けて呼び出す と 、すべてのオプシ ョ ンが こ の関 数を最初に呼び出 し た際に与え た も の と 等 し ければ、同 じ フ ォ ン ト ハン ド ルが返 さ れます (扱いが異な る オプシ ョ ンが若干あ り ますので、詳 し く は PDFlib リ フ ァ レ ン ス を参照)。そ う でなければ、 同 じ フ ォ ン ト 名に対 し て新規の フ ォ ン ト ハン ド ルが作成 さ れます。 PDFlib ではフ ォ ン ト デー タ の ソ ース と し て以下に対応 し てい ます : > デ ィ ス ク ベース ま たは仮想の フ ォ ン ト フ ァ イ ル > Windows か OS X オペレーテ ィ ン グ シ ス テ ムか ら 持っ て来た フ ォ ン ト (ホ ス ト フ ォ ン ト ) > PDF 標準フ ォ ン ト : こ れ ら は、 よ く 知 ら れた名前の少数の欧文 ・ 日中韓フ ォ ン ト です > PDF_begin_font( ) お よ び関連関数群で定義 さ れた Type 3 フ ォ ン ト ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の fonts/font_resources ト ピ ッ ク にあ り ます。 enumeratefonts オプシ ョ ン を用い る と 、検索パ ス上で得 ら れ るすべての フ ォ ン ト を収集す る よ う PDFlib に命令す る こ と がで き ます (66 ページ 「フ ァ イ ル検索 と SearchPath リ ソ ー ス カ テ ゴ リ 」 参照)。 saveresources オプシ ョ ン を用い る と 、 PDFlib リ ソ ース のカ レ ン ト リ ス ト をデ ィ ス ク フ ァ イ ルへ書 き 出す こ と がで き ます : /* フォントを検索パスに直接追加 */ p.set_option("searchpath={{C:/fonts}}"); /* 検索パス上のすべてのフォントをなめてUPRファイルを作成 */ p.set_option("enumeratefonts saveresources={filename=C:/fonts/pdflib.upr}"); フ ォ ン ト 名エ イ リ ア ス設定 フ ォ ン ト はそれぞれ、 任意の数のエ イ リ ア ス 名を持つ こ と がで き ま す。 こ れは、 物理フ ォ ン ト へマ ッ プす る 必要が あ る 擬似 ま たは仮想名を通 じ て フ ォ ン ト を要求す る 場面で有用で し ょ う 。 フ ォ ン ト 名エ イ リ ア ス は、 以下の例の よ う に、 FontnameAlias リ ソ ース カ テ ゴ リ (65 ページの表 3.1 参照) で作成で き ます : p.set_option("FontnameAlias={sans Helvetica}"); 左のエ イ リ ア ス名は、 任意に選ぶ こ と がで き 、 そ し て こ れを用いて、 その フ ォ ン ト を その 新 し いエ イ リ ア ス 名の も と に読み込む こ と がで き ま す。 右の名前は、 フ ォ ン ト の有効な API 名、 た と えばホ ス ト フ ォ ン ト や、 フ ォ ン ト リ ソ ース カ テ ゴ リ FontOutline 等の う ちの 一つで フ ォ ン ト リ ソ ースへ紐付け ら れてい る フ ォ ン ト の名前であ る 必要があ り ます。 フ ォ ン ト に対す る検索順序 PDFlib に与え ら れ る フ ォ ン ト 名は名前文字列です。 指定 さ れた名前が フ ォ ン ト 名エ イ リ ア ス であ る 場合には、それはその照応す る API フ ォ ン ト 名へ 置 き 換え ら れます。 PDFlib は API フ ォ ン ト 名を使っ て、 さ ま ざ ま な種類の フ ォ ン ト を後述 の順序で探 し ます。 こ の検索処理は、 使え る フ ォ ン ト が ス テ ッ プの 1 つで見つか る と と も に終わ り ます : > フ ォ ン ト 名が標準日中韓フ ォ ン ト の名前 と 一致 し 、 指定 さ れたエ ン コ ーデ ィ ン グが定 義済み CMap の名前であ る (178 ページ 「6.5.5 標準日中韓フ ォ ン ト 」 参照)。 > フ ォ ン ト 名が、こ れ以前に同一文書内で PDF_begin_font( ) で作成 さ れた Type 3 フ ォ ン ト の名前 と 一致す る (116 ページ 「5.1.8 Type 3 フ ォ ン ト 」 参照)。 > フ ォ ン ト 名が、フ ォ ン ト 名を TrueType ま たは OpenType フ ォ ン ト フ ァ イ ルの名前 と 紐づ け る FontOutline リ ソ ース内の名前 と 一致す る。 > フ ォ ン ト 名が、フ ォ ン ト 名を PostScript Type 1 フ ォ ン ト の メ ト リ ッ ク フ ァ イ ルの名前 と 紐づけ る FontAFM ま たは FontPFM リ ソ ース内の名前 と 一致す る。 > フ ォ ン ト 名が、 フ ォ ン ト 名を SVG フ ォ ン ト フ ァ イ ルの名前 と 紐づけ る FontOutline リ ソ ース内の名前 と 一致 し 、 かつ、 HostFont リ ソ ース内の名前 と 一致 し ない。 132 第 5 章 : フ ォ ン ト 処理 > フ ォ ン ト 名が、 フ ォ ン ト 名を シ ス テ ム に イ ン ス ト ール さ れてい る フ ォ ン ト の名前 と 紐 づけ る HostFont リ ソ ース内の名前 と 一致す る 。 > フ ォ ン ト 名が欧文 コ ア フ ォ ン ト の名前 と 一致す る (134 ページ 「欧文 コ ア フ ォ ン ト 」 参 照)。 > フ ォ ン ト 名が、 シ ス テ ム に イ ン ス ト ール さ れてい る ホ ス ト フ ォ ン ト の名前 と 一致す る (136 ページ 「5.4.5 Windows ・ OS X 上のホ ス ト フ ォ ン ト 」 参照)。 > フ ォ ン ト 名が フ ォ ン ト フ ァ イ ルのベース名 (すなわち フ ァ イ ル名接尾辞を除いた名前) と 一致す る 。 フ ォ ン ト が見つか ら なか っ た と き は、 フ ォ ン ト 読み込みは以下のエ ラ ー メ ッ セージ を出 し て止ま り ます : Font file (AFM, PFM, TTF, OTF etc.) or host font not found さ ま ざ ま な リ ソ ース カ テ ゴ リ について詳 し く は 64 ページ 「3.1.3 リ ソ ース構成 と フ ァ イ ル 検索」 を参照 し て く だ さ い。 以下の各項では、 さ ま ざ ま な分類の フ ォ ン ト に対す る フ ォ ン ト 読み込みについて さ ら に詳 し く 解説 し てい き ます。 TrueType ・ OpenType ・ WOFF フ ォ ン ト フ ォ ン ト 名は、 使 い た い フ ォ ン ト フ ァ イ ルの名前に対 し て、 FontOutline リ ソ ース を通 じ て紐 づけ る 必要があ り ます : p.set_option("FontOutline={Arial=/usr/fonts/Arial.ttf}"); font = p.load_font("Arial", "unicode", "embedding"); 等号の左側の フ ォ ン ト 名 (フ ォ ン ト の API 名 と いい ます) は任意に 選べます : p.set_option("FontOutline={f1=/usr/fonts/Arial.ttf}"); font = p.load_font("f1", "unicode", "embedding"); 実行時に PDF_set_option( ) で構成す る のでな く 、 UPR フ ァ イ ル内で FontOutline リ ソ ース を構成す る こ と も で き ます (64 ページ 「3.1.3 リ ソ ース構成 と フ ァ イ ル検索」 参照)。 絶対 フ ァ イ ル名を避け る ため、 SearchPath リ ソ ース カ テ ゴ リ を用い る こ と も で き ます ( こ の場 合 も 、 SearchPath リ ソ ース カ テ ゴ リ を UPR フ ァ イ ル内で構成す る こ と も 可能です)。 例 : p.set_option("SearchPath={{/usr/fonts}}"); p.set_option("FontOutline={f1=Arial.ttf}"); font = p.load_font("f1", "unicode", ""); TrueType コ レ ク シ ョ ン TrueType コ レ ク シ ョ ン (TTC、 173 ペ ー ジ 「6.5.1 TrueType ・ OpenType 日中韓フ ォ ン ト を用い る 」 参照) フ ァ イ ル内に含まれてい る フ ォ ン ト を選ぶには、 その フ ォ ン ト の名前を直接指定 し ます : p.set_option("FontOutline={MS-Gothic=msgothic.ttc}"); font = p.load_font("MS-Gothic", "unicode", "embedding"); フ ォ ン ト 名は、 TTC フ ァ イ ル内のすべての フ ォ ン ト の名前 と 照合 さ れ ま す。 あ る いは、 TTC フ ァ イ ル内の n 番目の フ ォ ン ト を選ぶには、フ ォ ン ト 名の後に コ ロ ン をつけて番号 n を指定す る こ と がで き ます。こ の場合は、等号の左側の API フ ォ ン ト 名は任意に選べます: p.set_option("FontOutline={f1=msgothic.ttc}"); font = p.load_font("f1:0", "unicode", ""); 5.4 フ ォ ン ト を読み込む 133 PostScript Type 1 フ ォ ン ト フ ォ ン ト 名は、 使い た い フ ォ ン ト の メ ト リ ッ ク フ ァ イ ルの名前に対 し て、 その メ ト リ ッ ク フ ァ イ ルの種類に応 じ て、 FontAFM ・ FontPFM リ ソ ース カ テ ゴ リ のいずれか を通 じ て紐づけ る 必要があ り ます : p.set_option("FontPFM={lucidux=LuciduxSans.pfm}"); font = p.load_font("lucidux", "unicode", ""); PostScript フ ォ ン ト に対 し て embedding が必要な場合には、 その名前を、 さ ら にその照応 す る フ ォ ン ト ア ウ ト ラ イ ン フ ァ イ ル (PFA ま たは PFB) に対 し て も 、 FontOutline リ ソ ー ス カ テ ゴ リ を通 じ て紐づけ る 必要があ り ます : p.set_option("FontPFM={lucidux=LuciduxSans.pfm}"); p.set_option("FontOutline={lucidux=LuciduxSans.pfa}"); font = p.load_font("lucidux", "unicode", "embedding"); PostScript Type 1 フ ォ ン ト に対 し ては、FontOutline リ ソ ース だけでは充分でない こ と に留 意 し て く だ さ い。 必ず メ ト リ ッ ク フ ァ イ ルが必要ですので、 フ ォ ン ト を読み込むためには AFM ま たは PFM フ ァ イ ルが得 ら れ る 必要があ り ます。 フ ォ ン ト メ ト リ ッ ク ・ ア ウ ト ラ イ ン フ ァ イ ルが検索 さ れ る デ ィ レ ク ト リ は、 SearchPath リ ソ ース カ テ ゴ リ を通 じ て指定す る こ と がで き ます。 欧文 コ ア フ ォ ン ト PDF ビ ューアは、 つねに利用可能 と 見な さ れ る フ ォ ン ト 14 種の コ ア セ ッ ト に対応 し てい ます。 コ ア フ ォ ン ト の完全な メ ト リ ッ ク 情報はすでに PDFlib に内蔵 さ れてい ますので、 追加デー タ は必要あ り ません (フ ォ ン ト を埋め込みたい場合を除 き)。 コ ア フ ォ ン ト は以下の名前を持ち ます : Courier ・ Courier-Bold ・ Courier-Oblique ・ Courier-BoldOblique ・ Helvetica ・ Helvetica-Bold ・ Helvetica-Oblique ・ Helvetica-BoldOblique ・ Times-Roman ・ Times-Bold ・ Times-Italic ・ Times-BoldItalic ・ Symbol ・ ZapfDingbats フ ォ ン ト 名が リ ソ ー ス を 通 じ て い か な る フ ァ イ ル名へ も 紐づ け ら れ て い な い と き は、 PDFlib は そ の フ ォ ン ト を 欧文 コ ア フ ォ ン ト の リ ス ト 内で探 し ま す。 こ の ス テ ッ プ は、 embedding オプシ ョ ンが指定 さ れてい る 場合、ま たはその フ ォ ン ト 名に対 し て FontOutline リ ソ ース が得 ら れ る 場合には ス キ ッ プ さ れます。 以下の コ ー ド 断片は、 コ ア フ ォ ン ト の 1 つを構成な し に要求 し ます : font = p.load_font("Times-Roman", "unicode", ""); 内部 リ ス ト で見つかっ た コ ア フ ォ ン ト は決 し て埋め込まれません。 こ れ ら の フ ォ ン ト のい ずれかを埋め込むためには、 フ ォ ン ト ア ウ ト ラ イ ン フ ァ イ ルを構成する 必要があ り ます。 ホ ス ト フ ォ ン ト フ ォ ン ト 名が リ ソ ー ス を通 じ ていかな る フ ァ イ ル名へ も 紐づけ ら れて いない と き は、PDFlib はその フ ォ ン ト を、Windows か OS X に イ ン ス ト ール さ れてい る フ ォ ン ト の リ ス ト 内で探 し ます。シ ス テ ムに イ ン ス ト ール さ れてい る フ ォ ン ト を ホス ト フ ォ ン ト と いい ます。 ホ ス ト フ ォ ン ト の名前は ASCII でエン コ ー ド さ れてい る 必要があ り ます。 Windows では Unicode も 使え ます。 ホ ス ト フ ォ ン ト について詳 し く は 136 ページ 「5.4.5 Windows ・ OS X 上のホ ス ト フ ォ ン ト 」 を参照 し て く だ さ い。 例 : font = p.load_font("Verdana", "unicode", ""); 134 第 5 章 : フ ォ ン ト 処理 Windows では、 フ ォ ン ト 名の後にカ ン マ をつけて フ ォ ン ト ス タ イ ルを追加す る こ と も で き ます ( こ の文法は Latin コ ア フ ォ ン ト で も 使え ます) : font = p.load_font("Verdana,Bold", "unicode", ""); コ ア フ ォ ン ト のいずれかの名前で ホ ス ト フ ォ ン ト を読み込むためには、 その フ ォ ン ト 名 を、 ほ し いホ ス ト フ ォ ン ト の名前に対 し て、 HostFont リ ソ ース カ テ ゴ リ を通 じ て紐づけ る 必要があ り ます。 以下の コ ー ド 断片は、 内蔵 コ ア フ ォ ン ト デー タ を使 う のでな く 、 Symbol フ ォ ン ト の メ ト リ ッ ク ・ ア ウ ト ラ イ ンデー タ がホ ス ト シ ス テ ムか ら 持っ て来 ら れ る よ う に し ます : p.set_option("HostFont={Symbol=Symbol}"); font = p.load_font("Symbol", "unicode", "embedding"); 等号の左側の API フ ォ ン ト 名は任意に選べます。 通常は、 ホ ス ト フ ォ ン ト の名前が等号の 両側で用い ら れます。 フ ォ ン ト フ ァ イ ルを拡張子に基づい て検索 Type 3 以外のすべて の種類の フ ォ ン ト は、 指定 さ れた フ ォ ン ト 名を フ ォ ン ト メ ト リ ッ ク ・ ア ウ ト ラ イ ン フ ァ イ ルのベース名 (フ ァ イ ル接尾辞の一切ない名前) と し て用いて検索す る こ と がで き ます。 PDFlib は、 指定 さ れた 名前の フ ォ ン ト が見つか ら なか っ た と き は、SearchPath リ ソ ース カ テ ゴ リ 内のすべてのエ ン ト リ を なめなが ら 、 与え ら れた フ ァ イ ル名に対 し て、 知 ら れてい る すべての フ ァ イ ル名 接尾辞を付加す る こ と に よ っ て、 フ ォ ン ト メ ト リ ッ ク ・ ア ウ ト ラ イ ンデー タ を見つけ よ う と 試みます。 こ の拡張子に基づ く 検索は具体的には以下の よ う な アルゴ リ ズ ムです : > 以下の接尾辞を フ ォ ン ト 名に付加 し 、 で き た フ ァ イ ル名の フ ォ ン ト メ ト リ ッ ク (お よ び TrueType ・ OpenType フ ォ ン ト の場合はア ウ ト ラ イ ン) があ る か ど う か を順番に調 べてみます : .tte .ttf .otf .gai .woff .cef .afm .pfm .ttc .svg .svgz .TTE .TTF .OTF .GAI .WOFF .CEF .AFM .PFM .TTC .SVG .SVGZ > PostScript フ ォ ン ト の埋め込みが要求 さ れてい る 場合は、 以下の接尾辞を フ ォ ン ト 名に 付加 し 、 その名前の フ ォ ン ト ア ウ ト ラ イ ン フ ァ イ ルがあ る か ど う か を順番に調べてみ ます : .pfa .pfb .PFA .PFB フ ォ ン ト フ ァ イ ルが見つか ら なか っ た と き は、 フ ォ ン ト 読み込みは以下のエ ラ ー メ ッ セージ を出 し て止ま り ます : Font cannot be embedded (PFA or PFB font file not found) > 上述の候補フ ァ イ ル名群を 「あ り の ま ま に」 検索 し 、 ついで、 SearchPath リ ソ ース カ テ ゴ リ 内で構成 さ れてい る すべてのデ ィ レ ク ト リ 名を前につけて検索 し ます。 こ れはすなわち、 手作業で一切構成を し な く て も 、 も し も その照応す る フ ォ ン ト フ ァ イ ル 名が、 フ ォ ン ト の種類に従っ た標準的な フ ァ イ ル名接尾辞を フ ォ ン ト 名に付加 し た名前か ら 成っ てお り 、かつ SearchPath デ ィ レ ク ト リ のいずれかの中に置かれてい る な ら ば、PDFlib はその フ ォ ン ト を発見す る と い う こ と を意味 し ます。 以下の ス テー ト メ ン ト 群のグループ群は、 フ ォ ン ト ア ウ ト ラ イ ン フ ァ イ ルを見つけ る う えで同等の効力を持ち ます : 5.4 フ ォ ン ト を読み込む 135 p.set_option("FontOutline={Arial=/usr/fonts/Arial.ttf}"); font = p.load_font("Arial", "unicode", ""); と p.set_option("SearchPath={{/usr/fonts}}"); font = p.load_font("Arial", "unicode", ""); 標準日中韓 フ ォ ン ト Acrobat は、 日中韓テ キ ス ト のための さ ま ざ ま な標準フ ォ ン ト に対 応 し てい ます。 詳細 と フ ォ ン ト 名一覧は 178 ページ 「6.5.5 標準日中韓フ ォ ン ト 」 を参照 し て く だ さ い。 PDFlib は標準日中韓フ ォ ン ト を、 も し も 指定 さ れた フ ォ ン ト 名が標準日中 韓フ ォ ン ト の名前 と 一致 し 、 かつ、 指定 さ れたエン コーデ ィ ン グが、 定義済み CMap のい ずれか 1 つの名前であ り 、 かつ、 embedding オプシ ョ ンが指定 さ れなかっ たな ら ば、 フ ォ ン ト 検索処理のいちばん最初の段階で発見 し ます。内部 リ ス ト 内で見つかっ た標準日中韓 フ ォ ン ト は、 フ ォ ン ト ア ウ ト ラ イ ン フ ァ イ ルが構成 さ れてい る 場合にのみ埋め込 ま れ ま す。 Type 3 フ ォ ン ト Type 3 フ ォ ン ト は、 実行時に、 標準 PDFlib グ ラ フ ィ ッ ク 関数群でグ リ フ を定義す る こ と に よ っ て定義す る 必要があ り ます (116 ページ 「5.1.8 Type 3 フ ォ ン ト 」 参照)。 PDF_begin_font( ) に与え ら れた フ ォ ン ト 名が、 PDF_load_font( ) で要求 さ れた フ ォ ン ト 名 と 一致す る と き は、 その フ ォ ン ト がフ ォ ン ト 検索の最初の段階で選ばれます。 例 : p.begin_font("PDFlibLogoFont", 0.001, 0.0, 0.0, 0.001, 0.0, 0.0, ""); ... p.end_font(); ... font = p.load_font("PDFlibLogoFont", "logoencoding", ""); 5.4.5 Windows ・ OS X 上のホ ス ト フ ォ ン ト OS X ・ Windows シ ス テ ムでは PDFlib は、 オペレーテ ィ ン グ シ ス テ ムに イ ン ス ト ール さ れ てい る TrueType ・ OpenType ・ PostScript フ ォ ン ト を利用す る こ と がで き ます。 こ う し た フ ォ ン ト を ホス ト フ ォ ン ト と いい ます。 手作業で フ ォ ン ト フ ァ イ ルを構成 し な く て も 、 そ の フ ォ ン ト を単純にシ ス テ ムに イ ン ス ト ール (たいていは、 適切なデ ィ レ ク ト リ へそれを ド ロ ッ プす る こ と に よ っ て) すれば、 PDFlib はそれを う ま く 利用 し ます。 ホ ス ト フ ォ ン ト を扱 う 際には、 その正確な (大文字 ・ 小文字を区別 し た) フ ォ ン ト 名 を用い る こ と が重要です。 フ ォ ン ト 名は重要ですので、 フ ォ ン ト 名決定のためのい く つか のプ ラ ッ ト フ ォーム ご と の方式を以下に述べます。フ ォ ン ト 名については さ ら に詳 し い情 報が 115 ページ 「5.1.5 PostScript Type 1 フ ォ ン ト 」 にあ り ます。 ホ ス ト フ ォ ン ト 検索は、 PDF_set_option( ) の usehostfonts オプシ ョ ン で無効にす る こ と も で き ます。 Windows 上のホ ス ト フ ォ ン ト 名を知る イ ン ス ト ール さ れてい る フ ォ ン ト の名前は、 そ の フ ォ ン ト フ ァ イ ル を ダ ブル ク リ ッ ク し て、 現れ る ウ ィ ン ド ウ の ウ ィ ン ド ウ タ イ ト ル (Windows Vista/7/8 の場合) ま たは 1 行目 (Windows XP の場合) に表示 さ れ る 完全フ ォ ン ト 名を見れば知 る こ と がで き ます。 フ ォ ン ト に よ っ ては、 使っ てい る Windows のバー ジ ョ ン に従 っ て その名前の一部が ロ ーカ ラ イ ズ さ れて い る こ と も あ り ま す。 た と えば、 フ ォ ン ト 名の一部 と し て広 く 使われてい る Bold は、 ド イ ツ語シ ス テ ム上では翻訳 さ れた 単語 Fett と し て表示 さ れ る こ と があ り ます。Windows シ ス テ ムか ら ホ ス ト フ ォ ン ト デー タ を取得す る には、 変換 さ れた形の フ ォ ン ト 名 (Arial Fett 等) を PDFlib で用い る か、 あ る いは フ ォ ン ト ス タ イ ル名 (後述) を用い る 必要が あ り ま す。 し か し 、 フ ォ ン ト デー タ を 136 第 5 章 : フ ォ ン ト 処理 フ ァ イ ルか ら 直接取得す る には、 正規の ( ロ ーカ ラ イ ズ さ れていない) 形の フ ォ ン ト 名 (Arial Bold 等) を用い る 必要があ り ます。 注 こ の国際化の問題は、 ロー カ ラ イ ズ さ れた形のフ ォ ン ト 名を用いるのでな く 、 フ ォ ン ト ス タ イル名 (「,Bold」 等、 後述) を付加する こ と によ っ て回避する こ と がで き ます。 TrueType フ ォ ン ト を も っ と 詳 し く 調べたい と き は、 Microsoft の無償の 「Font properties extension」1 を見てみま し ょ う 。 その フ ォ ン ト の TrueType テーブルの さ ま ざ ま なエン ト リ が、 人が読め る 形で表示 さ れます。 Windows の フ ォ ン ト ス タ イ ル名 Windows オペレーテ ィ ン グ シ ス テ ムか ら ホ ス ト フ ォ ン ト を読み込む際には、 PDFlib ユーザーは、 Windows の フ ォ ン ト 選択機構が提供す る 機能を 利用す る こ と がで き ます : 太 さ と 斜体について ス タ イ ル名を与え る こ と がで き ます。 例 : font = p.load_font("Verdana,Bold", "unicode", ""); こ れは Windows に対 し て、 ベース フ ォ ン ト のボール ド ・ イ タ リ ッ ク 等あ る 特定のバ リ エー シ ョ ン を探す よ う 命令 し ます。 得 ら れ る フ ォ ン ト に よ っ て、 Windows は、 求め ら れた フ ォ ン ト に最 も 似通っ てい る フ ォ ン ト を選びます ( こ れは新た な フ ォ ン ト バ リ エーシ ョ ン を作 り 出 し ません)。 Windows が見つけた フ ォ ン ト は、 求めた フ ォ ン ト と は異な る可能性があ り 、 生成 さ れ る PDF 内の フ ォ ン ト 名は、 求めた名前 と は異な る可能性があ り ます。 PDFlib は、 Windows の フ ォ ン ト 選択に対 し ていかな る 制御 も で き ません。 フ ォ ン ト ス タ イ ル名は ホ ス ト フ ォ ン ト でのみ働 き 、 フ ォ ン ト フ ァ イ ルを通 じ て構成 さ れた フ ォ ン ト に対 し ては働 き ません。 以下のキー ワ ー ド (フ ォ ン ト 名 と カ ン マで区切っ て) は、 ベー ス フ ォ ン ト 名に付加 し て フ ォ ン ト の太 さ を指定す る こ と がで き ます : none, thin, extralight, ultralight, light, normal, regular, medium, semibold, demibold, bold, extrabold, ultrabold, heavy, black こ の キー ワ ー ド は大文字 ・ 小文字を区別 し ま す。 上記のかわ り に、 あ る いは上記に加え て、 italic キー ワー ド を指定す る こ と も で き ます。 2 つの ス タ イ ル名を用い る と き は、 両者 を カ ン マで区切 る 必要があ り ます。 例 : font = p.load_font("Verdana,Bold,Italic", "unicode", ""); フ ォ ン ト の太 さ の数値 も 、 フ ォ ン ト ス タ イ ル名の等価な代用 と し て用い る こ と がで き ま す: 0 (none), 100 (thin), 200 (extralight), 300 (light), 400 (normal), 500 (medium), 600 (semibold), 700 (bold), 800 (extrabold), 900 (black) 以下の例はフ ォ ン ト の bold バ リ エーシ ョ ン を選びます : font = p.load_font("Verdana,700", "unicode", ""); 注 Windows の フ ォ ン ト に対する ス タ イル名は、 ロー カ ラ イ ズ さ れた フ ォ ン ト 名を扱 う 必要 がある と き には有用で し ょ う 。 なぜな ら こ れは、 フ ォ ン ト バ リ エーシ ョ ンのロー カ ラ イ ズ さ れた名前にかかわ ら ずそれを指定する ための汎用的な方式を提供するから です。 1. www.microsoft.com/typography/TrueTypeProperty21.mspx を参照。 5.4 フ ォ ン ト を読み込む 137 Windows の フ ォ ン ト 代替 Windows は、 特定の レ ジ ス ト リ エン ト リ 群に基づいて、 自動 的に フ ォ ン ト を代替す る こ と があ り ます。 こ の種の フ ォ ン ト 代替は、 PDFlib のホ ス ト フ ォ ン ト 機構に も 影響を与え ますが、 Windows オペレーテ ィ ン グ シ ス テ ムの完全制御下にあ り ます。 以下の レ ジ ス ト リ エン ト リ に よ っ て、 た と えば、 Helvetica フ ォ ン ト が必要な と き に Windows がかわ り に Arial を届け る こ と も あ り え ます : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes Windows の フ ォ ン ト 代替に関する 詳 し い情報については、Microsoft の文書を参照 し て く だ さ い。 OS X 上のホ ス ト フ ォ ン ト 名 OS Xに入っ てい る Font Bookユーテ ィ リ テ ィ を利用すれば、 イ ン ス ト ール さ れてい る ホ ス ト フ ォ ン ト の名前を知る こ と がで き ます。プ ロ グ ラ ム的にホ ス ト フ ォ ン ト の リ ス ト を作成する には、 Apple の Font Tool Suite1 を推奨 し ます。 こ の コ マ ン ド ラ イ ンユーテ ィ リ テ ィ の集合には ftxinstalledfonts と い う プ ロ グ ラ ムが含まれてお り 、 こ れは イ ン ス ト ール さ れて い る すべて の フ ォ ン ト の正確な名前 を 知 る た めに有用です。 PDFlib はホ ス ト フ ォ ン ト の名前 と し てい く つかの種類に対応 し てい ます : > 「一意」 フ ォ ン ト 名 : こ れは、 東ア ジ ア フ ォ ン ト 等に対 し て Unicode でエン コー ド さ れ てい る 場合 も あ る フ ォ ン ト 名です。 一意フ ォ ン ト 名を知 る には、 タ ー ミ ナル ウ ィ ン ド ウ で以下の コ マ ン ド を実行 し ます ( 「:」 を含むエン ト リ 群が出力に含まれ る こ と があ り ますが、 こ れは除去す る 必要があ り ます) : ftxinstalledfonts -u > PostScript フ ォ ン ト 名。PostScript フ ォ ン ト 名を知る には、タ ー ミ ナル ウ ィ ン ド ウ で下記 の コ マ ン ド を実行 し ます : ftxinstalledfonts -p OS X 上で ホ ス ト フ ォ ン ト を用い る際に起 こ り う る問題 私たちのテ ス ト に よ れば、 新規 に イ ン ス ト ール さ れた フ ォ ン ト は、 ユーザーが コ ン ソ ールか ら ロ グ ア ウ ト し て、 再び ロ グ イ ンす る ま で、 PDFlib の よ う な UI な し アプ リ ケーシ ョ ンか ら は利用で き ない こ と があ り ます。 5.4.6 予備 フ ォ ン ト ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の text_output/starter_fallback ト ピ ッ ク にあ り ま す。 予備フ ォ ン ト は、 フ ォ ン ト と エン コ ーデ ィ ン グの不足な点を扱 う 強力な し く みを提供 し ま す。 必要な フ ォ ン ト 変更が PDFlib に よ っ て自動的に行われますので、 こ れは さ ま ざ ま な 場面でテ キ ス ト 出力の実現に活用す る こ と がで き ま す。 こ の し く みは、 所与の フ ォ ン ト (ベース フ ォ ン ト と いい ます) を、 他の 1 つない し 複数の フ ォ ン ト 内のグ リ フ を こ のベー ス フ ォ ン ト に連結す る こ と に よ っ て強化す る も のです。 よ り 正確には : フ ォ ン ト は実際に は変更 さ れないのですが、 PDFlib が PDF ページ記述内の必要な フ ォ ン ト 変更をすべて自 動的に行い ます。 予備フ ォ ン ト は以下の機能を提供 し ます : > ベース フ ォ ン ト 内で得 ら れないグ リ フは自動的に、1 つない し 複数の予備フ ォ ン ト 内で 検索 さ れ ま す。 言い換えれば、 フ ォ ン ト にグ リ フ を追加す る こ と が可能です。 複数の 予備フ ォ ン ト をベース フ ォ ン ト に対 し て紐付け る こ と が可能ですので、 少な く と も 1 1. developer.apple.com/fonts を参照。 138 第 5 章 : フ ォ ン ト 処理 つの フ ォ ン ト が適切な グ リ フ を含んでい る Unicode キ ャ ラ ク タ をすべて有効に使 う こ と がで き ます。 > あ る 特定の予備フ ォ ン ト 内のグ リ フ を用いて、 ベース フ ォ ン ト 内のグ リ フ を オーバ ラ イ ド す る こ と がで き ます。 すなわち、 フ ォ ン ト 内のグ リ フ を置 き 換え る こ と が可能で す。1 つない し 複数の個別のグ リ フ を置 き 換え る こ と も で き ます し 、 あ る いは置 き換え たい Unicode キ ャ ラ ク タ 群の範囲を 1 つない し 複数指定す る こ と も で き ます。 予備 フ ォ ン ト か ら の グ リ フ のサ イ ズ と 縦位置は、 ベー ス フ ォ ン ト に合 う よ う 調整で き ま す。 ち ょ っ と 驚 く こ と には、 ベース フ ォ ン ト それ自身 も 予備フ ォ ン ト と し て使 う こ と が可 能です (同一の、 ま たは異な る エン コ ーデ ィ ン グで) 。 こ れを利用す る と 以下の ト リ ッ ク が実装で き ます : > ベース フ ォ ン ト それ自身を予備フ ォ ン ト と し て使 う こ と に よ っ て、 フ ォ ン ト 内のグ リ フ群の一部ない し 全部のサ イ ズ ま たは位置を調節す る こ と がで き ます。 > ベース フ ォ ン ト の実際のエン コ ーデ ィ ン グ外のキ ャ ラ ク タ を追加で き ます。 予備フ ォ ン ト 機構は、 fallbackfonts フ ォ ン ト 読み込みオプシ ョ ンに よ っ て司 ら れ、 すべて のテ キ ス ト 出力関数に対 し て効力を持ち ます。あ ら ゆ る フ ォ ン ト 読み込みオプシ ョ ン と 同 様に、 fallbackfonts オプシ ョ ンは PDF_load_font( ) への明示的な呼び出 し で与え る こ と も で き ます し 、あ る いは暗黙的フ ォ ン ト 読み込みのためのオプシ ョ ン リ ス ト 内で与え る こ と も で き ます。 1 つのベース フ ォ ン ト に対 し ては複数の予備フ ォ ン ト を指定す る こ と も 可能 な こ と か ら 、 fallbackfonts オプシ ョ ン は値 と し て オプ シ ョ ン リ ス ト の リ ス ト を と り ま す (すなわち、 中括弧がその分必要です)。 PDF_info_font( ) を利用す る と 、 予備フ ォ ン ト 機構の結果を ク エ リ す る こ と がで き ます (148 ページ 「5.6.3 コ ー ド ページ網羅性 と 予備フ ォ ン ト を ク エ リ 」 参照)。 注意 予備フ ォ ン ト を扱 う 際には以下に留意 し て く だ さ い : > フ ォ ン ト の組み合わせは必ず し も 、 タ イ ポ グ ラ フ ィ 的に美 し い結果を生み出すわけで はあ り ません。 ベース フ ォ ン ト のグ リ フデザ イ ン に整合す る グ リ フデザ イ ン を持つ予 備フ ォ ン ト だけ を使 う よ う 注意を払 う 必要があ り ます。 > 予備フ ォ ン ト に対す る フ ォ ン ト 読み込みオプシ ョ ンは、fallbackfonts オプシ ョ ン リ ス ト 内で別途指定す る 必要があ り ます。 た と えば、 ベース フ ォ ン ト に対 し て埋め込みを指 定 し ていて も 、 予備フ ォ ン ト は自動的には埋め込まれません。 > 予備フ ォ ン ト は、その フ ォ ン ト が正 し い Unicode 情報を含んでい る 場合にのみ動作 し ま す。 置換グ リ フは、 被置換グ リ フ と 同 じ Unicode 値を持っ てい る 必要があ り ます。 > 用字系固有のシ ェーピ ン グ (オプシ ョ ン shaping ・ script ・ locale) と OpenType 機能 (オ プシ ョ ン features ・ script ・ language) は、 同一フ ォ ン ト 内のグ リ フ群に対 し てのみ適 用 さ れ、 ベース フ ォ ン ト と 1 つない し 複数の予備フ ォ ン ト と にわた る グ リ フ群に対 し ては適用 さ れません。 > 下線 / 上線 / 取 り 消 し 線機能は、予備フ ォ ン ト を扱 う 際には注意 し て使 う 必要があ り ま す。 アセ ン ダ等の タ イ ポ グ ラ フ ィ 値について も 同様です。 ベース フ ォ ン ト 内で決定 さ れ る 下線の太 さ ・ 位置は、 予備フ ォ ン ト 内の値 と は一致 し ない可能性があ り ます。 そ の場合、 下線の位置 ま たは太 さ が見苦 し く ガ タ つ く こ と にな り ます。 こ の問題に対す る 単純な回避策は、 統一的な値 を、 PDF_fit_textline( ) ・ PDF_add/create_textflow( ) の underlineposition ・ underlinewidth オプシ ョ ン で指定す る こ と です。 こ の値は、 ベース フ ォ ン ト と すべての予備フ ォ ン ト において う ま く い く よ う に選ぶ必要があ り ます。 以下の各項で、 予備フ ォ ン ト の重要な用途をい く つか解説 し 、 その照応す る オプシ ョ ン リ ス ト を演示 し ます。 5.4 フ ォ ン ト を読み込む 139 テキス ト フ ォ ン ト に数学キ ャ ラ ク タ を追加 数学グ リ フ がない と き の非常に荒っぽい解 決法 と し て、 fallbackfonts オプシ ョ ンに対 し て以下の フ ォ ン ト 読み込みオプシ ョ ン を用い て、 Symbol フ ォ ン ト 内の数学グ リ フ を テ キ ス ト フ ォ ン ト に追加す る こ と がで き ます : fallbackfonts={{fontname=Symbol encoding=unicode}} 複数の用字系で使え る よ う フ ォ ン ト を合体 場合に よ っ ては、 入力テ キ ス ト デー タ の用 字系が事前にわか ら ない こ と が あ り ま す。 た と えば、 デー タ ベー ス が欧文 ・ ギ リ シ ャ 文 字 ・ キ リ ル文字のテ キ ス ト を含んでい る のに、 得 ら れ る フ ォ ン ト は こ れ ら の用字系の う ち の 1 つ し か同時に網羅 し ていない と い う 場合があ る か も し れません。用字系を決定 し て適 切な フ ォ ン ト を選ぶのではな く 、 い く つかの フ ォ ン ト を結びつけた フ ォ ン ト を構築 し て、 実質的にすべての用字系の スーパーセ ッ ト を網羅する こ と が可能です。 fallbackfonts オプ シ ョ ンに対 し て以下の フ ォ ン ト 読み込みオプシ ョ ン を用いて、ギ リ シ ャ 文字フ ォ ン ト と キ リ ル文字フ ォ ン ト を欧文フ ォ ン ト に追加す る こ と がで き ます : fallbackfonts={ {fontname=Times-Greek encoding=unicode embedding forcechars={U+0391-U+03F5}} {fontname=Times-Cyrillic encoding=unicode embedding forcechars={U+0401-U+0490}} } 8 ビ ッ ト エ ン コ ーデ ィ ン グ を拡張 入力デー タ が レ ガシ8ビ ッ ト エン コーデ ィ ン グに限 ら れていた と し て も 、 こ のエ ン コ ーデ ィ ン グ外のキ ャ ラ ク タ を使 う こ と がで き ま す。 予備 フ ォ ン ト を利用 し て ( こ こ ではベース フ ォ ン ト それ自身を予備フ ォ ン ト と し ます)、 かつ、 PDFlib の文字参照の し く みを用いてエ ン コ ーデ ィ ン グ外のキ ャ ラ ク タ を指定すれば よ い のです。 Helvetica フ ォ ン ト を encoding=iso8859-1 ( こ のエン コ ーデ ィ ン グはユー ロ キ ャ ラ ク タ を含んでい ません) で読み込んだ と す る と 、 fallbackfonts オプシ ョ ンに対 し て以下の フ ォ ン ト 読み込みオプシ ョ ン を用いて、ユー ロ グ リ フ を フ ォ ン ト に追加す る こ と がで き ま す: fallbackfonts={{fontname=Helvetica encoding=unicode forcechars=euro}} 入力エン コ ーデ ィ ン グはユー ロ キ ャ ラ ク タ を含んでい ませんので、それを 8 ビ ッ ト 値で指 定す る こ と はで き ません。 こ の制約を回避する には文字参照かグ リ フ名参照 (€ 等) を用い ます (110 ページ 「4.6.2 文字参照」 参照)。 別 フ ォ ン ト か ら のユー ロ グ リ フ を使 う 上記 と ほ と ん ど同 じ ですが、 ベー ス フ ォ ン ト が ユー ロ グ リ フ を含んでい ない場合を考え ま す。 fallbackfonts オプ シ ョ ン に対 し て以下の フ ォ ン ト 読み込みオプシ ョ ン を用いて、ユー ロ グ リ フ を別の フ ォ ン ト か ら 持っ て来 る こ と がで き ます : fallbackfonts={{fontname=Helvetica encoding=unicode forcechars=euro textrise=-5%}}} textrise サブオプシ ョ ン を用いて、 ユー ロ グ リ フ を若干下へ下げま し た。 フ ォ ン ト 内の一部ない し 全部のグ リ フ を大き く す る 予備フ ォ ン ト を使 う と 、 フ ォ ン ト 内の一部ない し すべてのグ リ フ を、 文字サ イ ズ を変えずに大 き く す る こ と がで き ます。 こ の場合 も 、 ベース フ ォ ン ト それ自身を予備フ ォ ン ト と し て用い ます。 こ の機能は、 さ ま ざ ま な フ ォ ン ト のデザ イ ン を、 コ ー ド 内で文字サ イ ズ を調整せずに見た目上協調 さ せ る のに 有用です。fallbackfonts オプシ ョ ンに対 し て以下の フ ォ ン ト 読み込みオプシ ョ ン を用いて、 指定 し た範囲内のすべてのグ リ フ を 120% へ大 き く す る こ と がで き ます : 140 第 5 章 : フ ォ ン ト 処理 fallbackfonts={ {fontname=Times-Italic encoding=unicode forcechars={U+0020-U+00FF} fontsize=120%} } 拡大 し た ピ ク ト グ ラ ム を追加 fallbackfonts オプ シ ョ ン に対 し て以下の フ ォ ン ト 読み込 みオプシ ョ ン を用いて、 ZapfDingbats フ ォ ン ト か ら 記号を持っ て来 る こ と がで き ます : fallbackfonts={ {fontname=ZapfDingbats encoding=unicode forcechars=.a12 fontsize=150% textrise=-15%} } こ の場合 も 、 fontsize ・ textrise サブオプ シ ョ ン を用いて、 記号のサ イ ズ と 位置をベー ス フ ォ ン ト に合わせてい ます。 日中韓 フ ォ ン ト 内のグ リ フ を置 き換え fallbackfonts オプ シ ョ ン に対 し て以下の フ ォ ン ト 読み込みオプシ ョ ン を用いて、 ASCII 範囲内の欧文キ ャ ラ ク タ を別フ ォ ン ト か ら の も の に置 き 換え る こ と がで き ます : fallbackfonts={ {fontname=Courier-Bold encoding=unicode forcechars={U+0020-U+007E}} } ア ラ ビ ア文字 フ ォ ン ト に欧文キ ャ ラ ク タ を追加 文字テ キ ス ト 組版」 で解説 し てい ます。 こ の用途は 171 ページ 「6.4.5 ア ラ ビ ア 足 り ないグ リ フ を つ き と める 無償提供 さ れてい る フ ォ ン ト Unicode BMP Fallback SIL は、 実際のグ リ フ でな く 各 Unicode キ ャ ラ ク タ の 16 進値を表示 し ます。 こ の フ ォ ン ト は、ワー ク フ ロ ーにお け る フ ォ ン ト 関連の問題 を 診断す る の に非常に有用 な と き が あ り ま す。 fallbackfonts オプシ ョ ン に対 し て以下の フ ォ ン ト 読み込みオプ シ ョ ン を用い て、 任意の フ ォ ン ト を、足 り ないキ ャ ラ ク タ が視覚化 さ れ る よ う こ の特殊な予備フ ォ ン ト で強化す る こ と がで き ます : fallbackfonts={{fontname={Unicode BMP Fallback SIL} encoding=unicode}} フ ォ ン ト に外字キ ャ ラ ク タ を追加 こ の用途は 174 ページ 「6.5.2 EUDC ・ SING フ ォ ン ト に よ る 外字キ ャ ラ ク タ 」 で解説 し てい ます。 5.4 フ ォ ン ト を読み込む 141 5.5 フ ォ ン ト の埋め込み と サブ セ ッ ト 化 5.5.1 フ ォ ン ト の埋め込み Acrobat におけ る PDF の フ ォ ン ト 埋め込み と フ ォ ン ト 置換 PDF 文書は、 正 し いテ キ ス ト 表示を確保す る ために、 フ ォ ン ト デー タ を さ ま ざ ま な形式で含む こ と がで き ます。 あ る いは、 キ ャ ラ ク タ の メ ト リ ッ ク と い く つかの一般的な フ ォ ン ト 情報だけ を含む (グ リ フ の ア ウ ト ラ イ ン本体を含 ま ない) フ ォ ン ト 記述子を埋め込む こ と も で き ま す。 フ ォ ン ト が PDF 文書に埋め込まれていない場合、 Acrobat はそれが タ ーゲ ッ ト シ ス テ ムで得 ら れ、 か つ構成 さ れていればそれを取 り (「ロー カルフ ォ ン ト を用いる」)、 あ る いはフ ォ ン ト 記述 子に従っ て代替フ ォ ン ト を組み立て よ う と 試みます。代替フ ォ ン ト が使われ る こ と に よ っ てテ キ ス ト は読め る よ う にな り ますが、そのグ リ フは元の フ ォ ン ト と は異な る可能性があ り ます。 同様に、 代替フ ォ ン ト は、 複雑用字系のシ ェーピ ン グか OpenType レ イ ア ウ ト 機 能が使われてい る と き には働 き ません。 こ う し た理由か ら 、 一般にはフ ォ ン ト の埋め込み を推奨 し ます。 ただ し 、 文書が フ ォ ン ト を埋め込んでいな く て も タ ーゲ ッ ト シ ス テ ム上で の表示が許容範囲内にな る と わかっ てい る 場合は例外です。 その よ う な PDF フ ァ イ ルは 本質的に非可搬ですが、 すべての ワ ー ク ス テーシ ョ ン上で必要フ ォ ン ト が得 ら れ る と わ かっ てい る 企業ネ ッ ト ワ ー ク な ど の制御 さ れた環境においては役に立つか も し れません。 フ ォ ン ト を PDFlib で埋め込む フ ォ ン ト の 埋 め 込 み は、 フ ォ ン ト を 読 み 込 む 際 に embedding オプシ ョ ンで司 ら れます (ただ し 場合に よ っ ては PDFlib はフ ォ ン ト を強制的 に埋め込みます) : font = p.load_font("WarnockPro", "winansi", "embedding"); 表 5.3 に挙げ る よ う に、 使用フ ォ ン ト ご と に PDFlib が必要 と す る フ ォ ン ト ・ メ ト リ ッ ク フ ァ イ ルは使用フ ォ ン ト ご と に異な り ます。 表 5.3 に挙げ る要請に加え て、 (標準ま たは カ ス タ ム の) 日中韓フ ォ ン ト を いずれかの標準 CMap で使 う には、 その照応す る CMap フ ァ イ ルが(場合に よ っ てはその文字集合に対す る Adobe-Japan1-UCS2 等の Unicode マ ッ ピ ン グ CMap も ) 得 ら れ る 必要があ り ます。 不可視テ キ ス ト (主に OCR 出力に有用) にのみ使われ る フ ォ ン ト に対す る フ ォ ン ト 埋 め込みは、 フ ォ ン ト を読み込む際に optimizeinvisible オプシ ョ ンで制御す る こ と がで き ま す。 表 5.3 さ ま ざ ま な フ ォ ン ト 使用状況 と 必要フ ァ イル 使用 フ ォ ン ト フ ォ ン ト の メ ト リ ッ ク フ ァ フ ォ ン ト のアウ ト ラ イ ン フ ァ イルが必要 イルが必要か か 14 コ ア フ ォ ン ト のいずれか × embedding=true かつ skipembedding={latincore} が設定 さ れ ていない場合のみ OS X か Windows に イ ン ス ト ール さ れて いる TrueType ・ OpenType ・ Type 1 ホス ト フォン ト × × 非 コ ア Type 1 フ ォ ン ト ○ embedding=true の場合のみ TrueType フ ォ ン ト n/a ○ OpenType ・ SING フ ォ ン ト n/a ○ 142 第 5 章 : フ ォ ン ト 処理 フ ォ ン ト 埋め込みの法的側面 留意 し ておかな ければな ら ない重要な こ と は、 あ る フ ォ ン ト フ ァ イ ルを持っ てい る と い う 理由だけでは、 その フ ォ ン ト を PDF に埋め込んで も よ い と い う 正当化はで き ない と い う こ と です。た と え合法な フ ォ ン ト ラ イ セ ン ス を保持 し て いて も 同様です。 多 く のフ ォ ン ト ベン ダーが、 自社の フ ォ ン ト の埋め込みには制限を加え てい ます。 さ ま ざ ま な書体工房のなかには、 PDF の フ ォ ン ト 埋め込みを完全に禁止 し てい る と こ ろ も あ り ます し 、自社の フ ォ ン ト に対す る 特別なオン ラ イ ン ラ イ セ ン スや埋め込み ラ イ セ ン ス を提示 し てい る と こ ろ も あ り ます し 、 ま た、 フ ォ ン ト にサブセ ッ ト 化を施す限 り において フ ォ ン ト 埋め込みを許 し てい る 書体工房 も あ り ます。 フ ォ ン ト を PDFlib で埋 め込んでみ よ う と 試み る 前に、 まず、 その フ ォ ン ト の埋め込みが法的にはど の よ う な こ と にな る のかチ ェ ッ ク し て く だ さ い。TrueType フ ォ ン ト や OpenType フ ォ ン ト の中では埋め 込み制限を指定 し てお く こ と がで き る ので、PDFlib はその指定に従い ます。TrueType フ ォ ン ト の中の埋め込みフ ラ グが “ 埋め込み不可 ” に設定 さ れてい る 場合1、 PDFlib はフ ォ ン ト ベン ダーの要請に従い、 その フ ォ ン ト を埋め込 も う と す る あ ら ゆ る 試みを拒否 し ます。 上記の法的警告は、 Web フ ォ ン ト については特に留意 し てお く 必要があ り ます。 なぜ な ら 、Web 上で利用す る ための フ ォ ン ト の多 く のベン ダーは、 その よ う な フ ォ ン ト を PDF 文書内に埋め込む こ と を許 し ていないか ら です。 5.5.2 フ ォ ン ト のサブ セ ッ ト 化 PDF 出力のサ イ ズ を減 ら すために、PDFlib は、 あ る フ ォ ン ト の中で実際にその文書の中で 使われてい る グ リ フ だけ を埋め込む こ と がで き ます。 こ の処理を フ ォ ン ト のサブセ ッ ト 化 と いい ます。 サブセ ッ ト 化を行 う と 新 し い フ ォ ン ト が作成 さ れ、 その中ではグ リ フ の数が 元の フ ォ ン ト よ り も 少な く 、 PDF の表示に必要ない フ ォ ン ト 情報 も 省略 さ れてい ま す。 フ ォ ン ト のサブセ ッ ト 化は特に日中韓フ ォ ン ト において重要です。 PDFlib は、 以下の種類 の フ ォ ン ト のサブセ ッ ト 化に対応 し てい ます : > TrueType フ ォ ン ト 。 > PostScript か TrueType のア ウ ト ラ イ ン を持つ OpenType フ ォ ン ト 。 > Type 3 フ ォ ン ト (特別な扱いが必要、 144 ページ 「Type 3 フ ォ ン ト のサブセ ッ ト 化」 を 参照) サブセ ッ ト 化を要求 さ れてい る フ ォ ン ト が文書内で使われてい る 場合、PDFlib は実際にテ キ ス ト 出力に使われてい る キ ャ ラ ク タ を調べます。サブセ ッ ト 化の動作を制御す る にはい く つかの方法があ り ます (autosubsetting は指定 し ていない と し て) : > デフ ォ ル ト のサブセ ッ ト 化の動作は autosubsetting オプシ ョ ン で制御 さ れます。も し こ のオプシ ョ ンが true な ら ば、 サブセ ッ ト 化可能なすべての フ ォ ン ト に対 し てサブセ ッ ト 化が有効にな り ま す (特別な扱いが必要な Type 3 フ ォ ン ト の場合を除 き ます、 後 述)。 デフ ォ ル ト 値は true です。 > autosubsetting=true の場合:subsetlimit オプシ ョ ンはパーセ ン ト 値を持ち ます。文書内 で用い ら れてい る 、 あ る フ ォ ン ト 内のグ リ フ の数が こ の割合を超え る 場合には、 その フ ォ ン ト のサブセ ッ ト 化は無効 と な り 、 かわ り に フ ォ ン ト 全体が埋め込ま れ ます。 こ れに よ っ て処理時間があ る 程度短縮で き ますが、 そのかわ り に出力フ ァ イ ルの容量は 大 き く な り ます。 以下の フ ォ ン ト オプシ ョ ンはサブセ ッ ト 限界を 75% に設定 し ます : subsetlimit=75% subsetlimit のデフ ォ ル ト 値は 100 パーセ ン ト です。 言い換えれば、 ク ラ イ ア ン ト が明 示的に 100 パーセ ン ト 未満の限界値を要求 し ない限 り 、 PDF_load_font( ) で要求 さ れ る サブセ ッ ト 化オプシ ョ ンは効力を持ち ます。 1. も っ と 明確に言えば : その フ ォ ン ト の OS/2 テーブル内の fsType フ ラ グが値 2 を持つ場合。 5.5 フ ォ ン ト の埋め込み と サブ セ ッ ト 化 143 > autosubsetting=true の場合:subsetminsize オプシ ョ ン を用い る と 、容量の小 さ な フ ォ ン ト のサブセ ッ ト 化を完全に無効にす る こ と がで き ます。 元の フ ォ ン ト フ ァ イ ルの容量 が subsetminsize の値 よ り も KB 単位で小 さ い場合、 その フ ォ ン ト のサブセ ッ ト 化は無 効にな り ます。 TrueType フ ォ ン ト の埋め込み と サブ セ ッ ト 化 あ る TrueType フ ォ ン ト が、 winansi か macroman 以外のエン コ ーデ ィ ン グで使用 さ れ る フ ォ ン ト であ る 場合、 デフ ォ ル ト ではそ の フ ォ ン ト は PDF 出力の際に CID フ ォ ン ト に変換 さ れます。 Adobe グ リ フ リ ス ト (AGL) の中にあ る キ ャ ラ ク タ だけ を含むエ ン コ ーデ ィ ン グの場合には、 autocidfont オプシ ョ ン を false に設定すれば こ の変換は行われません。 初期 フ ォ ン ト サブ セ ッ ト を指定 フ ォ ン ト サブセ ッ ト は、 文書内で使われてい る すべて のグ リ フ のア ウ ト ラ イ ン記述を含んでい ます。 こ れはすなわち、 生成 さ れ る 文書サブセ ッ ト は文書ご と に変化す る こ と を意味 し ます。 なぜな ら 一般に、 各文書内ではそれぞれ異な る キ ャ ラ ク タ (ひいてはグ リ フ) のセ ッ ト が用い ら れてい る か ら です。 フ ォ ン ト サブセ ッ ト を埋め込んだた く さ んの小 さ な文書を大 き な文書へ連結する 際には、フ ォ ン ト サブセ ッ ト がそれぞれま ち ま ちであ る こ と は厄介です:埋め込まれてい る サブセ ッ ト は全部互いに 異な る ため、 除去で き ないのです。 こ う し た場合のために、PDFlib では、PDF_load_font( ) の initialsubset オプシ ョ ンで フ ォ ン ト サブセ ッ ト の初期内容を指定す る こ と が可能です。PDFlib がデフ ォ ル ト では空のサブ セ ッ ト か ら 開始 し 、生成 さ れ る テ キ ス ト 出力か ら の要請に応 じ て グ リ フ を追加 し てい く の に対 し て、initialsubset オプシ ョ ン を利用す る と 、空でないサブセ ッ ト を指定す る こ と がで き ます。 た と えば、 Latin-1 テ キ ス ト 出力のみが生成 さ れ る と わか っ てい る 場合に、 フ ォ ン ト がその他のグ リ フ も た く さ ん含んでい る な ら ば、 先頭 Unicode ブ ロ ッ ク を初期サブ セ ッ ト と し て指定す る こ と がで き ます : initialsubset={U+0020-U+00FF} こ れはすなわち、 指定 し た範囲内のすべての Unicode キ ャ ラ ク タ に対す る グ リ フ がサブ セ ッ ト 内に入れ込まれ る こ と を意味 し ます。 こ の範囲を、 生成 さ れ る文書内のすべてのテ キ ス ト を網羅す る よ う に選んでおいたな ら ば、生成 さ れ る フ ォ ン ト サブセ ッ ト はすべての 文書内で等 し く な る で し ょ う 。 そ う すれば、 こ の よ う な文書群を後で 1 個の PDF へ連結 す る 際に、 等 し い フ ォ ン ト サブセ ッ ト 群は PDF_begin_document( ) の optimize オプシ ョ ン で除去す る こ と が可能にな り ます。 Type 3 フ ォ ン ト のサブ セ ッ ト 化 Type 3 フ ォ ン ト を文書で使え る よ う にす る には、 その 前に まず (グ リ フ の幅が必要なので) それを定義 し なければな ら ず、 ひいては埋め込ま な ければな り ません。 と こ ろがその一方でサブセ ッ ト 化は、 すべてのページ を作成 し た後で は じ めて可能にな る も のです (正 し いサブセ ッ ト を決定す る には、 ど のグ リ フ が文書内で 使われたかを知る 必要があ る ので)。 こ の矛盾を避け る ために PDFlib は、 幅オン リ ー Type 3 フ ォ ン ト に対応 し てい ます。 Type 3 フ ォ ン ト についてサブセ ッ ト 化が必要な と き は、 2 回に分けて フ ォ ン ト を定義す る 必要があ り ます : > 1 回目は、 フ ォ ン ト を使 う 前に、PDF_begin_font( ) で widthsonly オプシ ョ ン を指定 し て 行 う 必要があ り ます。 こ こ ではフ ォ ン ト と グ リ フ の メ ト リ ッ ク (幅) だけ を定義 し ま す。 PDF_begin_font( ) の フ ォ ン ト マ ト リ ッ ク ス と 、 PDF_begin_glyph_ext( ) の wx と グ リ フ外接枠を与え る 必要があ り 、 かつ実際のグ リ フ の メ ト リ ッ ク を正確に記述す る 必 要があ り ます。 グ リ フ ご と に PDF_begin_glyph_ext( ) と PDF_end_glyph( ) だけが必要で あ り 、 それ以外に実際のグ リ フ の形を定義す る 呼び出 し は一切不要です。 グ リ フ定義 144 第 5 章 : フ ォ ン ト 処理 の開始 と 終了の間で他の関数を呼び出 し た場合、 それは PDF 出力に対 し て何 ら 効力を 持たず、 例外 も 一切発生 し ません。 > 2 回目は、 こ の フ ォ ン ト のテ キ ス ト をすべて作成 し た後に行 う 必要があ り 、実際のグ リ フ のア ウ ト ラ イ ンか ビ ッ ト マ ッ プ を定義 し ます。 フ ォ ン ト と グ リ フ の メ ト リ ッ ク は、 1 回目ですでにわか っ てい る ので無視 さ れ ま す。 最後のページが作成 さ れた後、 PDFlib は ど のグ リ フ が文書内で使われてい る か も 知っ てい る ので、 必要な グ リ フ定義だけ を 埋め込んで フ ォ ン ト サブセ ッ ト を構成 し ます。 1 回目 と 2 回目では、 同 じ グ リ フ群を与え なければな り ません。 サブセ ッ ト 化を伴 う Type 3 フ ォ ン ト は、 PDF_load_font( ) で 1 回だけ読み込む こ と がで き ます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの fonts/type3_subsetting ト ピ ッ ク にあ り ます。 5.5 フ ォ ン ト の埋め込み と サブ セ ッ ト 化 145 5.6 フ ォ ン ト 情報を ク エ リ PDF_info_font( ) を利用す る と 、 フ ォ ン ト ・ エン コーデ ィ ン グ ・ Unicode ・ グ リ フ に関 し て 有用な情報を ク エ リ する こ と がで き ます。 ク エ リ の種類に よ っ ては、 有効な フ ォ ン ト ハン ド ルが こ の関数の引数 と し て必要な場合 も あ り ます。 以下すべての例で、 表 5.4 に挙げ る 変数を用い る こ と に し ます。 表 5.4 PDF_info_font( ) の利用例で用いる変数一覧 変数 注釈 int uv; Unicode の数値。 あるいは、 グ リ フ名参照から 「&」 ・ 「;」 修飾を除いた ものを オプ シ ョ ン リ ス ト 内で用い る こ と も で き ます (unicode=euro 等)。 詳 し く は、 PDFlib リ フ ァ レ ン スの Unichar オプ シ ョ ン リ ス ト デー タ 型の解説を参照 し て く だ さ い。 int c; 8 ビ ッ ト 文字 コ ー ド int gid; グ リ フ ID int cid; CID 値 String gn; グ リ フ名 int gn_idx; グ リ フ名の文字列番号。 gn_idx が -1 以外の と き、 その照応する文字列を取得するには以 下のよ う に し ます : gn = p.get_string(gn_idx, ""); String enc; エ ン コ ーデ ィ ング名 int font; PDF_load_font( ) を用いて作成 し た有効な フ ォ ン ト ハン ド ル 求め ら れた キー ワ ー ド と オプシ ョ ン (群) の組み合わせが得 ら れない と き は、 PDF_info_ font( ) は -1 を返 し ます。 こ れは、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン側でチ ェ ッ ク す る 必要 があ り 、 ま た こ れを用いて、 求め る グ リ フ が フ ォ ン ト 内にあ る か ど う かをチ ェ ッ ク す る こ と がで き ます。 以下のサン プル コ ー ド 行は、 互いに依存 し てい ませんので、 独立に抜 き 出 し て利用す る こ と がで き ます。 5.6.1 フ ォ ン ト 非依存のエ ン コ ーデ ィ ン グ ・ Unicode ・ グ リ フ 名 ク エ リ エ ン コ ーデ ィ ン グ ク エ リ エ ン コ ーデ ィ ン グ ク エ リ には、 有効な フ ォ ン ト ハン ド ルは必 要ではあ り ません。 すなわち、 PDF_info_font( ) の font 引数に値 -1 (PHP の場合 : 0) を 与え る こ と がで き ます。 gn には、 PDFlib が内部的に知っ てい る グ リ フ名だけ を与え る こ と がで き 、 フ ォ ン ト 独自のグ リ フ名を与え る こ と はで き ません。 Unicode キ ャ ラ ク タ か指名 し た グ リ フ の、 8 ビ ッ ト エン コ ーデ ィ ン グ内の 8 ビ ッ ト コ ー ド を クエ リ : c = (int) p.info_font(-1, "code", "unicode=" + uv + " encoding=" + enc); c = (int) p.info_font(-1, "code", "glyphname=" + gn + " encoding=" + enc); 8 ビ ッ ト コ ー ド か指名 し た グ リ フ の、8 ビ ッ ト エン コーデ ィ ン グ内の Unicode 値を ク エ リ : uv = (int) p.info_font(-1, "unicode", "code=" + c + " encoding=" + enc); uv = (int) p.info_font(-1, "unicode", "glyphname=" + gn + " encoding=" + enc); 146 第 5 章 : フ ォ ン ト 処理 8 ビ ッ ト コ ー ド か Unicode 値の、 8 ビ ッ ト エン コ ーデ ィ ン グ内の登録 さ れた グ リ フ名を ク エリ : gn_idx = (int) p.info_font(-1, "glyphname", "code=" + c + " encoding=" + enc); gn_idx = (int) p.info_font(-1, "glyphname", "unicode=" + uv + " encoding=" + enc); /* 文字列番号を用いて実際のグリフ名を取得 */ gn = p.get_string(gn_idx, ""); Unicode ・ グ リ フ 名 ク エ リ PDF_info_font( ) を利用する と 、特定の 8 ビ ッ ト エン コーデ ィ ン グに依存せず、Unicode 値 と PDFlib が内部的に知っ てい る名前 と の関係にかかわ る ク エ リ を行 う こ と も 可能です。 こ れ ら の ク エ リ はいかな る フ ォ ン ト に も 依存 し ませんので、 有 効な フ ォ ン ト ハン ド ルは必要ではあ り ません。 内部的に知 ら れてい る グ リ フ名の Unicode 値を ク エ リ : uv = (int) p.info_font(-1, "unicode", "glyphname=" + gn + " encoding=unicode"); Unicode 値の内部グ リ フ名を ク エ リ : gn_idx = (int) p.info_font(-1, "glyphname", "unicode=" + uv + " encoding=unicode"); /* 文字列番号を用いて実際のグリフ名を取得 */ gn = p.get_string(gn_idx, ""); 5.6.2 フ ォ ン ト 依存のエ ン コ ーデ ィ ン グ ・ Unicode ・ グ リ フ 名 ク エ リ 以下の ク エ リ は、 特定の フ ォ ン ト にかかわ る も のですので、 有効な フ ォ ン ト ハン ド ルで フ ォ ン ト を指定す る 必要があ り ます。 gn 変数を用いて、 内部的に知 ら れてい る グ リ フ だ けでな く 、 フ ォ ン ト 独自のグ リ フ名を与え る こ と も で き ます。 以下すべての例において、 戻 り 値 -1 は、 求めた グ リ フ を その フ ォ ン ト が含んでいない こ と を意味 し ます。 8 ビ ッ ト エン コ ーデ ィ ン グで読み込んだ フ ォ ン ト 内の Unicode 値、 グ リ フ ID、 指名 し た グ リ フ、 CID に対す る 8 ビ ッ ト コー ド を ク エ リ : c c c c = = = = (int) (int) (int) (int) p.info_font(font, p.info_font(font, p.info_font(font, p.info_font(font, "code", "code", "code", "code", "unicode=" + uv); "glyphid=" + gid); "glyphname=" + gn); "cid=" + cid); フ ォ ン ト 内の コ ー ド 、 グ リ フ ID、 指名 し た グ リ フ、 CID に対する Unicode 値を ク エ リ : uv uv uv uv = = = = (int) (int) (int) (int) p.info_font(font, p.info_font(font, p.info_font(font, p.info_font(font, "unicode", "unicode", "unicode", "unicode", "code=" + c); "glyphid=" + gid); "glyphname=" + gn); "cid=" + cid); フ ォ ン ト 内の コー ド 、 Unicode 値、 指名 し た グ リ フ、 CID に対する グ リ フ ID を ク エ リ : gid gid gid gid = = = = (int) (int) (int) (int) p.info_font(font, p.info_font(font, p.info_font(font, p.info_font(font, "glyphid", "glyphid", "glyphid", "glyphid", "code=" + c); "unicode=" + uv); "glyphname=" + gn); "cid=" + cid); 任意の 8 ビ ッ ト エン コ ーデ ィ ン グにおけ る フ ォ ン ト 内の コ ー ド 、 Unicode 値、 指名 し た グ リ フ に対す る グ リ フ ID を ク エ リ : 5.6 フ ォ ン ト 情報を ク エ リ 147 gid = (int) p.info_font(font, "glyphid", "code=" + c + " encoding" + enc); gid = (int) p.info_font(font, "glyphid", "unicode=" + uv + " encoding=" + enc); gid = (int) p.info_font(font, "glyphid", "glyphname=" + gn + " encoding=" + enc); コ ー ド ・ Unicode 値 ・ CID で指定 し た グ リ フ の フ ォ ン ト 独自の名前を ク エ リ : gn_idx gn_idx gn_idx gn_idx = = = = (int) (int) (int) (int) p.info_font(font, p.info_font(font, p.info_font(font, p.info_font(font, "glyphname", "glyphname", "glyphname", "glyphname", "code=" + c); "unicode=" + uv); "glyphid=" + gid); "cid=" + cid); /* 文字列番号を用いて実際のグリフ名を取得 */ gn = p.get_string(gn_idx, ""); グ リ フ の入手可能性 を チ ェ ッ ク PDF_info_font( ) を利用す る と 、 自分のアプ リ ケーシ ョ ン で必要な グ リ フ を あ る 特定の フ ォ ン ト が含んでい る か ど う か を チ ェ ッ ク す る こ と がで き ます。 た と えば、 以下の コ ー ド はユー ロ グ リ フ が フ ォ ン ト 内に含まれてい る か ど う かを チ ェ ッ ク し ます : /* "unicode=U+20AC"でもよい */ if (p.info_font(font, "code", "unicode=euro") == -1) { /* ユーログリフに対するグリフがフォント内で得られない */ } ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の fonts/glyph_availability ト ピ ッ ク にあ り ます。 あ る いは PDF_info_textline( ) を使っ て、 所与のテ キ ス ト 文字列におけ る マ ッ プな し キ ャ ラ ク タ の数を、 すなわち文字列内の、 フ ォ ン ト 内で適当な グ リ フ が得 ら れないキ ャ ラ ク タ の 数をチ ェ ッ ク す る こ と も で き ます。 以下の コ ー ド 断片は、 ユー ロ キ ャ ラ ク タ (グ リ フ名参 照で表現) 1 個だけ を内容 と す る 文字列についての結果を ク エ リ し ます。 も し も マ ッ プな し キ ャ ラ ク タ が 1 個見つかれば、 こ れはすなわちその フ ォ ン ト がユー ロ 記号に対す る グ リ フ を一切含んでいない こ と を意味 し ます : String optlist = "font=" + font + " charref"; if (p.info_textline("€", "unmappedchars", optlist) == 1) { /* ユーロ記号に対するグリフはフォント内で得られない */ } 5.6.3 コ ー ド ページ網羅性 と 予備 フ ォ ン ト を ク エ リ PDF_info_font( ) を利用す る と 、あ る 特定の言語ない し 用字系のテ キ ス ト 出力を作成す る の に フ ォ ン ト が適 し てい る か ど う かをチ ェ ッ ク す る こ と も で き ます。 そのためには、 そのテ キ ス ト で ど の コ ー ド ページが必要かがわかっ てい る 必要があ り ます。 コー ド ページ網羅性 は、 フ ォ ン ト の OS/2 テーブル内にエン コ ー ド さ れてい ます。 ただ し 、 フ ォ ン ト があ る 特 定の コ ー ド ページに対応 し てい る と は正確には何を意味する のかは、フ ォ ン ト デザ イ ナー の考え方一つで決ま り ます。 フ ォ ン ト があ る 特定の コー ド ページに対応 し てい る と 言っ て い る か ら と いっ て、必ず し も それがその コ ー ド ページ内のすべてのキ ャ ラ ク タ に対す る グ リ フ を含んでい る と は限 り ま せん。 よ り 正確な網羅性情報が必要な場合は、 147 ページ 「5.6.2 フ ォ ン ト 依存のエ ン コ ーデ ィ ン グ ・ Unicode ・ グ リ フ名 ク エ リ 」 で示 し た よ う に し てすべての必要な キ ャ ラ ク タ の入手可能性を ク エ リ する こ と がで き ます。 148 第 5 章 : フ ォ ン ト 処理 フ ォ ン ト が コ ー ド ページ に対応 し てい るかど う かを チ ェ ッ ク 以 下 の コ ー ド 断 片 は、 フ ォ ン ト があ る 特定の コ ー ド ページに対応 し てい る か ど う かをチ ェ ッ ク し ます : String cp="cp1254"; result = (int) p.info_font(font, "codepage", "name=" + cp); if (result == -1) System.err.println("コードページ網羅性不明"); else if (result == 0) System.err.println("コードページはこのフォントでは対応していません"); else System.err.println("コードページはこのフォントで対応しています"); 対応 し てい る全 コ ー ド ページの リ ス ト を取得 以下の コ ー ド 断片は、 TrueType ま た は OpenType フ ォ ン ト が対応 し てい る すべての コ ー ド ページの リ ス ト を ク エ リ し ます : cp_idx = (int) p.info_font(font, "codepagelist", ""); if (cp_idx == -1) System.err.println("コードページリスト不明"); else { System.err.println("コードページリスト:"); System.err.println(p.get_string(cp_idx, "")); } こ れは、 広 く 用い ら れてい る Arial フ ォ ン ト に対 し ては以下の リ ス ト を作成 し ます : cp1252 cp1250 cp1251 cp1253 cp1254 cp1255 cp1256 cp1257 cp1258 cp874 cp932 cp936 cp949 cp950 cp1361 予備グ リ フ を ク エ リ PDF_info_font( ) を利用す る と 、 予備フ ォ ン ト 機構の結果を ク エ リ す る こ と がで き ます (予備フ ォ ン ト について詳 し く は 138 ページ 「5.4.6 予備フ ォ ン ト 」 を 参照)。以下の コ ー ド 断片は、指定 し た Unicode キ ャ ラ ク タ を表すのに用い ら れてい る ベー ス フ ォ ン ト か予備フ ォ ン ト の名前を調べます : result = p.info_font(basefont, "fallbackfont", "unicode=U+03A3"); /* result==ベースフォントならば、ベースフォントが使われ予備フォントは必要なかった */ if (result == -1) { /* キャラクタはベースフォントでも予備フォントでも表示できない */ } else { idx = p.info_font(result, "fontname", "api"); fontname = p.get_string(idx, ""); } 5.6 フ ォ ン ト 情報を ク エ リ 149 150 第 5 章 : フ ォ ン ト 処理 6 テキス ト 出力 6.1 テキス ト 出力方式 PDFlib は、 テ キ ス ト 出力にい く つかの レベルで対応 し てい ます : > PDF_show( ) や類似の関数群に よ る 低レベルテ キ ス ト 出力。 > PDF_fit_textline( ) に よ る 一行に組まれたテ キ ス ト 出力。こ の関数はパ ス上テ キ ス ト に も 対応 し てい ます。 > テ キ ス ト フ ロ ーに よ る 複数行テ キ ス ト 組版出力 (PDF_fit_textflow( ) お よ び関連す る関 数群)。 テ キ ス ト フ ロ ー組版機能は、 ベ ク ト ルベース の形状の内側ま たは外側にテ キ ス ト を回 り こ ませる こ と も で き ます。 > 表内のテ キ ス ト 。 表組版機能は、 表セル内のテ キ ス ト 行 ・ テ キ ス ト フ ロ ー内容に対応 し てい ます。 低レ ベルテキス ト 出力 PDF_show( ) の よ う な関数群を使 う と 、 テ キ ス ト をページ上のあ る特定の場所に、 いかな る 組版支援を も 利用せずに配置する こ と がで き ます。 こ れは、 非 常に基本的な出力要請を持つアプ リ ケーシ ョ ン (プ レーン テ キ ス ト フ ァ イ ルを PDF へ変 換す る 等) 、 あ る いはすでに完全なテ キ ス ト 配置情報を持っ てい る アプ リ ケーシ ョ ンの場 合にのみ推奨 し ます (別形式のページ を PDF へ変換す る ド ラ イ バ等)。 以下の コ ー ド 断片 は、 低レベル関数群でテ キ ス ト 出力を作成 し ます : font = p.load_font("Helvetica", "unicode", ""); p.setfont(font, 12); p.set_text_pos(50, 700); p.show("Hello world!"); p.continue_text("(says Java)"); テキス ト 行で組まれた一行テキス ト 出力 PDF_fit_textline( ) は、 一行だけのテ キ ス ト 出 力を作成 し 、 さ ま ざ ま な組版機能を提供 し ます。 ただ し 、 テ キ ス ト 行ご と の位置は ク ラ イ ア ン ト アプ リ ケーシ ョ ンが決定す る 必要があ り ます。 以下の コ ー ド 断片は、 テ キ ス ト 行で テ キ ス ト 出力を作成 し ます。 フ ォ ン ト ・ エン コ ーデ ィ ン グ ・ 文字サ イ ズはオプシ ョ ン と し て指定で き ますので、 こ れに先立っ て PDF_load_font( ) を呼び出 し てお く 必要はあ り ませ ん: p.fit_textline(text, x, y, "fontname=Helvetica encoding=unicode fontsize=12"); 詳 し く は 213 ページ 「8.1 テ キ ス ト 行を配置 ・ はめ込む」 を参照 し て く だ さ い。 テキス ト フ ロ ーに よ る複数行テキス ト 出力 PDF_fit_textflow( ) は、 任意の行数のテ キ ス ト 出力を作成 し 、 ま た、 テ キ ス ト を複数の段組みま たはページにわた ら せ る こ と も で き ま す。 テ キ ス ト フ ロ ー組版機能はた く さ んの組版機能に対応 し てい ます。 以下の コー ド 断片 は、 テ キ ス ト フ ロ ーを用いてテ キ ス ト 出力を作成 し ます : tf = p.add_textflow(tf, text, optlist); result = p.fit_textflow(tf, llx, lly, urx, ury, optlist); p.delete_textflow(tf); 詳 し く は 221 ページ 「8.2 複数行のテ キ ス ト フ ロ ー」 を参照 し て く だ さ い。 6.1 テキス ト 出力方式 151 表内のテキス ト テ キ ス ト 行 と テ キ ス ト フ ロ ーを使っ て、表セル内にテ キ ス ト を配置す る こ と も で き ます。 詳 し く は 242 ページ 「8.3 表の組版」 を参照 し て く だ さ い。 152 第 6 章 : テキス ト 出力 6.2 フ ォ ン ト メ ト リ ッ ク と テキス ト バ リ エーシ ョ ン 6.2.1 フ ォ ン ト と グ リ フ の メ ト リ ッ ク テキス ト 位置 PDFlib はテ キ ス ト 位置を、 グ ラ フ ィ ッ ク 描画のカ レ ン ト 点 と は独立に保 持 し ます。 前者は textx/texty オプシ ョ ンで ク エ リ で き、 後者は currentx/currenty で ク エ リ で き ます。 グ リ フ の メ ト リ ッ ク PDFlib では、PostScript や PDF で用い ら れてい る グ リ フ と フ ォ ン ト の メ ト リ ッ ク の体系を用いてい ます。 こ こ で簡単に説明 し てお き ま し ょ う 。 PDFlib のユーザーが指定す る 必要のあ る 文字サ イ ズ と い う のは、 テ キ ス ト の行 と 行の 間で文字が重な り あわないために必要な最小間隔の こ と です。文字サ イ ズは一般に フ ォ ン ト 内の各文字 よ り も 大 き く な っ てい ます。なぜな ら その中にはベース ラ イ ン よ り 上の部分 も 下の部分 も 含んでい る か ら であ り 、 ま た、 それに加え て行 と 行の間の間隔を も っ と 広 く と っ てい る こ と も あ る か ら です。 leading (行送 り ) は、 テ キ ス ト の 1 つの行のベース ラ イ ン と 次の行のベース ラ イ ン と の間の縦の間隔を指定 し ます。デフ ォ ル ト では こ れは文字サ イ ズ と 同 じ 値に設定 さ れてい ます。 capheight (キ ャ ッ プハ イ ト ) は、 多 く の欧文フ ォ ン ト では T や H の よ う な大文字 の高 さ です。 xheight (x ハ イ ト ) は、 多 く の欧文フ ォ ン ト では x の よ う な小文字の高 さ で す。 ascender (アセ ン ダ) は、 多 く の欧文フ ォ ン ト では f や d の よ う な小文字の高 さ です。 descender (デ ィ セ ン ダ) は、 多 く の欧文フ ォ ン ト では、 ベース ラ イ ンか ら j や p の よ う な 小文字の下端 ま で の間隔です。 デ ィ セ ン ダ はふつ う 負の値です。 xheight ・ capheight ・ ascender ・ descender の値は文字サ イ ズに対す る 割合 と し て表 さ れてい る ので、 必要な文 字サ イ ズ を掛けてか ら 用い る 必要があ り ます。 gaplen プ ロ パテ ィ は TrueType・OpenType フ ォ ン ト でのみ得 ら れます (それ以外の フ ォ ン ト では算出 さ れます)。 gaplen 値はフ ォ ン ト フ ァ イ ルか ら 読み出 さ れ、 ベース ラ イ ン間 の推奨間隔 と アセ ン ダ+デ ィ セ ン ダ と の差を示 し ます。 PDFlib は、 こ れ ら の値の う ちの 1 つない し 複数を、 推算で求めなければな ら ない場合 も あ り ます。 なぜな ら こ れ ら の値は、 フ ォ ン ト や メ ト リ ッ ク フ ァ イ ルの中に存在 し てい る と い う 保証がないためです。 用い ら れてい る 値が本当の値なのか、 それ と も 推測値なのか を知 る には、 PDF_info_font( ) を呼び出 し てオプシ ョ ン faked で xheight を ク エ リ し ます。 あ る フ ォ ン ト のキ ャ ラ ク タ メ ト リ ッ ク を PDFlib で ク エ リ す る には以下の よ う に記述 し ま す: 図 6.1 フ ォ ン ト と キ ャ ラ ク タ の メ ト リ ッ ク ascender capheight font size baseline descender 6.2 フ ォ ン ト メ ト リ ッ ク と テキス ト バ リ エーシ ョ ン 153 font = p.load_font("Times-Roman", "unicode", ""); capheight = p.info_font(font, "capheight", ""); ascender = p.info_font(font, "ascender", ""); descender = p.info_font(font, "descender", ""); xheight = p.info_font(font, "xheight", ""); 注 上付き ・ 下付きの位置 と サイ ズは PDFlib で ク エ リ で き ません。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の fonts/font_metrics_info ト ピ ッ ク にあ り ます。 CPI の計算 多 く の フ ォ ン ト は可変の字幅を持っ てい ますが、 等幅フ ォ ン ト と い う 種類の フ ォ ン ト ではすべての文字に対 し て等 し い幅を用い ます。 PDF の フ ォ ン ト メ ト リ ッ ク と 、 高速印刷環境で よ く 用い ら れ る characters per inch (CPI) 表記 と の関係を理解す る には、 等幅の Courier フ ォ ン ト での計算例が役に立つのではないで し ょ う か。 Courier では、 文字 長方形の全幅がポ イ ン ト あ た り 1000 単位であ る のに対 し て、 すべての文字は 600 単位の 幅を持っ てい ます( こ の値は、その照応す る AFM メ ト リ ッ ク フ ァ イ ルか ら 取得で き ます)。 た と えば 12 ポ イ ン ト のテ キ ス ト では、 すべての文字の実際の幅は次の よ う にな り ます。 12 ポイント ×(600 ÷ 1000)= 7.2 ポイント 最適行送 り が 12 ポ イ ン ト です。 1 イ ンチは 72 ポ イ ン ト ですので、 Courier 12 ポ イ ン ト の 文字は 1 イ ンチの中にち ょ う ど 10 個収ま る こ と にな り ます。つま り 、12 ポ イ ン ト の Courier は 10 cpi フ ォ ン ト であ る と い う こ と にな り ます。 10 ポ イ ン ト のテ キ ス ト の場合は、 字幅 は 6 ポ イ ン ト ですので、 すなわち 72 ÷ 6 = 12 cpi フ ォ ン ト と な り ます。 同様に、 8 ポ イ ン ト の Courier は 15 cpi と な り ます。 6.2.2 カ ーニ ン グ さ ま ざ ま な文字の組み合わせのなかには、望ま し く ない見ばえにな っ て し ま う も のがあ り ます。 た と えば、 2 つの V が隣 り 合 う と W の よ う に見え て し ま い ます し 、 T と e の間の間 隔は縮めない と 広 く あ き すぎ て不恰好にな っ て し ま い ます。 こ の よ う な補正の こ と を カー ニ ン グ と いい ます。 多 く の フ ォ ン ト が、 問題 と な る文字の組み合わせそれぞれに対す る間 隔調整を指定 し た包括的な カーニ ン グ情報を持っ てい ます。 PDFlib は、 以下の ソ ース か ら のカーニ ン グデー タ を使用 し ます : > TrueType ・ OpenType フ ォ ン ト : kern テーブルで指定 さ れた カーニ ン グ対。 > OpenType フ ォ ン ト : kern 機能 と GPOS テーブルを通 じ て指定 さ れたペアベース と 分類 ベース のカーニ ン グデー タ 。 > PostScript Type 1 フ ォ ン ト : AFM ・ PFM フ ァ イ ルで指定 さ れた カーニ ン グペア。 > SVG フ ォ ン ト : hkern エ レ メ ン ト 内で指定 さ れた カーニ ン グペア。 > PDF コ ア フ ォ ン ト に対す る カーニ ン グペアは PDF に よ っ て内部的に提供 さ れます。 PDFlib には、 カーニ ン グの動作を制御する 方式が 2 種類あ り ます : > デフ ォ ル ト では、 フ ォ ン ト 内のカーニ ン グ情報はその フ ォ ン ト を読み込む際に読み取 ら れます。 カーニ ン グが必要でない場合は、 PDF_load_font( ) で readkerning オプシ ョ ン を false に設定 し ます。 > テ キ ス ト 出力に対す る カーニ ン グは、テ キ ス ト 出力関数群が対応 し てい る kerning テ キ ス ト 書式オプシ ョ ン で有効にす る 必要があ り ます。 一時的にカーニ ン グ を無効にす る こ と がた と えばど んな と き に有用か と い う と 、数表を組 みたい と き に、カーニ ン グデー タ が数字ど う し のペア を含んでい る場合 と い う のが挙げ ら 154 第 6 章 : テキス ト 出力 れ ま す。 カ ー ニ ン グ さ れ た 数字は表内で き れい に並ばな い か ら です。 な お、 今 ど き の TrueType ・ OpenType フ ォ ン ト は こ の目的のための特殊な数字を含んでお り 、 こ れは等幅 数字レ イ ア ウ ト 機能 と オプシ ョ ン features={tnum} で利用で き ます。 カーニ ン グは、 ど の よ う な字間 ・ 単語間隔 ・ 横伸縮が指定 さ れていた と し て も 、 それ に加え て適用す る こ と がで き ます。 PDFlib では、 1 つの フ ォ ン ト 内のカーニ ン グペアの数 についてはま っ た く 無制限です。 カーニ ン グは、 フ ォ ン ト オプシ ョ ン readkerning と テ キ ス ト オプシ ョ ン kerning に よ っ て制御 さ れます。 デフ ォ ル ト ではカーニ ン グは有効にな っ てい ます。 6.2.3 テキス ト バ リ エーシ ョ ン 擬似ボール ド フ ォ ン ト PDFlib は、 個別のテ キ ス ト 文字列について、 fakebold オプシ ョ ン を通 じ て擬似的な ボール ド テ キ ス ト を作成す る 機構を サポー ト し てい ま す。 こ の方式 は、 グ リ フ の輪郭 を 描線す る こ と に よ っ て ボール ド フ ォ ン ト を 擬似表現 し て い ま す : Type 3 フ ォ ン ト の場合には、 テ キ ス ト が さ ま ざ ま な変位で複数回配置 さ れます。 強調のた めには本当のボール ド フ ォ ン ト を使用す る こ と を強 く 推奨 し ます。fakeboldオプシ ョ ンは、 本当のボール ド テ キ ス ト よ り も 劣 る テ キ ス ト 出力を作成 し ます し 、 ま た、 テ キ ス ト 抽出を 阻害す る おそれ も あ り ます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの fonts/simulated_fontstyles ト ピ ッ ク にあ り ま す。 注 fontstyle=bold[italic] フ ォ ン ト オプ シ ョ ン を使 う と 、 ある特定のフ ォ ン ト で作成 さ れる すべてのテキス ト について fakebold 擬似表現を強制する こ と がで き ます。 擬似斜体 フ ォ ン ト italicangle オプシ ョ ン を使っ て、 レ ギ ュ ラ ーフ ォ ン ト し か利用で き な い と き に イ タ リ ッ ク フ ォ ン ト の よ う な効果を出す こ と も で き ま す。 こ の方式は、 偽 イ タ リ ッ ク フ ォ ン ト を作成す る ために、 レ ギ ュ ラ ーフ ォ ン ト を ユーザーか ら 与え ら れた角度だ け傾け る も のです。 負の値でテ キ ス ト は右に傾 き ます。 も ち ろん、 本物の イ タ リ ッ ク や斜 体フ ォ ン ト を使っ たほ う がは る かに き れいな出力が得 ら れ る こ と を忘れてはいけ ません。 し か し イ タ リ ッ ク フ ォ ン ト が入手で き ない と き に italicangle オプシ ョ ン を使えば、簡単に 図 6.2 カ ーニ ング ࠞ࠾ࡦࠣߥߒ ࠞ࠾ࡦࠣㆡ↪ ࠞ࠾ࡦࠣߦࠃࠆᢥሼ⒖േ 6.2 フ ォ ン ト メ ト リ ッ ク と テキス ト バ リ エーシ ョ ン 155 そ れ に似 た 効果 を 出す こ と が で き ま す。 こ の機能は特に日中韓 フ ォ ン ト で便利です。 italicangle オプシ ョ ンの値は普通 -12 か ら -15 度の範囲です。 注 fontstyle=bold[italic] フ ォ ン ト オプ シ ョ ン を使 う と 、 ある特定の フ ォ ン ト で作成 さ れる すべてのテキス ト について fakebold 擬似表現を強制する こ と がで き ます。 注 PDFlib はグ リ フ 幅を、 斜体化 し たグ リ フ の新 し い外接枠には合わせません。 た と えばテキ ス ト を均等配置す る と き、 斜体化 し たグ リ フ ははめ こ み枠か ら はみ出す可能性があ り ま す。 影付 き テキス ト PDFlib は、 同 じ テ キ ス ト を場所を少 し ずつず ら し て複数個印字す る こ と に よ っ て影付 き 効果を作成す る こ と がで き ます。 影付き テ キ ス ト は PDF_fit_textline( ) ・ PDF_add/create_textflow( ) の shadow オプシ ョ ンで作成で き ます。 影の色や、 その主テ キ ス ト に対す る 相対位置、図形ス テー タ ス オプシ ョ ン群は、サブオプシ ョ ンで指定で き ます。 下線 ・ 上線 ・ 取 り 消 し 線付 き テキス ト PDFlib では、 テ キ ス ト の下や上や中央に線をひ く こ と がで き ます。 線幅やベース ラ イ ンか ら の間隔は、 フ ォ ン ト の メ ト リ ッ ク 情報に基づ いて計算 さ れます。 ま た、 横伸縮やテ キ ス ト マ ト リ ッ ク ス のカ レ ン ト 値 も 線幅の計算には 加味 さ れます。 下線 ・ 上線 ・ 取 り 消 し 線の有無を切 り 替え る には、 それぞれ PDF_set_text_ option( ) で underline ・ overline ・ strikeout オプシ ョ ン を、 ま たはテ キ ス ト 出力関数群でそ の照応す る オプシ ョ ン を オ ン オ フ し ます。 underlineposition ・ underlinewidth オプシ ョ ン を使っ て微調整 も で き ます。 線の色には strokecolor オプシ ョ ンが用い ら れます。 し か し 、 カ レ ン ト の linecap オプ シ ョ ンは無視 さ れ ます。 decorationabove オプシ ョ ンは、 線がテ キ ス ト の上 と 下のいずれ に引かれ る かを制御 し ます。 体裁上の注意 : 多 く の フ ォ ン ト では、 下線は文字のベース ラ イ ン よ り 下の部分 と ぶつかっ て し ま い、 ま た、 上線は文字の上の付加記号 と ぶつかっ て し ま い ます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の text_output/starter_textline ト ピ ッ ク にあ り ま す。 テキス ト 表現モー ド PDFlib は、 テ キ ス ト の見栄え を変更す る 表現モー ド にい く つか対 応 し てい ます。 こ れを用い る と 、 テ キ ス ト の輪郭を描いた り 、 テ キ ス ト を ク リ ッ ピ ン グパ ス と し て利用 し た り す る こ と がで き ます。 ま た、 テ キ ス ト を不可視にす る こ と も で き、 こ れはた と えば、 ス キ ャ ン画像の上にテ キ ス ト を乗せてテ キ ス ト 検索や索引生成を可能に し つつ、 テ キ ス ト 自体は隠す、 と いっ た活用がで き る で し ょ う 。 表現モー ド の一覧は PDFlib リ フ ァ レ ン スに挙げて あ り ます。 表現モー ド は、 textrendering オプシ ョ ンで設定す る こ と がで き ます。 テ キ ス ト を描線す る と 、 strokewidth ・ strokecolor と いっ たテ キ ス ト ス テー タ ス のオプ シ ョ ン群がグ リ フ の輪郭に適用 さ れます。 表現モー ド は、 Type 3 フ ォ ン ト を用いて印字 さ れ る テ キ ス ト には何の効果 も 持ち ません。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の text_output/text_as_clipping_path ・ text_ output/invisible_text ト ピ ッ ク にあ り ます。 テキス ト の色 テ キ ス ト は通常、 fillcolor オプシ ョ ンで指定 さ れた色で印字 さ れます。 塗 り 色は PDF_setcolor( ) を用いて設定で き ます。 ただ し 、 表現モー ド で 0 以外が選択 さ れて い る 時は、 その選択 さ れてい る 表現モー ド に よ っ て、 strokecolor と fillcolor はど ち ら も テ キ ス ト に対 し て効力を持ち ます。 156 第 6 章 : テキス ト 出力 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/starter_textline ト ピ ッ ク にあ り ま す。 6.2 フ ォ ン ト メ ト リ ッ ク と テキス ト バ リ エーシ ョ ン 157 6.3 OpenType レ イ ア ウ ト 機能 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の text_output/starter_opentype ト ピ ッ ク にあ り ま す。 6.3.1 対応 し てい る OpenType レ イ アウ ト 機能 PDFlib は、い く つかの フ ォ ン ト 内の追加情報に従っ た高度なテ キ ス ト 出力に対応 し てい ま す。 こ れ ら の フ ォ ン ト 拡張を OpenType レ イ ア ウ ト 機能 と いい ます。 た と えば、 フ ォ ン ト が liga 機能を含んでい る か も し れません。 こ の機能は、 f ・ f ・ i グ リ フは結合 し て合字を 形作れ る と い う 情報を含んでい ます。 他に よ く 利用 さ れ る 例 と し ては、 smcp 機能に よ る ス モールキ ャ ピ タ ル、 すなわち通常の大文字キ ャ ラ ク タ よ り も 小 さ な大文字キ ャ ラ ク タ や、 onum 機能に よ る オール ド ス タ イ ル数字、 すなわち アセ ン ダ と デ ィ セ ン ダ を持つ数字 (ベー ス ラ イ ン上にすべて配置 さ れ る 横並びの数字 と は異な る ) な ど が挙げ ら れ ます。 合 字は非常に広 く 利用 さ れ る OpenType 機能ではあ り ますが、 可能な何ダース も の機能の う ちの 1 つにすぎ ません。 OpenType 形式 と OpenType 機能テーブルに関す る あ ら ま し は下 記にあ り ます : www.microsoft.com/typography/developers/opentype/default.htm PDFlib は以下のグループの OpenType 機能に対応 し てい ます : > 表 6.1 に挙げ る 欧文 タ イ ポグ ラ フ ィ のための OpenType 機能群。 こ れ ら は features オプ シ ョ ン で司 ら れます。 > 表 6.6 に挙げ る 日本語 ・ 中国語 ・ 韓国語テ キ ス ト のための OpenType 機能群。 こ れ ら も features オプシ ョ ンで司 ら れますが、 詳 し く は 175 ページ 「6.5.3 OpenType レ イ ア ウ ト 機能 と 高度な日中韓テ キ ス ト 出力」 で解説 し ます。 > 複雑用字系のシ ェーピ ン グ と 縦書 き テ キ ス ト 出力のための OpenType 機能群。こ れ ら は shaping ・ script オプシ ョ ンに従っ て自動的に評価 さ れます (165 ページ 「6.4 複雑用字 系出力」 を参照)。 こ の vert 機能は vertical フ ォ ン ト オプシ ョ ンで司 ら れます。 > カーニ ン グのための OpenType機能テーブル群。ただ し 、PDFlib は kerning を OpenType機 能 と し ては扱い ません。 なぜな ら カーニ ン グデー タ は OpenType 機能テーブル以外の 手 段 で も 表 現 す る こ と が で き る か ら で す。 カ ー ニ ン グ を 制 御 す る の で は な く 、 readkerning フ ォ ン ト オプシ ョ ン と kerning テ キ ス ト オプシ ョ ン を用いて く だ さ い (154 ページ 「6.2.2 カーニ ン グ」 を参照)。 OpenType レ イ ア ウ ト 機能について詳 し い解説は以下にあ り ます : www.microsoft.com/typography/otspec/featuretags.htm OpenType 機能を見つけ る OpenType 機能テーブルを見つけ る には以下の ツールが使え ます : > FontLab フ ォ ン ト エデ ィ タ はフ ォ ン ト を作成 ・ 編集す る ためのアプ リ ケーシ ョ ンです。 その無償デモ版 (www.fontlab.com) は OpenType 機能を表示 し ます。 > DTL OTMaster Light (www.fonttools.org) はフ ォ ン ト を表示 ・ 分析す る ための無償ア プ リ ケーシ ョ ン であ り 、 OpenType 機能テーブル も 表示 ・ 分析で き ます。 > Microsoft の無償の 「font properties extension」1 (32 ビ ッ ト シ ス テ ム用のみ入手可能) は、 フ ォ ン ト 内で得 ら れ る OpenType 機能の リ ス ト を表示 し ます (図 6.3 参照)。 1. www.microsoft.com/typography/TrueTypeProperty21.mspx を参照。 158 第 6 章 : テキス ト 出力 > PDFlib の PDF_info_font( ) イ ン タ フ ェ ース を使っ て、対応 し てい る OpenType 機能を ク エ リ す る こ と も で き ます (164 ページ 「OpenType 機能をプ ロ グ ラ ム的に ク エ リ 」 を参照)。 6.3 OpenType レ イ アウ ト 機能 159 表 6.1 欧文 タ イ ポグ ラ フ ィ 用の対応 OpenType 機能 (日中韓テキス ト 用の OpenType 機能は表 6.6 に挙げます) キー ワー ド 名前 説明 _none 全機能無効 表 6.1 ・ 表 6.6 に挙げるすべての OpenType 機能を無効に。 afrc 別形式分数 ス ラ ッ シ ュ で区切られた数字群を別形式へ置き換え。 c2pc 大文字からのプ テ ィ ッ ト キャ ピ タ ル 大文字キ ャ ラ ク タ を プ テ ィ ッ ト キ ャ ピ タ ルに変え ます。 c2sc 大文字からのス モールキ ャ ピ タ ル 大文字キ ャ ラ ク タ を ス モールキ ャ ピ タ ルに変え ます。 case ケースセ ン シ テ ィ ブ字体 さ ま ざ ま な句読点を上へず ら し て、 全大文字シーケ ン スや横並び数字の集合 と の調 和を高めます。 また、 オール ド ス タ イル数字を横並び数字に変え ます。 dlig 随意合字 複数グ リ フのシーケ ン ス を、 タ イ ポグ ラ フ ィ 的観点から よ り 好ま し い 1 個のグ リ フ へ置き換え dnom 分母 ス ラ ッ シ ュの直後の数字を分母数字へ置き換え frac 分数 ス ラ ッ シ ュ で区切られた数字群を、 「通用の」 (斜め線に よ る) 分数へ置き換え hist 歴史的字体 デ フ ォル ト の (現行の) 字体を歴史的字体へ置き換え。 い く つかの字の字体は過去 には広 く 用い ら れていま し たが、 現在では時代遅れに見え ます。 hlig 歴史的合字 こ の機能はデ フ ォ ル ト の (現行の) 合字を歴史的合字へ置き換え ます。 liga 標準合字 複数グ リ フのシーケ ン ス を、 タ イ ポグ ラ フ ィ 的観点から よ り 好ま し い 1 個のグ リ フ へ置き換え lnum 横並び数字 数字を オール ド ス タ イルから デ フ ォ ル ト の横並び字体へ変え ます。 locl ロー カ ラ イ ズ字体 グ リ フのデ フ ォ ル ト 字体から ロー カ ラ イ ズ字体への置換を有効に し ます。 こ の機能 は script ・ language オプ シ ョ ン を必要 と し ます。 mgrk 数学ギ リ シ ャ 文字 ギ リ シ ャ 文字グ リ フの標準 タ イ ポグ ラ フ ィ 字体を、 その照応する、 数学的表記で広 く 用い ら れてい る字体へ置き換え。 numr 分子 ス ラ ッ シ ュの直前の数字を分子数字へ置き換え、 タ イ ポグ ラ フ ィ ス ラ ッ シ ュ を分数 ス ラ ッ シ ュへ置き換え。 onum オール ド ス タ イル 数字 数字を、 デ フ ォ ル ト の横並び形式か ら オール ド ス タ イル字体に変え ます。 ordn 序数 デ フ ォル ト のアルフ ァ ベ ッ ト グ リ フ を、 その照応する、 数字の後に用い る ための序 数字体へ置き換え。 通常、 Numero (U+2116) キ ャ ラ ク タ も作成 し ます。 ornm 飾 り 文字 ビ ュ レ ッ ト キ ャ ラ ク タ と ASCII キ ャ ラ ク タ 群を飾 り 文字へ置き換え。 pcap プテ ィ ッ ト キャ ピ タル 小文字キ ャ ラ ク タ を プ テ ィ ッ ト キ ャ ピ タ ルに、 すなわち通常のス モールキ ャ ッ プ よ り 背の低い大文字に変え ます。 pnum プ ロポーシ ョ ナル 数字 等幅 (表形式) 数字を、 プ ロポーシ ョ ナル幅を持つ数字へ置き換え。 salt ス タ イ リ ステ ィ ッ ク字体 デ フ ォル ト 字体を ス タ イ リ ス テ ィ ッ ク字体へ置き換え。 こ れら の異体字は、 スワ ッ シ ュや歴史的 と い っ た決ま っ た分類には必ず し も あてはま り ません。 sinf 科学的下付き 横並びまたはオール ド ス タ イル数字を、 主に化学や数学表記用の下付き数字 (よ り 小 さ なグ リ フ) へ置き換え。 smcp ス モールキ ャ ピ タ ル 小文字キ ャ ラ ク タ を ス モールキ ャ ピ タ ルに変え ます。 160 第 6 章 : テキス ト 出力 表 6.1 欧文 タ イ ポグ ラ フ ィ 用の対応 OpenType 機能 (日中韓テキス ト 用の OpenType 機能は表 6.6 に挙げます) キー ワー ド 名前 説明 ss01 ... ss20 ス タ イ リ ステ ィ ッ ク 集合 1 ~ 20 個々のグ リ フのス タ イ リ ス テ ィ ッ ク 字体 (salt 機能を参照) に加えて、 あ るいは それに替えて、 フ ォ ン ト によ っ ては、 その文字集合の 1 個ない し 複数の一部分に照 応する ス タ イ リ ス テ ィ ッ ク異体字グ リ フ群の集合を含んでいる ものがあ り ます。 例 : 欧文フ ォ ン ト 内の小文字に対 し て複数の異体字。 subs 下付き デ フ ォル ト グ リ フ を下付き グ リ フへ置き換え。 sups 上付き 横並びま たはオール ド ス タ イル数字を上付き数字へ置き換え (主に脚注表示用)、 小文字を上付き文字へ置き換え (主に フ ラ ン ス語敬称の省略形用)。 swsh スワ ッ シ ュ デ フ ォル ト グ リ フ を、 照応する スワ ッ シ ュ グ リ フ へ置き換え。 titl 見出 し 化 デ フ ォル ト グ リ フ を、 照応する、 見出 し 用にデザイ ン さ れた字体へ置き換え。 tnum 等幅数字 プ ロポーシ ョ ナル数字を等幅 (表形式) 数字へ置き換え。 unic ユニケース 大文字 と 小文字を、 小文字 と ス モールキ ャ ピ タ ル字体の混在する集合へマ ッ プ し て、 高 さ 一定のアルフ ァ ベ ッ ト に し ます。 zero ス ラ ッ シ ュ付きゼ ロ 数字ゼロに対するグ リ フ を、 中空部に斜め線を引いた字体へ置き換え。 6.3.2 テキス ト 行 ・ テキス ト フ ロ ーで OpenType レ イ ア ウ ト 機能 PDFlib は、 テ キ ス ト 行 ・ テ キ ス ト フ ロ ー関数群では OpenType レ イ ア ウ ト 機能に対応 し て い ますが、 PDF_show( ) 等の単純テ キ ス ト 出力関数群では対応 し てい ません。 OpenType レ イ ア ウ ト 機能のための要件 OpenType レ イ ア ウ ト 機能 と と も に使 う フ ォ ン ト は、 以下の要件を満たす必要があ り ます : > フ ォ ン ト は、 TrueType (*.ttf) ・ OpenType (*.otf) ・ TrueType コ レ ク シ ョ ン (*.ttc) フ ォ ン ト のいずれかであ る 必要があ り ます。 > フ ォ ン ト フ ァ イ ルは、テ キ ス ト 内で使いたい OpenType 機能に対す る対応ル ッ ク ア ッ プ を持つ GSUB テーブルを含んでい る 必要があ り ます (後述)。 > フ ォ ン ト は、encoding=unicode か glyphid で、ま たは Unicode CMap を指定 し て読み込む 必要があ り ます。 > PDF_load_font( ) の readfeatures オプシ ョ ンは false に設定す る必要があ り ます。 PDFlib は、 大半の GSUB テーブルル ッ ク ア ッ プ種別を持つ OpenType 機能に対応 し てい ま す。 カーニ ン グ を除 き 、 PDFlib は、 GPOS テーブルに基づ く OpenType 機能には対応 し て い ません。 注意 OpenType 機能を扱 う 際には以下に留意 し て く だ さ い : > OpenType 機能 (オプシ ョ ン features ・ script ・ language) は、 同一フ ォ ン ト 内のグ リ フ 群に対 し てのみ適用 さ れ ますので、 予備フ ォ ン ト を指定 し てい る 場合は、 ベース フ ォ ン ト と 1 個ない し 複数の予備フ ォ ン ト と にわた る グ リ フ群には適用 さ れません。 > 必ず、 必要な場面でそのつど各機能を有効 ・ 無効を切 り 替えて く だ さ い。 OpenType 機 能を う っ か り 全テ キ ス ト に対 し て有効な ま ま に し てお く と 、 予期 し ない結果が生 じ る こ と があ り ます。 6.3 OpenType レ イ アウ ト 機能 161 図 6.3 Microsoft の font property extension は フ ォ ン ト 内の OpenType 機能一覧を表示 し ます OpenType 機能の有効 ・ 無効を切 り 替え テ キ ス ト の部分部分に対 し て、 必要に応 じ て OpenType 機能 の 有効 と 無効 を 切 り 替 え る こ と が で き ま す。 機能 を 有効 に す る に は、 features テ キ ス ト オプシ ョ ン を用いてその名前を与え ます。 機能名の頭に no をつけ る と それを無効にで き ます。 た と えば、 テ キ ス ト フ ロ ーに対す る イ ン ラ イ ンオプシ ョ ン リ ス ト では機能制御は以下の よ う にな り ます : <features={liga}>ffi<features={noliga} テ キ ス ト 行に対 し ては OpenType 機能を以下の よ う に有効にで き ます : p.fit_textline("ffi", x, y, "features={liga}"); OpenType 機能は、 PDFlib Personalization Server (PPS) で利用す る ためのブ ロ ッ ク プ ロ パ テ ィ と し て有効にす る こ と も 可能です。 複数の機能 を 同一テ キ ス ト に対 し て適用す る こ と も 可能ですが、 フ ォ ン ト 内の機能 テーブル群が こ の状況に対 し て整備 さ れてい る 必要があ り 、かつその照応す る機能ル ッ ク ア ッ プを正 し い順序で含んでい る 必要があ り ます。 た と えば、 単語 office に対 し て合字機 能 (liga) と ス モールキ ャ ピ タ ル機能 (smcp) を適用する 場合を考え ます。 両方の機能を 有効にす る 場合 (その フ ォ ン ト が、 照応す る 機能エン ト リ 群を含んでい る こ と を前提 と し て) 、 ス モールキ ャ ピ タ ル機能が適用 さ れ、 合字機能は適用 さ れない こ と を期待す る と 思 い ます。 こ れがフ ォ ン ト のテーブル内に正 し く 実装 さ れてい る 場合は、 PDFlib は期待どお り の出力を生成 し ます。 すなわち合字な し で ス モールキ ャ ピ タ ルを適用 し ます。 制御キ ャ ラ ク タ で合字を無効に 言語に よ っ ては、 あ る 特定の状況では合字を使っ ては いけない も のがあ り ます。 ド イ ツ語な ど の言語におけ る タ イ ポグ ラ フ ィ 規則では、 複合語 162 第 6 章 : テキス ト 出力 の境界を ま た ぐ合字の使用を禁 じ てい ます。 た と えば f+i の組み合わせは、 単語 Schilfinsel 内では合字へ置 き 換え てはいけ ません。合成 さ れた 2 つの単語の境界を ま たいでい る か ら です。 先述の よ う に、 合字な ど の OpenType 機能の処理は、 features オプシ ョ ンで有効 ・ 無効 を切 り 替え る こ と がで き ます。上記の よ う な例外的場合のたびに合字を オプシ ョ ンで無効 に し てい く のは面倒です。 シ ンプルな合字制御を提供する ために、 テ キ ス ト 内の制御キ ャ ラ ク タ で合字を無効にす る 機能があ り ますので、 こ れを利用すれば、 機能の有効 ・ 無効を た く さ んのオプシ ョ ンで切 り 替え る 必要はな く な り ます。連続す る キ ャ ラ ク タ の間にゼロ 幅非接合子 (U+200C、 &zwnj。 表 6.4 も 参照) キ ャ ラ ク タ を挿入すれば、 合字が features オプ シ ョ ン で有効に し て あ っ て も 、 その箇所は合字へ置 き 換わ ら な く な り ま す。 た と え ば、 以下の コ ー ド は f+i 合字を作成 し ません : <features={liga charref=true}>Schilf‌insel 用字系 ・ 言語固有の OpenType レ イ アウ ト 機能 OpenType 機能は、 あ ら ゆ る場面で適用 さ れ る も の も あ り ます し 、 あ る 特定の用字系に対 し て実装 さ れてい る も の も あ り ます。 あ る 特定の用字系 と 言語 と の組み合わせに対 し て実装 さ れてい る も の も あ り ま す。 こ のた め、 features オプシ ョ ンに加え て script ・ language テ キ ス ト オプシ ョ ン を与え る こ と が可 能です。 こ れ ら が実効性を持つのは、 その機能が フ ォ ン ト 内で用字系ま たは言語に固有な 形で実装 さ れてい る 場合のみです。 た と えば、 f ・ i グ リ フ に対す る 合字は、 い く つかの フ ォ ン ト においては、 ト ル コ 語が 選ばれてい る と き には得 ら れません (なぜな ら ト ル コ 語では点のない i が頻出す る ため、 i の合字形はそれ と 混同 し やすいか ら です) 。 その よ う な フ ォ ン ト を用いてい る 場合に、 以 下のテ キ ス ト フ ロ ーオプシ ョ ンは、用字系 / 言語を一切指定 し ていないので合字を作成 し ます : <features={liga}>fi し か し 、 以下のテ キ ス ト フ ロ ーオプシ ョ ン リ ス ト は、 ト ル コ語オプシ ョ ンがあ る ので合字 を作成 し ません : <script=latn language=TRK features={liga}>fi locl 機能は、 明示的に言語固有のキ ャ ラ ク タ 字体を選択 し ます。 liga 機能は、 言語固有の 合字を含んでい ます。 言語固有機能のい く つかの例 : セルビア語用キャラクタ字体: <features={locl} script=cyrl language=SRB charref>б ウルドゥー語用数字字体: <features={locl} script=arab language=URD charref>٢٣٤٥ 使え る言語 ・ 用字系キーワー ド については 167 ページ 「6.4.2 用字系 と 言語」 を参照 し て く だ さ い。 OpenType 機能 と シ ェ ー ピ ン グ を組み合わせ 複雑用字系の シ ェ ー ピ ン グ (165 ページ 「6.4 複雑用字系出力」 を参照) は、 自動的に選ばれ る OpenType フ ォ ン ト 機能に大 き く 依 存 し てい ま す。 し か し 、 フ ォ ン ト に よ っ ては、 シ ェ ー ピ ン グ のために自動的に選ばれ る OpenType 機能を、 ク ラ イ ア ン ト アプ リ ケーシ ョ ンが選んだ OpenType 機能 と 組み合わせ る こ と が意味を持つ場合があ り ます。 PDFlib は、 まずユーザーが選んだ OpenType 機能を 6.3 OpenType レ イ アウ ト 機能 163 適用 し (オプシ ョ ン features)、 ついでシ ェ ーピ ン グ関連の機能を自動的に適用 し ます (オ プシ ョ ン shaping ・ script ・ language)。 OpenType 機能を プ ロ グ ラ ム的に ク エ リ フ ォ ン ト 内の OpenType 機能を PDF_info_font( ) で ク エ リ す る こ と がで き ま す。 以下の ス テー ト メ ン ト は、 フ ォ ン ト 内で得 ら れ る 、 かつ PDFlib が対応 し てい る すべての OpenType 機能を カ ン マで区切っ た リ ス ト を取得 し ます : result = (int) p.info_font(font, "featurelist", ""); if (result != -1) { /* スペース区切りされた機能リストを内容として持つ文字列を取得 */ featurelist = p.get_string(result, ""); } else { /* 対応機能は見つからなかった */ } あ る 特定の機能に PDFlib と 対象フ ォ ン ト が対応 し てい る か ど う かをチ ェ ッ ク す る には以 下の ス テー ト メ ン ト を用い ます。 こ の場合は合字 (liga) : result = (int) p.info_font(font, "feature", "name=liga"); if (result == 1) { /* 機能にフォントとPDFlibが対応している */ } 164 第 6 章 : テキス ト 出力 6.4 複雑用字系出力 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの scripts/starter_shaping ト ピ ッ ク にあ り ます。 6.4.1 複雑用字系 欧文用字系では基本的に左か ら 右へ、 1 つのキ ャ ラ ク タ の後に次のキ ャ ラ ク タ を置いてい き ます。 それ以外の書記系では、 正 し いテ キ ス ト 出力のためには追加の要請があ り ます。 こ の よ う な書記系を複雑用字系 と 呼ぶ こ と に し ます。 PDFlib は、 表 6.2 に挙げ る も のを含 む さ ま ざ ま な用字系に対 し て、 複雑用字系のためのテ キ ス ト 処理を実行 し ます。 こ の項では、複雑用字系におけ る シ ェーピ ン グについて詳 し く 解説 し ます。書記系 (用 字系) に よ っ ては追加の処理を必要 と す る も のがあ り ます : > ア ラ ビ ア文字 と ヘブ ラ イ 文字の用字系では、テ キ ス ト を右か ら 左へ置いてい き ます。混 合テ キ ス ト (ア ラ ビ ア文の中に欧文がは さ ま っ た) は、 右書 き の部分 と 左書 き の部分 の両方を含みます。 こ れ ら の部分は並べ替えの必要があ り 、 こ れを双方向 (Bidi) 問題 と いい ます。 > い く つかの用字系、 と り わけア ラ ビ ア文字では、 キ ャ ラ ク タ の位置 (単独、 語頭 / 語中 / 語尾) に よ っ て異な る キ ャ ラ ク タ 形状を用い ます。 > キ ャ ラ ク タ 列を必須合字へ置 き 換え ます。 > グ リ フ の位置を縦 ・ 横へ調整す る 必要があ り ます。 > イ ン ド 系用字系では、 い く つかのキ ャ ラ ク タ の並べ替えが必要です。 すなわち、 キ ャ ラ ク タ はテ キ ス ト 内での位置が変わ る こ と があ り ます。 > い く つかの用字系には、 特殊な単語境界 ・ 均等配置規則が適用 さ れます。 シ ェ ー ピ ン グ こ れ ら の処理ス テ ッ プ を1つない し 複数必要 と す る用字系を複雑用字系 と 呼びます。入力 さ れた論理テ キ ス ト か ら 正 し い表記を作 り 上げ る処理を シ ェーピ ン グ と い い ます ( こ の用語は並べ替え と 双方向処理を も 含んでい ます)。ユーザーはつねに、 シ ェー ピ ン グ さ れていない形で論理的順序のテ キ ス ト を与え、 それに対 し て PDFlib が、 必要な シ ェーピ ン グ を実行 し てか ら PDF 出力を生成 し ます。 複雑用字系のシ ェーピ ン グは、 shaping テ キ ス ト オプシ ョ ンで有効にで き ます。 こ のオ プシ ョ ンは script オプシ ョ ン を必要 と し 、 ま た、 language オプシ ョ ン を あわせて指定す る こ と も で き ま す。 以下のオプシ ョ ン リ ス ト はア ラ ビ ア文字のシ ェ ー ピ ン グ ( と 双方向処 理) を可能に し ます : shaping script=arab 注意 複雑用字系のシ ェーピ ン グ を扱 う 際には以下に留意 し て く だ さ い : > PDFlib は shaping・script オプシ ョ ン を自動的には設定せず、ユーザーがそれ ら を与え る と 前提 し てい ます。 > 用字系固有のシ ェーピ ン グ (オプシ ョ ン shaping ・ script ・ language) は、 同一フ ォ ン ト か ら のグ リ フ群に対 し てのみ適用 さ れ、 複数の フ ォ ン ト にわた る グ リ フ群には適用 さ れ ません。 予備フ ォ ン ト を使っ てい る 場合は、 シ ェ ーピ ン グは同一 (ベース ま たは予 備) フ ォ ン ト のテ キ ス ト 区間内でのみ適用 さ れます。 > シ ェ ーピ ン グはテ キ ス ト 内のキ ャ ラ ク タ の順番を変え る こ と があ り ますので、 単語内 の属性変更については注意を払 う 必要があ り ます。 た と えば、 テ キ ス ト フ ロ ー内で イ ン ラ イ ンオプシ ョ ン を用いて単語内の 2 番目のキ ャ ラ ク タ に色をつけ よ う と し てい る 場合に、シ ェーピ ン グが 1 番目 と 2 番目のキ ャ ラ ク タ を入れ替えた ら ど う な る ので し ょ う か。 こ の理由か ら 、 シ ェ ーピ ン グ さ れた テ キ ス ト の中での書式の変更は、 単語の途 中では行わずに、 単語の境界でのみ行 う 必要があ り ます。 6.4 複雑用字系出力 165 表 6.2 script オプ シ ョ ン に対する複雑用字系 と キーワー ド 用字系の名前 用字系指定な し - 用字系自動検出 - こ のキーワー ド は、 テキス ト 内のキ ャ ラ ク タ の 多数が属する用字系を選択 し ます。 その際、 _latn ・ _none は無視 さ れます。 _auto 欧州アル フ ァ ベ ッ ト 欧文 多 く の欧州な どの諸語 latn ギ リ シ ャ文字 ギ リ シ ャ語 grek キ リ ル文字 ロ シ ア語な ど多 く のス ラ ブ諸語 cyrl ア ラ ビ ア文字 ア ラ ビ ア語 ・ ペルシ ャ語 ( フ ァ ールシー) ・ ウル arab ド ゥ ー語 ・ パシ ュ ト ー語な ど ヘブ ラ イ文字 ヘブ ラ イ語 ・ イ デ ィ ッ シ ュ語な ど hebr シ リ ア文字 シ リ ア正教会 ・ マ ロ ン派 ・ ア ッ シ リ ア教会 syrc タ ーナ文字 デ ィ ベ ヒ 語 / モルデ ィ ブ thaa デーヴ ァ ナーガ リー ヒ ンデ ィ ー ・ 古典サン ス ク リ ッ ト deva ベン ガル文字 ベン ガル語 ・ ア ッ サム語 beng グルムキー文字 パン ジ ャ ーブ語 guru グジ ャ ラ ー ト 文字 グジ ャ ラ ー ト 語 gujr オ リ ヤー文字 オ リ ヤー語 / オ リ ッ サ orya タ ミ ル文字 タ ミ ル語 / タ ミ ルナー ド ゥ ・ ス リ ラ ン カ taml テルグ文字 テルグ語 / アーン ド ラ プ ラ デーシ ュ telu カ ンナダ文字 カ ンナダ語 / カルナー タ カ knda マ ラ ヤー ラ ム文字 マ ラ ヤー ラ ム語 / ケー ラ ラ mlym タ イ文字 タ イ語 thai ラ ーオ文字 ラ ーオ語 ク メ ール文字 ク メ ール語 (カ ンボジ ア語) khmr 漢字 中国語 ・ 日本語 ・ 韓国語 hani ひ ら がな 日本語 hira カ タ カナ 日本語 kana ハングル 韓国語 hang 中東 南ア ジ ア (イ ン ド ) 東南ア ジ ア 東ア ジ ア その他 _none 「lao 」1 OpenType 仕様に従っ たその他の 4 文字 コ ー ド も働き ますが、 対応 し ていません。 全一覧は 以下にあ り ます : www.microsoft.com/typography/developers/OpenType/scripttags.aspx 1. 末尾の空白キャラクタに注意。 166 言語 / 地域 (不完全な リ ス ト ) スク リプ ト キーワー ド 書記系 第 6 章 : テキス ト 出力 シ ェ ー ピ ン グのための要件 複雑用字系のシ ェ ーピ ン グ と と も に用い る ための フ ォ ン ト は、 対象用字系のグ リ フ群を含んでい る と い う こ と に加え て、 以下の要件を満た し てい る 必要があ り ます : > GDEF・GSUB・GPOS 機能テーブルを持ち、かつ、対象用字系に適合 し た正 し い Unicode マ ッ ピ ン グ を持つ TrueType ま たは OpenType フ ォ ン ト であ る必要があ り ます。 あ る い は こ う し た OpenType テーブルを持たずに、 ア ラ ビ ア文字 ・ ヘブ ラ イ 文字の場合は、 フ ォ ン ト が Unicode の表示形を含んでい る こ と も で き ます (Arabic Apple フ ォ ン ト 等は こ の方式で構築 さ れてい ます)。 こ の場合は内部テーブルがシ ェーピ ン グ処理に使われ ま す。 タ イ 文字テ キ ス ト については、 Microsoft ・ Apple ・ Monotype Worldtype (い く つ かの IBM 製品等で用い ら れてい ます) の タ イ 文字用規則に従っ た コ ン テ キ ス ト 依存字 体を フ ォ ン ト が含んでい る 必要があ り ます。 > フ ォ ン ト を encoding=unicode か glyphid で読み込む必要があ り ます。 > PDF_load_font( ) の vertical オプシ ョ ンは用いてはいけ ません。 ま た、 readshaping オプ シ ョ ン を false に設定 し てはいけ ません。 6.4.2 用字系 と 言語 用字系 と 言語は、 以下に挙げ る 機能面での役割を果た し ます。 こ れ ら は以下のオプシ ョ ン で制御で き ます : > script テ キ ス ト オプシ ョ ンは対象用字系 (書記系) を指定 し ます。表 6.2 に挙げた 4 文字 のキー ワー ド を使え ます。 例 : script=latn script=cyrl script=arab script=hebr script=deva script={lao } script=_auto にする と 、 PDFlib は、 テ キ ス ト 内のキ ャ ラ ク タ の多数が属す る 用字系を自 動的に割 り 当て ます。 欧文テ キ ス ト はシ ェ ーピ ン グ を必要 と し ませんので、 こ の用字 系を自動的に決定す る 際には考慮 さ れません。PDF_info_textline( ) の scriptlist キー ワー ド を使 う と 、 テ キ ス ト に対 し て用い ら れてい る 用字系を ク エ リ す る こ と がで き ます。 > language オプシ ョ ンは、テ キ ス ト が書かれてい る 自然言語を指定 し ます。表 6.2 に挙げ る 3 キ ャ ラ ク タ のキーワ ー ド が使え ます。 例 : language=ARA language=URD language=ZHS language=HIN 複雑用字系処理 複雑用字系処理 (オプシ ョ ン shaping) には script オプシ ョ ンが必要で す。 language オプシ ョ ン を追加で与え る こ と も で き ます。 こ れはシ ェ ーピ ン グの言語固 有の側面を制御 し ます。 た と えばア ラ ビ ア語 と ウ ル ド ゥ ー語で数字が別にな り ます。 し か し 、 言語固有用字系シ ェ ーピ ン グ テーブルを含むフ ォ ン ト はわずかですので、 多 く の場合 は script オプシ ョ ン を指定すれば充分であ り 、language オプシ ョ ン を指定 し て も シ ェーピ ン グは改善で き ません。 OpenType レ イ ア ウ ト 機能 フ ォ ン ト は、 OpenType レ イ ア ウ ト 機能を言語固有なや り 方 で実装す る こ と がで き ます (163 ページ 「用字系 ・ 言語固有の OpenType レ イ ア ウ ト 機能」 6.4 複雑用字系出力 167 を参照)。 若干の機能は、 script ・ language オプシ ョ ンに従っ て動作が変わ る こ と があ り ま すが、 こ れ ら のオプシ ョ ン な し で も 使え る のに対 し (liga 等)、 locl 機能は script ・ language オプシ ョ ン と 組み合わせてのみ意味を持ち ます。 注 テキス ト フ ローにおける高度な改行 (237 ページ 「8.2.9 高度な用字系固有の改行」 を参照) で も、 言語固有の処理が行われますが、 こ れは language オプ シ ョ ンによ っ て司 られるの ではな く 、 locale オ プ シ ョ ン に よ っ て司 ら れます。 locale オプ シ ョ ンは言語だけで な く 、 国 と 地域を も 特定する も のです。 表 6.3 language オプ シ ョ ンに対するキーワー ド キー ワー ド キー ワー ド 言語 キー ワー ド 言語 _none 言語指定な し FIN フ ィ ンラン ド語 NEP ネパール語 AFK ア フ リ カ ーン ス FRA フ ラ ン ス語 ORI オ リ ヤー語 SQI アルバニ ア語 GAE ゲール語 PAS パシ ュ ト ー語 ARA ア ラ ビ ア語 DEU ド イ ツ語 PLK ポー ラ ン ド 語 HYE アル メ ニ ア語 ELL ギ リ シ ャ語 PTG ポル ト ガル語 ASM ア ッ サム語 GUJ グジ ャ ラ ー ト 語 ROM ルーマニア語 EUQ バス ク語 HAU ハウサ語 RUS ロ シ ア語 BEL ベ ラ ルーシ語 IWR ヘブ ラ イ語 SAN サン ス ク リ ッ ト BEN ベン ガル語 HIN ヒ ンデ ィ ー SRB セルビ ア語 BGR ブルガ リ ア語 HUN ハン ガ リ ー語 SND シン ド語 CAT カ タ ルーニ ャ語 IND イ ン ド ネシ ア語 SNH シ ンハラ 語 CHE チ ェ チ ェ ン語 ITA イ タ リ ア語 SKY ス ロバキア語 ZHP 中国語注音符号 JAN 日本語 SLV ス ロベニア語 ZHS 中国語簡体字 KAN カ ンナダ語 ESP スペ イ ン語 ZHT 中国語繁体字 KSH カ シ ミ ール語 SVE スウ ェ ーデン語 COP コプ ト語 KHM ク メ ール語 SYR シ リ ア語 HRV ク ロ アチ ア語 KOK コ ン カ ニ語 TAM タ ミ ル語 CSY チ ェ コ語 KOR 韓国語 TEL テルグ語 DAN デン マー ク語 MLR 改正マ ラ ヤー ラ ム語 THA タ イ語 NLD オ ラ ン ダ語 MAL 伝統マ ラ ヤー ラ ム語 TIB チベ ッ ト 語 DZN ゾンカ MTS マル タ 語 TRK ト ル コ 語1 ENG 英語 MNI マニ プ リ 語 URD ウル ド ゥ ー語 ETI エ ス ト ニ ア語 MAR マ ラ ーテ ィ ー語 WEL ウ ェ ールズ語 FAR ペルシ ア語 MNG モ ン ゴル語 JII イ デ ィ ッ シ ュ語 言語 1. い く つかの フ ォ ン ト は ト ル コ 語に対 し て誤 っ て TUR を用いていますので、 PDFlib は こ の タ グ を TRK と 等価 と し て 扱います。 168 第 6 章 : テキス ト 出力 6.4.3 複雑用字系のシ ェ ー ピ ン グ シ ェーピ ン グ処理は、 キ ャ ラ ク タ が単語の先頭 ・ 途中 ・ 末尾ま たは単独位置のいずれにあ る かに よ っ て適切な グ リ フ字体を選択 し ます。シ ェ ーピ ン グは、ア ラ ビ ア文字・ ヒ ンデ ィ ー 文字テ キ ス ト 処理の不可欠な要素です。 シ ェ ーピ ン グは、 2 個以上のキ ャ ラ ク タ 列を適切 な合字へ置 き 換え る こ と も あ り ます。シ ェーピ ン グ処理は適切な キ ャ ラ ク タ 字体を自動的 に決定 し ますので、 明示的な合字 と Unicode の表示形 (例 : U+FB50 か ら 始ま る ア ラ ビ ア 文字表示形群 A) を入力キ ャ ラ ク タ と し て用いてはいけ ません。 複雑用字系は、1 つのキ ャ ラ ク タ に対 し て複数の異な る グ リ フ字体を必要 と し 、 かつ こ れ ら のグ リ フ を選択 し 配置す る ための追加の規則を要す る こ と か ら 、複雑用字系のシ ェー ピ ン グはあ ら ゆ る 種類の フ ォ ン ト で働 く わけではな く 、必要な情報を含んだ適当な フ ォ ン ト が必要です。 シ ェーピ ン グは、 必要な機能テーブルを含む TrueType ・ OpenType フ ォ ン ト で働 き ます (要件の詳細は 167 ページ 「シ ェーピ ン グのための要件」 を参照)。 シ ェーピ ン グは、同一フ ォ ン ト 内のキ ャ ラ ク タ 群に対 し てのみ行 う こ と がで き ます。な ぜな ら シ ェーピ ン グ情報は特定の フ ォ ン ト に固有の も のだか ら です。 た と えば、 複数の異 な る フ ォ ン ト にわた る 合字を形成す る こ と は意味があ り ませんので、複雑用字系のシ ェー ピ ン グは、複数の異な る フ ォ ン ト か ら のキ ャ ラ ク タ を含む単語には適用す る こ と がで き ま せん。 シ ェ ー ピ ン グ動作を オーバ ラ イ ド 場合に よ っ ては、 ユーザーがデフ ォ ル ト シ ェ ーピ ン グ動作 を オーバ ラ イ ド し た い こ と も あ り ま す。 PDFlib は こ の目的の た めにい く つかの Unicode 組版キ ャ ラ ク タ に対応 し てい ます。 利用の便宜のため、 こ れ ら の組版キ ャ ラ ク タ は実体で指定す る こ と も 可能です (表 6.4 参照)。 表 6.4 デ フ ォル ト シ ェ ーピ ン グ動作を オーバラ イ ド する ための Unicode 制御キ ャ ラ ク タ 組版 キャ ラ ク タ 実体名 Unicode 名 機能 U+200C ZWNJ ゼロ幅非接合子 隣 り 合 う 2 個のキ ャ ラ ク タ が続け字にな ら ない よ う に し ます U+200D ZWJ ゼロ幅接合子 隣 り 合 う 2 個のキ ャ ラ ク タ が続け字にな る よ う に し ます 6.4.4 双方向組版 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クのcomplex_scripts/bidi_formatting ト ピ ッ ク にあ り ます。 右書 き のテ キ ス ト (ア ラ ビ ア文字 ・ ヘブ ラ イ 文字をは じ め と する さ ま ざ ま な用字系) にお いては、 ア ド レ スや別言語に よ る 引用等で、 左書 き の欧文テ キ ス ト 列がネ ス ト さ れ る こ と が非常に頻繁にあ り ます。 こ の よ う な混在テ キ ス ト 列では双方向 (Bidi) 組版が必要にな り ます。 数字はつねに左書 き さ れますので、 双方向問題は、 全 く ア ラ ビ ア文字 ・ ヘブ ラ イ 文字だけで書かれた テ キ ス ト に も 生 じ ます。PDFlib は双方向テ キ ス ト 並べ替え を、Unicode 規格付録 #91 に示 さ れた Unicode 双方向アルゴ リ ズ ムに従っ て実装 し てい ます。 双方向処 理は、 オプシ ョ ン で有効にす る 必要はな く 、 右書 き のテ キ ス ト が適切な script オプシ ョ ン と と も に現れた際には、 シ ェーピ ン グ処理の一環 と し て自動的に適用 さ れます。 注 双方向処理は現在の と こ ろ、 複数行テキス ト フ ローでは対応 し てお ら ず、 テキス ト 行 (す なわち一行テキス ト 出力) でのみ対応 し ています。 1. www.unicode.org/unicode/reports/tr9/ を参照。 6.4 複雑用字系出力 169 双方向アルゴ リ ズム を オーバ ラ イ ド 自動双方向処理は多 く の場合において適切な結果 を与え ますが、 場合に よ っ ては明示的なユーザー制御が必要な こ と も あ り ます。 PDFlib で は こ の目的のためにい く つかの方向組版 コ ー ド に対応 し てい ます。 利用の便宜のため、 こ れ ら の組版キ ャ ラ ク タ は実体で指定する こ と も 可能です (表 6.5 参照)。 こ れ ら の双方向 組版コ ー ド は、以下の よ う な場合にデフ ォ ル ト の双方向アルゴ リ ズ ム を オーバ ラ イ ド す る のに有用です : > 右書 き の段落が左書 き のキ ャ ラ ク タ 群で始ま る場合。 > 混在テ キ ス ト 列がネ ス ト さ れてい る 場合。 > 左書 き テ キ ス ト と 右書 き テ キ ス ト と の間の境界に、 句読点等の弱いキ ャ ラ ク タ 群があ る 場合。 > 混在テ キ ス ト を含む製品番号等の場合。 表 6.5 双方向アルゴ リ ズムを オーバラ イ ド する ための方向組版 コ ー ド 組版 コ ー ド 実体名 Unicode 名 機能 U+202A LRE 左書き埋め込み (LRE) 埋め込み左書き列を開始 し ます U+202B RLE 右書き埋め込み (RLE) 埋め込み右書き列を開始 し ます U+200E LRM 左書き マー ク (LRM) 左書きのゼロ幅キ ャ ラ ク タ U+200F RLM 右書き マー ク (RLM) 右書きのゼロ幅キ ャ ラ ク タ U+202D LRO 左書き上書き (LRO) キ ャ ラ ク タ 群を強い左書き キ ャ ラ ク タ 群 と し て扱 う よ う 強制 U+202E RLO 右書き上書き (RLO) キ ャ ラ ク タ 群を強い右書き キ ャ ラ ク タ 群 と し て扱 う よ う 強制 U+202C PDF 方向組版ポ ッ プ (PDF) 直前の LRE ・ RLE ・ RLO ・ LRO の前の双 方向ス テー タ スへ復帰 右書 き文書処理の向上のためのオ プ シ ョ ン さ ま ざ ま な組版オプシ ョ ンや Acrobat の動 作のデフ ォ ル ト 設定は、 左書 き テ キ ス ト 出力に合わせて設定 さ れてい ます。 右書 き のテ キ ス ト 組版 と 文書表示のためには、 以下のオプシ ョ ン を用い ます : > テ キ ス ト 行を、 以下のはめ込みオプシ ョ ン で右揃えで配置 し ます : position={right center} > リ ーダ を、 テ キ ス ト と 左枠の間に作成 し ます : leader={alignment=left text=.} > PDF_begin/end_document( ) の以下のオプシ ョ ン を用いて、 Acrobat での右書き 文書 ・ ページ表示を改善 し ます : viewerpreferences={direction=r2l} コ ー ド 内で双方向テキス ト を扱 う 双方向テ キ ス ト を扱 う 際には以下 も 有用で し ょ う : > PDF_info_textline( ) の startx/starty・endx/endy キーワ ー ド を用い る と 、それぞれ論理的 開始 ・ 終了キ ャ ラ ク タ の座標を知 る こ と がで き ます。 > PDF_info_textline( ) の writingdirx キー ワー ド を用い る と 、テ キ ス ト の主流な書記方向を 知 る こ と がで き ます。 こ の方向は、 テ キ ス ト の先頭キ ャ ラ ク タ 群か ら 、 ま たは表 6.5 に 従っ た方向組版 コ ー ド (テ キ ス ト 内にあれば) か ら 推定 さ れます。 170 第 6 章 : テキス ト 出力 > PDF_info_textline( ) の position オプシ ョ ンで auto キーワー ド を用い る と 、自動的にア ラ ビ ア文字ま たはヘブ ラ イ 文字のテ キ ス ト は右枠へ、 欧文テ キ ス ト は左枠へ寄せ ら れ ま す。 た と えば以下のテ キ ス ト 行オプシ ョ ンは、 テ キ ス ト をベース ラ イ ン上に右寄せま たは左寄せ し ます : boxsize={width 0} position={auto bottom} 6.4.5 ア ラ ビ ア文字テキス ト 組版 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの complex_scripts/arabic_formatting ト ピ ッ ク にあ り ます。 上述の双方向組版 と テ キ ス ト のシ ェーピ ン グに加え、ア ラ ビ ア用字系のテ キ ス ト 出力の生 成に関 し ては、 ほかに も 組版上の側面がい く つかあ り ます。 ア ラ ビ ア合字 ア ラ ビ ア用字系は合字を多用 し ます。多 く のア ラ ビ ア文字フ ォ ン ト は 2 種 類の合字を含んでお り 、 それぞれ PDFlib では異な る 扱いを受け ます : > 必須合字 (rlig 機能) はつねに適用す る 必要があ り ます。 ラ ーム - ア リ フお よ びその派 生形等が こ れにあ た り ます。 必須合字は、 script=arab で shaping オプシ ョ ン を有効に し てい る 場合に用い ら れます。 > 任意ア ラ ビ ア合字 (liga ・ dlig 機能) は自動的には用い ら れず、 他のユーザー制御の OpenType 機能 と 同様に、 features={liga} で有効にす る こ と がで き ます。 任意ア ラ ビ ア 合字は、 複雑用字系処理 と シ ェーピ ン グの後に適用 さ れます。 ア ラ ビ ア文字テキス ト 内の欧文合字 テ キ ス ト 行では、 OpenType 機能の用字系固有処理 は予期 し ない結果を生み出す こ と があ り ます。 た と えば、 欧文合字は同一テ キ ス ト 行内で ア ラ ビ ア文字テ キ ス ト と 混在す る と 働 き ません。 その原因は、 テ キ ス ト 行の内容に対 し て は script オプシ ョ ン を一度 し か与え る こ と がで き ず、 それが shaping ・ feature オプシ ョ ン の両方に効力を持つか ら です : shaping script=arab features={liga} 誤り。多くのフォントでは働きません! し か し 、 ア ラ ビ ア文字フ ォ ン ト は通常、 欧文合字を、 ア ラ ビ ア用字系指定に対 し ては含ん でお ら ず、 デフ ォ ル ト ま たは欧文用字系に対 し てのみ含んでお り 、 し か し 1 つのテ キ ス ト 行の中で script オプシ ョ ンは変え る こ と がで き ません。 こ のため、 PDFlib は欧文合字を一 切見つけ る こ と がで き ずに、 プ レーン な キ ャ ラ ク タ を出力 し ます。 合字を さ せない あ る 種の略称等、場合に よ っ ては、隣 り 合 う キ ャ ラ ク タ を合字に さ せた く ない こ と があ り ます。 こ の場合には、 表 6.4 に挙げた組版キ ャ ラ ク タ を用いて、 合字を 強制 し た り 禁止 し た り す る こ と がで き ま す。 た と えば、 以下の例のゼ ロ 幅非結合子は、 キ ャ ラ ク タ が合字を形成す る こ と を禁止 し て、 正 し い略称表記を生成 し てい ます : أي&ZWNJ;بي&ZWNJ;إم ア ラ ビ ア文字テキス ト におけ る タ ト ウ ィ ール タ ト ウ ィ ールキ ャ ラ ク タ U+0640 (カ シー ダ と も い う ) を 1 個ない し 複数挿入す る こ と に よ っ て、 ア ラ ビ ア単語を引 き伸ばす こ と が で き ます。PDFlib は自動的に タ ト ウ ィ ールキ ャ ラ ク タ を挿入す る こ と に よ る テ キ ス ト の均 等揃えは行い ませんが、 こ のキ ャ ラ ク タ を自分で入力テ キ ス ト 内に挿入 し て単語を引 き伸 ばす こ と はで き ます。 6.4 複雑用字系出力 171 ア ラ ビ ア文字 フ ォ ン ト に欧文キ ャ ラ ク タ を追加 い く つか の ア ラ ビ ア 文字 フ ォ ン ト は、 欧文キ ャ ラ ク タ に対す る グ リ フ を一切含んでい ません。 OS X に同梱 し てい る ア ラ ビ ア文 字フ ォ ン ト 等が こ れにあ た り ます。 こ の場合は fallbackfonts オプシ ョ ン を使っ て、 欧文 キ ャ ラ ク タ を ア ラ ビ ア文字フ ォ ン ト に連結する こ と がで き ます。 PDFlib は、 欧文ま たはア ラ ビ ア文字のテ キ ス ト 入力に従っ て自動的に両フ ォ ン ト を切 り 替え ます。 すなわち、 アプ リ ケーシ ョ ン側で フ ォ ン ト を切 り 替え る 必要はな く 、欧文 と ア ラ ビ ア文字が混在す る テ キ ス ト を 1 個の フ ォ ン ト 指定で与え る こ と がで き ます。 fallbackfonts オプシ ョ ン に対 し て以下の フ ォ ン ト 読み込みオプシ ョ ン リ ス ト を用い る と 、 読み込んだア ラ ビ ア文字フ ォ ン ト へ Helvetica フ ォ ン ト か ら 欧文キ ャ ラ ク タ を追加す る こ と がで き ます : fallbackfonts={ {fontname=Helvetica encoding=unicode forcechars={U+0021-U+00FF}} } 172 第 6 章 : テキス ト 出力 6.5 日本語 ・ 中国語 ・ 韓国語テキス ト 出力 6.5.1 TrueType ・ OpenType 日中韓 フ ォ ン ト を用い る 注 PDFlib GmbH では、 MS ゴ シ ッ ク ・ MS 明朝フ ォ ン ト を www.pdflib.com で無償ダウン ロー ド 提供 し ています。 PDFlib の ラ イ セ ン ス を お持ちの方は これらのフ ォ ン ト を、 別途フ ォ ン ト ラ イ セ ン ス を得る必要な く 利用する権利を有 し ます。 PDFlib は、 TrueType ・ TrueType Collections (TTC) ・ OpenType 形式の日中韓フ ォ ン ト に対 応 し てい ます。 日中韓フ ォ ン ト は以下の よ う に処理 さ れます : > embedding オプシ ョ ンが true な ら ば、フ ォ ン ト は CID フ ォ ン ト に変換 さ れて、PDF 出力 に埋め込まれます。 > Windows 上の日中韓ホ ス ト フ ォ ン ト 名は、BOM 付き UTF-8 形式か UTF-16 形式で PDF_ load_font( ) に与え る こ と がで き ます。OS X では非欧文ホ ス ト フ ォ ン ト 名に対応 し てい ません。 以下の例では、 中国語テ キ ス ト を ArialUnicodeMS フ ォ ン ト で印字 し てい ます。 フ ォ ン ト は、 シ ス テ ムに イ ン ス ト ール さ れてい る か、 あ る いは 131 ページ 「5.4.4 フ ォ ン ト を検索」 に従っ て構成 さ れてい る 必要があ り ます : font = p.load_font("Arial Unicode MS", "unicode", ""); if (font == -1) { ... } p.setfont(font, 24); p.fit_textline("\u4e00\u500b\u4eba", x, y, ""); TrueType Collection (TTC) 内の個別 フ ォ ン ト にア ク セ ス TTC フ ァ イ ルは、 複数の別々の フ ォ ン ト を持っ てい ます。 各フ ォ ン ト を利用す る にはその適切な 名前を与え ます。 ただ し 、 TTC フ ァ イ ル内が ど の フ ォ ン ト を持っ てい る か を知 ら ない場合には、 各フ ォ ン ト を番号で指定す る こ と も 可能です。 具体的には、 コ ロ ン と フ ォ ン ト 番号 (0 か ら 始ま る ) を追加す る こ と に よ り 指定 し ます。 番 号が 0 の場合には省略可能です。 た と えば、 TTC フ ァ イ ル msgothic.ttc は複数の フ ォ ン ト を持っ てお り 、 PDF_load_font( ) で以下の よ う に指定す る こ と がで き ます (各行内の フ ォ ン ト 名は等価) : msgothic:0 msgothic:1 msgothic:2 MS Gothic MS PGothic MS UI Gothic msgothic: ただ し 、 msgothic (接尾辞をつけない) はフ ォ ン ト 名 と し ては扱われません。 なぜな ら そ れでは フ ォ ン ト を一意に特定で き ないか ら です。 フ ォ ン ト 名のエ イ リ ア ス (131 ページ 「フ ォ ン ト デー タ の ソ ース」 参照) を TTC 番号 と 組み合わせて用い る こ と も 可能です。 指 定 さ れた番号の フ ォ ン ト が見つか ら ない と き には、 関数呼び出 し は失敗 し ます。 TTC フ ォ ン ト フ ァ イ ルは 1 回のみ構成 し なければな り ません。 TTC フ ァ イ ル内のすべ ての番号づけ ら れた フ ォ ン ト は自動的に発見 さ れます。 以下に、 msgothic.ttc 内のすべて の番号づけ ら れた フ ォ ン ト を構成す る ために充分な コ ー ド を示 し ます (131 ページ 「5.4.4 フ ォ ン ト を検索」 参照) : p.set_parameter("FontOutline", "msgothic=msgothic.ttc"); 横書き と 縦書 き PDFlib は、 横書 き に も 縦書 き に も 対応 し てい ます。 縦書 き は さ ま ざ ま な方法で要求で き ます (ただ し Type 1 フ ォ ン ト では縦書き には対応 し てい ません) : 6.5 日本語 ・ 中国語 ・ 韓国語テキス ト 出力 173 > CMap 以外のエン コ ーデ ィ ン グ を持つ TrueType ・ OpenType フ ォ ン ト の場合は、 vertical オプシ ョ ン を与えれば縦書 き で利用で き ます。 > 「@」 キ ャ ラ ク タ で始ま る フ ォ ン ト 名はつねに縦書 き で処理 さ れます。 > 標準日中韓フ ォ ン ト ・ CMap については、 横書 き か縦書 き かは、 適切な CMap 名を選ぶ こ と に よ っ てエン コ ーデ ィ ン グ と と も に選択 さ れます。 CMap 名の末尾が -H な ら 横書 き が選択 さ れ、 -V な ら 縦書 き が選択 さ れます。 注 字間は縦書き では負の値でなければな り ません。 こ れは、 文字を 1 個ずつ印字 し ては戻る ためです。 6.5.2 EUDC ・ SING フ ォ ン ト に よ る外字キ ャ ラ ク タ PDFlib は、日中韓テ キ ス ト のためのカ ス タ ム外字キ ャ ラ ク タ を利用で き る Windows EUDC (エン ド ユーザー定義キ ャ ラ ク タ 、 *.tte) ・ SING フ ォ ン ト (*.gai) に対応 し てい ます。 最 も 便利なのは、カ ス タ ム キ ャ ラ ク タ を持っ た フ ォ ン ト を予備フ ォ ン ト 機構で他の フ ォ ン ト へ 統合する こ と で し ょ う 。 外字キ ャ ラ ク タ は多 く の場合、 EUDC ま たは SING フ ォ ン ト で提 供 さ れます。 外字キ ャ ラ ク タ に対 し て予備 フ ォ ン ト を用い る 通常、外字キ ャ ラ ク タ は Windows EUDC ま たは SING グ リ フ レ ッ ト か ら 持っ て来ますが、 fallbackfonts オプシ ョ ンはあ ら ゆ る 種類 の フ ォ ン ト を受け付け ます。 ですので こ の方法は外字キ ャ ラ ク タ に限 ら ず、 あ ら ゆ る種類 の記号に対 し て利用す る こ と がで き ま す (例 : 企業 ロ ゴ が別 フ ォ ン ト 内に あ る 場合) 。 fallbackfonts オプシ ョ ンに対 し て以下の フ ォ ン ト 読み込みオプシ ョ ン を用いれば、 読み込 んだ フ ォ ン ト に対 し て、 EUDC フ ォ ン ト か ら のユーザー定義 (外字) キ ャ ラ ク タ を追加す る こ と がで き ます : fallbackfonts={ {fontname=EUDC encoding=unicode forcechars=U+E000 fontsize=140% textrise=-20%} } ベース フ ォ ン ト をひ と たび こ の予備フ ォ ン ト 構成で読み込めば、テ キ ス ト 内の EUDC キ ャ ラ ク タ は、 フ ォ ン ト を変え る 必要な く 使 う こ と がで き ます。 SING フ ォ ン ト の場合、 Unicode 値は PDFlib に よ っ て自動的に決定 さ れますので、 与え る 必要はあ り ません : fallbackfonts={ {fontname=PDFlibWing encoding=unicode forcechars=gaiji} } EUDC フ ォ ン ト を用意 Windows で得 ら れ る EUDC エデ ィ タ を利用す る と 、PDFlib で使 う カ ス タ ム キ ャ ラ ク タ を作成す る こ と がで き ます。 以下の よ う に操作 し ます : > eudcedit.exe を使っ て、1 個ない し 複数のカ ス タ ム キ ャ ラ ク タ を、望む Unicode 位置に作 成 し ます。 > デ ィ レ ク ト リ \Windows\fonts 内で EUDC.TTE フ ァ イ ルを見つけ、それを ど こ か別のデ ィ レ ク ト リ へ コ ピー し ます。 こ の フ ァ イ ルは Windows Explorer では不可視ですので、DOS ボ ッ ク ス内で dir ・ copy コ マ ン ド を用いて フ ァ イ ルを見つけ ます。 そ し て こ の フ ォ ン ト を PDFlib で利用で き る よ う 、 131 ページ 「5.4.4 フ ォ ン ト を検索」 で示 し た方式のいず れかで構成 し ます : p.set_option("FontOutline={EUDC=EUDC.TTE}"); p.set_option("SearchPath={{...ディレクトリ名...}}"); 174 第 6 章 : テキス ト 出力 ま たは EUDC.TTE を カ レ ン ト デ ィ レ ク ト リ 内に置 き ます。 あ る いは、 こ の よ う に明示的に フ ォ ン ト フ ァ イ ル構成をす る のではな く 、 以下の関数 呼び出 し を用いて、 Windows デ ィ レ ク ト リ か ら 直接フ ォ ン ト フ ァ イ ルを構成す る こ と も で き ます。 こ う す る と 、 Windows 内で用い ら れてい る カ レ ン ト EUDC フ ォ ン ト をつ ねに利用す る こ と にな り ます : p.set_option("FontOutline={EUDC=C:\Windows\fonts\EUDC.TTE}"); > EUDC フ ォ ン ト を、任意のベース フ ォ ン ト に対 し て、先述の よ う にfallbackfontsオプシ ョ ン を用いて統合 し ます。 フ ォ ン ト を直接利用 し たい場合は、 以下の呼び出 し を用いて フ ォ ン ト を通常どお り に PDFlib へ読み込みます : font = p.load_font("EUDC", "unicode", ""); そ し て最初の ス テ ッ プで選んだ Unicode 値を与えて キ ャ ラ ク タ を出力 し ます。 6.5.3 OpenType レ イ ア ウ ト 機能 と 高度な日中韓テキス ト 出力 158 ページ 「6.3 OpenType レ イ ア ウ ト 機能」 で解説 し た よ う に、 PDFlib は OpenType ・ TrueType フ ォ ン ト 内の高度な タ イ ポグ ラ フ ィ レ イ ア ウ ト テーブルに対応 し てい ます。 た と えば、 OpenType 機能を用いて、 欧文グ リ フ のプ ロ ポーシ ョ ナル幅か半角かいずれかの 字体を選択 し た り 、 異体字を選択 し た り す る こ と が可能です。 表 6.6 に、 日中韓テ キ ス ト 出力のための OpenType 機能を挙げます。 vert 機能 (縦書 き ) は、 縦書 き の フ ォ ン ト (すなわち、 PDF_load_font( ) に vertical オ プシ ョ ン を与え ていた場合) に対 し ては自動的に有効にな り 、 横書 き の フ ォ ン ト に対 し て は無効にな り ます。 表 6.6 日本語 ・ 中国語 ・ 韓国語テキス ト 用の対応 OpenType レ イ アウ ト 機能 ( こ れに加えて表 6.1 に、 一般的利用 のための OpenType レ イ アウ ト 機能を挙げています) キー ワー ド 名前 説明 expt エキスパー ト 字形 JIS78 字 と 同様、 こ の機能は、 標準の和文字形を、 照応する、 タ イ ポグ ラ フ ァ ーが 望む字形へ置き換え ます。 fwid 全角 他の幅に設定 さ れたグ リ フ を、 全角 (たいていは em) に設定 さ れたグ リ フ へ置き 換え。 これは欧文キ ャ ラ ク タ や さ ま ざ ま な記号を含む可能性があ り ます。 hkna 横組み用仮名 標準の仮名を、 横書き専用に特にデザイ ン さ れた字形へ置き換え。 hngl ハングル 韓文漢字キ ャ ラ ク タ を、 その照応するハングル (音素) キ ャ ラ ク タ へ置き換え。 hojo 補助漢字字形 (JIS X 0212-1990) JIS X 0213:2004 字形がデ フ ォル ト と し て エ ン コ ー ド さ れている場合に、 JIS X 02121990 字形 (「補助漢字」 と も いいます) を利用。 hwid 半角 プ ロポーシ ョ ナル幅の、 または em の半分以外の等幅のグ リ フ を、 em の半分 (en) の幅のグ リ フへ置き換え。 ital イタリック ローマ ン体のグ リ フ を、 その照応する イ タ リ ッ ク 体のグ リ フへ置き換え。 jp04 JIS2004 字形 (nlck 機能の部分集合) JIS X 0213:2004 グ リ フ を利用。 jp78 JIS78 字形 デ フ ォル ト (JIS90) の和文グ リ フ を、 その照応する JIS C 6226-1978 (JIS78) の字 形へ置き換え。 jp83 JIS83 字形 デ フ ォル ト (JIS90) の和文グ リ フ を、 その照応する JIS X 0208-1983 (JIS83) の字 形へ置き換え。 6.5 日本語 ・ 中国語 ・ 韓国語テキス ト 出力 175 表 6.6 日本語 ・ 中国語 ・ 韓国語テキス ト 用の対応 OpenType レ イ アウ ト 機能 ( こ れに加えて表 6.1 に、 一般的利用 のための OpenType レ イ アウ ト 機能を挙げています) キー ワー ド 名前 説明 jp90 JIS90 字形 JIS78 または JIS83 の和文グ リ フ を、 その照応する JIS X 0208-1990 (JIS90) の字 形へ置き換え。 locl ロー カ ラ イ ズ字形 グ リ フのロー カ ラ イ ズ さ れた字形で、 デ フ ォ ル ト 字形を置き換え る こ と を可能に し ます。 こ の機能は script ・ language オプ シ ョ ン を必要 と し ます。 nalt 修飾字形 デ フ ォル ト のグ リ フ を、 さ ま ざ ま な表記字形へ置き換え (白丸囲み ・ 黒丸囲み ・ 四 角囲み ・ 括弧付き ・ 菱形囲み ・ 角丸四角囲み等)。 nlck 国語審議会漢字字 形 日本の国語審議会 (NLC) が多 く の JIS キ ャ ラ ク タ に対 し て 2000 年に制定 し た新 たなグ リ フ形状を利用。 pkna プ ロポーシ ョ ナル 仮名 等幅 (半角ま たは全角) に設定 さ れた仮名お よび仮名関連のグ リ フ を、 プ ロポー シ ョ ナルなグ リ フへ置き換え。 pwid プ ロポーシ ョ ナル グリ フ 等幅 (通常、 全角ま たは em の半分) に設定 さ れたグ リ フ を、 プ ロポーシ ョ ナルな 字送 り のグ リ フ へ置き換え。 qwid 4 分の 1 幅 他の幅のグ リ フ を、 em の 4 分の 1 (en の半分) の幅に設定 さ れたグ リ フへ置き換 え。 ruby ルビ表記字形 デ フ ォル ト の仮名グ リ フ を、 (通常、 上付き に さ れた) ルビ用にデザイ ン さ れた、 よ り 小 さ いグ リ フへ置き換え。 smpl 簡体字 和文漢字または中文繁体字を、 その照応する簡体字へ置き換え。 tnam 名前旧字体 和文新字体を、 その照応する旧字体へ置き換え。 こ れは trad 機能 と 等価ですが、 ただ し 個人の名前におけ る使用が適切であ る と 認め られる旧字体に限 られます。 trad 旧字体 和文漢字または中文簡体字を、 その照応する旧字体 / 繁体字へ置き換え。 twid 3 分の 1 幅 他の幅のグ リ フ を、 em の 3 分の 1 の幅に設定 さ れたグ リ フへ置き換え。 vert 縦組み デ フ ォル ト の字形を、 縦書き用に調整 さ れた異体字へ置き換え。 vkna 縦組み用仮名 標準の仮名を、 縦書き専用に特にデザイ ン さ れた字形へ置き換え。 vrt2 縦組み異体字 ・ 回 転 (vrt2 機能の部分集合であ る vert 機能を オーバラ イ ド ) 等幅 (半角 ・ 全角 ・ 4 分の 1 幅のいずれか) またはプ ロポーシ ョ ナル幅 (多 く は欧文またはカ タ カ ナ) のグ リ フ を、 縦書き に適 し た字形へ置き換え (すなわち、 90° 時計回 り に回転)。 176 第 6 章 : テキス ト 出力 6.5.4 Unicode 異体字セ レ ク タ と 異体字シーケ ン ス Unicode キ ャ ラ ク タ は、 さ ま ざ ま な グ リ フ で表現 さ れ る こ と がで き ます。 通常、 そ う し た 視覚的差異は、 適切な フ ォ ン ト (レ ギ ュ ラ ーか イ タ リ ッ ク か等) を用いて実現 さ れ ます。 場面に よ っ ては、 グ リ フ の選択がセマ ン テ ィ ッ ク に意味を持ち、 フ ォ ン ト 関連の組版情報 一切な し でプ レーン テ キ ス ト 内で も それを明確にす る 必要があ り ます。 Unicode は、 こ の 目的のための異体字セ レ ク タ と い う 機構を提供 し てい ます。 異体字シーケ ン ス 異体字シーケ ン スは、 ベース Unicode キ ャ ラ ク タ 1 個 と 、 後続す る 異 体字セ レ ク タ 1 個 と か ら 成 り ます。 こ のシーケ ン ス を、 そのベース キ ャ ラ ク タ の異体字 と いい ます。 Unicode 規格は 2 種類のシーケ ン ス か ら 成っ てい ます : > 標準化異体字シーケ ン ス : Unicode キ ャ ラ ク タ デー タ ベース内の フ ァ イ ル StandardizedVariants.txt1 内で定義 さ れてい ます。 範囲 U+FE00 ~ U+FE0F 内の 16 種の 異体字セ レ ク タ の う ちの一つを使用 し ます。 標準化異体字シーケ ン ス は、 数学グ リ フ の字体 と 、 絵文字の異体字、 モン ゴル文字テ キ ス ト を選択す る ために用い ら れます。 > 表意文字異体字シーケ ン ス (IVS) : Unicode Technical Standard #37 「Unicode Ideographic Variation Database」 に従っ た登録プ ロ セ ス に よ っ て定義 さ れてお り 、 表意文字異体字 デー タ ベース 2 内に リ ス ト さ れてい ます。 IVS は、 ベース キ ャ ラ ク タ と し ての統一表意 文字キ ャ ラ ク タ 1 個 と 、 範囲 U+E0100 ~ U+E01EF 内の 240 種の異体字セ レ ク タ の う ち の一つか ら 成 り ます。 その フ ォ ン ト が、 必要な グ リ フ を含んでいないな ど の原因で、 ベース キ ャ ラ ク タ に対す る 異体字セ レ ク タ に従え ない場合、 それは無視 さ れます。 PDFlib で異体字グ リ フ を作成 Unicode 異体字シーケ ン ス (UVS) に対す る適切な グ リ フ は、 フ ォ ン ト に よ っ て提供 さ れ る 必要があ り ます。 現状では OpenType が唯一、 UVS を格 納可能な フ ォ ン ト 形式です。 (フ ォ ーマ ッ ト 14 cmap テーブル を 用い て) 。 PDFlib は、 OpenType フ ォ ン ト 内の UVS テーブルを解釈 し ます。 ただ し 、 こ れが readselectors フ ォ ン ト オプシ ョ ンで無効に さ れてい る 場合は除 き ます。 フ ォ ン ト は内容文字列に対 し てのみ利 用可能であ り 、 ハ イ パーテ キ ス ト ・ 名前文字列に対 し てはそ う ではあ り ませんので、 こ れ ら の文字列種別に対 し ては異体字セ レ ク タ は無視 さ れます。 フ ォ ン ト が、 必要な グ リ フ を含んでい る こ と がわか っ てい る 場合には、 異体字シーケ ン ス に対す る 作業は、 単に PDFlib のテ キ ス ト 出力関数にそのシーケ ン ス を与えればすみ ます。 以下の コ ー ド 断片は、 Unicode ベース キ ャ ラ ク タ のデフ ォ ル ト グ リ フ と 、 セ レ ク タ に よ っ て選択 さ れた異体字を印字 し ます : p.fit_textline("≨ ≨︀", 50, 700, "fontname={Cambria Math} encoding=unicode fontsize=24 charref=true"); p.fit_textline("㐂󠄀 㐂󠄁", 50, 650, "fontname={KozMinPr6N-Regular} encoding=unicode fontsize=24 charref=true"); 得 ら れ る 出力を図 6.4 に示 し ます : 各グ リ フペアの中の違いに留意 し て く だ さ い。 注 異体字シーケ ン スは、 fallbackfonts オプ シ ョ ンの forcechars サブオプ シ ョ ン では対応 し ていません。 フ ォ ン ト 内の異体字セ レ ク タ を ク エ リ PDF_info_font( ) を使っ て、 フ ォ ン ト がそ も そ も 異体字セ レ ク タ を含んでい る のか ど う か を チ ェ ッ ク す る こ と も で き ま す。 selector キー 1. www.unicode.org/Public/UNIDATA/StandardizedVariants.html 参照 2. www.unicode.org/ivd 参照 6.5 日本語 ・ 中国語 ・ 韓国語テキス ト 出力 177 図 6.4 デ フ ォル ト グ リ フ と 異体字グ リ フ ワ ー ド を index オプシ ョ ン と と も に用いれば、 その フ ォ ン ト 内で得 ら れ るすべての異体字 セ レ ク タ の一覧を取得す る こ と がで き ます : for (i = 0; i < 256; i++) { selectors[i] = (int) p.info_font(font, "selector", "index=" + i); if (selectors[i] == -1) { selectorcount = i; break; } } 以下の コ ー ド 断片を使 う と 、 その フ ォ ン ト が、 特定のシーケ ン ス に対す る異体字グ リ フ を 含んでい る か ど う かをチ ェ ッ ク で き ます : if (p.info_font(font, "unicode", "unicode=" + uv + "selector=" + s) == -1) { /* このシーケンスに対してそのフォント内で得られる異体字グリフはない */ } こ の ク エ リ は、 異体字が得 ら れ る か ど う か をチ ェ ッ ク す る こ と だけ を意図 し てい ます。 得 ら れ る Unicode 自体は、 PDFlib は異体字に PUA Unicode 値を割 り 当て ますので、 おそ ら く 有用ではないで し ょ う 。 6.5.5 標準日中韓 フ ォ ン ト 注 標準日中韓フ ォ ン ト と い う 概念は非推奨です。 外部的に構成 さ れた フ ォ ン ト を、 埋め込み あ り またはな し で、 かわ り に使用 し て く だ さ い。 Acrobat は、日中韓フ ォ ン ト 用の さ ま ざ ま な標準フ ォ ン ト に対応 し てい ます。こ う し た フ ォ ン ト は、 Acrobat の イ ン ス ト ール と と も に提供 さ れ、 PDF フ ァ イ ルに埋め込む必要があ り ません。 標準日中韓フ ォ ン ト は、 縦書 き と 横書 き に対応 し てい ます。 標準日中韓フ ォ ン ト の名前の一覧を、 適用可能な CMap と と も に表 6.7 に示 し ます (日中韓 CMap についての 詳細は 106 ページ 「4.5 日本語 ・ 中国語 ・ 韓国語エン コ ーデ ィ ン グ」 参照)。 表 6.7 日本語 ・ 中国語 ・ 韓国語テキス ト 用の Acrobat の標準フ ォ ン ト ・ CMap (エ ン コ ーデ ィ ング) ロ ケール フォン ト名 対応 CMap (エ ン コ ーデ ィ ング) 日本語 KozMinPro-Regular-Acro1 KozGoPro-Medium2 KozMinProVI-Regular2 83pv-RKSJ-H, 90ms-RKSJ-H, 90ms-RKSJ-V, 90msp-RKSJ-H, 90mspRKSJ-V, 90pv-RKSJ-H, Add-RKSJ-H, Add-RKSJ-V, EUC- H, EUC-V, Ext-RKSJ-H, Ext-RKSJ-V, H, V, UniJIS-UCS2-H, UniJIS-UCS2-V, UniJIS-UCS2-HW-H1, UniJIS-UCS2-HW-V1, UniJIS-UTF16-H3 , UniJISUTF16-V3 178 第 6 章 : テキス ト 出力 表 6.7 日本語 ・ 中国語 ・ 韓国語テキス ト 用の Acrobat の標準 フ ォ ン ト ・ CMap (エ ン コ ーデ ィ ング) ロ ケール フォン ト名 対応 CMap (エ ン コ ーデ ィ ング) 2 中国語 簡体字 AdobeSongStd-Light GB-EUC-H, GB-EUC-V, GBpc-EUC-H, GBpc-EUC-V, GBK- EUC- H, GBK-EUC-V, GBKp-EUC-H, GBKp-EUC-V, GBK2K-H, GBK2K-V, UniGBUCS2-H, UniGB-UCS2-V, UniGB-UTF16-H3, UniGB-UTF16-V3 中国語 繁体字 AdobeMingStd-Light2 B5pc-H, B5pc-V, HKscs-B5-H, HKscs-B5-V, ETen-B5-H, ETen-B5-V, ETenms-B5-H, ETenms-B5-V, CNS-EUC-H, CNS-EUC-V, UniCNSUCS2-H, UniCNS-UCS2-V, UniCNS-UTF16-H3, UniCNS-UTF16-V3 韓国語 AdobeMyungjoStd-Medium2 KSC-EUC-H, KSC-EUC-V, KSCms-UHC-H, KSCms-UHC-V, KSCmsUHC-HW-H, KSCms-UHC-HW-V, KSCpc-EUC-H, UniKS-UCS2-H, UniKS-UCS2-V, UniKS-UTF16-H3, UniKS-UTF16-V3 1. HW CMap 群は、 KozMinPro-Regular-Acro ・ KozGoPro-Medium-Acro フ ォ ン ト に対 し ては用いる こ と はで き ません。 なぜな ら こ れ ら の フ ォ ン ト にはプ ロ ポーシ ョ ナル ASCII キ ャ ラ ク タ し かな く 、 半角文字がないためです。 2. PDF 1.6 以上を生成する と きのみ利用可能 3. PDF 1.5 以上を生成する と きのみ利用可能 ネ イ テ ィ ブ な日中韓レ ガ シ コ ー ド を保持 keepnative=true の場合には、選択 さ れた CMap に従っ たネ イ テ ィ ブな レ ガシ キ ャ ラ ク タ コ ー ド (Shift-JIS 等) が PDF 出力へ書 き 込まれま す。 そ う でなければテ キ ス ト は Unicode へ変換 さ れます。 keepnative=true の利点は、 その よ う な フ ォ ン ト は埋め込みな し で フ ォーム フ ィ ール ド で使え る こ と です (keepnative フ ォ ン ト 読 み 込 み オ プ シ ョ ン の 説 明 は PDFlib リ フ ァ レ ン ス を 参照 し て く だ さ い) 。 keepnative=false の場合には、 レ ガシ コー ド 列は CID 値へ変換 さ れた う えで PDF 出力へ書 き込まれます。 その利点は、 OpenType 機能 と テ キ ス ト フ ロ ー組版機能が利用で き る こ と です。 Acrobat での微妙な問題を回避する ために、 フ ォ ン ト 埋め込みをす る つ も り がない と き は keepnative=false と 設定す る こ と 、ま た、keepnative=true と し たい と き は embedding=true と 設定す る こ と を推奨 し ます。 6.5 日本語 ・ 中国語 ・ 韓国語テキス ト 出力 179 180 第 6 章 : テキス ト 出力 7 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む 7.1 ラ ス タ 画像 7.1.1 基本的な画像処理 PDFlib で ラ ス タ 画像を貼 り 付け る のは簡単です。 まず、 その画像を PDFlib 関数で開 く 必 要があ り ます。 こ の関数は、 画像特性を解析 し て ピ ク セルデー タ を PDF 出力へ コ ピー し ま す。 PDF_load_image( ) は、 画像記述子の役割をす る ハン ド ルを返 し ます。 こ のハン ド ルを使っ て PDF_fit_image( ) を呼び出す こ と がで き る ので、 その際に位置付け ・ 拡縮引数 も 与え ます : image = p.load_image("auto", "image.jpg", ""); if (image == -1) throw new Exception("エラー:" + p.get_errmsg()); p.fit_image(image, 0.0, 0.0, ""); p.close_image(image); PDF_fit_image( ) の最後の引数は、 画像の位置付け ・ 拡縮 ・ 回転を指定で き る さ ま ざ ま な オプシ ョ ン を持たせ る こ と ので き る オプシ ョ ン リ ス ト です。 こ のオプシ ョ ン群については 205 ページ 「7.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置」 で詳 し く 説明 し ます。 ク ッ ク ブ ッ ク 画像処理のための コ ー ド サン プルが PDFlib ク ッ ク ブ ッ クの images カ テ ゴ リ にあ り ます。 画像デー タ を再利用 ラ ス タ 画像の反復利用のための重要な PDF 最適化技法に PDFlib は 対応 し てい ます。 複数のページに同 じ ロ ゴや背景を使 う レ イ ア ウ ト を考え てみま し ょ う 。 その よ う な場合には画像デー タ 本体は一度 し か PDF 内に取 り 込まずに、 その画像を使 う 各ページか ら そ こ への参照だけ を生成す る こ と が可能です。画像フ ァ イ ルを一度読み込ん でおいて、 各ページに ロ ゴや背景を配置す る たびに PDF_fit_image( ) を呼び出せば よ いの です。 複数のページにその画像を配置 し た り 、 同 じ 画像で も 貼 り 付け る たびに拡縮倍率を 変えた り す る こ と も で き ます (画像を閉 じ ていない限 り ) 。 画像の容量や使用回数に よ っ ては こ の技法は顕著な容量節減を も た ら すで し ょ う 。 拡縮 と dpi 計算 取 り 込んだ画像のピ ク セル数を PDFlib が変え る こ と はあ り ません。 拡 縮す る と 画像の ピ ク セルは膨 ら んだ り 縮んだ り し ますが、ダ ウ ンサンプ リ ン グが行われ る こ と はあ り ません。拡縮倍率が 1 な ら ば 1 ピ ク セルの大 き さ はユーザー座標の 1 単位 と 同 じ にな り ます。 いいかえれば、 ユーザー座標系が拡縮 さ れていなければ画像はその元の解 像度で (その画像が解像度情報を持っ ていなければ 72 dpi で) 取 り 込まれます (デフ ォ ル ト では 1 イ ンチが 72 単位なので)。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの images/image_dimensions ト ピ ッ ク にあ り ます。そ こ に、 画像の寸法を得る方法や、 それを さ ま ざ ま な大き さ で貼る方法を示 し てあ り ます。 取 り 込み画像の色空間 PDF_load_image( ) で与え ら れたオプシ ョ ン に従っ て ICC プ ロ フ ァ イ ルの追加 ・ 削除を し た り ス ポ ッ ト カ ラ ーを適用 し た り す る 場合を除いて、 PDFlib は 7.1 ラ ス タ 画像 181 一般に、 取 り 込んだ画像の元の色空間を保持 し よ う と し ます。 し か し 、 まれに こ れが不可 能な組み合わせがあ り ます。その一例 と し て、TIFFにおけ る YCbCrはRGBに変換 さ れます。 PDFlib は、 RGB と CMYK と の間の変換は一切行い ません。 その よ う な変換が必要な と き は、 画像を PDFlib に取 り 込む前にその画像デー タ に適用 し てお く 必要があ り ます。 複数ページ画像 PDFlib は、 複数の画像を持つ GIF ・ TIFF ・ JBIG2 画像に対応 し てい ま す。 こ れを複数ページ画像フ ァ イ ル と も いい ます。 複数ページ画像を利用す る には、 PDF_ load_image( ) で page オプシ ョ ン を用い ます : image = p.load_image("tiff", filename, "page=2"); こ の page オプシ ョ ンは、 複数画像フ ァ イ ルが利用 さ れ る こ と を示 し 、 利用 し たい画像の 番号を指定 し ます。 先頭画像の番号は 1 です。 こ のオプシ ョ ンは、 PDF_load_image( ) が フ ァ イ ル内で も う 画像が得 ら れない こ と を示す -1 を返すま で値を増や し てい く こ と がで き ます。 ク ッ ク ブ ッ ク 複数画像TIFF フ ァ イル内のすべての画像を複数ページ PDF フ ァ イルへ変換する完全な コ ー ド サン プルがク ッ ク ブ ッ ク の images/multi_page_tiff ト ピ ッ ク にあ り ます。 イ ン ラ イ ン画像 再利用可能画像は Image XObject と し て PDF 出力へ書 き出 さ れますが、 こ れに対 し て イ ン ラ イ ン画像は各 コ ン テ ン ト ス ト リ ーム (ページかパ タ ーンかテ ンプ レー ト かグ リ フ定義) の中に直接書 き 込ま れ ます。 こ れに よ り 若干の容量が節約で き ますが、 容量の小 さ な画像デー タ (4 KB ま で) での利用に留め る べ き です。 イ ン ラ イ ン画像の主 用途は Type 3 フ ォ ン ト のビ ッ ト マ ッ プグ リ フ定義であ り 、 イ ン ラ イ ン画像を他の場面で 使用する こ と は推奨 し ません。 イ ン ラ イ ン画像は PDF_load_image( ) と inline オプシ ョ ンで生成で き ます。 イ ン ラ イ ン 画像の再利用はで き ません。すなわちその照応す る ハン ド ルを画像ハン ド ル と し て呼び出 し に与え てはいけ ません。 そのため、 inline オプシ ョ ンが与え ら れ る と PDF_load_image( ) の内部動作は以下の コ ー ド と 等価にな り ます : p.fit_image(image, 0, 0, ""); p.close_image(image); イ ン ラ イ ン画像は、 imagetype=ccitt ・ jpeg ・ raw でのみ対応 し てい ます。 他の種類の画像 では、 inline オプシ ョ ンは静かに無視 さ れます。 OPI 対応 画像を読み込む際には、 OPI (Open Prepress Interface) バージ ョ ン 1.3 ま たは 2.0 に従 っ た追加の情報を、 PDF_load_image( ) への呼び出 し で与え る こ と がで き ま す。 PDFlib は、 すべての標準 OPI 1.3 ま たは 2.0 PostScript コ メ ン ト (その照応す る PDF キー ワ ー ド ではあ り ません!) をオプシ ョ ン と し て受け付け、 その与え ら れた OPI 情報を、 一 切変更を加えずに生成 PDF 出力へパス ス ルー し ます。 以下の例では、 OPI 情報を画像に 添付 し てい ます : String optlist13 = "OPI-1.3 { ALDImageFilename bigfile.tif " + "ALDImageDimensions {400 561} " + "ALDImageCropRect {10 10 390 550} " + "ALDImagePosition {10 10 10 540 390 540 390 10} }"; image = p.load_image("tiff", filename, optlist13); 182 第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む 画像内の XMP メ タ デー タ 画像フ ァ イ ルは XMP メ タ デー タ を含んでい る こ と があ り ま す。 デ フ ォ ル ト で は PDFlib は、 出力 フ ァ イ ル サ イ ズ を 削減す る た め、 TIFF ・ JPEG ・ JPEG 2000 画像形式内の画像 メ タ デー タ を無視 し ます。 ただ し 、 その XMP メ タ デー タ は、 PDF_load_image( ) の以下のオプシ ョ ンで、 出力 PDF 文書内の生成画像に添付す る こ と が で き ます : metadata={keepxmp=true} 7.1.2 対応画像 フ ァ イ ル形式 以下に述べ る 画像フ ァ イ ル形式を PDFlib は取 り 扱い ます。 デフ ォ ル ト では PDFlib は、 圧 縮 さ れた画像デー タ については可能な限 り 無変更の ま ま PDF 出力に送 り ます。 なぜな ら 、 よ く 利用 さ れ る画像フ ァ イ ル形式で用い ら れ る圧縮方式の多 く に PDF は標準対応 し てい る か ら です。 こ の技法 (以下の解説では 「パススルーモー ド 」 と 呼びます) では画像デー タ を展開 し て ま た再圧縮す る 必要がないため、 画像の取 り 込みが非常に速 く な り ます。 し か し こ のモー ド では PDFlib は、 圧縮画像デー タ の整合性をチ ェ ッ ク し ません。 画像デー タ が不完全だっ た り 壊れていた り す る と 、 PDF 文書を Acrobat で利用す る 時にエ ラ ーや警 告の メ ッ セージが出ます (た と えば 「Read less image data than expected」 ) 。 パ ス スルー モー ド は、 PDF_load_image( ) の passthrough オプシ ョ ンであ る程度制御で き ます。 画像フ ァ イ ルの取 り 込みが不成功の時は PDF_load_image( ) はエ ラ ー コ ー ド を返 し ま す。 その画像の失敗について も っ と 詳 し く 知 る 必要があ る場合には、 get_errmsg( ) を呼び 出 し て詳 し いエ ラ ー メ ッ セージ を取得 し ます。 PNG 画像 あ ら ゆ る 種類の PNG 画像 (ISO 15948) に PDFlib は対応 し てい ます。 PNG 画 像は多 く の場合パ ス ス ルーモー ド で処理 さ れ ます。 PNG 画像が透過情報を持っ てい る 場 合、 その透過は生成 PDF 内で保たれます (187 ページ 「7.1.4 画像マ ス ク と 透過」 参照)。 PNG 画像が sRGB チ ャ ン ク を含んでい る 場合には、 その sRGB ICC プ ロ フ ァ イ ルが画 像に添付 さ れ ま す。 た だ し 、 honoriccprofile オ プ シ ョ ン が false で あ る 場合、 ま た は、 iccprofile オプシ ョ ンで他の ICC プ ロ フ ァ イ ルがその画像に割 り 当て ら れてい る 場合を除 き ま す。 こ の sRGB チ ャ ン ク 内 の レ ン ダ リ ン グ イ ン テ ン ト が 使用 さ れ ま す。 た だ し renderingintent オプシ ョ ンが与え ら れてい る と き を除 き ます。 JPEG 画像 PDFlib は、 以下の種類の JPEG 画像 (ISO 10918-1) に対応 し てい ます : > グ レース ケール ・ RGB (通常は YCbCr エン コ ー ド さ れてい る ) ・ CMYK カ ラ ー。 > ベース ラ イ ン JPEG 圧縮。 JPEG 画像の圧倒的大多数は こ の種類です。 > プ ロ グ レ ッ シブ JPEG 圧縮。 JPEG 画像は何種類かの フ ァ イ ル形式に納め る こ と がで き ます。 よ く 利用 さ れ る あ ら ゆ る JPEG フ ァ イ ル形式 と 機能に PDFlib は対応 し てい ます : > JFIF。 さ ま ざ ま な画像処理アプ リ ケーシ ョ ンに よ っ て生成 さ れます。 > Adobe Photoshop な ど の Adobe アプ リ ケーシ ョ ンに よ っ て出力 さ れ る JPEG フ ァ イ ル。 > PDFlib は、Adobe Photoshop で作成 さ れた JPEG 画像か ら ク リ ッ ピ ン グパ ス を読み取 り ま す。 > PDFlib は、honoriccprofile オプシ ョ ンが false に設定 さ れていない限 り 、JPEG 画像内の埋 め込み ICC プ ロ フ ァ イ ルに従い ます。 > JPEG画像が Exif マーカ を含んでい る 場合には、その Exif マーカ内の色空間情報は解釈 さ れます。 それが sRGB 色空間を示 し てい る 場合には、 その sRGB ICC プ ロ フ ァ イ ルがそ の画像に添付 さ れます (ただ し 、 その画像が明示的に埋め込まれた ICC プ ロ フ ァ イ ル を含んでい る 場合、 ま たは honoriccprofile オプシ ョ ンが false であ る 場合、 ま たはその 7.1 ラ ス タ 画像 183 画像に iccprofile オプシ ョ ンで他の ICC プ ロ フ ァ イ ルが割 り 当て ら れてい る 場合は、 こ の限 り ではあ り ません)。 > 画像の望ま し い向 き を指定 し た、Exif マーカ内の Orientation エン ト リ に従い ます。こ れ を無視す る (多 く のアプ リ ケーシ ョ ン同様) には ignoreorientation オプシ ョ ン を用い ます。 JPEG 画像は、 決 し て圧縮 さ れ る こ と はあ り ませんが、 ただ し い く つかの種類では、 PDF への正 し い変換のために、 ト ラ ン ス コ ーデ ィ ン グ と い う 処理が必要 と な る 場合 も あ り ま す。 ト ラ ン ス コ ーデ ィ ン グは、 画像の ピ ク セルの数や色を変え ません し 、 圧縮 / 伸張 さ れ た よ う な見た目の不自然 さ も 一切生 じ さ せ る こ と はあ り ません。 PDFlib はデフ ォ ル ト で は、 特定の種類の JPEG 画像に対 し て ト ラ ン ス コ ーデ ィ ン グ を適用 し ま すが、 ト ラ ン ス コ ーデ ィ ン グは、PDF_load_image( ) の passthrough オプシ ョ ンで制御す る こ と も 可能です。 JPEG 2000 画像 JPEG 2000 画像 (ISO 15444-2) には PDF 1.5 以上が必要で、 つねにパ ス スルーモー ド で処理 さ れます。 PDFlib は、 JPEG 2000 画像を、 以下の条件に従っ て受け 付け ます : > JP2・JPX ベース ラ イ ン画像 (通常 *.jp2 ま たは *.jpf) に対応 し てい ます。ただ し 以下の色 空間条件に従 う 必要があ り ます。範囲 1 ~ 38 内のすべての色深度値に対応 し てい ます。 次の色空間に対応 し てい ま す : sRGB ・ sRGB グ レー ・ ROMM-RGB ・ sYCC ・ e-sRGB ・ e-sYCC ・ CIELab ・ ICC ベース色空間群 ・ CMYK。 PDFlib は、 JPEG 2000 画像フ ァ イ ル 内の元の色空間に変更を加え ません。 > 外部 ICC プ ロ フ ァ イ ルは JPEG 2000 画像には適用で き ません。すなわち、iccprofile オプ シ ョ ンは用い る こ と がで き ません。 JPEG 2000 画像に埋め込ま れた限定 ま たはフルの ICC プ ロ フ ァ イ ルはつねに保持 さ れます。 すなわち、 honoriccprofile オプシ ョ ンはつね に true です。 注 ISO 15444-6 に従っ た JPM 複合画像 フ ァ イル (通常 *.jpm) には対応 し ていません。 PDF/X-4/5 に対する 追加の JPEG 2000 の制約 (JPEG 2000 は、 PDF 1.4 に基づいた PDF/ X-3 では許 さ れません) : > カ ラ ーチ ャ ン ネルの数は 1 ・ 3 ・ 4 の う ちのいずれかであ る 必要があ り ます。 > 各カ ラ ーチ ャ ン ネルのビ ッ ト 深度は 1・8・16 の う ちのいずれかであ る 必要があ り ます。 > すべてのカ ラ ーチ ャ ン ネルが同一のビ ッ ト 深度を持っ てい る 必要があ り ます。 > ち ょ う ど 1 個の色空間定義が JPEG 2000 画像フ ァ イ ル内に存在する 必要があ り ます。 > CMYK 画像は、出力条件が CMYK デバ イ ス であ る場合、ま たは PDF_begin_page_ext( ) の defaultcmyk オプシ ョ ンが与え ら れてい る 場合にのみ使用で き ます。 PDF/A-2 に対する 追加の JPEG 2000 の制約 (JPEG 2000 は、 PDF 1.4 に基づいた PDF/A1 では許 さ れません) : > カ ラ ーチ ャ ン ネルの数は 1 ・ 3 ・ 4 の う ちのいずれかであ る 必要があ り ます。 > すべてのカ ラ ーチ ャ ン ネルが同一のビ ッ ト 深度を持っ てい る 必要があ り ます。 > そのJPEG 2000画像内の色空間指定の数が1 よ り 大 き い場合には、APPROX フ ィ ール ド 内 に値 0x01 を持つ色空間指定がち ょ う ど 1 個存在す る必要があ り ます。 JBIG2 画像 PDFlib は、 単ページ ・ 複数ページの JBIG2 画像 (ISO 14492) に対応 し てい ます。 JBIG2 画像はつねに単色ピ ク セルデー タ を内容 と し て持ち ます。 JBIG2 圧縮の性質か ら 、複数ページ JBIG2 ス ト リ ーム内のい く つかのページが同一のグ ロ ーバルセグ メ ン ト を参照 し てい る 場合があ り ます。複数ページ JBIG2 ス ト リ ームの 1 つ ない し 複数のページが変換 さ れ る 際、 グ ロ ーバルセグ メ ン ト は、 生成 PDF 画像間で共用 184 第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む で き ます。 PDF_load_image( ) への呼び出 し は互いに独立ですので、 あ ら か じ め PDFlib に、 同一 JBIG2 ス ト リ ームか ら 複数ページ を変換す る と 知 ら せてお く 必要があ り ます。 こ れは 以下の よ う に行い ます : > 先頭ページ を読み込む際に、 すべてのグ ロ ーバルセグ メ ン ト を PDF へ コ ピー し ます。 PDF_load_image( ) に対 し て以下のオプシ ョ ン リ ス ト を用い ます : page=1 copyglobals=all > 同一 JBIG2 ス ト リ ームか ら 、以降のページ を読み込む際に、ページ 1 に対す る画像ハン ド ル <N> を与え る こ と に よ っ て、 すでにページ 1 と と も に コ ピー さ れてい る グ ロ ーバ ルセグ メ ン ト への参照を PDFlib が作成で き る よ う にする 必要があ り ます。 PDF_load_ image( ) に対 し て以下のオプシ ョ ン リ ス ト を用い ます : page=2 imagehandle=<N> ク ラ イ ア ン ト アプ リ ケーシ ョ ン側では必ず、 同一 JBIG2 画像ス ト リ ームか ら 抽出 さ れた ページに対 し てのみ こ の copyglobals/imagehandle 機構が適用 さ れ る よ う にす る 必要があ り ます。 copyglobals オプシ ョ ンがない場合は、 PDFlib は自動的にカ レ ン ト ページに対す る必要デー タ をすべて コ ピー し ます。 GIF 画像 PDFlib は、 ピ ク セルデー タ が イ ン タ レース さ れてい る も の と さ れていない も の の両方の、 あ ら ゆ る パレ ッ ト サ イ ズの、 あ ら ゆ る 種類の GIF (具体的には GIF 87a ・ 89a) に対応 し てい ます。 GIF 画像はつねに Flate 圧縮で再圧縮 さ れます。 TIFF 画像 PDFlib は、 すべての関連す る 種類の TIFF 画像を処理 し ます : > 圧縮方式 : 非圧縮 ・ CCITT (グループ 3 ・ グループ 4 ・ RLE) ・ ZIP (= Flate) ・ PackBits (= RunLength) ・ LZW ・ 新旧方式 JPEG に加え、 い く つかの まれな圧縮方式。 > 色空間 : 単色 ・ グ レース ケール ・ RGB ・ CMYK ・ CIELab ・ YCbCr 画像。 取 り 込まれ る TIFF 画像内の色空間は、 以下の例外を除 き 、 変更 さ れずに保持 さ れます : CIELab カ ラ ーを持つLZW圧縮 さ れたTIFF画像はRGBへ変換 さ れ、CIELab色空間を保持 し ません。 > 色深度は、 色要素あ た り 1 ・ 2 ・ 4 ・ 8 ・ 16 ビ ッ ト のいずれかでなければな り ません。 16 ビ ッ ト 画像は PDF 1.5 を必要 と し ます。 > 元の TIFF 形式を、 4GB 制限を超えて拡張 し た BigTIFF 形式。 画像を取 り 込む際、 以下の TIFF 機能は処理 さ れます : > 複数の画像を含んだ TIFF フ ァ イ ル (182 ページ 「 複数ページ画像」 参照)。TIFF フ ァ イ ル内の特定の画像を選ぶには page オプシ ョ ン を用い ます。 > アルフ ァ チ ャ ン ネルま たはマ ス ク (187 ページ 「7.1.4 画像マ ス ク と 透過」 参照) に、 ignoremask オプシ ョ ンが設定 さ れていない限 り 従い ます。alphachannelname オプシ ョ ンで明示的にアルフ ァ チ ャ ン ネルを選ぶ こ と も で き ます。 > PDFlib は、Adobe Photoshop や互換プ ロ グ ラ ム で作成 さ れた TIFF 画像内の ク リ ッ ピ ン グ パス に、 ignoreclippingpath オプシ ョ ンが設定 さ れていない限 り 従い ます。 > PDFlibは、TIFF画像内の埋め込みICCプ ロ フ ァ イ ルに、honoriccprofileオプシ ョ ンがfalse に設定 さ れていない限 り 従い ます。 > JPEG画像が Exif マーカ を含んでい る 場合には、その Exif マーカ内の色空間情報は解釈 さ れます。 それが sRGB 色空間を示 し てい る 場合には、 その sRGB ICC プ ロ フ ァ イ ルがそ の画像に添付 さ れます (ただ し 、 その画像が明示的に埋め込まれた ICC プ ロ フ ァ イ ル を含んでい る 場合、 ま たは honoriccprofile オプシ ョ ンが false であ る 場合、 ま たはその 7.1 ラ ス タ 画像 185 画像に iccprofile オプシ ョ ンで他の ICC プ ロ フ ァ イ ルが割 り 当て ら れてい る 場合は、 こ の限 り ではあ り ません)。 > 画像の望ま し い向 き を指定 し た Orientation タ グに従い ます。こ れを無視す る (多 く のア プ リ ケーシ ョ ン同様) には ignoreorientation オプシ ョ ン を用い ます。 い く つかの TIFF 機能 (ス ポ ッ ト カ ラ ーな ど) や複数機能の組み合わせには対応 し てい ま せん。 BMP 画像 PDFlib は、 以下の種類の BMP 画像に対応 し てい ます : > BMP バージ ョ ン 2 ・ 3。 > 色深度は コ ン ポーネ ン ト あ た り 1・4・8 ビ ッ ト 。3×8 = 24 ビ ッ ト の TrueColor を含みま す。 16 ビ ッ ト 画像は 5+5+5 プ ラ ス未使用 1 ビ ッ ト と し て扱われます。 32 ビ ッ ト 画像は 3×8 ビ ッ ト 画像 と し て扱われます (残 り の 8 ビ ッ ト は無視 さ れます)。 > 単色か RGB カ ラ ー ( イ ンデ ッ ク ス ・ 直接)。 > 非圧縮 と 4 ビ ッ ト ・ 8 ビ ッ ト RLE 圧縮。 > ピ ク セルがボ ト ム ア ッ プ順で格納 さ れてい る 場合 PDFlib は画像を反転 さ せません ( こ の BMP の機能はめっ たに使われず、 アプ リ ケーシ ョ ンに よ っ て異な っ た解釈を さ れま す)。 CCITT 画像 と RAW 画像デー タ グループ 3 ・ グループ 4 の FAX 圧縮 さ れた画像デー タ は つねにパ ス スルーモー ド で処理 さ れます。こ の形式は実は生の CCITT 圧縮 さ れた画像デー タ と い う 意味であ り 、 CCITT 圧縮を用いた TIFF フ ァ イ ル と い う 意味ではない こ と に注意 し て く だ さ い。 生の CCITT 圧縮画像フ ァ イ ルはエン ド ユーザーアプ リ ケーシ ョ ンではふ つ う 対応 し てお ら ず、 こ れを生成で き る のは FAX 関係の ソ フ ト ウ ェ アだけです。 非圧縮の (RAW) 画像デー タ はい く つかの特殊な応用では有用で し ょ う 。 画像の種類 は色要素の数か ら 推測で き ます : 1 要素な ら グ レース ケール画像、 3 要素な ら RGB 画像、 4 要素な ら CMYK 画像であ る こ と を それぞれ示唆 し てい ます。 CCITT ま たは RAW 画像デー タ を与え る には、 width ・ height ・ components ・ bpc オプ シ ョ ン を与え る 必要があ り ます。 なぜな ら PDFlib は こ れ ら を画像デー タ か ら 割 り 出せな いか ら です。 画像 と 実際に整合す る オプシ ョ ン値を与え る のはユーザー側の役割です。 そ う し な い場合、 破損 し た PDF 出力が生成 さ れ る おそれが あ り 、 Acrobat が メ ッ セージ 「Insufficient data for an Image」 で応答す る おそれがあ り ます。 imagetype=raw の場合には、 与え る 画像デー タ の長 さ は、 [幅 × 色要素数 ×bpc÷8] × 高 さ バ イ ト に等 し い必要があ り ます。 こ こ で、 カ ッ コ内の小数は切 り 上げです。 画像サン プルは、 上か ら 下へ、 かつ左か ら 右への順序 と 見な さ れます (座標変換は行われていない と 前提 さ れ ます) 。 16 ビ ッ ト サン プルは、 最上位バ イ ト を最初に与え る 必要があ り ます (ビ ッ グエンデ ィ ア ンバ イ ト 順序)。 ピ ク セル値の極性は、 色関連オプシ ョ ンに対す る場合 と 同 じ です (PDFlib リ フ ァ レ ン ス参照)。 bpc が 8 よ り 小 さ い場合には、 各ピ ク セル行は バ イ ト 境界で開始 し 、 カ ラ ー値はバ イ ト 内で左か ら 右へ詰め込まれ る 必要があ り ます。 画 像サ ン プルはつねに交互配置 さ れ ま す。 すなわち、 最初の ピ ク セルに対す る すべての カ ラ ー値が最初に与え ら れ、 その後に 2 番目の ピ ク セルに対す る すべてのカ ラ ー値が続 き 、 以下同様です。 7.1.3 ク リ ッ ピ ン グパス PDFlib は、 Adobe Photoshop で作成 さ れた TIFF ・ JPEG 画像の中の ク リ ッ ピ ン グパ ス に対 応 し てい ます。1 つの画像フ ァ イ ルには、複数の名前付 き パ ス を含む場合があ り ます。PDF_ load_image( ) の clippingpathname オプシ ョ ン を使えば、 名前付き パス の う ちの 1 つを選 186 第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む ぶ こ と がで き 、 それが ク リ ッ ピ ン グパ ス と し て使われます : 画像は、 ク リ ッ ピ ン グパ ス の 内部だけが可視 と な り 、 それ以外の部分は不可視にな り ます。 こ れは背景 と 前景を分離 し た り 、 画像の不要部分を除去 し た り す る のに有用です。 あ る いは、画像フ ァ イ ルはデフ ォ ル ト ク リ ッ ピ ン グパ ス を含む場合があ り ます。PDFlib は、 画像フ ァ イ ル内に ク リ ッ ピ ン グパ ス を見つけた場合、 それを自動的に画像に適用 し ま す (図 7.1 参照)。デフ ォ ル ト ク リ ッ ピ ン グパ ス が適用 さ れない よ う にす る には、PDF_load_ image( ) で honorclippingpath オプシ ョ ン を false に設定 し ます。 同 じ 画像の イ ン ス タ ン ス が複数あ っ て、 し か も その う ち一部の イ ン ス タ ン ス に し か ク リ ッ ピ ン グパ ス を適用 し た く ない と き は、 PDF_fit_image( ) に ignoreclippingpath オプシ ョ ン を与え て ク リ ッ ピ ン グパ ス を無効にす る こ と がで き ます。 ク リ ッ ピ ン グパス が適用 さ れ る と 、 画像の配置やはめ込み に関す る すべての計算は、 切 り 抜かれた画像の外接枠を も と に行われます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クのimages/integrated_clipping_path ト ピ ッ ク にあ り ます。 ク リ ッ ピ ン グパ ス を記述す る ためのベ ク ト ル演算は、 PDF_fit_image( ) が呼び出 さ れ る た びに、 PDF 出力へ書 き 出 さ れます。 ク リ ッ ピ ン グパス を持っ た画像 1 個を、 その文書内に 複数回配置す る 場合には、 出力フ ァ イ ルサ イ ズ を削減する ために、 その画像を テ ンプ レー ト 内に ラ ッ プす る こ と を強 く 推奨 し ます。 こ れは PDF_load_image( ) の createtemplate オ プシ ョ ンで実現で き ます。 7.1.4 画像マ ス ク と 透過 3 種類の画像内透過情報に PDFlib は対応 し てい ます : アルフ ァ チ ャ ン ネルに よ る 内在透 過、 外在透過、 画像マ ス ク です。 アル フ ァ チ ャ ン ネルに よ る内在透過 ラ ス タ 画像は、 部分的に透明にす る こ と も で き ま す。 すなわち、 画像を透か し て背景が見え る よ う にす る こ と が可能です。 こ れはた と え ば、 画像の背景を無視 し て、 前景の人物や物体だけ を見せたい と き に有用です。 透過情報 は、 別途の アル フ ァ チ ャ ン ネル内に、 あ る いは (パ レ ッ ト ベー ス の画像の場合) 透過パ レ ッ ト エ ン ト リ と し て格納で き ます。 透過画像は、 PDF/A-1 ・ PDF/X-1 ・ PDF/X-3 では 許 さ れてい ません。 PDFlib は、 以下の画像形式の透過情報を処理 し ます : > GIF 画像フ ァ イ ルは、1 個の透過カ ラ ー値(パレ ッ ト エン ト リ )を持つ こ と がで き 、PDFlib はそれに従い ます。 > TIFF 画像は、1 個の関連づけ ら れた アルフ ァ チ ャ ン ネルを含む こ と がで き 、PDFlib はそ れに従い ます。 あ る いは TIFF 画像は、 関連づけ ら れていない、 名前で指定 さ れ る チ ャ 図 7.1 ク リ ッ ピ ングパス を利用 し て 前景 と 背景を分離 7.1 ラ ス タ 画像 187 ン ネルを任意の数含む こ と も で き ます。 こ れ ら のチ ャ ン ネルは、 透過な ど の情報を伝 達す る ために利用す る こ と がで き ます。関連づけ ら れていないチ ャ ン ネルが TIFF 画像 内に見つか っ た と き は、 PDFlib はデフ ォ ル ト では先頭チ ャ ン ネルを アルフ ァ チ ャ ン ネ ル と し て用い ます。 し か し 、 関連づけ ら れていないアルフ ァ チ ャ ン ネルを、 その名前 を与え る こ と で明示的に選択す る こ と も 可能です : image = p.load_image("tiff", filename, "alphachannelname={apple}"); > PNG 画像は、1 個の関連づけ ら れた アルフ ァ チ ャ ン ネルを含む こ と がで き 、PDFlib はそ れを自動的に用い ます。 > PNG 画像は、完全な アルフ ァ チ ャ ン ネルではな く 、1 個の透過カ ラ ー値を持つ こ と も で き 、 PDFlib はそれに従い ます。 複数のカ ラ ー値がアルフ ァ 値つ き で与え ら れてい る 場 合、 50 パーセ ン ト 未満のアルフ ァ 値を持つ も のの う ちの初めの 1 個が用い ら れます。 注 Photoshop では、 完全なアルフ ァ チ ャ ン ネルの他に、 固有形式で透過背景を作成する こ と も で き ます。 し か し PDFlib は こ の形式を理解 し ません。 こ のよ う な透過画像を PDFlib で 利用するには、 Photoshop で こ れを TIFF フ ァ イル形式で保存 し 、 その際に 「TIFF オプ シ ョ ン」 ダ イ ア ログボ ッ ク スで 「透明部分を保持」 を選択 し ます。 場合に よ っ ては、 暗黙的な透過が画像フ ァ イ ルに含まれていて も 、 それをすべて無視 し た い こ と も あ り ます。 PDFlib の透過対応は、 画像を読み込む際に ignoremask オプシ ョ ンで 無効化す る こ と が可能です : image = p.load_image("tiff", filename, "ignoremask"); Acrobat 7/8/9 は、 アルフ ァ チ ャ ン ネルを持つ 16 ビ ッ ト 画像を正 し く 取 り 扱わず、 16 ビ ッ ト のアルフ ァ チ ャ ン ネルを 8 ビ ッ ト と し て解釈 し ます。 こ の表示バグは Acrobat X 以上で は修正 さ れてい ます。 こ の問題を回避 し て作業す る には、 downsamplemask オプシ ョ ン を 使 う こ と がで き ます。 も し こ れが true に設定 さ れてい る と 、 PDFlib は 16 ビ ッ ト のアル フ ァ チ ャ ン ネルを 8 ビ ッ ト へダ ウ ンサンプル し ます。 デフ ォ ル ト では、 ダ ウ ンサンプルは 一切適用 さ れませんので、 Acrobat の古いバージ ョ ンでは正 し く ない表示が得 ら れ る おそ れがあ り ます。 外在透過 外在の場合には、 2 つの段階が必要で、 ど ち ら も 画像操作を伴い ます。 第一に、 マ ス ク と し て後で使 う ためのグ レース ケール画像を 1 つ用意する 必要があ り ます。そのた めにはマ ス ク 画像を読み込みます。 マ ス ク を構築す る には、 以下の種類の画像を使 う こ と がで き ます : > PNG 画像 > TIFF 画像:マルチ ス ト リ ッ プ画像を避け る ため、PDF_load_image( ) で nopassthrough オ プシ ョ ン を推奨 し ます。 > RAW 画像デー タ マ ス ク 内で ピ ク セル値が 0 (ゼ ロ ) の部分の画像は塗 ら れ、 ピ ク セル値が 0 でない部分は 背景が透けて見え ます。 ピ ク セルあ た り のビ ッ ト 数が 1 よ り 大き い場合、 中間値は前景画 像を背景にブ レ ン ド さ せて透過効果を生みます。 第二段階 と し て、 そのマ ス ク を別の画像に masked オプシ ョ ンで適用 し ます : mask = p.load_image("png", maskfilename, ""); if (mask == -1) throw new Exception("エラー:" + p.get_errmsg()); String optlist = "masked=" + mask; 188 第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む image = p.load_image(type, filename, optlist) if (image == -1) throw new Exception("エラー:" + p.get_errmsg()); p.fit_image(image, x, y, ""); 画像 と マ ス ク は縦横の ピ ク セル数が違っ てい る 可能性 も あ り ます。マ ス ク は画像サ イ ズに 合わせて自動的に拡縮 さ れます。 注 場合によ っ ては PDFlib は、 マルチス ト リ ッ プの TIFF 画像を PDF 上の複数の画像に変換す り こ と があ り 、 その場合、 マス ク はその各画像に対 し て独立にかかる こ と にな り ます。 通 常こ のよ う な こ と は意図 さ れていないので、 こ の種の画像はマス ク と し て も マス ク対象画 像 と し て も拒否 さ れます。 また、 内在の場合 と 外在の場合 と を互いに混在 さ せない こ と が 重要です。 つま り 、 透過カ ラ ー値を持つ画像を マス ク と し て使っ てはいけません。 注 マ ス ク は、 背景画像 と 同 じ 向き を持つ必要があ り ます。 そ う で ない と それは拒否 さ れま す。 向きは画像フ ァ イル形式やその他の要因に依存 し ますので、 検出が困難です。 こ のた め、 マス ク と 画像の両方について、 同 じ フ ァ イル形式 と 作成ソ フ ト ウ ェ ア を用い る こ と を 推奨 し ます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの images/image_mask ト ピ ッ ク にあ り ます。 画像マ ス ク と ソ フ ト マ ス ク 画像マ ス ク と はビ ッ ト 深度が 1 の画像 (ビ ッ ト マ ッ プ) で あ り 、 ゼ ロ のビ ッ ト が透過 と し て扱われます : ページの既存内容が画像内の透過部分を通 し て見え ます。 1 のビ ッ ト のピ ク セルはカ レ ン ト 塗 り 色で着色 さ れます。 ソ フ ト マ ス ク は、画像マ ス ク の概念を、複数ビ ッ ト のマ ス ク へ一般化 し た も のです。 こ れは画像を、 何 ら かの既存の背景に溶け込ませます。 PDFlib は、 あ ら ゆ る 種類のシ ン グル チ ャ ン ネル (グ レース ケール) 画像を ソ フ ト マ ス ク と し て受け付け ます。 なお、 マ ス ク と し て使え る のは真の グ レ ー ス ケールの画像だけで あ り 、 イ ンデ ッ ク ス 付 き の (パ レ ッ ト ベース の) 色は使え ません。 こ れは画像マ ス ク と 同 じ よ う に利用で き ます。 画像マ ス ク と し て使え る のは以下の種類の画像です : > PNG 画像 > TIFF 画像 (シ ン グルス ト リ ッ プで も マルチ ス ト リ ッ プで も ) > JPEG 画像 ( ソ フ ト マ ス ク と し てのみ。 後述) > BMP。BMP 画像は他の種類の画像 と 向 き が違 う こ と に注意 し て く だ さ い。そのため BMP 画像はマ ス ク と し て使 う には まず x 軸を軸 と し て反転 さ せる 必要があ り ます。 > RAW 画像デー タ 画像マ ス ク は mask オプシ ョ ン を付ければ開 く こ と がで き、 希望の塗 り 色を設定 し た後に ページ上に配置す る こ と がで き ます : mask = p.load_image("tiff", maskfilename, "mask"); p.set_graphics_option("fillcolor=red); if (mask != -1) { p.fit_image(mask, x, y, ""); } ゼ ロ のビ ッ ト の ピ ク セルを透過にせずに画像を着色 し たい場合は colorize オプシ ョ ン を使 う 必要があ り ます (190 ページ 「7.1.5 画像に着色」 参照)。 7.1 ラ ス タ 画像 189 7.1.5 画像に着色 画像マ ス ク では画像の不透明部分が着色 さ れますが、類似機能 と し て ス ポ ッ ト カ ラ ーに よ る 画像の着色に PDFlib は対応 し てい ます。 こ の機能は、 単色かグ レース ケールの画像で 動作 し ます。 RGB パレ ッ ト を持つ画像に関 し ては、 着色が意味を持つのは、 そのパレ ッ ト がグ レー 値だけ を持ち、 パ レ ッ ト イ ンデ ッ ク ス がグ レー値 と 等価な場合だけです。 し か し PDFlib は こ の条件に関する 検査は行い ません。 画像を ス ポ ッ ト カ ラ ーで着色す る には、画像を読み込む時に colorize オプシ ョ ン を与え る 必要が あ り 、 それ と と も にその ス ポ ッ ト カ ラ ーハン ド ルを与え る 必要が あ り ま す。 ス ポ ッ ト カ ラ ーハン ド ルはあ ら か じ めPDF_makespotcolor( )で取得 し てお く 必要があ り ます: spot = p.makespotcolor("PANTONE Reflex Blue CV"); String optlist = "colorize=" + spot; image = p.load_image("tiff", "image.tif", optlist); if (image != -1) { p.fit_image(image, x, y, ""); } 190 第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む 7.2 SVG グ ラ フ ィ ッ ク 7.2.1 対応 SVG 種別 PDFlib は、 W3C の述語に よ れば 「規格準拠 し た高品位な静的 SVG ビ ュ ー ア」 です。 PDFlib は、 SVG グ ラ フ ィ ッ ク を以下の よ う に受け付け ます : > PDFlib は、 W3C が発行 し た SVG 1.1 (Second Edition) を実装 し てい ま す。 対応 し ていない SVG 仕様の側面を 198 ページ 「7.2.7 対応 し てい ない SVG 機能」 に挙げます。 > 以下の Unicode 形式 と エン コ ーデ ィ ン グに対応 し てい ます : UTF-8 ・ UTF-16 ・ ISO 8859-1 ~ ISO 8859-15 ・ ASCII > CSS ス タ イ ル付けが可能ですが、 ただ し 対応 し ていない CSS 要素 も あ り ます。 > プ レーン テ キ ス ト 形式の SVG フ ァ イ ルのほかに、Flate 圧縮 さ れた SVG フ ァ イ ル(*.svgz) に も 対応 し てい ます。 > CEF 形式の フ ォ ン ト に対応 し てい ます。CEF フ ォ ン ト は、SVG 仕様の一部分ではあ り ま せんが、 い く つかの Adobe アプ リ ケーシ ョ ンに よ っ て SVG グ ラ フ ィ ッ ク 内に埋め込ま れます。 7.2.2 SVG 処理上の考慮事項 基本的な SVG の取 り 扱い ベ ク ト ルグ ラ フ ィ ッ ク を PDFlib で埋め込む こ と は容易に実現 で き ます。 まず、 そのグ ラ フ ィ ッ ク フ ァ イ ルを PDFlib 関数で開 く 必要があ り ます。 こ の 関数はそのグ ラ フ ィ ッ ク を解釈 し て、 内部表現を メ モ リ 内に格納 し ます。 こ の関数 PDF_ load_graphics( ) は、 グ ラ フ ィ ッ ク 記述子の役割を持つハン ド ルを返 し ます。 こ のハン ド ル は、 PDF_fit_graphics( ) への呼び出 し で、 位置付け ・ 拡縮オプシ ョ ン と と も に使 う こ と が で き ます : graphics = p.load_graphics("auto", "graphics.svg", ""); if (graphics == -1) throw new Exception("エラー : " + p.get_errmsg()); if (p.info_graphics(graphics, "fittingpossible", optlist) == 1) p.fit_graphics(graphics, 0.0, 0.0, ""); else System.err.println("グラフィックを配置できません: " + p.get_errmsg()); p.close_graphics(graphics); PDF_fit_graphics( ) の最後の引数は、 位置付け ・ 拡縮 ・ 回転のための さ ま ざ ま なオプシ ョ ン をサポー ト し てい る オプシ ョ ン リ ス ト です。 こ れ ら のオプシ ョ ンに関す る 詳細は、 205 ページ 「7.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置」 で説明 し ます。 ク ッ ク ブ ッ ク SVG の取 り 扱いのための コ ー ド サン プルが、PDFlib ク ッ ク ブ ッ クの graphics カ テ ゴ リ にあ り ます。 1 個の文書内で同一のグ ラ フ ィ ッ ク を複数回使用 PDFlib は、 ベ ク ト ルグ ラ フ ィ ッ ク を 取 り 込むための、 以下の異な る 方式をサポー ト し てい ます : > デフ ォ ル ト では、 グ ラ フ ィ ッ ク デー タ は、 ページ ・ パ タ ーン ・ テ ン プ レー ト ・ グ リ フ 記述の内容ス ト リ ーム内に イ ン ラ イ ンに書 き 込ま れ ます。 こ れがデフ ォ ル ト の動作で あ り 、 こ れは、 そのグ ラ フ ィ ッ ク がその文書内にち ょ う ど 1 回だけ配置 さ れ る場面に 7.2 SVG グ ラ フ ィ ッ ク 191 対 し て推奨 さ れます。も し PDF_fit_graphics( ) が複数回呼び出 さ れ る と 、そのグ ラ フ ィ ッ ク デー タ は PDF 出力へ何度 も 書き 込まれ、 出力フ ァ イ ルサ イ ズが増大 し ます。 > そ の グ ラ フ ィ ッ ク を そ の 文書内 に 複数 回配置 す る つ も り の 場合 に は、 PDF_load_ graphics( ) の templateoptions オプシ ョ ン を推奨 し ます。 こ れは PDF フ ォーム XObject (テ ンプ レー ト ) を作成 し ます。 すなわち、 そのグ ラ フ ィ ッ ク デー タ はその PDF 文書 内に、任意の回数参照 さ れ る こ と ので き る別個の実体 と し て格納 さ れます。テ ンプ レー ト のためのグ ラ フ ィ ッ ク デー タ は、 文書の最後に、 あ る いは PDF_close_graphics( ) が呼 び出 さ れた と き に、 PDF 出力へ書 き 出 さ れます。 こ の方法な ら 、 出力フ ァ イ ルサ イ ズ は最適化 さ れます。 ただ し 、 グ ラ フ ィ ッ ク 内の リ ン ク は PDF 注釈へは変換 さ れな く な り ます。 同一のグ ラ フ ィ ッ ク を複数の文書内で使用 グ ラ フ ィ ッ ク は、 カ レ ン ト 出力文書 と は独 立に読み込んだ り 閉 じ た り す る こ と も で き ます。PDF_load_graphics( ) が呼び出 さ れた時点 で、 そ の グ ラ フ ィ ッ ク の内部表現が作成 さ れ ま す。 こ れは、 そ の照応す る PDF_close_ graphics( ) への呼び出 し ま で メ モ リ 内に保持 さ れます。 グ ラ フ ィ ッ ク を、 文書を ま たいで メ モ リ 内に保持す る こ と は、同一のグ ラ フ ィ ッ ク が多数の出力文書内に配置 さ れ る場面に おいて、 そのグ ラ フ ィ ッ ク を 1 回だけ読み こ めば済むので、 パフ ォーマ ン ス上の利点があ り ます。 た と えば、 アプ リ ケーシ ョ ンが、 シ ン ボルや背景アー ト ワー ク や企業ス テーシ ョ ナ リ を持つグ ラ フ ィ ッ ク を 1 回読み込んで、そのグ ラ フ ィ ッ ク が必要 と さ れ る各文書内で PDF_fit_graphics( ) を呼び出す こ と がで き る で し ょ う 。 SVG の処理上の問題を チ ェ ッ ク PDF_load_graphics( ) は SVG グ ラ フ ィ ッ ク を読み込みま すが、 完全な処理 と 分析はその後、 フ ォーム XObject の作成 と 、 読み込みの ス コ ープに応 じ て、 PDF_fit_graphics( ) ・ PDF_close_graphics( ) ・ PDF_end_document( ) の う ちのいずれか の時点で し か行われません。 エ ラ ー状況のなかには、 完全処理が行われてい る間に し か検 出で き ない も の も あ り ますので、 こ れ ら の関数は、 問題が発見 さ れれば例外を発生 さ せ る 可能性があ り ます (なぜな ら こ れ ら はエ ラ ー値を一切返す こ と がで き ないので) 。 その よ う な例外を回避す る には、 グ ラ フ ィ ッ ク を PDF_info_graphics( ) の fittingpossible キー ワー ド でチ ェ ッ ク す る こ と がで き ます。 こ れは、 すべての処理ス テ ッ プ を実行 し つつ も 、 出力 を一切作成せず、 SVG 処理の成功 (か否か) を報告 し ます。 も し こ のチ ェ ッ ク が成功すれ ば、 その画像が配置 さ れ る 際に PDF_fit_graphics( ) は例外 を発生 さ せ ま せん。 も し こ の fittingpossible チ ェ ッ ク 中にエ ラ ーが発生すれば、PDF_info_graphics( ) は -1 (PHP の場合 : 0) を返 し ます (errorpolicy=return であれば)。 ま と め る と : > こ の fittingpossible チ ェ ッ ク は、後の PDF_fit_graphics( )・PDF_close_graphics( )・PDF_end_ document( ) での例外を回避 し ます。PDF 出力は例外の後では使用不能にな り ますので、 こ れは推奨 さ れ る アプ ロ ーチです。 > こ の fittingpossible チ ェ ッ ク を省 く と 、SVG の読み込みは速 く な り ますが、その SVG デー タ が引 き 起 こ す例外が後で発生す る おそれがあ り ます。 こ の設定は、PDF_fit_graphics( ) での例外が許容で き る場合に、 SVG の読み込みを速め る ために使用で き ます。 た と え ば、 アプ リ ケーシ ョ ンが 1 個の SVG グ ラ フ ィ ッ ク フ ァ イ ルを 1 個の PDF 文書へ変換 し 、 それ以外のページ内容を追加 し ない場合には、 こ れは許容で き る アプ ロ ーチです。 こ の fittingpossible チ ェ ッ ク は、 カ レ ン ト でア ク テ ィ ブな グ ロ ーバル ・ 文書 ・ ページオプ シ ョ ン群 と 、 カ レ ン ト 出力 イ ン テ ン ト を使用 し ます。 ですので こ のチ ェ ッ ク は、 PDF_fit_ graphics( ) への実際の呼び出 し の直前にのみ走 ら せる こ と を推奨 し ます。 192 第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む 7.2.3 SVG グ ラ フ ィ ッ ク のサ イ ズ SVG グ ラ フ ィ ッ ク は、 その幅 と 高 さ を、 その SVG グ ラ フ ィ ッ ク の タ ーゲ ッ ト ビ ューポー ト (ブ ラ ウ ザ ウ ィ ン ド ウ や、 PDF ページの一部分な ど) へのマ ッ ピ ン グ を定義 し てい る svg エ レ メ ン ト 内で定義 し てい ます。 し ば し ば、 こ のビ ューポー ト のサ イ ズは絶対単位で 指定 さ れてい ます。 例 : <svg xmlns="http://www.w3.org/2000/svg" width="640mm" height="480mm"> PDFlib は、 こ の width ・ height 属性 を ポ イ ン ト へ変換 し 、 そ し て それ ら を、 PDF_info_ graphics( ) の graphicswidth・graphicsheight キー ワー ド を通 じ て得 ら れ る よ う に し ます。上 記でサ イ ズが ピ ク セル (px) で指定 さ れてい る 場合には、 PDFlib は 1pt=1px を用い ます。 こ れ ら の値は、はめ込み操作のためのオブジ ェ ク ト 枠を計算する ために も 使われます。svg エ レ メ ン ト は、ビ ュ ーポー ト 内の ウ ィ ン ド ウ を指定する viewBox 属性を内容 と し て持つ場 合 も あ り ます。 ただ し 、 SVG グ ラ フ ィ ッ ク のなかには、 width ・ height を欠いてい る か、 あ る いは以下 の例の よ う に相対サ イ ズ情報のみを内容 と し てい る ために、絶対サ イ ズ情報を一切内容 と し て持た ない も の も あ り ます : <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%"> こ の場合には、 PDFlib は viewBox 属性を (存在すれば) 読み取 り 、 こ の viewBox のサ イ ズ を ビ ュ ーポー ト のサ イ ズ と し て使い ます。 こ れ ら の値はオーバ ラ イ ド す る こ と も で き 、 こ れは と り わけ viewBox 属性が得 ら れない場合に有用です。 こ の場合には、 PDF_load_ graphics( ) の fallbackwidth ・ fallbackheight オプシ ョ ン を用いてサ イ ズ情報を与え る こ と が で き ます。 グ ラ フ ィ ッ ク フ ァ イ ル内で指定 さ れてい る サ イ ズ値を オーバ ラ イ ド す る には、 forcedwidth ・ forcedheight オプシ ョ ン を用い る こ と がで き ます。 7.2.4 フ ォ ン ト 選択 フ ォ ン ト 選択アルゴ リ ズム 制御 さ れます : SVG におけ る フ ォ ン ト 選択は、 以下のプ ロ パテ ィ に よ っ て font-family font-style font-weight font-stretch font-variant font-size font-size-adjust こ れ ら のプ ロ パテ ィ の う ち、 最初の 3 つだけが、 外部フ ォ ン ト の選択に関連 し ます。 適切な フ ォ ン ト を選択す る ため、 PDFlib は以下のフ ォ ン ト 名を構築 し ます : <font-family>,<font-weight>,<font-style> <font-family>-<font-weight><font-style> <font-family>,<font-normweight>,<font-style> <font-family>,<font-weight>,<font-normstyle> <font-family>,<font-normweight>,<font-normstyle> こ こ で <font-normweight> は 7.2 SVG グ ラ フ ィ ッ ク 193 Regular, Thin, Extralight, Light, Medium, Semibold, Bold, Extrabold, Black の う ちのいずれか一つであ り 、 ま た <font-normstyle> は Italic た と えば、 以下の SVG フ ォ ン ト 指定に対 し て : font-family="Tahoma" font-weight="Bold" font-style="Italic" PDFlib は、Windows ホ ス ト フ ォ ン ト を指定す る ために も 用い る こ と がで き る フ ォ ン ト ス タ イ ルを指定する ための こ のカ ン マ区切 り PDFlib 文法を用いて、フ ォ ン ト Tahoma,Bold,Italic を検索 し ます。 PDFlib はその後、 処理が成功 し て フ ォ ン ト が読み込め る ま で、 上に挙げた フ ォ ン ト 名 を順次読み込み試行 し ます。 こ の リ ス ト 内の フ ォ ン ト 名は、 フ ォ ン ト リ ソ ース指定で も 用 い る こ と がで き ます。 例 : p.set_option("FontOutline={<fontname>=<filename>}") p.set_option("FontNameAlias={<fontname>=ArialMT}") すべての試みが失敗 し た場合には、 PDFlib は、 名前 <font-family> を持つフ ォ ン ト を読み 込み試行 し て、 必要に応 じ て Bold ・ Italic プ ロ パテ ィ を擬似表現 し ます。 ブ ラ ウ ザに よ っ ては、 指定 さ れた フ ォ ン ト フ ァ ミ リ が見つか ら ない場合には、 フ ォ ン ト 選択プ ロ パテ ィ 群を無視する も のがあ り ます。 PDFlib はそ う い う こ と を し ませんので、 PDFlib の フ ォ ン ト 構成機構を通 じ て適切な フ ォ ン ト が得 ら れ る よ う に配慮す る 必要があ り ます (125 ページ 「5.4 フ ォ ン ト を読み込む」 参照)。 こ の font-family プ ロ パテ ィ は、 複数の フ ォ ン ト フ ァ ミ リ 名を内容 と す る場合 も あ り ま す。 例 : font-family="Georgia, 'Minion Web', 'Times New Roman', Times, 'MS PMincho', serif" こ の場合、 PDFlib は、 こ の リ ス ト 内の特定の フ ォ ン ト が読み込めなか っ た と き には、 その 次の フ ォ ン ト を読み込み試行 し ます。1 つの font-family リ ス ト に対 し て何 ら かの フ ォ ン ト が読み込めた場合には、 PDFlib は、 こ の リ ス ト 内の残 り の font-family 群を、 最初に読み 込んだ フ ォ ン ト (マ ス タ フ ォ ン ト ) に対す る 予備フ ォ ン ト (138 ページ 「5.4.6 予備フ ォ ン ト 」 参照) と し て読み込 も う と 試みます。 も し こ のマ ス タ フ ォ ン ト が、 も っ と 前に読み込 ま れていた ためにすでに予備フ ォ ン ト 群を持っ てい る と き には、 新 し い予備フ ォ ン ト 群 は、 既存の予備フ ォ ン ト の リ ス ト の末尾に追加 さ れます。 PDFlib が SVG グ ラ フ ィ ッ ク のための フ ォ ン ト を読み込む と 試み る際には、 以下のオプ シ ョ ンでデフ ォ ル ト で用い ら れます : embedding skipembedding={latincore standardcjk} subsetting こ れ ら の オ プ シ ョ ン を オ ー バ ラ イ ド す る に は、 PDF_load_graphics( ) defaultfontoptions を用い ます。 のオプシ ョ ン フ ォ ン ト 構成 Windows シ ス テ ムでは、 PDFlib は、 シ ス テ ムに イ ン ス ト ール さ れてい る す べての フ ォ ン ト にア ク セ ス で き ます (136 ページ 「5.4.5 Windows ・ OS X 上のホ ス ト フ ォ ン ト 」 参照)。 た と えば、 SVG フ ォ ン ト 指定 font-family="Verdana" font-weight="bold" 194 第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む は、 PDFlib フ ォ ン ト 名 Verdana,Bold と な り ます。 他のオペレーテ ィ ン グ シ ス テ ム では、 PDFlib は、FontOutline リ ソ ース が以下の方式で指定 さ れていればフ ォ ン ト を発見 し ます: <fontnamepattern>=<filename.xxx> こ こ で、 <fontnamepattern> は、 上述の フ ォ ン ト 名パ タ ーン群の う ちの一つであ り 、 ま た xxx は、 その照応す る 、 その フ ォ ン ト ア ウ ト ラ イ ン フ ァ イ ルの フ ォ ン ト 名拡張子です。 Type 1 フ ォ ン ト の場合には、 フ ォ ン ト リ ソ ース FontAFM ま たは FontPFM を設定す る必要 があ り ます。 上述の フ ォ ン ト 名パ タ ーン群の う ちの一つない し 複数に整合す る フ ォ ン ト 名を持つ適 切な FontOutline リ ソ ース は、 PDF_set_option( ) の enumeratefonts オプシ ョ ン で自動的に 作成す る こ と も で き ます。 フ ォ ン ト 構成に関 し て詳 し く は 131 ページ 「5.4.4 フ ォ ン ト を 検索」 を参照 し て く だ さ い。 総称 SVG フ ォ ン ト フ ァ ミ リ を PDF コ ア フ ォ ン ト へマ ッ プ PDFlib は、 以下 の 形 の FontNameAlias リ ソ ース を用いて、 総称 SVG フ ォ ン ト フ ァ ミ リ monospace ・ sans-serif ・ serif を、 総称 SVG フ ォ ン ト フ ァ ミ リ が最初に出現 し た時点で、 自動的に Latin コ ア フ ォ ン ト へマ ッ プ し ます : p.set_option("FontNameAlias={monospace=Courier}") p.set_option("FontNameAlias={monospace,Bold=Courier-Bold}") 総称フ ォ ン ト 名マ ッ ピ ン グの完全な リ ス ト は以下の と お り です (総称 フ ォ ン ト フ ァ ミ リ cursive と fantasy に対 し てはデフ ォ ル ト マ ッ ピ ン グはあ り ません) : monospace monospace,Bold monospace,Italic monospace,Bold,Italic Courier Courier-Bold Courier-Oblique Courier-BoldOblique sans sans,Bold sans,Italic sans,Bold,Italic Helvetica Helvetica-Bold Helvetica-Oblique Helvetica-BoldOblique sans-serif sans-serif,Bold sans-serif,Italic sans-serif,Bold,Italic Helvetica Helvetica-Bold Helvetica-Oblique Helvetica-BoldOblique serif serif,Bold serif,Italic serif,Bold,Italic Times-Roman Times-Bold Times-Italic Times-BoldItalic こ れ ら のマ ッ ピ ン グは、以前にユーザーに よ っ て他の適切な リ ソ ース が一切指定 さ れてい ない場合にのみ実行 さ れます。 7.2.5 見つか ら ない フ ォ ン ト 、 見つか ら ないグ リ フ を扱 う 見つか ら ない フ ォ ン ト と デ フ ォ ル ト フ ォ ン ト すべての フ ォ ン ト 読み込み試行が失敗 し た場合、PDFlib は、PDF_load_graphics( ) の defaultfontfamily オプシ ョ ンで定義 さ れた fontfamily 名 を 持つデ フ ォ ル ト フ ォ ン ト を 読み込 も う と 試み ま す。 デ フ ォ ル ト では、 Arial 7.2 SVG グ ラ フ ィ ッ ク 195 Unicode MS フ ォ ン ト が も し 得 ら れ る な ら それが、 そ う でないな ら Helvetica が用い ら れま す。 PDF の フ ォ ン ト 構成の中で Arial Unicode MS フ ォ ン ト が得 ら れ る よ う に し てお く か、 あ る いは、大 き な グ リ フ集合を持つ別の フ ォ ン ト を defaultfontfamily で指定 し てお く こ と を強 く 推奨 し ます。 た と えば、 フ ォ ン ト フ ァ イ ル CODE2000.TTF 内の Code2000 フ ォ ン ト を最終手段フ ォ ン ト と し て構成す る には、 以下のオプシ ョ ン を用い ます : defaultfontfamily={CODE2000} 個別の フ ォ ン ト を置換 得 ら れない、 あ る いは何 ら かの理由で望ま し く ない (た と えば、 充分な グ リ フ を含んでいないため。 後述) 特定の フ ォ ン ト を避け る ために、 得 ら れ る、 あ る いは よ り 適切な フ ォ ン ト へそれを マ ッ プする こ と がで き ます。フ ォ ン ト 名エ イ リ ア ス機 能 と PDF_set_option( ) を こ の目的に使い ます (詳 し く は 132 ページ 「フ ォ ン ト 名エ イ リ ア ス設定」 を参照) 。 た と えば、 中国語のテ キ ス ト が不適切に、 中国語のグ リ フ を一切含ん でいない Trebuchet MS フ ォ ン ト で設定 さ れてい る場合に、 こ れを以下の よ う に し て Arial Unicode MS へマ ッ プす る こ と がで き ます : p.set_option("FontnameAlias={ {Trebuchet MS}={Arial Unicode MS} }"); フ ォ ン ト 属性は自動的に追加 さ れ な い こ と に留意 し て く だ さ い。 た と え ば、 も し こ の Trebuchet MS フ ォ ン ト が属性 font-weight="bold" で使われてい る な ら ば、 こ の フ ォ ン ト の ボール ド 版へのエ イ リ ア ス を作成す る 必要があ り ます : p.set_option("FontnameAlias={ {Trebuchet MS,Bold}={Arial Unicode MS} }"); 見つか ら ないグ リ フ を視覚化 選択 さ れた フ ォ ン ト が、 必要な グ リ フ を含んでいない場 合には、 デフ ォ ル ト 置換グ リ フ がかわ り に用い ら れますので、 デフ ォ ル ト 設定ではテ キ ス ト は全 く 見え な く な り ます。見つか ら ないグ リ フ を視覚化する には、defaultfontoptions オ プシ ョ ン を用いて、 見え る 置換グ リ フ を指定す る こ と がで き ます。 た と えば、 PDF_load_ graphics( ) に対す る 以下のオプシ ョ ンは、 すべての見つか ら ないグ リ フ に対 し て疑問符を 表示 し ます : defaultfontoptions={replacementchar=?} 見つか ら ないグ リ フ に対 し て特定の予備 フ ォ ン ト を指定 SVG 内で指定 さ れてい る フ ォ ン ト が、 そのテ キ ス ト のための適切な グ リ フ を含んでいない場合には、 テ キ ス ト が全 く 見 え な く な り ます。 よ く あ る 例 と し て、 中国語のテ キ ス ト を、 中国語のグ リ フ を一切含んで いない欧文フ ォ ン ト で見せ よ う と し てい る 例を考え てみま し ょ う 。 も ち ろん最善の解決策 は、 SVG 内でそ も そ も 適切な フ ォ ン ト を用い る こ と で し ょ う 。 し か し 、 SVG 内の不適切 な フ ォ ン ト を扱わねばな ら ない場合には、PDFlib で予備フ ォ ン ト を指定す る こ と がで き ま す。 こ の予備フ ォ ン ト は、 元の フ ォ ン ト が特定のグ リ フ を与え ない と き に用い ら れます。 PDF_load_graphics( ) に対する 以下のオプシ ョ ンは、Arial Unicode MS を予備フ ォ ン ト と し て指定 し てい ます : defaultfontoptions={fallbackfonts={{fontname={Arial Unicode MS} encoding=unicode}}} なお、 さ き に説明 し た defaultfontfamily オプシ ョ ン で指定 さ れた フ ォ ン ト は、 フ ォ ン ト が 見つか ら ない と き に使用 さ れ る のに対 し て、 こ の予備技法は、 フ ォ ン ト は得 ら れ る が必要 な グ リ フ を全部は含んでいない場合にあ ては ま り ます。 196 第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む グ ロ ーバルな予備 フ ォ ン ト フ ァ ミ リ を指定 fallbackfontfamily ・ fallbackfontoptions オプ シ ョ ン を用い る と 、 予備フ ォ ン ト 群のフ ァ ミ リ と 、 照応す る オプシ ョ ン群を指定す る こ と がで き ます。 defaultfontoptions 内の fallbackfonts オプシ ョ ンは、 ただ 1 つの フ ォ ン ト を予備フ ォ ン ト と し て使用す る よ う 選択す る のに対 し て、 fallbackfontfamily を用い る と 、 予備フ ォ ン ト 群の フ ァ ミ リ を指定す る こ と がで き ます。 すなわち、 ス タ イ ル属性群が こ の フ ォ ン ト フ ァ ミ リ 名に適用 さ れます。 ただ し 、 指定 さ れた フ ォ ン ト の ス タ イ ル変種が実際に得 ら れ る こ と を前提 と し てい ます。 例 : fallbackfontfamily={Arial} fallbackfontoptions={encoding=unicode} 7.2.6 ベ ク ト ルグ ラ フ ィ ッ ク と テキス ト だけではない SVG 内容 SVG 内に埋め込まれた画像 PDFlib は、SVG 内の image エ レ メ ン ト を処理 し て、181 ペー ジ 「7.1 ラ ス タ 画像」 で解説 し たすべての画像形式 と 、 ネ ス ト さ れた SVG グ ラ フ ィ ッ ク を 受け付け ます。 画像デー タ は、 SVG フ ァ イ ル内に埋め込まれていて も 、 外部フ ァ イ ル内に 存在 し ていて も か ま い ません。 SVG グ ラ フ ィ ッ ク 内の画像は、 自動的に処理 さ れます。 ただ し 、 場合に よ っ ては、 特 定 の 画像処理 オ プ シ ョ ン 群 を 与 え る ほ う が よ い 場合 も あ り ま す。 こ れ は PDF_load_ graphics( ) の defaultimageoptions オプシ ョ ンで実現で き ます。 た と えば、 以下のオプシ ョ ン を用い る と 、 低解像度画像の見栄え を向上 さ せ る ア ンチエ イ リ ア ス を適用で き ます ( こ れは、 画像にア ンチエ イ リ ア ス を適用す る 多 く のブ ラ ウ ザの SVG 表示 と 整合 し ます) : defaultimageoptions={interpolate} 画像が得 ら れない場合には (参照 さ れた外部画像フ ァ イ ルが見つか ら ないな ど の原因で)、 PDFlib はデフ ォ ル ト では、透明な灰色の市松模様を作成 し ます。オプシ ョ ン fallbackimage を用い る と 、 こ のパ タ ーン を カ ス タ マ イ ズ し た り 、 あ る いはカ ス タ ムの画像ま たはテ ンプ レー ト を予備視覚効果 と し て与え る こ と がで き ます。 SVG 内の色 SVG の仕様に よ れば、 SVG 内のテ キ ス ト と ベ ク ト ルグ ラ フ ィ ッ ク に対す る 色は、 デフ ォ ル ト では sRGB 色空間で解釈 さ れます。 こ の こ と は論理的帰結 と し て、 SVG グ ラ フ ィ ッ ク は PDF/X と PDF/A においてデバ イ ス独立色 と し て扱われ る こ と を意味 し ま す。 し か し 、 SVG 内の埋め込み画像は別の色空間を用いてい る可能性があ る こ と に留意 し て く だ さ い。 た と えば、 埋め込まれてい る 、 ま たは参照 さ れてい る JPEG 画像は、 ICC プ ロ フ ァ イ ルあ り ま たはな し で CMYK 色空間を用いてい る か も し れません。 PDF_load_graphics( )にdevicergbオプシ ョ ンが与え ら れてい る 場合には、SVGグ ラ フ ィ ッ ク はプ レーン RGB カ ラ ーで解釈 さ れます。 こ の こ と は、 PDF/A ・ PDF/X の場面に よ っ て は禁 じ ら れてい ます。 SVG の リ ン ク SVG グ ラ フ ィ ッ ク 内の リ ン ク は、 通常、 生成 さ れ る PDF 出力内の イ ン タ ラ ク テ ィ ブな リ ン ク 注釈へ変換 さ れます : ただ し 、 リ ン ク の作成を無効化す る条件がい く つかあ り ます (PDFlib リ フ ァ レ ン ス参照)。 グ ラ フ ィ ッ ク の外部に位置す る リ ン ク は無視 さ れます。 PDF 注釈の contents オプシ ョ ンに、 SVG リ ン ク の xlink:title 属性が も し あれば それが、 なければ タ ーゲ ッ ト URI が記入 さ れます。 タ グ付 き PDF モー ド では、 生成 さ れ た リ ン ク に対 し て、 Link エ レ メ ン ト 1 個 と 、 関連す る OBJR エ レ メ ン ト 1 個が作成 さ れま す。 ただ し 、 カ レ ン ト でア ク テ ィ ブな ア イ テ ムがページ装飾か擬似エ レ メ ン ト であ る場合 を除 き ます。 7.2 SVG グ ラ フ ィ ッ ク 197 SVG リ ン ク の PDF リ ン ク への変換は、 PDF_fit_graphics( ) の convertlinks オプシ ョ ンで 無効にす る こ と も で き ま す。 なお、 その グ ラ フ ィ ッ ク に対 し て テ ン プ レ ー ト (フ ォ ーム XObject) が作成 さ れ る か、 その グ ラ フ ィ ッ ク がテ ン プ レ ー ト 上に配置 さ れ る 場合には、 リ ン ク は作成で き ません。 SVG 内の メ タ デー タ SVG グ ラ フ ィ ッ ク は、 XMP メ タ デー タ を含んでい る こ と も あ り ま す。 デフ ォ ル ト では PDFlib は、 出力フ ァ イ ルサ イ ズ を削減す る ために、 グ ラ フ ィ ッ ク 内 の SVG メ タ デー タ を無視 し ます。 ただ し 、 SVG か ら テ ンプ レー ト が作成 さ れ る 場合には、 PDF_load_graphics( ) の以下のオプシ ョ ンで、その XMP メ タ デー タ を、生成 さ れ る XObject に添付す る こ と も で き ます : templateoptions={metadata={keepxmp=true}} SVG グ ラ フ ィ ッ ク の metadata ・ desc ・ title エ レ メ ン ト の内容は、 PDF_info_graphics( ) で、 以下のパ タ ーンに従っ て取得で き ます : idx = (int) p.info_graphics(svg, "description", ""); if (idx != -1) description = p.get_string(idx, ""); 7.2.7 対応 し ていない SVG 機能 対応 し ていない機能の扱い デフ ォ ル ト では、対応 し ていない SVG 機能は無視 さ れます。 結果 と し て、 出力は作成 さ れますが、 そのグ ラ フ ィ ッ ク のい く つかの側面は失われてい る か、 あ る いは誤っ た状態 と な り ます。 こ の動作は、 PDF_load_graphics( ) の errorconditions オプシ ョ ンで変更で き ます。 そのサブオプシ ョ ン群は、 無視 さ れ る のでな く エ ラ ーを発生 さ せ る 条件 を 指定 し ま す。 た と えば、 以下のオプ シ ョ ン リ ス ト を 用い る と 、 PDF_load_ graphics( ) は、 SVG グ ラ フ ィ ッ ク がアニ メ ーシ ョ ンエ レ メ ン ト ま たは ス ク リ プテ ィ ン グエ レ メ ン ト を含む場合には失敗 し ます : errorconditions = {element={animate script}} 一般的制限 以下の制限が、 多 く のエ レ メ ン ト に影響を与え ます : > 外部 URL への参照は解決 さ れません (画像 ・ フ ォ ン ト な ど) 対応 し ていない SVG エ レ メ ン ト 以下の SVG エ レ メ ン ト は、 対応 さ れてお ら ず、 無視 さ れます : > ア ニ メ ーシ ョ ン と ス ク リ プテ ィ ン グのためのエ レ メ ン ト 群 : animate, animateColor, animateMotion, animateTransform, script, mpath, set > SVG フ ィ ル タ のためのエ レ メ ン ト 群 : feBlend, feColorMatrix, feComponentTransfer, feComposite, feConvolveMatrix, feDiffuseLighting, feDisplacementMap, feDistantLight, feFlood, feFuncA, feFuncB, feFuncG, feFuncR, feGaussianBlur, feImage, feMerge, feMergeNode, feMorphology, feOffset, fePointLight, feSpecularLighting, feSpotLight, feTile, feTurbulence, filter > グ リ フ選択のためのエ レ メ ン ト 群 : altGlyph, altGlyphDef, altGlyphItem, glyphRef > その他のエ レ メ ン ト 群 : 198 第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む cursor, foreignObject, vkern 制約のあ る SVG 属性 と プ ロパテ ィ 以下の属性 と プ ロ パテ ィ には制約があ り ます : > い く つかの CSS 規則に対応 し てい ません。 例 : @import ・ @font-face > フ ォ ン ト 選択プ ロ パテ ィ font-variant には、キー ワー ド small-caps でのみ、かつOpenType 機能 smcp を含むフ ォ ン ト に対 し てのみ対応 し てい ます。 > テ キ ス ト 体裁プ ロ パテ ィ text-decoration の複数の値の組み合わせには対応 し てい ませ ん。 PDFlib は文字飾 り 要素を、 別個の塗 り ・ 描線色を持つ領域 と し て描 く のではな く 、 文字飾 り 要素を直線 と し て描 き ます。 こ の直線は、 塗 り 色があればそれで、 なければ 描線色で描かれます。 > textPath エ レ メ ン ト に対す る rotate 属性には対応 し てい ません。 > プ ロ パテ ィ unicode-bidi には、双方向テ キ ス ト レ イ ア ウ ト のために必要なテーブルを含 む TrueType/OpenType フ ォ ン ト についてのみ従い ます。 PDFlib は、 PDF_fit_textline( ) のオプシ ョ ン リ ス ト 内で、 オプシ ョ ン shaping と script=_auto を設定 し ます。 > view エ レ メ ン ト に対す る 属性 preserveAspectRatio は無視 さ れます。 対応 し てい ない SVG プ ロパテ ィ れます : 以下の SVG プ ロ パテ ィ は、 対応 さ れてお ら ず、 無視 さ alignment-baseline, color-interpolation, color-interpolation-filters, color-profile, color-rendering, cursor, dominant-baseline, enable-background, filter, flood-color, flood-opacity, font, glyph-orientation-horizontal, glyph-orientation-vertical, image-rendering, lighting-color, pointer-events, shape-rendering, text-rendering 対応 し てい る SVG エ レ メ ン ト の対応 し ていない属性 以下の属性は、 対応 さ れてお ら ず、 無視 さ れます : 対応 し てい る SVG エ レ メ ン ト の、 baseProfile (svg) contentScriptType (svg) contentStyleType (svg) externalResourcesRequired (すべてのエレメント) method (textPath) on* (すべてのエレメント) requiredExtensions (すべてのエレメント) requiredFeatures (すべてのエレメント) spacing (textPath) spreadMethod (linearGradient, radialGradient) version (svg) zoomAndPan (svg) xlink:role (すべてのエレメント) xlink:show (すべてのエレメント) xlink:type (すべてのエレメント) 7.2 SVG グ ラ フ ィ ッ ク 199 7.3 PDF ページ を PDI で取 り 込む 注 こ の節で解説するすべての関数は、PDFlib+PDI か、または PDFlib Personalization Server PPS ( こ れは PDI を含んでいます) を必要 と し ます。 PDF 取 り 込みラ イ ブ ラ リ (PDI) は PDFlib 基本製品には含まれていません。PDI は PDFlib のすべてのバイ ナ リ 版に内蔵 さ れています が、 それを利用するには PDFlib+PDI か PPS のためのラ イ セ ン スキーが必要です。 7.3.1 PDI の機能 と 用途 PDI (PDF 取 り 込み ラ イ ブ ラ リ ) が得 ら れ る 場合には、 既存 PDF 文書内のページ を取 り 込 む こ と がで き ます。 PDI は、 既存 PDF 文書内のページ を PDFlib で利用で き る よ う に し ま す。 概念的に、 取 り 込まれた PDF ページは、 取 り 込まれた ラ ス タ 画像 と 同様に扱われま す : PDF 文書を開 き 、 取 り 込むページ を選び、 それを出力ページ上に配置 し ます。 取 り 込 んだページに PDFlib の変形関数を適用 し て並行移動 ・ 拡縮 ・ 回転 ・ 斜形化 さ せ る こ と も で き ま す。 取 り 込んだページは新 し い内容 と 組み合わせ る こ と がで き ま す。 そのために は、取 り 込んだ PDF ページ を出力ページ上に配置 し た後に PDFlib のテ キ ス ト ・グ ラ フ ィ ッ ク 関数を使えば よ いのです (取 り 込んだページは新 し い内容の背景 と な る と 捉え ら れ ま す)。 PDFlib と PDI を活用すれば以下の よ う な課題が簡単に実現で き ます : > 複数の PDF 文書内の複数のページ を重ね合わせ (た と えば、 既存文書に便箋を追加 し て印刷済み用紙の よ う にす る )。 > 既存文書内に PDF 広告を配置。 > PDF のページの表示領域を切 り 抜いて、 見せた く ない要素 ( ト ン ボな ど) を取 り 除 く 。 ま たは、 ページの拡縮。 > 複数ページ を 1 枚の紙に印刷。 > 複数の PDF/X か PDF/A の文書を処理 し て、新 し い PDF/X か PDF/A の フ ァ イ ルを作成す る。 > フ ァ イ ルの PDF/X か PDF/A の出力 イ ン テ ン ト を コ ピー。 > 既存 PDF のページにテ キ ス ト (ヘ ッ ダ ・ フ ッ タ ・ ス タ ンプ ・ ページ番号な ど) や画像 (企業 ロ ゴ な ど) を追加。 > 入力文書内の全ページ を出力文書に コ ピー し て、 各ページにバー コー ド を配置。 > pCOS イ ン タ フ ェース を使っ て、PDF 文書の任意のプ ロ パテ ィ を ク エ リ (詳 し く は pCOS パ ス リ フ ァ レ ン ス を参照)。 PDF の背景ページ を配置 し てそ こ に動的なデー タ を入れ込みたい場合には(た と えば メ ー ルのマージや、 Web 上のパー ソ ナ ラ イ ズ さ れた PDF 文書や、 フ ォーム記入な ど)、 PDI を PDFlib ブ ロ ッ ク と あわせて利用 さ れ る こ と をおすすめ し ます (359 ページ 「12 章 PPS と PDFlib Block Plugin」 参照)。 7.3.2 PDFlib+PDI を使用 ク ッ ク ブ ッ ク PDF 取 り 込みの諸側面に関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ ク の pdf_import カ テ ゴ リ にあ り ます。 一般的考察 重要な注意点 と し て、 PDI は実際のページ内容だけ を取 り 込みますので、 取 り 込む PDF 文書内に存在 し てい る か も し れない イ ン タ ラ ク テ ィ ブ機能 (た と えばサ ウ ン ド ・ ムービー ・ フ ァ イ ル添付 ・ ハ イ パーテ キ ス ト リ ン ク ・ フ ォーム フ ィ ール ド ・ JavaScript ・ し お り ・ サ ム ネール ・ ノ ー ト ) は一切取 り 込み ま せん。 こ う し た イ ン タ ラ ク テ ィ ブ機能 は、 その照応す る PDFlib 関数で生成す る こ と がで き ます。 以下のア イ テ ム を取 り 込む こ と も で き ます : 200 第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む > 構造エ レ メ ン ト タ グ を取 り 込め ます(詳 し く は 203 ページ「タ グ付き PDF 文書内のペー ジ を取 り 込む」 を参照) > レ イ ヤ定義を取 り 込め ます(詳 し く は 203 ページ「レ イ ヤーを持つ PDF ページ を取 り 込 む」 を参照) > (PPS のみ)PDFlib ブ ロ ッ ク を、PDF_process_pdi( ) と オプシ ョ ン action=copyallblocks ま た は copyblock で取 り 込め ます (402 ページ 「12.8.2 PDFlib ブ ロ ッ ク を取 り 込む」 参照)。 取 り 込んだページ内の個々の要素を他の PDFlib 関数で再利用す る こ と はで き ません。 た と えば、取 り 込んだ文書内の フ ォ ン ト を他の何 ら かの内容のために再利用す る こ と は不可 能です。 必要な フ ォ ン ト はすべて PDFlib 内で構成す る 必要があ り ます。 取 り 込んだ複数 の文書が同 じ フ ォ ン ト の埋め込みフ ォ ン ト デー タ を それぞれ持っ ていた と し て も 、 フ ォ ン ト デー タ の重複を PDI は解消 さ せません。 他方、 取 り 込んだ PDF 内で欠けてい る フ ォ ン ト があれば、 生成 さ れ る PDF 出力フ ァ イ ル内で も その フ ォ ン ト は欠けた ま ま です。 最適 な方法 と し ては、 取 り 込む文書はな る べ く 開いた ま ま に し ておいたほ う が、 同 じ フ ォ ン ト が何度 も 出力文書内に埋め込まれずにすみます。 取 り 込んだ PDF のページ を出力ページ上に配置す る ために PDFlib+PDI はテ ンプ レー ト 機能 (フ ォーム XObject) を利用 し ます。 他の PDF 文書か ら 取 り 込まれたページ を含む文 書を さ ら に PDFlib+PDI で処理す る こ と も で き ます。 PDF ページ を取 り 込むための コ ー ド 断片 既存 PDF 文書内のページの取 り 込みは非常に 単純な コ ー ド 構造で実現可能です。 以下の コ ー ド ス ニペ ッ ト は、 既存文書のページ を開 き、 そのページ内容を出力 PDF 文書内に コ ピー し ます (出力 PDF 文書はあ ら か じ め開い てい る必要があ り ます) : int String doc, page, pageno = 1; filename = "input.pdf"; if (p.begin_document(outfilename, "") == -1) {...} ... doc = p.open_pdi_document(infilename, ""); if (doc == -1) throw new Exception("エラー:" + p.get_errmsg()); page = p.open_pdi_page(doc, pageno, ""); if (page == -1) throw new Exception("エラー:" + p.get_errmsg()); /* ダミーのページサイズ。この後adjustpageオプションによって変更される */ p.begin_page_ext(20, 20, ""); p.fit_pdi_page(page, 0, 0, "adjustpage"); p.close_pdi_page(page); ...ページに内容を追加するPDFlib関数群... p.end_page_ext(""); p.close_pdi_document(doc); PDF_fit_pdi_page( ) の最後の引数は、 取 り 込むページの位置付け ・ 拡縮 ・ 回転を指示す る さ ま ざ ま なオプシ ョ ン を持ち う る オプシ ョ ン リ ス ト です。 こ のオプシ ョ ンについては詳 し く は 205 ページ 「7.4 画像・グ ラ フ ィ ッ ク ・取 り 込み PDF ページ を配置」で解説 し てい ます。 7.3 PDF ページ を PDI で取 り 込む 201 7.3.3 文書 ・ ページ関連のチ ェ ッ ク 文書関連のチ ェ ッ ク PDFlib+PDI は、Acrobat で開 く こ と ので き る すべての種類の PDF 文 書を、 PDF バージ ョ ン番号や、 その フ ァ イ ル内で使用 さ れてい る 機能にかかわ ら ず、 適切 に処理 し ます。 PDFlib+PDI は、 特定の種類の破損 し た文書で も 開 く こ と がで き る よ う 、 破損 PDF のた めの修復モー ド を実装 し てい ます。 ただ し 、 まれに、 PDF 文書が、 あ る いは文書の特定の ページが、 PDI に よ っ て拒絶 さ れ る こ と も あ り ます。 PDF文書ま たはページが う ま く 取 り 込めない と き は、PDF_open_pdi_document( ) と PDF_ open_pdi_page( ) はエ ラ ー コ ー ド を返 し ます。 失敗に関 し て も っ と 詳 し く 知 る 必要があ る 場 合 に は、 そ の 理由 を PDF_get_errmsg( ) で ク エ リ す る こ と が で き ま す。 あ る い は、 errorpolicy オプシ ョ ン を exception に設定す る こ と に よ っ て、文書を開 く こ と がで き なかっ た と き には例外が発生す る よ う にす る こ と も で き ます。 ページ関連のチ ェ ッ ク PDF_open_pdi_page( ) 内で以下のチ ェ ッ ク が行われます : > 生成 さ れつつあ る PDF 出力文書 よ り も 高い PDF バージ ョ ン番号を用いてい る PDF 文書 の中のページは、 取 り 込め ません。 その理由は、 よ り 高いバージ ョ ン番号を持つ PDF が取 り 込まれた後には、 その出力が本当に、 要求 さ れた PDF バージ ョ ンに準拠 し てい る か ど う か、 PDFlib は確信が持てな く な る か ら です。 解決策 : 出力 PDF のバージ ョ ン を、 PDF_begin_document( ) 内の compatibility オプシ ョ ン を用いて、 必要な レベルに設 定 し ます。 PDF 1.7ext 3 (Acrobat 9) と PDF 1.7ext8 (Acrobat X/XI) の文書は、 PDI に関す る限 り 、 PDF 1.7 と 互換です。 PDF/A モー ド では、入力 PDF バージ ョ ン番号は意味を持ち ません。なぜな ら PDF バー ジ ョ ンヘ ッ ダは PDF/A では無視 さ れ る 必要があ る か ら です。 文書が、よ り 古い PDF バージ ョ ンに準拠 し てい る こ と がわかっ てい る に も かかわ ら ず、 よ り 高い PDF バージ ョ ンヘ ッ ダ を使用 し てい る 場合には、 PDF_open_pdi_document( ) の ignorepdfversion オプシ ョ ン を用い る こ と がで き ます。 > PDF/A ・ PDF/X ・ PDF/VT ・ PDF/UA の文書が、 その照応す る 、 カ レ ン ト 出力文書の PDF/A ・ PDF/X ・ PDF/VT ・ PDF/UA ス テー タ ス と 非互換でないか。 詳 し く は以下の項 を参照 し て く だ さ い : >328 ページ 「11.3.7 PDF/A 文書を PDI で取 り 込み」。 >338 ページ 「11.4.5 PDF/X 文書を PDI で取 り 込む」。 >349 ページ 「11.5.7 PDF/X ・ PDF/VT 文書を PDI で取 り 込む」。 >357 ページ 「11.6.4 PDF/UA 文書を PDI で取 り 込む」。 > 文書が、矛盾 し た PDF/A ま たは PDF/X 出力 イ ン テ ン ト を含んでい る 場合には、ページ は一切取 り 込まれません。 7.3.4 取 り 込んだ PDF 文書の具体的特徴 取 り 込んだ PDF ページの寸法 取 り 込んだ PDF ページは取 り 込んだ ラ ス タ 画像 と 同様に 扱われ、 PDF_fit_pdi_page( ) を用いて出力ページ上に配置す る こ と がで き ます。 デフ ォ ル ト では、 Acrobat での表示 と ま っ た く 同 じ 形で PDI はページ を取 り 込みます。 と り わけ次 の よ う な動作を し ます : > ク ロ ッ ピ ン グは保持 さ れます (技術的にいえば : CropBox が存在す る場合には、 PDI は MediaBox よ り も CropBox を優先採用 し ます。 75 ページ 「3.2.2 ページサ イ ズ」 参照)。 > ページに適用 さ れてい る 回転は保持 さ れます。 202 第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む cloneboxes オプシ ョ ンは PDFlib+PDI に対 し て、 取 り 込みページのすべてのページ枠を生 成出力ページへ コ ピーす る よ う 指示 し 、 その結果、 すべてのページサ イ ズ情報が転写 さ れ ます。 あ る いは、 pdiusebox オプ シ ョ ン を 用いて明示的に、 ページ の MediaBox ・ CropBox ・ TrimBox ・ ArtBox エン ト リ の う ちのいずれか を ( も し あれば) 用いて取 り 込みページのサ イ ズ を決め る よ う PDI に指示す る こ と も で き ます。 色の扱い PDFlib+PDI は、取 り 込んだ PDF 文書の色を一切変更 し ません。 た と えば、PDF が ICC カ ラ ープ ロ フ ァ イ ルを含んでい る 場合、 こ れは出力文書内に保持 さ れます。 タ グ付き PDF 文書内のページ を取 り 込む デフ ォ ル ト では、 タ グは、 入力文書 と 出力文 書の両方が タ グ付け さ れていれば取 り 込まれます。 ただ し 、 タ グ取 り 込みは、 PDF_open_ pdi_document( ) と PDF_open_pdi_page( ) の usetags オプシ ョ ン で無効にす る こ と も で き ま す。 詳 し く は 306 ページ 「10.4.5 タ グ付 き PDF ページ を PDI で取 り 込む」 を参照 し て く だ さ い。 レ イ ヤー を持つ PDF ページ を取 り 込む PDFlib はつねに、 ページ上のすべての レ イ ヤー (技術的には 「オプシ ョ ナル内容」 と いい ます) の内容を取 り 込みます。 レ イ ヤーの可視 ス テー ト を含むレ イ ヤー定義 も 、 その レ イ ヤーが、 取 り 込んだページ群の う ちのいずれか で使用 さ れていれば、 取 り 込まれます。 ただ し 、 レ イ ヤー定義の取 り 込みは、 PDF_open_ pdi_document( ) の uselayers オプシ ョ ン で無効にす る こ と も で き ます。取 り 込んだ レ イ ヤー 群の整頓を さ ら に制御す る には、取 り 込んだ レ イ ヤー群に付加 さ れ る レ イ ヤー リ ス ト の中 に階層構造的な タ イ ト ルレ イ ヤーを作成す る PDF_open_pdi_document( ) の parenttitle を 用い る こ と も で き ます (た と えばフ ァ イ ル名を与え る ために)。 parentlayer オプシ ョ ンは、 同様に動作 し ますが、 ただ し ユーザー定義レ イ ヤーのハン ド ルを と り ます。 注 PDF/X-4:2008 に従っ た レ イヤーバ リ ア ン ト は、 Acrobat X 以上では対応 し な く な り ま し た ので、 取 り 込まれません。 地理参照付 き PDF を取 り 込む 地理参照付き PDF を PDI で取 り 込む際には、 地理空間情 報は、 それが以下のいずれかの方式で作成 さ れていれば保持 さ れます (画像ベース の地理 空間参照) : > PDFlib で PDF_load_image( ) の georeference オプシ ョ ン で > Acrobat で地理空間情報を持つ画像を取 り 込んで。 地理空間情報はページ を取 り 込んだ後、それが以下のいずれかの方式で作成 さ れていた場 合には失われます (ページベース の地理空間参照) : > PDFlib で PDF_begin/end_page_ext( ) の viewports オプシ ョ ンで > Acrobat で手作業で PDF ページ を地理登録 し て。 複数の取 り 込み文書を ま た ぐ 最適化 PDFlib 自体は、 高度に最適化 し た PDF 出力を作成 し ますが、 取 り 込んだ PDF には も し かす る と 冗長なデー タ 構造があ っ て、 場合に よ っ て は最適化の余地があ る か も し れません。 さ ら に、 取 り 込む PDF が も し 複数であれば、 そ の複数の フ ァ イ ルが等価な リ ソ ース (フ ァ イ ル等) を含む場合には、 出力す る フ ァ イ ルの サ イ ズはふ く れあ が る 可能性が あ り ま す。 こ の よ う な場面では、 PDF_begin_document( ) の optimize オプシ ョ ン を使 う こ と がで き ます。 こ れは取 り 込んだ フ ァ イ ル内の冗長なオ ブジ ェ ク ト を検知 し て、生成す る 出力の体裁や品質を そ こ な う こ と な く そ う し たオブジ ェ ク ト を削除 し ます。 7.3 PDF ページ を PDI で取 り 込む 203 暗号化 さ れた PDF 文書 と 「シ ュ ラ ッ グ」 機能 暗号化文書内 (すなわち、 権限設定ま た はパ ス ワ ー ド を持っ た フ ァ イ ル) のページ を取 り 込むためには、 その照応す る マ ス タ ーパ ス ワ ー ド を与え る 必要があ り ます。暗号化 さ れた PDF 文書でパ ス ワー ド がない も のは、デ フ ォ ル ト では拒絶 さ れます。 ただ し こ れは、 PDF_open_pdi_document( ) の infomode オプ シ ョ ン を true に設定す る こ と に よ り 、 pCOS で情報を ク エ リ す る ために (ページ を取 り 込 むためではな く ) 開 く こ と はで き ます。 ( こ の infomode 規則に対す る 例外 : Distiller の設 定 「オブ ジ ェ ク ト レ ベルの圧縮 : 最高」 を用いて作成 さ れた文書は、 情報モー ド で も 開 く こ と がで き ません)。 「シ ュ ラ ッ グ」 機能を利用す る と 、 保護 さ れた文書の中のページ を、 その文書の作成者 の権利を尊重する 責任を ユーザーが受け入れ る こ と を前提 と し て、マ ス タ ーパ ス ワー ド な し で取 り 込む こ と がで き ま す。 「シ ュ ラ ッ グ」 機能を利用す る こ と に よ り 、 ユーザーは、 彼ま たは彼女がいかな る 文書作成者の権利を も 侵害 し ていない こ と を宣明 し ます。 PDFlib GmbH の契約条件は、 ユーザーが文書作成者の権利を尊重す る こ と を求めてい ます。 以下のすべての条件が真であ る と き に、 「シ ュ ラ ッ グ」 機能は有効にな り ます : > PDF_open_pdi_document( ) に shrug オプシ ョ ンが与え ら れてい る 。 > その文書はマ ス タ ーパ ス ワー ド を必要 と し てい る が、それが PDF_open_pdi_document( ) に与え ら れていない。 > その文書がユーザー (開 く ) パ ス ワー ド を必要 と し てい る場合には、 それが PDF_open_ pdi_document( ) に与え ら れてい る 必要があ り ます。 「シ ュ ラ ッ グ」 機能には以下の効果があ り ます : > マ ス タ ーパ ス ワー ド が与え ら れていな く て も ページ を取 り 込む こ と がで き る。 > pCOS 擬似オブジ ェ ク ト shrug が true/1 に設定 さ れ る。 > pCOS が完全モー ド で動作す る (限定モー ド ではな く )。 すなわち、 pcosmode 擬似オブ ジ ェ ク ト が 2 に設定 さ れ る 。 204 第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む 7.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配 置 ラ ス タ 画像 と テ ンプ レー ト を配置す る ための関数 PDF_fit_image( ) と 、 グ ラ フ ィ ッ ク を配 置す る ための関数 PDF_fit_graphics( ) と 、取 り 込み PDF ページ を配置する ための関数 PDF_ fit_pdi_page( ) は、 ページ上への配置を制御す る ための さ ま ざ ま なオプシ ョ ン を提供 し て い ます。 こ の節では、 い く つかの代表的な応用作業を見てみる こ と に よ っ て、 も っ と も 重 要ない く つかのオプシ ョ ンの動作を示 し ます。すべてのオプシ ョ ンの完全な一覧 と 説明に ついては、 PDFlib リ フ ァ レ ン ス を参照 し て く だ さ い。 こ の節に載せ る 作成例はすべて、 ラ ス タ 画像で も テ ン プ レー ト で も グ ラ フ ィ ッ ク で も 取 り 込み PDF ページで も 、 同 じ く 動作 し ます。 コ ー ド の作成例は ラ ス タ 画像のための も の し か載せませんが、 オブジ ェ ク ト 一般の配置方法を そ こ では語っ てい る のです。 あ ら ゆ る fit 関数はすべて、 それを呼び出す前にはかな ら ず、 PDF_load_image( ) か PDF_load_ graphics( ) か PDF_open_pdi_document( ) と PDF_open_pdi_page( ) への呼び出 し を行 う 必要 があ り ます。 簡潔のため、 こ れ ら の呼び出 し は こ こ では繰 り 返 し ません。 ク ッ ク ブ ッ ク 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページに関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ クの images ・ graphics ・ pdf_import カ テ ゴ リ にあ り ます。 7.4.1 単純にオ ブ ジ ェ ク ト を配置 画像を参照点に位置付け デ フ ォ ル ト では、 オブジ ェ ク ト はその元のサ イ ズで、 左下隅 を参照点に配置 さ れ ま す。 こ の例では、 画像の下端中央を参照点 (0, 0) に配置 し てみ ま しょう : p.fit_image(image, 0, 0, "position={center bottom}"); 同様に、 position オプシ ョ ン を キーワー ド left ・ right ・ center ・ top ・ bottom か ら 別の組み 合わせで使 う こ と に よ っ て、 オブジ ェ ク ト それぞれ左端 ・ 右端 ・ 中央 ・ 上端 ・ 下端を参照 点に配置す る こ と がで き ます。 画像を拡縮 し て配置 も 変更で き ます : コ ー ド を以下の よ う に変え る と 、 画像を配置す る 際にその大 き さ p.fit_image(image, 0, 0, "scale=0.5"); こ の コ ー ド 断片は、 オブジ ェ ク ト の左下隅を ユーザー座標系の点 (0, 0) に配置 し ます。 と 同時に、 オブジ ェ ク ト は x ・ y 方向に拡縮倍率 0.5 で拡縮 さ れ る ので、 元の 50 パーセ ン ト の大 き さ にな り ます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの images/starter_image ト ピ ッ ク にあ り ます。 7.4.2 オ ブ ジ ェ ク ト を点上か線上か枠内に配置 オブジ ェ ク ト を位置付け る ために、あ ら か じ め定義 し た幅 と 高 さ の枠を あわせて使 う こ と も で き ます。 以下の図内の灰色の枠 と 線は、 枠の大 き さ を視覚化す る ために描 き足 し て あ る だけで、 実際の出力にはあ り ません。 オブジ ェ ク ト を枠内に配置す る こ と は、fitmethod=nofit の場合には意味があ り ません。 なぜな ら こ の場合、 そのオブジ ェ ク ト は位置付け ら れ る だけであ り 、 拡縮は行われないか 7.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置 205 ら です。 boxsize オプシ ョ ン を用いて、 オブジ ェ ク ト 配置のための横線か縦線、 あ る いは 実際の枠を指定す る こ と がで き ます : boxsize={100 0} boxsize={0 100} boxsize={100 200} 横線 縦線 枠 以下の さ ま ざ ま な例では、 オブジ ェ ク ト を枠内に、 さ ま ざ ま なはめ込み方式ではめ込んで いき ま し ょ う 。 枠内へ自動はめ込み fitmethod=auto を用い る と 、 PDFlib は画像を、 枠内にはめ込め る よ う に、 ただ し それ をつぶ さ ずに拡縮 し ま す : も し それがその枠内にはめ込めた場合に は、 拡縮は一切行われません。 そ う でない場合には、 幅 と 高 さ の縦横比を保ちなが ら 、 寸 法が縮小 さ れます。 図 7.2a・図 7.2b・図 7.2c では、はめ込み枠の寸法が最初 boxsize={70 45}、次に boxsize={70 30}、 さ ら に boxsize={30 30} と 減少 し てい く につれて、 PDFlib が画像寸法を縮小 し てい く さ ま を演示 し てい ます。 図 7.2 さ ま ざ ま なはめ込み方式に従っ て画像を枠内にはめ込む 生成 さ れる出力 206 PDF_fit_image に与え るオプ シ ョ ン リ ス ト a) boxsize={70 45} position=center fitmethod=auto (拡縮は必要でない) b) boxsize={70 30} position=center fitmethod=auto (枠の高さが小さくなったのに合わせて縮小される) c) boxsize={30 30} position=center fitmethod=auto (枠の高さと幅が小さくなったのに合わせて縮小される) d) boxsize={70 45} position=center fitmethod=meet e) boxsize={35 45} position=center fitmethod=meet f) boxsize={70 45} position=center fitmethod=entire g) boxsize={30 30} position=center fitmethod=clip 第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む 生成 さ れる出力 PDF_fit_image に与え る オプ シ ョ ン リ ス ト h) boxsize={30 30} position={right top} fitmethod=clip 画像を枠の中央へはめ込み あ ら か じ め定義 し た長方形の中央に画像 を 置 き た い と き は、 自 分 で 計算 を す る 必要 は 全 く な く 、 適 切 な オ プ シ ョ ン を 使 え ば実 現 で き ま す。 position=center を使っ て、 幅 70 ・ 高 さ 45 単位の枠 (boxsize={70 45}) の中央に画像を配 置 し ま し ょ う 。 fitmethod=meet を使 う と 、 画像は縦横比を保ちつつ、 その上下が枠に収 ま り き る ま で拡大縮小 さ れます (図 7.2d 参照)。 枠の幅を 70 か ら 35 単位に縮め る と 、 画像はその左右が枠に収ま り き る ま で縮小 さ れ ます (図 7.2e 参照)。 fitmethod=meet では、 画像がつぶ さ れない こ と が保証 さ れ る と と も に、 枠内に、 で き る だけ大 き く 配置 さ れます。 画像を枠全体へはめ込み 画像を も っ と 枠に合わせて、 枠全体を画像が埋め る よ う にす る こ と も で き ます。 こ れは fitmethod=entire で実現で き ます。 し か し 、 こ の組み合わせは 画像をつぶすおそれがあ る ので、 有用な場合は まれで し ょ う (図 7.2f 参照)。 画像を枠へはめ込む際に切 り 抜 き 別のはめ込み方式 (fitmethod=clip) を使 う と 、 オブ ジ ェ ク ト がはめ込んだ枠か ら はみ出 し た と き に、そのオブジ ェ ク ト を切 り 抜 く こ と がで き ます。 枠の大 き さ を縦横 と も 30 単位に縮めて、 画像を その枠の中央に元の大 き さ の ま ま 位置付けてみま し ょ う (図 7.2g 参照)。 画像を枠の中央に位置付け る こ と に よ っ て、 画像はすべての端が均等に切 り 落 と さ れ ます。 同様に、 画像の右上部分をすべて見せたいな ら ば、 position={right top} で位置付け れば よ いで し ょ う (図 7.2h 参照)。 7.4.3 オ ブ ジ ェ ク ト の向 き を変え る 画像の向 き を変え て配置 今度の例 と し ては、 画像の向 き を西向 き に変え てみま し ょ う (orientate=west)。 こ れはすなわち、 画像が 90° 反時計回 り に回転 さ れ、 その回転後のオ ブジ ェ ク ト の左下隅が参照点 (0, 0) へ並行移動 さ れ る こ と を意味 し ます。 画像はその場で 回転 し ます (図 7.5a 参照)。 はめ込み方式を指定 し ていないので、 画像は元の大 き さ の ま ま出力 さ れて、 枠か ら はみ出 し ます。 画像の向 き を変え て縦横比を保ち つつ枠ち ょ う どへはめ込み 今度は、 画像を西に向け た う えで、 あ ら か じ め定義 し た大 き さ にす る こ と に挑戦 し てみま し ょ う 。 求め る大 き さ の 枠を定義 し て、 画像の縦横比を変えずにその枠にはめ込みます (fitmethod=meet) 。 向 き は orientate=west と 指定 し ます。 デフ ォ ル ト では、 画像は枠の左下隅に配置 さ れます (図 7.5b 参照)。 東に向けた画像を図 7.5c に、 南向 き を図 7.5d に示 し ます。 orientate オプシ ョ ンは、 図 7.4 に示す と お り 、 向 き のキーワ ー ド と し て north ・ east ・ west ・ south に対応 し てい ます。 なお、 orientate オプシ ョ ンは、 座標系全体には一切影響せずに、 配置す る オブジ ェ ク ト にだけ影響を及ぼ し ます。 7.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置 207 図 7.4 orientate オプ シ ョ ン 図 7.3 rotate オプ シ ョ ン 図 7.5 画像の向き を変え る 生成 さ れる出力 PDF_fit_image に与え るオプ シ ョ ン リ ス ト a) boxsize={70 45} orientate=west1 b) boxsize={70 45} orientate=west fitmethod=meet c) boxsize={70 45} orientate=east fitmethod=meet d) boxsize={70 45} orientate=south fitmethod=meet e) boxsize={70 45} position={center bottom} orientate=east fitmethod=clip 1. デ フ ォ ル ト fitmethod=nofit ですので、 こ の boxsize オプ シ ョ ンは実際には必要あ り ません。 向 き を変え た画像を枠へはめ込んで切 り 抜き 画像を東に向けて (orientate=east)、枠の 下端中央に位置付け ま し ょ う (position={center bottom}) 。 さ ら に、 画像を元の大 き さ の ま ま配置 し 、 も し 画像が枠か ら はみ出 し た ら 切 り 落 と し ます (fitmethod=clip) (図 7.5e 参 照)。 7.4.4 オ ブ ジ ェ ク ト を回転 rotate オプシ ョ ンは、 参照点を中心に座標系を回転 さ せ る こ と に よ っ て、 オブジ ェ ク ト を 回転 さ せます。 結果 と し て、 はめ込み枠 も 回転 さ れます。 図 7.3 に、 rotate オプシ ョ ンの 一般的な動作を図示 し ます。 208 第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む 画像を回転 さ せて配置 まずは じ めに、 画像を 90° 反時計回 り に回転 さ せ る こ と に挑戦 し てみま し ょ う 。 オブジ ェ ク ト を配置す る 前に、 座標系は参照点で 90° 反時計回 り に回 転 さ れ ます。 回転後のオブジ ェ ク ト の右下隅 (回転前のオブジ ェ ク ト の左下隅だっ た所) が、 最終的に参照点の位置にな り ます。 こ の場合を示 し たのが図 7.6a です。 回転は座標系全体に影響す る ので、 枠の回転 さ れます。 同様に、 画像を 30° 反時計回 り に回転す る こ と がで き ます (図 7.6b 参照)。 画像を回転 し てはめ込み 今度は、 画像を 90° 反時計回 り に回転 さ せて、 縦横比を保ち つつ枠にはめ込む こ と に挑戦 し てみま し ょ う 。 こ れは fitmethod=meet を使えば実現で き ます (図 7.6c 参照)。 同様に、 画像を 30° 反時計回 り に回転 さ せて、 その画像を縦横比 を保ちつつ枠にはめ込む こ と がで き ます (図 7.6d 参照)。 図 7.6 画像を回転 生成 さ れる出力 PDF_fit_image に与え るオプ シ ョ ン リ ス ト a) boxsize={70 45} rotate=901 (x, y) boxsize={70 45} rotate=301 b) (x, y) boxsize={70 45} rotate=90 fitmethod=meet c) (x, y) boxsize={70 45} rotate=30 fitmethod=meet d) (x, y) 1. デ フ ォ ル ト fitmethod=nofit ですので、 こ の boxsize オプ シ ョ ンは実際には必要あ り ません。 7.4.5 ページサ イ ズの調整 ページサ イ ズ を画像に合わせる 今度の例 と し ては、 ページの大 き さ を オブジ ェ ク ト の 大 き さ に自動的に合わせま し ょ う 。 こ れはた と えば、 さ ま ざ ま な画像を PDF 形式でアー カ イ ブ し てお き たい と き な ど に有用です。 参照点 (x, y) を使えば、 ページ を オブジ ェ ク ト のサ イ ズ と ち ょ う ど同 じ にす る か、 それ と も 多少大き めや小 さ めにする か を、 指定す る こ と がで き ます。 ページサ イ ズ を大 き めにす る と (図 7.7 参照)、 画像の ま わ り にふちが残 り ま す。 ページサ イ ズ を画像 よ り 小 さ く す る と 、 画像の一部は切 り 落 と さ れ ま す。 ま ず は、 ページサ イ ズ を オブジ ェ ク ト の大 き さ と ち ょ う ど同 じ に し ま し ょ う : 7.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置 209 図 7.7 ページサイ ズの調 整。 左から 、 ち ょ う ど ・ 大きめ ・ 小 さめ p.fit_image(image, 0, 0, "adjustpage"); 次の コ ー ド 断片は、 ページサ イ ズ を x ・ y 方向に 40 単位ずつ増や し てい ますので、 オブ ジ ェ ク ト の ま わ り に白ふちが作成 さ れます : p.fit_image(image, 40, 40, "adjustpage"); 次の コ ー ド 断片は、 ページサ イ ズ を x ・ y 方向に 40 単位ずつ減 ら し てい ます。 オブジ ェ ク ト はページの端で切 り 落 と さ れますので、 オブジ ェ ク ト の一部 (幅 40 単位の) は見え な く な り ます : p.fit_image(image, -40, -40, "adjustpage"); x ・ y 座標を手段 と し て配置す る 方法 (ページの端、 ま たは一般には座標軸か ら の、 オブ ジ ェ ク ト ま での間隔を指定す る 方法) のほかに、 はめ込み枠を指定す る 方法 も あ り ます。 こ れは、 さ ま ざ ま な組版規則に従っ てオブジ ェ ク ト が配置 さ れ る長方形の領域です。 こ の 組版規則は、 boxsize ・ fitmethod ・ position オプシ ョ ンで制御する こ と がで き ます。 取 り 込み PDF ページのページ枠群を転写 取 り 込み PDF ペー ジ の すべ て の ペー ジ 枠 (MediaBox・CropBox 等) を、カ レ ン ト 出力ページへコ ピーする こ と がで き ます。cloneboxes オプシ ョ ン を、すべての関連す る 枠の値を読み取る ために PDF_open_pdi_page( ) に与え る 必要があ り 、 そ し てその枠の値を カ レ ン ト ページに適用する ために PDF_fit_pdi_page( ) に も 与え る 必要があ り ます : /* ページを開き、ページ枠エントリ群を転写 */ inpage = p.open_pdi_page(indoc, 1, "cloneboxes"); ... /* 出力ページをダミーページサイズで開く */ p.begin_page_ext(10, 10, ""); ... /* * 取り込みページを出力ページ上に配置し、入力ページ内にある * すべてのページ枠を転写。これは、begin_page_ext()で用いた * ダミーサイズをオーバライドします。 */ p.fit_pdi_page(inpage, 0, 0, "cloneboxes"); こ の技法を活用す る と 、 生成 PDF のページサ イ ズや裁ち落 と し 等が必ず入力文書のペー ジ と 同 じ にな る よ う にす る こ と がで き ま す。 こ れは特にプ リ プ レ ス 分野において重要で す。 210 第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む 7.4.6 配置 さ れた画像 と PDF ページ に関す る情報を ク エ リ 配置 さ れた画像 と テ ン プ レ ー ト に関す る情報 PDF_info_image( ) 関数 を 用い て、 画像 ・ テ ンプ レー ト 情報を ク エ リ す る こ と がで き ます。 こ の関数で使え る キーワ ー ド は、 一般的 な画像情報 (例 : 幅 ・ 高 さ を ピ ク セル単位で) のみな ら ず、 その画像の出力ページ上への 配置に関す る 情報 も 網羅 し てい ます (例 : はめ込み計算実行後の幅 ・ 高 さ を絶対値で)。 以下の コ ー ド 断片は、 ピ ク セルサ イ ズ と 、 あ る 特定のはめ込みオプシ ョ ン に よ り 画像 を配置 し た後の絶対サ イ ズの両方を取得 し ます : String optlist = "boxsize={300 400} fitmethod=meet orientate=west"; p.fit_image(image, 0.0, 0.0, optlist); imagewidth = (int) p.info_image(image, "imagewidth", optlist); imageheight = (int) p.info_image(image, "imageheight", optlist); System.err.println("画像サイズ(ピクセル単位): " + imagewidth + " x " + imageheight); width = p.info_image(image, "width", optlist); height = p.info_image(image, "height", optlist); System.err.println("画像サイズ(ポイント単位): " + width + " x " + height); 配置 さ れた PDF ページ に関す る情報 PDF_info_pdi_page( ) 関数を用いて、配置 PDF ペー ジに関す る 情報を ク エ リ す る こ と がで き ます。 こ の関数で使え る キーワ ー ド は、 元のペー ジに関す る 情報 (例 : その幅 ・ 高 さ ) のみな ら ず、 その取 り 込み PDF の出力ページ上へ の配置に関す る 情報 も 網羅 し てい ます (例 : はめ込み計算実行後の幅 ・ 高 さ )。 以下の コ ー ド 断片は、 取 り 込みページの元のサ イ ズ と 、 あ る 特定のはめ込みオプシ ョ ンに よ り そのページ を配置 し た後のサ イ ズの両方を取得 し ます : String optlist = "boxsize={400 500} fitmethod=meet"; p.fit_pdi_page(page, 0, 0, optlist); pagewidth = p.info_pdi_page(page, "pagewidth", optlist); pageheight = p.info_pdi_page(page, "pageheight", optlist); System.err.println("元のページサイズ: " + pagewidth + " x " + pageheight); width = p.info_pdi_page(page, "width", optlist); height = p.info_pdi_page(page, "height", optlist); System.err.println("配置ページサイズ: " + width + " x " + height); 7.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置 211 212 第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む 8 テキス ト と 表の組版 8.1 テキス ト 行を配置 ・ はめ込む 一行のテ キ ス ト をページ上に配置す る ための関数PDF_fit_textline( )には さ ま ざ ま な組版オ プシ ョ ンがあ り ます。 こ の節では も っ と も 重要なオプシ ョ ン をい く つか よ く 使われ る 応用 例を用いて解説 し ます。こ う し たオプシ ョ ンの完全な説明は PDFlib リ フ ァ レ ン スにあ り ま す。 PDF_fit_textline( ) のオプシ ョ ンの多 く は PDF_fit_image( ) のオプシ ョ ン と 同 じ です。 ですので こ こ ではテ キ ス ト 関連の利用例のみを示 し ます。画像の組版については、205 ペー ジ 「7.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置」 にあ る 作成例を参照す る よ う 推奨 し ます。 以下の利用例では PDF_fit_textline( ) への呼び出 し のみを示 し ます。 必要な フ ォ ン ト は すでに読み込まれて希望の文字サ イ ズに設定 さ れてい る も の と し ます。 PDF_fit_textline( ) は、仮想的なテ キ ス ト 枠を用いてテ キ ス ト の位置付け を決定 し ます : こ のテ キ ス ト 枠の幅はテ キ ス ト の幅 と 同 じ であ り 、 枠の高 さ は フ ォ ン ト の大文字の高 さ と 同 じ です。 こ のテ キ ス ト 枠を変更す る には matchbox オプシ ョ ン を用い ます。 以下の作成例では、 参照点の座標は PDF_fit_textline( ) の x ・ y 引数 と し て与え ら れま す。 テ キ ス ト 行に対す る はめ込み枠は、 テ キ ス ト が配置 さ れ る領域です。 それは PDF_fit_ textline( ) の x ・ y 引数 と 適切なオプシ ョ ン (boxsize ・ fitmethod ・ position ・ rotate) で指 定 さ れ る 長方形領域 と し て定義 さ れます。 はめ こ み枠は、 margin オプシ ョ ン を用いて、 左 / 右ま たは上 / 下へ縮め る こ と も で き ます。 ク ッ ク ブ ッ ク テキス ト 出力の諸側面に関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ クの text_output カ テ ゴ リ にあ り ます。 8.1.1 単純な テキス ト 行配置 テキス ト を参照点に位置付け デフ ォ ル ト では、 テ キ ス ト は左下隅を参照点に合わせて 配置 さ れます。 し か し こ の例では、 テ キ ス ト の下端中央を参照点に合わせて配置 し たいの です。以下の コ ー ド 断片は、テ キ ス ト 枠の下端中央を参照点(30, 20)に合わせて配置 し ます。 p.fit_textline(text, 30, 20, "position={center bottom}"); 図 8.1 テキス ト の 中央揃え y Kraxi x y Kraxi 図 8.1 に、 中央揃えのテ キ ス ト 配置の様子を図示 し ます。 同様に、 キーワ ー ド left ・ right ・ center ・ top ・ bottom の組み合わせを変えた position オプシ ョ ン を使っ て、 参照点にテ キ ス ト を配置す る こ と がで き ます。 図 8.2 西向きの 単純な テキス ト x 8.1 テキス ト 行を配置 ・ はめ込む 213 ᨒߩฝߦ࠹ࠠࠬ࠻ Kraxi ᨒߩ50㜞ߐ22 20 30 Kraxi 20 ᨒߩਅ┵ਛᄩߦ࠹ࠠࠬ࠻ ᨒߩ50㜞ߐ0 20 図 8.3 テキス ト を枠内に位置付け テキス ト の向き を変え て配置 次は、 テ キ ス ト を回転 さ せて、 その左下隅 (回転後の) を 参照点に合わせて配置 し てみま し ょ う 。 以下の コ ー ド 断片は、 テ キ ス ト を西 (90˚ 反時計 回 り ) に向けた後、 その回転 し たテ キ ス ト の左下隅を参照点 (0, 0) へ並行移動 さ せます。 p.fit_textline(text, 0, 0, "orientate=west"); 図 8.2 に、 単純なテ キ ス ト の向 き を変えて配置 し た様子を図示 し ます。 8.1.2 テキス ト を枠内に位置付け テ キ ス ト を位置付け る には、 幅 と 高 さ を あ ら か じ め定義 し た枠を あわせて使 う こ と も で き 、 テ キ ス ト はその場合、 こ の枠に対 し て相対的に位置付け る こ と が可能です。 図 8.3 に、 その一般的なはた ら き を図示 し ます。 テキス ト を枠内に位置付け 長方形の枠を定義 し て、 こ の枠内の右上にテ キ ス ト を配置 し ま し ょ う 。 以下の コ ー ド 断片は、 幅 50 単位 ・ 高 さ 22 単位の枠を、 参照点 (30, 20) に定 義 し ます。 図 8.4a の よ う に、 テ キ ス ト は枠の右上に配置 さ れます。 同様に、 下端中央にテ キ ス ト を配置す る こ と も で き ます。 こ の場合を図示 し たのが図 8.4b です。 枠 と テ キ ス ト の間に間隔を あ け る には、 margin オプシ ョ ン を付け加え ます (図 8.4c 参 照)。 なお、 図中の枠や線は、 枠のサ イ ズ を視覚化す る ために描いた も のであ り 、 実際の出 力には現れません。 図 8.4 さ ま ざ ま な位置付けオプ シ ョ ンに従 っ て テキス ト を枠内に配置 生成 さ れる出力 a) b) c) d) 214 Kraxi Kraxi Kraxi Kraxi PDF_fit_textline( ) に与え るオプ シ ョ ン リ ス ト boxsize={50 22} position={right top} boxsize={50 22} position={center bottom} boxsize={50 22} position={center bottom} margin={0 3} boxsize={50 0} position={center bottom} 第 8 章 : テキス ト と 表の組版 e) Kraxi 生成 さ れる出力 PDF_fit_textline( ) に与え る オプ シ ョ ン リ ス ト boxsize={0 35} position={left center} orientate=west テキス ト を横線や縦線で整列 さ せる テ キ ス ト の位置付け を、 横線や縦線 (すなわち高 さ や幅がゼ ロ の枠) に沿っ て行 う と い う のは、 若干極端な ケース ではあ り ますが、 有用な 場合 も あ り ます。 図 8.4d は、 テ キ ス ト を枠に対 し て下端中央揃えで配置 し た も のです。 幅 を 50、 高 さ を 0 と し た こ と で、 枠は ま る で横線の よ う にな っ てい ます。 テ キ ス ト を縦線に沿っ て中央揃えす る ためには、 西向 き に し て、 枠に対 し て左端中央 に位置付け ま し ょ う 。 こ の場合を図 8.4e に示 し ます。 8.1.3 テキス ト を枠へはめ込み こ の項では、 さ ま ざ ま なはめ込み方式を用いて、 テ キ ス ト を枠へはめ込みま し ょ う 。 カ レ ン ト の フ ォ ン ト と 文字サ イ ズはど の例で も 同 じ と し てお き、 さ ま ざ ま なはめ込み方式に と も な っ て文字サ イ ズな ど のプ ロ パテ ィ が変わ る 様子がわか る よ う に し ます。 デフ ォ ル ト の場合か ら 始め ま し ょ う : 何のはめ込み方式 も 用いないで、 切 り 落 と し も 拡縮 も 一切 さ れない よ う にす る 場合です。 テ キ ス ト は、 幅 100 単位 ・ 高 さ 35 単位の枠の 中央に配置 さ れます (図 8.5a 参照)。 枠の幅を 100 か ら 50 単位に縮めて も 、 出力には全 く 影響を与え ません。 テ キ ス ト は元 の文字サ イ ズ を保ち、 枠か ら はみ出 し ます (図 8.5b 参照)。 テキス ト を小 さ な枠内へ縦横比を保 っ てはめ込み それでは、テ キ ス ト 全体を枠の中へ、 縦横比を保っ てはめ込んでみま し ょ う 。 こ れはオプシ ョ ン fitmethod=auto で実現で き ま す。 図 8.5c では、 枠の幅が充分広いので、 テ キ ス ト は ま っ た く 元の大 き さ の ま ま、 変わ ら ずに枠内に配置 さ れてい ます。 枠の幅を 100 か ら 58 に縮小す る と 、 テ キ ス ト は長すぎ て収ま り き ら な く な り ます。 は め込み方式 auto はテ キ ス ト に長体を、 shrinklimit オプシ ョ ン (デフ ォ ル ト : 0.75) を限度 と し てかけ よ う と し ます。 図 8.5d は、 テ キ ス ト が元の長 さ の 75 パーセ ン ト に縮んだ様子 を示 し ます。 枠の幅を さ ら に 30 単位ま で縮め る と 、 テ キ ス ト は長体をかけて も 収ま り き ら な く な り ます。 す る と 、 meet 方式が適用 さ れます。 こ れは、 テ キ ス ト 全体が枠に収ま る ま で文字 サ イ ズ を下げます。 こ の場合を示 し たのが図 8.5e です。 テキス ト の文字サ イ ズ を上げて枠へはめ込み テ キ ス ト を枠の幅 (ま たは高 さ ) い っぱ いに拡げて、 ただ し 縦横比は保っ た ま ま、 はめ込みたい時があ る か も し れません。 テ キ ス ト よ り 大 き い枠に対 し て fitmethod=meet を用い る と 、 テ キ ス ト の幅が枠の幅 と 一致す る ま でテ キ ス ト が大 き く な り ます。 こ の場合を図示 し たのが図 8.5f です。 テキス ト を枠い っ ぱいにはめ込み さ ら に、 テ キ ス ト が枠の中を埋めつ く す よ う にはめ 込む こ と も 可能です。 こ の場合は、 fitmethod=entire を使い ます。 し か し こ の設定は、 テ キ ス ト をほぼ確実にゆがめて し ま う ので、 使 う こ と はめっ たにないで し ょ う (図 8.5g 参 照)。 テキス ト を枠で切 り 落 と し てはめ込み こ れ も レ ア な ケー ス ですが、 テ キ ス ト を元のサ イ ズの ま ま はめ込んで、 も し も 枠か ら はみ出た部分は切 り 落 と し たい時 も あ る か も し れま せん。 その場合は fitmethod=clip が使え ます。 図 8.5h では、 テ キ ス ト を枠の左端に配置 し 8.1 テキス ト 行を配置 ・ はめ込む 215 てい ますが、 枠の幅が足 り ません。 テ キ ス ト は右側が切 り 落 と さ れます。 図 8.5 さ ま ざ ま なオプ シ ョ ンに従っ て テキス ト をページ上の枠へはめ込む 生成 さ れる出力 PDF_fit_textline( ) に与え る オプ シ ョ ン リ ス ト a) Kraxi Systems boxsize={100 35} position=center fontsize=12 b) Kraxi Systems boxsize={50 35} position=center fontsize=12 c) Kraxi Systems boxsize={100 35} position=center fontsize=12 fitmethod=auto d) Kraxi Systems boxsize={58 35} position=center fontsize=12 fitmethod=auto e) Kraxi Systems boxsize={30 35} position=center fontsize=12 fitmethod=auto f) Kraxi Systems boxsize={100 35} position=center fontsize=12 fitmethod=meet g) Kraxi Systems h) Kraxi Sys boxsize={100 35} position=center fontsize=12 fitmethod=entire boxsize={50 35} position={left center} fontsize=12 fitmethod=clip テキス ト の縦中央揃え PDF_fit_textline( ) におけ る テ キ ス ト の高 さ は、 デ フ ォ ル ト では キ ャ ッ プハ イ ト 、 すなわち大文字の H の高 さ です。 テ キ ス ト を枠の中央に位置付け る と 、 縦方向にはそのキ ャ ッ プハ イ ト に も と づいて中央揃え さ れます (図 8.6a 参照)。 それ以外の高 さ を テ キ ス ト 枠に対 し て指定す る には、範囲枠機能を使い ます (258 ペー ジ 「8.4 範囲枠」 も 参照)。 PDF_fit_textline( ) の matchbox オプシ ョ ンは、 テ キ ス ト 行の高 さ を定義 し てお り 、与え ら れた文字サ イ ズのキ ャ ッ プハ イ ト がそのデフ ォ ル ト にな っ てい ます。 こ の範囲枠の高 さ は、 その boxheight サブオプシ ョ ンに も と づいて算出 さ れます。 boxheight サブオプシ ョ ンは、 ベース ラ イ ンか ら テ キ ス ト 上端 ・ 下端ま での距離を決定 し ます。 デフ ォ ル ト の設定は matchbox={boxheight={capheight none}}、 すなわち範囲枠の上 端はベース ラ イ ン よ り 上にあ っ て キ ャ ッ プハ イ ト に一致 し 、範囲枠の下端はベース ラ イ ン を下へ越え ません。 216 第 8 章 : テキス ト と 表の組版 範囲枠の大 き さ を図示す る ため、 こ こ では赤 く 色を塗 り ま し ょ う (図 8.6b 参照)。 図 8.6c では、 テ キ ス ト が xheight に基づいて縦中央揃え さ れ る よ う に、 その照応す る高 さ の 範囲枠を定義 し てい ます。 図 8.6d ~ f に、 有用な さ ま ざ ま な boxheight 設定の範囲枠 (赤) と 、 それの決め る高 さ に も と づいて枠の中で中央揃え さ れた テ キ ス ト を示 し ます。 図 8.6 さ ま ざ ま な範囲枠高 さ に従っ て テキス ト を枠へはめ込む 生成 さ れる出力 PDF_fit_textline( ) に与え るオプ シ ョ ン リ ス ト a) Kraxi Systems boxsize={80 20} position=center fitmethod=auto b) Kraxi Systems boxsize={80 20} position=center fitmethod=auto matchbox={boxheight={capheight none} fillcolor=mistyrose} c) Kraxi Systems boxsize={80 20} position=center fitmethod=auto matchbox={boxheight={xheight none} fillcolor=mistyrose} d) Kraxi Systems boxsize={80 20} position=center fitmethod=auto matchbox={boxheight={ascender none} fillcolor=mistyrose} e) Kraxi Systems boxsize={80 20} position=center fitmethod=auto matchbox={boxheight={ascender descender} fillcolor=mistyrose} f) Kraxi Systems boxsize={80 20} position=center fitmethod=auto matchbox={boxheight={fontsize none} fillcolor=mistyrose} 8.1.4 テキス ト を文字で揃え る テキス ト を文字で揃え る テ キ ス ト を、 あ る 特定の文字で揃え たい場合が あ る か も し れ ません。 た と えば数値の小数点揃え な ど です。 図 8.7a に示す よ う に、 テ キ ス ト ははめ込 み枠の中央に位置付け ら れます。 PDF_fit_textline( ) で alignchar=. オプシ ョ ン を用い る こ と で、 数値が点で揃い ます。 点を枠の中央に配置 し てい る position オプシ ョ ン を省 く こ と も で き ます。 そ う すれば、 デフ ォ ル ト の position={left bottom} が用い ら れ る ので、 点は参照点に配置 さ れます (図 8.7b 参照)。 一般に、 揃え文字はその右下隅が参照点に配置 さ れます。 図 8.7 テキス ト 行を点で揃え る 生成 さ れる出力 PDF_fit_textline( ) に与え る オプ シ ョ ン リ ス ト a) 127.123 12.01 123.0 4025.20 boxsize={70 8} position={center bottom} alignchar=. b) 127.123 12.01 123.0 4025.20 boxsize={70 8} position={left bottom} alignchar=. 8.1 テキス ト 行を配置 ・ はめ込む 217 8.1.5 ス タ ン プ を配置 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の text_output/simple_stamp ト ピ ッ ク にあ り ます。 テ キ ス ト の回転を指定 し な く て も 、 ス タ ンプ と い う 便利な機能を使えば、 テ キ ス ト を枠内 に対角線に沿っ て配置す る こ と がで き ます。 ス タ ン プ機能は洗練 さ れた自動計算を行い、 テ キ ス ト が枠内いっぱいに拡が る よ う 文字サ イ ズ と 回転角を決定 し ます。対角線ス タ ンプ を、 た と えばページの背景な ど に配置す る には、 PDF_fit_textline( ) で stamp オプシ ョ ン を 指定 し ます。 stamp=ll2ur を指定す る と 、 テ キ ス ト ははめ込み枠の左下隅か ら 右上隅へ配 置 さ れます。 こ れに対 し 、 stamp=ul2lr を指定する と 、 テ キ ス ト ははめ込み枠の左上隅か ら 右下隅へ配置 さ れます。fitbox オプシ ョ ンは無視 さ れます。図 8.8 では、showborder=true を用いてはめ込み枠 と ス タ ンプの外接枠を図示 し てい ます。 図 8.8 左下から右上へのス タ ン プのよ う にテキス ト 行をはめ込む 生成 さ れる出力 PDF_fit_textline( ) に与え るオプ シ ョ ン リ ス ト ng Giant Wi fontsize=8 boxsize={160 50} stamp=ll2ur showborder=true 8.1.6 リ ーダ を用い る リ ーダ を使 う と 、 はめ込み枠の端 と テ キ ス ト と の間の余白を埋め る こ と がで き ます。 た と えば点 リ ーダは、目次の各エン ト リ と その照応す るページ番号をつないで見やすい よ う に よ く 利用 さ れます。 目次の リ ーダ PDF_fit_textline( ) で leader オプシ ョ ン と alignment={none right} サブオプ シ ョ ン を用い る と 、 テ キ ス ト 行の右に リ ーダが付加 さ れて、 テ キ ス ト 枠の右端ま で繰 り 返 さ れます。 リ ーダ右端 と 右枠 と の間隔は一定ですが、 テ キ ス ト と リ ーダ左端 と の間隔は変 動の可能性があ り ます (図 8.9a 参照)。 ク ッ ク ブ ッ ク テ キ ス ト 行の中での点 リ ーダの使用例 を 示す完全な コ ー ド サ ン プ ルが ク ッ ク ブ ッ ク の text_output/leaders_in_textline ト ピ ッ ク にあ り ます。 ク ッ ク ブ ッ ク テキス ト フ ロ ーの中での点 リ ーダの使用例を示す完全な コ ー ド サン プルが ク ッ ク ブ ッ ク の text_output/dot_leaders_with_tabs ト ピ ッ ク にあ り ます。 ニ ュ ース電光掲示板の リ ーダ 別の用例 と し ては、 ニ ュ ー ス 電光掲示板効果を作成 し た い場合 も あ る か も し れ ま せん。 こ こ ではプ ラ ス と ス ペー ス 「+ 」 を リ ーダに使い ま し ょ う 。 テ キ ス ト 行は中央 に 配置 し 、 リ ー ダ は そ の テ キ ス ト 行 の 前 と 後 に 印字 さ せ ま す (alignment={left right}) 。 リ ーダの左右端は左右の枠に揃い、 テ キ ス ト と の間隔は変動の 可能性があ り ます (図 8.96b 参照)。 218 第 8 章 : テキス ト と 表の組版 図 8.9 リ ーダ を用いた テキス ト 行をはめ込む 生成 さ れる出力 PDF_fit_textline( ) に与え る オプ シ ョ ン リ スト Features of Giant Wing .................................................... a) boxsize={200 10} leader={alignment={none right}} Description of Long Distance Glider................................. Benefits of Cone Head Rocket ......................................... boxsize={200 10} position={center bottom} leader={alignment={left right} text={+ }} + + + + + + + + + Giant Wing in purple! + + + + + + + + + b) ++ Long Distance Glider with sensational range! + + + + + + + Cone Head Rocket incredibly fast! + + + + + 8.1.7 パス上テキス ト テ キ ス ト を 直線上に配置す る の で は な く 、 任意の パ ス 上に配置す る こ と も で き ま す。 PDFlib は個々のキ ャ ラ ク タ をパ ス上に、テ キ ス ト がそのパ ス の曲線に沿 う よ う に配置 し ま す。 パ ス上テ キ ス ト を作成す る には PDF_fit_textline( ) の textpath オプシ ョ ン を用い ます。 パ ス はそれ以前に作成済みで あ る 必要が あ り 、 パ ス ハン ド ルで表 し ま す。 パ ス ハン ド ル は、PDF_add_path_point( ) お よ び関連す る パ ス オブジ ェ ク ト 関数群で明示的にパ ス を構築 す る か、 あ る いは既存の ラ ス タ 画像内の ク リ ッ ピ ン グパ ス のハン ド ルを取得す る こ と に よ っ て作成で き ます。 以下の コ ー ド 断片は、 1 個のパ ス を作成 し 、 テ キ ス ト を そのパ ス上 に配置 し ます (図 8.10 参照) : /* パスを原点に定義 */ path = p.add_path_point( -1, 0, 0, "move", ""); path = p.add_path_point(path, 100, 100, "control", ""); path = p.add_path_point(path, 200, 0, "circular", ""); /* テキストをパス上に配置 */ p.fit_textline("Long Distance Glider with sensational range!", x, y, "textpath={path=" + path + "} position={center bottom}"); /* 例ですのでパスも描いてみせましょう */ p.draw_path(path, x, y, "stroke strokecolor=dodgerblue"); Dis t er with sen sa tio 図 8.10 パス上テキス ト l ra nge ! Long Glid e nc na a ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/text_on_a_path ト ピ ッ ク にあ り ま す。 8.1 テキス ト 行を配置 ・ はめ込む 219 画像の ク リ ッ ピ ン グパス を用いて テキス ト を配置 パ ス 関数群でパ ス オブジ ェ ク ト を手 作業で構築す る のではな く 、 画像か ら ク リ ッ ピ ン グパス を抽出 し て、 そのパ ス上にテ キ ス ト を配置す る こ と も で き ます。 こ の画像は honorclippingpath オプシ ョ ン と と も に読み込 んであ る 必要があ り 、 かつ、 求め る パ ス がその画像のデフ ォ ル ト の ク リ ッ ピ ン グパ ス でな い場合には clippingpathname も PDF_load_image( ) に与え る 必要があ り ます : image = p.load_image("auto", "image.tif", "clippingpathname={path 1}"); /* 画像のクリッピングパスからパスオブジェクトを作成 */ path = (int) p.info_image(image, "clippingpath", ""); if (path == -1) throw new Exception("エラー : クリッピングパスが見つかりません!"); /* テキストをパス上に配置 */ p.fit_textline("Long Distance Glider with sensational range!", x, y, "textpath={path=" + path + "} position={center bottom}"); パス と テキス ト の間にアキ を作る デフ ォ ル ト では、 PDFlib は個々のキ ャ ラ ク タ をパ ス 上に直接配置 し ます。 すなわち、 グ リ フ と パ ス の間にはア キは全 く あ り ません。 パ ス と テ キ ス ト の間にア キ を作 り たい と き は、 キ ャ ラ ク タ 枠を延長す る こ と がで き ます。 こ れは、 matchbox オプシ ョ ンの boxheight サブオプシ ョ ンでキ ャ ラ ク タ 枠の縦延長を指定す る こ と で実現で き ます。 以下のオプシ ョ ン リ ス ト はデ ィ セ ン ダ を考慮に入れてい ます (図 8.11 参照) : p.fit_textline("Long Distance Glider with sensational range!", x, y, "textpath={path=" + path + "} position={center bottom} " + "matchbox={boxheight={capheight descender}}"); 8.1.8 影付き テキス ト shadow オプシ ョ ン を用い る と 、 テ キ ス ト の影付 き効果を生み出す こ と がで き ます。 影の 色 と 、 メ イ ン テ キ ス ト か ら の横 ・ 縦距離を、 サブオプシ ョ ン内で指定で き ます : e r w it h s e n Long 第 8 章 : テキス ト と 表の組版 図 8.11 パス上テキス ト で、 パス と テキ ス ト の間を あけた ti o nge! 220 sa l ra Di s nc li d G e na ta p.fit_textline("Long Distance Glider", x, y, "fillcolor=rosybrown shadow={offset={3, -3}}"); 8.2 複数行のテキス ト フ ロ ー 1 行のテ キ ス ト をページ上に配置す る 機能だけでな く 、 PDFlib は、 任意の長 さ のテ キ ス ト を配置で き る テ キ ス ト フ ロ ー と い う 機能に も 対応 し てい ます。 テ キ ス ト は何行に も 、 何段 に も 、 あ る いは何ページに も わた る こ と がで き 、 ま たその見ばえは さ ま ざ ま なオプシ ョ ン で制御す る こ と がで き ます。 フ ォ ン ト ・ サ イ ズ ・ 色 と いっ た文字属性を、 テ キ ス ト の ど の 部分にで も 適用す る こ と がで き ます。 テ キ ス ト の両端揃え ・ 片端揃えや、 段落の イ ンデン ト や、 タ ブ位置 と い っ たテ キ ス ト フ ロ ー属性を指定で き ます。 テ キ ス ト の中に ソ フ ト ハ イ フ ンで示 し た改行機会が考慮 さ れます。 図 8.12 ・ 図 8.13 は、 請求書の さ ま ざ ま な部分が ページ上にテ キ ス ト フ ロ ー機能を用いて配置で き てい る さ ま を例示 し た も のです。 こ う し た出力を制御す る ためのオプシ ョ ンについて、 以下の項で詳 し く 説明 し ます。 図 8.12 テキス ト フ ロー の組版 Kraxi Systems, Inc. Paper Planes 17, Aviation Road Paperfield Phone 7079-4301 Fax 7079-4302 Kraxi Systems, Inc. 17, Aviation Road [email protected] www.kraxi.com Paperfield John Q. Doe 255 Customer Lane Suite B 12345 User Town Everland INVOICE hortabmethod tabalignment ruler ruler right 30 left 45 ITEM 1 2 3 4 5 6 7 DESCRIPTION Super Kite Turbo Flyer Giga Trash Bare Bone Kit Nitty Gritty Pretty Dark Flyer Free Gift 14.03.2004 right 275 right 375 right 475 QUANTITY 2 5 1 3 10 1 1 PRICE 20,00 40,00 180,00 50,00 20,00 75,00 0,00 AMOUNT 40,00 200,00 180,00 150,00 200,00 75,00 0,00 845,00 leftindent = 55 Terms of payment: 30 days net. 30 days warranty starting at the day of sale. This warranty covers defects in workmanship only. Kraxi Systems, Inc., at its option, repairs or replaces the product under warranty. This warranty is not transferable. Returns or exchanges are not possible for wet products. parindent = 7% Have a look at our new paper plane models! Our paper planes are the ideal way of passing the time. We offer revolutionary new developments of the traditional common paper planes. If your lesson, conference, or lecture turn out to be deadly boring, you can have a wonderful time with our planes. All our models are folded from one paper sheet. They are exclusively folded without using any adhesive. Several models are equipped with a folded landing gear enabling a safe landing on the intended location provided that you have aimed well. Other models are able to fly loops or cover long distances. Let them start from a vista point in the mountains and see where they touch the ground. leading = 140% leftindent = 75 1. Long Distance Glider With this paper rocket you can send all your messages even when sitting in a hall or in the cinema pretty near the back. 2. Giant Wing An unbelievable sailplane! It is amazingly robust and can even do leftindent = 105 alignment = left alignment = justify rightindent = 60 minlinecount =2 8.2 複数行のテキス ト フ ロー 221 複数行のテ キ ス ト フ ロ ーは、 1 つの長方形 (はめ込み枠 と い う ) 内に も 複数の長方形内 に も 配置す る こ と がで き ます。 こ のはめ込み枠は 1 ページ上にあ っ て も 複数ページ上に あ っ て も か ま い ません。テ キ ス ト フ ロ ーをページ上に配置す る には以下の手順を踏む必要 があ り ます : > 関数 PDF_add_textflow( ) が、テ キ ス ト を一部分ずつ、その照応す る組版オプシ ョ ン と と も に受け入れて、 そ し て 1 つのテ キ ス ト フ ロ ーオブジ ェ ク ト を作成 し てハン ド ルを返 し ます。 ま たは関数 PDF_create_textflow( ) が、 組版制御のための イ ン ラ イ ンオプシ ョ ン を含む こ と ので き る テ キ ス ト の全体を、 一度の呼び出 し で分析 し ます。 こ れ ら の関 数ではページ上にテ キ ス ト は配置 さ れません。 > 関数 PDF_fit_textflow( ) が、 こ のテ キ ス ト フ ロ ーの全部ない し 一部を、 与え ら れたはめ 込み枠内に配置 し ます。 すべてのテ キ ス ト を配置す る には、 こ の段階を数回繰 り 返す 必要があ る か も し れ ません。 その場合は こ の関数を呼び出すたびに新 し いはめ込み枠 を与え る 必要があ る で し ょ う 。 こ のはめ込み枠は同 じ ページにあ っ て も 別のページに あ っ て も か ま い ません。 > 関数 PDF_delete_textflow( ) が、テ キ ス ト フ ロ ーを文書内に配置 し た後に、こ のテ キ ス ト フ ロ ーオブジ ェ ク ト を削除 し ます。 テ キ ス ト フ ロ ーを作成す る ための関数 PDF_add/create_textflow( ) は、組版処理を制御す る ための さ ま ざ ま なオプシ ョ ンに対応 し てい ます。 こ のオプシ ョ ンは関数のオプシ ョ ン リ ス ト で与え る こ と も で き ます し 、あ る いは PDF_create_textflow( ) を使 う と き はテ キ ス ト 内に 「イ ン ラ イ ン」 オプシ ョ ン と し て入れ込む こ と も で き ます。 PDF_info_textflow( ) を使 う と 、 組版の結果や、その他テ キ ス ト フ ロ ーに関す る た く さ んの詳細を ク エ リ す る こ と がで き ま す。 以下、 テ キ ス ト フ ロ ーの配置について、 い く つかの よ く あ る応用を例に し て説明 し ま す。 テ キ ス ト フ ロ ーオプシ ョ ンの完全な一覧は PDFlib リ フ ァ レ ン スにあ り ます。 PDF_add/create_textflow( ) で対応 し てい る オプシ ョ ンの中には PDF_fit_textline( ) と 同 様の も のがた く さ んあ り ます。 ですか ら 213 ページ 「8.1 テ キ ス ト 行を配置 ・ はめ込む」 の例を あわせて よ く 把握 し てお く と よ いで し ょ う 。 以下の項では、 複数行テ キ ス ト に関係 のあ る オプシ ョ ンだけ を解説 し ます。 ク ッ ク ブ ッ ク テキス ト 出力の諸側面に関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ クの text_output カ テ ゴ リ にあ り ます。 fillcolor, charspacing, fontsize, fontname aerobatics. But it is best suited to gliding. 222 3. C o n e H ea d R o c k et This paper arrow can be thrown with big swing. We launched it from the roof of a hotel. It stayed in the air a long time and covered a considerable distance. 4. Super Dart The super dart can fly giant loops with a radius of 4 or 5 meters and cover very long distances. Its heavy cone point is slightly bowed upwards to get the lift required for loops. 5. German Bi-Plane Brand-new and ready for take-off. If you have lessons in the history of aviation you can show your interest by letting it land on your teacher's desk. 第 8 章 : テキス ト と 表の組版 図 8.13 テキス ト フ ロー の組版 8.2.1 テキス ト フ ロ ー をはめ込み枠に配置 テ キ ス ト 枠に対す る はめ込み枠は、 テ キ ス ト が配置 さ れ る 領域です。 そ れは PDF_fit_ textflow( ) の llx ・ lly ・ urx ・ ury 引数で指定 さ れ る 長方形領域 と し て定義 さ れます。 テキス ト を 1 つのはめ込み枠に配置 簡単な例か ら 始め ま し ょ う 。 以下の コ ー ド 断片は、 PDF_add_textflow( ) への呼び出 し を 2 回使っ て、 ボール ド テ キ ス ト の部分 と 標準テ キ ス ト の部分を く っつけ ます。 フ ォ ン ト ・ 文字サ イ ズ ・ エン コーデ ィ ン グ を明示的に指定 し てい ます。 1 回目の PDF_add_textflow( ) への呼び出 し では、 -1 を与えれば、 テ キ ス ト フ ロ ーハ ン ド ルが返っ て き ますので、その後に も し ま た PDF_add_textflow( ) を呼び出す と き があ る な ら それが使え ます。 text1 ・ text2 には、 印字 し たい実際のテ キ ス ト が入っ てい る も の と し ます。 PDF_fit_textflow( ) を使っ て、で き あがっ たテ キ ス ト フ ロ ーをページ上のはめ込み枠に、 デフ ォ ル ト の組版オプシ ョ ン を用いて配置 し ます。 /* テキストをボールドフォントで追加 */ tf = p.add_textflow(-1, text1, "fontname=Helvetica-Bold fontsize=9 encoding=unicode"); if (tf == -1) throw new Exception("エラー:" + p.get_errmsg()); /* テキストを標準フォントで追加 */ tf = p.add_textflow(tf, text2, "fontname=Helvetica fontsize=9 encoding=unicode"); if (tf == -1) throw new Exception("エラー:" + p.get_errmsg()); /* Place all text */ result = p.fit_textflow(tf, left_x, left_y, right_x, right_y, ""); if (!result.equals("_stop")) { /* ... */} p.delete_textflow(tf); テキス ト を複数ページ上の 2 つのはめ込み枠に配置 PDF_fit_textflow( ) で配置 し た テ キ ス ト がはめ込み枠内に収 ま り き ら な か っ た と き は、 出力は中断 さ れ て関数は文字列 _ boxfull を返 し ます。 PDFlib はすでに配置 し たテ キ ス ト の量を記憶 し ていて、 こ の関数が 再び呼ばれた時には残 り のテ キ ス ト を引 き 続 き 配置 し ます。 こ の他に、 新規ページ を作成 す る 必要 も あ る か も し れません。 次の コ ー ド 断片は、 1 つない し 複数のページ上の、 ペー ジ あ た り 2 つのはめ込み枠に、 1 つのテ キ ス ト フ ロ ーを、 テ キ ス ト をすべて配置 し おわ る ま で配置す る 方法を演示 し てい ます (図 8.14 参照)。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/starter_textflow ト ピ ッ ク にあ り ま す。 /* テキスト全部が配置されるまで回る。配置するべきテキストがまだあるなら新規ページを作成。 * 全ページに2段組を作成。 */ do { String optlist = "verticalalign=justify linespreadlimit=120%"; p.begin_page_ext(0, 0, "width=a4.width height=a4.height"); /* 1段目に流し込み */ 8.2 複数行のテキス ト フ ロー 223 result = p.fit_textflow(tf, llx1, lly1, urx1, ury1, optlist); /* まだテキストがあるなら2段目に流し込み */ if (!result.equals("_stop")) result = p.fit_textflow(tf, llx2, lly2, urx2, ury2, optlist); p.end_page_ext(""); /* 「_boxfull」ならまだテキストがあるので続ける必要がある。 * 「_nextpage」は「新規段組を開始」と解釈 */ } while (result.equals("_boxfull") || result.equals("_nextpage")); /* エラーかどうかをチェック */ if (!result.equals("_stop")) { /* 枠がとても小さくてテキストが全然入らないときは「_boxempty」が起こる。 */ if (result.equals( "_boxempty")) throw new Exception("エラー:" + p.get_errmsg()); else { /* それ以外の戻り値は「return」オプションによるユーザー終了。 * これを扱うにはそのためのコードが必要。 */ } } p.delete_textflow(tf); 8.2.2 段落の組版のオ プ シ ョ ン 上の例では段落に、 デフ ォ ル ト の設定を用い ま し た。 デフ ォ ル ト は左揃え、 行送 り 100% (文字サ イ ズその ま ま)、 な ど と な っ てい ます。 段落の組版を調整 し たいな ら 、 PDF_add_textflow( ) にオプシ ョ ン を追加で き ます。 た と えばテ キ ス ト を左余白か ら 15 単位、 右余白か ら 10 単位、 イ ンデン ト し たい と し ます。 各段落の先頭行は さ ら に 20 単位 イ ンデン ト し ま し ょ う 。 テ キ ス ト を両端揃え と し 、 行送 はめ込み枠 1 ページ 1 1 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 2 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 3 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 4 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 5 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 6 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 7 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure 224 はめ込み枠 2 dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 8 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 9 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 10 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 11 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 12 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 13 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 14 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do 第 8 章 : テキス ト と 表の組版 はめ込み枠 3 eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 15 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 16 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 17 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 18 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 19 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 20 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat はめ込み枠 4 nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. ページ 2 21 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 22 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 23 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 24 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 25 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 26 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 27 Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 図 8.14 テキス ト フ ローを 2 つのはめ込み枠 に配置 leftindent = 15 parindent = 20 leading = 140% 図 8.15 オプ シ ョ ン を用いて テキス ト フ ローを配置 Have a look at our new paper plane models! Our paper planes are the ideal way of passing the time. We offer revolutionary new developments of the traditional common paper planes. If your lesson, conference, or lecture turn out to be deadly boring, you can have a wonderful time with our planes. All our models are folded from one paper sheet. They are exclusively folded without using any adhesive. Several models are equipped with a folded landing gear enabling a safe landing on the intended location provided that you have aimed well. Other models are able to fly loops or cover long distances. Let them start from a vista point in the mountains and see where they touch the ground. rightindent = 1 0 alignment = justify り は 140% に拡げま し ょ う 。 そ し て文字サ イ ズ を 8 ポ イ ン ト に下げます。 こ れを実現す る には、PDF_add_textflow( ) のオプシ ョ ン リ ス ト を以下の よ う に拡張 し ます (図 8.15 参照): String optlist = "leftindent=15 rightindent=10 parindent=20 alignment=justify " + "leading=140% fontname=Helvetica fontsize=8 encoding=unicode"; 8.2.3 イ ン ラ イ ン オ プ シ ョ ン リ ス ト と マ ク ロ 図 8.15 のテ キ ス ト は ま だ完璧ではあ り ません。 見出 し 「Have a look at our new paper plane models!」 を独立 し た行に し て、 フ ォ ン ト も も っ と 大き く し て、 そ し て中央揃えに し ま し ょ う 。 こ れを実現す る にはい く つかの方法があ り ます。 PDF_create_textflow( ) に イ ン ラ イ ン オ プ シ ョ ン リ ス ト を与え る こ こ ま で は組版 オ プ シ ョ ンは、 関数に直接与え る オプシ ョ ン リ ス ト 内で指定 し て き ま し た。 今回 も こ れ と 同 じ や り 方を続け る な ら ば、 テ キ ス ト を分割 し て二度の呼び出 し に分け る 必要があ り ます。 一 度目で見出 し を、 二度目で残 り のテ キ ス ト を配置す る わけです。 ですが、 場合に よ っ て は、 た と えば書式変更箇所が多い と き な どは、 こ の方法は少々面倒か も し れません。 それな ら ば、PDF_add_texflow( ) のかわ り に PDF_create_textflow( ) を使 う こ と がで き ま す。 PDF_create_textflow( ) はテ キ ス ト と 、 テ キ ス ト の中に直接入れ込まれた イ ン ラ イ ンオ プシ ョ ン と い う も のを解釈 し ます。 こ れは単純にオプシ ョ ン を テ キ ス ト 内に入れ込む と い う こ と です。 イ ン ラ イ ンオプシ ョ ン リ ス ト はテ キ ス ト 本体の一部 と し て与え ら れます。 デ フ ォ ル ト では、 イ ン ラ イ ンオプシ ョ ンはキ ャ ラ ク タ 「<」 と 「>」 では さ みます。 それでは 次の よ う に、見出 し と 残 り の段落に対す る オプシ ョ ン を テ キ ス ト 本体の中に入れ込んでみ まし ょ う。 注 以下作成例ではすべて、 イ ン ラ イ ン オプ シ ョ ン リ ス ト に色をつけて示 し ます。 改段落キ ャ ラ ク タ を矢印で視覚化 し ます。 <leftindent=15 rightindent=10 alignment=center fontname=Helvetica fontsize=12 encoding=winansi>Have a look at our new paper plane models! <alignment=justify fontname=Helvetica leading=140% fontsize=8 encoding=winansi> Our paper planes are the ideal way of passing the time. We offer revolutionary new developments of the traditional common paper planes. <parindent=20>If your lesson, conference, or lecture turn out to be deadly boring, you can have a wonderful time with our planes. All our models are folded from one paper sheet. They are exclusively folded without using any adhesive. Several models are equipped with a folded landing gear enabling a safe 8.2 複数行のテキス ト フ ロー 225 landing on the intended location provided that you have aimed well. Other models are able to fly loops or cover long distances. Let them start from a vista point in the mountains and see where they touch the ground. オプシ ョ ン リ ス ト をは さ むキ ャ ラ ク タ は begoptlistchar ・ endoptlistchar オプシ ョ ンで再定 義する こ と がで き ます。begoptlistchar オプシ ョ ンにキーワ ー ド none を与え る と オプシ ョ ン リ ス ト の検出は完全に無効にな り ます。 こ れは、 テ キ ス ト が イ ン ラ イ ンオプシ ョ ン リ ス ト を ま っ た く 含ま ない場合に、 「<」 ・ 「>」 を確実に通常のキ ャ ラ ク タ と し て処理 さ せたい と き に有用です。 記号キ ャ ラ ク タ と イ ン ラ イ ン オ プ シ ョ ン リ ス ト 記号キ ャ ラ ク タ はテ キ ス ト フ ロ ーにお いて、 イ ン ラ イ ンオプシ ョ ン リ ス ト と 組み合わせ も 使 う こ と がで き ます。 イ ン ラ イ ンオプ シ ョ ン リ ス ト を開始す る キ ャ ラ ク タ に対す る コ ー ド (デフ ォ ル ト では : 「<」 U+003C) は、 encoding=builtin に よ る フ ォ ン ト に対す る テ キ ス ト 内では記号 コー ド と し て解釈 さ れませ ん。 こ れ と 同 じ コ ー ド の記号グ リ フ を選択する には、 テ キ ス ト フ ォ ン ト に対 し て利用可能 な回避策がその ま ま使え ます。 すなわち、 開始キ ャ ラ ク タ を begoptlistchar オプシ ョ ンで 再定義す る か、 あ る いは textlen オプシ ョ ン を用いて記号グ リ フ の数を指定 し ます。 なお、 文字参照 (< 等) を回避策 と し て用い る こ と はで き ません。 マ ク ロ 上記のテ キ ス ト はい く つかの種類の段落でで き てい ます。すなわち見出 し と 本文 であ り 、 本文には さ ら に イ ンデン ト のあ る も の と ない も の と があ り ます。 こ う し た各種の 段落を それぞれの形に組版 し てい く わけですが、 し か し テ キ ス ト フ ロ ーが も っ と 長ければ 同 じ 指定を何度 も し な ければな り ま せん。 段落替えのたびに、 照応す る イ ン ラ イ ン オプ シ ョ ン群を書かな く て済む よ う にす る には、 イ ン ラ イ ンオプシ ョ ン群を マ ク ロ に ま と めれ ば、 テ キ ス ト 内か ら そのマ ク ロ を名前で参照す る こ と がで き ます。 図 8.16 に示す よ う な 3 つのマ ク ロ を定義 し ま し ょ う 。 H1 は見出 し 用、 Body は本文段落用、 Body_indented は イ ンデン ト す る 段落用です。 マ ク ロ を利用す る には、 キ ャ ラ ク タ & を マ ク ロ 名の前につけ た も のを オプシ ョ ン リ ス ト に書 き ます。 以下の コー ド 断片は、 上で用いた イ ン ラ イ ンオプ シ ョ ン群に従っ て 3 つのマ ク ロ を定義 し 、 それを テ キ ス ト 内で利用 し ます : <macro { H1 {leftindent=15 rightindent=10 alignment=center fontname=Helvetica fontsize=12 encoding=winansi} Body {leftindent=15 rightindent=10 alignment=justify leading=140% H1 Body Body_indented 図 8.16 イ ン ラ イ ン オプ シ ョ ン と マ ク ロの併用 226 Have a look at our new paper plane models! Our paper planes are the ideal way of passing the time. We offer revolutionary new developments of the traditional common paper planes. If your lesson, conference, or lecture turn out to be deadly boring, you can have a wonderful time with our planes. All our models are folded from one paper sheet. They are exclusively folded without using any adhesive. Several models are equipped with a folded landing gear enabling a safe landing on the intended location provided that you have aimed well. Other models are able to fly loops or cover long distances. Let them start from a vista point in the mountains and see where they touch the ground. 第 8 章 : テキス ト と 表の組版 fontname=Helvetica fontsize=8 encoding=winansi} Body_indented {parindent=20 leftindent=15 rightindent=10 alignment=justify leading=140% fontname=Helvetica fontsize=8 encoding=winansi} }> <&H1>Have a look at our new paper plane models! <&Body>Our paper planes are the ideal way of passing the time. We offer revolutionary new developments of the traditional common paper planes. <&Body_indented>If your lesson, conference, or lecture turn out to be deadly boring, you can have a wonderful time with our planes. All our models are folded from one paper sheet. They are exclusively folded without using any adhesive. Several models are equipped with a folded landing gear enabling a safe landing on the intended location provided that you have aimed well. Other models are able to fly loops or cover long distances. Let them start from a vista point in the mountains and see where they touch the ground. オ プ シ ョ ンの明示的設定 注意 し な ければな ら ないのは、 マ ク ロ の中で設定 し なか っ た オプシ ョ ン ではすべて前の値が保持 さ れ る と い う こ と です。 オプシ ョ ン が勝手に 「継承」 さ れておか し な副作用を起 こ さ ない よ う に し たければ、そのマ ク ロ が必要 と す る 設定をす べて明示的に指定す る 必要があ り ます。そ う すればそのマ ク ロ が他のオプシ ョ ン リ ス ト と の順序や組み合わせにかかわ ら ずいつ も 確実に同 じ よ う に動作す る よ う にす る こ と がで き ます。 あ る いは、 こ の動作を逆に利用 し て、 あ る 特定の設定群についてはあ え て明示的に与 えずに、それぞれの利用箇所におけ る 設定が保持 さ れ る よ う にす る と い う 方式 も あ り え ま す。 た と えば、 フ ォ ン ト 名は指定す る けれど も fontsize オプシ ョ ンは与え ない と い う マ ク ロ を作っ て も よ いのです。 す る と 、 文字サ イ ズ をつねに前のテ キ ス ト と 同 じ にす る こ と が で き ます。 イ ン ラ イ ン オ プ シ ョ ンか、 関数の引数 と し てオ プ シ ョ ン を渡すか テ キ ス ト フ ロ ーを利 用す る 際には、 テ キ ス ト がプ ロ グ ラ ム コ ー ド 内に リ テ ラ ルに書かれてい る か、 それ と も ど こ か外部の ソ ース か ら 来 る か と い う のは重大な違いです。 ま た、 組版指示がテ キ ス ト と は 別に あ る か、 それ と も テ キ ス ト 内に あ る か と い う の も 重大です。 たいていのア プ リ ケー シ ョ ンではテ キ ス ト はデー タ ベース の よ う な何 ら かの外部 ソ ース か ら 来 る で し ょ う 。現実 的には 2 通 り の状況が考え ら れます : > テ キ ス ト 内容が外部 ソ ース か ら 来て、 組版オプシ ョ ンはプ ロ グ ラ ム内にあ る 場合 : 実 行時に、 外部 ソ ース か ら 来 る 短いテ キ ス ト 群を プ ロ グ ラ ム内で合成 し 、 それを組版オ プシ ョ ン群 と (関数呼び出 し の所で) 組み合わせます。 > テ キ ス ト 内容 も 組版オプシ ョ ン も 外部 ソ ース か ら 来 る 場合 : 大量のテ キ ス ト が組版オ プシ ョ ン群を含んだ状態で外部 ソ ース か ら 来ます。 組版はテ キ ス ト 内の イ ン ラ イ ン オ プシ ョ ン群に よ っ て与え ら れ ます。 イ ン ラ イ ン オプシ ョ ンは単純なオプシ ョ ン と し て 書かれてい る こ と も あれば、 マ ク ロ と し て書かれてい る こ と も あ り え ます。 マ ク ロ に 関 し ては、 マ ク ロ 定義 と マ ク ロ 呼び出 し と を区別 し て考え る 必要があ り ます。 そ う す る と 、 面白い中間的形態が作 り 出せます : テ キ ス ト 内容は外部 ソ ース か ら 来て組版の ためのマ ク ロ 呼び出 し も その中に含んでい る のですが、 マ ク ロ 定義は別に用意 し てお いて実行時には じ めて与え る よ う にす る のです。 こ の方式の利点は、 外部のテ キ ス ト に手を加えずに組版を簡単に変更で き る こ と です。 た と えばグ リ ーテ ィ ン グ カー ド を 作 る 際な ど、 さ ま ざ ま な ス タ イ ルを マ ク ロ で定義 し ておけば、 カー ド の雰囲気を ロ マ ンチ ッ ク に し た り 、テ ク ニ カルに し た り 、その他 さ ま ざ ま に変え る こ と がで き る で し ょ う。 8.2 複数行のテキス ト フ ロー 227 hortabmethod ruler tabalignment left ruler 30 図 8.17 テキス ト を 表 と し て配置 ITEM 1 2 3 DESCRIPTION Super Kite Turbo Flyer Giga Trash right 150 right 250 right 350 QUANTITY 2 5 1 PRICE 20.00 40.00 180.00 AMOUNT 40.00 200.00 180.00 TOTAL 420.00 8.2.4 タ ブ位置 次の例では タ ブキ ャ ラ ク タ を用いて左寄せ ・ 右寄せの列のあ る簡単な表を配置 し ます。 表 は以下の よ う な複数行のテ キ ス ト を持ち、 個々のエン ト リ が互いに タ ブキ ャ ラ ク タ (矢印 で示す) で区切っ て あ り ます : ITEM 1 DESCRIPTION Super Kite 2 Turbo Flyer 3 Giga Trash TOTAL QUANTITY 2 20.00 5 1 PRICE AMOUNT 40.00 40.00 200.00 180.00 180.00 420.00 こ の簡単な表を配置す る には、 PDF__add/create_textflow( ) で以下のオプシ ョ ン リ ス ト を 用い ます。 ruler オプシ ョ ンが タ ブ位置を定義 し てお り 、 tabalignment が タ ブ位置の整列 方向を指定 し てお り 、 hortabmethod オプシ ョ ンが タ ブ位置の処理方式を指定 し てい ます (出力を図 8.17 に示 し ます) : String optlist = "ruler={30 150 250 350} " + "tabalignment={left right right right} " + "hortabmethod=ruler leading=120% fontname=Helvetica fontsize=9 encoding=winansi"; ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の text_output/tabstops_in_textflow ト ピ ッ ク にあ り ます。 注 複雑な表を作成するには PDFlib の表機能を推奨 し ます (242 ページ 「8.3 表の組版」 参照)。 8.2.5 番号付き リ ス ト と 段落間隔 イ ン ラ イ ンオプシ ョ ンleftindentを用いて番号付 き リ ス ト を組む方法を以下に示 し ます(図 8.18 参照) : 1.<leftindent 10>Long Distance Glider: With this paper rocket you can send all your messages even when sitting in a hall or in the cinema pretty near the back. <leftindent 0>2.<leftindent 10>Giant Wing: An unbelievable sailplane! It is amazingly robust and can even do aerobatics. But it is best suited to gliding. <leftindent 0>3.<leftindent 10>Cone Head Rocket: This paper arrow can be thrown with big swing. We launched it from the roof of a hotel. It stayed in the air a long time and covered a considerable distance. 228 第 8 章 : テキス ト と 表の組版 leftindent = &indent parindent = – &indent 1. 2. 図 8.19 マ ク ロに よ る 番号付き リ ス ト 3. Long Distance Glider: With this paper rocket you can send all your messages even when sitting in a hall or in the cinema pretty near the back. Giant Wing: An unbelievable sailplane! It is amazingly robust and can even do aerobatics. But it is best suited to gliding. Cone Head Rocket: This paper arrow can be thrown with big swing. We launched it from the roof of a hotel. It stayed in the air a long time and covered a considerable distance. ク ッ ク ブ ッ ク 箇条書き リ ス ト と 番号付き リ ス ト の完全な コ ー ド サン プルがク ッ ク ブ ッ クのtext_output/ bulleted_list ・ text_output/numbered_list ト ピ ッ ク にあ り ます。 イ ンデン ト 値を設定 し た り 取 り 消 し た り し なければな ら ないのが面倒です。 し か も 各段落 ご と に行わなければな ら ないのですか ら なお さ ら です。 も っ と エ レ ガ ン ト な解決法 と し て は list と い う マ ク ロ を定義 し ます。 あわせて便宜のためマ ク ロ indent を定義 し 、 定数 と し て使用 し ます。 以下の よ う なマ ク ロ の定義にな り ます : <macro { indent {25} list {parindent=-&indent leftindent=&indent hortabsize=&indent hortabmethod=ruler ruler={&indent}} }> <&list>1. Long Distance Glider: With this paper rocket you can send all your messages even when sitting in a hall or in the cinema pretty near the back. 2. Giant Wing: An unbelievable sailplane! It is amazingly robust and can even do aerobatics. But it is best suited to gliding. 3. Cone Head Rocket: This paper arrow can be thrown with big swing. We launched it from the roof of a hotel. It stayed in the air a long time and covered a considerable distance. leftindent オプシ ョ ンで左余白か ら の間隔を指定 し てい ます。 parindent オプシ ョ ンには、 leftindent を負値に し た も のを設定 し 、 各段落の先頭行の イ ンデン ト を打ち消 し てい ます。 オプシ ョ ン hortabsize ・ hortabmethod ・ ruler では、 leftindent に照応 し た タ ブ位置を指定 し てい ます。 こ れに よ っ て、 番号の後のテ キ ス ト は、 leftindent で指定 し た分だけ イ ンデ ン ト さ れ る よ う にな り ます。図 8.19 に parindent・leftindent オプシ ョ ンの作用を示 し ます。 2 つの段落の間隔を設定 多 く の場合、 と な り あ っ た段落の間隔は、 段落の中の行間 よ り も 、 広 く と り たい も のです。 こ れ を 実現す る には、 空の行を 挿入 し て (nextline オプ シ ョ ンで作成で き ます) 、 その空行に適切な行送 り 値を設定 し ます。 こ の値は、 直前の段 1. Long Distance Glider: With this paper rocket you can send all your messages even when sitting in a hall or in the cinema pretty near the back. 2. Giant Wing: An unbelievable sailplane! It is amazingly robust and can even do aerobatics. But it is best suited to gliding. 3. Cone Head Rocket: This paper arrow can be thrown with big swing. We launched it from the roof of a hotel. It stayed in the air a long time and covered a considerable distance. 図 8.18 番号付き リ ス ト 8.2 複数行のテキス ト フ ロー 229 落の最終行のベース ラ イ ン と 、 空行のベース ラ イ ン と の間隔です。 以下の例は、 2 つの段 落の間に 80% のア キ を作 り ます ( こ こ で 100% は、 も っ と も 最近に設定 さ れた文字サ イ ズ の値に等 し い) : 1. Long Distance Glider: With this paper rocket you can send all your messages even when sitting in a hall or in the cinema pretty near the back. <nextline leading=80%><nextparagraph leading=100%>2. Giant Wing: An unbelievable sailplane! It is amazingly robust and can even do aerobatics. But it is best suited to gliding. ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の text_output/distance_between_paragraphs ト ピ ッ ク にあ り ます。 8.2.6 制御キ ャ ラ ク タ と キ ャ ラ ク タ マ ッ ピ ン グ テキス ト フ ロ ー内で制御キ ャ ラ ク タ テ キ ス ト フ ロ ーの中では さ ま ざ ま な キ ャ ラ ク タ が 特別な扱いを受け ます。 PDFlib はシ ン ボ リ ッ ク キ ャ ラ ク タ 名に対応 し てお り 、 こ れはその 照応する 文字コ ー ド のかわ り と し て charmapping オプシ ョ ン(テ キ ス ト を処理す る前にそ の中のキ ャ ラ ク タ を置換で き る オプシ ョ ン。 後述) 内で用い る こ と がで き ます。 表 8.1 に、 テ キ ス ト フ ロ ー関数群が評価す る すべての制御キ ャ ラ ク タ を、それぞれのシ ン ボ リ ッ ク 名 と 意味説明 と と も に挙げて あ り ます。 1 つのオプシ ョ ン リ ス ト の中で同 じ オプシ ョ ン を複 数回使 う こ と はで き ま せんが、 複数のオプシ ョ ン リ ス ト を連続 し て与え る こ と は可能で す。 た と えば以下の並びは空行を作成 し ます : <nextline><nextline> キ ャ ラ ク タ かキ ャ ラ ク タ 列を マ ッ ピ ン グ / 除去 charmapping オプシ ョ ン を使 う と 、 テ キ ス ト 内のキ ャ ラ ク タ を、 別のキ ャ ラ ク タ へマ ッ プ し た り 、 除去 し た り す る こ と がで き ま す。 ま ずは簡単な場合か ら 始め る こ と に し て、 テ キ ス ト 内のすべての タ ブ を ス ペー ス へ マ ッ プ し てみま し ょ う 。 こ れを行 う には charmapping オプシ ョ ン を以下の よ う に し ます : charmapping={hortab space} こ の コ マ ン ド ではシ ン ボ リ ッ ク キ ャ ラ ク タ 名 hortab ・ space を用いてい ます。 複数のマ ッ ピ ン グ を一度に行 う には、 以下の コ マ ン ド の よ う にすれば、 すべての タ ブ と 改行キ ャ ラ ク タ 列を スペース に置換す る こ と がで き ます : charmapping={hortab space CRLF space LF space CR space} 以下の コ マ ン ド はすべての ソ フ ト ハ イ フ ン を削除 し ます : charmapping={shy {shy 0}} タ ブ 1 つにつ き スペース 4 つに置換 し ます : charmapping={hortab {space 4}} 任意長の連続 linefeed キ ャ ラ ク タ 列を 1 個の linefeed キ ャ ラ ク タ に縮め ます : charmapping={linefeed {linefeed -1}} CRLF キ ャ ラ ク タ 列を それぞれ 1 個の スペース に置換 し ます : charmapping={CRLF {space -1}} 230 第 8 章 : テキス ト と 表の組版 表 8.1 テキス ト フ ロー内の制御キ ャ ラ ク タ と その意味 Unicode キ ャ ラ ク タ 実体名 等価な テキ ス ト フ ロー オプ シ ョ ン テキス ト フ ロー内におけ る意味 U+0020 SP, space space 単語揃え ・ 改行 U+00A0 NBSP, nbsp (な し ) (no-break space) 改行 し ない空白文字 U+202F NNBSP, nnbsp (な し ) (narrow no-break space) 改行 し ない、 かつ組版オプ シ ョ ンに 従っ てその幅を変え る こ と のない固定幅空白文字 U+0009 HT, hortab (な し ) 水平 タ ブ : ruler ・ tabalignchar ・ tabalignment オプ シ ョ ンに 従っ て処理 さ れます U+002D HY, hyphen (な し ) 単語のハイ フ ネーシ ョ ンのための区切 り 文字 U+00AD SHY, shy (な し ) (soft hyphen) ハイ フ ネーシ ョ ン機会。 改行箇所でのみ表示 さ れる U+000B U+2028 VT, verttab LS, linesep nextline (next line) 次の行へ移る U+000A U+000D U+000D ・ U+000A U+0085 U+2029 LF, linefeed CR, return CRLF NEL, newline PS, parasep nextparagraph (next paragraph) nextline と 同効果。 それに加え、 parindent オプ シ ョ ンが次の行に影響 し ます U+000C FF, formfeed return PDF_fit_textflow( ) 関数が中断 し て文字列 _nextpage を返 し ま す。 こ の最後の例について も う 少 し 詳 し く 見てみま し ょ う 。た と えばど こ かか ら テ キ ス ト を受 け取っ た時、何か他の ソ フ ト ウ ェ アのせいで行の途中に改行がブ ツブ ツ入っ ていた と し た ら 、 その ま ま では適切に組版がで き ません。 適切にはめ込み枠内での組版が行え る よ う に す る には、 こ れ ら の改行を スペース に置換 し たい と こ ろです。 こ れを行 う ため、 任意長の 連続改行を 1 個の スペース に置換 し ま し ょ う 。は じ めのテ キ ス ト は以下の よ う な も のだ と し ます : To fold the famous rocket looper proceed as follows: Take a sheet of paper. Fold it lengthwise in the middle. Then, fold down the upper corners. Fold the long sides inwards that the points A and B meet on the central fold. 以下の コ ー ド 断片は、無駄な改行キ ャ ラ ク タ を置換 し た う えでで き たテ キ ス ト を組版す る 方法を演示 し てい ます : /* オプションリストを組み立て */ String optlist = "fontname=Helvetica fontsize=9 encoding=winansi alignment=justify " "charmapping {CRLF {space -1}}" /* テキストフローをはめ込み枠に配置 */ textflow = p.add_textflow(-1, text, optlist); if (textflow == -1) throw new Exception("エラー:" + p.get_errmsg()); 8.2 複数行のテキス ト フ ロー 231 To fold the famous rocket looper proceed as follows: Take a sheet of paper. Fold it lengthwise in the middle. Then, fold down the upper corners. Fold the long sides inwards that the points A and B meet on the central fold. 図 8.20 上 : 無駄な改行のある テキス ト To fold the famous rocket looper proceed as follows: Take a sheet of paper. Fold it lengthwise in the middle. Then, fold down the upper corners. Fold the long sides inwards that the points A and B meet on the central fold. 下 : charmapping オプ シ ョ ン で 改行を置換 し た も の result = p.fit_textflow(textflow, left_x, left_y, right_x, right_y, ""); if (!result.equals("_stop")) { /* ... */ } p.delete_textflow(textflow); 図 8.20 に、 処置前のテ キ ス ト のテ キ ス ト フ ロ ー出力 と 、 charmapping オプシ ョ ンに よ る 改善後の出力 と を示 し ます。 8.2.7 ハ イ フ ネーシ ョ ン PDFlib は自動的にテ キ ス ト のハ イ フ ネーシ ョ ン を行 う 能力は持ち ませんが、テ キ ス ト 内で ソ フ ト ハ イ フ ン キ ャ ラ ク タ に よ っ て明示的にハ イ フ ネーシ ョ ン機会が示 さ れてい る 場合 にはそ こ で単語を分割する こ と がで き ます。 ソ フ ト ハ イ フ ン キ ャ ラ ク タ は Unicode では位 置 U+00AD にあ り ますが、 非 Unicode 環境で ソ フ ト ハ イ フ ン を指定 し たい場合に も 、 い く つかの方式が利用可能です : > cp1250 ~ cp1258(winansi を含む) と iso8859-1 ~ iso8859-16 のすべてのエン コーデ ィ ン グ では ソ フ ト ハ イ フ ンは 10 進で 173、 8 進で 255、 16 進で 0xAD にあ り ます。 > ebcdic エン コ ーデ ィ ン グでは ソ フ ト ハ イ フ ンは 10進で 202、8進で 312、16進で 0xCA にあ り ます。 > エ ン コ ーデ ィ ン グ が ソ フ ト ハ イ フ ン キ ャ ラ ク タ を 含ん で い な い場合は (た と え ば macroman)、 文字実体を用い る こ と がで き ます : ­ グ リ フ U+00AD が そ の フ ォ ン ト 内 で得 ら れ る 場合に は そ れが、 そ う で な い場合に は U+002D がハ イ フ ン キ ャ ラ ク タ と し て使われます。 ソ フ ト ハ イ フ ンで示 さ れたハ イ フ ネー シ ョ ン機会でな く て も 、 単語は強制的にハ イ フ ネーシ ョ ン さ れ る こ と があ り ます。 こ れは 単語間隔伸縮や長体な ど、 他の調整手段が う ま く いかなか っ た極端な場合に起 こ り ます。 テキス ト 両端揃え でハ イ フ ン キ ャ ラ ク タ があ る場合 と ない場合 以下の例では、 以下の テ キ ス ト を両端揃えで印字 さ せます。テ キ ス ト には ソ フ ト ハ イ フ ン キ ャ ラ ク タ を適宜入れ て あ り ます ( こ こ ではダ ッ シ ュ で視覚化 し てい ます) : Our paper planes are the ideal way of pas sing the time. We offer revolu brand new dev tional common paper planes. If your lesson, confe elop ments of the tradi tionary rence, or lecture turn out to be deadly boring, you can have a wonder ful time with our planes. All our models are folded from one paper sheet. They are exclu folded without using any adhe landing gear enab 232 sive. Several models are equip ling a safe landing on the intended loca 第 8 章 : テキス ト と 表の組版 sively ped with a folded tion provided that you Our paper planes are the ideal way of passing the time. We offer revolutionary brand new developments of the traditional common paper planes. If your lesson, conference, or lecture turn out to be deadly boring, you can have a wonderful time with our planes. All our models are folded from one paper sheet. They are exclusively folded without using any adhesive. Several models are equipped with a folded landing gear enabling a safe landing on the intended location provided that you have aimed well. Other models are able to fly loops or cover long distances. Let them start from a vista point in the mountains and see where they touch the ground. Our paper planes are the ideal way of passing the time. We offer revolutionary brand new developments of the traditional common paper planes. If your lesson, conference, or lecture turn out to be deadly boring, you can have a wonderful time with our planes. All our models are folded from one paper sheet. They are exclusively folded without using any adhesive. Several models are equipped with a folded landing gear enabling a safe landing on the intended location provided that you have aimed well. Other models are able to fly loops or cover long distances. Let them start from a vista point in the mountains and see where they touch the ground. 図 8.21 テキス ト 両端揃えで ソ フ ト ハイ フ ン あ り 。 デ フ ォル ト 設定 と 広いはめ込み枠を使用。 図 8.22 テキス ト 両端揃えで ソ フ ト ハイ フ ン な し 。 デ フ ォ ル ト 設定 と 広いはめ込み枠を使用。 have aimed well. Other models are able to fly loops or cover long dist start from a vista point in the mount ances. Let them ains and see where they touch the ground. 図 8.21 に、テ キ ス ト 両端揃えのデフ ォ ル ト 設定で生成 さ れたテ キ ス ト 出力を示 し ます。完 璧な見ばえ と な っ てい ま す。 なぜな ら 条件が最適だか ら です : はめ込み枠枠が充分広 く て、 し か も 、 明示的なハ イ フ ネーシ ョ ン機会を ソ フ ト ハ イ フ ン キ ャ ラ ク タ で指定 し て あ る か ら です。 図 8.22 を見 る と 、 明示的 ソ フ ト ハ イ フ ンがない場合で も 出力はおおむね良好 です。 オプシ ョ ン リ ス ト はど ち ら の場合 も 以下の よ う にな り ます : fontname=Helvetica fontsize=9 encoding=winansi alignment=justify 8.2.8 標準改行アルゴ リ ズムの制御 PDFlib は洗練 さ れた改行アルゴ リ ズ ム を実装 し てい ます。改行アルゴ リ ズ ム を制御す る テ キ ス ト フ ロ ーオプシ ョ ン を表 8.2 に挙げます 改行規則 1 つの単語、 ない し 両端を スペース キ ャ ラ ク タ で挟まれた一連のテ キ ス ト が、 1 つの行に収ま り き ら ない場合、 次の行へ送 る 必要が出て き ます。 こ の よ う な状況で改行 アルゴ リ ズ ムは、 ど のキ ャ ラ ク タ の後で改行が可能かを決定 し ます。 た と えば、 -12+235/8*45 の よ う な数式は絶対に途中で改行 さ れませんが、 一方、 文字列 PDF-345+LIBRARY はマ イ ナ ス の所で次行に送 ら れ る 可能性があ り ます。 テ キ ス ト が ソ フ ト ハ イ フ ン キ ャ ラ ク タ を含んでいればその う ちのいずれかの後で改行 さ れ る 可能性 も あ り ます。 括弧 と 引用符については、 開 く 所 と 閉 じ る 所 と で規則が異な り ます : 括弧や引用符が 開 く 所では改行機会は一切与え ら れません。 引用符については、 どれが開いて どれが閉 じ てい る のか を判定す る 手段 と し て、 引用符のペア を数え てい く 仕組みにな っ てい ます。 イ ン ラ イ ン オプシ ョ ン リ ス ト は通常は改行機会を生み出 し ません。 それは単語内での オプシ ョ ン変更を可能にす る ためです。 ただ し 、 オプシ ョ ン リ ス ト が スペース キ ャ ラ ク タ で挟まれてい る 場合はオプシ ョ ン リ ス ト の開始位置に改行機会があ り ます。 も し そのオプ シ ョ ン リ ス ト で改行が起 き て し か も alignment=justify の場合、オプシ ョ ン リ ス ト の前にあ る スペース群は破棄 さ れます。 オプシ ョ ン リ ス ト の後の スペース群は保持 さ れ、 次行先頭 に表れます。 8.2 複数行のテキス ト フ ロー 233 表 8.2 改行アルゴ リ ズムを制御する ためのオプ シ ョ ン オプ シ ョ ン 説明 adjustmethod (キーワー ド ) minspacing ・ maxspacing オプ シ ョ ン で指定 さ れた制限内で単語間を詰めた り 拡げた り し て も テキス ト が 1 行に収ま り き ら ない時に行の調整に用い る方式。 デ フ ォル ト : auto。 auto 以下の方式が順に適用 さ れます : shrink ・ spread ・ nofit ・ split。 clip nofit (後述) と 同 じ 。 ただ し 、 はめ込み枠の右端 (rightindent オプ シ ョ ン を考慮) か らはみ出 し た部分を切 り 落 と し 。 nofit 最後の単語を次行へ送る。 ただ し 、 残 さ れる (短い) 行が、 nofitlimit オプ シ ョ ン で 指定 さ れたパーセ ン ト 値よ り も短 く な ら ない場合に限る。 均等配置の段落で も若干がた ついて見え る場合あ り 。 shrink 単語が行内に収ま ら ない と き、 収ま る ま で テキス ト を圧縮。 ただ し shrinklimit の制限 に従い、 それで収ま り き ら なければ nofit 方式を適用。 split 最後の単語を次行へ送ら ず、 強制的にハイ フ ネーシ ョ ンする。 テキス ト フ ォ ン ト の場合 はハイ フ ンキ ャ ラ ク タ を挿入 し 、 記号フ ォ ン ト の場合は し ない。 spread 最後の単語を次行へ送 り 、 残 さ れた (短い) 行を均等配置する よ う 単語内の字間を拡げ る。 ただ し spreadlimit の制限に従い、 それで均等配置で き なければ nofit 方式を適 用。 advancedlinebreak (論理値) 複雑用字系で必要な高度な改行アルゴ リ ズムを有効に し ます。 これは タ イ文字等、 単語 境界を示すのに空白キ ャ ラ ク タ を使わない用字系で改行を行 う ために必要です。 オプ シ ョ ン locale ・ script に従います。 デ フ ォ ル ト : false avoidbreak (論理値) true な ら、 avoidbreak が false に再設定 さ れる ま で一切改行 し ない。 デ フ ォル ト : false。 charclass (ペアの リ ス ト 。 こ こ でペアの 1 番目の要素はキーワー ド であ り 、 2 番目の要素は Unichar ま たは Unichar の リ ス ト ) 指定 さ れた Unichar が、 指定 さ れたキーワー ド によ っ て分類 さ れる こ と によ り 、 そのキ ャ ラ ク タ (群) の改行時動作を決定 し ます : letter 文字 (a B 等) と 同様に動作 punct 句読点文字 (+ / ; : 等) と 同様に動作 open 開きかっ こ ([ 等) と 同様に動作 close 閉 じ かっ こ (] 等) と 同様に動作 default すべてのキ ャ ラ ク タ 分類を PDFlib 内蔵のデ フ ォ ル ト に リ セ ッ ト 例 : charclass={ close » open « letter {/ : =} punct & } hyphenchar 234 (Unichar ま たはキーワー ド ) 改行箇所で ソ フ ト ハイ フ ンに置き換わるべきキ ャ ラ ク タ の Unicode 値。 デ フ ォル ト : U+00AD (SOFT HYPHEN)、 ただ し それがフ ォ ン ト 内になければ U+002D (HYPHEN-MINUS)。 第 8 章 : テキス ト と 表の組版 表 8.2 改行アルゴ リ ズムを制御する ためのオプ シ ョ ン オプ シ ョ ン 説明 locale (キーワー ド ) advancedlinebreak= true の場合に、 ロー カ ラ イ ズ さ れた改行方式のために用い ら れる ロ ケール。 キーワー ド は 1 個ない し 複数の構成要素から 成っ てお り 、 その中でオプ シ ョ ナル な コ ンポーネ ン ト は下線キ ャ ラ ク タ 「_」 で区切ら れます (その文法は NLS/POSIX ロ ケール ID と は若干異な っ ています。) : > 必須の、ISO 639-2 に従っ た 2 文字か 3 文字の小文字の言語 コ ー ド (www.loc.gov/standards/iso6392 を参照)。 例 : en (英語) ・ de ( ド イ ツ語) ・ ja (日本語)。 これは language オプ シ ョ ン と は異 な り ます。 > オプ シ ョ ナルな、 ISO 15924 に従っ た 4 文字の用字系 コ ー ド (www.unicode.org/iso15924/iso15924codes.html を参照)。 例 : Hira (ひ らがな) ・ Hebr (ヘブ ラ イ文字) ・ Thai ( タ イ文字)。 > オプ シ ョ ナルな、 ISO 3166 に従 っ た 2 文字の大文字の国 コ ー ド (www.iso.org/iso/country_codes/ iso_3166_code_lists を参照)。 例 : DE ( ド イ ツ) ・ CH (ス イ ス) ・ GB (イ ギ リ ス) キーワー ド _none は、 ロ ケール固有の処理が一切行われない こ と を指定 し ます。 ロケールを指定する こ と は、 タ イ文字等い く つかの用字系では高度な改行のために必須です。 デ フ ォ ル ト : _none 例 : Thai ・ de_DE ・ en_US ・ en_GB maxspacing minspacing (float またはパーセ ン ト 値) 単語間の最大間隔 ・ 最小間隔 (ユーザー座標で表すか、 スペースキ ャ ラ ク タ の幅に対するパーセ ン ト 値で指定)。 単語間隔の算出時は こ の値を限度 と する (ただ し wordspacing オプ シ ョ ンが加算 さ れる)。 デ フ ォル ト : minspacing=50%、 maxspacing=500%。 nofitlimit (float またはパーセ ン ト 値) nofit 方式における行の長 さ の下限 (ユーザー座標で表すか、 収める はめ込み枠の幅に対するパーセ ン ト 値で指定)。 デ フ ォル ト : 75%。 shrinklimit (パーセ ン ト 値) shrink 方式における テキス ト 圧縮の下限。 縮小率の算出時は こ の値を限度 と す る。 ただ し 、 horizscaling オプ シ ョ ンの値を掛け算 さ れる。 デ フ ォ ル ト : 85%。 spreadlimit (float またはパーセ ン ト 値) spread 方式におけ る 2 文字間の間隔の上限 (ユーザー座標で表すか、 文字サイ ズに対するパーセ ン ト 値で指定)。 計算 さ れる文字間は charspacing オプ シ ョ ンの値に加 算 さ れる。 デ フ ォル ト : 0。 改行を防止 charclass オプシ ョ ン を使 う と 、 テ キ ス ト フ ロ ーが特定のキ ャ ラ ク タ の後で 改行 さ れ る のを防止す る こ と がで き ます。 た と えば、 以下のオプシ ョ ンはキ ャ ラ ク タ / の 直後での改行を防止 し ます : charclass={letter /} ひ と つなが り のテ キ ス ト が複数行に泣 き 別れて し ま う のを防ぐ には、それを avoidbreak ~ noavoidbreak で く く る と い う 方法があ り ます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/avoid_linebreaking ト ピ ッ ク にあ り ます。 日中韓テキス ト の組版 テ キ ス ト フ ロ ーエ ン ジ ン は、 日中韓テ キ ス ト を扱え る よ う に作 ら れてい る ので、 Unicode 標準の通 り 、 日中韓キ ャ ラ ク タ を表意文字 と し て適切に取 り 扱 い ます。 その結果、 日中韓テ キ ス ト はけ っ し てハ イ フ ネーシ ョ ン さ れません。 組版の品質 を高め る ため、 日中韓テ キ ス ト でテ キ ス ト フ ロ ーを使 う と き は、 以下の組版オプシ ョ ン を 推奨 し ます。 こ う す る と 、 欧文テ キ ス ト が混在 し ていて も そ こ でハ イ フ ネーシ ョ ンが行わ れな く な り 、 ま た、 均等に間隔を あ けた テ キ ス ト 出力が作成 さ れます : hyphenchar=none alignment=justify 8.2 複数行のテキス ト フ ロー 235 Our paper planes are the ideal way of passing the time. We offer revolutionary brand new developments of the traditional common paper planes. If your lesson, conference, or lecture turn out to be deadly boring, you can have a wonderful time with our planes. All 図 8.23 狭いはめ込み枠で テキス ト 両端揃え。 デ フ ォル ト 設定を用いています 単語間ツ メ (minspacing オプ シ ョ ン) 行に長体 (shrink 方式 ・ shrinklimit オプ シ ョ ン) 強制ハイ フ ネーシ ョ ン (split 方式) 単語間アケ (spread 方式 ・ maxspacing オプ シ ョ ン) shrinklimit=100% spreadlimit=100% 縦書き はテ キ ス ト フ ロ ーでは対応 し てい ません。 狭いはめ込み枠で テキス ト 両端揃え はめ込み枠が狭ければ狭いほ ど、 両端揃えのテ キ ス ト を制御する ためのオプシ ョ ンが重要にな っ てい き ます。 図 8.23 は、 狭いはめ込み枠 でテ キ ス ト が さ ま ざ ま な方式で両端揃え さ れた出力結果を例示 し てい ます。 図 8.23 のオ プシ ョ ン設定は基本的におおむね良好ですが、 ただ、 maxspacing がやや広すぎ る 単語間 隔を与え てい る のが気にな り ます。 と はいえ、 狭いはめ込み枠に対 し ては こ れは こ の ま ま に し てお く こ と を推奨 し ます。 でない と 、 split 方式に よ る見苦 し い強制ハ イ フ ネーシ ョ ン の発生頻度が高ま る で し ょ う 。 はめ込み枠が狭すぎ る ために不適切な箇所が強制ハ イ フ ネーシ ョ ン さ れて し ま う 場合 は、 対処を考慮 し て、 ソ フ ト ハ イ フ ン を入れ る な り 、 テ キ ス ト 両端揃え を制御す る オプ シ ョ ン を変え る な り する 必要があ る で し ょ う 。 テキス ト 両端揃え で shrinklimit オ プ シ ョ ン 見 た 目に も っ と も 受け入れやすい解決策 は shrinklimit オプシ ョ ン を小 さ く す る こ と で し ょ う 。 こ のオプシ ョ ンは、 shrink 方式でか か る 長体の割合の下限を指定する も のです。 図 8.24a は、 テ キ ス ト に shrinklimit=50% ま で長体を かけ る こ と で強制ハ イ フ ネーシ ョ ン を防いでい る 様子を示 し てい ます。 テキス ト 両端揃え で spreadlimit オ プ シ ョ ン 字間 を 拡げ る こ と で改行 を 制御す る の も 一つの方法です。 こ れは spread 方式で行われ、 spreadlimit オプシ ョ ンで制御 さ れます。 し か し こ の方式は美 し く ないのでめっ たに使われないで し ょ う 。 図 8.24b は、 spreadlimit=5 を使っ て、 字間の最大を非常に広 く 5 単位 と し た例です。 図 8.24 狭いはめ込み枠内の両端揃え テキス ト のためのオプ シ ョ ン 生成 さ れる出力 a) 236 passing the time. We offer revolutionary brand new developments of the traditional common paper planes. If your lesson, conference, or lecture turn out to 第 8 章 : テキス ト と 表の組版 PDF_fit_textline( ) に与え る オプ シ ョ ン リ ス ト alignment=justify shrinklimit=50% 生成 さ れる出力 PDF_fit_textline( ) に与え るオプ シ ョ ン リ ス ト b) Our paper planes are the ideal way of passing the time. We offer revolutionary b r a n d n e w developments of the alignment=justify spreadlimit=5 c) ments of the traditional common paper planes. If your lesson, conference, or lecture turn out to be deadly boring, you can have alignment=justify nofitlimit=50 テキス ト 両端揃え で nofitlimit オ プ シ ョ ン nofitlimit オプシ ョ ンは、 nofit 方式が適用 さ れた と き の行の最小の幅を制御す る も のです。 はめ込み枠が非常に狭い場合は、 こ れをデ フ ォ ル ト 値 75% か ら 下げたほ う が強制ハ イ フ ネーシ ョ ン よ り は ま し です。 図 8.24c は、 行 の最小幅 50% を指定 し た場合の出力結果を示 し てい ます。 8.2.9 高度な用字系固有の改行 PDFlib は、 標準の改行アルゴ リ ズ ム に加え て、 追加の改行アルゴ リ ズ ム を実装 し てい ま す。 こ の高度な改行アルゴ リ ズ ムは、 い く つかの用字系では必須であ り 、 ま た、 必須でな いその他の用字系 / ロ ケールの組み合わせのなかに も 、 こ れに よ り 改行動作が改善 さ れ る も のがあ り ます。 こ れは advancedlinebreak オプシ ョ ン で有効にす る こ と がで き ます。 改 行はテ キ ス ト の言語に依存 し ますので、 高度な改行アルゴ リ ズ ムは script オプシ ョ ン (表 6.2 参照) と locale オプシ ョ ン (PDFlib リ フ ァ レ ン ス参照) に従い ます。 高度な改行は、 以下の状況において正 し い改行機会を決定 し ます : > タ イ 文字等、 テ キ ス ト 内の空白キ ャ ラ ク タ の存在に改行が依拠 し ない用字系に対 し て。 以下のテ キ ス ト フ ロ ーオプシ ョ ンは、 タ イ 文字に対 し て高度な改行を有効に し ます : <advancedlinebreak script=thai locale=tha> > 仏文テ キ ス ト 内で引用符 と し て用い ら れ る «» ギユ メ キ ャ ラ ク タ 等、 あ る特定の句読点 キ ャ ラ ク タ の特別な扱い を必要 と す る 用字系 / ロ ケールの組み合わせにおいて。 下記 のテ キ ス ト フ ロ ーオプシ ョ ンは、仏文テ キ ス ト に対 し て高度な改行を有効に し ます。そ の結果、 単語を囲 う ギユ メ キ ャ ラ ク タ が行末で単語 と 泣 き別れ し な く な り ます : <advancedlinebreak script=latn locale=fr> locale テ キ ス ト フ ロ ーオプシ ョ ンは language テ キ ス ト オプシ ョ ン (表 6.3 参照) と 違 う こ と に留意 し て く だ さ い : locale オプシ ョ ンは同 じ 3 文字の言語識別子で始ま る こ と がで き ますが、1 個ない し 2 個の追加部分を任意に含む こ と も で き ます。ただ し 、こ れ ら が PDFlib で必要にな る こ と は まれです。 8.2.10 テキス ト をパス ・ 画像に回 り 込ませる 回 り 込み機能を利用す る と 、 任意の形状にテ キ ス ト を入れた り 、 テ キ ス ト をパ ス に回 り 込 ませ る こ と がで き ます。 範囲枠、 明示的な長方形 / 多角形 / 円 / 曲線、 パ ス オブジ ェ ク ト のいずれか を用いて、 テ キ ス ト フ ロ ーに対す る 回 り 込み領域を指定す る こ と がで き ます。 画像が ク リ ッ ピ ン グパ ス を内蔵 し てい る 場合には、テ キ ス ト を その画像の ク リ ッ ピ ン グパ ス に自動的に回 り 込ませ る こ と も 可能です。 8.2 複数行のテキス ト フ ロー 237 範囲枠を持つ画像に テキス ト を回 り 込ませる 最初の作成例 と し て、 テ キ ス ト フ ロ ーの 中に画像を配置 し て、 テ キ ス ト を その画像全体の ま わ り に回 り 込ませてみま し ょ う 。 まず 画像を読み込み、 枠内の希望の位置に配置 し ま す。 こ の画像を後で名前で参照す る ため に、 オプシ ョ ン リ ス ト matchbox={name=img margin=-5} で、 画像をはめ込む際に img と い う 範囲枠を定義 し 、 5 単位の余白を指定 し ま し ょ う : result = p.fit_image(image, 50, 35, "boxsize={80 46} fitmethod=meet position=center matchbox={name=img margin=-5}"); テ キ ス ト フ ロ ーを追加 し ます。 そ し てそれを、 以下の よ う に、 画像のはめ込み枠 img を回 り 込むべ き 領域 と し て wrap オプシ ョ ン を使っ て配置 し ま し ょ う (図 8.25 参照) : result = p.fit_textflow(textflow, left_x, left_y, right_x, right_y, "wrap={usematchboxes={{img}}}"); テ キ ス ト を配置す る 前に、同 じ 範囲枠名を使っ て さ ら にほかの画像をはめ込んでい く こ と も で き ます。 その場合、 テ キ ス ト はすべての画像を回 り 込みます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の text_output/wrap_text_around_images ト ピ ッ ク に あ り ます。 任意のパスに テキス ト を回 り 込ませる パ ス オブジ ェ ク ト を作成 し て (76 ページ 「3.2.3 直接パ ス と パ ス オブジ ェ ク ト 」 参照)、 それを回 り 込み形状 と し て用い る こ と も で き ます。 下記の コ ー ド 断片は、 単純な形状 (1 個の円) のパス オブジ ェ ク ト を構築 し 、 それを PDF_ fit_textflow( ) の wrap オプシ ョ ンに与え ます。 パス を配置する 参照点は、 はめ込み枠の幅 と 高 さ に対す る パーセ ン ト 値 と し て表現 さ れてい ます : path = p.add_path_point( -1, 0, 100, "move", ""); path = p.add_path_point(path, 200, 100, "control", ""); path = p.add_path_point(path, 0, 100, "circular", ""); /* 望むならパスを視覚化 */ p.draw_path(path, x, y, "stroke"); result = p.fit_textflow(tf, llx1, lly1, urx1, ury1, "wrap={paths={" + "{path=" + path + " refpoint={100% 50%} }" + "}}"); p.delete_path(path); 図 8.25 範囲枠を持つ画像にテキス ト を回 り 込ませる Have a look at our new paper plane models! Our paper planes are the ideal way of passing the time. revolutionary new We offer developments of the traditional common paper planes. If your lesson, conference, or lecture turn out to be deadly boring, you can have a wonderful time with our planes. All our models are folded from one paper sheet. They are exclusively folded without using any adhesive. 238 第 8 章 : テキス ト と 表の組版 図 8.26 三角形の輪郭にテキス ト を回 り 込ませる Our paper planes are50% the ideal way of passing the time. 80% We offer a lot of revolutionary brand-new developments of the traditional common paper planes. If your lesson, conference, or lecture turn out to be deadly boring, you can have a wonderful time with our planes. All our models are folded from one paper sheet. They are exclusively folded without using any adhesive. 80% 30% 20% 30% Several models are equipped with a folded landing gear. enabling a safe landing on the intended location provided that you have aimed well. Other models are able to fly loops or cover long distances. inversefill オプシ ョ ン を用い る と 、 テ キ ス ト をパ ス の外側に回 り こ ませ る のではな く 、 パ ス の内側に回 り こ ませ る こ と が可能です (すなわち、 パ ス はテ キ ス ト フ ロ ー内に穴を作 る のではな く 、 テ キ ス ト の入れ物 と し て機能 し ます) : result = p.fit_textflow(tf, llx1, lly1, urx1, ury1, "wrap={inversefill paths={" + "{path=" + path + " refpoint={100% 50%} }" + "}}"); 画像の ク リ ッ ピ ン グパスに テキス ト を回 り 込ませる TIFF ・ JPEG 画像は、 ク リ ッ ピ ン グ パ ス を内蔵す る こ と がで き ます。 こ のパ ス は、 画像処理アプ リ ケーシ ョ ン で作成 さ れてい る 必要があ り 、 PDFlib は こ れを評価 し ます。 デフ ォ ル ト ク リ ッ ピ ン グパ ス が画像内で見つ かればそれが使われ ますが、 画像内の他の任意の ク リ ッ ピ ン グパ ス を PDF_load_image( ) の clippingpathname オプシ ョ ン で指定す る こ と も で き ます。 画像が ク リ ッ ピ ン グパ ス と と も に読み込まれていれば、 そのパ ス を抽出 し て先述の よ う に PDF_fit_textflow( ) の wrap オプシ ョ ンに与え る こ と がで き ます。取 り 込んだ画像の ク リ ッ ピ ン グパ ス を拡大す る ため に scale オプシ ョ ン も 与え ます : image = p.load_image("auto", "image.tif", "clippingpathname={path 1}"); /* 画像のクリッピングパスからパスオブジェクトを作成 */ path = (int) p.info_image(image, "clippingpath", ""); if (path == -1) throw new Exception("エラー : クリッピングパスが見つかりません!"); result = p.fit_textflow(tf, llx1, lly1, urx1, ury1, "wrap={paths={{path=" + path + " refpoint={50% 50%} scale=2}}}"); p.delete_path(path); 画像を配置 し て テキス ト を それに回 り 込ませる 前の項では画像の ク リ ッ ピ ン グパ ス だ け を使い ま し た (画像自体ではな く ) が、 今度は画像をはめ込み枠の中に配置 し て、 テ キ ス ト を そ れ に 回 り 込 ま せ て み ま し ょ う 。 こ れ を 実 現 す る に は、 今 度 も 画 像 を clippingpathname オプシ ョ ン をつけて読み込んで、 それを PDF_fit_image( ) でページ上に 配置す る 必要があ り ます。テ キ ス ト を回 り 込ませ る のに適切なパ ス オブジ ェ ク ト を作成す る ために、 PDF_fit_image( ) と 同 じ オプシ ョ ン リ ス ト をつけて PDF_info_image( ) を呼び出 し ま し ょ う 。 最後に、 参照点 (PDF_fit_image( ) の x/y 引数) を wrap オプシ ョ ンの paths サブオプシ ョ ンの refpoint サブオプシ ョ ンに与え る 必要があ り ます : image = p.load_image("auto", "image.tif", "clippingpathname={path 1}"); /* 画像を何らかのはめ込みオプション群でページ上に配置 */ String imageoptlist = "scale=2"; p.fit_image(image, x, y, imageoptlist); /* 同じオプションリストを用いて、画像からパスオブジェクトを作成 */ path = (int) p.info_image(image, "clippingpath", imageoptlist); if (path == -1) throw new Exception("エラー : クリッピングパスが見つかりません!"); result = p.fit_textflow(tf, llx1, lly1, urx1, ury1, "wrap={paths={{path=" + path + " refpoint={" + x + " " + y + "} }}}"); p.delete_path(path); 8.2 複数行のテキス ト フ ロー 239 図 8.28 重な り 合 う 輪郭へ流 し 込む 50% 100% 図 8.27 ひ し 形へテキス ト を流 し 込む 10% 50% Our paper planes are the ideal way of passing the time. We offer a lot of revolutionary brandnew developments of the traditional common paper planes. If your lesson, conference, or lecture turn out to be deadly boring, you can have a wonderful time with our planes. Our paper planes are the ideal way of passing the time. We offer revolutionary new developments of the traditional common paper planes. If your lesson, conference, or lecture turn out to be deadly boring, you can have a wonderful time with our planes. All our models are folded from one paper sheet. 90% 50% 50% 0% PDF_fit_textflow( ) を複数回呼び出 し て同一の wrap オプシ ョ ン を与え る こ と も で き ます。 こ れは多段組等、配置 さ れた画像が複数のテ キ ス ト フ ロ ーはめ込み枠に重な っ てい る と き に有用です。 非長方形形状に テキス ト を回 り 込ませる パ ス オブジ ェ ク ト を回 り こ み輪郭 と し て作成 す る のではな く 、 パ ス要素群を直接 Textflow オプシ ョ ン群で指定す る こ と も で き ます。 テ キ ス ト は、範囲枠で指定 さ れ る 長方形を回 り 込ませ る だけでな く 、任意のグ ラ フ ィ ッ ク 要素を回 り 込み輪郭 と し て定義す る こ と も で き ます。た と えば以下のオプシ ョ ン リ ス ト は、 三角形の ま わ り にテ キ ス ト を回 り 込ませます (図 8.26 参照) : wrap={ polygons={ {50% 80% 20% 30% 80% 30% 50% 80%} } } なお、 showborder=true オプシ ョ ン を使っ て輪郭を図示 し て あ り ます。 wrap オプシ ョ ンは 複数の輪郭を持つ こ と も で き ます。 以下のオプシ ョ ン リ ス ト は、 2 つの三角形の ま わ り に テ キ ス ト を回 り 込ませます : wrap={ polygons={ {50% 80% {20% 90% 20% 30% 10% 70% 80% 30% 30% 70% 50% 80%} 20% 90%} } } パーセ ン ト 値 (はめ込み枠内におけ る 相対座標) のかわ り に、 ページ上の絶対座標を使 う こ と も で き ます。 注 横で も 縦で も ない向きの線分を持つ輪郭を使 う と きは、 fixedleading=true に設定する こ と を推奨 し ます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の text_output/wrap_text_around_polygons ト ピ ッ ク にあ り ます。 非長方形の輪郭へ流 し 込む 回 り 込み機能を使えば、 任意の輪郭の領域の中にテ キ ス ト フ ロ ーを配置す る こ と も で き ます。 こ れを実現す る には、 wrap オプシ ョ ン で addfitbox ま たは inversefill サブオプシ ョ ン を使い ます。 テ キ ス ト は指定 さ れた輪郭の ま わ り に回 り 込 むのではな く 、 1 個ない し 複数の輪郭の中にテ キ ス ト が配置 さ れます。 以下のオプシ ョ ン リ ス ト を使えば、 ひ し 形の中へテ キ ス ト を流 し 込む¥ こ と がで き ます。 こ こ で座標は、 は め込み枠の長方形に対す る パーセ ン ト 値 と し て与え てい ます (図 8.27 参照) : wrap={ addfitbox polygons={ {50% 100% 240 第 8 章 : テキス ト と 表の組版 10% 50% 50% 0% 90% 50% 50% 100%} } } なお、 こ こ で も showborder=true オ プ シ ョ ン を 使 っ て輪郭 を 図示 し て あ り ま す。 も し addfitbox オプシ ョ ン をつけなければ、 ひ し 形は空の ま ま、 その ま わ り にテ キ ス ト が回 り 込む こ と にな り ます。 重な り 合 う 輪郭へ流 し 込む 次の例 と し て、 重な り 合 う 2 つの多角形か ら 成 る輪郭へ流 し 込みを行な っ てみま し ょ う 。 た と えば六角形の中に四角形が入っ た輪郭です。 addfitbox オプシ ョ ン を使えば、 はめ込み枠自体は流 し 込みの範囲か ら 除外 さ れ、 その後の リ ス ト の 中の多角形は、 重な り 合っ てい る 領域を除いて流 し 込みが行われます (図 8.28 参照) : wrap={ addfitbox polygons= { {20% 10% 80% 10% {35% 35% 65% 35% 100% 50% 65% 65% 80% 90% 35% 65% 20% 90% 0% 50% 35% 35%} } } 20% 10%} も し addfitbox オプシ ョ ン をつけなければ、 こ れ と 反対の効果を得ます : さ っ き流 し 込ま れた領域は空の ま ま と な り 、 さ っ き 空だっ た領域へテ キ ス ト が流 し 込まれ る こ と にな り ま す。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/fill_polygons_with_text ト ピ ッ ク に あ り ます。 8.2 複数行のテキス ト フ ロー 241 8.3 表の組版 表組版機能を使 う と 、 複雑な表を自動組版す る こ と がで き ます。 表のセルには、 一行か複 数行のテ キ ス ト か、 画像か、 SVG グ ラ フ ィ ッ ク か、 PDF ページ を入れ る こ と がで き ます。 表は 1 個のはめ込み枠に収ま ら な く て も よ く 、 複数のページにわた る こ と が可能です。 ク ッ ク ブ ッ ク 表の諸側面に関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ ク の tables カ テ ゴ リ にあ り ます。 表の一般的特徴 表組版機能の説明は、以下の概念 と 用語に も と づ き ます(図 8.29 参照): > 表は、 長方形の輪郭を持つ仮想のオブジ ェ ク ト です。 横方向の表行 と 縦方向の列でで き てい ます。 > 単純セルは、 表内の長方形の領域であ り 、 表行 と 列の交差 と し て定義 さ れ ます。 連結 セルは、 複数の列か複数の表行、 ない し 両方にわた っ てい ます。 セル と い う 用語を用 い る と き は、 単純セル と 連結セルの両方を指す も の と し ます。 > 表は、1 つのはめ込み枠に収ま り き る こ と も あ り ます し 、複数のはめ込み枠が必要にな る こ と も あ り ます。1 つのはめ込み枠に配置 さ れた表行群は、表イ ン ス タ ン ス を構成 し ます。 PDF_fit_table( ) は、 1 回呼び出 さ れ る ご と に、 1 つのはめ込み枠に 1 つの表 イ ン ス タ ン ス を配置 し ます (252 ページ 「8.3.5 表 イ ン ス タ ン ス」 参照)。 > ヘ ッ ダ と フ ッ タ は、表の最初か最後にあ る 1 個ない し 複数の表行のかた ま り であ り 、す べての表 イ ン ス タ ン ス の上端か下端に繰 り 返 し 現れ ます。 ヘ ッ ダに も フ ッ タ に も 属 さ ない表行は本体表行 と 呼びます。 > オプシ ョ ナルな キ ャ プシ ョ ン (図 8.29 では示 さ れてい ません) は、 表の説明を配置す る ために使え る 追加の要素です。 こ れは表の任意の辺に配置す る こ と がで き ます。 ヘッダ Our Paper Plane Models 3 列連結セル 1 Giant Wing 単純セル Material Benefit Offset print paper 220g/sqm It is amazingly robust and can even do aerobatics. But it is best suited to gliding. Amazingly robust! 2 Long Distance Glider セルにテキ ス ト フ ロー Material Drawing paper 180g/sqm Benefit With this paper rocket you can send all your messages even when sitting in the cinema pretty near the back. セルに画像 と テキス ト 行 3 行連結セル 3 Cone Head Rocket Material Kent paper 200g/sqm Benefit This paper arrow can be thrown with big swing. It stays in the air a long time. フッタ With big swing! 図 8.29 表の例 例 と し て、 図 8.29 の表を作成す る すべての側面を説明 し てい き ます。 表組版オプシ ョ ン の完全な説明については PDFlib リ フ ァ レ ン ス を参照 し て く だ さ い。表の作成は まず、各表 セルの内容 と 視覚的プ ロ パテ ィ を PDF_add_table_cell( ) で定義 し てい く こ と か ら 始ま り ま す。 それか ら 、 PDF_fit_table( ) を 1 回ない し 複数回呼び出 し て、 その表を配置 し ます。 242 第 8 章 : テキス ト と 表の組版 表を配置す る 際には、 そのはめ込み枠の大 き さ と 、 その表行や列の罫線 と 塗 り 分け を 指定す る こ と も で き ます。 セルご と の塗 り 分けな ど の細かい指定には、 範囲枠機能を使っ て く だ さ い (詳 し く は 258 ページ 「8.4 範囲枠」 参照)。 こ の節では、 表セルの定義 と 表のはめ込みに必要な、 も っ と も 重要なオプシ ョ ン のみ を解説 し ます。いずれの例において も 、そのための PDF_add_table_cell( ) と PDF_fit_table( ) への呼び出 し だけ を示 し ま すが、 必要な フ ォ ン ト はすでに読み込 ま れてい る も の と し ま す。 注 表の処理は、 カ レ ン ト 図形ス テー タ スから は独立です。 表セルの定義は文書ス コ ープ で も で き ますが、実際に表を配置するのはページかパターン / テンプレート / グリフス コ ープ で行 う 必要があ り ます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの tables/starter_table ト ピ ッ ク にあ り ます。 表に関す る組版上の問題を分析 セルの数 と 、 表組版オプシ ョ ンに よ っ ては、 PDFlib の 表組版機能の結果が、 自分の期待 と は一致 し ない こ と があ り ます。 ほ と ん ど の場合におい て、 こ れは適切なオプシ ョ ン に よ っ て矯正で き ま す。 し か し 、 問題の起 き てい る セル群 や、 セルの グループ を、 誤っ た オプシ ョ ン を用い て特定す る のは、 難 し い場合 も あ り ま す。表に関す る 組版上の問題のデバ ッ グ を実施可能にす る ため、PDFlib は、PDF_fit_table( ) に以下のオプシ ョ ン を提供 し てい ます : > オプシ ョ ン showcells は、 各セル内枠の境界を視覚化 し ます。 こ の関数がページ ス コー プで呼ばれ、 かつ PDF/A モー ド が有効でない場合には、 各表セルの中央に、 そのセル 内容に関す る 詳細を持っ た注釈が配置 さ れます。 > オプシ ョ ン debugshow が true の場合には、高すぎ る 、あ る いは幅が広すぎ る 、あ る いは セルが小 さ く な り すぎ る 表に関す る エ ラ ーがすべて抑制 さ れ、 ロ グ記録 さ れ ます。 結 果 と し て作成 さ れ る 表 イ ン ス タ ン ス は、 その表は破損 し てい ますが、 デバ ッ グの助け と し て生成 さ れます。 > オプシ ョ ン showgrid が true の場合には、 すべての列 と 表行の縦 ・ 横境界が描線 さ れま す。 すなわち、 基礎を なす表グ リ ッ ド が視覚化 さ れます。 8.3.1 単純な表を配置 表の概念を さ ら に詳 し く 説明す る 前に、 単純な表作成の例を示 し ます。 表には 6 つのセル があ り 、 3 表行 ・ 2 列に配 さ れてい ます。 4 つのセルにはテ キ ス ト 行があ り 、 1 つのセルに は複数行のテ キ ス ト フ ロ ーがあ り ます。 セルの内容はすべて、 余白を 1 単位 と っ て横方向 に左寄せ、 縦方向に中央揃えにな っ てい ます。 こ の表を作成す る ために、 まずはテ キ ス ト 行セルに対す る オプシ ョ ン リ ス ト を作 る た めに、 その fittextline サブオプシ ョ ン リ ス ト で、 必要なオプシ ョ ン font ・ fontsize と 位置 {left center} を定義 し ま し ょ う 。 さ ら に、 1 単位のセル余白を定義 し ま し ょ う 。 そ し て、 テ キ ス ト 行セルを 1 つずつそれぞれの列 ・ 表行に追加 し 、 その際に中身のテ キ ス ト も 、 PDF_ add_table_cell( ) への呼び出 し に直接与え ます。 次に、 テ キ ス ト フ ロ ーを作成 し 、 そのテ キ ス ト フ ロ ーのハン ド ルを使っ て テ キ ス ト フ ロ ー表セルに対す る オプシ ョ ン リ ス ト を構築 し た後、 そのセルを表に追加 し ま し ょ う 。 最後に、 PDF_fit_table( ) を使っ て表を配置 し 、 その際に、 表の外枠 と セルの各辺を黒 い罫線で視覚化 し ま し ょ う 。 列の幅は一切与え ませんで し たので、 与えたテ キ ス ト 行 と 余 白か ら 自動的に計算 さ れます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの tables/vertical_text_alignment ト ピ ッ ク にあ り ます。 8.3 表の組版 243 以下の コ ー ド 断片は、 こ の単純な表を作成す る 方法を示 し ます。 結果を図 8.30a に示 し ま す。 /* 複数行のテキストフローで表セルに入れるテキスト */ String tf_text = "It is amazingly robust and can even do aerobatics. " + "But it is best suited to gliding."; /* 1列目と2列目の列幅を定義 */ int c1 = 80, c2 = 120; /* 表インスタンスの左下隅と右上隅を定義(はめ込み枠)*/ double llx=100, lly=500, urx=300, ury=600; /* エラー時には抜け出す */ p.set_option("errorpolicy=exception"); /* フォントを読み込む */ font = p.load_font("Helvetica", "unicode", ""); /* 1列目に配置するテキスト行セルに用いるオプションリストを定義 */ optlist = "fittextline={position={left center} font=" + font + " fontsize=8} margin==4" + colwidth=" + c1; /* 列1表行1にテキスト行セルを追加 */ tbl = p.add_table_cell(tbl, 1, 1, "Our Paper Planes", optlist); /* 列1表行2にテキスト行セルを追加 */ tbl = p.add_table_cell(tbl, 1, 2, "Material", optlist); /* 列1表行3にテキスト行セルを追加 */ tbl = p.add_table_cell(tbl, 1, 3, "Benefit", optlist); /* 2列目に配置するテキスト行に用いるオプションリストを定義 */ optlist = "fittextline={position={left center} font=" + font + " fontsize=8} " + "colwidth=" + c2 + " margin=4"; /* 列2表行2にテキスト行セルを追加 */ tbl = p.add_table_cell(tbl, 2, 2, "Offset print paper 220g/sqm", optlist); /* テキストフローを追加 */ optlist = "font=" + font + " fontsize=8 leading=110%"; tf = p.add_textflow(-1, tf_text, optlist); /* 上で取得したハンドルを使ってテキストフローセルに用いるオプションリストを定義 */ optlist = "textflow=" + tf + " margin=4 colwidth=" + c2; /* 列2表行3にテキストフロー表セルを追加 */ tbl = p.add_table_cell(tbl, 2, 3, "", optlist); p.begin_page_ext(0, 0, "width=200 height=100"); /* 表をはめ込むためのオプションリストを表枠とセル罫線つきで定義 */ optlist = "stroke={{line=frame linewidth=0.8} {line=other linewidth=0.3}}"; /* 表インスタンスを配置 */ result = p.fit_table(tbl, llx, lly, urx, ury, optlist); 244 第 8 章 : テキス ト と 表の組版 /* 結果をチェック。「_stop」はすべてOKを意味します */ if (!result.equals("_stop")) { if (result.equals( "_error")) throw new Exception("エラー:" + p.get_errmsg()); else { /* それ以外の戻り値はすべて専用のコードで扱う必要があります */ } } p.end_page_ext(""); /* これは、表内で使われたテキストフローハンドル群も一緒に削除します */ p.delete_table(tbl, ""); セルの内容の縦位置を調整 表セ ルの縦方向中央に さ ま ざ ま な 種類の内容 を 配置す る と 、 それ ら ら は、 その辺か ら の ま ち ま ちの距離に位置付け ら れます。 図 8.30a において、 4 つのテ キ ス ト 行セルは以下のオプシ ョ ン リ ス ト で配置 さ れてい ます : optlist = "fittextline={position={left center} font=" + font + " fontsize=8} colwidth=80 margin=4"; テ キ ス ト フ ロ ーセルは特殊なオプシ ョ ン を一切使わずに追加 さ れてい ます。テ キ ス ト 行を 縦方向中央に配置 し たために、 Benefit の行がテ キ ス ト フ ロ ーの分だけ下へずれます。 図 8.30 テキス ト 行 と テキス ト フ ローを表セル内で整列 さ せる 生成 さ れる出力 Our Paper Planes Material Offset print paper 220g/sqm Benefit It is amazingly robust and can even do aerobatics. But it is best suited to gliding. a) Our Paper Planes b) Material Offset print paper 220g/sqm Benefit It is amazingly robust and can even do aerobatics. But it is best suited to gliding. 図 8.30b に示 し た よ う に、 セルの辺か ら セルの中身ま での縦間隔は、 それがテ キ ス ト フ ロ ーであ る かテ キ ス ト 行であ る かにかかわ ら ず、 すべて同 じ に し たい も のです。 こ れを実 現す る ために、 まずテ キ ス ト 行のためのオプシ ョ ン リ ス ト を用意 し ま し ょ う 。 表行の高 さ を固定値 14 ポ イ ン ト 、テ キ ス ト 行の位置を左上で余白 4 ポ イ ン ト と し て定義 し ま し ょ う 。 さ き に与えたオプシ ョ ン fontsize=8 は、 文字の高 さ を正確には表 し てお ら ず、 上下に い く ら かあ き がで き てい ます。 で も 、 大文字の高 さ はフ ォ ン ト の capheight 値で正確に表 さ れます。 ですので、 fontsize={capheight=6} を用いれば、 文字サ イ ズが結果的にほぼ 8 ポ イ ン ト にな り 、 ま た (margin=4 と あわせて) 高 さ の合計が 14 ポ イ ン ト と な っ て rowheight オプ シ ョ ン と 照応 し ま す。 ですので全体 と し ては、 テ キ ス ト 行セルに対す る PDF_add_ table_cell( ) のオプシ ョ ン リ ス ト は次の よ う に し ま し ょ う : 8.3 表の組版 245 /* テキスト行セルに用いるオプションリスト */ optlist = "fittextline={position={left top} font=" + font + " fontsize={capheight=6}} rowheight=14 colwidth=80 margin=4"; テ キ ス ト フ ロ ーの追加にあ た っ ては、 上記のテ キ ス ト 行同様、 fontsize={capheight=6} を 用いれば、 文字サ イ ズが結果的にほぼ 8 ポ イ ン ト にな り 、 ま た (margin=4 と あわせて) 高 さ の合計が 14 ポ イ ン ト と な り ます : /* テキストフローの追加に用いるオプションリスト */ optlist = "font=" + font + " fontsize={capheight=6} leading=110%"; さ ら に、 テ キ ス ト Benefit のベース ラ イ ンは、 テ キ ス ト フ ロ ーの 1 行目に整列 さ せたい も のです。 と 同時に、 テ キ ス ト Benefit のセル上端か ら の間隔は、 テ キ ス ト Material と 同 じ にな る べ き です。 上端に余白を生 じ さ せないために、 テ キ ス ト フ ロ ーセルの追加にあ た っ ては fittextflow={firstlinedist=capheight} を用い ま し ょ う 。 そ し てテ キ ス ト 行 と 同 じ く 、 余 白 4 ポ イ ン ト を追加 し ま し ょ う 。 /* テキストフローセルの追加に用いるオプションリスト */ optlist = "textflow=" + tf + " fittextflow={firstlinedist=capheight} " "colwidth=120 margin=4"; ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の tables/vertical_text_alignment ト ピ ッ ク にあ り ます。 8.3.2 表セルの さ ま ざ ま な内容 PDF_add_table_cell( ) で表にセルを追加す る と き は、 さ ま ざ ま な種類のセル内容を指定す る こ と がで き ます。 表セルは、 同時に複数の種類の内容を含む こ と も で き ます。 罫線 ・ 塗 り の追加 も 可能なほか、 範囲枠を使っ て表セル内に追加の内容を配置す る こ と も で き ま す。 た と えば紙飛行機の表には、 図 8.31 に示す要素があ り ます。 ࠹ࠠࠬ࠻ⴕ ࠹ࠠࠬ࠻ⴕ ࠹ࠠࠬ࠻ⴕ ࠹ࠠࠬ࠻ⴕ ࠹ࠠࠬ࠻ⴕ ࠹ࠠࠬ࠻ࡈࡠ .................... .............................................. .............................................. ࠹ࠠࠬ࠻ⴕ 図 8.31 表セルの さ ま ざ ま な内容 テキス ト 行に よ る一行テキス ト テ キ ス ト は、 PDF_add_table_cell( ) の text 引数で与え ま す。 fittextline オプシ ョ ンで、 PDF_fit_textline( ) の組版オプシ ョ ンのすべて を与え る こ と がで き ます。 デフ ォ ル ト のはめ込み方式は fitmethod=nofit です。 テ キ ス ト がセルに収ま り き ら ない と き は、 セルが大 き く な り ま す。 こ れを避け る には、 fitmethod=auto を使え ば、 shrinklimit オプシ ョ ン の範囲内でテ キ ス ト が縮 ま り ま す。 表行の高 さ が指定 さ れな かっ た場合は、 組版機能はテ キ ス ト サ イ ズの 2 倍を表セルの高 さ と し ます ( よ り 正確にい う と : boxheight の 2 倍。 こ れは、 別途指定 さ れない限 り デフ ォ ル ト 値 {capheight none} を持ち ます)。 テ キ ス ト が回転 さ せて あ る と き の表行の幅について も 同 じ です。 246 第 8 章 : テキス ト と 表の組版 テキス ト フ ロ ーに よ る複数行テキス ト テ キ ス ト フ ロ ーは、 表関数の外で用意 し ておい て、 PDF_add_table_cell( ) を呼び出す前に PDF_create_textflow( ) か PDF_add_textflow( ) で 作成 し てお く 必要があ り ます。 そのテ キ ス ト フ ロ ーのハン ド ルは、 textflow オプシ ョ ンで 与え ます。 fittextflow オプシ ョ ンで、 PDF_fit_textflow( ) の組版オプシ ョ ンのすべて を与え る こ と がで き ます。 デフ ォ ル ト のはめ込み方式は fitmethod=clip です。 こ れはすなわち : まず、 テ キ ス ト がセルに収ま り き る か ど う かが試 さ れます。 セルの大 き さ が充分でない と き は、 その高 さ が増や さ れ ます。 それで も テ キ ス ト が収ま り き ら ない場合は、 末尾が切 り 落 と さ れ ます。 こ れを避け る には、 fitmethod=auto を使えば、 minfontsize オプシ ョ ンの範囲内でテ キ ス ト が縮ま り ます。 セルが狭すぎ る と き は、1 つの単語を好ま し く ない箇所で分割 さ せ る よ う 、 テ キ ス ト フ ロ ーに強制す る こ と も で き ます。 checkwordsplitting オプシ ョ ンが true の場合は、 単語が 分割 さ れな く な る ま でセル幅が拡が り ます。 画像 と テ ン プ レ ー ト 画像は、PDF_add_table_cell( ) を呼び出す前に PDF_load_image( ) で 読み込んでお く 必要があ り ます。 テ ンプ レー ト は、 PDF_begin_template_ext( ) で作成す る 必要があ り ます。 その画像ま たはテ ンプ レー ト のハン ド ルは、 image オプシ ョ ンで与え ま す。fitimage オプシ ョ ンで、PDF_fit_image( ) の組版オプシ ョ ンのすべて を与え る こ と がで き ます。 デフ ォ ル ト のはめ込み方式は fitmethod=meet です。 すなわち画像 / テ ンプ レー ト が、 縦横比を変え ない ま ま、 セル内に収ま り き る よ う 配置 さ れ ます。 セルの大 き さ が、 画像 / テ ンプ レー ト の大 き さ に し たがっ て変わ る こ と はあ り ません。 ベ ク ト ルグ ラ フ ィ ッ ク グ ラ フ ィ ッ ク は、PDF_add_table_cell( ) を呼び出す前に PDF_load_ graphics( ) で読み込んでお く 必要があ り ま す。 そのグ ラ フ ィ ッ ク のハン ド ルは、 graphics オプシ ョ ンで与え ます。 fitgraphics オプシ ョ ンで、 PDF_fit_graphics( ) の組版オプシ ョ ンの すべて を与え る こ と がで き ます。 デフ ォ ル ト のはめ込み方式は fitmethod=meet です。 す なわち グ ラ フ ィ ッ ク が、 縦横比を変え ない ま ま、 セル内に収ま り き る よ う 配置 さ れ ます。 セルの大 き さ が、 グ ラ フ ィ ッ ク の大 き さ に し たがっ て変わ る こ と はあ り ません。 取 り 込み PDF 文書のページ PDI ページは、 PDF_add_table_cell( ) を呼び出す前に PDF_ open_pdi_page( ) で開いてお く 必要があ り ます。その PDI ページのハン ド ルは、pdipage オ プシ ョ ンで与え ます。fitpdipage オプシ ョ ン で、PDF_fit_pdi_page( ) の組版オプシ ョ ンのす べて を与え る こ と がで き ます。 デフ ォ ル ト のはめ込み方式は fitmethod=meet です。 すな わち PDI ページが、 縦横比を変え ない ま ま、 セル内に収ま り き る よ う 配置 さ れます。 セル の大 き さ が、 PDI ページの大 き さ に し たがっ て変わ る こ と はあ り ません。 パスオ ブ ジ ェ ク ト パ ス オブジ ェ ク ト は、PDF_add_table_cell( ) を呼び出す前に PDF_add_ path_point( ) で作成 さ れてい る 必要があ り ます。 そのパ スハン ド ルは path オプシ ョ ンで 与え ら れます。 fitpath オプシ ョ ンでは、 PDF_draw_path( ) のすべての組版オプシ ョ ン を指 定可能です。 パ ス の外接枠が表セル内に配置 さ れます。 セル内枠の左下隅が、 パ ス を配置 す る ための参照点 と し て用い ら れます。 注釈 表セル内の注釈は、 PDF_create_annotation( ) の type 引数 (ただ し こ の関数を呼び 出す必要はあ り ません) に照応す る PDF_add_table_cell( ) の annotationtype オプシ ョ ンで 作成す る こ と がで き ます。 fitannotation オプシ ョ ンでは、 PDF_create_annotation( ) のすべ てのオプシ ョ ン を指定可能です。 セル枠が注釈長方形 と し て用い ら れます。 8.3 表の組版 247 フ ォ ーム フ ィ ール ド 表セル内の フ ォ ーム フ ィ ール ド は、 PDF_create_field( ) の name ・ type 引数 (ただ し こ の関数を呼び出す必要はあ り ません) に照応す る PDF_add_table_cell( ) の fieldname ・ fieldtype オプシ ョ ンで作成す る こ と がで き ます。 fitfield オプシ ョ ンでは、 PDF_create_field( ) のすべてのオプシ ョ ン を指定可能です。セル枠が フ ィ ール ド 長方形 と し て用い ら れます。 セル内枠内で セル内容を位置付け デ フ ォ ル ト では、 セル内容はセル枠に合わせて位置 付け ら れます。 PDF_add_table_cell( ) で margin オプシ ョ ン を使えば、 セルの端 と の間に間 隔を指定す る こ と がで き ます。 その結果で き る長方形を、 セル内枠 と 呼びます。 余白が 1 つで も 定義 さ れていれば、 セル内容はセル内枠に合わせて配置 さ れます (図 8.32 参照)。 余白が 1 つ も 定義 さ れていない と き は、 セル内枠はセル枠 と 同 じ です。 こ れ と あわせて、 セルの内容は、 内容依存のはめ込みオプシ ョ ン で与え たオプシ ョ ン に も 従 う こ と があ り ます。 249 ページ 「8.3.4 さ ま ざ ま な種類の内容を持っ た表」 で説明 し ます。 ⊕ ࡞ౝᨒ Ꮐ⊕ ฝ⊕ 図 8.32 内容を セル内枠に はめ込み ࡞ᨒ ਅ⊕ 8.3.3 表 と 列の幅 セルを表に追加す る 際には、 そのセルが ま たが る 列か表行、 ま たは両方の数を、 colspan ・ rowspan オプシ ョ ン で定義 し ます。 デフ ォ ル ト ではセルの列は 1 つ、 表行 も 1 つです。 表 の列 と 表行の総数は、 セルを追加す る ご と に、 それぞれの値だけ自動的に加算 さ れ ます。 図 8.33 に、 3 列 ・ 4 表行の表の例を示 し ます。 1 1 1 2 1 3 1 4 㧟ߟߩ ............ ߦ ............ ࠊߚࠆ ............ ࡞ ⴕ1 㧞ߟߩ ...... ߦ ...... ࠊߚࠆ ...... ࡞ ⴕ2 ⴕ3 ⴕ4 3 2 න⚐࡞ 2 3 㧟ߟߩ .... න⚐࡞ .... ⴕߦ .... න⚐࡞ න⚐࡞ .... ࠊߚࠆ࡞ 1 2 図 8.33 単純セル と 、 複数の表行や 列を連結 し たセル 2 4 3 さ ら に、 colwidth オプシ ョ ン を使っ て、 セルが ま たが る 最初の列の幅を明示的に与え る こ と も で き ます。 各セルご と に、 その最初の列の幅を決めて与え る と 、 それ ら の幅の値はす 248 第 8 章 : テキス ト と 表の組版 べて、 表全体の幅に自動的に加算 さ れてい き ます。 図 8.34 に例を示 し ます。 1 1 1 2 1 3 1 4 colspan=3 colwidth=50 colspan=2 colwidth=50 colspan=1 colwidth=50 図 8.34 列幅を足 し 合わせる と 表全体の幅に 3 2 2 3 rowspan=3 colwidth=90 colspan=1 colwidth=100 2 4 colspan=1 colwidth=50 colspan=1 colwidth=100 50 100 90 ߩో 240 ま たは適当で あれば、 列幅を パーセ ン ト 値で指定す る こ と も で き ま す。 その場合 こ の値 は、 表のはめ込み枠の幅に対す る 割合にな り ま す。 パーセ ン ト 値に よ る 指定を行 う 場合 は、 すべての列に対 し て行 う 必要があ り ます。 でなければ一切 し てはいけ ません。 PDF_add_table_cell( ) の colscalegroup オプシ ョ ン を使っ て、 い く つかの列を列伸縮グ ループ と し て ま と めて あ る 場合、 それ ら の幅は、 グループ内で も っ と も 幅の広い列 と 同 じ にな り ます (図 8.35 参照)。 Max. Load Range Weight Speed ᄢ❗ዊࠣ࡞ࡊ Giant Wing 12g 18m 14g 8m/s Long Distance Glider 5g 30m 11.2g 5m/s Cone Head Rocket 7g 7m 12.4g 6m/s 図 8.35 1 番目の表行の右 4 セルは、 同 じ 列伸縮 グループに属 し ているので、 同 じ 幅にな り ます。 絶対座標が使われてい る 場合 (パーセ ン ト 値でな く ) 、 列幅を定義 さ れていないセルがあ る と き は、 その未決定の幅は以下の よ う に し て算定 さ れます : まず、 テ キ ス ト 行を含む各 セルについて、 列幅かテ キ ス ト の幅 (回転 さ れてい る テ キ ス ト の場合はテ キ ス ト の高 さ ) に も と づいて、 実際の幅が算出 さ れます。 それか ら 、 残 り の表幅が、 ま だ決定 し ていない 列幅に均等に分配 さ れます。 8.3.4 さ ま ざ ま な種類の内容を持 っ た表 以下のい く つかの項では、 図 8.36 に示す よ う な、 さ ま ざ ま な種類の内容を持っ た表の例 を、 一歩ずつ作成 し てい き ま し ょ う 。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの tables/mixed_table_contents ト ピ ッ ク にあ り ま す。 前準備 と し て、 2 つの フ ォ ン ト を読み込む必要があ り ます。 表のはめ込み枠の大 き さ を、 その左下隅 と 右上隅の座標に よ っ て定義 し 、 3 つの表列の幅を指定 し ま し ょ う 。 そ し て、 新規ページ を A4 サ イ ズで開始 し ま し ょ う : double llx = 100, lly = 500, urx = 360, ury = 600; // 表の座標 int c1 = 50, c2 = 120, c3 = 90; // 3つの表列の幅 8.3 表の組版 249 boldfont = p.load_font("Helvetica-Bold", "unicode", ""); normalfont = p.load_font("Helvetica", "unicode", ""); p.begin_page_ext(0, 0, "width=a4.width height=a4.height"); 手順 1 : 最初のセルを追加 まずは、表の最初のセルか ら 始め ま し ょ う 。 こ のセルは 1 行 目の 1 列目に配置 し 、 3 つの列にわた ら せます。 1 列目の幅は 50 ポ イ ン ト です。 テ キ ス ト 行は縦横の中央に置 き 、 すべての端で余白を 4 ポ イ ン ト と り ます。 以下の コー ド 断片は、 最初のセルを追加す る 方法を示 し ます : optlist = "fittextline={font=" + boldfont + " fontsize=12 position=center} " + "margin=4 colspan=3 colwidth=" + c1; tbl = p.add_table_cell(tbl, 1, 1, "Our Paper Plane Models", optlist); 手順 2 : 2 列に ま たがる セルを追加 次の手順 と し て、 テ キ ス ト 行 「1 Giant Wing」 を持 つセルを追加 し ま し ょ う 。 こ れは 2 行目の 1 列目に配置 し 、 2 つの列にわた ら せます。 1 列目の幅は 50 ポ イ ン ト です。 行の高 さ は 14 ポ イ ン ト です。 テ キ ス ト 行は左上に位置付 け、 すべての端で余白を 4 ポ イ ン ト と り ます。 245 ページ 「セルの内容の縦位置を調整」 で述べたの と 同様に、fontsize={capheight=6} を用いて、 テ キ ス ト の縦揃え を統一 し ま し ょ う。 こ の見出 し 「Giant Wing」 のセルは、 行全体でな く 3 列中 2 列 し か連結 し ないので、 行 ベース の塗 り 分けオプシ ョ ンでは色がつけ ら れません。 かわ り に範囲枠機能を使っ て、 セ ルが覆 う 長方形を灰色の背景色で塗 り ま し ょ う 。範囲枠機能について詳 し く は 258 ページ 「8.4 範囲枠」 で説明 し てい ます。 以下の コ ー ド 断片は、 見出 し 「Giant Wing」 のセルを追 加する 方法を示 し ます : optlist = "fittextline={position={left top} font=" + boldfont + " fontsize={capheight=6}} rowheight=14 colwidth=" + c1 + " margin=4 colspan=2 matchbox={fillcolor={gray .92}}"; tbl = p.add_table_cell(tbl, 1, 2, "1 Giant Wing", optlist); 図 8.36 さ ま ざ ま な内容の表セルを一歩ずつ追加 生成 さ れる表 生成手順 Our Paper Plane Models 手順 2 : 2 列にまたがる セルを追加 1 Giant Wing Material Offset print paper 220g/sqm Benefit It is amazingly robust and can even do aerobatics. But it is best suited to gliding. 手順 1 : 3 列にまたがる セルを追加 手順 3 : さ ら にテキス ト 行セル 3 つ追加 Amazingly robust! 手順 4 : テキス ト フ ローセル追加 手順 5 : テキス ト 行付き画像セル追加 手順 6 : 表をはめ込む 手順 3 : さ ら に 3 つのテキス ト 行セルを追加 以 下 の コ ー ド 断 片 は、 「Material」 ・ 「Benefit」 ・ 「Offset print paper」 … のセルを追加 し ます。 「Offset print paper」 … のセルは 2 列目で始ま る ので、 同時に 120 ポ イ ン ト の列幅を定義 し ます。 セルの内容は左上に位置 付け、 すべての端で余白を 4 ポ イ ン ト と り ます。 optlist = "fittextline={position={left top} font=" + normalfont + " fontsize={capheight=6}} rowheight=14 colwidth=" + c1 + " margin=4"; 250 第 8 章 : テキス ト と 表の組版 tbl = p.add_table_cell(tbl, 1, 3, "Material", optlist); tbl = p.add_table_cell(tbl, 1, 4, "Benefit", optlist); optlist = "fittextline={position={left top} font=" + normalfont + " fontsize={capheight=6}} rowheight=14 colwidth=" + c2 + " margin=4"; tbl = p.add_table_cell(tbl, 2, 3, "Offset print paper 220g/sqm", optlist); 手順 4 : テキス ト フ ロ ーセルを追加 以下の コ ー ド 断片は、 「It is amazingly」 … のテ キ ス ト フ ロ ーセルを追加 し ます。 テ キ ス ト フ ロ ーの入っ た表セルを追加する には、 まずテ キ ス ト フ ロ ーを作成 し ま し ょ う 。 上記のテ キ ス ト 行同様、 fontsize={capheight=6} を用いれ ば、 文字サ イ ズが結果的にほぼ 8 ポ イ ン ト にな り 、 ま た (margin=4 と あわせて) 高 さ の 合計が 14 ポ イ ン ト と な り ます。 tftext = "It is amazingly robust and can even do aerobatics. " + "But it is best suited to gliding."; optlist = "font=" + normalfont + " fontsize={capheight=6} leading=110%"; tf = p.add_textflow(-1, tftext, optlist); 取得 し た テ キ ス ト フ ロ ーハン ド ルは、 表セルを追加する 時に使い ます。 テ キ ス ト フ ロ ーの 1 行目は、 テ キ ス ト 行 「Benefit」 のベース ラ イ ン と 揃っ てい る べき です。 と 同時に、 テ キ ス ト 「Benefit」 は、 そのセル上端か ら の間隔がテ キ ス ト 「Material」 と 同 じ にな る べ き で す。 テ キ ス ト フ ロ ー を 追 加 す る 際 は、 上 に 余 白 が 生 じ な い よ う 、 fittextflow={firstlinedist=capheight} を用い ます。 そ し てテ キ ス ト 行 と 同 じ く 、 余白を 4 ポ イ ン ト 加え ます : optlist = "textflow=" + tf + " fittextflow={firstlinedist=capheight} " + "colwidth=" + c2 + " margin=4"; tbl = p.add_table_cell(tbl, 2, 4, "", optlist); 手順 5 : テキス ト 行の入 っ た画像セルを追加 5 番目の手順 と し て、Giant Wing 紙飛行機 の画像 と テ キ ス ト 行 「Amazingly robust!」 の入っ たセルを追加 し ま し ょ う 。 こ のセルは 2 行目の 3 列目で始ま り 、 3 つの行に ま たが り ます。 列幅は 90 ポ イ ン ト です。 セルの余白 は 4 ポ イ ン ト に設定 し ます。1 つ目の例 と し ては TIFF 画像を セル内に配置 し てみま し ょ う : image = p.load_image("auto", "kraxi_logo.tif", ""); optlist = "fittextline={font=" + boldfont + " fontsize=8} image=" + image + " colwidth=" + c3 + " rowspan=3 margin=4"; tbl = p.add_table_cell(tbl, 3, 2, "Amazingly robust!", optlist); あ る いは、 画像は PDF ページ と し て取 り 込む こ と も で き ます。 PDI ページ を閉 じ る のは必 ず、 PDF_fit_table( ) を呼び出 し た後に し て く だ さ い : int doc = p.open_pdi("kraxi_logo.pdf", "", 0); page = p.open_pdi_page(doc, pageno, ""); optlist = "fittextline={font=" + boldfont + " fontsize=9} pdipage=" + page + " colwidth=" + c3 + " rrowspan=3 margin=4"; 8.3 表の組版 251 tbl = p.add_table_cell(tbl, 3, 2, "Amazingly robust!", optlist); 手順 6 : 表をはめ込む 最後 の 手順 と し て、 表 を PDF_fit_table( ) で 配置 し ま し ょ う 。 header=1 を用い る と 、 1 行目が表のヘ ッ ダにな り ます。 fill オプシ ョ ン と area=header ・ fillcolor={rgb 0.8 0.8 0.87} サブオプシ ョ ンは、 与え た色でヘ ッ ダ行を塗 る よ う 指定 し てい ます。 stroke オプシ ョ ン と line=frame linewidth=0.8 サブオプシ ョ ン を用いて、 表の外枠の 線幅を 0.8 と し て定義 し ま し ょ う 。 line=other linewidth=0.3 を用い る と 、 すべてのセルの 罫が線幅 0.3 と し て指定 さ れます : optlist = "header=1 fill={{area=header fillcolor={rgb 0.8 0.8 0.87}}} " + "stroke={{line=frame linewidth=0.8} {line=other linewidth=0.3}}"; result = p.fit_table(tbl, llx, lly, urx, ury, optlist); if (result.equals("_error")) throw new Exception("エラー:" + p.get_errmsg()); p.end_page_ext(""); 8.3.5 表 イ ン ス タ ン ス 1 つのはめ込み枠に配置 さ れた表行群は、 表 イ ン ス タ ン ス を構成 し ます。 表全体を表現す る には、 複数の表 イ ン ス タ ン ス が必要な こ と も あ り ます。 PDF_fit_table( ) は、 1 回呼び出 さ れ る ご と に、 1 つのはめ込み枠に 1 つの表 イ ン ス タ ン ス を配置 し ます。 こ れ ら のはめ込 み枠は、 同 じ ページに多段組レ イ ア ウ ト 等で配置 し てお く こ と も 、 ま たは複数のページに 配置 し てお く こ と も で き ます。 図 8.37 の表は、 3 つのページにわた っ てい ます。 各ページに 1 つずつあ る はめ込み枠 に、 各表 イ ン ス タ ン ス が 1 つずつ配置 さ れます。 PDF_fit_table( ) を呼び出すたびに、 最初 の行はヘ ッ ダ と し て定義 さ れ、 最後の行はフ ッ タ と し て定義 さ れます。 図 8.37 表は複数の表イ ン ス タ ン スに分解 さ れ、 各は め込み枠に 1 つずつ配 置 さ れます。 Our Paper Plane Models 3 Cone Head Rocket Material BenefitOur Kent paper 200g/sqm Paper Plane Models This paper arrow can be With big swing! thrown with big swing. It 2 Long Distance Glider stays in the air a long time. Drawing paper 180g/sqm Material ࠗࡦࠬ࠲ࡦࠬ ࡋ࠶࠳ ⴕㅪേ ࠣ࡞ࡊ Models With this Plane paper rocket you Benefit Our Paper can send all your messages even when sitting in the Material Offset print paper pretty 220g/sqm cinema near the back. Amazingly robust! Benefit It is amazingly robust and can even do aerobatics. But it is best suited to gliding. 1 Giant Wing ࡍࠫ3 ࡈ࠶࠲ ࡍࠫ2 ߩߪㄟߺᨒ ࡍࠫ1 252 第 8 章 : テキス ト と 表の組版 以下の コ ー ド 断片は、 表を配置 し き る ま で表 イ ン ス タ ン ス をはめ込みつづけ る ための、 一 般的なループ を示 し ます。 配置す る べ き 表 イ ン ス タ ン ス があ る 限 り 、 そのつど新規ページ を作成 し ます。 do { /* 新規ページを作成 */ p.begin_page_ext(0, 0, "width=a4.width height=a4.height"); /* 最初の行をヘッダとして使い、すべての表セルに線をひく */ optlist = "header=1 stroke={{line=other}}"; /* 表インスタンスを配置 */ result = p.fit_table(tbl, llx, lly, urx, ury, optlist); if (result.equals("_error")) throw new Exception("エラー:" + p.get_errmsg()); p.end_page_ext(""); } while (result.equals("_boxfull")); /* 結果をチェック。「_stop」はすべてOKを意味します */ if (!result.equals("_stop")) { if (result.equals( "_error")) throw new Exception("エラー:" + p.get_errmsg()); else { /* これ以外の戻り値はすべて「return」オプションによるユーザー終了。 * これを扱うには専用のコードが必要です。*/ throw new Exception ("テキストフロー内でユーザーリターンを検出しました"); } } /* 表内で使ったテキストフローハンドルも削除されます */ p.delete_table(tbl, ""); ヘ ッ ダ ・ フ ッ タ PDF_fit_table( ) で header ・ footer オプシ ョ ン を使えば、 表の最初か最後 の行の数を定義 し て、それが各表 イ ン ス タ ン ス の上端か下端に配置 さ れ る よ う にす る こ と がで き ます。 fill オプシ ョ ンで area=header か area=footer を使 う と 、 ヘ ッ ダ ・ フ ッ タ を別 の色で塗 る こ と がで き ます。 ヘ ッ ダ行群は表定義の最初の n 行か ら 成 り 、 フ ッ タ 行群は最 後の m 行か ら 成っ てい ます。 ヘ ッ ダ と フ ッ タ は、 PDF_fit_table( ) で表 イ ン ス タ ン ス ご と に指定 し ます。 結果 と し て、 表 イ ン ス タ ン ス ご と に異な る も のに も な り え ます:ヘ ッ ダ / フ ッ タ をつけた表 イ ン ス タ ン ス と 省いた表 イ ン ス タ ン ス を混在 さ せ る 、 と い っ た こ と も 可能です。 それに よ り た と え ば、 最後の表 イ ン ス タ ン ス で特別な行を指定す る 、 と いっ た こ と も 可能にな り ます。 表行の連動 い く つ か の 表 行 を 必 ず 同 じ 表 イ ン ス タ ン ス に 入 れ さ せ た い と き は、 rowjoingroup オプシ ョ ン を使っ て、それ ら を同 じ 表行連動グループに割 り 当て る こ と がで き ます。 表行連動グループは、 連続す る 複数の表行を持ち ます。 こ のグループの表行はす べて、 複数の表 イ ン ス タ ン ス に別れ さ せ ら れ る こ と がな く な り ます。 セルで複数表行を連結 し て も 、 それ ら の表行は自動的に連動グループにはな り ません。 はめ込み枠が低すぎ る はめ込み枠が低すぎ て、 必要なヘ ッ ダ ・ フ ッ タ 行 と 、 最低 1 つ の本体表行ない し 行連動グループが入 ら ない と き は、 表がはめ込み枠に収ま る ま で、 行の 高 さ が一律に縮め ら れます。 ただ し 必要な縮小率が、 vertshrinklimit で設定 し た限界 よ り 8.3 表の組版 253 も 小 さ い と き は、 縮小は行われずに、 PDF_fit_table( ) は文字列 _error、 ま たはそれぞれの エ ラ ー メ ッ セージ を返 し ます。 縮小を一切 さ せた く ない と き は、 vertshrinklimit=100% を 使い ます。 はめ込み枠が狭すぎ る 表のはめ込み枠の座標は、PDF_fit_table( ) を呼び出す際に明示的 に与え ます。 与え た列幅を合計 し た実際の表幅が、 その表のはめ込み枠を超え た と き は、 表 が は め 込 み枠 に 収 ま る ま で すべ て の 列 が 縮 め ら れ ま す。 た だ し 必要 な 縮小 率 が、 horshrinklimit で設定 し た限界 よ り も 小 さ い と き は、 縮小は行われずに、 PDF_fit_table( ) は 文字列 _error、 ま たはそれぞれのエ ラ ー メ ッ セージ を返 し ます。 縮小を一切 さ せた く ない と き は、 horshrinklimit=100% を使い ます。 セルを分割 セルが行を連結 し てい る 場合、後のほ う の行がはめ込み枠に収ま ら ない と き は、 そのセルは分割 さ れます。 画像 ・ PDI ページ ・ SVG グ ラ フ ィ ッ ク ・ テ キ ス ト 行セルの 場合は、 セル内容は次の表 イ ン ス タ ン ス で も 繰 り 返 さ れます。 テ キ ス ト フ ロ ーセルの場合 は、 セル内容は後の表行のセルに続き ます。 図 8.38 に、 テ キ ス ト フ ロ ーセルが分割 さ れてテ キ ス ト フ ロ ーが次の表行に続いてい る 様子を示 し ます。 図 8.39 に、 画像セルが次の表 イ ン ス タ ン ス の最初の行で繰 り 返 さ れ る 様子を示 し ます。 Material Offset print paper 220g/sqm Our paper planes are the ideal way of passing the time. We offer revolutionary Benefit It is amazingly robust and can even do aerobatics. But it is best suited to gliding. new developments of the traditional common paper planes. 1 Giant Wing ࠗࡦࠬ ࠲ࡦࠬ1 ࠗࡦࠬ ࠲ࡦࠬ2 図 8.38 セルの分割 表行を分割 表のはめ込み枠に最後の本体行が収ま り き ら ない と き、それは普通は分割 さ れません。 こ の動作は PDF_fit_table( ) の minrowheight オプシ ョ ンで制御 さ れ、 デフ ォ ル ト 値は 100% です。 こ のデフ ォ ル ト 設定では、 表行は分割 さ れず、 ま る ご と 次の表 イ ン ス タ ン スへ配置 さ れます。 minrowheight 値を減 ら せば、 最後の本体行を分割 さ せて、 表行の内容の う ち指定 し た 割合を 1 つ目の部分に、 残 り を次の部分に配置する こ と がで き ます。 図 8.39 に、 テ キ ス ト フ ロ ー 「It's amazingly robust」 … が分割 さ れ、 次の表 イ ン ス タ ン ス の最初の本体行へテ キ ス ト フ ロ ーが続 く 様子を示 し ます。複数行にわた る画像セルが分 割 さ れ、 画像は繰 り 返 さ れます。 「Benefit」 セル も 繰 り 返 さ れます。 図 8.39 表行の分割 1 Giant Wing ࠗࡦࠬ ࠲ࡦࠬ1 ࠗࡦࠬ ࠲ࡦࠬ2 254 Material Offset print paper 220g/sqm Benefit It is amazingly robust and can even do aerobatics. But Benefit it is best suited to gliding. 第 8 章 : テキス ト と 表の組版 8.3.6 表組版のアルゴ リ ズム こ の項では、 表組版機能が表を配置す る 際に行 う ス テ ッ プ を詳説 し ます。 以下、 横書 き テ キ ス ト の場合について述べます。 し か し 、 「表行高 さ 」 と 「列幅」 と い う 言葉を互いに入 れ替えれば、 縦書 き や回転テ キ ス ト に も あ ては ま り ます。 PDF_fit_table( ) へ の 最 初 の 呼 び 出 し の 際 に は、 オ プ シ ョ ン colwidth ・ rowheight ・ fittextline ・ fittextflow がすべてのセルについて吟味 さ れ、 表全体の幅 と 高 さ が、 列幅 ・ 表 行高 さ ・ テ キ ス ト 内容に基づいて算出 さ れます。 テキス ト 行を持つ表セルの高 さ と 幅を算出 表組版機能は ま ず、 テ キ ス ト 行を持つ表セ ルの う ち、 colwidth ま たは rowheight のない表列ま たは表行にわた る も のすべてのサ イ ズ を決定 し ます。 こ れを実現す る ために、 fittextline オプシ ョ ンに従っ てテ キ ス ト 行の、 ひ いては表セルの幅を算出 し ます。 テ キ ス ト サ イ ズの 2 倍を表セルの高 さ と 見な し ます ( よ り 正確にい う と : 枠高 さ の 2 倍。 こ れは、 別途指定 さ れない限 り デフ ォ ル ト 値 {capheight none} を持ち ます) 。 縦書 き テ キ ス ト については、 も っ と も 幅の広いキ ャ ラ ク タ の幅がセ ル幅 と し て用い ら れます。 西向 き ま たは東向 き のテ キ ス ト については、 テ キ ス ト 高 さ の 2 倍がセル幅 と し て用い ら れます。 こ の求め ら れた表セルの幅 と 高 さ が、 その後、 その表セルがわた る 表列ま たは表行の う ち、 colwidth ま たは rowheight が指定 さ れていない も のすべてに均等に按分 さ れます。 仮の表サ イ ズ を算出 次の ス テ ッ プ と し て組版機能は、 表の仮の幅 と 高 さ を、 それぞれ 列幅 ・ 表行高 さ すべての合計 と し て算出 し ます。 パーセ ン ト 値で指定 さ れてい る列幅 と 表 行高 さ は、 先頭はめ込み枠の幅 と 高 さ に基づいて絶対値へ変換 さ れます。 colwidth ま たは rowheight を持たない列ま たは表行が ま だあ る 場合には、 仮の表サ イ ズが先頭はめ込み枠 に等 し く な る ま で、 残 り の余白が均等に按分 さ れます。 rowheightdefault オプシ ョ ン を用いて、 はめ込み枠の高 さ を完全に満たすか (キーワー ド auto と distribute)、 それ と も 広 さ を節約す る か (キーワー ド minimum) を指定す る こ と も で き ま す。 rowheight オ プ シ ョ ン で 明 示 的 に 表 行 の 高 さ を 指 定 し た 場 合 に は、 rowheightdefault 設定はつねにオーバ ラ イ ド さ れます。 小 さ すぎ る セルを拡大 こ こ で組版機能はすべてのセル内枠を決定 し ます(図8.32参照)。 余白の合計がセルの幅ま たは高 さ よ り 小 さ い と き は、 そのセル枠は、 そのセルに属す る す べての列 と 表行を均等に拡大す る こ と に よ っ て適切に拡大 さ れます。 テキス ト 行の横方向をはめ込む 組版機能は、 テ キ ス ト 行を持つすべてのセルの幅を拡 げて、 テ キ ス ト 行が文字サ イ ズ を下げな く て も セルにはめ込め る よ う に し ます。 こ れが可 能でない と き は、 テ キ ス ト 行は自動的に fitmethod=auto で配置 さ れます。 こ れに よ っ て、 テ キ ス ト 行がセル内枠か ら はみ出 さ な い こ と が保証 さ れ ま す。 fittextline オプ シ ョ ン で fitmethod=auto に設定す る と 、 セル幅が拡が る のを防ぐ こ と がで き ます。 colscalegroup オプシ ョ ン を用い る と 、 同一の列伸縮グループに属する すべての列が必 ず等 し い幅に伸縮 さ れ る よ う に、 すなわち こ れ ら の幅が統一 さ れて、 グループ内で最 も 広 い幅に合わせ ら れ る よ う にす る こ と がで き ます (図 8.35 参照)。 強制ハ イ フ ネーシ ョ ン を避け る 算出 さ れた表幅がはめ込み枠 よ り 小 さ い と き は、 組版 機能はテ キ ス ト フ ロ ーセルの幅を拡げて、テ キ ス ト が強制ハ イ フ ネーシ ョ ン な し にはめ込 め る よ う に し ます。 こ れはオプシ ョ ン checkwordsplitting=false で回避す る こ と も で き ま す。 こ の よ う なセルの幅は、 表幅がはめ込み枠の幅に等 し く な る ま で拡げ ら れます。 8.3 表の組版 255 PDF_info_table( ) の horboxgap キーを用いて、表幅 と はめ込み枠幅の差を ク エ リ で き ま す。 テキス ト の縦方向をはめ込む 組版機能は、 すべてのテ キ ス ト 行 ・ テ キ ス ト フ ロ ーセル の高 さ を拡げて、テ キ ス ト 行ま たはテ キ ス ト フ ロ ーが文字サ イ ズ を下げずにセル内枠には め込め る よ う 試みます。 ただ し 、 テ キ ス ト 行ま たはテ キ ス ト フ ロ ーに対 し てサブオプシ ョ ン fitmethod=auto が設定 さ れてい る 場合、 ま たはテ キ ス ト フ ロ ーが continuetextflow オ プシ ョ ンで他のセルに続いてい る 場合には、 セル高 さ は拡が り ません。 こ のセル高 さ を拡げ る 処理は、 テ キ ス ト 行ま たはテ キ ス ト フ ロ ーを内容 と し て持つセ ルに対 し てのみ適用 さ れ、 それ以外の種類のセル内容、 すなわち画像 ・ グ ラ フ ィ ッ ク ・ PDI ページ ・ パ ス オブジ ェ ク ト ・ 注釈 ・ フ ィ ール ド に対 し ては適用 さ れません。 rowscalegroup オプシ ョ ン を用い る と 、 同一の表行伸縮グループに属す るすべての表行 が必ず等 し い高 さ に伸縮 さ れ る よ う にする こ と がで き ます。 表を次のはめ込み枠へ続け る 算出 さ れた表全体の高 さ がはめ込み枠 よ り も 大 き い (す なわち、 すべての表セルをはめ込み枠に収め る こ と がで き ない) と き は、 組版機能は、 そ のはめ込み枠に収ま ら ない初めての表行に出会 う 前に、そのはめ込み枠内に表行を配置す る こ と を止め ます。 1 つのセルが複数行にわた り 、 そのすべての行がはめ込み枠に収ま ら ない と き は、 こ の セルは分割 さ れます。 セルが画像 ・ PDI ページ ・ SVG グ ラ フ ィ ッ ク ・ パス オブジ ェ ク ト ・ 注釈 ・ フ ォーム フ ィ ール ド を内容 と し て持つ と き は、 repeatcontent=false が指定 さ れてい ない限 り 、 そのセル内容は次のはめ込み枠内で繰 り 返 さ れ ま す。 し か し テ キ ス ト フ ロ ー は、 セルがわた る 後続の表行に続 き ます (図 8.38 参照)。 rowjoingroup オプシ ョ ン を用い る と 、 1 つの表行連動グループに属す るすべての表行 が必ず 1 つのはめ込み枠内に現れ る よ う にする こ と がで き ます。ヘ ッ ダ ま たはフ ッ タ に属 す る すべての表行 と 1 つの本体行は、 自動的に表行連動グループ を形成 し ます。 ですので 組版機能は、はめ込み枠に収ま ら ない初めての行に出会 う 前に表行を配置す る こ と を止め ます (図 8.37 参照)。 return オプシ ョ ン を用い る と 、 対象行を配置 し た後にその表 イ ン ス タ ン ス内に絶対 も う 表行が配置 さ れない よ う にす る こ と がで き ます。 表行を分割 表行は、 非常に高い と き 、 ま たは 1 個の本体行 し かない と き には、 分割 さ れ る こ と があ り ます。 末尾の本体行が表のはめ込み枠に完全に収ま ら ない と き は、 それは ま る ご と 次のはめ込み枠へ移動 さ れます。 こ の動作は PDF_fit_table( ) の minrowheight オプ シ ョ ン で制御す る こ と がで き ま す。 こ のオプ シ ョ ン のデフ ォ ル ト 値は 100% です。 こ の minrowheight 値を小 さ く す る と 、 末尾本体行の内容の う ち指定 し た割合がカ レ ン ト はめ 込み枠に配置 さ れ、 その行の残 り は次のはめ込み枠に配置 さ れます (図 8.39 参照)。 PDF_info_table( ) の rowsplit キー ワー ド を用い る と 、 表行が分割 さ れてい る か ど う かを チ ェ ッ ク す る こ と がで き ます。 算出 さ れた表幅を調節 算出 さ れ る 表幅は、 テ キ ス ト 行の横方向をはめ込んだ後な ど、決 定ス テ ッ プのいずれかの後に、 はめ込み枠 よ り も 大 き く な る こ と があ り ます。 こ の場合に は、 表幅がはめ込み枠の幅に等 し く な る ま で、 すべての列幅が均等に縮め ら れます。 こ の 縮小処理は horshrinklimit オプシ ョ ンに よ っ て制限 さ れます。 PDF_info_table( ) の horshrinking キーワ ー ド を用い る と 、 横縮小倍率を ク エ リ す る こ と がで き ます。 horshrinklimit の閾値を超え る と 、 以下のエ ラ ー メ ッ セージが現れます : 256 第 8 章 : テキス ト と 表の組版 Calculated table width $1 is too large (> $2, shrinking $3) こ こ で $1 は算出 さ れた表幅を示 し 、 $2 は可能な最大の幅、 $3 は horshrinklimit 値です。 表のサ イ ズ を小 さ いはめ込み枠に合わせて調整 直前のはめ込み枠に対 し て算出 さ れた 表幅が、 カ レ ン ト はめ込み枠に対 し て大 き すぎ る と き は、 組版機能は、 表幅がカ レ ン ト は め込み枠の幅に等 し く な る ま ですべての列を縮め ま す。 ただ し セル内容は調整 さ れ ま せ ん。 表幅を改めて計算 し なおすには、 PDF_fit_table( ) を rewind=1 をつけて呼び出 し ます。 8.3 表の組版 257 8.4 範囲枠 範囲枠を使 う と 、PDFlib がページ上に何 ら かの内容を配置 し た と き に算出 し た座標を利用 す る こ と がで き ます。 範囲枠を定義す る には、 そのための専用の API 関数があ る わけでは な く 、 実内容を配置す る PDF_fit_textline( ) や PDF_fit_image( ) な ど の関数で matchbox オ プシ ョ ン を指定 し ます。 範囲枠は さ ま ざ ま な目的に使え ます : > 範囲枠は装飾で き ます。 例 : 色を塗 る 、 枠線で囲む。 > 範囲枠を使っ て、1 個ない し 複数の注釈を PDF_create_annotation( ) で自動的に作成で き ます。 > 範囲枠はテ キ ス ト 行の高 さ を定義 し て、それがPDF_fit_textline( )で枠にはめ込まれ る よ う に し た り 、 テ キ ス ト フ ロ ー内のテ キ ス ト 範囲の高 さ を定義 し て、 それが装飾 さ れ る よ う に し た り し ます (boxheight オプシ ョ ン)。 > 範囲枠は画像の切 り 抜 き 領域を定義 し ます。 > 範囲枠の座標やその他のプ ロ パテ ィ は、 PDF_info_matchbox( ) で ク エ リ し て、 他の作業 に利用す る こ と がで き ます。 例 : 画像を挿入。 PDFlib はそれぞれの要素について、 ページ上におけ る その要素の位置 (関連す る すべての オプシ ョ ンで指定 さ れた) を記述す る 外接枠に照応す る長方形 と し て、 範囲枠を算出 し ま す。 テ キ ス ト フ ロ ー と 表セルの場合は、 改行や表行分割に よ っ て、 1 つの範囲枠が複数の 長方形か ら 成る こ と も あ り ます。 範囲枠の長方形 (群) は、 配置す る 要素を描 く 前に描かれ ます。 そのため、 範囲枠の 罫や塗 り の効力は実内容では打ち消 さ れ る こ と が あ り ま すが、 その逆はあ り ま せん。 特 に、 範囲枠 の 中 で、 画像 で 覆 わ れ た 領域 と 重 な る 部分 は、 画像 に 隠 れ ま す。 画像 が fitmethod=slice ま たは fitmethod=clip で配置 さ れてい る と き は、 画像のはめ込み枠の外の 範囲枠罫 も 切 り 落 と さ れます。こ の現象を避け る には、範囲枠の長方形を、PDF_fit_image( ) を呼び出 し た後に、PDF_rect( ) 等の基本的な描画関数を使っ て描 く と い う 方法 も あ り ます。 範囲枠の長方形の座標は、 PDF_info_matchbox( ) を使っ て取得で き ますが、 ただ し こ れは その範囲枠が PDF_fit_image( ) への呼び出 し で名前を与え ら れていた場合に限 り ます。 以下のい く つかの項で、 範囲枠の利用例をい く つか示 し ます。 範囲枠のオプシ ョ ン リ ス ト に対応 し てい る 関数については、く わ し く はPDFlib リ フ ァ レ ン ス を参照 し て く だ さ い。 8.4.1 テキス ト 行を装飾 テ キ ス ト 行の範囲枠か ら 話を始め ま し ょ う 。 PDF_fit_textline( ) においては範囲枠は、 与え ら れたテ キ ス ト のテ キ ス ト 枠 と 同 じ にな り ます。 デフ ォ ル ト では、 テ キ ス ト 枠の幅はテ キ ス ト の幅に等 し く 、 高 さ は、 与え ら れた文字サ イ ズのキ ャ ッ プハ イ ト に等 し く な り ます。 範囲枠の大 き さ を図示す る ために、 以下の コ ー ド 断片は、 範囲枠を青の背景色で塗 り ます (図 8.40a 参照)。 String optlist = "font=" + normalfont + " fontsize=8 position={left top} " + "matchbox={fillcolor={rgb 0.8 0.8 0.87} boxheight={capheight none}}"; p.fit_textline("Giant Wing Paper Plane", 2, 20, optlist); boxheight オプシ ョ ンは、 boxheight={capheight none} がデフ ォ ル ト 設定なので、 省略 し て も か ま い ません。 boxheight オプシ ョ ンで枠の高 さ を も っ と 増や し てデ ィ セ ン ダ ま で覆 う よ う にすれば、 よ り 美 し く な り ます (図 8.40b 参照)。 258 第 8 章 : テキス ト と 表の組版 枠の高 さ を増や し て文字サ イ ズに一致 さ せたい と き は、 boxheight={fontsize descender} が使え ます (図 8.40c 参照)。 次の ス テ ッ プ と し ては、 範囲枠の左 ・ 右 ・ 下へ変位を加え て拡げ、 枠のすべての端を テ キ ス ト と 均等な間隔に し てみま し ょ う 。 さ ら に枠線幅を指定 し て、 範囲枠の ま わ り に長 方形を描 き ま し ょ う (図 8.40d 参照)。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/text_on_color ト ピ ッ ク にあ り ます。 図 8.40 さ ま ざ ま なサブオプ シ ョ ンの範囲枠を使 っ て テキス ト 行を装飾 生成 さ れる出力 PDF_fit_textline( ) の matchbox オプ シ ョ ンのサブオプ ション a) Giant Wing Paper Plane boxheight={capheight none} b) Giant Wing Paper Plane boxheight={ascender descender} c) Giant Wing Paper Plane boxheight={fontsize descender} d) Giant Wing Paper Plane boxheight={fontsize descender} borderwidth=0.3 offsetleft=-2 offsetright=2 offsetbottom=-2 8.4.2 テキス ト フ ロ ー内で範囲枠を用い る テキス ト フ ロ ーの一部分を装飾 こ の項では、 テ キ ス ト フ ロ ー内の一部のテ キ ス ト を装 飾 し ま し ょ う : 「very dangerous」 と い う 言葉を マーカーペン の よ う に目立たせま し ょ う 。 こ れを実現す る には、 言葉を matchbox イ ン ラ イ ンオプシ ョ ン と matchbox=end イ ン ラ イ ンオプシ ョ ンで囲い ます (図 8.41 参照) : 図 8.41 matchbox イ ン ラ イ ンオプ シ ョ ン を含んだテキス ト フ ロー 生成 さ れる出力 It is very dangerous to fly the Giant Wing in a thunderstorm. PDF_create_textflow( ) に対する テキス ト と イ ン ラ イ ン オプ シ ョ ン It is <matchbox={fillcolor=red boxheight={ascender descender}}>very dangerous <matchbox=end> to fly the Giant Wing in a thunderstorm. テキス ト フ ロ ーの範囲枠に Web リ ン ク を追加 今度は、テ キ ス ト フ ロ ーの一部分に Web リ ン ク を追加 し ま し ょ う 。 1 番目の手順 と し て、 リ ン ク をつけたい部分のテ キ ス ト を示す kraxi と い う 範囲枠を含んだテ キ ス ト フ ロ ーを作成 し ま し ょ う 。 2 番目に、 URL を開 く ア ク シ ョ ン を作成 し ま し ょ う 。 3 番目に、 枠が不可視の Link 型の注釈を作成 し ま し ょ う 。 そ のオプシ ョ ン リ ス ト の中で、 範囲枠 kraxi を参照 し て リ ン ク の長方形 と し て使い ま し ょ う (PDF_create_annotation( ) の長方形の座標は無視 さ れます)。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/weblink_in_text ト ピ ッ ク にあ り ま す。 /* 範囲枠「kraxi」を含んだテキストフローを作成してはめ込み */ String tftext = "For more information about the Giant Wing Paper Plane see the Web site of " + "<underline=true matchbox={name=kraxi boxheight={fontsize descender}}>" + "Kraxi Systems, Inc.<matchbox=end underline=false>"; 8.4 範囲枠 259 String optlist = "font=" + normalfont + " fontsize=8 leading=110%"; tflow = p.create_textflow(tftext, optlist); if (tflow == -1) throw new Exception("エラー:" + p.get_errmsg()); result = p.fit_textflow(tflow, 0, 0, 50, 70, "fitmethod=auto"); if (!result.equals("_stop")) { /* ... */ } /* URIアクションを作成 */ optlist = "url={http://www.kraxi.com}"; act = p.create_action("URI", optlist); /* 範囲枠「kraxi」上にLink注釈を作成 */ optlist = "action={activate " + act + "} linewidth=0 usematchbox={kraxi}"; p.create_annotation(0, 0, 0, 0, "Link", optlist); テ キ ス ト が複数の行にわた る 場合で も 、 1 回 PDF_create_annotation( ) を呼び出すだけで、 適切な数の リ ン ク 注釈が自動的に作成 さ れます。 結果を図 8.42 に示 し ます。 For information about Giant Wing Paper Planes see the Web site of Kraxi Systems, Inc. 図 8.42 テキス ト フ ローの一部分に Web リ ン ク を追加 8.4.3 範囲枠 と 画像 画像に リ ン ク を追加 画像で覆われた領域に Web リ ン ク を追加す る には、 画像の範囲枠 が使え ます。 コ ー ド は先述の 259 ページ 「テ キ ス ト フ ロ ーの範囲枠に Web リ ン ク を追加」 と 同 じ です。 ただ し 、 テ キ ス ト フ ロ ーを配置す る のでな く 、 画像を以下のオプシ ョ ン リ ス ト を使っ てはめ込みます : String optlist = "boxsize={130 130} fitmethod=meet matchbox={name=kraxi}"; p.fit_image(image, 10, 10, optlist); ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の interactive/link_annotations ト ピ ッ ク にあ り ま す。 画像にふち を つけ る こ の例では、 画像の範囲枠を使っ て、 画像の ま わ り にふち をつけ ま し ょ う 。 画像に fitmethod=meet を使っ て、 縦横比を保ちつつま る ご と 、 与え ら れた枠 に収め ま し ょ う 。borderwidth サブオプシ ョ ン を使っ た matchbox オプシ ョ ン を使っ て、画 像の ま わ り に太い枠を描き ま し ょ う 。strokecolor サブオプシ ョ ンで枠の色を決め、linecap・ linejoin サブオプシ ョ ン を使っ て角を丸め ます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の images/frame_around_image ト ピ ッ ク にあ り ます。 範囲枠はつねに画像 よ り 前の時点で描かれ る ので、 一部が画像で隠 さ れて し ま い ます。 こ れを避け る ために、 枠の幅の 50 パーセ ン ト の offset サブオプシ ョ ン群を使っ て、 画像が 覆 う 領域 よ り も ふち を大 き く し ま し ょ う 。 あ る いは、 枠を その分太 く す る と い う 方法 も あ 260 第 8 章 : テキス ト と 表の組版 り ます。 図 8.43 に、 ふち をつけ る ために PDF_fit_image( ) で使 う オプシ ョ ン リ ス ト を示 し ます。 図 8.43 画像の範囲枠を使っ て画像にふち をつけ る 生成 さ れる出力 PDF_fit_image( ) に対する オプ シ ョ ン リ ス ト boxsize={60 60} position={center} fitmethod=meet matchbox={name=kraxi borderwidth=4 offsetleft=-2 offsetright=2 offsetbottom=-2 offsettop=2 linecap=round linejoin=round strokecolor={rgb 0.0 0.3 0.3}} テキス ト を画像に揃え る 以下の コ ー ド 断片は、 縦方向のテ キ ス ト を、 画像の右余白に 合わせ る 方法を示 し ます。 画像ははめ込み方式 meet を用いて、 与え ら れた枠に縦横比を 保っ てはめ込まれてい ます。 はめ込み枠の具体的な座標は PDF_info_matchbox( ) で取得 さ れ、 縦方向のテ キ ス ト ははめ込み枠の右下隅 (x2, y2) に合わせて配置 さ れてい ます。 範囲 枠の辺は描線 さ れてい ます (図 8.44 参照)。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの images/align_text_at_image ト ピ ッ ク にあ り ま す。 /* このオプションリストを使って画像を読み込んではめ込む */ String optlist = "boxsize={300 200} position={center} fitmethod=meet " + "matchbox={name=giantwing borderwidth=3 strokecolor={rgb 0.85 0.83 0.85}}"; /* 画像を読み込んではめ込む */ /* 範囲枠の右下(第二)隅の座標を取得 */ if ((int) p.info_matchbox("giantwing", 1, "exists") == 1) { x1 = p.info_matchbox("giantwing", 1, "x2"); y1 = p.info_matchbox("giantwing", 1, "y2"); } /* その隅から2だけ間隔をあけてテキスト行を開始 */ p.fit_textline("Foto: Kraxi", x2+2, y2+2, "font=" + font + " fontsize=8 orientate=west"); 図 8.44 画像の範囲枠の座標を使っ て テキス ト 行をはめ込む 生成 さ れる出力 生成手順 Foto: Kraxi 手順 1 : 画像を範囲枠 と と も にはめ込み (x2, y2) 手順 2 : 範囲枠情報を得て座標 (x2, y2) を取得 手順 3 : 取得 し た座標 (x2, y2) か ら orientate=west オプ シ ョ ン で テ キス ト 行を開始 8.4 範囲枠 261 262 第 8 章 : テキス ト と 表の組版 9 イ ン タ ラ ク テ ィ ブ機能 ク ッ ク ブ ッ ク イ ン タ ラ ク テ ィ ブ要素を作成する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ クの interactive カ テ ゴ リ にあ り ます。 9.1 リ ン ク ・ し お り ・ 注釈 こ の項では、 し お り ・ フ ォーム フ ィ ール ド ・ 注釈 と いっ た さ ま ざ ま な イ ン タ ラ ク テ ィ ブ要 素の作成方法を説明 し ます。 こ の項で作成す る つ も り の イ ン タ ラ ク テ ィ ブ要素がすべてで き あがっ た完成文書を図 9.1 に示 し ます。 こ の文書には以下の イ ン タ ラ ク テ ィ ブ要素があ り ます : > 右上には、テ キ ス ト www.kraxi.com の所に、www.kraxi.com への非表示の Web リ ン ク が あ り ます。 こ の領域を ク リ ッ ク す る と 、 その照応す る Web ページが表示 さ れます。 > 灰色の フ ォーム フ ィ ール ド が、 種類はテ キ ス ト で、 Web リ ン ク の下に作っ て あ り ます。 JavaScript を使っ て こ こ には今日の日付が自動的に記入 さ れます。 > 赤い押 し ピ ンは添付を持っ た注釈です。 ク リ ッ ク す る と フ ァ イ ル添付が開 き ます。 > 左下にはフ ォ ーム フ ィ ール ド があ り 、 種類はボ タ ン で、 プ リ ン タ のア イ コ ン を表示 し てい ます。 こ のボ タ ン を ク リ ッ ク する と Acrobat の メ ニ ュ ー項目 「フ ァ イル」 → 「印 刷」 が実行 さ れます。 > ナビ ゲーシ ョ ンパネルには し お り 「Our Paper Planes Catalog」 があ り ます。 こ の し お り を ク リ ッ ク す る と 、 別の PDF 文書のページが表示 さ れます。 以下、 こ う し た イ ン タ ラ ク テ ィ ブ要素を PDFlib で作成す る方法を詳 し く 説明 し ます。 Web リ ン ク まずは、 Web サ イ ト www.kraxi.com への リ ン ク を作 り ま し ょ う 。 こ れは 3 つの段階で達成で き ます。 まず、 Web リ ン ク をつけたいテ キ ス ト を配置 し ます。 matchbox オプシ ョ ンで name=kraxi を指定 し て、 テ キ ス ト のはめ込み枠を後で参照で き る よ う に し てお き ます。 次に、 URI 型 (Acrobat では : 「Web ページ を開 く 」) のア ク シ ョ ン を作成 し ます。 す る と ア ク シ ョ ンハン ド ルが得 ら れます。 こ のア ク シ ョ ンハン ド ルは後で 1 個ない し 複数の イ ン タ ラ ク テ ィ ブ要素に割 り 当て る こ と がで き ます。 最後に、 リ ン ク を実際に作成 し ます。 PDF では リ ン ク は Link 型の注釈です。 リ ン ク に 対す る action オプシ ョ ンでは、 イ ベン ト 名 activate を指定 し てア ク シ ョ ン を ト リ ガ さ せ、 図 9.1 い ろ い ろ なハイパーテキス ト 要素を持つ文書 9.1 リ ン ク ・ し お り ・ 注釈 263 加え て上記で作成 し た act ハン ド ルを ア ク シ ョ ン内容 と し て与え ます。 デフ ォ ル ト では リ ン ク は細い黒枠線がついて表示 さ れます。最初の う ちは こ のほ う が位置付け を正確にで き て便利ですが、 こ こ では linewidth=0 で枠線を非表示に し て あ り ます。 normalfont = p.load_font("Helvetica", "unicode", ""); p.begin_page_ext(pagewidth, pageheight, "topdown"); /* テキスト行「Kraxi Systems, Inc.」を配置。範囲枠を使用 */ String optlist = "font=" + normalfont + " fontsize=8 position={left top} " + "matchbox={name=kraxi} fillcolor={rgb 0 0 1} underline"; p.fit_textline("Kraxi Systems, Inc.", 2, 20, optlist); /* URIアクションを作成 */ optlist = "url={http://www.kraxi.com}"; int act = p.create_action("URI", optlist); /* 範囲枠「kraxi」上にLink注釈を作成 */ optlist = "action={activate " + act + "} linewidth=0 usematchbox={kraxi}"; /* 長方形座標の0は範囲枠の座標に置き換えられる */ p.create_annotation(0, 0, 0, 0, "Link", optlist); p.end_page_ext(""); 画像やテ キ ス ト フ ロ ーの一部への Web リ ン ク の作成例については 258 ページ 「8.4 範囲 枠」 を参照 し て く だ さ い。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の interactive/link_annotations ト ピ ッ ク にあ り ま す。 別の フ ァ イ ルへ移動す る し お り 今度は、別の PDF フ ァ イ ルへ移動する し お り 「Our Paper Planes Catalog」 を作成 し ま し ょ う 。 フ ァ イ ル名は paper_planes_catalog.pdf であ る も の と し ます。 まず、 GoToR 型のア ク シ ョ ン を作成 し ます。 こ のア ク シ ョ ンに対す る オプシ ョ ン リ ス ト で、 移動先文書の名前を filename オプシ ョ ンで定義 し ます。 ま た destination オプ シ ョ ンで、 拡大表示 さ せたいページ内の一部分を指定 し ます。 具体的には、 表示 さ れ る の は文書の 2 ページ目で (page=2)、 位置 ・ 倍率指定表示で (type=fixed)、 ページの中頃が 表示 さ れ (left=50 top=200)、 表示倍率 200% (zoom=2) と な り ます : String optlist = "filename=paper_planes_catalog.pdf " + "destination={page=2 type=fixed left=50 top=200 zoom=2}"; goto_action = p.create_action("GoToR", optlist); 次の段階 と し て、 実際に し お り を作成 し ます。 こ の し お り に対する action オプシ ョ ンで、 ア ク シ ョ ンの ト リ ガ と し て activate イ ベン ト を指定 し 、 起 こ し たいア ク シ ョ ン と し て上で 作成 し た goto_action ハン ド ルを指定 し ます。fontstyle=bold オプシ ョ ンで太字のテ キ ス ト を 指定 し 、 textcolor=blue で し お り を 青 く し ま す。 し お り の テ キ ス ト 「Our Paper Planes Catalog」 は関数の引数 と し て与え ます : String optlist= "action={activate " + goto_action + " } fontstyle=bold textcolor=blue"; 264 第 9 章 : イ ン タ ラ ク テ ィ ブ機能 catalog_bookmark = p.create_bookmark("Our Paper Planes Catalog", optlist); こ の し お り を ク リ ッ ク す る と 、 移動先文書内のページの指定部分が表示 さ れます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの interactive/nested_bookmarks ト ピ ッ ク にあ り ま す。 フ ァ イ ル添付を持つ注釈 次に、 フ ァ イ ル添付を作成 し ま し ょ う 。 まず FileAttachment 型 の注釈を作成 し ま し ょ う 。 filename オプシ ョ ン で添付の名前を指定 し 、 mimetype image/ gif オプシ ョ ンでその種類を指定 し ます(MIME はフ ァ イ ル内容の分類のために広 く 使われ てい る 記述方式)。 こ の し お り は押 し ピ ン と し て表示 さ れ (iconname pushpin)、 色は赤で (annotcolor=red)、 説明を持ち ます (contents {Get the Kraxi Paper Plane!})。 印刷 さ れませ ん (display noprint) : String optlist = "filename=kraxi_logo.gif mimetype=image/gif iconname=pushpin " + "annotcolor=red contents={Get the Kraxi Paper Plane!} display=noprint"; p.create_annotation(left_x, left_y, right_x, right_y, "FileAttachment", optlist); なお、 iconname で定義 し た ア イ コ ンの大 き さ は変化 し ません。 ア イ コ ンはその標準サ イ ズの ま ま、 指定 し た長方形の左上隅に表示 さ れます。 9.1 リ ン ク ・ し お り ・ 注釈 265 9.2 フ ォ ーム フ ィ ール ド と JavaScript 印刷のためのボ タ ン フ ォ ーム フ ィ ール ド 次 に、 文書 の 印刷 に 使 え る ボ タ ン フ ォ ー ム フ ィ ール ド を作成 し ます。 最初のバージ ョ ンではボ タ ンに ラ ベルをつけてお き ます。 その 後で ラ ベルをやめてプ リ ン タ のア イ コ ン を使い ま し ょ う 。 まず Named 型 (Acrobat では : 「 メ ニ ュ ー項目を実行」) のア ク シ ョ ン を作成 し ま し ょ う 。 ま た、 ラ ベルの フ ォ ン ト も 指定 し てお く 必要があ り ます : print_action = p.create_action("Named", "menuname=Print"); button_font = p.load_font("Helvetica-Bold", "unicode", ""); こ のボ タ ン フ ォーム フ ィ ール ド に対す る action オプシ ョ ン で、ア ク シ ョ ン実行の ト リ ガ と し て up イ ベン ト (Acrobat では : 「マウスボ タ ン を放す」) を指定 し 、 ア ク シ ョ ン その も の と し て上で作成 し た print_action ハン ド ルを指定 し ます。backgroundcolor=yellow オプシ ョ ン で 背 景 を 黄 色 に 指 定 し 、 bordercolor=black で 枠線 を 黒 に 指定 し ま す。 オ プ シ ョ ン caption=Print でボ タ ンにテ キ ス ト 「Print」 をつけ、tooltip={Print the document} でユーザー のための追加説明を作成 し ます。 font オプシ ョ ン で、 上で作成 し た button_font ハン ド ル を用いて フ ォ ン ト を指定 し ます。 デフ ォ ル ト では、 ラ ベルのサ イ ズはボ タ ンの領域にち ょ う ど収ま る よ う 自動調整 さ れます。 そ し て、 実際にボ タ ン フ ォーム フ ィ ール ド を作成す る 際に、適当な座標 と 、名前 print_button、pushbutton 型、適切なオプシ ョ ン群を指定 し ます: String optlist = "action {up " + print_action + "} backgroundcolor=yellow " + "bordercolor=black caption=Print tooltip={Print the document} font=" + button_font; p.create_field(left_x, left_y, right_x, right_y, "print_button", "pushbutton", optlist); それでは、 こ の最初のバージ ョ ンのボ タ ン を改良 し て、 テ キ ス ト Print をやめて小 さ いプ リ ン タ ア イ コ ン に替え てみ ま し ょ う 。 こ れ を達成す る には、 その照応す る 画像フ ァ イ ル print_icon.jpg を テ ンプ レー ト と し てページ作成前に読み込みます。icon オプシ ョ ン を用い てテ ンプ レー ト ハン ド ル print_icon を ボ タ ン フ ィ ール ド に割 り 当てつつ、 上記の コ ー ド と 同様に フ ォーム フ ィ ール ド を作成 し ます : print_icon = p.load_image("auto", "print_icon.jpg", "template"); if (print_icon == -1) { /* エラー処理 */ return; } p.begin_page_ext(pagewidth, pageheight, ""); ... String optlist = "action={up " + print_action + "} icon=" + print_icon + " tooltip={Print the document} font=" + button_font; p.create_field(left_x, left_y, right_x, right_y, "print_button", "pushbutton", optlist); ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の interactive/form_pushbutton ト ピ ッ ク にあ り ま す。 単純な テキス ト フ ィ ール ド 今度は、 テ キ ス ト フ ィ ール ド をページ右上隅付近に作成 し ます。 ユーザーは今日の日付を こ の フ ィ ール ド に入力す る こ と がで き ます。 フ ォ ン ト ハン 266 第 9 章 : イ ン タ ラ ク テ ィ ブ機能 ド ルを取得 し 、 textfield 型の フ ォーム フ ィ ール ド を作成 し て名前を date、 背景を灰色 と し ます : textfield_font = p.load_font("Helvetica-Bold", "unicode", ""); String optlist = "backgroundcolor={gray 0.8} font=" + textfield_font; p.create_field(left_x, left_y, right_x, right_y, "date", "textfield", optlist); デフ ォ ル ト では文字サ イ ズは auto であ り 、 こ の場合フ ィ ール ド の高 さ がその ま ま初期の 文字サ イ ズ と な り ます。入力が フ ィ ール ド の終わ り ま で達す る と 文字サ イ ズは小 さ く な っ て、 テ キ ス ト がつねに フ ィ ール ド に収ま る よ う 自動調整 さ れます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの interactive/form_textfield_layout ・ interactive/form_textfield_height ト ピ ッ ク にあ り ます。 JavaScript を持つ テ キス ト フ ィ ール ド 上で作成 し た テ キ ス ト フ ォ ー ム フ ィ ール ド を 改 良 し て、 ペー ジ を 開 く と 自動的に今日の日付が記入 さ れ る よ う に し ま し ょ う 。 ま ず、 JavaScript 型 (Acrobat では : 「JavaScript を実行」) のア ク シ ョ ン を作成 し ま し ょ う 。 こ の ア ク シ ョ ンのオプシ ョ ン リ ス ト の中の script オプシ ョ ンで JavaScript ス ニペ ッ ト を定義 し ます。 こ の ス ニペ ッ ト は、 今日の日付を date テ キ ス ト フ ィ ール ド に月日年形式で表示 し ます : String optlist = "script={var d = util.printd('mmm dd yyyy', new Date()); " + "var date = this.getField('date'); date.value = d;}" show_date = p.create_action("JavaScript", optlist); 第二段階 と し て、 ページ を作成 し ま し ょ う 。 オプシ ョ ン リ ス ト で action オプシ ョ ン を与 え、 その中で、 上で作成 し た show_date ア ク シ ョ ン を ト リ ガ イ ベン ト open (Acrobat で は : 「ページ を開 く 」) に対 し て設定 し ます : String optlist = "action={open " + show_date + "}"; p.begin_page_ext(pagewidth, pageheight, optlist); 最後に、 上 と 同様にテ キ ス ト フ ィ ール ド を作成 し ま し ょ う 。 ページ を開 く たび、 こ こ に自 動的に今日の日付が記入 さ れます : textfield_font = p.load_font("Helvetica-Bold", "winansi", ""); String optlist = "backgroundcolor={gray 0.8} font=" + textfield_font; p.create_field(left_x, left_y, right_x, right_y, "date", "textfield", optlist); ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの interactive/form_textfield_fill_with_js ト ピ ッ ク にあ り ます。 テキス ト フ ィ ール ド のための フ ォ ーマ ッ ト オ プ シ ョ ン Acrobat では、テ キ ス ト フ ィ ール ド に対 し て さ ま ざ ま なオプシ ョ ン を指定 し て内容を フ ォーマ ッ ト す る こ と が可能です。た と えば通貨 ・ 日付 ・ パーセ ン ト な ど です。 こ れは、 カ ス タ ムの JavaScript コ ー ド を Acrobat が使用す る こ と に よ っ て実装 さ れてい ます。 こ う いっ た フ ォーマ ッ ト 機能は PDF リ フ ァ レ ン ス には記載 さ れていない物ですか ら 、 PDFlib は直接には こ れに対応を し てい ません。 し か し なが ら 、 PDFlib ユーザーの便宜を図 る ため、 以下、 フ ォーマ ッ ト オプシ ョ ン を実現 す る ための さ ま ざ ま な簡単な JavaSctipt コ ー ド 断片を PDF_create_field( ) の action オプシ ョ ンで与え る 方法について説明 し ます。 9.2 フ ォ ーム フ ィ ール ド と JavaScript 267 テ キ ス ト フ ィ ール ド が フ ォーマ ッ ト さ れ る よ う にす る には、 JavaScript ス ニペ ッ ト を そ の フ ィ ール ド の keystroke ・ format のア ク シ ョ ン と し て設定 し ます。 その JavaScript コー ド か ら 何 ら かの内部 Acrobat 関数を呼び出 し 、 こ の関数の引数群で フ ォーマ ッ ト の詳細を制 御 し ます。 以下のサンプルでは、 keystroke ・ format の 2 つのア ク シ ョ ン を作成 し 、 こ れ ら を 1 つ の フ ォーム フ ィ ール ド に対 し て設定 し て、フ ィ ール ド 内容の フ ォーマ ッ ト が小数点以下の 桁数 2 ・ 通貨記号 EUR と な る よ う に し てい ます : keystroke_action = p.create_action("JavaScript", "script={AFNumber_Keystroke(2, 0, 3, 0, \"EUR \", true); }"); format_action = p.create_action("JavaScript", "script={AFNumber_Format(2, 0, 0, 0, \"EUR \", true); }"); String optlist = "font=" + font + "action={keystroke " + keystroke_action + " format=" + format_action + "}"; p.create_field(50, 500, 250, 600, "price", "textfield", optlist); ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の interactive/form_textfield_input_format ト ピ ッ ク にあ り ます。 Acrobat で対応 し てい る さ ま ざ ま な フ ォーマ ッ ト を指定す る には、 それぞれ適切な関数を JavaScript コー ド 内で用い る必要があ り ます。 対応 し てい るすべての フ ォーマ ッ ト につい て、 それぞれ実現す る ために keystroke ・ format ア ク シ ョ ンで用い る べ き JavaScript 関数名 を表 9.1 に挙げます。 表 9.2 は 関数の引数の解説です。 こ れ ら の関数を、 上記の例 と 同様 に使用 し て く だ さ い。 表 9.1 テキス ト フ ィ ール ド のための JavaScript フ ォ ーマ ッ ト 関数 フ ォ ーマ ッ ト keystroke ・ format ア ク シ ョ ン で用いるべき JavaScript 関数 数値 AFNumber_Keystroke(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend) AFNumber_Format(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend) パーセ ン ト AFPercent_Keystroke(ndec, sepStyle), AFPercent_Format(ndec, sepStyle) 日付 AFDate_KeystrokeEx(cFormat), AFDate_FormatEx(cFormat) 時間 AFTime_Keystroke(tFormat), AFTime_FormatEx(cFormat) 特殊 AFSpecial_Keystroke(psf), AFSpecial_Format(psf) 表 9.2 JavaScript フ ォ ーマ ッ ト 関数に対する引数 付け 説明 ・ と り う る値 nDec 小数点以下の桁数 sepStyle 桁区切 り のス タ イル : 268 0 1,234.56 1 1234.56 2 1.234,56 3 1234,56 第 9 章 : イ ン タ ラ ク テ ィ ブ機能 表 9.2 JavaScript フ ォ ーマ ッ ト 関数に対する引数 付け 説明 ・ と り う る値 negStyle 負数の表記方法 : 0 標準 1 赤い字にする 2 かっ こ で く く る 3 両方 strCurrency 通貨記号文字列。 例 : \u20AC でユーロ記号 bCurrencyPrepend false 通貨記号を頭につけない true 通貨記号を頭につける cFormat 日付形式文字列。 以下の形式指定文字列を含む こ と がで き るほか、 後述の tFormat の時刻 形式を どれで も 含む こ と がで き ます : tFormat psf d 日 dd 日の頭にゼロ を適宜つけた も の ddd 曜日の短縮形 m 月を数で表す mm 月を数で表 し 頭にゼロ を適宜つけた もの mmm 月名の短縮形 mmmm 月名の全体形 yyyy 年の 4 桁 yy 年の下 2 桁 時刻形式文字列。 以下の形式指定文字列を含む こ と がで き ます : h 時 (0 ~ 12) hh 時 (0 ~ 12) の頭にゼロ を適宜つけた もの H 時 (0 ~ 24) HH 時 (0 ~ 24) の頭にゼロ を適宜つけた もの M 分 MM 分の頭にゼロ を適宜つけた も の s 秒 ss 秒の頭にゼロ を適宜つけた も の t 午前 「a」、 午後 「p」 tt 午前 「am」、 午後 「pm」 い く つかの追加の形式を記述 し ます : 0 ZIP コ ー ド 1 ZIP コ ー ド + 4 2 電話番号 3 社会保障番号 フ ォ ーム フ ィ ール ド 入力を検証 以下のサンプルは、 JavaScript を フ ォーム フ ィ ール ド に 検証ア ク シ ョ ン と し て紐付けて、 テ キ ス ト フ ィ ール ド へのユーザー入力が、 求め ら れ る形 式 mm/dd/yyyy に合致 し てい る か ど う か をチ ェ ッ ク し ます : optlist = "script={" + 9.2 フ ォ ーム フ ィ ール ド と JavaScript 269 "// JavaScript code for date mask format MM/DD/YYYY\n" + "var re = /^[0-9]{2}\\/[0-9]{2}\\/[0-9]{4}$/\n" + "if (event.value !=\"\") {\n" + " if (re.test(event.value) == false) {\n" + " app.alert ({\n" + " cTitle: \"Incorrect Format\",\n" + " cMsg: \"Please enter date using mm/dd/yyyy format\"\n" + " });\n" + " }\n" + "}\n" + "}"; validate_action = p.create_action("JavaScript", optlist); textfield_font = p.load_font("Helvetica", "unicode", ""); optlist = "action={validate=" + validate_action + "} " + "backgroundcolor={gray 0.8} font=" + textfield_font; p.create_field(llx, lly, urx, ury, "startdate", "textfield", optlist); 270 第 9 章 : イ ン タ ラ ク テ ィ ブ機能 9.3 地理空間 PDF ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの interactive/starter_geospatial ト ピ ッ ク にあ り ます。 9.3.1 地理空間 PDF を Acrobat で利用 PDF 1.7ext3 では、 地理空間参照情報 (世界座標) を PDF ページ内容に追加す る こ と がで き る よ う にな っ てい ます。 Acrobat 9 以上では、 地理空間参照付き PDF 文書でい く つかの こ と がで き ま す (Acrobat X/XI では、 「ツ ール」 ペーン の上端のボ タ ン を使っ て 「分析」 ツールバーを表示 さ せ る 必要があ り ます) : > マ ウ ス カー ソ ルの下の地図上の位置の座標を表示 : 「ツール」 → 「分析」 → 「地図位置 ツール」 。 マ ウ ス カー ソ ルの下の地図上の位置の座標を、 右 ク リ ッ ク し て 「座標を ク リ ッ プボー ド に コ ピー」 を選択す る こ と で コ ピーで き ます。 > 地図上の位置 を 検索 : 「ツ ール」 → 「分析」 → 「地図位置ツ ール」 →右 ク リ ッ ク し て 「位置を検索」 を選択→求め る 座標を入力。 > 地図上の位置を マー ク : 「ツール」 → 「分析」 → 「地図位置ツール」 →右 ク リ ッ ク し て 「位置を マー ク」 を選択。 > 地図上の距離 ・ 周辺 ・ 面積を測定 : 「ツール」 → 「分析」 → 「もの さ し ツール」。 Acrobat Reader では上記の う ち最初の 2 つの機能だけが利用可能です。 地理空間測定のた めの さ ま ざ ま な設定を、 「編集」 → 「環境設定」 (→ 「一般 ...」) → 「もの さ し (地図情報)」 で変更で き ます。 た と えば座標読み上げのための望ま し い座標系な ど です。 PDFlib の地理空間機能は以下の関数 と オプシ ョ ンで実装 さ れてい ます : > 1 つのページに対 し て、 1 つない し 複数の地理参照付 き領域を、 PDF_begin/end_page_ ext( ) の viewports オプシ ョ ン で割 り 当て る こ と がで き ます。 ビ ューポー ト を使 う と 、 ページ上の別々の領域で別々の地理空間参照 (georeference オプシ ョ ンで指定) を用い る こ と が可能にな り ます。 こ れはた と えば同一ページ上に複数の地図があ る と き な ど に有用です。 > PDF_load_image( ) の georeference オプシ ョ ン を使 う と 、画像に地球ベース の座標を割 り 当て る こ と がで き ます。 9.3.2 地理座標系 と 投影座標系 地理座標系は地球を地理座標で、 すなわち緯度 と 経度を度単位で表 し て記述 し ます。 投影 座標系は、 地理座標系の上に指定す る こ と がで き 、 地理座標系におけ る 点か ら 二次元 (投 影) 座標系への変換を記述 し ます。 こ こ か ら 算出 さ れ る 座標を Northing ・ Easting 値 と い い、 投影座標系では角度は も はや不要です。 地理座標系が GPS な ど の全球的応用分野で 用い ら れてい る のに対 し て、投影はそれ よ り も あ る 程度局地的な地図製作な ど の応用分野 で必要 と な り ます。 歴史的 ・ 数学的理由に よ り 、 世界 じ ゅ う で さ ま ざ ま な座標系が用い ら れてい ます。 地 理座標系 ・ 投影座標系 と も 、 EPSG ・ WKT と い う 2 種類の普及 し た方式で記述す る こ と が で き ます。 EPSG EPSG は何千 も の座標系の集合で あ り 、 おのおのが数値 コ ー ド で参照 さ れ ま す。 EPSG は、 今はな き 欧州石油調査グループの略称であ り 、 現在は国際石油 ・ 天然ガ ス生産 者協会 (OGP) に よ っ て保守 さ れてい ます。 EPSG 参照コ ー ド は、 EPSG デー タ ベース内の座標系群の う ちの 1 つを指 し 示 し ます。 EPSG デー タ ベース全体を、 以下の場所か ら ダ ウ ン ロ ー ド する こ と がで き ます : 9.3 地理空間 PDF 271 www.epsg.org WKT (Well-known text) WKT (Well-Known Text) 系は記述的であ り 、 座標系のあ ら ゆ る 関連パ ラ メ ー タ の テ キ ス ト 表記か ら 成 っ て い ま す。 WKT の仕様は文書 「OpenGIS® Implementation Specification: Coordinate Transformation Services」 に示 さ れてお り 、 こ の文 書は Open Geospatial Consortium (OGC) に よ っ て Document 01-009 と し て発行 さ れてい ます。 こ れは以下の場所で入手可能です : www.opengeospatial.org/standards/ct WKT は ISO 19125-1 で標準化 も さ れてい ます。 WKT ・ EPSG と も Acrobat で使用で き ます (ま た、 PDFlib で も 対応 し てい ます) が、 Acrobat はすべての可能な EPSG コー ド を実装 し てい る わけではあ り ません。 特に、 地理座標系のための EPSG コ ー ド 群には Acrobat は対 応 し ていない よ う です。 その場合には WKT の使用を推奨 し ます。 以下の Web サ イ ト で、 特定の EPSG コ ー ド に照応す る WKT を示 し てい ます : www.spatialreference.org/ref/epsg 9.3.3 座標系の例 地理座標系の例 WGS84 (世界測地系) 地理座標系は、 GPS をは じ め と す る 多 く の応用 分野 (OpenStreetMap 等) の基礎 と な っ てい ます。 こ れは以下の よ う に georeference オプ シ ョ ンの worldsystem サブオプシ ョ ンで表現で き ます : worldsystem={type=geographic wkt={ GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84", 6378137, 298.257223563]], PRIMEM["Greenwich", 0], UNIT["degree", 0.01745329251994328]] }} ETRS (欧州地球基準系) 地理座標系は WGS84 と ほ と ん ど等価です。 こ れは以下の よ う に 指定で き ます : worldsystem={type=geographic wkt={ GEOGCS["ETRS_1989", DATUM["ETRS_1989", SPHEROID["GRS_1980", 6378137.0, 298.257222101]], PRIMEM["Greenwich", 0.0], UNIT["Degree", 0.0174532925199433]] }} 注 WGS84 ・ ETRS 系に対する EPSG コ ー ド はこ こ では示 し ていません。 なぜな ら Acrobat は地 理座標系に対する EPSG コ ー ド に対応 し てお ら ず、 投影座標系に し か対応 し ていないよ う だから です (後述)。 投影座標系の例 投影は、 その背景にあ る 地理座標系に基づいてい ます。 以下の例では、 GPS 座標での利用に適 し た投影座標系を指定 し ます。 中欧では、 ETRS89 UTM zone 32 N と い う 系が適用 さ れます。 こ れは広 く 利用 さ れてい る UTM (国際 メ ルカ ト ル投影) を用いてお り 、 以下の よ う に georeference オプシ ョ ンの worldsystem サブオプシ ョ ン で表現で き ます : worldsystem={type=projected wkt={ PROJCS["ETRS_1989_UTM_Zone_32N", 272 第 9 章 : イ ン タ ラ ク テ ィ ブ機能 GEOGCS["GCS_ETRS_1989", DATUM["D_ETRS_1989", SPHEROID["GRS_1980", 6378137.0, 298.257222101], TOWGS84[0, 0, 0, 0, 0, 0, 0]], PRIMEM["Greenwich", 0.0], UNIT["Degree", 0.0174532925199433]], PROJECTION["Transverse_Mercator"], PARAMETER["False_Easting", 500000.0], PARAMETER["False_Northing", 0.0], PARAMETER["Central_Meridian", 9.0], PARAMETER["Scale_Factor", 0.9996], PARAMETER["Latitude_Of_Origin", 0.0], UNIT["Meter", 1.0]] }} こ の座標系に照応す る EPSG コー ド は 25832 です。WKT のかわ り に、上記の系はその EPSG コー ド を通 じ て以下の よ う に指定す る こ と も で き ます : worldsystem={type=projected epsg=25832} 9.3.4 Acrobat におけ る地理空間 PDF の制約 地理空間 PDF を Acrobat 9/X/XI で扱 う なかで、 私たちは以下の難点に遭遇 し てい ます : > EPSG コ ー ド は地理座標系に対 し ては ま っ た く 動作せず、投影系に対 し てのみ動作す る よ う です。 回避策 : EPSG コ ー ド でな く 、 その照応す る WKT を使 う こ と 。 > 地理空間デー タ を フ ォーム XObjectに紐付けて も 動作 し ません。PDF Referenceに よ れば こ れは動作す る はずなのですが、 こ の理由か ら PDFlib では、 PDF_open_pdi_page( ) ・ PDF_begin_template_ext( ) ・ PDF_load_graphics( ) に対す る georeference オプシ ョ ンには 対応 し てい ません。 ベ ク ト ルベース の地図を作成す る ための回避策 : 地理空間デー タ をページに紐付け る こ と はで き ます。すなわち、PDF_begin_page_ext( ) の viewports オプシ ョ ン を用い ます。 > 重な り 合っ た地図 : 同一ページ上に複数の画像ベース の地図を貼 り 付け る こ と がで き ます。 複数の地図が重な り 合っ てい る と き 、 重な り 合っ てい る 領域内の点の座標を表 示 さ せる と 、 Acrobat は、 最後に貼 り 付け ら れた地図の座標を用い ます ( こ れがすなわ ち見えてい る 地図で も あ り ますので こ れは理にかな っ てい ます)。 し か し 、 双方の画像 ハン ド ルが同一の (すなわち PDF_load_image( ) への 1 回の呼び出 し で取得 さ れた) 場 合には、 Acrobat は も はや さ ま ざ ま な画像の領域を考慮 し な く な り ます : 1 番目の画像 の座標が誤っ て 2 番目の画像の領域へ拡張 さ れ、 誤っ た座標表示 と な っ て し ま い ます。 回避策:同一ページ上に同 じ 画像をベース に し た地図を複数枚貼 り 付けたい と き は、そ の画像を複数回開 く こ と 。 > 面積 も の さ し ツールは地理座標系に対 し ては正 し く 動作せず、 投影系に対 し てのみ正 し く 動作 し ます。 9.3 地理空間 PDF 273 274 第 9 章 : イ ン タ ラ ク テ ィ ブ機能 10 文書交換 10.1 XMP メ タ デー タ 文書情報フ ィ ール ド のかわ り と し て、 あ る いはそれに加え る も の と し て、 PDFlib は メ タ デー タ を指定す る ための フ レーム ワー ク と し て、 XMP (Extensible Metadata Platform) に 対応 し てい ます。 XMP は ISO 16684-1:2012 と し て標準化 さ れてい ます。 PDFlib におけ る XMP 対応にはい く つかの側面があ り ますので、 以下説明 し ます。 ク ッ ク ブ ッ ク シ ン プルな XMP サン プルが、ク ッ ク ブ ッ ク ト ピ ッ ク interchange/embed_xmp 内にあ り ます。 多 く の場合、 XMP は文書全体に メ タ デー タ を紐付け る ために用い ら れ ます。 文書レベル メ タ デー タ のほかに、 XMP はページ ・ フ ォ ン ト ・ ICC プ ロ フ ァ イ ル ・ 画像 ・ グ ラ フ ィ ッ ク ・ 画像 ・ 取 り 込み PDF ページに対 し て与え る こ と も で き ます。 こ れは、 さ ま ざ ま な関 数の metadata オプシ ョ ンで実現で き ます。 た と えば : metadata={filename=info.xmp inputencoding=winansi} こ の metadata オプシ ョ ンは、 完全な XMP メ タ デー タ ス ト リ ーム ない し はその一部分を 受け付け ます。 PDFlib は、 ユーザーが与えた XMP メ タ デー タ を、 XML 規則 と XMP/RDF 規則に従っ て検証 し ます。 PDF/A の場合には、 カ ス タ ム XMP プ ロ パテ ィ に対す る追加規 則が適用 さ れます : 330 ページ 「11.3.8 PDF/A のための XMP 文書 メ タ デー タ 」 を参照 し て く だ さ い。 内部 ・ 予約 XMP プ ロパテ ィ PDFlib は、 い く つかの XMP プ ロ パテ ィ を内部的に作成 し ます。 た と えば CreationDate です。 他に、 PDF/A や PDF/X と いっ た さ ま ざ ま な PDF 企 画への準拠を シ グナルす る ために必須の XMP プ ロ パテ ィ 群があ り ます。 内部プ ロ パテ ィ と 規格関連識別プ ロ パテ ィ は、 ユーザーが与え る XMP でオーバ ラ イ ド す る こ と はで き ま せん。 文書情報 フ ィ ール ド に対す る自動 XMP 同期 PDF_begin/end_document( ) の autoxmp オ プシ ョ ンが true の場合には、 PDFlib は、 PDF_set_info( ) に与え ら れた文書情報フ ィ ール ド 群 と 、 い く つかの内部的に生成 さ れたエン ト リ (CreationDate 等) と を、 その照応す る、 文書レベル XMP メ タ デー タ 内のエン ト リ 群へ同期 し ます。 標準 XMP ス キーマ群の う ちの 1 つの中にあ る よ く 知 ら れたプ ロ パテ ィ に照応す る 文書 情報フ ィ ール ド は、 適切な ス キーマ内に配置 さ れ ます。 未知の情報フ ィ ール ド は、 通常、 拡張 PDF (pdfx) ス キーマ内に配置 さ れますが、 ただ し PDF/A では無視 さ れます。 XMP メ タ デー タ を転写 PDF 文書の大半ない し すべてのページが取 り 込まれた も のであ る 場合には、 XMP メ タ デー タ が も し 入力の中に存在 し ていれば、 それを転写す る こ と を 推奨 し ます。 XMP メ タ デー タ を転写す る には、 以下の コ ー ド 断片を使い ます : if (p.pcos_get_string(indoc, "type:/Root/Metadata").equals("stream")) { xmp = p.pcos_get_stream(indoc, "", "/Root/Metadata"); p.create_pvf("/xmp/document.xmp", xmp, ""); optlist += " metadata={filename=/xmp/document.xmp}"; } 10.1 XMP メ タ デー タ 275 p.end_document(optlist); p.delete_pvf("/xmp/document.xmp"); 276 第 10 章 : 文書交換 10.2 Web 最適化 (線形) PDF PDFlib は、 線形化 と い う 処理を PDF 文書に対 し て適用す る こ と がで き ます (PDF の線形 化は 「最適化」 ・ 「Web 表示用に最適化」 と も いい ます)。 線形化は、 PDF フ ァ イ ル内部の オブジ ェ ク ト 群を再配列す る と と も に、ア ク セ ス高速化のために活用 さ れ う る補足情報を 追加 し ます。 非線形化 PDF は、 ク ラ イ ア ン ト へま る ご と 転送 さ れ る 必要があ り ますが、 Web サーバ は線形化 PDF 文書を、 バ イ ト サービ ン グ と い う 処理を用いて、 1 ページずつ転送す る こ と が可能です。 こ れに よ っ て、 Acrobat (ブ ラ ウ ザのプ ラ グ イ ン と し て動作 し て い る ) は、 PDF 文書の個別のページ を別々に取得す る こ と が可能にな り ます。 その結果 と し て、 その 文書の最初のページが、 文書全体がサーバか ら ダ ウ ン ロ ー ド さ れ終わ る の を待つ こ と な く 、 ユーザーに提示 さ れます。 こ れはユーザー体験の向上を も た ら し ます。 ただ し 、 PDF デー タ をブ ラ ウ ザへス ト リ ームする のは Web サーバであ っ て、 PDFlib で はあ り ません。 PDFlib は、 バ イ ト サービ ン グのための PDF フ ァ イ ルを作成 し ます。 バ イ ト サービ ン グ PDF の利点を活用す る には、 以下のすべての必要条件が満た さ れ る必要が あ り ます : > PDF文書が線形化 さ れてい る 必要があ り ます。こ れはPDF_begin_document( )のlinearize オプシ ョ ンで以下の よ う に実現で き ます : p.begin_document(outfilename, "linearize"); Acrobat では、 フ ァ イ ルが線形化 さ れてい る かは、 その文書プ ロ パテ ィ を見ればチ ェ ッ ク する こ と がで き ます (「Web 表示用に最適化 : はい」)。 > Web サーバがバ イ ト サービ ン グに対応 し てい る 必要があ り ます。 その基礎であ る バ イ ト レ ン ジプ ロ ト コ ルは HTTP 1.1 に含まれてい ますので、 現行のすべての Web ブ ラ ウ ザに実装 さ れてい ます。 > ユーザーがAcrobat を ブ ラ ウ ザプ ラ グ イ ン と し て用いてお り 、かつAcrobatでページ ご と のダ ウ ン ロ ー ド を有効に し てい る 必要があ り ます (「編集」 → 「環境設定」 → [ 「一般 ...」 → ] 「イ ン タ ーネ ッ ト 」 → 「Web 表示用に最適化を許可」)。 なお、 こ れはデフ ォ ル ト で有効にな っ てい ます。 PDF フ ァ イ ルが大 き い (ページ数か MB で数えて) ほ ど、 Web 上で転送 し た時の線形化の 効用は高ま り ます。 小 さ な フ ァ イ ルを線形化 線形化は、大 き な PDF 文書の Web ベース での表示を向上 さ せ る こ と を目的 と し てい ますので、 1 ページ し かない文書に対 し てはあ ま り 意味があ り ませ ん。 Acrobat 内のバグのため、 小 さ な線形化文書は、 線形化 さ れてい る と い う 扱いを受け ない こ と があ り ます。 た と えば、 Acrobat 9 以上では、 4KB 未満の文書を、 その実際の線 形化ス テー タ ス にかかわ ら ず、 非線型化であ る と 見な し ます。 線形化に必要な一時領域 PDFlib では、 線形化を行 う には、 まずその文書全体の作成が 完了す る 必要があ り ます。 線形化処理は、 文書の作成が完了 し た後に別個の段階 と し て行 われ る のです。 こ のため、 PDFlib で最適化を行 う には、 追加の格納領域が必要にな り ま す。 必要な一時領域はおお よ そ、 生成 さ れた文書 (線形化前の) と 同 じ 容量です。 PDFlib は線形化デー タ を、 PDF_begin_document( ) の inmemory オプシ ョ ンに従っ て、 メ モ リ 内 か一時デ ィ ス ク フ ァ イ ルの ど ち ら かに格納 し ます。 10.2 Web 最適化 (線形) PDF 277 10.3 タ グ付 き PDF の基礎 タ グ付き PDF は、 ISO 標準 PDF/UA ・ PDF/A-1a ・ PDF/A-2a ・ PDF/A-3a、 米国のセ ク シ ョ ン 508、 ド イ ツ の BITV、 その他多 く の法規におけ る 必須事項です。 タ グ付 き PDF は、 以 下の利点を提供す る 文書構造情報で PDF を向上 さ せます : > ア ク セシ ビ リ テ ィ : タ グ付 き PDF は、た と えば Acrobat 内蔵の読み上げ機能や、 よ り 高 度な ス ク リ ーン リ ーダ ソ フ ト ウ ェ ア (図 10.1 参照) な ど を通 じ て、 障碍を持つユー ザーのためにア ク セシブルです。 > ページ折 り 返 し : ページ表示を ウ ィ ン ド ウ ま たは ス ク リ ーン のサ イ ズに合わせ る ため に、 ページ コ ン テ ン ツ が動的に再組版 さ れ る こ と がで き ます。 非実質なページ コ ン テ ン ツ (いわゆ る ページ装飾) は、 折 り 返 し モー ド では表示 さ れ ません。 折 り 返 し モー ド では、 ページ上で表示を拡大 し て も 、 し じ ゅ う ス ク ロ ールす る 必要が生 じ ま せん。 ページ折 り 返 し は、 ア ク セシ ビ リ テ ィ のために重要であ り 、 ま た、 小 さ な画面を持つ モバ イ ルデバ イ ス上でページ表示を向上 さ せます。 > 他の文書形式への信頼性高い書 き出 し ・ 変換 : タ グ付き PDF を、 RTF ・ XML ・ HTML と いっ た他の形式へ変換す る と 、 よ り 正確な出力が得 ら れます。 PDF/UA は、 タ グ付き PDF を、 文書 タ グに関す る 必要条件を仕様化す る こ と で改良 し た も のです。 ア ク セシブルな PDF 文書を作成 し たいな ら 、 PDF/UA のための追加規則群に 従 う こ と を推奨 し ます : 詳 し く は 352 ページ 「11.6 PDF/UA に よ る ユニバーサルア ク セシ ビ リ テ ィ 」 を参照 し て く だ さ い。 すべての PDF/UA の必要条件には従え ない場合には (た と えば PDF/UA に準拠 し てい ない既存の PDF を元に文書を組み立てなければな ら ないな ど の理由で)、 PDF/UA モー ド を無効に し て、 で き る 限 り 多 く の PDF/UA 規則に従 う こ と を推奨 し ます。 図 10.1 画面上のテキス ト をキ ャ プ チ ャ し て点字デバイ ス上に表 示する ス ク リ ーン リ ーダ 278 第 10 章 : 文書交換 ク ッ ク ブ ッ ク タ グ付き PDF を生成する ための コ ー ド サン プルが、PDFlib ク ッ ク ブ ッ クの pdfua カ テ ゴ リ にあ り ます。 ク ッ ク ブ ッ ク内の タ グ付き PDF サン プルはすべて PDF/UA を作成 し ます。 10.3.1 論理構造ツ リ ー (構造 ヒ エ ラ ルキー) タ グ付 き PDF は、 ク ラ イ ア ン ト がその文書の内部構造に関す る 情報を提供 し 、 かつ PDF 出力を生成す る 際に特定の規則に従っ た場合にのみ作成で き ます。 タ グ付 き PDF を作成 す る には、 tagged 文書オプシ ョ ン を true に設定す る必要があ り 、 ま た、 lang オプシ ョ ン が推奨 さ れます : if (p.begin_document("tagged.pdf", "tagged=true lang=en") == -1) { throw new Exception("エラー : " + p.get_errmsg()); タ グ付 き PDF 文書内の論理構造は、エ レ メ ン ト の ヒ エ ラ ルキーに よ っ て記述 さ れます。 こ れを構造 ヒ エ ラ ルキー、 ま たは論理構造ツ リ ー、 あ る いは タ グ ツ リ ー と いい ます。 ルー ト レベル (Document エ レ メ ン ト と い う こ と も 多い) か ら 始ま っ て、 こ の構造 ヒ エ ラ ルキー は任意の数の レベルか ら 成 り ます。 各レベルにおいては、 1 個のエ レ メ ン ト は、 以下の種 類のア イ テ ム を 0 個以上含む こ と がで き ます : > 他の構造エ レ メ ン ト 。 た と えば Document (文書) エ レ メ ン ト は、 複数の Art (アーテ ィ ク ル) エ レ メ ン ト を含む こ と がで き、 各 Art エ レ メ ン ト は さ ら に、 複数の P (段落) エ レ メ ン ト を含む こ と がで き ます。 > 直接 コ ン テ ン ツ。 すなわち、 ページ上のテ キ ス ト 列 と グ ラ フ ィ ッ ク や、 取 り 込ま れた 画像か ら 作成 さ れた XObject な ど と いっ た コ ン テ ン ツ ア イ テ ム。 こ う し た ア イ テ ムは、 構造エ レ メ ン ト に関連づけ ら れた グ ラ フ ィ カルな コ ン テ ン ツ を表現 し ます。 > イ ン タ ラ ク テ ィ ブオブジ ェ ク ト 。 た と えば注釈やフ ォーム フ ィ ール ド 。 Acrobat におけ る構造 ヒ エ ラ ルキー の よ う に表示で き ます : タ グ名 と 構造 ヒ エ ラ ルキーは、Acrobat X/XI で以下 10.3 タ グ付き PDF の基礎 279 図 10.2 Acrobat の タ グパネルが 文書の論理構造ツ リ ーを表示 > 「表示」 → 「表示切 り 替え」 → 「ナビゲーシ ョ ンパネル」 → 「 タ グ」 を選択 (図 10.2 参照) 構造ツ リ ー を作成 構造エ レ メ ン ト は PDF_begin_item( ) 関数で作成で き ます。 こ の関数 は必ず、 照応す る PDF_end_item( ) への呼び出 し と ペアにする 必要があ り ます。 た と えば、 以下の コ ー ド 断片は、見出 し 1 個 と 段落 1 個を内容 と す る セ ク シ ョ ン 1 個か ら 成 る ヒ エ ラ ルキーを作成 し ます。 階層関係を イ ンデン ト で視覚化 し てい ます : /* 種別「Sect」(セクション)の構造エレメントを作成 */ id_sect = p.begin_item("Sect", "Title={来し方行く末}"); /* 種別「H1」 (見出し)の構造エレメントを作成 */ id_h1 = p.begin_item("H1", "Title={企業沿革}"); p.fit_textline(...); p.end_item(id_h1); /* 種別「P」(段落)の構造エレメントを作成 */ id_p = p.begin_item("P", ""); p.fit_textline(...); p.end_item(id_p); /* 「Sect」を閉じる */ p.end_item(id_sect); デフ ォ ル ト では、 構造エ レ メ ン ト は、 カ レ ン ト でア ク テ ィ ブな ア イ テ ムの子 と し て、 他の 子ア イ テ ムがすでに存在すればそれ ら すべての後に、 挿入 さ れます。 エ レ メ ン ト が論理的 280 第 10 章 : 文書交換 順序で作成 さ れ る な ら ば、 こ れに よ っ て正 し い ツ リ ー構造が得 ら れます。 も っ と 高度な技 法については 305 ページ 「10.4.4 コ ン テ ン ツ を順序に と ら われず作成」 を参照 し て く だ さ い。 構造エ レ メ ン ト は、 オプシ ョ ン を通 じ て与え ら れ る 1 個ない し 複数の属性を保持す る こ と がで き ます。 た と えば、 コ ン テ ン ツ エ レ メ ン ト の自然言語を指定する ための lang や、 画像に対す る 代替テ キ ス ト のための Alt です。 利用可能なオプシ ョ ンの集合は、 構造エ レ メ ン ト の種別に よ っ て異な り ます。 短縮 タ グ付け 多 く の場合において、 構造エ レ メ ン ト の コ ン テ ン ツは、 PDFlib はめ込み 関数を 1 回呼び出す こ と で作成す る こ と がで き ますので、結果 と し て典型的な並びは PDF_ begin_item( )/PDF_fit_*( )/PDF_end_item( ) と な り ます。 こ の並びは、 短縮 タ グ付け と い う 機能で削減す る こ と が可能です。ページ コ ン テ ン ツ を作成す る ための多 く の関数が対応 し てい る tag オプシ ョ ン を用い る こ と に よ っ て、 コ ン テ ン ツ を配置す る こ と と 、 タ グ付け情 報を与え る こ と と を、 ただ 1 回の関数呼び出 し に ま と め る こ と がで き ます。 上記の コー ド 断片は、 テ キ ス ト ・ 画像配置関数に tag オプシ ョ ン を与え る こ と に よ っ て削減で き ます : /* 種別「Sect」 (セクション)の構造エレメントを作成 */ id_sect = p.begin_item("Sect", "Title={来し方行く末}"); /* 種別「H1」(見出し)の構造エレメントを作成 */ p.fit_textline(..., "tag={tagname=H1 Title={企業沿革}}"); /* 種別「P」 (段落)の構造エレメントを作成 */ p.fit_textline(..., "tag={tagname=P}"); /* 「Sect」を閉じる */ p.end_item(id_sect); こ の tag オプシ ョ ンの具体的な動作は以下の と お り です : > 生成 さ れた コ ン テ ン ツ のために新規の構造エ レ メ ン ト が作成 さ れ、 そ し て呼び出 し か ら 返 る 前に閉 じ ら れます。 以下の状況は こ の規則か ら 除外 さ れます : >PDF_begin_document( ) で tag オプシ ョ ン を用いて作成 さ れた構造エ レ メ ン ト は、PDF_ end_document( ) で閉 じ ら れます。 >PDF_begin_item( )のtagオプシ ョ ン を用いて複数の タ グが与え ら れた と き は、こ れ ら す べての タ グは、 照応す る PDF_end_item( ) への呼び出 し で閉 じ ら れます。 > PDF_fit_table( ):tagname=Table ま たは PDF_fit_table( ) で Table に ロ ールマ ッ プ さ れてい る タ グ名は、 PDFlib に対 し て、 必要なテーブル タ グ群を作成す る よ う 指示 し ます (297 ページ 「10.4.1 自動表 タ グ付け」 参照)。 表セルに対 し て自動的に生成 さ れた TH ・ TD タ グは、 PDF_add_table_cell( ) の tag オプシ ョ ンで さ ら に修飾する こ と も で き ます。 > PDF_fit_textflow( ) : 完全な テ キ ス ト フ ロ ー イ ン ス タ ン ス は新規の構造エ レ メ ン ト を形 成 し ます。 > 生成 さ れ る エ レ メ ン ト は、カ レ ン ト でア ク テ ィ ブな ア イ テ ムの、ま たは parent オプシ ョ ンで与え ら れてい る ア イ テ ムの子です。 > グループ化エ レ メ ン ト は、PDF_begin_item( ) でのみ作成する こ と がで き 、他のいかな る 関数の tag オプシ ョ ン を用いて も 作成で き ませんが、 ただ し PDF_begin_document( ) は 例外です。 10.3 タ グ付き PDF の基礎 281 場合に よ っ ては、 短縮 タ グ付け を用いて、 ネ ス ト さ れた タ グ を作成す る こ と が必須、 ま た は便利です : その例については 300 ページ 「 リ ン ク と その他の注釈種別」 を参照 し て く だ さ い。 短縮 タ グ付けは、 生成 さ れ る 構造エ レ メ ン ト の ID を明か し ませんので、 こ れは PDF_ activate_item( ) と 、あ る いは tag オプシ ョ ンの parent サブオプシ ョ ン と と も には使え ませ ん。 なぜな ら こ れ ら は構造エ レ メ ン ト ID を必要 と す る か ら です。 10.3.2 標準 ・ カ ス タ ムエ レ メ ン ト 種別 標準エ レ メ ン ト 種別 PDF は、 幅広い文書分類に対応す る よ う 設計 さ れた多数の標準エ レ メ ン ト 種別に対応 し てい ます。 PDFlib は、 表 10.1 に従っ て こ れ ら すべての標準エ レ メ ン ト 種別に対応 し てい ます。 こ の表の中で示 し てい る説明は、 適切な種別を選ぶ助け と な る こ と を意図 し てい ます。 表 10.1 は ま た、 286 ページ 「ブ ロ ッ ク レベル構造エ レ メ ン ト と イ ン ラ イ ン構造エ レ メ ン ト 」 で説明す る BLSE/ILSE の区別 も 示 し てい ます。 グループ化エ レ メ ン ト は、他のエ レ メ ン ト 群を保持す る コ ン テナです。こ れは直接ペー ジ 要素 を 内容 と す る こ と は で き ま せ ん。 PDF が 完全 な 文書 を 内容 と す る 場合 に は、 Document エ レ メ ン ト を構造ツ リ ーのルー ト と し て用い るべ き です。 PDF が文書の一部分 を内容 と す る 場合には、 Part ・ Art ・ Sect ・ Div のいずれかをルー ト と し て用い る べ き です。 ルー ト エ レ メ ン ト は、 PDF_begin_document( ) の tag オプシ ョ ンで簡便に与え る こ と がで き ます。 擬似エ レ メ ン ト 種別は、 いかな る 構造エ レ メ ン ト を も 作成す る こ と な く 、 コ ン テ ン ツ を特定の特性でマー ク ア ッ プす る ために用い ら れます。 こ れは主に、 ページ装飾を マー ク ア ッ プする ために用い ら れます (288 ページ 「10.3.3 ページ装飾」 参照)。 表 10.1 タ グ付き PDF 内の標準エ レ メ ン ト 種別 ( タ グ) と 、 PDFlib によ っ て追加 さ れた擬似エ レ メ ン ト 種別 種別 説明 グループ化 ( コ ン テナ) エ レ メ ン ト Document (文書) 完全な文書。 構造ツ リ ーのルー ト エ レ メ ン ト と し て推奨 し ます Part (部分) アーテ ィ クル群またはセ ク シ ョ ン群を グループ化する ための、 文書の大規模な部分 Art (アーテ ィ クル) 単独の物語または解説を構成する、 比較的自己完結 し てい る テキス ト の本文 Sect (セ ク シ ョ ン) 関連する コ ン テ ン ツ エ レ メ ン ト 群を グループ化する ための コ ン テナ。 た と えばセ ク シ ョ ンは、 見出 し 1 個 と 、 い く つかの導入段落群 と 、 下位セ ク シ ョ ン群 と し てその中にネス ト さ れた 2 個以上の他のセ ク シ ョ ン を内容 と するか も し れません。 Div (分割) 一般的ブ ロ ッ ク レ ベルエ レ メ ン ト またはエ レ メ ン ト 群のグループ BlockQuote (ブ ロ ッ ク 引用) 周囲のテキス ト の作成者以外の誰かに帰する 1 個ない し 複数の段落から成る テキ ス ト の部分 Caption (キ ャ プ シ ョ ン) テーブルま たは図を説明する テキス ト の短い部分 TOC (目次) 目次項目群 (エ レ メ ン ト 種別 TOCI) および / または他のネス ト さ れた目次エ ン ト リ 群 (TOC) から成る リ ス ト 。 TOCI (目次項目) 目次の メ ンバ。 こ れは適切な Link エ レ メ ン ト を内容 と するべき です。 Index (イ ンデ ッ ク ス) 文書の主本文内におけ る指定 さ れた テキス ト の出現を指 し 示す Reference エ レ メ ン ト を伴っ た識別テキス ト を内容 と する項目の列 282 第 10 章 : 文書交換 表 10.1 タ グ付き PDF 内の標準エ レ メ ン ト 種別 ( タ グ) と 、 PDFlib によ っ て追加 さ れた擬似エ レ メ ン ト 種別 種別 説明 NonStruct (非構造エ レ メ ン ト ) 固有の構造上の意義を全 く 持たないグループ化エ レ メ ン ト 。 こ れはただグ ループ化の目的にのみ供 し ます。 こ の種別のエ レ メ ン ト は、 Div と は、 こ れは他の文書形式へ解釈 または書き出 し さ れない と い う 点において異な り ます。 し か し 、 こ の子孫群は通常どお り 処理 さ れます。 Private (プ ラ イ ベー ト エ レ メ ン ト ) ア プ リ ケーシ ョ ンに属する プ ラ イ ベー ト コ ン テ ン ツ を内容 と するグ ループ化エ レ メ ン ト 。 こ の種別の構造上の意義は仕様化 さ れていません。 こ の Private エ レ メ ン ト も、 その子孫エ レ メ ン ト のいずれも、 他の文書形式へは解釈も書き出 し も さ れません。 見出 し ・ 段落エ レ メ ン ト (BLSE) H (見出 し 。 PDF/UA では structuretype=strong の場合のみ) 文書の コ ン テ ン ツの下位分割部分のた めのラ ベル。 こ れは、 その親の最初の子であるべき です。 H エ レ メ ン ト は、 階層的なネス ト 化のた めに意図 さ れています。 H1~H6 特定のレ ベルを持つ見出 し 。 こ れは、 ア プ リ ケーシ ョ ンがセ ク シ ョ ン群を階層的にネス ト で き な いために見出 し のレ ベルを そのネス ト 化のレ ベルから 判定で き ない場合に用いるべき です。 H7 ・ H8~ 追加の見出 し レ ベルは、 H1 ~ H6 では足 り ない場合に用いる こ と がで き ます。 H7 等は ISO 32000-1 には含まれていませんが、 PDF/UA-1 で導入 さ れています。 P (段落) 一般的段落エ レ メ ン ト 、 すなわち、 見出 し ではないテキス ト の低レ ベルな分割部分 ラ ベル ・ リ ス ト エ レ メ ン ト (BLSE) L (箇条書き) 同様の意味 ・ 重要性を持 っ た項目の列 LI (箇条書き項目) 箇条書きの個々の メ ンバ Lbl ( ラ ベル) 同一箇条書き内で、 あ るいは同様の項目群の他のグループ内で、 あ る特定の項目を他か ら 区別する名前または番号。 た と えば、 ビ ュ レ ッ ト リ ス ト または番号付き リ ス ト では、 ビ ュ レ ッ ト キ ャ ラ ク タ またはその箇条書き項目の番号お よび伴 う 約物。 LBody (箇条書き ボデ ィ ) 箇条書き項目の説明コ ン テ ン ツ テーブルエ レ メ ン ト (すべてのテーブル タ グは自動的に作成可能です。 297ページ 「10.4.1 自動表 タ グ付け」 参 照) Table (テーブル。 BLSE) 長方形セルの 2 次元レ イ アウ ト で、 複雑な下部構造を持つ こ と も あ り ます TR (テーブル行) テーブル内の見出 し ま たはデー タ の表行 TH (テーブルヘ ッ ダセル) テーブルの 1 個ない し 複数のテーブル行または列を記述するヘ ッ ダ テキス ト を内容 と する テーブルセル TD (テーブルデー タ セル) テーブルの コ ン テ ン ツの一部であ るデー タ を内容 と する テーブルセル THead (テーブルヘ ッ ダ行グループ : PDF 1.5) テーブルのヘ ッ ダ を成すテーブル行のグループ TBody (テーブルボデ ィ 行グループ : PDF 1.5) テーブルの本体部を成すテーブル行のグループ TFoot (テーブルフ ッ タ 行グループ : PDF 1.5) テーブルの フ ッ タ を成すテーブル行のグループ イ ン ラ イ ン レ ベルエ レ メ ン ト (ILSE、 ただ し オプ シ ョ ンinline=falseでBLSEへ転換可能) Span (スパン。 テーブルのテーブル行または列の連結 と は関係あ り ません) 特定の固有の特性を何ら持 たない一般的な テキス ト のイ ン ラ イ ン部分。 Quote (引用) 周囲のテキス ト の作成者以外の誰かに帰する テキス ト のイ ン ラ イ ン部分。 こ の引用 さ れた テキス ト は、 単一の段落内に イ ン ラ イ ン で含まれてい るべき です。 こ れは、 1 個ない し 複数の段落 または他のエ レ メ ン ト から成る ブ ロ ッ ク レ ベルエ レ メ ン ト BlockQuote と は異な り ます。 10.3 タ グ付き PDF の基礎 283 表 10.1 タ グ付き PDF 内の標準エ レ メ ン ト 種別 ( タ グ) と 、 PDFlib によ っ て追加 さ れた擬似エ レ メ ン ト 種別 種別 説明 Note ( ノ ー ト ) 文書の本文内から参照 さ れる、 脚注や後注 と い っ た説明テキス ト のア イ テム。 こ のエ レ メ ン ト は Lbl を子 と し て持つ こ と がで き ます。 Reference (参照) 文書内のど こか別の場所にあ る コ ン テ ン ツへの言及 BibEntry (目録エ ン ト リ ) 何らかの言及 さ れた コ ン テ ン ツの外部ソ ース を識別する参照。 こ のエ レ メ ン ト は Lbl を子 と し て持つ こ と がで き ます。 Code ( コ ー ド ) コ ン ピ ュ ー タ プ ロ グ ラ ムのテキス ト フ ラ グ メ ン ト イ ン タ ラ ク テ ィ ブ要素のためのエ レ メ ン ト (ILSE) (300ページ 「10.4.2 イ ン タ ラ ク テ ィ ブ要素」 参照) Link ( リ ン ク) その ILSE の コ ン テ ン ツの一部分 と 、 1 個ない し 複数の照応する リ ン ク注釈 と の間の関連 付け Annot (注釈。 PDF 1.5) その ILSE の コ ン テ ン ツの一部分 と 、 1 個の照応する PDF 注釈 と の間の関連付け。 こ れは、 Link または Form のほ う が適切であ る場合以外、 すべての注釈に対 し て用い られるべき で す。 Form (フ ォ ーム) イ ン タ ラ ク テ ィ ブ フ ォ ーム フ ィ ール ド 。 イ ラ ス ト レーシ ョ ン エ レ メ ン ト (ILSE) Figure (図) グ ラ フ ィ カルな コ ン テ ン ツのア イ テム Formula (数式) 数式。 こ のエ レ メ ン ト 種別は、 コ ン テ ン ツ エ レ メ ン ト 全体を数式 と し て識別 し ます。 数式 が画像 と し て表 さ れている場合には、 Formula エ レ メ ン ト が依然用い られるべき です (Figure で はな く )。 和文ルビ ・ 割注のためのエ レ メ ン ト (ILSE。 PDF 1.5) Ruby よ り 小 さ な テキス ト サイ ズで書かれ、 それが参照する親文字テキス ト に隣接 し て配置 さ れたサイ ド ノ ー ト 。 こ の Ruby エ レ メ ン ト は、 ルビ組立構造全体を囲む ラ ッ パ と し ての働き を し ます。 RB (ルビ親文字テキス ト ) ルビ注釈が施 さ れる対象 と な る フ ルサイ ズのテキス ト 。 RT (ルビ注釈テキス ト ) ルビ親文字テキス ト に隣接 し て配置 さ れるべき、 よ り 小 さ なサイ ズのテキス ト。 RP (ルビ約物) ルビ注釈テキス ト を囲 う 約物。 こ れは、 ルビ注釈がルビ ス タ イルで適切に組版で きず に、 通常の コ メ ン ト と し て組版 さ れるか割注 と し て組版 さ れる場合にのみ用い ら れます。 Warichu (割注) よ り 小 さ な テキス ト サイ ズで、 それを含むテキス ト 行の高 さ の中に、 よ り 小 さ な 2 行 と し て組版 さ れ、 それが参照するベース テキス ト に後続 し て (イ ン ラ イ ンに) 配置 さ れる、 コ メ ン ト または注釈。 WT (割注テキス ト ) 割注 コ メ ン ト の、 2 行 と し て組版 さ れ、 それを囲 う WP エ レ メ ン ト の間に配置 さ れ る、 よ り 小 さ なサイ ズのテキス ト 。 WP (割注約物) WT テキス ト を囲 う 約物 擬似エ レ メ ン ト 種別 Artifact 実のページ コ ン テ ン ツから 区別 さ れるべき ページ装飾 (288 ページ 「10.3.3 ページ装飾」 参照)。 ASpan (ア ク セシ ビ リ テ ィ スパン。 PDF には Span と し て書き込まれますが、 イ ン ラ イ ン レ ベルア イ テム Span と は区別する必要があ り ます) 構造エ レ メ ン ト に属 し ない、 あるいは構造エ レ メ ン ト の一部 分であ る よ う な コ ン テ ン ツ に対 し て、 ア ク セシ ビ リ テ ィ 特性群を紐付けます。 こ の ASpan 擬似エ レ メ ン ト は、 Alt ・ ActualText ・ Lang ・ E と い っ たア ク セ シ ビ リ テ ィ 属性を持 っ た Span と し て書き 込まれます。 ASpan は、 いかな る構造エ レ メ ン ト と も紐付き ません。 284 第 10 章 : 文書交換 表 10.1 タ グ付き PDF 内の標準エ レ メ ン ト 種別 ( タ グ) と 、 PDFlib によ っ て追加 さ れた擬似エ レ メ ン ト 種別 種別 説明 ReversedChars (非推奨) 右書き用字系の中の、 反転 し たキ ャ ラ ク タ 群に よ る テキス ト を指定。 Clip (非推奨) マー ク さ れた切 り 抜き列を指定。 こ れは、 ク リ ッ ピ ン グパス またはテキス ト 表現モー ド 7 のテキス ト のみを内容 と する列であ り 、 目に見え るグ ラ フ ィ ッ ク ま たは PDF_save( )/PDF_ restore( ) を一切含みません。 構造エ レ メ ン ト に対す る ネ ス ト 規則 構造エ レ メ ン ト を作成す る にあ た っ ては、 さ ま ざ ま な規則に従 う 必要があ り ます。 こ れ ら の規則を表 10.2 に ま と めて あ り ます。 こ の規則 は、 列挙 し た標準エ レ メ ン ト 種別 と 、 各標準種別へ ロ ールマ ッ プ さ れた カ ス タ ムエ レ メ ン ト 種別 (287 ページ 「カ ス テ ムエ レ メ ン ト 種別 と ロ ールマ ッ プ」 参照) に対 し て適用 さ れ ます。 PDF/UA-1 には追加の規則群が適用 さ れます (352 ページ 「11.6 PDF/UA に よ る ユ ニバーサルア ク セシ ビ リ テ ィ 」 参照)。 新規構造エ レ メ ン ト に対す る ネ ス ト 規則は、 PDF_begin_document( ) の checktags オプ シ ョ ン を用いて無効に し た り 、 緩和 し た り する こ と も で き ます。 し か し こ れは、 無効な構 造 ヒ エ ラ ルキーを生み出す可能性があ り ますので推奨 し ません。 こ のオプシ ョ ンは、 レ ガ シアプ リ ケーシ ョ ンのための移行の助け と し て意図 さ れてい る も のです。 表 10.2 内のい く つかの規則を 「厳格規則」 と し て標識 し てい ます。 オプシ ョ ン checktags=relaxed は、 こ の厳格規則群以外のすべての規則を強制 し ます。 表 10.2 PDF_begin_item( ) と 、 さ ま ざ ま な関数の tag オプ シ ョ ンに対する タ グネス ト 規則 ア イ テム 規則 直接 コ ン テ ン ツ 以下のエ レ メ ン ト は、 直接ページ コ ン テ ン ツ、 すなわち テキス ト か画像かベ ク ト ルグ ラ フ ィ ッ ク を内容 と し て持つ こ と がで き ます : H, H1, ..., H6, H7, ... P Lbl, LBody TH, TD Span, Quote, Note, Reference, BibEntry, Code Link, Annot Figure, Formula RB, RT, RP, WT, WP Artifact, ASpan, ReversedChars, Clip こ れ以外のすべてのエ レ メ ン ト は、 直接ページ コ ン テ ン ツ を追加する前に、 中間構造エ レ メ ン ト を必須 と し ます。 直接 コ ン テ ン ツ を追加 し よ う と 試みた と き には、 PDFlib は例外を 発生 さ せます。 グループ化エ レ メ ント グループ化エ レ メ ン ト は、 直接 コ ン テ ン ツか ASpan か ILSE を子 と し て持 っ てはいけませ ん。 すなわち、 コ ン テ ン ツが作成で き る前に、 BLSE が作成 さ れる必要があ り ます : Document, Part, Art, Sect, Div, BlockQuote, Caption, TOC, TOCI, Index, NonStruct, Private 上記の規則に対する例外 と し て、 以下の ILSE は、 グループ化エ レ メ ン ト の子 と し て許容 さ れます : Figure, Formula, Form, Link, Annot 10.3 タ グ付き PDF の基礎 285 表 10.2 PDF_begin_item( ) と 、 さ ま ざ ま な関数の tag オプ シ ョ ンに対する タ グネス ト 規則 ア イ テム 規則 ブ ロ ッ ク レ ベル エレ メ ン ト 以下のブ ロ ッ ク レ ベルエ レ メ ン ト は、 直接 コ ン テ ン ツ を子 と し て持っ てはいけません。 す なわち、 コ ン テ ン ツが作成で き る前に、 然るべき グループ化エ レ メ ン ト か BLSE が作成 さ れる必要があ り ます : L, LI, Table, TR, THead, TFoot, TBody 厳格規則 : P エ レ メ ン ト はグループ化エ レ メ ン ト を内容 と し て持つ こ と がで き ません。 擬似 ・ イ ン ラ イ ン エレ メ ン ト 擬似エ レ メ ン ト (すなわち Artifact, ASpan, ReversedChars, Clip) と 、 以下の ILSE は、 子孫を一切持っ てはいけません : Code, BibEntry, Note, Quote, Reference, Span ただ し こ れ らのエ レ メ ン ト は、 inline=false の場合には子を持つ こ と がで き ます。 表エ レ メ ン ト Table エ レ メ ン ト は、 1 個ない し 複数の TR エ レ メ ン ト を、 あ るいは 1 個のオプ シ ョ ナルな THead に続けてその後の 1 個ない し 複数の TBody エ レ メ ン ト と 1 個のオプ シ ョ ナルな TFoot と を、 内容 と し て持つ こ と がで き ます。 こ れに加えて Table エ レ メ ン ト は、 1 個の Caption エ レ メ ン ト を、 その最初または最後の子 と し て持つ こ と も で き ます。 TH ・ TD エ レ メ ン ト は、 TR ・ TH ・ TD ・ THead ・ TBody ・ TFoot を内容 と し て持つ こ と はで き ま せん。 THead ・ TBody ・ TFoot エ レ メ ン ト は、 TR エ レ メ ン ト のみを内容 と する こ と がで き、 かつ Table のみを親 と する こ と がで き ます。 TR は、 Table ・ THead ・ TBody ・ TFoot のみを親 と する こ と がで き ます。 リ ス ト エレ メ ン ト L エ レ メ ン ト は、 オプ シ ョ ナルに 1 個の Caption エ レ メ ン ト を、 ま た 1 個ない し 複数の LI エ レ メ ン ト を内容 と し て持つ こ と がで き ます。 LI エ レ メ ン ト は、 1 個ない し 複数の Lbl または LBody エ レ メ ン ト を、 あるいは両方を内容 と し て持つ こ と がで き ます。 LI は L のみを親 と する こ と がで き ます。 LBody は LI のみを親 と する こ と がで き ます。 目次 TOC エ レ メ ン ト は、 1 個のオプ シ ョ ナルな Caption エ レ メ ン ト を最初の子 と し て、 また 1 個 ない し 複数の TOCI および TOC エ レ メ ン ト を (組み合わせで も)、 内容 と し て持つ こ と がで き ます。 TOCI エ レ メ ン ト は、 Lbl ・ Reference ・ NonStruct ・ P ・ TOC エ レ メ ン ト のみを内容 と する こ と がで き ます。 TOCI は TOC のみを親 と する こ と がで き ます。 ラ ベルエ レ メ ン ト Lbl は、 LI ・ TOCI ・ BibEntry ・ Note のみを親 と する こ と がで き ます。 インタ ラクテ ィ ブ 要素 : リ ン ク ・ フ ォ ーム フ ィ ール ド ・ 注釈 以下のエ レ メ ン ト 種別は、 PDF_create_field( ) ・ PDF_create_annotation( ) の tag オプ シ ョ ンに 対 し ては、 あ るいは Link ・ Annot ・ Form に対する親 と し ては許容 さ れません : 表エ レ メ ン ト 、 ILSE、 ルビ ・ 割注エ レ メ ン ト 、 擬似エ レ メ ン ト 。 Annot エ レ メ ン ト はネス ト で き ません。 Link エ レ メ ン ト はネス ト で き ません。 Form エ レ メ ン ト は、 PDF_create_field( ) に よ っ て自動的に作成 さ れる OBJR エ レ メ ン ト 以外 のエ レ メ ン ト を内容 と し て持っ てはいけません。 和文ルビ ・ 割注 Ruby は RB ・ RT ・ RP を子 と し て持つ こ と がで き ますが、 それ以外のエ レ メ ン ト 種別を子 と し て持っ てはいけません。 Warichu は WT ・ WP を子 と し て持つ こ と がで き ますが、 それ以外のエ レ メ ン ト 種別を子 と し て持 っ てはいけません。 ブ ロ ッ ク レ ベル構造エ レ メ ン ト と イ ン ラ イ ン構造エ レ メ ン ト ブ ロ ッ ク レベル構造エ レ メ ン ト (BLSE) は、 ページ上に配置 さ れ る コ ン テ ン ツ の フ ラ グ メ ン ト であ り 、 一方 イ ン ラ イ ン レベル構造エ レ メ ン ト (ILSE) は、 特定の書式や動作を持つ、 コ ン テ ン ツの、 よ り 286 第 10 章 : 文書交換 小 さ な素片です。 BLSE と ILSE は表 10.1 で示 し てい ます。 その区別は、 い く つかの タ グ 付けオプシ ョ ンに対 し て意味を持ち ます。 詳 し く は PDFlib リ フ ァ レ ン ス を参照 し て く だ さ い。 その他の違いを表 10.3 に挙げます。 エ レ メ ン ト 種別 BibEntry ・ Code ・ Note ・ Quote ・ Reference ・ Span の通常か イ ン ラ イ ンかの ス テー タ ス は、 PDF_begin_item( ) の inline オプシ ョ ンで、 ま たは tag オプシ ョ ンで変え る こ と も で き ます。 ア ク セシ ビ リ テ ィ ス パン を強制的に通常 (inline=false) にす る こ と は、 た と えば、 複数ページに分割 さ れてい る 段落が複数言語を含んでい る 時に推奨 さ れ ます。 あ る いは、 その ア イ テ ム を閉 じ て、 次のページで新規のア イ テ ム を始め る こ と も 可能で す。 イ ン ラ イ ン ア イ テ ムは、 それが開かれたページ上で閉 じ る必要があ り ます。 表 10.3 通常ア イ テム と イ ン ラ イ ン ア イ テム 通常ア イ テム 対象ア イ テム イ ン ラ イ ン ア イ テム グループ化エ レ メ ン ト と BLSE ILSE と 擬似エ レ メ ン ト 通常 / イ ン ラ イ ン ス テー タ スが変更可能 × Code, BibEntry, Note, Quote, Reference, Span のみ 構造ツ リ ーの一部であ る ○ 通常 ×、 ただ し 以下を除 く : Figure, Formula, Form, Link, Annot ページ境界を ま た ぐ こ と が可能 ○ × 他のア イ テムで割 り 込む こ と が可能 ○ × PDF_activate_item( ) で有効にする こ と が 可能 ○ × ネス ト 可能 ○ 他のイ ン ラ イ ン ア イ テム と のみ プ ロ グ ラ ミ ン グス コ ープ と ページ境界 多 く の構造エ レ メ ン ト は、 ページ ス コ ープ内で のみ作成で き ます。 ただ し 、 グループ化エ レ メ ン ト は文書ス コ ープ内で も 作成で き ます。 イ ン ラ イ ン ア イ テ ム と 擬似ア イ テ ムは、 ページ を閉 じ る か一時停止す る 前に閉 じ る 必 要があ り ます。こ れ と 異な り 、他のエ レ メ ン ト 種別はページ境界を ま た ぐ こ と が可能です。 カ ス テムエ レ メ ン ト 種別 と ロ ールマ ッ プ 表 10.1 に挙げた定義済み標準構造エ レ メ ン ト に加え て、 カ ス タ ムエ レ メ ン ト 種別名を用い る こ と も で き ます。 カ ス タ ム エ レ メ ン ト 種別 名は通常、エ レ メ ン ト 種別名を ロ ーカ ラ イ ズ し た り (た と えば ド イ ツ語 Abbildung が Figure にマ ッ プ)、 アプ リ ケーシ ョ ン独自の種別名で作業 し た り (た と えば Normal が P にマ ッ プ) す る ために用い ら れます。 カ ス タ ム エ レ メ ン ト 種別名を含んだ文書の再利用を可能に す る ためには、 そのカ ス タ ム名を、 標準構造エ レ メ ン ト 種別の集合の中の、 それ と 正確に ない し おおむね同等の も のへマ ッ プす る 必要があ り ます。 ま た、 標準エ レ メ ン ト 種別を、 その意味付け を変更す る ために他の標準種別へ再マ ッ プす る こ と も 可能です。カ ス タ ムエ レ メ ン ト 種別は、 イ ン ラ イ ンエ レ メ ン ト ・ 擬似エ レ メ ン ト へはマ ッ プで き ません。 エ レ メ ン ト マ ッ ピ ン グは rolemap 文書オプシ ョ ンで実現で き ます。 た と えば p.begin_document("tagged.pdf", "tagged=true lang=en rolemap={ {Heading H1} {Subhead H2} {Paragraph P} }"); Acrobat におけ る ロ ールマ ッ プ 集で き ます : ロ ールマ ッ プは、 Acrobat X/XI で以下の よ う に表示 ・ 編 10.3 タ グ付き PDF の基礎 287 > 「表示」 → 「表示切 り 替え」 → 「ナビゲーシ ョ ンパネル」 → 「 タ グ」 を選択 し 、 「 タ グ」 パネルの上端にあ る メ ニ ュ ーボ タ ン を ク リ ッ ク し て、 ド ロ ッ プダ ウ ン リ ス ト か ら 「ロー ルマ ッ プ を編集」 を選択 10.3.3 ページ装飾 実質的な コ ン テ ン ツ と ページ装飾 ページの さ ま ざ ま な コ ン テ ン ツ は、 以下の カ テ ゴ リ のいずれかにあ ては ま り ます : > 実質的な コ ン テ ン ツ。 文書作成者に よ っ て、 その文書の意味を伝え る ために作成 さ れ てい ます。 その文書の論理構造ツ リ ーは、 実際の コ ン テ ン ツ を成すオブジ ェ ク ト 群を 記述 し てい る ほか、 注釈 も 含む場合があ り ます。 > 実質的なページ コ ン テ ン ツ に貢献 し てお ら ず、 ページネーシ ョ ン ま たは レ イ ア ウ ト 目 的のために作成 さ れてい る グ ラ フ ィ ッ ク ま たはテ キ ス ト オブジ ェ ク ト を、 ページ装飾 と いい ます。ページ装飾は、構造ツ リ ー内に含まれてお ら ず、 ス ク リ ーン リ ーダに よ っ て読み上げ ら れません。 ページ装飾を標識す る こ と は、テ キ ス ト 折 り 返 し と ア ク セシ ビ リ テ ィ を向上 さ せ る ために 強 く 推奨 さ れ、 ま た PDF/UA では必須です。 典型的なページ装飾は、 反復 さ れ る ヘ ッ ダ ・ フ ッ タ 、 ページ番号、 背景画像、 その他各ページ上で反復 さ れ る ア イ テ ムです。 Acrobat におけ る ページ装飾 ページ装飾は、 Acrobat X/XI で以下の方式のいずれかで チ ェ ッ ク で き ます : > 「ツール」 → 「ア ク セシ ビ リ テ ィ 」 → 「TouchUp 読み上げ順序」 を選択す る と 、 ページ 上の コ ン テ ン ツ エ レ メ ン ト を 表示 ま た は編集で き ま す。 ペー ジ装飾は、 Acrobat の 「TouchUp 読み上げ順序 (TURO)」 ツール内では 「背景」 と 呼ばれてい ます。 こ れは構 造エ レ メ ン ト と は異な り 、 TURO を ア ク テ ィ ブに し た際にふち と タ グ名を用いて視覚 化 さ れません。 > ページ装飾を識別す る には、 「表示」 → 「表示切 り 替え」 → 「ナ ビ ゲーシ ョ ンパネル」 → 「 コ ン テ ン ツ」 を選択 し ます。 「 コ ン テ ン ツ」 パネルには、 すべてのページ コ ン テ ン ツ が、 それぞれの構造エ レ メ ン ト 種別名ま たは 「ページ装飾」 のいずれか適切なほ う と と も に一覧表示 さ れ ます。 ページ装飾は読み上げ ら れ ませんので、 ページ上に、 照 応す る 番号付 き ブ ロ ッ ク はあ り ません。 ただ し 、 こ の一覧内のページ装飾を ク リ ッ ク す る と 、 その照応す る 、 ページ上の コ ン テ ン ツ エ レ メ ン ト がハ イ ラ イ ト さ れます。 > ページ装飾を検索 : 「表示」 → 「表示切 り 替え」 → 「ナビゲーシ ョ ンパネル」 → 「 タ グ」 を選択 し 、 「 タ グ」 パネルの上端にあ る メ ニ ュ ーボ タ ン を ク リ ッ ク し て、 「検索 ...」 の 後、 ド ロ ッ プダ ウ ン リ ス ト か ら 「ページ装飾」 を選択 し ます。 ページ装飾は文書構造 の一部分ではあ り ませんので、 タ グナ ビ ゲーシ ョ ンパネルに も 順序パネルに も 、 照応 す る エン ト リ はあ り ません。 > 「表示」 → 「読み上げ ...」 を有効にする と 、 Acrobat がページ上の構造エ レ メ ン ト を読み 上げ る こ と がで き る よ う にな り ます。 ページ装飾は読み上げ ら れません。 コ ン テ ン ツ を ページ装飾 と し て指定 ページ装飾は、 PDFlib で、 PDF_begin_item( ) 内で Artifact タ グ名で指定す る こ と がで き ます (ページ装飾は構造エ レ メ ン ト の意味において は本当は タ グではない と い う こ と は さ ておき ) : id = p.begin_item("Artifact", ""); あ る いは、 ページ装飾は、 短縮 タ グ付けで、 すなわち さ ま ざ ま な関数の tag オプシ ョ ンで 指定する こ と も で き ます : 288 第 10 章 : 文書交換 p.fit_textline(text, x, y, "tag={tagname=Artifact}"); ページ装飾を分類 非 実 質 的 な ペ ー ジ コ ン テ ン ツ は、 Artifact 擬似 タ グ で 識別 し 、 artifacttype オプシ ョ ンの以下のキーワ ー ド の う ちのいずれか 1 つに従っ て分類す る必要 があ り ます : > Pagination (ページネーシ ョ ン) ページ装飾 : ラ ン ニ ン グヘ ッ ド やページ番号 と いっ た ページ機能群。 ページ ネーシ ョ ンページ装飾は、 artifactsubtype オプシ ョ ン と 、 キー ワ ー ド Header ・ Footer ・ Watermark の う ちのいずれか 1 つで さ ら に分類で き ます。 > Layout (レ イ ア ウ ト ) ページ装飾 : 罫線や表シ ェ ーデ ィ ン グ と い っ た タ イ ポ グ ラ フ ィ ま たはデザ イ ン要素。 > Page (ページ) ページ装飾 : 補助、 た と えば ト ン ボやカ ラ ーバーな ど。 > Background (背景) ページ装飾 : ページの幅 ま たは高 さ い っぱいに、 あ る いは構造エ レ メ ン ト の寸法い っぱいに伸び る 画像ま たは色付 き領域。 ページ ネーシ ョ ン ページ装飾 と 背景ページ装飾では、 ど のページ辺な い し ページ辺群 (Top/Bottom/Left/Right)にそのページ装飾が付着 し てい る かを指定す る Attachedオプシ ョ ンが使え ます。 こ の属性は、 ページ折 り 返 し を向上 さ せる ために Acrobat に よ っ て用い ら れ る こ と がで き ます。 以下の例は、 下位種別 Header を持つページネーシ ョ ンページ装飾を作成 し ます : id = p.begin_item("Artifact", "artifacttype=Pagination artifactsubtype=Header Attached={Top Left}"); 自動ページ装飾 タ グ付け すべてのページ コ ン テ ン ツ は、 構造エ レ メ ン ト かページ装飾 のいずれか と し て タ グ付け さ れてい る べ き ですので、 PDFlib は自動的に、 あ る 種のグ ラ フ ィ ッ カルな要素群に タ グ付け を行い ます。 以下の装飾要素は、 タ グ付 き PDF モー ド で は自動的に、 artifacttype= Layout を持つ Artifact と し て タ グ付け さ れます : > ブ ロ ッ ク 装飾 : PDF_fill_*block( ) に よ っ て作成 さ れ るすべての装飾要素、 すなわち backgroundcolor ・ bordercolor プ ロ パテ ィ に従っ て作成 さ れ る 描線 と 塗 り 。 > 範囲枠装飾 : 範囲枠オプシ ョ ン fillcolor ・ shading ・ strokecolor に従っ て作成 さ れ る範囲 枠長方形。 > 表装飾 : 自動表 タ グ付けが有効の場合には (297 ページ 「10.4.1 自動表 タ グ付け」 参 照)、表装飾、すなわちオプシ ョ ン fill・stroke・showborder・showgrid に従っ た描線・塗 り 。 > テ キ ス ト 行ページ装飾 : leader ・ shadow ・ showbox > テ キ ス ト フ ロ ーページ装飾 : leader ・ shadow ・ showbox ・ showtabs > テ キ ス ト 装飾 : underline ・ overline ・ strikeout すべての タ グ付 き PDF 機能同様、 自動ページ装飾 タ グ付けはページ ス コ ープ内でのみ動 作 し ます。 10.3.4 テキス ト 処理 言語指定 タ グ付 き PDF では、 テ キ ス ト の自然言語は明示的に指定 さ れ るべ き です : こ れに よ っ て、 い く つかの ス ク リ ーン リ ーダが、 その文書を読み上げてい る 時に、 適切な言 語へ切 り 替わ る こ と が可能にな り ます。 こ の自然言語は、 さ ま ざ ま な レベル上で指定す る こ と がで き ます : > PDF_begin_document( ) の lang オプシ ョ ン を、主要言語、すなわちその文書の全体 と し ての自然言語を指定す る ために設定す る べ き です。 こ れは、 多言語文書、 た と えば対 訳を内容 と す る 契約書な ど に対 し ては設定す る べ き ではあ り ません。 10.3 タ グ付き PDF の基礎 289 > こ の文書言語は、 任意の構造 レ ベル上に あ る 個別の ア イ テ ム につい て、 PDF_begin_ item( ) の lang オプシ ョ ンで、 ま たは さ ま ざ ま な関数の tag オプシ ョ ンでオーバ ラ イ ド す る こ と も で き ます。 > ハ イ パーテ キ ス ト 文字列は、言語を指定す る ための Unicode エ ス ケープシーケ ン ス を含 む こ と も で き ます (後述)。 テ キ ス ト と し て符号化 さ れなが ら 、 し か し 自然言語の一部分ではない コ ン テ ン ツ、 た と え ばプ ロ グ ラ ミ ン グ コ ー ド 、 音符、 書体サンプル、 数式な どは、 空の言語 コー ド を用い るべ き です。 例 : lang={ } Unicode 言語識別子は、 以下の並びか ら 成っ てい ます : > Unicode 値 U+001B (2 バ イ ト ) > ISO 639 言語コ ー ド 1 個 (2 ASCII バ イ ト )。 例 : en ・ ja ・ de > オプシ ョ ナルに、 ISO 3166 国 コ ー ド 1 個 (2 ASCII バ イ ト )。 例 : US ・ JP > Unicode 値 U+001B (2 バ イ ト ) 16 進表記での例 : 001B656E5553001B 001B7A68001B 001B6465001B (=enUS) (=zh) (=de) Java の よ う な Unicode 対応言語では、こ の 2 個の ASCII キ ャ ラ ク タ は ま と めて 1 個の Unicode 値 と する 必要があ り ます : \u001B\u6465\u001B (=de) C 言語では、 こ の 2 個の ASCII キ ャ ラ ク タ は ま と めて 1 個の Unicode 値 と す る 必要があ り ます。 charref=true の場合、 こ の並びは以下の よ う に表現で き ます : 摥 (=de) テキス ト フ ロ ー を持つ タ グ付き PDF を生成 テ キ ス ト フ ロ ー機能 (221 ページ 「8.2 複数 行のテ キ ス ト フ ロ ー」 参照) は、 テ キ ス ト 組版のための強力な機能群を提供 し ます。 個別 のテ キ ス ト フ ラ グ メ ン ト は ク ラ イ ア ン ト 制御下ではな く な り 、PDFlib に よ っ て自動的に組 版 さ れますので、 テ キ ス ト フ ロ ーを持つ タ グ付き PDF を生成す る際にはい く ら か注意を 払 う 必要があ り ます : > 単一のテ キ ス ト フ ロ ーはめ込み枠の内容全体を構造エ レ メ ン ト の一部分 と す る こ と は で き ます。 し か し 、 テ キ ス ト フ ロ ー枠が個別の構造エ レ メ ン ト を内容 と す る こ と はで き ません。 > 1 個のテ キ ス ト フ ロ ーのすべての部分 (あ る 特定のテ キ ス ト フ ロ ーハン ド ルでの PDF_ fit_textflow( ) へのすべての呼び出 し ) は、 単一の構造エ レ メ ン ト の中に含まれ るべ き です。 > 1 個のテ キ ス ト フ ロ ーの各部分が複数のページにわた る 場合があ り 、それ ら のページは 他の構造ア イ テ ム群を含んでい る 可能性があ り ますので、 適切な親ア イ テ ム を選択す る こ と に注意を払 う べ き です (parent オプシ ョ ン と し て -1 を用い る のではな く 。 そ う し て し ま う と 、 誤っ た親エ レ メ ン ト を指 し 示すおそれがあ り ます)。 > テ キ ス ト フ ロ ー内に リ ン ク やその他の注釈 を 作成す る た めに範囲枠機能 を 用い る 場 合、 こ の注釈を構造ツ リ ー内に正 し く 位置付け る こ と は困難です。 290 第 10 章 : 文書交換 単語間を空白キ ャ ラ ク タ で区切る 単語は空白キ ャ ラ ク タ (U+0020) で区切 る べ き です。 autospace オプシ ョ ン を用い る と 、 テ キ ス ト 出力関数群の う ちのいずれかへのそれぞれの 呼び出 し の後に、 自動的に空白キ ャ ラ ク タ を生成 さ せ る こ と がで き ます。 ハ イ フ ネーシ ョ ン ハ イ フ ネーシ ョ ン、 すなわち 1 つの単語を行末で 2 つの部分に分割 す る こ と は、 ハー ド ハ イ フ ン (U+002D) ではな く 、 ソ フ ト ハ イ フ ン キ ャ ラ ク タ (U+00AD) を用いて表現 さ れ る 必要があ り ま す。 こ の ソ フ ト ハ イ フ ン キ ャ ラ ク タ が用い ら れていれ ば、 Acrobat は、 テ キ ス ト を検索す る 際に、 ハ イ フ ネーシ ョ ン さ れた単語を正 し く 再結合 (デハ イ フ ネーシ ョ ン) す る こ と がで き 、 ま た、 折 り 返 し は、 組みが変わ っ たためにその 行が改行 さ れな く な っ た場合に、表示のためのハ イ フ ン キ ャ ラ ク タ を除去す る こ と がで き ます。 テ キ ス ト が ソ フ ト ハ イ フ ン U+00AD を含んでい る と き には、 PDFlib のテ キ ス ト エン ジ ンは、 U+00AD に対す る グ リ フ がその フ ォ ン ト 内で得 ら れ る場合にはそれを、 そ う でな いな ら U+002D を用い ます。 その フ ォ ン ト が U+00AD と U+002D に対 し て別々のグ リ フ を 持っ てい る 場合には、 ソ フ ト ハ イ フ ン U+00AD を テ キ ス ト 内で使用すれば、 ハ イ フ ネー シ ョ ンのための タ グ付 き PDF の必要条件を満たすには充分です。 その フ ォ ン ト が U+00AD に対す る 別個のグ リ フ を持っ ていない (あ る いは別のハ イ フ ネーシ ョ ン キ ャ ラ ク タ が用い ら れてい る ) 場合には、 そのハ イ フ ン を、 U+00AD を内容 と す る ActualText 属性を持っ た Span か ASpan で タ グ付けす る 必要があ り ます (ただ し PDF 1.4 では こ れは可能ではあ り ません)。テ キ ス ト フ ロ ーを用いて複数行テ キ ス ト が作成 さ れ る 際には、 こ の ActualText は、 指定 さ れた hyphenchar に自動的に割 り 当て ら れます (か つ autospace は抑止 さ れます)。 テ キ ス ト 行に対 し て必要な ActualText を付け る こ と は以下の よ う に達成で き ます : > PDF_fit_textline( ) でオプシ ョ ン tagtrailinghyphen を指定すれば、然る べき ActualText が 付き 、 かつ autospace が抑制 さ れます。 こ のオプシ ョ ンのデフ ォ ル ト は U+00AD です ので、 そのテ キ ス ト がハ イ フ ン と し て U+00AD を用いてい る場合には、 正 し い タ グ付 けが自動的に行われます。 > フ ォ ン ト が U+00AD に対す る 別個のグ リ フ を持っ ていない場合には、然 る べ き 予備フ ォ ン ト か ら の ソ フ ト ハ イ フ ン を用いて こ れを修正す る こ と も で き ます。 以下の フ ォ ン ト 読み込みオプシ ョ ン を用い ます : fallbackfonts={{fontname=AuxiliaryFont encoding=unicode embedding forcechars=x00AD}} > 然 る べ き ActualText を手動で割 り 当て る には以下の よ う に し ます。ただ し 、こ れが必要 なのは、 その フ ォ ン ト が U+00AD と U+002D に対 し て 2 個の別々のグ リ フ を持っ てい ない場合のみであ る こ と に留意 し て く だ さ い ( こ の技法は PDF 1.5 以上を必要 と し ま す。 PDF 1.4 の場合には inline=false を用いて く だ さ い) : p.set_option("charref=true"); p.fit_textline("-", x, y, "tag={tagname=ASpan ActualText=­}"); Type 3 フ ォ ン ト の特性 タ グ付 き PDF 文書内で用い ら れ る すべての Type 3 フ ォ ン ト につ いて、 PDF_begin_font( ) の familyname ・ stretch ・ weight オプシ ョ ンに妥当な値を与え る 必要があ り ます。 10.3.5 代替テキス ト ・ 置換テキス ト ・ 略語拡張 タ グ付 き PDF は、 追加情報な し では容易に読めない画像 ・ テ キ ス ト のア ク セシ ビ リ テ ィ を向上 さ せ る 機能群を提供 し てい ます。 10.3 タ グ付き PDF の基礎 291 代替テキス ト (Alt) テ キ ス ト へ自然に翻訳 さ れない画像 ・ 数式その他のア イ テ ムに、 代 替説明を Alt オプシ ョ ン を通 じ て割 り 当て る こ と がで き ます。 与え ら れ る値は、 その構造 エ レ メ ン ト と そのすべての子の説明を提供 し ます。 こ の代替説明は、 1 個の ま る ご と の単 語ない し 句か ら 成 る べ き です。 その末尾は、 ス ク リ ーン リ ーダがそれを後続テ キ ス ト と 合 体 さ せて し ま わない よ う 、 ピ リ オ ド か空白キ ャ ラ ク タ かいずれか適切なほ う と す る べ き で す。 「 こ の画像の内容は …」 と いっ た先頭句は、 代替テ キ ス ト 内では避け る こ と を推奨 し ます。 た と えば、PDFlib 企業 ロ ゴの画像を、Alt オプシ ョ ン を通 じ て説明 し て も よ いで し ょ う : p.fit_image(image, x, y, "tag={tagname=Figure Alt={PDFlib企業ロゴ}}") 置換テキス ト (ActualText) PDF 内でテ キ ス ト と し て表現 さ れていて も 、 そのテ キ ス ト を、 図内の ス ワ ッ シ ュ キ ャ ラ ク タ や、 ド ロ ッ プキ ャ ッ プな ど、 何 ら かの非標準的な方式で 用いてい る ア イ テ ムについては、代替テ キ ス ト を ActualText オプシ ョ ン を通 じ て割 り 当て る こ と がで き ます。 与え ら れ る 値は、 その構造エ レ メ ン ト と そのすべての子に対す る 代替 と し ての役割を果た し ます。 こ の代替テ キ ス ト は、 1 個ない し 複数のキ ャ ラ ク タ を内容 と す る こ と がで き ます (1 個の単語ない し 句を内容 と する Alt 属性 と は異な り ます)。 こ れ は、 人がその コ ン テ ン ツ を見た時に見え る も の と 同等のテ キ ス ト を提供する べき です。 た と えば、 対応す る Unicode 値が全 く 得 ら れない記号 flower グ リ フ に対 し て、 適切な ActualText を割 り 当て る こ と で、 こ のグ リ フ が実際にはビ ュ レ ッ ト キ ャ ラ ク タ U+2022 と し て用い ら れてい る こ と を明 ら かにする こ と がで き ます : p.fit_textline("&.flower;", x, y, "tag={tagname=ASpan ActualText={•} } ..."); 代替テキス ト と 置換テキス ト に対す る ネ ス ト 規則 Alt ・ ActualText 属性を用い る際には、 以下の規則に従 う 必要があ り ます : > Alt と ActualText は、対象構造エ レ メ ン ト 配下の下位 ヒ エ ラ ルキー全体を覆い ますので、 そ の構造エ レ メ ン ト の構造 ヒ エ ラ ル キ ー内の いずれか の祖先がすで に Alt 属性か ActualText 属性を含んでい る 場合には、 ど ち ら の属性 も 許容 さ れません。 > Alt か ActualText 属性を持つエ レ メ ン ト は、直接 コ ン テ ン ツ か、1 個ない し 複数の Link エ レ メ ン ト を内容 と し て持つ必要があ り ます。 こ の属性が Link エ レ メ ン ト に適用 さ れ る 場合には、 それは、 直接 コ ン テ ン ツか、 PDF_create_annotation( ) に よ っ て作成 さ れた 1 個ない し 複数の OBJR エ レ メ ン ト を内容 と し て持つ必要があ り ます (300 ページ 「 リ ン ク と その他の注釈種別」 参照)。 そ う でない と 、 その属性が ど のページ上で読み上げ ら れ る べ き なのか を決定す る こ と が不可能にな り ます。 こ の規則は当該エ レ メ ン ト 自 体に適用 さ れ ます : 直接 コ ン テ ン ツ を持つ子エ レ メ ン ト を持っ ていて も 充分ではあ り ません。 エ レ メ ン ト を用いて、 構造エ レ メ ン ト の何 ら かの部分に Alt か ActualText を割 り 当て る こ と も で き ます。 Acrobat におけ る代替 ・ 置換テキス ト 構造エ レ メ ン ト の Alt・ActualText 属性は、Acrobat X/XI で以下の よ う に表示で き ます : > 「表示」 → 「表示切 り 替え」 → 「ナビゲーシ ョ ンパネル」 → 「 タ グ」 を選択 し 、 ヒ エ ラ ルキー内の構造エ レ メ ン ト を右 ク リ ッ ク し て、 「プ ロパテ ィ ...」 を 選択す る と 、 オブ ジ ェ ク ト プ ロ パテ ィ ダ イ ア ロ グが表示 さ れます。 「 タ グ」 タ ブに、 「実際のテキス ト 」 ・ 「代替テキス ト 」 属性が表示 さ れてい ます。 292 第 10 章 : 文書交換 7 1 1 2 6 5 3 2 図 10.3 論理読み取 り 順序 (左) と 印刷ス ト リ ー ム順序 (右) 5 8 3 4 4 8 6 7 略語拡張 (E) 略語 と 頭字語には、 拡張テ キ ス ト を、 tag オプシ ョ ンの E サブオプシ ョ ン で割 り 当て る こ と がで き ます。 こ の拡張テ キ ス ト は、 1 個の ま る ご と の単語ない し 句か ら 成 るべ き です。 略語が拡張テ キ ス ト を何 も 持たない場合で も 、 E 属性を、 テ キ ス ト か ら 読 み上げへの変換処理を支援す る ために与え る こ と がで き ます。 た と えば、 用語 IBM は、 拡 張テ キ ス ト I B M (空白キ ャ ラ ク タ をは さ んで) を それに割 り 当て ら れて持つ こ と がで き ます。 以下の コ ー ド 断片では、 拡張テ キ ス ト Mister が略語 Mr. に割 り 当て ら れてい ます : p.fit_textline("Mr.", x, y, "tag={tagname=ASpan E={Mister} } ..."); 10.3.6 印刷ス ト リ ーム順序 と 論理読み取 り 順序 PDF には、 内容の順序付けについて、 根本か ら 異な る 2 種類の概念があ り ます。 図 10.3 に、 2 段組の メ イ ン テ キ ス ト に、 表 1 個がは さ ま り 、 灰色背景上のサマ リ 1 個が挿入 さ れ た、 さ ら にヘ ッ ダ と フ ッ タ も あ る サンプルページ を図示 し ます。 PDFlib API 関数呼び出 し の順序は、 ページ コ ン テ ン ツ ス ト リ ーム内の PDF テ キ ス ト ・ 描画演算子の順序 (Acrobat では 「生の印刷ス ト リ ーム順序」 と いい ます) を決定付け ま す。 ページ コ ン テ ン ツは、 制御アプ リ ケーシ ョ ンに都合のいい任意の方式で作成 さ れ う る も のですので、 こ れはただの技術的な順序付けであ り 、 意味付け上の重要性は必ず し も あ り ません。 こ の印刷ス ト リ ーム順序は Acrobat の 「順序」 ・ 「 コ ン テ ン ツ」 パネルで表示 さ れます。 論理読み取 り 順序は、 人が テ キ ス ト を 読む順序です。 こ れは、 ス ク リ ー ン リ ーダ と Acrobat の読み上げ機能に よ っ て用い ら れ る順序付け を決定 し ます。 こ の論理読み取 り 順 序は、 論理構造ツ リ ーに よ っ て決定 さ れます。 タ グ付 き PDF では、 すべての コ ン テ ン ツ が意味付け上正 し い順序で タ グ付け さ れてい る こ と が必須であ り 、 すなわち、 その構造 ヒ エ ラ ルキーはそのページ コ ン テ ン ツ を人が読む順に含んでい る必要があ り ます。正 し い タ グ付けに よ り 、 ス ク リ ー ン リ ーダ が コ ン テ ン ツ を 論理順に表現で き る よ う に な り ま す。 ページ装飾は構造ツ リ ーの一部分ではあ り ませんので、論理読み取 り 順序か ら は除外 さ れ てい ます。 10.3 タ グ付き PDF の基礎 293 Acrobat におけ る読み取 り 順序 と 印刷ス ト リ ーム順序 論理読み取 り 順序は、Acrobat X/ XI で以下の方式でチ ェ ッ ク で き ます : > 「表示」 → 「表示切 り 替え」 → 「ナビゲーシ ョ ンパネル」 → 「 タ グ」 を選択 し 、 エ レ メ ン ト の順序を上か ら 下へチ ェ ッ ク し ます。 こ の順序付けは、 望む読み取 り 順序を正確 に反映 し てい る べ き です。 > 「表示」 → 「読み上げ ...」 を有効にす る と 、 Acrobat にページ内容を、 その文書内で指定 さ れてい る 読み取 り 順序で読み上げ さ せ る こ と がで き ます。 「順序」 ・ 「 コ ン テ ン ツ」 パネルでは、 ページ コ ン テ ン ツ を印刷ス ト リ ーム順序で一覧表示 し てい ます。 コ ン テ ン ツ を論理読み取 り 順序で作成 多 く の状況において う ま く い く 自然な方式は、 1 個の構造エ レ メ ン ト のすべての構成部分を シーケ ン シ ャ ルに生成 し 、ついで論理シーケ ン ス内の次のエ レ メ ン ト へ移っ てい く こ と です。 専門的にい う と 、 構造ツ リ ーは単一の深 さ 優先 ト ラ バーサルに よ っ て作成 さ れ、 ページ内容を作成す る PDFlib 関数は、 内容が読ま れ る 順に呼び出 さ れます。 PDFlib では、 コ ン テ ン ツ を任意の順序で作成 し なが ら も なお構造 ヒ エ ラ ルキーを論理 順に作成する ためのい く つかの方法が可能です。 こ れ ら の方式は 305 ページ 「10.4.4 コ ン テ ン ツ を順序に と ら われず作成」 で説明 し ます。 10.3.7 Adobe Acrobat におけ る タ グ付き PDF の諸問題 こ の項では、私達が タ グ付き PDF 出力を Adobe Acrobat で試験 し てい く なかで得た知見を 述べます。 表 10.4 に、 い く つかの Acrobat のバージ ョ ンにおけ る バグ と 動作不安定を、 以 下の Acrobat 機能ご と に ま と めて挙げます : > Acrobat の折 り 返 し 機能 : Acrobat は タ グ付き PDF 文書を折 り 返 し さ せ る こ と がで き ま す。 すなわち、 ページ コ ン テ ン ツ を その時点の ウ ィ ン ド ウ サ イ ズに合わせて表示 さ せ る こ と が可能です。 > Acrobat のア ク セシ ビ リ テ ィ チ ェ ッ カ:Acrobat のア ク セシ ビ リ テ ィ チ ェ ッ カ を利用す る と 、 ス ク リ ーン リ ーダの よ う な支援技術に対する タ グ付き PDF 文書の適合性を調べ る こ と がで き ます。 > Acrobat で他の形式へ書き 出 し : タ グ付き PDF を利用す る と 、PDF 文書を Acrobat で XML や RTF な ど の形式で保存する と き 、 結果が飛躍的に向上 し ます。 > Acrobat の読み上げ機能 : タ グ付 き PDF は、 Acrobat の読み上げ機能を向上 さ せます。 > タ グ付 き PDF 文書を検証:Acrobat のプ リ フ ラ イ ト 機能を使 う と 、PDF 文書を検証す る こ と がで き ます。 > Acrobat の タ グパネル内の 「検索 ...」 機能を使っ てページ装飾 と マー ク な し コ ン テ ン ツ を検索す る こ と も で き ます。 表 10.4 タ グ付き PDF 処理に関連する Acrobat の問題 問題が起 こ る Acrobat バージ ョ ン 説明 ・ 推奨 ・ 回避策 9 X XI 取 り 込まれた PDF ページが折 り 返 し モー ド で表示 さ れない。 ○ ○ ○ 記号 (非 Unicode フ ォ ン ト ) が折 り 返 し を無効化する こ と があ る。 記号テキス ト を Figure エ レ メ ン ト 内に入れる こ と を推奨 し ます。 ○ - - Acrobatの折 り 返 し 機能 294 第 10 章 : 文書交換 表 10.4 タ グ付き PDF 処理に関連する Acrobat の問題 問題が起 こ る Acrobat バージ ョ ン 説明 ・ 推奨 ・ 回避策 9 X XI BLSE は、 構造上の子エ レ メ ン ト と 直接 コ ン テ ン ツ エ レ メ ン ト のど ち ら も内容 と す ○ る こ と がで き ます。 し か し 、 構造ア イ テムの子を混合種別 (すなわち、 ページ コ ン テ ン ツ列 と 非イ ン ラ イ ン構造エ レ メ ン ト の両方) と する と 、 折 り 返 し が失敗する (Acrobat XI では折 り 返 し がブ ロ ッ ク さ れる) こ と があるので避け るべき です。 折 り 返 し 機能を、 またア ク セ シ ビ リ テ ィ チ ェ ッ カ と 読み上げを も正 し く 動作 さ せるには、 混合コ ン テ ン ツが必要な場合には直接エ レ メ ン ト を最初の子エ レ メ ン ト の前に入れ る こ と を推奨 し ます。 また、 混合種別を子に持つ構造エ レ メ ン ト は、 直接 コ ン テ ン ツ を持つただ 1 つの子エ レ メ ン ト を内容 と するべき であ り 、 かつそれは最初の子で あ るべき です。 ○ ○ 折 り 返 し が、 topdown オプ シ ョ ン で生成 さ れたページ上のテキス ト を誤っ て反転 さ せる。 ○ ○ ○ ア ク テ ィ ブ化 し たア イ テムが コ ン テ ン ツ だけ を含み、 構造上の子を含ま ない場合に、 ○ 折 り 返 し が失敗する こ と があ る。 特にそのア イ テムが別のページ上で ア ク テ ィ ブ化 さ れた場合に顕著です。 こ の問題は、 ア ク テ ィ ブ化 し たア イ テムを非イ ン ラ イ ン Span タ グで ラ ッ プする こ と で回避で き ます。 ○ ○ フ ォ ーム フ ィ ール ド (電子署名フ ィ ール ド を含む) を持つページが折 り 返 し で きず、 ○ その場合に警告を引き起こ す。 ○ ○ Acrobatのア ク セシ ビ リ テ ィ チ ェ ッ カ Alt 属性が Figure タ グについて無視 さ れる。 ○ ○ - ア ク セシ ビ リ テ ィ チ ェ ッ カが、 構造エ レ メ ン ト 群が個別の言語属性を保持 し ていて も 、 文書レ ベルでの Lang 属性を求める。 n/a ○ ○ ア ク セシ ビ リ テ ィ チ ェ ッ カが、 取 り 込まれたページの一部分である画像に対する代 替テキス ト を無視する。 ○ ○ ○ ア ク セシ ビ リ テ ィ チ ェ ッ カが、 チ ェ ッ ク マー ク記号を持 っ た種類チ ェ ッ ク ボ ッ ク ス ○ の フ ォ ーム フ ィ ール ド について 「Character encoding – failed」 と 警告を発するが、 読 み上げ機能はそのフ ィ ール ド 内容を完璧に読み上げる。 ○ ○ ○ - - Acrobat が コ ン テ ン ツ を 「あ り のま まに」 抽出する : Alt ・ ActualText オプ シ ョ ンが - 無視 さ れ、 さ ら に Private ・ NonStruct タ グ も無視 さ れます。 ○ - NonStruct タ グの コ ン テ ン ツが HTML 4.01 CSS 1.0 へ書き出 さ れない ( し か し HTML 3.2 書き出 し には用い られます)。 ○ - - ILSE (た と えば Code ・ Quote ・ Reference) には代替テキス ト を与え る必要があ り ま す。 Alt オプ シ ョ ンが用い られている と 、 読み上げ機能ではその与え ら れてい る テ キス ト が読み上げ られますが、 他の形式へ書き出 さ れるのは実際の コ ン テ ン ツにな り ます。 ActualText オプ シ ョ ンが用い られている と 、 その与え られてい る テキス ト が読み上げ と 書き出 し の両方に用い られます。 ○ ○ ○ ○ ○ ○ 他の形式へ書き出 し 取 り 込まれた PDF ページが Form タ グ を含んでいる場合、 ActualText オプ シ ョ ン で 与え られている テキス ト は書き出 さ れるが、 Alt 属性が無視 さ れる。 ただ し 、 読み 上げ機能はど ち らのオプ シ ョ ンに対 し て も 動作 し ます。 Acrobatの読み上げ機能 タ グ付きのページが PDI で配置 さ れてお り 、 かつページ装飾のみを内容 と し てい る 場合に も 、 読み上げ機能がその配置 さ れてい るページの コ ン テ ン ツ を読み上げる。 10.3 タ グ付き PDF の基礎 295 表 10.4 タ グ付き PDF 処理に関連する Acrobat の問題 問題が起 こ る Acrobat バージ ョ ン 説明 ・ 推奨 ・ 回避策 9 X XI ○ ○ - ○ ○ - ○ ○ ○ Acrobat で文書を保存 し た後に、 構造エ レ メ ン ト の属性がな く な る こ と があ る。 ア ○ ク セ シ ビ リ テ ィ のために意味を持つ属性群も同様にな く な る こ と がある。 例 : Table エ レ メ ン ト の属性 Summary。 ○ ○ Alt 属性 と ActualText 属性が Figure タ グについて無視 さ れる。 Acrobatプ リ フ ラ イ ト に よ るPDF検証 Acrobat プ リ フ ラ イ ト 内の検証プ ロ フ ァ イル 「PDF の構文に関する問題点を レ ポー ト 」 が、 タ グ付きのページが PDI で配置 さ れている と 、 誤 っ て 「矛盾する ParentTree マ ッ ピ ング」 と 報告する。 その他のAcrobatの機能 タ グパネル内の「検索 ...」機能が、 ページ装飾を誤っ てマー ク な し コ ン テ ン ツ と し て報告する。 例 : 表装飾。 対照的に、 こ れら のア イ テムは コ ン テ ン ツパネル内で は 「 コ ン テナ < ページ装飾 >」 と し て正 し く 表示 さ れる。 296 第 10 章 : 文書交換 10.4 タ グ付 き PDF の高度な ト ピ ッ ク 10.4.1 自動表 タ グ付け PDF_fit_table( ) は、 表 コ ン テ ン ツのために PDF_add_table_cell( ) に与え ら れた情報に基づ い て、 生成 さ れ る 表の た めに適切な タ グ を 自動的に作成す る こ と がで き ま す。 PDF_fit_ table( ) の tag オプシ ョ ンで tagname=Table を用い る と 、 表 10.5 に説明す る と お り の自動 表 タ グ付けが行われます。 表 10.5 PDF_fit_table( ) の tag オプ シ ョ ン と 自動 タ グ付け PDF_fit_table( ) の tag オプ シ ョ ン 結果 tagname=Table 自動表 タ グ付けが行われます。 tagname=Table のかわ り に、 Table へロールマ ッ プ さ れた カ ス タ ム タ グ を用いる こ と も で き ます。 Summary サブオプ シ ョ ン を与え る こ と を推奨 し ます。 tagname=Artifact キ ャ プ シ ョ ン を含め、 表 コ ン テ ン ツ全体がページ装飾 と し てマー ク さ れます。 BBox 属性が 自動的に追加 さ れます。 他の任意の tagname Table 構造は一切作成 さ れず、 そのセル コ ン テ ン ツは tag オプ シ ョ ン で指定 さ れたエ レ メ ン ト の子 と し て追加 さ れます。 擬似ア イ テム と イ ン ラ イ ン ア イ テムは PDF_fit_table( ) に対 し ては許容 さ れません。 tagオプ シ ョ ンが与 え ら れていない 自動 タ グ付けな し 。 tag オプ シ ョ ンが個別の PDF_add_table_cell( ) への呼び出 し に対 し て与 え られた場合には (fit* オプ シ ョ ンの う ちのいずれかの対するサブオプ シ ョ ン と し て)、 そのセル コ ン テ ン ツ に対する、 照応する構造エ レ メ ン ト が作成 さ れますが、 表構造は一切 作成 さ れません。 注 自動表 タ グ付けは、 PDFlib の表エ ン ジ ンが用い られる場合にのみ威力を発揮 し ます。 手作 業で作成 さ れた表に正 し く タ グを付け る こ と は可能ではあ り ますが、 こ の処理は、 ク ラ イ ア ン ト ア プ リ ケーシ ョ ン側で表構造に関する詳 し い知識を必要 と し ます。 表行 / 列構造の みな ら ず、 ヘ ッ ダセル と 表行 / 列スパンに関する関連情報が必須です。 空セルに も タ グを 付け る必要があ り ます。 Acrobat で テーブル タ グ を視覚化 テーブルエ レ メ ン ト の構造は、Acrobat X/XI で以下の よ う に視覚化で き ます : > 「表示」 → 「ア ク セシ ビ リ テ ィ 」 → 「TouchUp 読み上げ順序」 を選択。 テーブルエ レ メ ン ト がハ イ ラ イ ト さ れ、 テーブルの左上隅近 く の小 さ な番号で標識 さ れ ます。 テーブ ルサマ リ が存在す る 場合には、 それは こ の小 さ な番号の後に表示 さ れます。 > テーブルの左上隅にあ る 番号 (Acrobat XI では構造種別名) を選択 し 、「TouchUp 読み上 げ順序」 ダ イ ア ロ グ内の 「テーブルエデ ィ タ ー」 を ク リ ッ ク 。 表構造が縦横の線で視 覚化 さ れます。Acrobat X は表セルの種別に従っ て TH/TD ア イ コ ン を表示 し ますが、 こ れ ら のア イ コ ンは Acrobat XI では表示 さ れません (図 10.4 参照)。 > 表セルを右 ク リ ッ ク し て、 「テーブルセルのプ ロパテ ィ ...」 を選択する と 、 そのセル種 別 (ヘ ッ ダセルな ら TH、 デー タ セルな ら TD)、 scope 属性、 rowspan ・ colspan 属性、 header/ID 値をチ ェ ッ ク で き ます。 なお、Acrobat X/XI においてテーブルエデ ィ タ ーで作業す る にあ た っ ては以下の制約があ り ます : 10.4 タ グ付き PDF の高度な ト ピ ッ ク 297 図 10.4 タ グ付き PDF 表のための Acrobat のテーブルエデ ィ タ ー がヘ ッ ダ (TH) ・ デー タ (TD) セルを表示 > 表セルを視覚化す る 線が、 誤っ た位置に表示 さ れ る こ と があ り ます。 > 表が、Table へ ロ ールマ ッ プ さ れた カ ス タ ム構造エ レ メ ン ト (標準エ レ メ ン ト Table では な く ) を用いてい る と 、 Acrobat はテーブルエデ ィ タ ーを ア ク テ ィ ブに し ません。 > テーブルエデ ィ タ ーは、 表内に Caption エ レ メ ン ト が存在 し ていて も 表示 し ません。 > 表セルが縦書 き テ キ ス ト (た と えば orientate=east ま たは west に よ る テ キ ス ト 行)を含 んでい る と 、 こ のセル と その右隣セルはテーブルエデ ィ タ ーで表示 さ れ ませんが、 た だ し それ ら は論理構造ツ リ ー内には存在 し 、 それ ら の内容はページ上で見え ます。 自動作成 さ れる表 タ グ と 属性 自動表 タ グ付けは、 ページ ス コ ープ内でのみ働 き 、 以下 の よ う に動作 し ます : > それぞれの表 イ ン ス タ ン ス に対 し て別々のTableエ レ メ ン ト が作成 さ れます。た と えば、 1 個の表が 2 個以上の イ ン ス タ ン ス に分割 さ れてい る 場合、 複数の Table エ レ メ ン ト が 作成 さ れます。 PDF_fit_table( ) の tag オプシ ョ ンに対 し て、 推奨 さ れ る Summary サブ オプシ ョ ンが与え ら れてい る 場合には、 Table 要素に Summary 属性が追加 さ れます。 > PDF_fit_table( ) で caption オプシ ョ ンが指定 さ れた場合には、Caption エ レ メ ン ト が作成 さ れます。 グループ化エ レ メ ン ト と し て、 Caption はいかな る直接 コ ン テ ン ツ を も 許 し ませんので、 こ の caption オプシ ョ ンの tag サブオプシ ョ ン を与え る こ と に よ っ て、 Caption の子 と し て構造エ レ メ ン ト を指定する 必要があ り ます。 こ のエ レ メ ン ト が こ の キ ャ プシ ョ ンの実際の コ ン テ ン ツ を保持で き ます。 > それぞれの表行に対 し て 1 個の TR エ レ メ ン ト が作成 さ れます。PDF_fit_table( ) の header オプシ ョ ン内で指定 さ れてい る 表行は THead で ラ ッ プ さ れ、 footer オプシ ョ ン内で指 定 さ れてい る 表行は TFoot で ラ ッ プ さ れます。 それ以外のすべての表行は、 ヘ ッ ダか フ ッ タ が存在す る 場合には TBody で ラ ッ プ さ れます。 > 表セルはそれぞれ、PDF_add_table_cell( )のtag オプシ ョ ンのtagnameサブオプシ ョ ンに 従っ て、 TH (テーブルヘ ッ ダ) か TD (テーブルデー タ ) のいずれかのエ レ メ ン ト で ラ ッ プ さ れ ます。 こ のオプシ ョ ン が指定 さ れていない場合には、 そのセル種別は以下 の よ う に選択 さ れます : >セルに対する Scope属性はTHを強制 し ます(た と えtagname=TDが指定 さ れていて も )。 >そのセルの id を指定 し た Headers オプシ ョ ン を別のセルが含んでい る場合には、こ の タ ーゲ ッ ト セルは強制的にTHにな り ます(た と えtagname=TDが指定 さ れていて も )。 298 第 10 章 : 文書交換 >そのセルが、PDF_fit_table( ) の header オプシ ョ ン で指定 さ れてい る と お り の表ヘ ッ ダ の一部分で あ る 表行に含 ま れ て い る 場合には、 そ れは TH で ラ ッ プ さ れ、 ま た、 Scope=Column が追加 さ れます。 > PDF_add_table_cell( ) が呼び出 さ れていない表セルそれぞれについて、空の TD ダ ミ ーエ レ メ ン ト が作成 さ れます。 > TH ・ TD エ レ メ ン ト は、 PDF_add_table_cell( ) の rowspan ・ colspan オプシ ョ ンに従っ て、 適切な RowSpan ・ ColSpan 属性を得ます。 tag オプシ ョ ンの RowSpan ・ ColSpan サブオ プシ ョ ンは使え ません。 > Table ・ TH ・ TD エ レ メ ン ト には、 適切な Width ・ Height 属性が割 り 当て ら れます : Table エ レ メ ン ト には BBox 属性 も 割 り 当て ら れます。 > 他の表セル属性は、PDF_add_table_cell( )のtag オプシ ョ ンに対 し てサブオプシ ョ ン と し て与え る こ と が可能です。 以下のオプシ ョ ンは許容 さ れ ません : RowSpan ・ ColSpan ・ Height ・ index ・ parent ・ Width。 > 表行 と セルは、 PDF_add_table_cell( ) への呼び出 し の順序にかかわ ら ず、 左上セル (す なわち列 1 ・ 行 1) か ら 右下セルへジ グザグ順に出力 さ れます。 > 装飾的な各種表要素は、自動的に artifacttype=Layout の Artifact と し て タ グ付け さ れま す。 すなわち、 表セル ・ 表行 ・ 列 ・ 表全体の罫線 と シ ェーデ ィ ン グ (塗 り / 描線)、 範 囲枠の塗 り と 罫線、 showborder の罫線、 debugshow ・ showcells ・ showgrid を通 じ て制 御 さ れ る 視覚化支援です。 ク ッ ク ブ ッ ク 自動表 タ グ付けのための コ ー ド サン プルが、 PDFlib ク ッ ク ブ ッ ク の pdfua カ テ ゴ リ 内の tagged_table ・ tagged_invoice ト ピ ッ ク にあ り ます。 表セルに タ グ と 属性を追加 短縮 タ グ付け を、 表キ ャ プ シ ョ ン か表セルか、 ま たは表セ ルの コ ン テ ン ツに適用す る こ と がで き ます。 PDF_add_table_cell( ) に tag オプシ ョ ン を与 え る と 、 以下の状況において有用です : > 表セルが、ヘ ッ ダ行に含まれていないか、Scope 属性を持たない場合には、tagname=TH を用いてそれを強制的にヘ ッ ダセルにす る こ と も で き ます (TD デー タ セルではな く )。 > リ ン ク に対 し て必要な正 し い タ グ構造を作成:詳 し く は 301 ページ 「表セル内で リ ン ク に タ グ付け」 を参照 し て く だ さ い。 PDF_add_table_cell( ) の tag オプシ ョ ンのサブオプシ ョ ンに対 し ては、 以下の制約が課 さ れます : > 以下のオプシ ョ ンは使え ません : ColSpan ・ Height ・ index ・ parent ・ RowSpan ・ Width。 > tagname オプシ ョ ンは、表セルの種別を指定す る ために、値 TH か TD のいずれかのみを 持つ こ と がで き ます。 し か し 、 tag オプシ ョ ン を ネ ス ト す る こ と に よ っ て子孫 タ グ を指 定す る こ と も で き ます。 > id オプシ ョ ンは、 1 個の文書内で一意でなければな り ませんので、 こ のオプシ ョ ンは、 複数の表 イ ン ス タ ン ス内で反復 さ れ る 表セル、 た と えば、 複数の表 イ ン ス タ ン ス を作 成する 表のためのヘ ッ ダ行か フ ッ タ 行の中のセルに対 し ては許容 さ れません。 表セルの コ ン テ ン ツ に タ グ と 属性を追加 PDF_add_table_cell( ) の以下のオプシ ョ ン (ま たは caption オプシ ョ ンの照応す る サブオプシ ョ ン) にサブオプシ ョ ン と し て tag を与え る こ と も で き ます : fitannotation, fitfield, fitgraphics, fitimage, fitpath, fitpdipage, fittextflow, fittextline 10.4 タ グ付き PDF の高度な ト ピ ッ ク 299 こ れは以下の状況において有用です : > 表セルの コ ン テ ン ツに対 し て下位構造を指定。こ の tag オプシ ョ ンは、その表セルの TH か TD エ レ メ ン ト の子エ レ メ ン ト を作成 し ます。自動表 タ グ付けが有効の場合には、tag オプシ ョ ン に対 し て、 tagname について以下の値は許容 さ れ ま せん (言い換えれば、 表のネ ス ト には対応 し てい ません) : Table, TR, TH, TD, THead, TBody, TFoot > 以下に挙げ る 表の属性は、 自動的には作成 さ れ る こ と がで き ませんが、 ア ク セシ ビ リ テ ィ 目的のために必要な場合があ り ます。 こ れ ら はユーザーに よ っ て与え ら れ る 必要 があ り ます : >表内の 1 個ない し 複数の TH セルを参照する TD セル(すなわち こ れは、PDF_fit_table( ) の header オ プ シ ョ ン の一部分で は な いヘ ッ ダ セ ル を 参照 し ま す) に対 し て は、 Headers オプシ ョ ン を与え る 必要があ り ます。 >いずれかの Headers オプシ ョ ン内で参照 さ れてい る TH セルに対 し ては、Id オプシ ョ ン と Scope=Row オプシ ョ ン を与え る 必要が あ り ま す (TH 列ヘ ッ ダ セルに対 し ては Scope=Column は自動的に作成 さ れます)。 > キ ャ プシ ョ ンは任意の コ ン テ ン ツ を内容 と す る こ と がで き 、 その コ ン テ ン ツ自体 も タ グ付け さ れ る こ と がで き ます。 た と えば、 以下のオプシ ョ ン リ ス ト は、 ネ ス ト さ れた P エ レ メ ン ト の中のテ キ ス ト 行 1 個を内容 と す る Caption エ レ メ ン ト を作成 し ます : caption={ fittextline={tag={tagname=P title={出張旅費報告書}} ... } ... } 10.4.2 イ ン タ ラ ク テ ィ ブ要素 リ ン ク ・ 注釈 ・ フ ォーム フ ィ ール ド も 、 ア ク セシブルにす る必要があ り ます。 その照応す る イ ン タ ラ ク テ ィ ブエ レ メ ン ト を、 必ず構造ツ リ ー内で表現する 必要があ り 、 かつ、 構造 ツ リ ー内の正 し い位置に作成す る 必要があ り ます。 イ ン タ ラ ク テ ィ ブ要素をページ装飾 と し て作成す る こ と はで き ません。 ク ッ ク ブ ッ ク タ グ付 き の リ ン ク と フ ォ ーム フ ィ ール ド を作成す る ための コ ー ド サン プル群が、 PDFlib ク ッ ク ブ ッ ク の pdfua カ テ ゴ リ 内の ト ピ ッ ク starter_pdfua1 にあ り ます。 リ ン ク と その他の注釈種別 ス ク リ ーン リ ーダは、 注釈のための以下の 3 つのア イ テ ム がア ク セシブルであ る こ と を要請 し ます (図 10.5 参照) : > 次の2つのア イ テ ムのための コ ン テナ と し ての役割を果たすLink ま たはAnnot構造エ レ メ ン ト 1 個を、 正 し い読み取 り 順序で作成す る必要があ り ます。 Alt ま たは ActualText オプシ ョ ン を与え る こ と に よ っ て代替テ キ ス ト を与え る こ と も で き ます。 Link エ レ メ ン ト の Alt 属性はその リ ン ク の目的を記述す る べ き です。 なお、 擬似エ レ メ ン ト 、 グ ループ化エ レ メ ン ト 、 テーブルエ レ メ ン ト 、 ILSE、 ル ビ ・ 割注エ レ メ ン ト を Link と Annot の親にす る こ と は許容 さ れない こ と に留意 し て く だ さ い。 > テ キ ス ト や画像 と い っ た、 イ ン タ ラ ク テ ィ ブ要素を表現す る 可視 コ ン テ ン ツ を、 こ の コ ン テナエ レ メ ン ト の内側に作成す る べ き です。 ページ コ ン テ ン ツ が全 く 必要ない場 合には、 こ のエ レ メ ン ト は ス キ ッ プす る こ と がで き ます。 た と えばテ キ ス ト 注釈の場 合な ど です。 さ ま ざ ま な コ ン テ ン ツ作成関数の matchbox オプシ ョ ン を用い る こ と に よ っ て、 次のエ レ メ ン ト のための形状情報を用意す る こ と を推奨 し ます。 > イ ン タ ラ ク テ ィ ブ注釈ま たはフ ォーム フ ィ ール ド のための、 1 個ない し 複数の、 種別 OBJR (オ ブ ジ ェ ク ト 参 照) の 構 造 エ レ メ ン ト 。 OBJR エ レ メ ン ト は、 PDF_create_ annotation( ) に よ っ て自動的に作成 さ れます。 こ の OBJR エ レ メ ン ト は、 カ レ ン ト にア 300 第 10 章 : 文書交換 図 10.5 構造ツ リ ー内におけ る ア ク セ シ ブルな リ ン クの表現 ク テ ィ ブなエ レ メ ン ト の子 と し て挿入 さ れます。 ただ し 、 tag オプシ ョ ンの parent サ ブオプシ ョ ン が別の親エ レ メ ン ト を指定 し てい る 場合は別です。 リ ン ク 注釈に対 し て は、 PDF_create_annotation( ) の contents オプシ ョ ン を与え る べ き です ( こ れは PDF/ UA では必須です)。その他の注釈種別については、PDF_create_annotation( ) の contents オプシ ョ ン、ま たはActualText タ グオプシ ョ ン を用いて作成する べき です。usematchbox オプシ ョ ン を用い る と 、2 番目の ス テ ッ プで作成 さ れた視覚 コ ン テ ン ツの形状を簡便に 与え る こ と がで き ます。 こ の 2 番目 と 3 番目のア イ テ ムは、 ど ち ら を先に作成 し て も か ま い ません。 OBJR エ レ メ ン ト は自動的に作成 さ れますが、他の必須のエ レ メ ン ト 群を作成す る のはユーザー側の役 割です。 上記の注釈の必要条件は、 PDF_add_table_cell( ) のオプシ ョ ン fitannotation を用 いて表セル内に作成 さ れ る 注釈に対 し て も あ ては ま り ます。 以下の コ ー ド 断片は、 こ の必須の 3 つのア イ テ ム を持っ た イ ン タ ラ ク テ ィ ブ リ ン ク を 作成 し ます (生成 さ れ る タ グ構造を図 10.5 に示 し ます) : /* 親Linkエレメントを作成 */ id_link = p.begin_item("Link", "Title={Kraxi on the Web} Alt={Kraxi on the Web}"); /* このリンクを表現する可視コンテンツを作成 */ p.fit_textline("Click here to go to the Kraxi website", x, y, "matchbox={name={kraxi.com}} fontsize=14 font=" + font); /* URIアクションを作成 */ action = p.create_action("URI", "url={http://www.kraxi.com}"); /* 名前付き範囲枠「kraxi.com」上にLink注釈を作成 */ p.create_annotation(0, 0, 0, 0, "Link", "action={activate=" + action + "} " "linewidth=0 usematchbox={kraxi.com} contents={Kraxi Inc. Webサイトへのリンク}"); p.end_item(id_link); 注 イ ン タ ラ ク テ ィ ブ要素のために必要な この タ グ付け手順は、テキス ト フ ロー と 範囲枠を用 いた場合には実現で き ません。 なぜな ら タ グはテキス ト フ ロ ー内に作成で き ないか ら で す。 また、 テキス ト フ ローを配置 し た後に イ ン タ ラ ク テ ィ ブ要素のための タ グを作成する と 読み取 り 順序がおか し く な り ます。 表セル内で リ ン ク に タ グ付け 表セル内の リ ン ク は、上述の タ グ構造を必要 と し ます。た だ し こ れは、 構造要素 TH/TD ・ Link ・ OBJR と 、 さ ら におそ ら く コ ン テ ン ツ を、 正 し く ネ ス ト す る 必要があ り ま すので、 やや複雑か も し れ ま せん。 こ れを達成す る には、 PDF_add_ table_cell( ) に tag オプシ ョ ン を与え てそのネ ス ト 機能を利用す る必要があ り ます。以下の オプシ ョ ン リ ス ト は、 表セルにテ キ ス ト 1 行 と リ ン ク 注釈 1 個を入れます。 それを囲 う TD エ レ メ ン ト は外側の tag オプシ ョ ンで与え ら れ (TD は表エン ジ ンに よ っ て自動的に作 成 さ れますので、 外側の tagname サブオプシ ョ ンは省略で き ます)、 そ し て Link 要素は内 側の tag オプシ ョ ンで与え ら れます。 最後に、 必要な OBJR エ レ メ ン ト は、 PDF_create_ 10.4 タ グ付き PDF の高度な ト ピ ッ ク 301 annotation( ) と 同等の働 き をす る fitannotation オプシ ョ ンに よ っ て自動的に作成 さ れま す: fittextline={font=... fontsize=25 fillcolor=blue} annotationtype=Link fitannotation={contents={Kraxi home page} action={activate ...}} tag={tagname=TD tag={tagname=Link}} フ ォ ーム フ ィ ール ド ア ク セ シブルな フ ォ ーム フ ィ ール ド は、 ア ク セ シ ビ リ テ ィ のため の 2 個の構造エ レ メ ン ト を必要 と し ます : > 次のエ レ メ ン ト のための コ ン テナ と し ての役割を果たすForm構造エ レ メ ン ト 1個を、正 し い読み取 り 順序で作成す る 必要があ り ます。 Alt ま たは ActualText オプシ ョ ン を与え る こ と に よ っ て代替テ キ ス ト を与え る こ と も で き ます。 なお、 擬似エ レ メ ン ト 、 テー ブルエ レ メ ン ト 、 ILSE、 ルビ ・ 割注エ レ メ ン ト を Form の親にす る こ と は許容 さ れない こ と に留意 し て く だ さ い。 ラ ジオボ タ ン を作成す る際には、 Form エ レ メ ン ト は、 その ラ ジオボ タ ン グループのための PDF_create_fieldgroup( ) では必要ではな く 、 個々の ラ ジオボ タ ン を作成す る ための PDF_create_field( ) でのみ必要です。 > その フ ォーム フ ィ ール ド のための、 種別 OBJR (オブジ ェ ク ト 参照) の構造エ レ メ ン ト 1 個。 OBJR エ レ メ ン ト は、 PDF_create_field( ) に よ っ て自動的に作成 さ れます。 こ の OBJR エ レ メ ン ト は、 カ レ ン ト にア ク テ ィ ブなエ レ メ ン ト の子 と し て挿入 さ れます。 た だ し 、 tag オプシ ョ ンの parent サブオプシ ョ ンが別の親エ レ メ ン ト を指定 し てい る 場 合は別です。 PDF_create_field( ) の tooltip オプシ ョ ン を与え る こ と に よ り 、 フ ィ ール ド のア ク セシ ビ リ テ ィ を向上 さ せ る べ き です ( こ れは PDF/UA では必須です)。 Form エ レ メ ン ト を作成す る のはユーザー側の役割ですが、OBJR エ レ メ ン ト は PDF_create_ field( ) で自動的に作成 さ れます。 短縮 タ グ付け を用いれば、 すなわち、 tag オプシ ョ ン を tagname=Form と と も に用いれば、 両方のエ レ メ ン ト を、 PDF_create_field( ) へのただ 1 回 の呼び出 し に よ っ て簡便に作成す る こ と も 可能です : p.create_field(p, llx, lly, urx, ury, "firstname", "textfield", "bordercolor={gray 0} font=" + font + " tag={tagname=Form} tooltip={ファーストネーム}"); 上述の フ ォーム フ ィ ール ド の必要条件は、 PDF_add_table_cell( ) のオプシ ョ ン fitfield を用 いて表セル内に作成 さ れ る フ ォーム フ ィ ール ド に対 し て も あ ては ま り ます。 タ グ付き し お り し お り には、通常の移動先に加え て、構造エ レ メ ン ト を割 り 当て る こ と も で き ます。 こ の よ う な し お り を タ グ付き し お り と いい、 Acrobat は こ れのために追加の 機能を提供 し てい ます。 Acrobat で タ グ付 き し お り を右 ク リ ッ ク す る と 、 機能 「ページ を 削除」 と 「ページ を抽出」 が利用可能 と な っ てお り 、 こ れ ら はその構造化エ レ メ ン ト を含 んでい る ページない し ページ群に対 し て動作 し ます。 タ グ付 き し お り は、 し お り と 構造エ レ メ ン ト と の間に接続を作成 し ます。 こ の接続を作成で き る 方法は 2 つあ り ます : > PDF_create_bookmark( ) で し お り を作成 し 、 そのハン ド ルを、 PDF_begin_item( ) の bookmark オプシ ョ ンに、 ま たは さ ま ざ ま な関数の tag オプシ ョ ンに与え る : bm = p.create_bookmark("第1章", ""); id = p.begin_item("H1", "Title={第1章} bookmark=" + bm); p.fit_textline(text, x, y, ""); p.end_item(id); こ の方式は短縮 タ グ付けで も 用い る こ と がで き ます : 302 第 10 章 : 文書交換 bm = p.create_bookmark("第1章", ""); p.fit_textline(text, x, y, "tag={tagname=H1 Title={第1章} bookmark=" + bm + "}"); こ の方式の難点は、 し お り テ キ ス ト が、 その構造エ レ メ ン ト と その コ ン テ ン ツ が作成 さ れ る 前には得 ら れていなければな ら ない と い う 点です。 こ れは、 参照 さ れ る 構造エ レ メ ン ト のほ う が構造ツ リ ー内で上にあ っ た場合には困 る で し ょ う 。 > PDF_begin_item( ) で構造ア イ テ ム を作成 し 、そのハン ド ルを PDF_create_bookmark( ) の item オプシ ョ ンに与え ます。 ア イ テ ムのハン ド ルのかわ り に、 キー ワー ド current を、 PDF_create_bookmark( ) が呼び出 さ れ る 時点におけ る カ レ ン ト の構造エ レ メ ン ト を指 し 示すシ ョ ー ト カ ッ ト と し て与え る こ と がで き ます : id = p.begin_item("H1", "Title={第1章} "); bm = p.create_bookmark("第1章", "item=current"); p.fit_textline(text, x, y, ""); p.end_item(id); こ の方式には、 し お り テ キ ス ト が、 その構造エ レ メ ン ト と その コ ン テ ン ツ が作成 さ れ る 時点で得 ら れれば よ い と い う 利点があ り ます。 ただ し 、 こ れは短縮 タ グ付けでは使 え ません。 タ グ付 き し お り は、 オープン構造エ レ メ ン ト を参照する こ と のみ可能であ り 、 擬似ア イ テ ム ま たは イ ン ラ イ ン ア イ テ ム を参照す る こ と はで き ません。 し お り の移動先が構造エ レ メ ン ト と 一致す る よ う にす る のは ク ラ イ ア ン ト コ ー ド 側の役割です (そ う し ない と 、Acrobat で し お り を ク リ ッ ク し た ら そのエ レ メ ン ト へジ ャ ンプせず、その文書内の別の場所へジ ャ ンプ し て し ま い ます) 。 関連付け ら れ る 構造エ レ メ ン ト が複数のページにわた っ てい る場 合には、 その し お り は こ の範囲内の最初のページ を指 し 示すべ き です。 10.4.3 箇条書き 箇条書 き は、 関連す る 項目群を ま と め る ために使われます。 こ れは以下の構造エ レ メ ン ト に よ っ て表現 さ れます (図 10.6 参照) : > 以下のすべての構造エ レ メ ン ト を内容 と す る L エ レ メ ン ト 1 個。ListNumbering オプシ ョ ン を用い る と 、 Lbl エ レ メ ン ト 内で用い ら れ る 付番系列を指定す る こ と がで き ます。 こ の ListNumbering オプシ ョ ンは、 Lbl エ レ メ ン ト がない場合で も 、 ス ク リ ーン リ ーダの ために有用で し ょ う 。 > オプシ ョ ナルな Caption エ レ メ ン ト 1 個。Caption はグループ化エ レ メ ン ト ですので、直 接 コ ン テ ン ツ を内容 と す る こ と はで き ず、 他の構造要素のみを内容 と す る こ と がで き ます (P な ど)。 > 以下を内容 と す る 、 1 個ない し 複数の箇条書 き 項目 (LI) : >オプシ ョ ナルな、 ビ ュ レ ッ ト や番号な ど を持っ た ラ ベル (Lbl) 1 個。 >その箇条書 き 項目の実際の コ ン テ ン ツ を持っ た LBody エ レ メ ン ト 1 個。LBody は、直接 コ ン テ ン ツ か、 ネ ス ト さ れた箇条書 き も 含めて他の構造エ レ メ ン ト のいずれか を内 容 と する こ と がで き ます。 以下の コ ー ド 断片は、 1 個のキ ャ プシ ョ ン と 3 個の項目を持っ た箇条書 き を作成 し ます。 それぞれの箇条書 き 項目の頭には、 ラ ベル と し て タ グ付け さ れ る ビ ュ レ ッ ト キ ャ ラ ク タ U+2022 が付 き ます (生成 さ れ る タ グ構造を図 10.6 に示 し ます) : 10.4 タ グ付き PDF の高度な ト ピ ッ ク 303 図 10.6 ア ク セシ ブルな箇条書きの 構造ツ リ ー内におけ る表現 id_list = p.begin_item("L", "ListNumbering=Disc"); id_caption = p.begin_item("Caption", ""); p.fit_textline("The following kinds of fruit are available:", x1, y, "tag={tagname=P}"); y -= leading; p.end_item(id_caption); id_listitem = p.begin_item("LI", ""); p.fit_textline("•", x1, y, "tag={tagname=Lbl}"); p.fit_textline("Apples", x2, y, "tag={tagname=LBody}"); y -= leading; p.end_item(id_listitem); id_listitem = p.begin_item("LI", ""); p.fit_textline("•", x1, y, "tag={tagname=Lbl}"); p.fit_textline("Oranges", x2, y, "tag={tagname=LBody}"); y -= leading; p.end_item(id_listitem); id_listitem = p.begin_item("LI", ""); p.fit_textline("•", x1, y, "tag={tagname=Lbl}"); p.fit_textline("Bananas", x2, y, "tag={tagname=LBody}"); y -= leading; p.end_item(id_listitem); p.end_item(id_list); 304 第 10 章 : 文書交換 ク ッ ク ブ ッ ク タ グ付き PDF 箇条書き を作成する ための コ ー ド サン プルが、 PDFlib ク ッ ク ブ ッ ク の pdfua カ テ ゴ リ 内の ト ピ ッ ク tagged_list にあ り ます。 10.4.4 コ ン テ ン ツ を順序に と ら われず作成 293 ページ 「10.3.6 印刷ス ト リ ーム順序 と 論理読み取 り 順序」 で述べた よ う に、 構造 ヒ エ ラ ルキー内の要素群を作成す る 際に論理読み取 り 順序の と お り にす る こ と は不可欠です。 ア プ リ ケーシ ョ ン が、 論理読み取 り 順序 と は異な る 順序でページ コ ン テ ン ツ を (た と え ば、段組の相互関係にかかわ ら ずつねに上か ら 下へ)処理する 場合には、い く つかの PDFlib 機能を用いて、 構造 ヒ エ ラ ルキー内で正 し い順序付け を保つ こ と がで き ます : > 子エ レ メ ン ト 群を順序に と ら われず作成す る ために index オプシ ョ ン を用い る。 こ れ は、 新規構造エ レ メ ン ト がその親の中へ挿入 さ れ る位置を変更 し ます。 > 構造エ レ メ ン ト 群を順序に と ら われず作成す る ために parent オプシ ョ ン を用い る 。 こ れは、 新規構造エ レ メ ン ト が挿入 さ れ る 親エ レ メ ン ト を変更 し ます。 > 構造 ヒ エ ラ ルキー内で前後へジ ャ ンプす る ために PDF_activate_item( ) 関数を用い る。 こ れを用い る と 、 構造 ヒ エ ラ ルキー内のいずれかのエ レ メ ン ト に対 し て、 構造エ レ メ ン ト ま たは直接 コ ン テ ン ツ を さ ら に追加す る こ と がで き ます。 こ れ ら の方式について詳 し く は後述 し ます。 ク ッ ク ブ ッ ク エ レ メ ン ト を順序に と らわ ら ず タ グ付けする ための コ ー ド サン プルが、PDFlib ク ッ ク ブ ッ クの pdfua カ テ ゴ リ 内の ト ピ ッ ク tag_out_of_order ・ tag_parallel_columns 内にあ り ます。 子エ レ メ ン ト 群を順序に と ら われず作成 構造エ レ メ ン ト 内の子エ レ メ ン ト 群を順序に と ら われず作成す る ためには、 構造ツ リ ー内の場所を指定する ために、 PDF_begin_item( ) の index オプシ ョ ンか、 あ る いは さ ま ざ ま な関数の tag オプシ ョ ンの index サブオプシ ョ ン を用い る こ と がで き ます。 以下の コ ー ド 断片は、 テ キ ス ト フ ラ グ メ ン ト 群を逆順に出力 し なが ら 、 構造ツ リ ー内におけ る 順序を正 し く する ために、 それぞれの新規テ キ ス ト フ ラ グ メ ン ト を親エ レ メ ン ト の新たな最初の子 (index=0) と し て挿入 し ます。 それぞれの新 規エ レ メ ン ト が親の新た な最初の子 と し て挿入 さ れてい ますか ら 、結果 と し て論理順は作 成順の反対にな り ます : p.fit_textline("三", x, y, "tag={tagname=P index=0}"); y += leading; p.fit_textline("二", x, y, "tag={tagname=P index=0}"); y += leading; p.fit_textline("一", x, y, "tag={tagname=P index=0}"); カ レ ン ト でア ク テ ィ ブな タ グの、 その親エ レ メ ン ト 内におけ る 番号を ク エ リ す る ために、 PDF_get_option( ) と その activeitemindex か activeitemkidcount キー ワー ド を用い る こ と が で き ますので、 後で構造ツ リ ー内の こ の場所へ戻っ て く る こ と が可能です。 以下の コー ド 断片は、新規エ レ メ ン ト を、保管 し ていた番号の位置にあ る エ レ メ ン ト の後に挿入 し ます: nextindex = p.get_option("activeitemindex") + 1; ...同一レベル上のエレメント群をさらに作成... p.fit_textline(text, x, y, "tag={tagname=P index=" + nextindex + "}"); 構造エ レ メ ン ト 群を順序に と ら われず作成 子エ レ メ ン ト 群を、 カ レ ン ト 位置ではな く 、 構造ツ リ ー内の ど こ か他の場所に作成す る ためには、 parent オプシ ョ ン を用い ます。 こ れ 10.4 タ グ付き PDF の高度な ト ピ ッ ク 305 は、 ま だ閉 じ ら れていない構造エ レ メ ン ト を指 し 示す必要があ り ます。 短縮 タ グ付けで作 成 さ れたエ レ メ ン ト は、 同一の関数呼び出 し の中で作成 さ れて閉 じ ら れて し ま い ま すの で、 こ れは parent オプシ ョ ンの タ ーゲ ッ ト と し ては使え ません。 カ レ ン ト でア ク テ ィ ブ な タ グの ID を ク エ リ す る ために、PDF_get_option( ) と その activeitemid キー ワー ド を用い る こ と がで き ますので、 後で構造ツ リ ー内の こ の場所へ戻っ て く る こ と が可能です : parent_id = p.get_option("activeitemid"); ... p.fit_textline(text, x, y, "tag={tagname=P parent=" + parent_id + "}"); さ ら に柔軟性を得 る 方法 と し て、 parent オプシ ョ ン と index オプシ ョ ン を組み合わせて使 う こ と も で き ます。 PDF_suspend/resume_page( ) を用い る と 、 ページに割 り 込んで、 別の ページで作業を続け、その後その一時停止 し たページに戻っ て さ ら に コ ン テ ン ツ を追加す る こ と がで き ます。 複雑な レ イ ア ウ ト のためにア イ テム を ア ク テ ィ ブ化 複雑な非線形のページ レ イ ア ウ ト のための構造情報の作成を支援す る ために、PDFlib はア イ テ ムのア ク テ ィ ブ化 と い う 機能 を提供 し てい ます。 こ れを呼び出す と 、 開発者が複数の構造分枝の進捗を同時進行 さ せ、 かつそれぞれの分枝が 1 個ない し 複数のページにわた る 可能性があ る よ う な状況におい て、 以前に作成 さ れた構造エ レ メ ン ト を ア ク テ ィ ブ化す る こ と がで き ま す。 こ の技法に よ っ て恩恵を受け る 典型的な状況は以下の と お り です : > 1 つのページ上に複数の段組 > メ イ ン テ キ ス ト に割 り 込む挿入部、 た と えばま と めやその他非線形のテ キ ス ト ア イ テ ム > 段組ど う し の間に配置 さ れ る 表 ・ イ ラ ス ト PDF_activate_item( ) 関数を用い る と 、構造ツ リ ーの別々の分枝ど う し の間を行っ た り 来た り す る こ と が可能にな り ます。 「論理順」 アプ ロ ーチでは、 ク ラ イ ア ン ト アプ リ ケーシ ョ ンはページ コ ン テ ン ツ を論理順に構築す る 必要があ り 、 こ れはた と えそれを視覚順に作成 す る ほ う が簡単で あ っ て も 変え る こ と はで き ま せん。 こ れ と 対照的に、 ア イ テ ム の ア ク テ ィ ブ化を用い る と 、 コ ン テ ン ツ を視覚順で作成す る こ と が可能にな り ます (あ る いはア プ リ ケーシ ョ ンに と っ て便利ないかな る 順序で も ) 。 こ の技法は、 コ ン テ ン ツが複数ペー ジにわた る 場合に も 適用で き ます。 Acrobat での諸問題を回避す る ため、 PDF_activate_item( ) を呼び出 し た直後には、 直接 コ ン テ ン ツ を追加す る べ き ではな く 、 他の構造エ レ メ ン ト だけ を追加する べき です。 カ レ ン ト で ア ク テ ィ ブ な構造エ レ メ ン ト を ク エ リ parent ・ index オ プ シ ョ ン や PDF_ activate_item( ) を使 う ためには、 カ レ ン ト でア ク テ ィ ブな構造エ レ メ ン ト と その子に関す る 知識がい く ら か必要にな り ます。 こ の ス テー タ ス情報は、 アプ リ ケーシ ョ ン側で把握 し てお く こ と も で き ますが、 PDFlib か ら ク エ リ す る こ と も 可能です。 関数 PDF_get_option( ) でキーワー ド activeitemid ・ activeitemindex ・ activeitemkidcount ・ activeitemname ・ activeitemstandardname を用い る と 、 カ レ ン ト エ レ メ ン ト の ID ・ 番号 ・ 子エ レ メ ン ト 数 ・ 名前 ・ 標準名 (それが ロ ールマ ッ プ さ れてい る 場合) が得 ら れます。 10.4.5 タ グ付 き PDF ページ を PDI で取 り 込む ク ッ ク ブ ッ ク タ グ付き PDF 文書から ページ を取 り 込むためのコ ー ド サン プルが、PDFlib ク ッ ク ブ ッ クの pdfua カ テ ゴ リ 内の ト ピ ッ ク clone_pdfua ・ merge_and_stamp_pdfua にあ り ます。 306 第 10 章 : 文書交換 タ グ付 き PDF モー ド では、 タ グ付 き PDF 文書か ら のページは、 その構造エ レ メ ン ト タ グ 群 と 一緒に取 り 込まれます。 略称 と し て、 タ グ付 き PDF モー ド で usetags=true を用いて 取 り 込ま れた タ グ付 き PDF 文書か ら のページの こ と を 「 タ グ付 きページ」 と 呼ぶ こ と に し ま し ょ う 。 こ の ス テー タ ス を ク エ リ する には、 PDF_info_pdi_page( ) の tagged キー ワー ド を用い ます。 タ グ付 き ページの取 り 込みは、 以下の説明の よ う に動作 し ます。 タ グ付き PDF 文書を開 く PDF_open_pdi_document( ) が、 取 り 込ま れ る 文書がカ レ ン ト の PDF/A-1a/2a/3a ま たは PDF/UA モー ド と 互換か ど う かをチ ェ ッ ク し た う えで、取 り 込 まれ る 文書の構造ツ リ ーを読み取 り ます。 usetags オプシ ョ ンが false の場合には、 その文書の構造情報は無視 さ れ、 その文書か ら は何の タ グ も 取 り 込まれません。 注 属性ク ラ ス と ク ラ スマ ッ プは取 り 込まれません。 入力文書言語を転写 も し PDF 文書の大半ない し すべてのページが、 PDI を用いて取 り 込まれた も のであ る 場合には、その入力文書内にその文書言語エン ト リ が存在 し てい る な ら ば、 それを転写す る こ と を推奨 し ます。 こ の文書言語を転写す る には、 pCOS と 以下の コ ー ド 断片を用い ます : if (p.pcos_get_string(indoc, "type:/Root/Lang").equals("string")) { inputlang = p.pcos_get_string(indoc, "/Root/Lang"); optlist += " lang=" + inputlang; } p.begin_document(filename, optlist); タ グ付き ページ を開 く PDF_open_pdi_page( ) が、取 り 込まれたページの内容を構成す る 構造エ レ メ ン ト 群を選択 し 、 そのページ上に存在す る タ グ を フ ィ ル タ し ます。 た と えば、 し お り のための タ グは除去 さ れます。なぜな ら PDI は イ ン タ ラ ク テ ィ ブ要素を取 り 込ま な いか ら です。 最後に、 取 り 込まれたページ上の、 取 り 込まれた構造下位ツ リ ーの最上位を 形成す る 1 個ない し 複数の構造エ レ メ ン ト が選択 さ れます。usetags オプシ ョ ンが false の 場合には、 そのページの構造情報は完全に無視 さ れます。 取 り 込ま れた文書の ロ ールマ ッ プ内のエ ン ト リ 群は、 も し そのページ上で、 その照応 す る エ レ メ ン ト が用い ら れてい る な ら ば、 出力文書の ロ ールマ ッ プへコ ピー さ れます。 衝 突 し あ う ロ ールマ ッ プエ ン ト リ 群 (すなわち、 あ る カ ス タ ム タ グ がすでに、 生成文書の ロ ールマ ッ プ内で、 あ る いはそれ以前に取 り 込まれた文書内で、 別の標準 タ グへマ ッ プ さ れてい る) は無視 さ れます。 ただ し PDF/UA モー ド では、 衝突 し あ う ロ ールマ ッ プエン ト リ を持つページは拒絶 さ れ、すなわち PDF_open_pdi_page( ) への呼び出 し は失敗 し ます。 無効な タ グ構造を持つ文書を取 り 込む PDFlib は、 285 ページ 「 構造エ レ メ ン ト に対す る ネ ス ト 規則」 で説明 し た通 り の、 ISO 32000-1 で課 さ れてい る タ グネ ス ト 規則に関す る 厳格なチ ェ ッ ク を実装 し てい ます。 こ れ ら のチ ェ ッ ク は、 取 り 込ま れ る 文書に対 し て も 、 そ し て取 り 込まれ る ページか ら 作成 さ れ る タ グ構造に対 し て も 適用で き ます。取 り 込まれ たページ内のネ ス ト 規則は、デフ ォ ル ト ではチ ェ ッ ク さ れません。し か し 、こ れ ら のチ ェ ッ ク は、 PDF_open_pdi_document( ) の checktags オプシ ョ ン で有効にす る こ と も 可能です。 checktags=strict の場合には、 PDF_open_pdi_page( ) ですべての タ グネ ス ト 規則が強制 さ れ ます。 も し も 取 り 込まれたページの構造 ヒ エ ラ ルキーが、 構造エ レ メ ン ト に対す る ネ ス ト 規則 に 違反 し て い る と き は、 PDF_open_pdi_page( ) へ の 呼び出 し は失敗 し 、 PDF_get_ errmsg( ) はた と えば以下の よ う なエ ラ ーを報告 し ます : 10.4 タ グ付き PDF の高度な ト ピ ッ ク 307 Grouping element type 'Document' cannot contain direct content (but only other structure elements) 多数の既存の現実世界の タ グ付 き PDF 文書が こ の タ グネ ス ト 規則に違反 し てい ますので、 取 り 込んだ文書内の こ れ ら の問題への対処 と し て、以下の方式のいずれかを用い る こ と が で き ます : > 取 り 込まれた構造 ヒ エ ラ ルキーのて っぺんに追加の タ グ を挿入す る(た と えば PDF_fit_ pdi_page( ) の tags オプシ ョ ンで) こ と は、 取 り 込まれたページがその文書ルー ト の直 下に直接 コ ン テ ン ツ を内容 と し てい る あ り がちな問題を正すために有用です。 > 他の諸問題は、 追加の タ グ を挿入 し て も 解決で き ません。 た と えば表や箇条書 き のた めの構造エ レ メ ン ト が不完全な と き な ど です。 可能であれば入力文書を直す こ と を考 慮す る べ き です。 こ れが実行可能な解決策でない場合には、 PDF_open_pdi_document( ) で checktags=none と 設定す る こ と に よ っ て、 非準拠の タ グ構造を持つ タ グ付 き PDF ページ を取 り 込む こ と も で き ます。 > も し も 取 り 込ま れた構造自体は正 し く て、 ただ出力文書の生成 さ れた新 し い タ グ群 と 衝突 し てい る と い う 場合には、 その新 し い タ グ群を適切に調整す る こ と を試み る べ き です。 も し こ れが現実的でないな ら ば、 PDF_begin_document( ) で checktags=none と 設 定す る こ と に よ っ て、生成 さ れた タ グ付け構造内の衝突を無視す る こ と も で き ます。こ れは PDF/UA モー ド では許容 さ れません。 いずれの形の checktags=none に よ っ て処理 さ れた非準拠入力 も 、 非準拠の PDF 出力を生 成する おそれがあ り ますので、 こ の設定は推奨 し ません。 取 り 込まれたページ内の タ グ を ク エ リ ・ チ ェ ッ ク 状況に よ っ ては、 取 り 込ま れた構造 エ レ メ ン ト 群を、生成 さ れ る 新た な構造 ヒ エ ラ ルキー内に正 し く 統合 さ せ る こ と が難 し い 場合 も あ り ます。こ の状況を支援す る ために、ページ を開 く こ と が成功 し た後に PDF_info_ pdi_page( ) を用い る と 、 取 り 込まれた タ グ付き PDF ページのい く つかの特性を ク エ リ す る こ と がで き ます : > キー ワー ド fittingpossible は、 そのページがカ レ ン ト コ ン テ キ ス ト 内に配置で き る か ど う か を報告 し ます。 その tag オプシ ョ ン を与え る と 、 そのページ を追加の最上位レベ ル タ グ と と も に配置で き る か ど う か を チ ェ ッ ク で き ま す。 こ の tag オ プ シ ョ ン の tagname サブオプシ ョ ンだけが評価 さ れます : 他のサブオプシ ョ ンは与え る べ き では あ り ません。 こ のキー ワ ー ド を用い る こ と は、 取 り 込 ま れ る ページ内の構造情報に関 し て よ く わか っ てお ら ず、 取 り 込まれた構造エ レ メ ン ト 群が不適合であ るせいで PDF_ fit_pdi_page( ) で例外が発生す る こ と を避け たい状況において推奨 さ れ ま す。 も し も ページが こ の fittingpossible テ ス ト で拒絶 さ れた場合には、 その tag オプシ ョ ン を通 じ て追加の タ グ を挿入す る こ と を試み る こ と も で き ます。 > キー ワー ド topleveltagcount は、 最上位レベル構造エ レ メ ン ト の数を報告 し ます。 なぜ な ら 最上位レベル タ グが複数あ る 場合 も あ る か ら です。 なお topleveltagcount は、 その ページ内容が何の構造エ レ メ ン ト に よ っ て も 覆われていない稀な場合において、0 と な る こ と も あ り ます。 こ の よ う なページは、 タ グ付 き でないページの よ う に動作 し ます。 他の直接 コ ン テ ン ツ と 同様、 こ れはグループ化エ レ メ ン ト の子 と し て配置す る こ と は で き ず、 そのページのて っぺんに追加の タ グが必要です。 > キー ワー ド topleveltag は、 その取 り 込まれたページの最上位レベル構造エ レ メ ン ト (群) を報告 し ます。 こ れは、 取 り 込まれたページ構造にかぶせて追加の構造エ レ メ ン ト を挿入す る こ と がで き る か、 あ る いは挿入す る 必要があ る か ど う か を決定す る ため に有用で し ょ う 。 308 第 10 章 : 文書交換 > キーワー ド lang は、すべての最上位レベルの取 り 込まれた構造エ レ メ ン ト (群) の lang 属性を報告 し ます。 こ れは、 よ り 高い構造エ レ メ ン ト 内で lang 属性が必要か ど う か を 決め る 助け と な り ます。 タ グ付き ページ を配置 PDF_fit_pdi_page( ) が、 取 り 込まれたページ を新た なページ上に 配置 し 、 その構造 ヒ エ ラ ルキーを、 生成文書の構造ツ リ ー内に統合 し ます。 その際には、 カ レ ン ト でア ク テ ィ ブなエ レ メ ン ト を、 取 り 込まれた構造ツ リ ーの親 と し て用い ます。 追 加の構造エ レ メ ン ト を、PDF_fit_pdi_page( ) の tag オプシ ョ ン で作成す る こ と も で き ます。 こ れは、 取 り 込まれた構造 ヒ エ ラ ルキーのための新たな親 と し ての役割を果た し ます。 取 り 込まれた ヒ エ ラ ルキー内に Alt ま たは ActualText 属性が存在す る場合には、生成 さ れ る 文書構造内の も っ と 上にあ る 既存の属性 と の衝突が見出 さ れた と き は、 こ の Alt ま た は ActualText 属性は除去 さ れます (292 ページ 「代替テ キ ス ト と 置換テ キ ス ト に対す る ネ ス ト 規則」 参照)。 そのページが、 PDF_open_pdi_document( ) と PDF_open_pdi_page( ) で usetags=true を 用いて開かれてい る 場合には、 それは出力文書内に 1 回 し か配置で き ません。 なぜな ら 、 その取 り 込ま れた構造は、出力文書の構造 ヒ エ ラ ルキーの一意な位置に統合 さ れ る必要が あ る か ら です。 ただ し 、 ページが複数の位置において内容 と 構造に寄与する 場合には、 そ れを複数回開 く こ と がで き ます (すなわち、 別々のページハン ド ルが配置 さ れます)。 未知の文書構造を持つページ を取 り 込む際には、 以下の戦略を推奨 し ます : > PDF_info_pdi_page( )のtopleveltagcountキーワ ー ド が タ グ カ ウ ン ト 0を報告 し たな ら ば、 そのページは空であ る か、 ま たはページ装飾のみを内容 と し てい る かの ど ち ら かです。 アプ リ ケーシ ョ ン に よ っ ては、 こ の よ う なページは実質的な内容に全 く 寄与 し ないの で ス キ ッ プす る と 決め る こ と も で き る で し ょ う 。 それで も そのページ を取 り 込む場合 には、Acrobat の問題を回避す る ために追加の Artifact タ グ を与え る こ と を推奨 し ます。 > PDF_info_pdi_page( ) の fittingpossible キーワ ー ド が こ のページについて 1 を返 し たな ら ば、 こ れは PDF_fit_pdi_page( ) で安全に配置で き ます。 こ のテ ス ト は、 そのページが ページ装飾 と し て配置 さ れ る 場合には不要です。 > あ る いは、 取 り 込ま れたページの構造のて っぺんに追加の タ グ を挿入す る こ と も で き ます。 こ の タ グ を何にす る かの選択は、 アプ リ ケーシ ョ ンに よ っ て異な り 、 と り わけ、 取 り 込ま れたページが構造ツ リ ー内に挿入 さ れ る 場所にあ る 構造エ レ メ ン ト の種別に 依存 し ます。 > PDF_info_pdi_page( ) の fittingpossible キー ワー ド が、 追加の タ グ を用いて も なおその ページ を拒絶す る な ら ば、 アプ リ ケーシ ョ ンは別の タ グ を試すか、 あ る いはそのペー ジ を諦め る かの ど ち ら かで し ょ う 。 以下の コ ー ド 断片は、 上述の戦略を実装 し た も のです。 ページが直接配置で き ない場合 に、 追加の P エ レ メ ン ト を挿入 し てい ます : fittingpossible = true; additionaltag = ""; topleveltagcount = (int) p.info_pdi_page(page, "topleveltagcount", ""); if (topleveltagcount == 0) { /* このページは構造エレメントを何も含んでいません、 * すなわち、これは空であるか、ページ装飾のみを内容としています。 * Acrobatのバグを回避するために「Artifact」タグを追加しましょう。 */ additionaltag = "tag={tagname=Artifact} "; 10.4 タ グ付き PDF の高度な ト ピ ッ ク 309 } else /* * ページを追加のタグなしで配置してみます。 * これがうまくいかないならば、別のタグを挿入しましょう。 */ if (p.info_pdi_page(page, "fittingpossible", "") == 0) { additionaltag = "tag={tagname=P} "; if (p.info_pdi_page(page, "fittingpossible", additionaltag) == 0) { fittingpossible = false; } } if (fittingpossible) { p.fit_pdi_page(page, 0, 0, "adjustpage " + additionaltag); } else { System.err.println("ページをスキップします: " + p.get_errmsg()); } さ ま ざ ま な使用場面 タ グ付 き PDF モー ド でページ を取 り 込む こ と の使用場面は、 以下 の よ う に分類す る こ と がで き ます: こ れ ら の使用場面に対す る オプシ ョ ン と その他必要条 件を表 10.6 に ま と め ます : > タ グ を温存 : タ グ付 き PDF 文書か ら ページ を取 り 込んで、 その タ グ群を出力へ コ ピー し ます。 そのページ を構成す る 構造エ レ メ ン ト 群は、 新た な構造 ヒ エ ラ ルキーの一部 分 と な り ます。 オプシ ョ ナルに、 取 り 込ま れた ヒ エ ラ ルキーのて っぺんに追加の タ グ を配置す る こ と も で き ます。 > タ グ を破棄 : タ グ付 き ま たは タ グ な し PDF 文書か ら ページ を取 り 込んで、 そのページ 全体に 1 個の新た な タ グで タ グ付け し ます。 既存の構造エ レ メ ン ト 群は破棄 さ れ、 取 り 込ま れたページの コ ン テ ン ツ は単一の タ グ を構成 し 、 内部構造を一切持た な く な り ます。 > ページ装飾 と し て配置: タ グ付 き ま たは タ グ な し PDF 文書か ら ページ を取 り 込んで、そ のページ全体をページ装飾 と し てマー ク し ます。 た と えば背景グ ラ フ ィ ッ ク に使 う 場 合な ど です。 既存の構造エ レ メ ン ト 群は破棄 さ れます。 10.4.6 WCAG 2.0 のための PDFlib の さ ま ざ ま な技法 W3C は、 WCAG 2.0 のための PDF の さ ま ざ ま な技法を、 以下のページに挙げてい ます。 www.w3.org/TR/WCAG20-TECHS/pdf.html こ の W3C の勧告文書は、 WCAG 2.0 準拠を達成す る ために必要な PDF 機能群を挙げ る と と も に、 こ れ ら の機能を Adobe Acrobat で、 ま た Microsoft Word ・ OpenOffice と いっ た対 話型文書作成ツールで作成す る 方法を説明 し てい ます。 こ の項では、 WCAG のゴール群 を PDFlib で達成す る 方法を説明 し ま し ょ う 。 番号 と ゴール記述は、 上述の W3C 文書か ら その ま ま採っ てい ます。 なお、 WCAG 2.0 のための PDF 技法群は、 ア ク セシブル PDF 文書のためのすべての技 術的必要条件を完全に網羅 し てい る わけではあ り ません。 こ のギ ャ ッ プは、 ア ク セシブル 310 第 10 章 : 文書交換 表 10.6 タ グ付き PDF モー ド で タ グ付き ・ タ グな し PDF ページ を取 り 込み 使用場面 取 り 込まれ るページ オプ シ ョ ン 必要条件 と コ メ ン ト タ グ を温存 タ グ付き PDF_open_pdi_document( ) と PDF_open_pdi_page( ) で usetags=true > 親1 は、 イ ン ラ イ ン要素か擬似要素であ っ てはいけま せん > 取 り 込まれたページ を配置で き るのは 1 回だけ > 取 り 込まれたページの最上位レ ベルエ レ メ ン ト (群) はネス ト 規則を守る必要があ り ます タ グ を破棄 ページ装飾 と し て配置 タ グ付きか タ グな し 2 タ グ付きか タ グな し PDF_open_pdi_document( ) か PDF_open_pdi_page( ) で usetags=false > 取 り 込まれたページの コ ン テ ン ツは、 カ レ ン ト で ア PDF_fit_pdi_page( ) で tag={tagname=Artifact} > 取 り 込まれたページの コ ン テ ン ツはページ装飾にな ク テ ィ ブ なア イ テムの一部分にな り ます > 非グループ化親エ レ メ ン ト のみ許容 さ れます り ます 1. PDF_begin_item( ) で、 ま たは PDF_fit_pdi_page( ) の tag オ プ シ ョ ン で指定 さ れた、 カ レ ン ト で ア ク テ ィ ブ な タ グ 2. こ の状況は、 実際に何 ら かのページ内容を指 し 示 し ている構造エ レ メ ン ト が全 く ない タ グ付き PDF ページについて も 起 こ り え ます。 な PDF のための技術仕様を提供 し てい る PDF/UA 規格が埋め ます。 こ の規格について詳 し く は 352 ページ 「11.6 PDF/UA に よ る ユニバーサルア ク セシ ビ リ テ ィ 」 で説明 し ます。 以下で tag オプシ ョ ンに言及す る 場合、 かわ り に PDF_begin_item( ) への同等な呼び出 し を用い る こ と も で き 、 い く つかの場合には逆 も 真です (すべての場合にではあ り ま せ ん。 なぜな ら グループ化エ レ メ ン ト を tag オプシ ョ ン で作成す る こ と はで き ないか ら で す)。 PDFlib ク ッ ク ブ ッ ク 内に適切なサンプル コ ー ド があ る 場合には、 それへの参照 も 示 し ます。 PDF1 : PDF 文書内で Alt エ ン ト リ を用い て画像に テキス ト 代替を適用す る こ と こ の ゴールは、 PDF_fit_image( ) か PDF_fit_graphics( ) か PDF_fit_pdi_page( ) の tag オプシ ョ ン の Alt サブオプシ ョ ン を用いて達成で き ます : p.fit_image(image, x, y, "tag={tagname=Figure Alt={テーブルの横に座っている少女}} ..."); 詳 し く は 291 ページ 「10.3.5 代替テ キ ス ト ・置換テ キ ス ト ・略語拡張」 を参照 し て く だ さ い。 ク ッ ク ブ ッ ク PDFlib ク ッ ク ブ ッ ク の pdfua カ テ ゴ リ 内の starter_pdfua1 ト ピ ッ ク にサン プル コ ー ド があ り ます。 PDF2 : PDF 文書内に し お り を作成す る こ と いて達成で き ます : こ のゴールは、PDF_create_bookmark( ) を用 bm = p.create_bookmark(text, optlist); オプシ ョ ナルに、 タ グ付 き し お り を作成す る こ と も で き ます (302 ページ 「 タ グ付 き し お り 」 参照) : id = p.begin_item("H1", "Title={第1章} "); b = p.create_bookmark("第1章", "item=current"); p.fit_textline(text, x, y, ""); p.end_item(id); 10.4 タ グ付き PDF の高度な ト ピ ッ ク 311 ク ッ ク ブ ッ ク PDFlib ク ッ ク ブ ッ クの pdfua カ テ ゴ リ 内の starter_pdfua1 ト ピ ッ ク にサン プル コ ー ド があ り ます。 PDF3 : PDF 文書内で正 し い タ ブ順 と 読み取 り 順序を付け る こ と こ の件は、 293 ページ 「10.3.6 印刷ス ト リ ーム順序 と 論理読み取 り 順序」 で説明 し てい ます。 こ の ゴールは多 く の場合、 ページ コ ン テ ン ツ を 論理読み取 り 順序で作成す る こ と に よ っ て達成で き ま す。 ページ内容を異な る 順序で作成する ための も っ と 高度な技法は 305 ページ 「10.4.4 コ ン テ ン ツ を順序に と ら われず作成」 で説明 し てい ます。 こ れに加え て、 PDF_begin_document( ) で taborder=structure オプシ ョ ン を用い る 必要があ り ます。 PDF4 : PDF 文書内で Artifact タ グ を用い て装飾画像を隠す こ と こ の ゴ ー ル は、 PDF_ fit_image( )かPDF_fit_graphics( )かPDF_fit_pdi_page( )のtagオプシ ョ ンのtagname=Artifact サブオプ シ ョ ン を用いて達成で き ま す。 同 じ 技法を用いて、 PDF_fit_textline( ) ・ PDF_fit_ graphics( ) な ど の関数を用いて作成 さ れた装飾テ キ ス ト かベ ク ト ルグ ラ フ ィ ッ ク を隠す こ と も で き ます : p.fit_image(image, x, y, "tag={tagname=Artifact} ..."); 詳 し く は 288 ページ 「10.3.3 ページ装飾」 を参照 し て く だ さ い。 ク ッ ク ブ ッ ク PDFlib ク ッ ク ブ ッ クの pdfua カ テ ゴ リ 内の starter_pdfua1 ト ピ ッ ク にサン プル コ ー ド があ り ます。 PDF5 : PDF フ ォ ーム内で必須の フ ォ ーム コ ン ト ロ ールを そのよ う に示す こ と こ の ゴールは、 PDF_create_field( ) ・ PDF_create_fieldgroup( ) の required オプシ ョ ン を用いて達 成で き ます。 その フ ィ ール ド のツールチ ッ プは、 その フ ィ ール ド が記入必須であ る旨の表 示を含むべ き です : optlist = "required tooltip={氏名(必須)} font=" + font; p.create_field(llx, lly, urx, ury, "date", "textfield", optlist); ク ッ ク ブ ッ ク カ テ ゴ リ Interactive Elements に、 フ ォ ーム フ ィ ール ド 作成のための さ ま ざ ま なサン プル があ り ます。 pdfua カ テ ゴ リ は、 タ グ付き PDF 内で フ ォ ーム フ ィ ール ド を作成する方法を 演示 し ています。 PDF6 : PDF 文書内で表のマー ク ア ッ プのために テ ーブルエ レ メ ン ト を用い る こ と こ のゴールは、 PDF_fit_table( ) と 自動表 タ グ付け を用いて表出力を作成す る こ と に よ っ て最 も 容易に達成で き ます。 すべての必要なテーブル タ グ と 属性が PDFlib に よ っ て自動的に 作成 さ れます。 ただ し 、 PDF_fit_table( ) の headers ・ caption オプシ ョ ンに然 る べ き 値を与 え る こ と が条件です。詳 し く は 297 ページ 「10.4.1 自動表 タ グ付け」 を参照 し て く だ さ い。 手作業の表 タ グ付け (推奨 し ません) の場合には、 以下を考慮す る必要があ り ます : > 表は Table エ レ メ ン ト 内に包含す る 必要があ り ます。 > 適切な Caption エ レ メ ン ト を作成す る 必要があ り ます。 > TR エ レ メ ン ト で各表行を囲 う 必要があ り ます。 > TH ・ TD エ レ メ ン ト を各表セルに対 し て適切に用い る必要があ り ます。 > 複数の表行か列にわた る セルには、然 る べ き RowSpan お よ び / ま たは ColSpan 属性を割 り 当て る 必要があ り ます。 > コ ン テ ン ツ を持たない表セルに対 し て空 TD エ レ メ ン ト を作成す る必要があ り ます。 312 第 10 章 : 文書交換 ク ッ ク ブ ッ ク PDFlib ク ッ ク ブ ッ ク の pdfua カ テ ゴ リ 内の tagged_table ト ピ ッ ク に、 表を自動的に組んで タ グ付けする ためのサン プル コ ー ド があ り ます。 PDF7 : スキ ャ ン さ れた PDF 文書上で OCR を実行す る こ と に よ っ て実際のテ キス ト を提 供す る こ と 光学文字認識 (OCR) は PDFlib の ス コ ープ を超えてい ます。 ただ し 、 ス キ ャ ン さ れたページについて利用可能な、 その照応す る OCR 生成結果を持っ てい る な ら 、 そ のテ キ ス ト を textrendering=3 (不可視テ キ ス ト ) を用いて出力す る こ と に よ っ て、 その ス キ ャ ン さ れた画像を、 その照応す る テ キ ス ト と 合体 さ せ る こ と がで き ます。 ク ッ ク ブ ッ ク PDFlib ク ッ ク ブ ッ ク の pdfua カ テ ゴ リ 内の tagged_scan_with_ocr_text ト ピ ッ ク にサン プル コ ー ド があ り ます。 PDF8 : 構造エ レ メ ン ト に対 し て E エ ン ト リ を通 じ て略語の定義を提供す る こ と こ の ゴールは、 PDF_begin_item( ) の E オプシ ョ ン を用いて、 ま たは PDF_fit_textline( ) や他の関 数の tag オプシ ョ ンの E サブオプシ ョ ン を用いて達成で き ます : p.begin_item("tag={tagname=P E={January} }"); そのテ キ ス ト だけ を内容 と す る 構造エ レ メ ン ト がない場合には、ASpan 擬似 タ グ を用い る こ と に よ っ て、構造エ レ メ ン ト の任意の フ ラ グ メ ン ト に対 し て E プ ロ パテ ィ を紐付け る こ と がで き ます : p.fit_textline("Jan.", x, y, "tag={tagname=ASpan E={January} } ..."); 詳 し く は 291 ページ 「10.3.5 代替テ キ ス ト ・置換テ キ ス ト ・略語拡張」 を参照 し て く だ さ い。 PDF9 : PDF 文書内で見出 し タ グ を用いて コ ン テ ン ツ を マー ク す る こ と に よ っ て見出 し を提供す る こ と こ の ゴ ー ル は、 PDF_fit_textline( ) や他 の 関数 の tag オ プ シ ョ ン の tagname=H1 サブオプシ ョ ン (お よ び関連 タ グ H ・ H2 ・ H3…) を用いて達成で き ます : p.fit_textline("はじめに", x, y, "tag={tagname=H1} ..."); ク ッ ク ブ ッ ク PDFlib ク ッ ク ブ ッ ク の pdfua カ テ ゴ リ 内の starter_pdfua1 ト ピ ッ ク にサン プル コ ー ド があ り ます。 PDF10 : PDF 文書内の イ ン タ ラ ク テ ィ ブ フ ォ ーム コ ン ト ロ ールに対 し て ラ ベルを提供す る こ と こ のゴールは、 PDF_create_field( ) か PDF_create_fieldgroup( ) の tooltip オプシ ョ ン を用いて達成で き ます : optlist = "tooltip={お名前を入力して下さい} font=" + font; p.create_field(llx, lly, urx, ury, "date", "textfield", optlist); ク ッ ク ブ ッ ク PDFlib ク ッ ク ブ ッ ク の pdfua カ テ ゴ リ 内の accessible_form_fields ト ピ ッ ク にサン プル コ ー ド があ り ます。 PDF11 : PDF 文書内で /Link 構造エ レ メ ン ト を用い て リ ン ク と リ ン ク テキス ト を提供す る こ と こ のゴールは、 Link エ レ メ ン ト と 、 ネ ス ト さ れた OBJR エ レ メ ン ト と コ ン テ ン ツ エ レ メ ン ト を作成す る こ と に よ っ て達成で き ます。 詳 し く は 300 ページ 「 リ ン ク と その 他の注釈種別」 を参照 し て く だ さ い。 10.4 タ グ付き PDF の高度な ト ピ ッ ク 313 ク ッ ク ブ ッ ク PDFlib ク ッ ク ブ ッ クの pdfua カ テ ゴ リ 内の starter_pdfua1 ト ピ ッ ク にサン プル コ ー ド があ り ます。 PDF12 : PDF 文書内の フ ォ ーム フ ィ ール ド に対 し て名前 ・ 役割 ・ 値情報を提供す る こ と こ のゴールは、 PDF_create_field( ) ・ PDF_create_fieldgroup( ) の引数 と オプシ ョ ン を用 いて、 以下の よ う に達成で き ます : > その フ ィ ール ド の役割を type 引数で指定。 > その フ ィ ール ド の名前を tooltip オプシ ョ ンで指定。 > その初期値を currentvalue オプシ ョ ンで指定 : その フ ォーム を リ セ ッ ト し た後の値は defaultvalue オプシ ョ ンで指定 し ます。 > ラ ジオボ タ ン と チ ェ ッ ク ボ ッ ク ス の ス タ イ ルを buttonstyle オプシ ョ ンで指定。 ク ッ ク ブ ッ ク PDFlib ク ッ ク ブ ッ クの pdfua カ テ ゴ リ 内の accessible_form_fields ト ピ ッ ク にサン プル コ ー ド があ り ます。 PDF13 : PDF 文書内の リ ン ク に対 し て /Alt エ ン ト リ を用いて代替テキス ト を提供す る こ と こ のゴールは、 Link エ レ メ ン ト に対 し て Alt オプシ ョ ン を与え る こ と に よ っ て達成で き ます : id_link = p.begin_item("Link", "Alt={Kraxi on the Web}"); 詳 し く は 291 ページ 「10.3.5 代替テ キ ス ト ・置換テ キ ス ト ・略語拡張」 を参照 し て く だ さ い。 PDF14 : PDF 文書内で ラ ン ニ ン グヘ ッ ダ ・ フ ッ タ を提供す る こ と こ のゴールは、文書の タ イ ト ルや章 タ イ ト ル ・ ページ番号 ・ 著者名 ・ 日付な ど の情報を、 ページ上の一貫 し た位 置に配置す る こ と に よ っ て達成で き ます。 たいていの場合、 こ れはページの上端か下端の 近 く に配置 さ れます。 ヘ ッ ダ と フ ッ タ は、ページネーシ ョ ンページ装飾 と し て タ グ付けす る こ と も で き ます: optlist = "tag={tagname=Artifact artifacttype=Pagination " + "artifactsubtype=Header Attached={Top Left} } ..."; p.fit_textline("Page 5", x, y, optlist); 詳 し く は 288 ページ 「10.3.3 ページ装飾」 を参照 し て く だ さ い。 PDF15 : PDF フ ォ ーム内で フ ォ ーム送信ア ク シ ョ ン を持つ送信ボ タ ン を提供す る こ と こ のゴールは、 PDF_create_field( ) で type=pushbutton を用いて フ ォーム フ ィ ール ド を 作成す る こ と に よ っ て達成出来ます : submit = p.create_action("SubmitForm", "exportmethod=html url={http://www.kraxi.com/get.php}"); optlist = "tooltip={フォームを送信} action={up=" + submit + "} " + "fontsize=8 font=" + font; p.create_field(llx, lly, urx, ury, "Submit", "pushbutton", optlist); ク ッ ク ブ ッ ク PDFlib ク ッ ク ブ ッ クの pdfua カ テ ゴ リ 内の accessible_form_fields ト ピ ッ ク にサン プル コ ー ド があ り ます。 PDF16 : PDF 文書の文書 カ タ ロ グ内で /Lang エ ン ト リ を用いてデ フ ォ ル ト 言語を設定す る こ と こ のゴールは、PDF_begin_document( ) の lang オプシ ョ ン を用いて達成で き ます: 314 第 10 章 : 文書交換 p.begin_document(filename, "lang=en"); 言語は、 個別の構造エ レ メ ン ト に対 し て も 指定で き ます : 315 ページ 「PDF19 : PDF 文書 内で Lang エン ト リ を用いて引用文や句に対す る 言語を指定す る こ と 」 を参照 し て く だ さ い。 ク ッ ク ブ ッ ク PDFlib ク ッ ク ブ ッ ク の pdfua カ テ ゴ リ 内の starter_pdfua1 ト ピ ッ ク にサン プル コ ー ド があ り ます。 PDF17 : PDF 文書に対 し て一貫 し たページ番号付け を指定す る こ と こ の ゴ ー ル は、 PDF_begin/end_page_ext( ) の label オプシ ョ ン を用いて、各ページ上に存在す るページネー シ ョ ン情報に照応す る 論理ページ番号かページ名を与え る こ と に よ っ て実現で き ます。 こ れは、ページ上に印字 さ れ る ページ番号がそのページの物理ページ番号 と 異な る場合に必 要です。た と えば、目次を載せ る ページ群には ロ ーマ数字が振 ら れ る こ と が よ く あ り ます: p.begin_page_ext(595, 842, "label={style=R}"); こ れを、その文書の中で異な る ページネーシ ョ ン形式を用い る セ ク シ ョ ン それぞれの最初 のページに対 し て行 う 必要があ り ます。 た と えば、 メ イ ン コ ン テ ン ツページ群は、 10 か ら 始ま る 算用数字に切 り 替わ る か も し れません : p.begin_page_ext(595, 842, "label={style=D start=10}"); 詳 し く は、 PDFlib リ フ ァ レ ン ス内の label オプシ ョ ンの説明を参照 し て く だ さ い。 PDF18 : PDF 文書の文書情報辞書内の Title エ ン ト リ を用いて文書 タ イ ト ルを指定す る こ と こ のゴールは、 PDF_set_info( ) を用いて Title を設定する こ と に よ っ て、 あ る いは こ れ と 等価の XMP プ ロ パテ ィ dc:title を PDF_begin/end_document( ) の metadata オプシ ョ ン を用いて与え る こ と に よ っ て達成で き ます : p.set_info("Title", "Phone bill for May 2013"); タ イ ト ルバーに こ の タ イ ト ルが (フ ァ イ ル名がではな く ) 必ず表示 さ れ る よ う にす る に は、PDF_begin/end_document( ) の viewerpreferences オプシ ョ ンの displaydoctitle サブオプ シ ョ ン を用い ます : p.begin_document(filename, "viewerpreferences={displaydoctitle}"); ク ッ ク ブ ッ ク PDFlib ク ッ ク ブ ッ ク の pdfua カ テ ゴ リ 内の starter_pdfua1 ト ピ ッ ク にサン プル コ ー ド があ り ます。 PDF19 : PDF 文書内で Lang エ ン ト リ を用いて引用文や句に対す る言語を指定す る こ と こ の ゴールは、 PDF_begin_item( ) の Lang オプシ ョ ン を用いて、 あ る いは PDF_fit_ textline( ) や他の関数の tag オプシ ョ ンの Lang サブオプシ ョ ン を用いて達成で き ます : p.begin_item("tag={tagname=P lang=de }"); そのテ キ ス ト だけ を内容 と す る 構造エ レ メ ン ト がない場合には、ASpan 擬似 タ グ を用い る こ と に よ っ て、 構造エ レ メ ン ト の任意の フ ラ グ メ ン ト に対 し て Lang プ ロ パテ ィ を紐付け る こ と がで き ます : p.fit_textline("Widerrufsrecht", x, y, "tag={tagname=ASpan Lang=de} ..."); 10.4 タ グ付き PDF の高度な ト ピ ッ ク 315 詳 し く は 289 ページ 「言語指定」 を参照 し て く だ さ い。 PDF20 : Adobe Acrobat Pro のテ ーブルエデ ィ タ ー を用いて タ グ付け誤 り の表を修復す る こ と PDFlib の自動表 タ グ付け機能が使われ る な ら ば、すべての表は正 し く タ グ付け さ れます。 複雑な表レ イ ア ウ ト に対 し ては、 追加の表属性を与え る必要が生 じ る場合 も あ り ます。 自動的に生成 さ れ る 表 タ グについて詳 し く は 297 ページ 「10.4.1 自動表 タ グ付け」 を参照 し て く だ さ い。 表が手作業で タ グ付け さ れ る 場合には、 必要な表 タ グ と 属性を作成す る のはユーザー 側の役割です。 ク ッ ク ブ ッ ク PDFlib ク ッ ク ブ ッ クの pdfua カ テ ゴ リ 内の tagged_table ト ピ ッ ク に、 表を自動的に組んで タ グ付けする ためのサン プルコ ー ド があ り ます。 PDF21 : PDF 文書内の箇条書 き に対 し て箇条書 き タ グ を用い る こ と こ の ゴールは、 303 ページ 「10.4.3 箇条書 き 」 で説明 し てい る と お り 、 箇条書 き エ レ メ ン ト を、 L ・ Caption ・ LI ・ Lbl ・ LBody エ レ メ ン ト を用いて正 し く タ グ付けする こ と に よ っ て達成で き ます。 ク ッ ク ブ ッ ク PDFlib ク ッ ク ブ ッ クの pdfua カ テ ゴ リ 内の tagged_list ト ピ ッ ク にサン プル コ ー ド があ り ま す。 PDF22 : PDF フ ォ ーム内でユーザー入力が所定の形式ま たは値を逸脱 し た と き にそれを 示す こ と こ のゴールは、ユーザー入力を検証す る ためにその フ ォーム フ ィ ール ド に付け ら れた JavaScript を用いて達成で き ます : optlist = "script={ ... }"; validate_action = p.create_action("JavaScript", optlist); textfield_font = p.load_font("Helvetica", "pdfdoc", "nosubsetting"); optlist = "action={validate=" + validate_action + "} " + "backgroundcolor={gray 0.8} font=" + textfield_font + "tag={tagname=Form} tooltip={開始日}"; p.create_field(llx, lly, urx, ury, "startdate", "textfield", optlist); 上記の コ ー ド 断片の中に示 さ れていないサンプル JavaScript コー ド も 見 る には、 269 ペー ジ 「フ ォーム フ ィ ール ド 入力を検証」 を参照 し て く だ さ い。 ク ッ ク ブ ッ ク カ テ ゴ リ Interactive Elements に、 フ ォ ーム フ ィ ール ド 作成のための さ ま ざ ま なサン プル があ り ます。 pdfua カ テ ゴ リ は、 タ グ付き PDF 内で フ ォ ーム フ ィ ール ド を作成する方法を 演示 し ています。 PDF23 : PDF 文書内で イ ン タ ラ ク テ ィ ブ フ ォ ーム コ ン ト ロ ールを提供す る こ と こ の ゴールは、 PDF_create_field( ) と tooltip オプシ ョ ン を用いて必要な フ ォーム フ ィ ール ド を 生成す る こ と に よ っ て達成で き ます。 上述の PDF22 でサン プル コ ー ド を示 し てい ます : 他の フ ィ ール ド 種別 も 同様に作成で き ます。 ク ッ ク ブ ッ ク カ テ ゴ リ Interactive Elements に、 フ ォ ーム フ ィ ール ド 作成のための さ ま ざ ま なサン プル があ り ます。 pdfua カ テ ゴ リ は、 タ グ付き PDF 内で フ ォ ーム フ ィ ール ド を作成する方法を 演示 し ています。 316 第 10 章 : 文書交換 11 PDF のバージ ョ ン と 規格 11.1 Acrobat ・ PDF のバージ ョ ン ユーザー側での選択に従い、PDFlib は以下の PDF バージ ョ ンに従っ た出力を生成 し ます: > PDF 1.4 (Acrobat 5) > PDF 1.5 (Acrobat 6) > PDF 1.6 (Acrobat 7) > PDF 1.7 (Acrobat 8)。 技術的には ISO 32 000-1 と 同等 > PDF 1.7 Adobe 拡張レベル 3 (Acrobat 9) > PDF 1.7 Adobe 拡張レベル 8 (Acrobat X ・ XI) > ISO 32000-2 に従っ た PDF 2.0 PDF 出力のバージ ョ ンは、 PDF_begin_document( ) の compatibility オプシ ョ ン で制御す る こ と がで き ます。 それぞれの PDF 互換モー ド においては、 それ よ り も 高い レベルのため の PDFlib 機能は利用で き ません (表 11.1 参照)。 その よ う な機能を利用 し よ う と す る と 例 外が発生 し ます。 PDI で取 り 込む文書の PDF バージ ョ ン ど の互換モー ド において も 、PDI で取 り 込め る の はそれ以下の PDF バージ ョ ンの PDF 文書だけです。 それ よ り 新 し い PDF バージ ョ ンの PDF を取 り 込む必要があ る場合は、 それに合っ た compatibility オプシ ョ ン を設定す る必 要があ り ます (202 ページ 「7.3.3 文書 ・ ページ関連のチ ェ ッ ク 」 参照)。 ただ し こ の上位 PDF バージ ョ ン取 り 込み不可ルールの例外 と し て、 PDF 1.7 拡張レベル 3 (Acrobat 9) ・ PDF 1.7 拡張レベル 8 (Acrobat X/XI) に従っ た文書は PDF 1.7 文書へ も 取 り 込む こ と が可 能です。 文書の PDF バージ ョ ン を変更 あ る 特定の PDF バージ ョ ンに従っ て出力を作成す る 必要 があ る に も かかわ ら ず、 それ よ り も 高い PDF バージ ョ ン を用いた PDF を取 り 込む必要が あ る 場合には、 その文書を PDI で取 り 込む前に まず、 出力 し たい PDF バージ ョ ンに下げ る変換を行 う 必要があ り ます。 メ ニ ュ ー項目 「 フ ァ イル」 → 「その他の形式で保存 ...」 → 「最適化 さ れた PDF...」 (Acrobat XI) を、 あ る いは 「フ ァ イル」 → 「名前を付けて保存 ...」 → 「最適化 さ れた PDF...」 (Acrobat X) を、 あ る いは 「ア ド バン ス ト 」 → 「PDF の最適化」 → 「互換性」 (Acrobat 9) を用いれば、 PDF バージ ョ ン を以下の よ う に変え る こ と がで き ます : > Acrobat 9 : PDF 1.3 ~ PDF 1.7 拡張レベル 3 > Acrobat X ・ XI : PDF 1.3 ~ PDF 1.7 拡張レベル 8 表 11.1 特定の PDF 互換モー ド を要する PDFlib 機能 機能 PDFlib API 関数 ・ オプ シ ョ ン PDF 2.0 = ISO 32000-2 特定の PDF 規格を要する機能 文書部分 ヒ エ ラルキー PDF_begin/end_dpart( ) : 文書部分 ヒ エ ラ ルキーは PDF 2.0 か PDF/VT を要 し ます。 11.1 Acrobat ・ PDF のバージ ョ ン 317 表 11.1 特定の PDF 互換モー ド を要する PDFlib 機能 機能 PDFlib API 関数 ・ オプ シ ョ ン フ ァ イル添付の関係 PDF_load_asset( ) で type=Attachment を用いた場合 と PDF_add_portfolio_file( ) に対する オプ シ ョ ン relationship、 および PDF_begin/end_document( ) の attachments オプ シ ョ ン と PDF_create_annotation( ) の attachment オプ シ ョ ン に対するサブオプ シ ョ ン relationship : 関係指定は PDF 2.0 か PDF/A-3 を 要 し ます。 連携フ ァ イル PDF_end_document( ) ・ PDF_begin/end_page_ext( ) ・ PDF_begin/end_dpart( ) ・ PDF_begin_template_ext( ) ・ PDF_load_image( ) ・ PDF_open_pdi_page( ) ・ PDF_load_ graphics( ) に対する オプ シ ョ ン associatedfiles : 連携 フ ァ イルは PDF 2.0 か PDF/A-3 を要 し ます。 PDF 1.7 拡張レ ベル 8 (Acrobat X/XI) 以上を要する機能 256 ビ ッ ト キーを用いた AES 暗号 PDF_begin_document( ) : compatibility=1.7ext8 を用いる と 、 化 masterpassword か userpassword か attachmentpassword か permissions オプ シ ョ ンが与え ら れてい る場合には、 256 ビ ッ ト と 、 拡張レ ベル 3 のものよ り 強力な暗号化アルゴ リ ズム と を用いた AES 暗号化が自動的に用い られます。 PDF/X-4:2010 でのレ イ ヤーの直 接使用 (レ イ ヤーバ リ ア ン ト な し) PDF_set_layer_dependency( ) : オプ シ ョ ン createorderlist PDF 1.7 拡張レ ベル 3 (Acrobat 9) 以上を要する機能 マルチ メ デ ィ ア (Flash) PDF_load_asset( ) PDF_create_annotation( ) : オプ シ ョ ン type=RichMedia PDF_create_action( ) : オプ シ ョ ン type=RichMediaExecute PDF_begin_document( ) : オプ シ ョ ン portfolio、 サブオプ シ ョ ン navigator ・ initialview=custom 地理空間 PDF PDF_begin_document( ) : オプ シ ョ ン viewports PDF_load_image( ) : オプ シ ョ ン georeference フ ォ ルダのある PDF ポー ト フ ォ リオ PDF_add_portfolio_folder( ) 256 ビ ッ ト キーを用いた AES 暗号 PDF_begin_document( ) : compatibility=1.7ext3 を用いる と 、 化 masterpassword か userpassword か attachmentpassword か permissions オプ シ ョ ンが与え ら れてい る場合には、 PDF 1.7ext3 に従っ た AES-256 暗号化ア ルゴ リ ズムの中にある脆弱性を回避する ために、 PDF 1.7 に従 っ た 128 ビ ッ ト を用いた AES 暗号化が自動的に用い られます。 レ イ ヤーバ リ ア ン ト PDF_set_layer_dependency( ) : 依存種別 Variant ( こ の機能は PDF 1.7ext 3 を要 し ませんが、 Acrobat 9 で し か動作 し ません) 参照 PDF PDF_open_pdi_page( ) ・ PDF_begin_template_ext( ) の reference オプ シ ョ ン ( こ の機能は PDF 1.7ext 3 を要 し ませんが、 Acrobat 9 以上で し か動作 し ませ ん) PRC 形式の 3D モデルの埋め込み PDF_load_3ddata( ) : オプ シ ョ ン type=PRC バー コ ー ド フ ィ ール ド PDF_create_field( ) ・ PDF_create_fieldgroup( ) : オプ シ ョ ン barcode PDF 1.7 = ISO 32000-1 (Acrobat 8) 以上を要する機能 PDF ポー ト フ ォ リ オ PDF_begin_document( ) : オプ シ ョ ン portfolio PDF_add_portfolio_file( ) 318 第 11 章 : PDF のバージ ョ ン と 規格 表 11.1 特定の PDF 互換モー ド を要する PDFlib 機能 機能 PDFlib API 関数 ・ オプ シ ョ ン 添付に Unicode フ ァ イル名 PDF_begin/end_document( ) : オプ シ ョ ン attachments、 サブオプ シ ョ ン filename PDF 1.6 (Acrobat 7) 以上を要する機能 ユーザー単位 PDF_begin/end_document( ) : オプ シ ョ ン userunit 印刷の拡縮 PDF_begin/end_document( ) : viewerpreferences オプ シ ョ ンに対するサブオ プ シ ョ ン printscaling 文書を開 く モー ド PDF_begin/end_document( ) : オプ シ ョ ン openmode=attachments 128 ビ ッ ト キーによ る AES 暗号化 PDF_begin_document( ) : compatibility=1.61.7 の場合、 masterpassword か userpassword か attachmentpassword か permissions オプ シ ョ ンが与え られ ている と きは、 自動的に AES 暗号化が用い られます。 フ ァ イル添付のみを暗号化 PDF_begin/end_document( ) : オプ シ ョ ン attachmentpassword 添付の説明 PDF_begin/end_document( ) : オプ シ ョ ン attachments に対するサブオプ シ ョ ン description U3D 形式の 3D モデルの埋め込み PDF_load_3ddata( ) ・ PDF_create_3dview( ) PDF_create_annotation( ) : オプ シ ョ ン type=3D PDF_create_action( ) : オプ シ ョ ン type=GoTo3DView PDF 1.5 (Acrobat 6) 以上を要する機能 さ ま ざ ま な フ ィ ール ド オプ シ ョ ン PDF_create_field( ) ・ PDF_create_fieldgroup( ) ページ レ イ アウ ト PDF_begin/end_document( ) : オプ シ ョ ン pagelayout=twopageleft/right さ ま ざ ま な注釈オプ シ ョ ン PDF_create_annotation( ) 拡張権限設定 PDF_begin_document( ) で permissions=plainmetadata、 表 3.4 参照 日中韓フ ォ ン ト に対する さ ま ざ ま な CMap PDF_load_font( )、 表 4.5 参照 タ グ付き PDF PDF_begin_item( ) に対する さ ま ざ ま なオプ シ ョ ン。 PDF_begin/end_page_ext( ) : オプ シ ョ ン taborder レ イ ヤー PDF_define_layer( ) ・ PDF_begin_layer( ) ・ PDF_end_layer( ) ・ PDF_layer_ dependency( ) JPEG 2000 画像 PDF_load_image( ) で imagetype=jpeg2000 圧縮オブ ジ ェ ク ト ス ト リ ーム compatibility=1.5 以上の場合には、 自動的に圧縮オブ ジ ェ ク ト ス ト リ ーム が生成 さ れます。 ただ し 、 PDF_begin_document( ) で objectstreams=none と 設定 さ れてい る場合を除き ます。 11.1 Acrobat ・ PDF のバージ ョ ン 319 11.2 PDF 標準 ISO 32000 ISO 32000-1 PDF 1.7 は ISO 32000-1 と し て標準化 さ れてい ます。 こ の国際標準の技術的 内容は Adobe の PDF 1.7 リ フ ァ レ ン ス と 等価です。こ れは Acrobat 8 の フ ァ イ ル形式です。 PDFlib を用いて作成 さ れ る PDF 文書は ISO 32000-1 に準拠 し てい ます。ただ し 、ISO 320001 の一部分ではないなが ら 、 PDFlib では compatibility=1.7 以下を用い る と 利用可能な、 若 干の非推奨の PDF 機能があ り ます。 こ れ ら の機能が包含 さ れてい る 理由は実用上の需要 か ら です。 表 11.2 内の機能は、 ISO 32000-1 への準拠が必須であ る 場合には用いてはいけ ません。 表 11.2 ISO 32000-1 を超え る PDF 1.7 の機能 機能 PDFlib API 関数 ・ オプ シ ョ ン 文書部分 ヒ エ ラ ルキー PDF_begin/end_dpart( ) : 文書部分 ヒ エ ラルキーは PDF 2.0 か PDF/VT を要 し ます。 連携フ ァ イル PDF_end_document( ) ・ PDF_begin/end_page_ext( ) ・ PDF_begin/end_dpart( ) ・ PDF_begin_template_ext( ) ・ PDF_load_image( ) ・ PDF_open_pdi_page( ) ・ PDF_load_ graphics( ) : associatedfiles : 連携フ ァ イルは PDF 2.0 か PDF/A-3 を要 し ま す。 添付検索イ ンデ ッ ク ス PDF_begin_document( ) : オプ シ ョ ン search ISO 32000-2 執筆時点で、 こ の ISO 規格の次のバージ ョ ンが、 ISO 32000-2 と し て用意 さ れつつあ り ます。 こ の規格は、 PDF 2.0 を仕様化 し 、 以下の諸グループか ら の機能を取 り 込んでい ます : > Acrobat 9 の諸機能。PDFlib では compatibility=pdf1.7ext3 文書オプシ ョ ンで対応 し てい ま す。 た と えば地理参照付 き PDF ・ ヒ エ ラ ルキー型ポー ト フ ォ リ オ ・ AES-256 暗号化な ど。 詳 し い一覧については表 11.1 を参照 し て く だ さ い。 > Acrobat Xの諸機能。PDFlibではcompatibility=pdf1.7ext8文書オプシ ョ ンで対応 し てい ま す。 と り わけ、 よ り 強力な暗号化アルゴ リ ズ ム を用いた AES-256 暗号化。 > ISO 32000-1 規格の一部分でない PDF/A-3 ・ PDF/VT 規格で導入 さ れた諸機能。 内の機能は、 ISO 32000-2 への準拠が必須であ る 場合には用いてはいけ ません。 表 11.3 ISO 32000-2 に含まれな く な っ た PDF 機能 機能 PDFlib API 関数 ・ オプ シ ョ ン PostScript XObject PDF_begin_template_ext( ) : オプ シ ョ ン postscript 320 第 11 章 : PDF のバージ ョ ン と 規格 11.3 PDF/A に よ る アー カ イ ビ ン グ 11.3.1 各種の PDF/A 規格 ISO 19005 規格シ リ ーズで定め ら れた各種の PDF/A 形式は、長期間にわた っ て安全にアー カ イ ブで き る 、あ る いは企業や政府の環境において信頼性を持っ たデー タ 交換に利用で き る 、 首尾一貫、 かつ堅牢な PDF の部分集合を提供 し ます。 PDF 協会内 PDF/A 技術セ ン タ ー PDFlib GmbH は PDF 協会 (the PDF Association) の創立 メ ンバーです。 PDF 協会、 その さ ま ざ ま な活動の 1 つ と し て、 PDF/A 技術セ ン タ ー (PDF/ A Competence Center) を ホ ス ト し て い ま す。 こ の業界組織 の目的は、 ISO 19005 に従っ た長期アーカ イ ビ ン グの分野に おけ る 情報 と 経験の交換の促進です。 PDF/A 技術セ ン タ ー の メ ンバーは、 PDF/A 標準 と その実装に関連す る 情報を積 極的に交換 し てお り 、 こ の テーマに関す る セ ミ ナーやカ ン フ ァ レ ン ス を開いてい ます。 詳 し く は PDF 協会の ウ ェ ブサ イ ト www.pdfa.org を参照 し て く だ さ い。 ISO 19005-1 に従 っ た PDF/A-1a:2005 ・ PDF/A-1b:2005 PDF/A-1 は PDF 1.4 をベース に、 色 ・ フ ォ ン ト ・ 注釈な ど の要素の使用に さ ま ざ ま な制約を課 し てい ます。 PDF/A-1 には 2 つの種類があ り ます : > ISO 19005-1 レベル B 準拠 (PDF/A-1b) は、文書の体裁が長期にわた っ て保持 さ れ る こ と を保証 し ます。 簡単にいえば PDF/A-1b は、 文書を将来いつの日か処理す る と き に それが今 と 同 じ に見え る こ と を保証す る も のです。 > ISO 19005-1 レベル A 準拠 (PDF/A-1a) は、レベル B をベース に、タ グ付 き PDF か ら 知 ら れた諸特性を追加 し ます : こ れは、 文書の論理構造 と 自然な読み上げ順序を保持す る ために、 構造情報 と 、 信頼のおけ る テ キ ス ト 意味付け を必須 と し ま す。 PDF/A-1a は、 その文書が将来において処理 さ れ る 際にそれが同 じ に見え る こ と を保証す る のみ な ら ず、 その コ ン テ ン ツ を信頼性を持っ て解釈で き 、 身体障碍を持つユーザーに対 し て も ア ク セシブルであ る こ と を保証す る も のです。 PDFlib 内の PDF/A-1 対応は以下の文書に基づいてい ます : > PDF/A-1 規格 (ISO 19005-1:2005) > 技術正誤表 1 (ISO 19005-1:2005/Cor 1:2007)。 > 技術正誤表 2 (ISO 19005-1:2005/Cor.2:2011)。 > PDF/A 技術セ ン タ ーが発行 し たすべての関連 TechNote。 PDF/A-1 と (準拠レベルを添えずに) 言 う と き は、 PDF/A-1a と PDF/A-1b の両方の準拠 レベルを意味 し ます。 ISO 19005-2 に従 っ た PDF/A-2a ・ PDF/A-2b ・ PDF/A-2u 各種 の PDF/A-2 規格 は、 ISO 32000-1 (すなわち PDF 1.7) に基づいてい ます。 こ の こ と は、 こ れ ら が PDF/A-1 よ り も 多 く の機能を サポー ト し てい る こ と を意味 し ます。 PDF/A-1 と 異な り 、 よ り 新 し い PDF/A-2 規格は、 透過 ・ レ イ ヤー ・ JPEG 2000 圧縮 ・ PDF/A フ ァ イ ル添付 ・ PDF パ ッ ケー ジやその他の PDF 諸機能を許 し てい ます。 PDF/A-2 は以下の種類を定義 し てい ます : > ISO 19005-2 レベル B 準拠 (PDF/A-2b)。 文書の視覚的体裁を確保 し ます。 11.3 PDF/A によ る アー カ イ ビ ング 321 > ISO 19005-2 レベル A 準拠(PDF/A-2a)。信頼のおけ る Unicode テ キ ス ト 意味付け と 、構 造情報を持つ タ グ付 き PDF を追加 し てい ます。 タ グは、 PDF/A-2a 文書が完全にア ク セシブルであ る こ と を確実に し ます。 > ISO 19005-2 レベル U 準拠(PDF/A-2u)。PDF/A-2a と PDF/A-2b の中間に位置付け ら れ ます。 なぜな ら こ れは、 信頼のおけ る Unicode テ キ ス ト 意味付けについては必須 と し ますが、 構造情報については必須 と し ないか ら です。 PDF/A-2u は、 そのページ群が忠 実に再現で き る こ と を、 ま た、 そのテ キ ス ト が抽出 ・ 検索で き る こ と を保証 し ます。 PDFlib 内の PDF/A-2 対応は以下の文書に基づいてい ます : > PDF/A-2 規格 (ISO 19005-2:2011) PDF/A-2 と (準拠レベルを添えずに) 言 う と き は、 PDF/A-2a ・ PDF/A-2b ・ PDF/A-2u の 3 種類すべての準拠レベルを意味 し ます。 ISO 19005-3 で定義 さ れた PDF/A-3a ・ PDF/A-3b ・ PDF/A-3u PDF/A-3 は、 以下の違いを 除いて PDF/A-2 と 同様です : > PDF/A-2 では、 PDF/A-1 か PDF/A-2 に準拠 し た フ ァ イ ル添付 し か許容 し ませんが、 PDF/A-3 では任意の フ ァ イ ル種別を添付 と し て許容 し ます。 > 添付 さ れた フ ァ イ ルは、 文書全体か、 ページか、 あ る いはその文書のその他の要素 と 関連付け さ れます。 フ ァ イ ル添付 と 、文書のそれに照応す る部分 と の間の関係が、 ソ ー ス ・ 代替 ・ 補足デー タ な ど、 明示的に指定 さ れ る必要があ り ます。 PDFlib 内の PDF/A-3 対応は以下の文書に基づいてい ます : > PDF/A-3 規格 (ISO 19005-3:2012) PDF/A-3 と (準拠レベルを添えずに) 言 う と き は、 PDF/A-3a ・ PDF/A-3b ・ PDF/A-3u の 3 種類すべての準拠レベルを意味 し ます。 11.3.2 一般的必要条件 ク ッ ク ブ ッ ク PDF/A を生成する ための コ ー ド サン プルが PDFlib ク ッ ク ブ ッ ク の pdfa カ テ ゴ リ にあ り ま す。 PDFlib ク ラ イ ア ン ト プ ロ グ ラ ムが、 こ の節で記す規則に従 う な ら 、 有効な PDF/A 出力が 保証 さ れます。 PDFlib は、 PDF/A 規則への違反を検出 し た と き には例外を発生 さ せます ので、 アプ リ ケーシ ョ ン側でそれを処理する 必要があ り ます。 こ の場合には PDF 出力は 作成 さ れません。表 11.4 に、PDF/A 準拠出力を作成す る ための一般的必要条件を挙げます。 PDF/A ・ PDF/UA 両立文書を作成 PDF/A 文書が同時に PDF/UA-1 に準拠す る こ と も 可能 です。 実際、 PDF/A-1a/2a/3a を作成 し たい場合には、 生成文書のア ク セシ ビ リ テ ィ を向 上 さ せる ために、 PDF/UA の必要条件に従 う こ と を推奨 し ます。 詳細 と 制約については、 352 ページ 「PDF/UA ・ PDF/A 両立文書を作成」 を参照 し て く だ さ い。 表 11.4 PDF/A 準拠レ ベル A ・ B ・ U のための一般的必要条件 項目 PDF/A 準拠 (すべての準拠レ ベル) のための PDFlib 関数 ・ オプ シ ョ ンの必要条件 PDF/A準拠レ ベル と PDF互換性 PDF_begin_document( ) : pdfa オプ シ ョ ン を、 必要な PDF/A 準拠レ ベルに設定する必要があ り ます。 例 : pdfa=PDF/A-2b (PDF/A-1) PDF 1.5 以上を要する操作 (レ イ ヤーな ど) を避ける必要があ り ます。 (PDF/A-2/3) PDF 1.7ext3 以上を要する操作 (PDF ポー ト フ ォ リ オな ど) を避ける必要が あ り ます。 322 第 11 章 : PDF のバージ ョ ン と 規格 表 11.4 PDF/A 準拠レ ベル A ・ B ・ U のための一般的必要条件 項目 PDF/A 準拠 (すべての準拠レ ベル) のための PDFlib 関数 ・ オプ シ ョ ンの必要条件 フォン ト フ ォ ン ト オプ シ ョ ン embedding を true にする必要があ り ます。 オプ シ ョ ン unicodemap=false と dropcorewidths=true は許容 さ れません。 PDF コ ア フ ォ ン ト について も 埋め込みが必須です。 この埋め込み必須は、 不可視テキス ト (主 と し て OCR の生成結果のために有用) に対 し てのみ用い られている フ ォ ン ト について だけはあてはま り ません。 こ れは、 optimizeinvisible オプ シ ョ ン を用いて制御する こ と も で き ます。 テキス ト 出力 (PDF/A-2/3) 出力内の .notdef グ リ フ を避ける ために、 フ ォ ン ト オプ シ ョ ン replacementchar が強制的に error にな り ます。 ページサイ ズ (PDF/A-2/3) PDF_begin/end_page_ext( ) : PDF/A には、 厳密なページサイ ズ制限はあ り ませ ん。 し か し 、 ページサイ ズ (幅 と 高 さ 、 お よびすべての枠エ ン ト リ ) を、 PDF/A-1 では範 囲 3 ~ 14400 ポ イ ン ト (508 cm)、 PDF/A-2/3 では範囲 3 ~ 14400 ユーザー単位に収める こ と が推奨 さ れます。 レ イ ヤー PDF/A-1 : PDF_define_layer( ) と PDF_set_layer_dependency( ) を避ける必要があ り ます。 PDF/A-2/3 : レ イ ヤーを使 う こ と はで き ますが、 PDF_define_layer( ) と PDF_set_layer_ dependency( ) のい く つかのオプ シ ョ ン を避ける必要があ り ます。 セキ ュ リ テ ィ PDF_begin_document( ) : userpassword ・ masterpassword ・ attachmentpassword ・ permissions オプ シ ョ ン を避ける必要があ り ます。 外部 コ ン テ ン ツ PDF_begin_template_ext( ) ・ PDF_load_graphics( ) ・ PDF_open_pdi_page( ) : reference オプ シ ョ ン を避け る必要があ り ます。 PDF_load_asset( ) : external オプ シ ョ ン を避ける必要があ り ます。 フ ァ イルサイ ズ 生成 さ れる PDF 文書のフ ァ イルサイ ズが 2 GB を超え てはな ら ず、 かつ、 PDF オブ ジ ェ ク ト の数が 8.388.607 未満で なければな り ません。 こ れら の制約について詳 し く は 71 ページ 「3.1.5 PDF 文書の最大サイ ズ と その他の制限」 を参照 し て く だ さ い。 PDF取 り 込み PDF_open_pdi_document( ) が制約 さ れます。 ただ し infomode=true の場合を除き ます。 328 ページ 「11.3.7 PDF/A 文書を PDI で取 り 込み」 を参照 し て く だ さ い。 PDF/A ・ PDF/X 両立文書を作成 PDF/A 文書が同時に PDF/X-1a:2003 か PDF/X-3:2003 か PDF/X-4 に準拠す る こ と も 可能です ( し か し PDF/X-4p か PDF/X-5 と は無理です)。 こ の よ う な両立フ ァ イ ルを作成す る には、 PDF_begin_document( ) の pdfa ・ pdfx オプシ ョ ン に対 し て適切な値を与え ます。 例 : ret = p.begin_document("combo.pdf", "pdfa=PDF/A-2b pdfx=PDF/X-4"); 11.3.3 色 と 画像の必要条件 PDF/A は、 忠実な色再現を保証す る ために、 デバ イ ス独立な色指定を必須 と し てい ます。 色空間は以下の ソ ース か ら 来 る こ と がで き ます : > PDF_load_image( ) と PDF_fill_imageblock ( ) を用いて直接的に、 お よ び PDF_load_ graphics( ) を通 じ て間接的に読み込まれた画像 > PDF_set_graphics_option( ) か PDF_setcolor( ) を用いた明示的な色指定 > オプシ ョ ン リ ス ト を通 じ た色指定。 た と えばテ キ ス ト フ ロ ー内な ど において。 > 透過グループの た めにブ レ ン ド す る 色空間 : PDF_begin/end_page_ext( ) ・ PDF_begin_ template_ext( ) ・ PDF_open_pdi_page( ) : オプシ ョ ン transparencygroup でサブオプシ ョ ン colorspace > イ ン タ ラ ク テ ィ ブ要素は枠色を指定す る こ と がで き ます 11.3 PDF/A によ る アー カ イ ビ ング 323 表 11.5 に、 上に挙げた操作すべてにおいて従 う 必要があ る、 色処理のための PDF/A 必要 条件を挙げます。 表 11.5 PDF/A 準拠レ ベル A ・ B ・ U のための色 と 画像の必要条件 項目 PDF/A (すべての準拠レ ベル) のための PDFlib 関数 ・ オプ シ ョ ンの必要条件 出力条件 (出力イ ン テ ン ト ) も し も デバイ ス依存色空間 Gray ・ RGB ・ CMYK の う ちのいずれかがその文書内で用い られ てお り 、 かつ然るべき デ フ ォル ト 色空間がそのページに対 し て存在 し ていないな らば、 PDF_begin_document( ) の直後に、 PDF_load_iccprofile( ) で usage=outputintent と し て呼び出 すか、 PDF_process_pdi( ) で action=copyoutputintent と し て呼び出す必要があ り ます。 グ レースケール カ ラー グ レースケールカ ラ ーを使え るのは、 グ レースケールか RGB か CMYK の出力イ ン テ ン ト が 存在する場合か、 PDF_begin_page_ext( ) で defaultgray オプ シ ョ ンが設定 さ れてい る場合だ けです。 RGBカ ラ ー RGB カ ラ ーを使え るのは、 RGB 出力イ ン テ ン ト が存在する場合か、 PDF_begin_page_ext( ) で defaultrgb オプ シ ョ ンが設定 さ れてい る場合だけです。 CMYKカ ラ ー CMYK カ ラ ーを使え るのは、 CMYK 出力イ ン テ ン ト が存在する場合か、 PDF_begin_page_ ext( ) で defaultcmyk オプ シ ョ ンが設定 さ れてい る場合だけです。 透過 と オーバープ リ ン ト (PDF/A-1) 透過を避ける必要があ り ます。 こ の こ と は以下の API 機能に影響を与え ます : > PDF_load_image( ) : masked オプ シ ョ ン を避け る必要があ り ます。 ただ し 、 そのマス ク が 1 ビ ッ ト 画像を指 し 示 し ている場合を除き ます。 > PDF_load_image( ) : 内在透過 (アルフ ァ チ ャ ン ネル) を持つ画像が許容 さ れません。 こ れ を読み込むには ignoremask オプ シ ョ ン を用い る必要があ り ます。 > PDF_load_graphics( ) : 透過要素を含んだ SVG グ ラ フ ィ ッ ク を避け る必要があ り ます。 > PDF_create_gstate( ) : opacityfill ・ opacity オプ シ ョ ン を避け る必要があ り ます。 ただ し 、 それが値 1 を持つ場合を除き ます。 blendmode を用いる場合には、 それが Normal で ある必要があ り ます。 > PDF_create_annotation( ) : opacity オプ シ ョ ン を避け る必要があ り ます。 (PDF/A-2/3) 透過は許容 さ れますが、 PDF_create_gstate( ) では以下の規則に従 う 必要があ り ます : も し も カ レ ン ト 色空間が ICC ベース CMYK カ ラ ーであ り 、 かつ overprintfill か overprintstroke が true の場合には、 overprintmode=1 は許容 さ れません。 透過グループ PDF_begin/end_page_ext( ) ・ PDF_begin_template_ext( ) ・ PDF_open_pdi_page( ) ・ PDF_load_ graphics( ) : オプ シ ョ ン transparencygroup が以下の と お り 制限 さ れます : (PDF/A-1) オプ シ ョ ン transparencygroup は許容 さ れません。 (PDF/A-2/3) transparencygroup オプ シ ョ ンのサブオプ シ ョ ン colorspace が、 上でグ レ ー スケール ・ RGB ・ CMYK カ ラ ーについて述べた必要条件を満たす必要があ り ます。 画像 と テ ン プ レー ト PDF_load_image( ) : OPI-1.3 ・ OPI-2.0 オプ シ ョ ン と interpolate=true オプ シ ョ ン を避ける 必要があ り ます。 PDF_begin_template_ext( ) : OPI-1.3 ・ OPI-2.0 ・ postscript オプ シ ョ ン を避ける必要があ り ます。 (PDF/A-2/3) JPEG 2000 画像は特定の条件を満たす必要があ り ますので、 詳 し く は 184 ページ 「JPEG 2000 画像」 を参照 し て く だ さ い。 出力 イ ン テ ン ト 出力条件は、 意図す る 出力先デバ イ ス を定義 し ます。 こ れは、 一貫性の あ る 色表現のために重要です。 PDF/X では常に出力 イ ン テ ン ト が必須ですが、 PDF/A で は こ れ と 異な り 、出力 イ ン テ ン ト ICC プ ロ フ ァ イ ルの使用はオプシ ョ ナルです。出力 イ ン テ ン ト は、 RGB 等デバ イ ス依存カ ラ ーがその文書内で使われてい る 場合にのみ必須です。 ICCベース カ ラ ー等デバ イ ス独立カ ラ ーのみがその文書内で使われてい る 場合には出力 イ ン テ ン ト は必要あ り ません。 PDF/X は出力 イ ン テ ン ト と し てプ リ ン タ ICC プ ロ フ ァ イ ル 324 第 11 章 : PDF のバージ ョ ン と 規格 にのみ対応 し てい ますが、 PDF/A ではモニ タ プ ロ フ ァ イ ル も 許容 さ れます。 こ れに よ り 、 広 く 使われてい る sRGB プ ロ フ ァ イ ルを出力 イ ン テ ン ト と し て使 う こ と も で き る よ う に な っ てい ます。出力 イ ン テ ン ト を指定する には、以下の よ う に ICC プ ロ フ ァ イ ルを用い ま す: icc = p.load_iccprofile("sRGB", "usage=outputintent"); ICC プ ロ フ ァ イ ルを読み込むのではな く 、 出力 イ ン テ ン ト を、 取 り 込んだ PDF/A 文書か ら コ ピーす る こ と も で き ます (329 ページ 「取 り 込んだ文書か ら PDF/A 出力 イ ン テ ン ト を コ ピー」 参照)。 生成 さ れ る 出力文書の出力 イ ン テ ン ト を設定す る のはち ょ う ど 1 回だ けにす る 必要があ り ます。 こ れを設定す る のは PDF_begin_document( ) の直後にす るべ き で す。 PDF/A を作成す る ための カ ラ ー戦略 表 11.6 に挙げ る カ ラ ー戦略の概略が、 さ ま ざ ま な PDF/A アプ リ ケーシ ョ ン を計画す る う えで役立つか も し れ ません。 多 く の状況で う ま く い く 最 も 簡単な手は、 sRGB 出力 イ ン テ ン ト ICC プ ロ フ ァ イ ルを使 う こ と です。 なぜな ら こ れはグ レース ケール と RGB カ ラ ーに対応 し てい る か ら です。 さ ら に、 sRGB は PDFlib に 内部的に知 ら れてい ますので、 外部プ ロ フ ァ イ ルデー タ や構成を要 し ません。 黒い テ キ ス ト を、 出力 イ ン テ ン ト プ ロ フ ァ イ ル を 必要 と せず作成 し た い場合には、 CIELab 色空間を使え ます。 その Lab カ ラ ー値 (0, 0, 0) は、 純粋な黒をデバ イ ス独立な形で 指定 し てお り 、 かつ出力 イ ン テ ン ト プ ロ フ ァ イ ルな し で PDF/A に準拠 し てい ます ( こ れ と 異な り DeviceGray では出力 イ ン テ ン ト プ ロ フ ァ イ ルが必須)。 PDFlib は各ページの先頭 でカ レ ン ト カ ラ ーを黒に初期化 し ます。ICC 出力 イ ン テ ン ト が指定 さ れてい る か ど う かに 応 じ て、 PDFlib は DeviceGray 色空間か Lab 色空間のいずれか を黒に対 し て用い ます。 以 下の呼び出 し を用いれば Lab 黒色を手動で設定で き ます : p.set_graphics_option("fillcolor={lab 0 0 0}"); 表 11.6 準拠レ ベル A ・ B ・ U のための PDF/A のカ ラ ー戦略 出力イ ン テ ン ト ICC プ ロ フ ァ イル その文書内で使え る色空間 CIELab ICC ベース Pantone ・ HKS グ レー スケール1 RGB1 CMYK1 なし ◯ ◯ ◯ - - - グ レースケール ◯ ◯ ◯ ◯ - - RGB。 例 : sRGB ◯ ◯ ◯ ◯ ◯ - CMYK ◯ ◯ ◯ ◯ - ◯ 1. ICC プ ロ フ ァ イルを持たないデバイ ス色空間 表 11.6 に挙げた色空間のみな ら ず、 カ ス タ ム ス ポ ッ ト カ ラ ーを、 その照応す る 代替色空 間に従っ て使 う こ と も で き ます。 PDFlib は CIELab を、 内蔵の HKS ・ PANTONE ス ポ ッ ト カ ラ ーに対す る 代替色空間 と し て用いてい ますので、 こ れ ら は常に PDF/A 規格 と と も に 使え ます。 カ ス タ ム ス ポ ッ ト カ ラ ーに対 し ては、 その代替色空間を、 それが出力 イ ン テ ン ト と 互換にな る よ う に選び取 る 必要があ り ます。 11.3 PDF/A によ る アー カ イ ビ ング 325 11.3.4 イ ン タ ラ ク テ ィ ブ機能に対す る必要条件 表 11.7 に、 PDF/A 準拠出力を生成す る 際に制約 さ れ る すべての操作を示 し ます。 禁 じ ら れたいずれかの関数を PDF/A モー ド 内で呼び出す と 例外が発生 し ます。 表 11.7 すべての PDF/A 準拠レ ベルのためのイ ン タ ラ ク テ ィ ブ機能に対する必要条件 項目 PDF/A (すべての準拠レ ベル) のための PDFlib 関数 ・ オプ シ ョ ンの必要条件 注釈 (PDF/A-1) PDF_create_annotation( ) が以下の制約に束縛 さ れます : > type=FileAttachment ・ Movie を持つ注釈を避ける必要があ り ます。 > テキス ト 注釈に対 し ては zoom ・ rotate オプ シ ョ ン を true に設定する必要があ り ます。 > annotcolor ・ interiorcolor オプ シ ョ ン を使え るのは、 RGB 出力イ ン テ ン ト が指定 さ れて いる場合のみです。 fillcolor オプ シ ョ ン を使え るのは、 RGB か CMYK 出力イ ン テ ン ト が指定 さ れている場合のみであ り 、 かつ照応する rgb か cmyk 色空間を用いる必要があ り ます。 > opacity オプ シ ョ ン を用いてはいけません。 (PDF/A-2/3) PDF_create_annotation( ) : type=Link のみが許容 さ れます。 添付 PDF/A-1 : PDF_begin/end_document( ) : attachments オプ シ ョ ン を避け る必要があ り ます。 PDF/A-2 : PDF_begin/end_document( ) : attachments オプ シ ョ ンの参照先が PDF/A-1 文書 か PDF/A-2 文書であ る必要があ り ます。 PDF/A-3 : associatedfiles オプ シ ョ ン を用いて任意のフ ァ イル種別を添付で き ますが、 attachments オプ シ ョ ン を避け る必要があ り ます。 以下の条件に従 う 必要があ り ます : > 添付は、 その文書の さ ま ざ ま な部分 と 関連付ける こ と がで き ます。 そのためには、 PDF_ end_document( ) ・ PDF_begin/end_page_ext( ) ・ PDF_begin/end_dpart( ) ・ PDF_begin_template_ ext( ) ・ PDF_load_image( ) ・ PDF_open_pdi_page( ) ・ PDF_load_graphics( ) の associatedfiles オプ シ ョ ン を用います。 それぞれの添付を、 その文書のち ょ う ど 1 つの部分に関連付け る必要があ り ます。 すなわち、 PDF_load_asset( ) を用いて作成 さ れたそれぞれのア セ ッ ト ハン ド ルを、 ち ょ う ど 1 つの associatedfiles オプ シ ョ ンに与え る必要があ り ます。 > mimetype ・ relationship サブオプ シ ョ ンが必須です。 > description サブオプ シ ョ ンが推奨 さ れます。 > external=true サブオプ シ ョ ン を避け る必要があ り ます。 フ ォ ーム フ ィ ール ド PDF_create_field( ) と PDF_create_fieldgroup( ) を避け る必要があ り ます。 アクシ ョ ンと JavaScript PDF_create_action( ) : type=Hide ・ Launch ・ Movie ・ ResetForm ・ ImportData ・ JavaScript を 持つア ク シ ョ ン を避ける必要があ り ます。 type=name に対 し ては、 NextPage ・ PrevPage ・ FirstPage ・ LastPage のみが許容 さ れます。 PDF_begin/end_document( ) ・ PDF_begin/end_page_ext( ) : オプ シ ョ ン action を避け る必要が あ り ます。 11.3.5 レ ベル U 準拠のための追加の PDF/A の必要条件 PDF/A-2u と PDF/A-3u のための、 規格の必要条件の多 く は、 PDFlib に よ っ て自動的に満 た さ れます。 レベル U 準拠の文書を生成す る 際には、 表 11.8 に挙げ る 操作のみが制限 さ れます。 言い換えれば、 アプ リ ケーシ ョ ンがすでに PDF/A-2b か PDF/A-3b を作成 し てお り 、 かつ表 11.8 の制約に従っ ていれば、 生成 さ れた文書はそれぞれ、 PDF/A-2u か PDF/ A-3u と し て も 宣言で き ます。 326 第 11 章 : PDF のバージ ョ ン と 規格 表 11.8 PDF/A 準拠レ ベル U のための追加の制約 項目 PDF/A-2u/3u 準拠のための PDFlib 関数 ・ オプ シ ョ ンの必要条件 フォン ト フ ォ ン ト オプ シ ョ ン unicodemap=false を避ける必要があ り ます。 11.3.6 レ ベル A 準拠のための追加の PDF/A の必要条件 PDF/A-1a ・ PDF/A-2a ・ PDF/A-3a を作成す る 際には、 278 ページ 「10.3 タ グ付き PDF の 基礎」 に従っ たすべての タ グ付 き PDF の必要条件を満たす必要があ り ます。 表 11.9 に、 レベル A に従っ た出力を生成す る ための必須操作 と 推奨操作を挙げます。一般的な タ グ付 き PDF の諸規則のほかに も 、 PDF/UA の必要条件に も 従 う こ と に よ っ て、 生成文書のア ク セシ ビ リ テ ィ を向上 さ せ る こ と を強 く 推奨 し ます。 詳 し く は 352 ページ 「11.6 PDF/UA に よ る ユニバーサルア ク セシ ビ リ テ ィ 」 を参照 し て く だ さ い。 正 し い構造情報を作成す る こ と はユーザー側の役割です。 文書のテ キ ス ト 全体を 1 個 の構造エ レ メ ン ト に入れた ら 、 技術的には正 し い PDF/A ですが、 忠実な意味付け再生 と い う ゴールに違反 し てい ます。 表 11.9 PDF/A 準拠レ ベル A のための追加の必要条件 項目 PDF/A-1a/2a/3a 準拠のための PDFlib 関数 ・ オプ シ ョ ンの必要条件 フォン ト フ ォ ン ト オプ シ ョ ン unicodemap=false を避ける必要があ り ます。 タ グ付きPDF タ グ付き PDF のためのすべての必要条件を満たす必要があ り ます (278 ページ 「10.3 タ グ 付き PDF の基礎」 参照)。 文書の構造 ヒ エ ラ ルキーは、 その文書の論理構造を、 で き る だ け正確に反映するべき です。 タ グ付きPDFの 推奨事項 以下の項目が強 く 推奨 さ れます : > すべての PDF/UA 規則に従 う こ と 。詳 し く は 352 ページ「11.6 PDF/UA に よ るユニバーサル ア ク セ シ ビ リ テ ィ 」 を参照 し て く だ さ い。 > テキス ト の自然言語を指定するべき です。 Lang オプ シ ョ ン を用います (289 ページ 「言語 指定」 参照)。 > 画像等非テキス ト コ ン テ ン ツ ア イ テムが代替記述を与え るべき です。 PDF_begin_item( ) の Alt オプ シ ョ ン を用いるか、 PDF_fit_image( ) ・ PDF_fit_pdi_page( ) な どの tag オプ シ ョ ン を 用います。 > 略語 と 頭字語が適切な拡張テキス ト を持つべき です。PDF_begin_item( ) の E オプ シ ョ ン で指 定するか、 tag オプ シ ョ ン で指定 し ます。 > ヘ ッ ダ ・ フ ッ タ ・ ページ番号 と い っ たページネーシ ョ ン機能をページ装飾 と し てマー ク するべき です。 artifacttype=pagination を用います。 単語境界 単語間を空白キ ャ ラ ク タ (U+0020) で区切る必要があ り ます。 autospace オプ シ ョ ン を用 いる と こ の作業を単純化で き ます。 テキス ト 出力 と PUA (PDF/A-2a/3a) PUA Unicode キ ャ ラ ク タ (ロ ゴや記号な ど) が、 適切な置換テキス ト を持 Unicodeキ ャ ラ ク タ つ必要があ り ます。 それを囲 う コ ン テ ン ツ ア イ テムに対する PDF_begin_item( ) の ActualText オプ シ ョ ン で指定するか、 その照応する出力関数の同等の tag オプ シ ョ ン で指 定 し ます (詳 し く は後述)。 注釈 PDF_create_annotation( ) : テキス ト を全 く 表示 し ない注釈に対 し ては contents オプ シ ョ ン が推奨 さ れます。 PUA キ ャ ラ ク タ PDF/A-2a と PDF/A-3a は、 私用領域、 略 し て PUA、 すなわち主 と し て 範囲 U+E000 ~ U+F8FF (詳 し く は 95 ページ 「BMP と PUA」 を参照) の中にあ る Unicode 値を持っ た キ ャ ラ ク タ に対 し て、 追加の必要条件を含んでい ます。 PUA キ ャ ラ ク タ は通 11.3 PDF/A によ る アー カ イ ビ ング 327 常、 装飾的 ・ 記号グ リ フ、 ま たは企業 ロ ゴ等カ ス タ ム グ リ フ です。 PDF/A-2a/3a は、 PUA キ ャ ラ ク タ が、そのキ ャ ラ ク タ のテ キ ス ト 表現を内容 と す る ActualText 属性を伴 う こ と を 必須 と し ます。 こ の ActualText は、 個別の PUA キ ャ ラ ク タ に対 し て割 り 当て る こ と も で き ます し 、 あ る 1 個の PUA キ ャ ラ ク タ を包含す る も っ と 長いキ ャ ラ ク タ 列に対 し て割 り 当て る こ と も で き ます。 こ の ActualText を、 Span イ ン ラ イ ン レベルエ レ メ ン ト と と も に 与え る こ と を推奨 し ます。 PDF_info_font( )を使っ て、あ る 特定の コ ー ド の、あ る 指定 し た フ ォ ン ト に対する Unicode 値をチ ェ ッ ク で き ます (147 ページ 「5.6.2 フ ォ ン ト 依存のエ ン コ ーデ ィ ン グ ・ Unicode ・ グ リ フ名 ク エ リ 」 参照) : uv = (int) p.info_font(font, "unicode", "code=" + c); こ の生成 さ れ る Unicode 値 uv が PUA に帰する 場合には、 こ れは ActualText 属性を必要 と し ます。 以下の コ ー ド 断片は、 PDFlib 企業 ロ ゴのグ ラ フ ィ カル表現を包含 し た PDFlibLogo と い う フ ォ ン ト を 想定 し て い ま す。 こ の ロ ゴ を ペー ジ上に配置す る 際には、 テ キ ス ト 「PDFlib Logo」 を内容 と す る 然 る べ き ActualText サブオプシ ョ ン を持っ た Span エ レ メ ン ト が tag オプシ ョ ンで与え ら れます : p.fit_textline(text, 50, 700, "fontname=PDFlibLogo encoding=unicode embedding fontsize=24 " + "tag={tagname=Span ActualText={PDFlib Logo}}"); そのグ リ フ に関 し て何 ら 情報を持たない場合、ゆえに然 るべ き ActualText がたやす く は得 ら れない場合には、 その フ ォ ン ト 内におけ る そのグ リ フ の名前を使 う と い う 手 も あ り ま す。 こ れを知 る には以下の よ う に し ます : gn_idx = (int) p.info_font(font, "glyphname", "code=" + c); glyphname = p.get_option(gn_idx, ""); こ のグ リ フ名を ActualText で使 う 際、 定常的な句 と 組み合わせる の も 手で し ょ う 。 た と え ば Wingdings フ ォ ン ト 内の コ ー ド 0x1A は、 コ ン ピ ュ ー タ キーボー ド の絵を内容 と し 、 グ リ フ名 keyboard を持ち ます。 こ のグ リ フは U+F037 へマ ッ プ し ます。 すなわち PUA 値で す。 実テ キ ス ト と し て 「keyboard の記号」 を用いれば、 こ の記号に対 し て意味を成すで し ょ う 。 ただ し 、 プ ロ グ ラ ム的に構築 さ れ る ActualText は、 当座 し のぎの解決策 と 考え る べ き です。 人の選ぶテ キ ス ト は常に、 機械生成の ActualText よ り も 望ま し い も のです。 11.3.7 PDF/A 文書を PDI で取 り 込み PDF/A 準拠の出力文書に既存の PDF 文書を取 り 込 も う と す る と き は、 追加の規則が適用 さ れます (PDF 取 り 込みについて詳 し く は 200 ページ 「7.3 PDF ページ を PDI で取 り 込む」 を参照)。 あ ら ゆ る 取 り 込み文書は、 表 11.10 に従っ た カ レ ン ト の PDF/A モー ド と 互換な PDF/A 準拠レベルに準拠 し てい る 必要があ り ます。 注 PDFlib は、入力 PDF 文書の PDF/A 準拠に関する検証は行わず、任意の入力 PDF 文書を PDF/ A へ変換する こ と も で き ません。 あ る 特定の PDF/A 準拠レベルが PDFlib で構成 さ れていて、 かつ、 取 り 込んだ文書がそれ と 互換な レベルを厳守 し てい る な ら ば、 生成 さ れ る 出力は、 選ばれた PDF/A 準拠レベル に従っ てい る こ と が保証 さ れます。カ レ ン ト の PDF/A レベル と 非互換の文書は PDF_open_ pdi_document( ) で拒絶 さ れます。 328 第 11 章 : PDF のバージ ョ ン と 規格 表 11.10 さ ま ざ ま な PDF/A 出力レ ベルに対する互換 PDF/A 入力レ ベル 取 り 込まれる文書の PDF/A レ ベル PDF/A 出力レ ベル PDF/A-2a ・ PDF/A-1a:2005 PDF/A-1b:2005 PDF/A-3a PDF/A-2b ・ PDF/A-3b PDF/A-2u ・ PDF/A-3u PDF/A-1a:2005 許容 - - - - PDF/A-1b:2005 許容 許容 - - - PDF/A-2a ・ PDF/A-3a 許容 - 許容 - - PDF/A-2b ・ PDF/A-3b 許容 許容 許容 許容 許容 PDF/A-2u ・ PDF/A-3u 許容 - 許容 - 許容 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの pdfa/import_pdfa ト ピ ッ ク にあ り ます。 1 個ない し 複数の PDF/A 文書を取 り 込む と き は、そのすべてが表 11.11 に従っ た互換な出 力条件で作成 さ れてい る 必要があ り ます。すべての取 り 込み文書の出力 イ ン テ ン ト は同一 か互換であ る 必要があ り 、 こ の条件を満たす よ う 手配す る のはユーザー側の役割です。 表 11.11 PDF/A 文書 (すべての準拠レ ベル) を取 り 込む際の出力イ ン テ ン ト の互換性 取 り 込む文書の出力イ ン テ ン ト 生成する文書の出力イ ン テ ン ト なし グ レース ケール RGB CMYK なし 有 - - - グ レースケールの ICC プ ロ フ ァ イル 有 1 有 - RGB の ICC プ ロ フ ァ イル 有 - 有 CMYK の ICC プ ロ フ ァ イル 有 - - - 1 - 有1 1. 取 り 込む文書の出力イ ン テ ン ト と 、 生成する文書の出力イ ン テ ン ト が、 同一であ る必要があ り ます。 PDFlib は、 い く つか特定の項目を修正す る こ と はで き ますが、 PDF/A の検証に利用 さ れ る よ う に も 、 ま た、 取 り 込んだ文書に PDF/A 準拠を強制す る よ う に も 作 ら れてい ません。 た と えば取 り 込んだ PDF のページに足 り ない フ ォ ン ト があ っ て も 、 PDFlib はそれの埋め 込みは し ません。 取 り 込んだページ を連結す る 際に、 で き あが る PDF 出力文書が入力文書 (群) と 同 じ PDF/A 準拠レベル ・ 出力条件に準拠する よ う に し たければ、 取 り 込んだ PDF の PDF/A 状 況を以下の よ う に ク エ リ す る こ と がで き ます : pdfalevel = p.pcos_get_string(doc, "pdfa"); こ の ス テー ト メ ン ト は、取 り 込んだ文書が PDF/A レベルに準拠 し ていればその PDF/A 準 拠レベルを示す文字列を取得 し 、 そ う でなければ none を返 し ます。 こ の返 さ れた文字列 を使えば、 PDF_begin_document( ) で pdfa オプシ ョ ン を使っ て、 出力文書の PDF/A 準拠 レベルを適切に設定す る こ と がで き ます。 取 り 込んだ文書か ら PDF/A 出力 イ ン テ ン ト を コ ピ ー PDF/A準拠レベルを ク エ リ す る 以 外の方法 と し て、 PDF/A 出力 イ ン テ ン ト は、 取 り 込んだ文書か ら コ ピーす る こ と も で き ます。PDF/A 文書には必ず し も 出力 イ ン テ ン ト があ る と はかぎ ら ないので、それを コ ピー 11.3 PDF/A によ る アー カ イ ビ ング 329 し よ う と す る 前に、 まず pCOS を使っ て、 出力 イ ン テ ン ト が存在す る か ど う かをチ ェ ッ ク す る 必要があ り ます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の pdfa/import_pdfa ト ピ ッ ク にあ り ます。 こ れは、 PDF_load_iccprofile( ) を使っ て出力 イ ン テ ン ト を設定す る 方法のかわ り に使 う こ と がで き 、 取 り 込んだ文書の出力 イ ン テ ン ト を、 生成す る出力文書へ コ ピー し ます。 出力 イ ン テ ン ト の コ ピーは、 取 り 込んだ PDF/A と PDF/X の文書で動作 し ます。 11.3.8 PDF/A のための XMP 文書 メ タ デー タ PDF/A は、 PDF 文書に メ タ デー タ を埋め込むために、 XMP 形式に強 く 依存 し てい ます。 PDF/A では、 2 つの種類の XMP 文書レベル メ タ デー タ に対応 し てい ます : 1 つは、 定義 済み ス キーマ と い う よ く 知 ら れた メ タ デー タ ス キーマの集合です。 こ れは、 XMP 仕様の 基礎を なすバージ ョ ン か ら 採 ら れた も のです。 も う 1 つはカ ス タ ム拡張 ス キーマです。 PDFlib は、 XMP の中の必須の PDF/A 準拠エン ト リ 群を自動的に作成する ほか、 い く つか の よ く 使われ る エン ト リ (CreationDate 等) も 自動的に作成 し ます。 XMP 文書 メ タ デー タ は、 PDF_begin_document( ) か PDF_end_document( ) ま たは両方の metadata オプシ ョ ンで与え る こ と がで き ます。 PDF/A モー ド では、 PDFlib は、 ユーザー が与え た XMP 文書 メ タ デー タ が PDF/A の要請に準拠 し てい る か ど う か を検証 し ます。コ ン ポーネ ン ト レベル (ページ ・ 画像等) の メ タ デー タ については、 PDF/A の要請はあ り ません。 取 り 込み PDF 文書の中の XMP メ タ デー タ は、 pCOS パ ス /Root/Metadata を用いて入 力 PDF か ら 抽出する こ と がで き ます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク のinterchange/import_xmp_from_pdf ト ピ ッ ク にあ り ます。 定義済み XMP スキーマ PDF/A 内の文書 メ タ デー タ に対する XMP の使用は、 以下の仕 様に基づいてい ます : > PDF/A-1 : XMP 2004 仕様 > PDF/A-2 ・ PDF/A-3 : XMP 20051 それぞれの XMP 仕様に記述 さ れた ス キーマ を定義済みス キーマ と いい、 それ ら の名前空 間 URI と その望ま し い名前空間接頭辞 と と も に表 11.12 に挙げてい ます。 定義済みス キー マのプ ロ パテ ィ のみを PDF/A では使え ます。 ただ し 、 拡張ス キーマ記述が存在す る 場合 は例外です (後述)。 PDF/A-1 のための定義済み XMP 2004 ス キーマ群内のプ ロ パテ ィ の 完全な一覧が、PDF 連合の PDF/A 技術セ ン タ ーか ら の TechNote 0008 内にあ り ます。PDF/ A-2/3 は、 XMP 2005 か ら の定義済みス キーマ群を追加 し てい ますが、 こ の追加ス キーマ は画像 と 動的 メ デ ィ アに関連 し た も のですので、文書 メ タ デー タ のために有用 と はな り に く いで し ょ う 。 XMP 拡張スキーマ記述 自分が必要 と す る メ タ デー タ が、 定義済みス キーマに含ま れて いない と き は、 XMP 拡張ス キーマ を定義す る こ と も で き ます。 PDF/A では、 カ ス タ ム ス キーマ を文書に埋め込む際に用いなければな ら ない拡張方式を記述 し てい ます。 表 11.13 に、 1 個ない し 複数の拡張ス キーマ と そのプ ロ パテ ィ 群を記述す る ために用いなければな ら ない ス キーマ を ま と め、 あわせてその名前空間 URI と 、 必要な名前空間接頭辞を示 し ま す。 名前空間接頭辞の、 必要な、 と い う 点に注意 し て く だ さ い (定義済みス キーマで示 し 1. www.aiim.org/documents/standards/xmpspecification.pdf 参照 330 第 11 章 : PDF のバージ ョ ン と 規格 表 11.12 PDF/A-1 のための定義済み XMP スキーマ (詳 し く は XMP 2004 と XMP 2005 を参照) スキーマの名称 と 説明 望ま し い 名前空間接頭辞 名前空間 URI PDF/A-1 ・ PDF/A-2 ・ PDF/A-3 で使 う ための XMP 2004 スキーマ群 Adobe PDF スキーマ http://ns.adobe.com/pdf/1.3/ pdf Dublin Core スキーマ http://purl.org/dc/elements/1.1/ dc EXIF 独自プ ロパテ ィ 群用 EXIF スキーマ http://ns.adobe.com/exif/1.0/ exif TIFF プ ロパテ ィ 群用 EXIF スキーマ http://ns.adobe.com/tiff/1.0/ tiff Photoshop スキーマ http://ns.adobe.com/photoshop/1.0/ photoshop XMP 基本ジ ョ ブ チケ ッ ト スキーマ http://ns.adobe.com/xap/1.0/bj xmpBJ XMP 基本スキーマ http://ns.adobe.com/xap/1.0/ xmp XMP メ デ ィ ア管理スキーマ http://ns.adobe.com/xap/1.0/mm/ xmpMM XMP ページ ド テキス ト スキーマ http://ns.adobe.com/xap/1.0/t/pg/ xmpTPg XMP 権利管理スキーマ http://ns.adobe.com/xap/1.0/rights/ xmpRights PDF/A-2 ・ PDF/A-3 で使 う ための追加 XMP 2005 スキーマ群 カ メ ラ Raw スキーマ http://ns.adobe.com/camera-rawsettings/1.0/ crs 追加 EXIF プ ロパテ ィ 群用 EXIF スキーマ http://ns.adobe.com/exif/1.0/aux/ aux XMP 動的 メ デ ィ ア スキーマ http://ns.adobe.com/xmp/1.0/DynamicMedia/ xmpDM た名前空間接頭辞 と は異な り 、 単に こ う つけ る のが望ま し い と い う だけではな く 、 それぞ れ こ の通 り につけ る 必要があ り ます)。 XMP 拡張ス キーマ記述の構築に関す る さ ら な る 詳細 と 例が、PDF/A 技術セ ン タ ーか ら の TechNote 009 にあ り ます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プル と XMP 作成例が ク ッ ク ブ ッ ク の pdfa/pdfa_extension_schema・pdfa/ pdfa_extension_schema_with_type ト ピ ッ ク にあ り ます。 表 11.13 PDF/A 拡張スキーマ コ ン テナスキーマ と 補助スキーマ スキーマの名称 と 説明 名前空間 URI1 必要な 名前空間接頭辞 PDF/A 拡張スキーマ コ ン テナスキーマ : あ ら ゆる拡張スキーマ記述を埋め込むた めの コ ン テナ http://www.aiim.org/pdfa/ns/extension/ pdfaExtension PDF/A スキーマ値種別 : 1 個の拡張ス キーマが任意個数のプ ロパテ ィ を持つの を記述 http://www.aiim.org/pdfa/ns/schema# pdfaSchema PDF/A プ ロパテ ィ 値種別 : 1 個のプ ロパ テ ィ を記述 http://www.aiim.org/pdfa/ns/property# pdfaProperty PDF/A ValueType 値種別 : 拡張スキーマ プ ロパテ ィ で用いる カ ス タ ム値種別を記 述。 XMP 2004 の種別一覧にない種別を 使いたい と き にのみ必要 と な り ます。 http://www.aiim.org/pdfa/ns/type# pdfaType 11.3 PDF/A によ る アー カ イ ビ ング 331 表 11.13 PDF/A 拡張スキーマ コ ン テナスキーマ と 補助スキーマ スキーマの名称 と 説明 名前空間 URI1 PDF/A フ ィ ール ド 種別スキーマ : 種別が http://www.aiim.org/pdfa/ns/field# 構造化 さ れてい る場合に、 その中の フ ィ ール ド を記述 1. 名前空間 URI は、 ISO 19005-1 では誤 っ て列挙 さ れてお り 、 技術正誤表 1 で修正 さ れま し た。 332 第 11 章 : PDF のバージ ョ ン と 規格 必要な 名前空間接頭辞 pdfaField 11.4 PDF/X に よ る印刷出力 11.4.1 PDF/X 規格 フ ァ ミ リ PDF/X 形式群は、 ISO 15930 規格フ ァ ミ リ で記述 さ れ、 商業印刷に適 し たデー タ の受け渡 し に利用で き る 一貫 し た堅牢な PDF の部分集合を提供する ために努力 し てい ます。PDFlib は、 以下に説明す る 種類の PDF/X に準拠 し た出力を生成 し 入力を処理す る こ と がで き ま す。 ISO 15930-4 で定義 さ れた PDF/X-1a:2003 こ の規格は、 それ以前の PDF/X-1a:2001 の後 継です。PDF 1.4 に基づいてお り 、い く つかの機能 (透過な ど) が禁止 さ れてい ます。PDF/ X-1a:2003 は PDF/X-3:2003 の厳密な部分集合です。 こ れは、 CMYK ・ ス ポ ッ ト カ ラ ー指 定 と CMYK 出力デバ イ ス に対応 し てい ます。 ISO 15930-6 で定義 さ れた PDF/X-3:2003 こ の規格は、 それ よ り 前の PDF/X-3:2002 の後 継です。 こ れは、 PDF 1.4 に基づいてお り 、 グ レース ケール ・ CMYK ・ ス ポ ッ ト カ ラ ーだ けでな く デバ イ ス独立色に基づ く ワー ク フ ロ ーに対応 し てい ます。特に ヨ ー ロ ッ パの国々 で広 く 利用 さ れてい ます。 出力デバ イ ス と し ては単色 ・ RGB ・ CMYK のいずれか を使 う こ と がで き ます。 い く つかの PDF 1.4 機能、 と り わけ透過が禁止 さ れてい ます。 ISO 15930-7 で定義 さ れた PDF/X-4 こ の規格は、 PDF/X-1a と PDF/X-3 の後継 と と ら え る こ と がで き ます。 PDF 1.6 に基づいてお り 、 以下の種類か ら 成 り ます : > PDF/X-4 では、 透過 と レ イ ヤーは許 さ れますが (い く つかの制限の も と に)、 それ以外 のい く つかの PDF 1.6 の機能は依然禁止 さ れてい ます。 > PDF/X-4p では、出力 イ ン テ ン ト ICC プ ロ フ ァ イ ルを、容量を抑え る ために PDF 文書の 外に置 く こ と が許 さ れます。 PDFlib は、 PDF/X-4 規格の 15930-7:2010 バージ ョ ン を実装 し てい ます。 2008 バージ ョ ン と 比べて、 こ の 2010 バージ ョ ン では、 レ イ ヤーの取 り 扱いに関 し て変更が加え ら れてい ます。 ISO 15930-8 で定義 さ れた PDF/X-5 こ の規格は 「部分的交換」 のための も のです。 部分 的交換を行 う には、 フ ァ イ ルの作 り 手 と 受け手の間で事前の協議が必要です。PDF/X-4 と PDF/X-4p の拡張 と と ら え る こ と がで き (すなわち PDF 1.6 に基づいてお り )、 以下の種 類か ら 成 り ます : > PDF/X-5g では、 グ ラ フ ィ ッ ク 内容を PDF 文書の外に許 し てい ます。 こ れは、文書の送 り 手 と 受け手 と の間で何 ら かの コ ミ ュ ニ ケーシ ョ ンが必要です。 > PDF/X-5pgでは、外部グ ラ フ ィ ッ ク 内容 と 外部出力 イ ン テ ン ト ICCプ ロ フ ァ イ ルを許 し ます。 > PDF/X-5n では、n- 顔料の印刷特性に対する 外部出力 イ ン テ ン ト ICC プ ロ フ ァ イ ルに対 応 し てい ます。 こ の種類は PDFlib では対応 し てい ません。 PDF/X-5 特有の機能を何 も 要 し ない場合は、 文書は PDF/X-4 か PDF/X-4p に従っ て作成 す る べ き です。 なぜな ら こ れ ら のほ う が一般的な規格だか ら です。 ISO 15930-8:2008 規格は、 外部参照グ ラ フ ィ ッ ク に対する XMP 指定エン ト リ 群に関 し て、 い く つか誤 り を含んでい ます。 こ の規格の修正バージ ョ ン ISO 15930-8:2010 が こ の 2008 バージ ョ ン を置 き 換え ます。 PDFlib は、 PDF/X-5:2010 を、 2011 年に発行 さ れてい る 正誤表 1 も 含めて実装 し てい ます。 11.4 PDF/X によ る印刷出力 333 Acrobat におけ る PDF/X-5 文書 PDF/X-5 文書を Acrobat で閲覧する 際には、以下に留意 す る こ と が重要です : > Acrobat XI は、参照 さ れた出力 イ ン テ ン ト ICC プ ロ フ ァ イ ルを持っ た PDF/X-5pg 文書を 開 く 際にハン グか ク ラ ッ シ ュ す る こ と があ り ます。 詳細 と 回避策については 338 ペー ジ 「参照 さ れた ICC 出力 イ ン テ ン ト に関す る Acrobat の問題」 を参照 し て く だ さ い。 こ の よ う な文書をプ リ フ ラ イ ト で検証す る 場合に も こ れ と 同 じ 回避策が必要です。 > 参照 さ れたページは、注意深い Acrobat 構成を必要 と し ます:詳 し く は 79 ページ 「参照 ページ を Acrobat で用い る 」 を参照 し て く だ さ い。 11.4.2 一般的必要条件 ク ッ ク ブ ッ ク PDF/X を生成する ための コ ー ド サン プルが PDFlib ク ッ ク ブ ッ クの pdfx カ テ ゴ リ にあ り ま す。 PDFlib ク ラ イ ア ン ト プ ロ グ ラ ムが、 こ の項に記す諸規則に従えば、 有効な PDF/X 出力が 保証 さ れます。 PDFlib は、 PDF/X 規則への違反を検出す る と 例外を発生 さ せます。 こ の 場合には PDF 出力は何 も 作成 さ れません。 表 11.14 に、 PDF/X 準拠出力を作成す る ため の一般的必要条件を挙げます。 表 11.14 PDF/X 準拠のための一般的必要条件 項目 PDF/X 互換のための PDFlib 関数 ・ オプ シ ョ ンの必要条件 PDF/X準拠レ ベル と PDF互換性 PDF_begin_document( ) : pdfx オプ シ ョ ン を、 必要な PDF/X 準拠レ ベルに設定する必要があ り ます。 例 : pdfx=PDF/X-4。 (PDF/X-1a:2003 ・ PDF/X-3:2003) PDF 1.5 以上を必要 と する操作を避ける必要があ り ます。 (PDF/X-4 ・ PDF/X-5) PDF 1.7 以上を必要 と する操作を避ける必要があ り ます。 フォン ト フ ォ ン ト オプ シ ョ ン embedding が true であ る必要があ り ます。 埋め込みは PDF コ ア フ ォ ン ト について も必須です。 ページサイ ズ PDF_begin/end_page_ext( ) : ページ枠群を cropbox ・ bleedbox ・ trimbox ・ artbox オプ シ ョ ン を通 じ て設定可能です。 こ れら が以下の必要条件を満たす必要があ り ます : > TrimBox か ArtBox を設定する必要があ り ますが、ただ し こ れら の枠エ ン ト リ を両方 と も設 定 し てはいけません。 TrimBox も ArtBox も見つから ない と きは、 PDFlib は CropBox ( も し あれば) を TrimBox と し て採 り 、 CropBox も見つから ない と きは MediaBox を採 り ます。 > BleedBox が、 存在する と きは、 ArtBox と TrimBox を完全に包含 し ている必要があ り ます。 > CropBox が、 存在する と きは、 ArtBox と TrimBox を完全に包含 し てい る必要があ り ます。 レ イ ヤー (PDF/X-1a ・ PDF/X-3) レ イ ヤーを避ける必要があ り ます。 (PDF/X-4 ・ PDF/X-5) レ イヤーを使え ますが、 ただ し PDF_define_layer( ) と PDF_set_layer_ dependency( ) のい く つかのオプ シ ョ ン を避ける必要があ り ます。 文書情報フ ィ ール ド と XMP メ タ デー タ Creator ・ Title 情報 フ ィ ール ド を、 空でない値に設定する必要があ り ます。 PDF_set_info( ) を用い るか、 (PDF/X-4 ・ PDF/X-5 では) PDF_begin/end_document( ) の metadata オプ シ ョ ン で xmp:CreatorTool ・ dc:title XMP プ ロパテ ィ を用います。 PDF_set_info( ) で Trapped 情報 フ ィ ール ド に、 ま たは PDF_begin/end_document( ) の metadata オプ シ ョ ン でその照応する XMP プ ロパテ ィ pdf:Trapped には、 値 True か False 以外を避け る必要があ り ます。 セキ ュ リ テ ィ 334 PDF_begin_document( ) : userpassword ・ masterpassword ・ permissions オプ シ ョ ン を避ける 必要があ り ます。 第 11 章 : PDF のバージ ョ ン と 規格 表 11.14 PDF/X 準拠のための一般的必要条件 項目 PDF/X 互換のための PDFlib 関数 ・ オプ シ ョ ンの必要条件 外部グ ラ フ ィ カル 内容 (参照) (PDF/X-1a/3/4) PDF_begin_template_ext( ) と PDF_load_graphics( ) と PDF_open_pdi_page( ) で reference オプ シ ョ ン を避け る必要があ り ます。 (PDF/X-5g ・ PDF/X-5pg) PDF_begin_template_ext( ) か PDF_load_graphics( ) か PDF_open_pdi_ page( ) で reference オプ シ ョ ン で与え られる参照先が、 以下の規格のいずれかに準拠 し て い る必要があ り ます : PDF/X-1a:2003 ・ PDF/X-3:2003 ・ PDF/X-4 ・ PDF/X-4p ・ PDF/X-5g ・ PDF/X-5pg。 かつ、 同一の出力イ ン テ ン ト のために作成 さ れてい る必要があ り ます。 特定 の XMP メ タ デー タ エ ン ト リ 群が参照先内で必須ですので、 すべての PDF/X 文書が参照先 と し て受け付け られる と は限 り ません。 PDFlib 8 以上を用いて生成 さ れた PDF/X 文書は参 照先 と し て使え ます。 こ の reference オプ シ ョ ン と 、 必要な Acrobat 構成について詳 し く は、 79 ページ 「3.2.5 外 部 PDF 文書内の参照ページ」 を参照 し て く だ さ い。 フ ァ イルサイ ズ (PDF/X-4 ・ PDF/X-5) 生成 さ れる PDF 文書の フ ァ イルサイ ズが 2 GB を超えてはな ら ず、 かつ、 PDF オブ ジ ェ ク ト の数が 8.388.607 未満で なければな り ません。 こ れら の制限に関 し て詳 し く は 71 ページ 「3.1.5 PDF 文書の最大サイ ズ と その他の制限」 を参照 し て く だ さ い。 PDF取 り 込み PDF_open_pdi_document( ) が制約 さ れます。 ただ し infomode=true の場合を除き ます。 338 ページ 「11.4.5 PDF/X 文書を PDI で取 り 込む」 を参照 し て く だ さ い。 11.4.3 色 と 画像の必要条件 PDF/X は、 忠実な色再現を保証す る ために、 デバ イ ス独立な色指定を必須 と し てい ま す。 色空間は以下の ソ ース か ら 来 る こ と がで き ます : > PDF_load_image( ) と PDF_fill_imageblock( ) を用いて直接的に読み込まれた画像 と 、PDF_ load_graphics( ) を通 じ て間接的に読み込まれた画像 > PDF_set_graphics_option( ) か PDF_setcolor( ) を用いた明示的な色指定 > オプシ ョ ン リ ス ト を通 じ た色指定。 た と えばテ キ ス ト フ ロ ー内において。 > 透過グループの た めのブ レ ン ド す る 色空間 : PDF_begin/end_page_ext( ) ・ PDF_begin_ template_ext( ) ・ PDF_open_pdi_page( ) : オプシ ョ ン transparencygroup でサブオプシ ョ ン colorspace 表 11.15 に、 上に挙げたすべての操作で従 う 必要があ る 色処理のための PDF/X の必要条 件を挙げます。ど の項目 も 、特記な き 限 り 、すべての PDF/X 準拠レベルにあ てはま り ます。 表 11.15 PDF/X 準拠のための色 と 画像の必要条件 項目 PDF/X 互換のための PDFlib 関数 ・ オプ シ ョ ンの必要条件 出力条件 (出力イ ン テ ン ト ) PDF_begin_document( ) の直後に、 PDF_load_iccprofile( ) を usage=outputintent と し て、 また は PDF_process_pdi( ) を action=copyoutputintent と し て呼び出す必要があ り ます。 HKS ス ポ ッ ト カ ラ ーか Pantone スポ ッ ト カ ラ ーか ICC ベース カ ラ ーか Lab カ ラ ーが用い られてい る場合には、 出力デバイ ス ICC プ ロ フ ァ イルを埋め込む必要があ り ます。 こ の場合には、 標準出力条件は許容 さ れません。 (PDF/X-1a) 白黒か CMYK 出力イ ン テ ン ト が存在する必要があ り ます。 (PDF/X-3/4/5) 白黒か RGB か CMYK 出力イ ン テ ン ト が存在する必要があ り ます。 グ レースケールカ ラー (PDF/X-1a) PDF_begin_page_ext( ) で defaultgray オプ シ ョ ン を避け る必要があ り ます。 (PDF/X-3/4/5) グ レースケールカ ラ ーを使え るのは、 グ レースケールか CMYK 出力イ ン テ ン ト が存在するか、 PDF_begin_page_ext( ) で defaultgray オプ シ ョ ンが設定 さ れてい る と き だけです。 11.4 PDF/X によ る印刷出力 335 表 11.15 PDF/X 準拠のための色 と 画像の必要条件 項目 PDF/X 互換のための PDFlib 関数 ・ オプ シ ョ ンの必要条件 RGBカ ラ ー (PDF/X-1a) RGB カ ラ ー と 、 PDF_begin_page_ext( ) で defaultrgb オプ シ ョ ン を避ける必要 があ り ます。 (PDF/X-3/4/5) RGB カ ラ ーを使え るのは、 RGB 出力イ ン テ ン ト が存在するか、 PDF_begin_ page_ext( ) で defaultrgb オプ シ ョ ンが設定 さ れてい る と き だけです。 CMYKカ ラ ー (PDF/X-1a) PDF_begin_page_ext( ) で defaultcmyk オプ シ ョ ン を避け る必要があ り ます。 (PDF/X-3/4/5) CMYK カ ラ ーを使え るのは、 CMYK 出力イ ン テ ン ト が存在するか、 PDF_ begin_page_ext( ) で defaultcmyk オプ シ ョ ンが設定 さ れてい る と き だけです。 ICCベース カ ラ ー (PDF/X-1a) PDF_set_graphics_option( ) か PDF_setcolor( ) で iccbasedgray/rgb/cmyk 色空間 を避け、 かつ iccprofilegray/rgb/cmyk オプ シ ョ ン を避け る必要があ り ます。 Labカ ラ ー (PDF/X-1a) PDF_set_graphics_option( ) か PDF_setcolor( ) で Lab 色空間を避ける必要があ り ます。 画像 PDF_load_image( ) で OPI-1.3 ・ OPI-2.0 オプ シ ョ ン を避け る必要があ り ます。 (PDF/X-1a) RGB か ICC ベースか YCbCr か Lab カ ラ ーを持つ画像 と グ ラ フ ィ ッ ク を避ける 必要があ り ます。 着色画像に対 し て用い る そのスポ ッ ト カ ラ ーの代替色が これ と 同 じ 条件 を満たす必要があ り ます。 (PDF/X-1 ・ PDF/X-3) BIG2 画像を避ける必要があ り ます。 (PDF/X-4/5) JPEG 2000 画像が特定の諸条件を満たす必要があ り ます。 詳 し く は 184 ペー ジ 「JPEG 2000 画像」 を参照 し て く だ さ い。 透過 (PDF/X-1 ・ PDF/X-3) 透過を避ける必要があ り ます。 こ のこ と は以下の API 機能に影響 し ます : > PDF_load_image( ) : masked オプ シ ョ ン を避け る必要があ り ます。 ただ し そのマス クが、 1 ビ ッ ト 深度を持つ画像を参照 し てい る場合を除き ます。 > PDF_load_image( ) : 内在透過 (アルフ ァ チ ャ ン ネル) を持つ画像は許容 さ れません。 それ については ignoremask オプ シ ョ ン を用いて読み込む必要があ り ます。 > PDF_load_graphics( ) : 透過要素を含んだ SVG グ ラ フ ィ ッ ク を避け る必要があ り ます。 > PDF_create_gstate( ) : opacityfill ・ opacitystroke オプ シ ョ ン を避ける必要があ り ます。 ただ し それ らが値 1 を持つ場合を除き ます。 blendmode を用い る場合にはそれは Normal であ る必要があ り ます。 (PDF/X-4/5) 透過画像 ・ グ ラ フ ィ ッ ク を使え ます。 透過グループ PDF_begin/end_page_ext( ) ・ PDF_begin_template_ext( ) ・ PDF_open_pdi_page( ) ・ PDF_load_ graphics( ) : transparencygroup オプ シ ョ ンが以下のよ う に制限 さ れます : > (PDF/X-1a ・ PDF/X-3) オプ シ ョ ン transparencygroup は許容 さ れません。 > (PDF/X-4/5) : transparencygroup オプ シ ョ ンのサブオプ シ ョ ン colorspace が、 グ レ ース ケール ・ RGB ・ CMYK カ ラ ーについて上で述べた必要条件を満たす必要があ り ます。 出力 イ ン テ ン ト と 標準出力条件 出力 イ ン テ ン ト (出力条件 と も いい ま す) は、 意図 さ れ る 出力先デバ イ ス か印刷条件を定義 し ます。 こ れは主に、 校正の信頼性を得 る ために有 用です。 詳細は PDF/X の種類に よ っ て異な り ます : > PDF/X-1a/3/4/5g : 出力 イ ン テ ン ト を、 出力先デバ イ ス か印刷条件のための ICC プ ロ フ ァ イ ルを埋め込む こ と に よ っ て指定で き ます。 > PDF/X-4p・PDF/X-5pg のみ:出力 イ ン テ ン ト のための外部 ICC プ ロ フ ァ イ ルを参照す る こ と に よ っ て (規格の名前の中の p は、 外部プ ロ フ ァ イ ルが参照 さ れ る こ と を意味 し ます)。 標準出力 イ ン テ ン ト と 異な り 、 こ の出力 イ ン テ ン ト ICC プ ロ フ ァ イ ルは、 名 前で参照 さ れ る だけでな く 、 その文書が生成 さ れ る 際にその ICC プ ロ フ ァ イ ルが ロ ー 336 第 11 章 : PDF のバージ ョ ン と 規格 カルで利用可能であ る こ と を必須 と する 強力な参照が作成 さ れます。そのICCプ ロ フ ァ イ ルはその PDF 出力内に埋め込まれは し ないのですが、それで も PDF 作成時に こ れが 利用可能であ る 必要があ り ます。 urls オプシ ョ ン を、 1 個ない し 複数の、 その ICC プ ロ フ ァ イ ルを発見で き る 場所の有効な URL と と も に与え る 必要があ り ます : if (p.load_iccprofile("CGATS TR 001", "usage=outputintent urls={http://www.color.org}") == -1) { /* エラー */ } > PDF/X-1a・PDF/X-3 のみ:標準出力 イ ン テ ン ト の名前を与え る こ と に よ っ て。ただ し 、 その照応する ICC プ ロ フ ァ イ ルを埋め込みません。標準出力 イ ン テ ン ト は PDFlib に内 部的に知 ら れてい ます。 標準出力 イ ン テ ン ト 名の一覧については PDFlib リ フ ァ レ ン ス を参照 し て く だ さ い。 こ れ ら の出力 イ ン テ ン ト に対す る ICC プ ロ フ ァ イ ルは、 ロ ーカ ルに得 ら れ る 必要はあ り ません。 PDF/X-3 出力を出力す る 際、 かつ HKS ・ Pantone ・ ICC ベース ・ Lab カ ラ ーのいずれか を用い る 際には、 標準出力 イ ン テ ン ト 名だけでは不 充分であ り 、 ICC プ ロ フ ァ イ ルを埋め込む必要があ り ます。 PDF/X-4/5 には特殊な規則が適用 さ れます : CMYK 出力 イ ン テ ン ト プ ロ フ ァ イ ル (すな わち usage= outputintent を用いて読み込まれた) を、同一文書内の ICC ベース色空間 (す なわち usage= iccbased を用いて読み込まれた) のために用い る こ と はで き ません。 こ の 必要条件は、 PDF/X 規格に よ っ て必須 と さ れてい る も のであ り 、 CMYK プ ロ フ ァ イ ルに 対 し てのみ適用 さ れ、 グ レース ケール ・ RGB プ ロ フ ァ イ ルには適用 さ れません。 同様の条 件が、 取 り 込まれ る 文書に も 適用 さ れます : 取 り 込まれ る ページが、 生成 さ れ る文書の出 力 イ ン テ ン ト と 同 じ CMYK ICC プ ロ フ ァ イ ルを用いてい る 場合には、 それは PDF_open_ pdi_page( ) に よ っ て拒絶 さ れます。 然るべ き PDF/X 出力 イ ン テ ン ト を選ぶ PDF/X 出力 イ ン テ ン ト の選択は通常、 印刷出力 を と り し き る 印刷業者 と の話 し 合いで決ま り ます。出力 イ ン テ ン ト の選択に関す る情報が 印刷所側か ら 出て こ ない と き は、 表 11.16 に挙げ る 代表的な出力 イ ン テ ン ト の う ちの 1 つ を たた き 台 と し て使用す る こ と も で き ます (PDF/X FAQ よ り 引用)。 表 11.16 代表的な出力条件のための適切な PDF/X 出力イ ン テ ン ト 欧州 北米 雑誌広告 FOGRA28 CGATS TR 001 新聞広告 IFRA26 IFRA30 枚葉オ フ セ ッ ト 用紙に依存 : 用紙に依存 : タ イ プ 1 ・ 2 ( コ ー ト ) : FOGRA39 グ レー ド 1 ・ 2 (プ レ ミ アム コ ー ト ) : FOGRA39 グ レー ド 5 : CGATS TR 001 タ イ プ 3 (LWC) : FOGRA45 タ イ プ 4 (非 コ ー ト ) : FOGRA47 非 コ ー ト : FOGRA47 輪転オ フ セ ッ ト 用紙に依存 : 用紙に依存 : タ イ プ 1 ・ 2 ( コ ー ト ) : FOGRA45 グ レー ド 5 : CGATS TR 001 タ イ プ 4 (非 コ ー ト ・ 白) : FOGRA47 非 コ ー ト (白) : FOGRA47 タ イ プ 5 (非 コ ー ト ・ 黄味) : FOGRA30 非 コ ー ト (黄味) : FOGRA30 11.4 PDF/X によ る印刷出力 337 参照 さ れた ICC 出力 イ ン テ ン ト に関す る Acrobat の問題 PDFlib ユーザーの便宜のため に、 PDF/X-4p/5pg に関連す る 重要な Acrobat の問題を記 し てお き ま し ょ う 。 Acrobat XI は、 参照 さ れた出力 イ ン テ ン ト プ ロ フ ァ イ ルを持っ た文書を開 く 際に、 ク ラ ッ シ ュ かハン グ し ます。すなわち、Acrobat イ ン ス ト レーシ ョ ンに含め ら れていない出力 イ ン テ ン ト ICC プ ロ フ ァ イ ルを参照 し てい る あ ら ゆ る PDF/X-4p/5pg 文書 と 、照応する PDF/VT 文書です。 回避策 : こ の問題を回避す る には、 参照 さ れた ICC プ ロ フ ァ イ ルを、 Acrobat が ICC プ ロ フ ァ イ ル を格納 し てい る デ ィ レ ク ト リ 内で利用可能に し ま す。 Acrobat の イ ン ス ト レーシ ョ ンに応 じ て、参照 さ れた ICC プ ロ フ ァ イ ルを、 た と えば以下の よ う なデ ィ レ ク ト リ へ コ ピー し ます : Windows:C:\Program Files\Common Files\Adobe\Color\Profiles OS X:/Library/Application Support/Adobe/Color/Profiles Acrobat X ・ XI のプ リ フ ラ イ ト が PDF/X-4p/5pg フ ァ イ ルを検証 し て成功す る のは、 参照 さ れた ICC プ ロ フ ァ イ ルが上記の Acrobat デ ィ レ ク ト リ 内に存在する 場合だけです。 11.4.4 イ ン タ ラ ク テ ィ ブ機能のための必要条件 表 11.17 に、 PDF/X 準拠出力を生成す る 際に制限 さ れ る すべての操作を挙げます。 PDF/ X モー ド で こ の禁 じ ら れた関数の う ちのいずれかを呼び出す と 例外が発生 し ます。 表 11.17 イ ン タ ラ ク テ ィ ブ機能のための PDF/X の必要条件 項目 PDF/X 互換のための PDFlib 関数 ・ オプ シ ョ ンの必要条件 注釈 と フ ォ ーム フ ィ ール ド PDF_create_annotation( ) ・ PDF_create_field( ) : BleedBox (BleedBox が存在 し ない場合には TrimBox/ArtBox) 内部には注釈を避け る必要があ り ます。 フ ァ イル添付 (PDF/X-1a/3) PDF_begin/end_document( ) : オプ シ ョ ン attachments を避ける必要があ り ま す。 PDF_create_annotation( ) で type=FileAttachment を避ける必要があ り ます。 アクシ ョ ンと JavaScript PDF_create_action( ) : すべてのア ク シ ョ ン を、 JavaScript も 含めて避ける必要があ り ます。 ビ ュ ーア環境設定/ 表示 ・ 印刷領域 PDF_begin/end_document( ) : viewerpreferences オプ シ ョ ンに対 し て viewarea ・ viewclip ・ printarea ・ printclip サブオプ シ ョ ン を用いる場合には、 media か bleed 以外の値は許容 さ れません。 11.4.5 PDF/X 文書を PDI で取 り 込む 既存の PDF 文書のページ を PDF-X 出力文書へ取 り 込 も う と す る 際には、 追加の規則が適 用 さ れます (詳 し く は 200 ページ 「7.3 PDF ページ を PDI で取 り 込む」 参照)。 取 り 込ま れ る 文書はすべて、 表 11.18 に従っ て カ レ ン ト PDF/X モー ド に互換な PDF/X レベルに準 拠 し てい る 必要があ り ます。 許容 さ れ る すべての PDF/X-4/5 出力 と の組み合わせに対 し て、 以下の追加の規則に服す る 必要があ り ます : 取 り 込まれ るページが、 生成 さ れ る文書 の出力 イ ン テ ン ト と 同 じ CMYK ICC プ ロ フ ァ イ ルを用いてい る 場合には、それは PDF/X4/5 規格に違反す る ので、 PDF_open_pdi_page( ) に よ っ て拒絶 さ れます。 あ る 特定の PDF/X 準拠レベルが PDFlib で構成 さ れていて、 かつ、 取 り 込まれた文書 も その互換レベルを遵守 し てい る な ら ば、 生成出力はその選択 さ れた PDF/X 準拠レベル に準拠 し てい る こ と が保証 さ れます。 カ レ ン ト PDF/X レベルに互換でない文書は PDF_ open_pdi_document( ) で拒絶 さ れます。 複数の PDF/X 文書を取 り 込む場合は、 それ ら はすべて同一の出力条件に対 し て作成 さ れてい る 必要があ り ます。 338 第 11 章 : PDF のバージ ョ ン と 規格 表 11.18 さ ま ざ ま な PDF/X 出力レ ベルに対する互換 PDF/X 入力レ ベル PDF/X-4 PDF/X-4p PDF/X-5g PDF/X-5pg PDF/X-3:2003 PDF/X-1a:2003 取 り 込まれる文書の PDF/X レ ベル PDF/X-1a:2003 許容 PDF/X-3:2003 許容 許容 PDF/X-4 許容 許容 許容 許容 PDF/X-4p 許容 許容 許容 許容1 PDF/X-5g 許容 許容 許容 許容 許容2 許容 2 PDF/X-5pg 許容 許容 許容 許容 1 許容 2 許容 1,2 PDF/X 出力レ ベル 1. PDF_process_pdi( ) で action=copyoutputintent を指定する と 、 外部出力イ ン テ ン ト ICC プ ロ フ ァ イルへの参照が コ ピー さ れます。 2. 取 り 込まれたページが、 参照 さ れた XObject を含んでい る と きは、 PDF_open_pdi_page( ) は代 理 と 参照の両方を コ ピー し ます。 PDFlib は、 い く つか特定の項目を修正す る こ と はで き ますが、 PDF/X の検証を行な っ た り 、取 り 込み文書に PDF/X 互換を強制 し た り す る よ う には も と も と 作 ら れてい ません。 た と えば PDFlib は、 取 り 込んだ PDF ページに欠けてい る フ ォ ン ト を埋め込んだ り は し ま せん し 、 取 り 込んだページに対 し て色補正な ど も 一切行い ません。 ページ を取 り 込んだ結果 と し てで き る PDF 出力文書が、 入力文書 (1 つ複数) と 同 じ PDF/X 準拠レベル と 出力条件に準拠す る よ う に し たい場合は、 次の よ う に、 取 り 込まれ た PDF の PDF/X ス テー タ ス を ク エ リ す る こ と がで き ます : pdfxlevel = p.pcos_get_string(doc, "pdfx"); こ の ス テー ト メ ン ト は、 取 り 込まれた文書が ISO PDF/X レベルに準拠 し てい る 場合には、 PDF/X 準拠レベルを表す文字列を得ます。 そ う でない場合には none を得ます。 こ の返っ て き た文字列を用いれば、 PDF_begin_document( ) の pdfx オプシ ョ ン を用いて出力文書の PDF/X 準拠レベルを適切に設定す る こ と がで き ます。 取 り 込まれた文書か ら PDF/X 出力 イ ン テ ン ト を コ ピ ー PDF/X 準拠 レ ベル を ク エ リ す る だけでな く 、 取 り 込まれた文書か ら PDF/X 出力 イ ン テ ン ト を コ ピーす る こ と も で き ま す。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの pdfx/import_pdfx ト ピ ッ ク 内にあ り ます。 こ れは、 PDF_load_iccprofile( ) に よ る 出力 イ ン テ ン ト 設定のかわ り に利用す る こ と がで き、 取 り 込み文書の出力 イ ン テ ン ト を、 生成す る 文書に コ ピー し ま す。 出力 イ ン テ ン ト を コ ピーす る 方法は、 取 り 込まれた PDF/A と PDF/X の文書に対 し て通用 し ます。 11.4 PDF/X によ る印刷出力 339 11.5 PDF/VT に よ る可変 ・ ト ラ ンザ ク シ ョ ン印刷 注 PDF/VT 規格に関する一般的情報が PDFlib Web サイ ト にあ り ます。 11.5.1 PDF/VT 規格 PDF/VT 規格は、 2010 年に ISO 16612-2 と し て発行 さ れてい ます。 こ れは 「 さ ま ざ ま な環 境で可変文書印刷 (VDP) を可能にす る よ う 設計 さ れた」 も のです。 PDF/VT 文書は、 最 終的な コ ン テ ン ツ エ レ メ ン ト 群 と 、 関連す る メ タ デー タ と を内容 と し ますが、 変数やテ ン プ レー ト を含んではい ません。 その先行規格 ISO 16612-1:2005 は、 PDF 1.4 に基づいた PPML/VDX 形式を仕様化 し てい ます。 し か し 、 こ の古い規格は、 い く つかの PDF 機能を 欠いてい る う え、 PDF の外部にあ る 構造に依存 し てい ます。 新 し い現在の PDF/VT 規格 は、 PDF/X-4 と PDF/X-5 に基づいてお り 、 さ ら に透過 と レ イ ヤーを含めて PDF 1.6 の諸 機能に対応 し てい ます。 PDF/X の必要条件に加えて、 PDF/VT 規格は、 大量パー ソ ナ ラ イ ズ印刷の要請を満たす補足機能を PDF に追加 し てい ます。 PDF/VT は、 電子印刷フ ァ イ ルの高パフ ォ ーマ ン ス レ ン ダ リ ン グ を可能にす る ために、 効果的な リ ソ ー ス管理を PDF に追加 し てい ます。 PDF/VT-1 ・ PDF/VT-2 ・ PDF/VT-2s 準拠レ ベル ISO 16612-2 は、 3 種類の PDF/VT 準拠レ ベルを仕様化 し てお り 、 こ れ ら はすべて PDF 1.6 に基づいてい ます : > PDF/VT-1 は、単一フ ァ イ ル交換のために設計 さ れてお り 、PDF/X-4 に基づいてい ます (PDF/X-4p は許容 さ れません)。 1 個の PDF 文書を表現す る ために必要な リ ソ ース の すべてが、 単一の PDF/VT-1 フ ァ イ ル内に含まれてい ます。 > PDF/VT-2 は、 複数フ ァ イ ル交換のために設計 さ れてお り 、 PDF/X-4p ・ PDF/X-5g ・ PDF/X-5pg の う ちの 1 つに基づいてい ます。 PDF/VT-2 文書は、 外部 ICC プ ロ フ ァ イ ルか外部ページ コ ン テ ン ツ ま たは両方を参照す る こ と がで き ます。PDF/VT 文書 と 、そ のすべての参照 さ れた PDF フ ァ イ ル と 外部 ICC プ ロ フ ァ イ ルを、 ま と めて PDF/VT-2 フ ァ イ ル集合 と いい ます。 > PFD/VT-2s は、 ス ト リ ーム伝送のために設計 さ れてお り 、 そ こ では文書生成 と 表現を 交互に行 う こ と がで き ます。 PDF/VT-2s ス ト リ ームは MIME パ ッ ケージであ り 、 1 個 ない し 複数の PDF/VT-1 フ ァ イ ルか PDF/VT-2 フ ァ イ ル集合 (ま たは両方の種類) と 、 すべての参照 さ れた フ ァ イ ルを内容 と し てい ます。 PDFlib を使 う と 、 PDF/VT-1 ・ PDF/VT-2 出力 と 、 PDF/VT-2s ス ト リ ームのための構成要 素群を生成で き ます。 こ の構成要素群を MIME ス ト リ ーム と し てパ ッ ケージす る こ と は PDFlib の ス コ ープを超え ますので、 アプ リ ケーシ ョ ン側で実装す る 必要があ り ます。 349 ページ 「11.5.8 PDF/VT-2s のための MIME ス ト リ ーム を作成」 で、 PDF/VT-2s のための MIME ス ト リ ーム を作成す る ための必要条件に関す る 情報を提供 し ます。 Acrobat におけ る PDF/VT-2 文書 PDF/VT-2 文書を Acrobat で閲覧す る 際には、 以下に 留意する こ と が重要です : > Acrobat XI は、参照 さ れた出力 イ ン テ ン ト ICC プ ロ フ ァ イ ルを持っ た PDF/VT-2 文書を 開 く 際にハン グか ク ラ ッ シ ュ す る こ と があ り ます。 詳細 と 回避策については 338 ペー ジ 「参照 さ れた ICC 出力 イ ン テ ン ト に関す る Acrobat の問題」 を参照 し て く だ さ い。 こ の よ う な文書をプ リ フ ラ イ ト で検証す る 場合に も こ れ と 同 じ 回避策が必要です。 > 参照 さ れたページは、注意深い Acrobat 構成を必要 と し ます:詳 し く は 79 ページ 「参照 ページ を Acrobat で用い る 」 を参照 し て く だ さ い。 340 第 11 章 : PDF のバージ ョ ン と 規格 11.5.2 PDF/VT の諸概念 こ の項では、 PDF/VT が基づいてい る 技術的諸概念のあ ら ま し を提供 し ます。 文書部分 ヒ エ ラ ルキー 文書部分 (DPart) ヒ エ ラ ルキーは、 1 個の PDF/VT フ ァ イ ル内 の文書群ない し 文書の部分群の並び と 関係を指定 し ま す。 代表的な シナ リ オでは、 こ の PDF/VT フ ァ イ ルは、 多 く の受領者のための下位文書群を内容 と し てお り 、 そ し てそれぞ れの文書部分は、 個々の受領者のための下位文書を構成す る ページ群に照応 し てい ます。 受領者にページ を割 り 当て る だけでな く 、 こ の文書部分 ヒ エ ラ ルキーは、 も っ と 複雑な構 造を反映す る こ と も で き ます。 た と えば、 受領者を その住所内の郵便番号に従っ て グルー プ化 し た り 、 郵便番号を州に従っ て ま と めた り 、 州を国に従っ て ま と めた り す る こ と がで き ます。 こ の種の文書組織化は、 その文書内のすべてのページ を包含す る 1 個の樹状構造 を作成 し ます。 こ の ツ リ ーの要素を DPart ノ ー ド と いい、 そ こ ではそれぞれの内部 ノ ー ド は他の DPart ノ ー ド を内容 と し 、 それぞれの葉 ノ ー ド は 1 つの受領者のための 1 個ない し 複数のページ を指定 し ます。 PDF/VT フ ァ イ ル内の文書部分 ヒ エ ラ ルキーを用いて、 ページにア ク セ スす る こ と も で き ます。 こ れは、 ページ番号やページ ラ ベルに よ る ア ク セ ス と いっ た他の方式のかわ り に使え ます。 こ の DPart ヒ エ ラ ルキーは、 PDF/VT フ ァ イ ル内では必須です。 そのオプ シ ョ ナルな レ コ ー ド レベル値は、 個別の受領者に対する レ コ ー ド に照応する DPart ヒ エ ラ ルキー内の レベルを選択 し ます。 こ れは ス コ ープ ヒ ン ト のために意味を持ち ます (後述)。 文書部分 メ タ デー タ 文書ツ リ ー内のルー ト ノ ー ド か ら 葉群 ま で下 る 文書部分 ヒ エ ラ ル キー内の各 ノ ー ド は、 文書部分 メ タ デー タ (DPM) を含む こ と がで き ま す。 こ れ を使 う と 、 1 つの受領者の文書 と その部分群に関す る 情報を伝え る こ と がで き ます。 と り わけ、 印刷のために意味を持つ諸特性 (あ る 文書部分の印刷部数な ど) や、 受領者に関す る情報 (その照応す る 郵便番号な ど) を DPM 内に符号化す る こ と が可能です。 PDF/VT 規格は、 文書部分 メ タ デー タ を格納す る ための一般的な手段を仕様化 し ては い ますが、 メ タ デー タ ス キームや符号化の特定の種類については何 も 規定 し てい ません。 た だ し こ の 規格 は、 International Cooperation for the Integration of Processes in Prepress, Press, and Postpress Organization (CIP4) に よ っ て標準化 さ れた ジ ョ ブチケ ッ ト 形式であ る ジ ョ ブ定義形式 (JDF) の一部分であ る メ タ デー タ ス キームへのバ イ ア ス を持っ て開発 さ れてい ます。 詳 し い情報については彼 ら の Web サ イ ト を訪れて く だ さ い : www.cip4.org JDF (ま たは他の) 印刷 メ タ デー タ は、 PDF/VT では必須ではあ り ませんが、 JDF 対応 ワー ク フ ロ ーにおいては実用的な価値を加え ます。 PDF/VT 規格は、 文書部分 メ タ デー タ を外 部 XML 文書 と し て表現す る ための方式 も 仕様化 し てい ます。 反復す る グ ラ フ ィ カ ル内容に対す る最適化 印刷要素が複数のページ上で再利用 さ れ る こ と は よ く あ り ます。 た と えば、 1 つの送付文書のすべてのページ上に現れ る企業 ロ ゴや 製品画像です。 反復す る グ ラ フ ィ カル内容の処理を最適化す る こ と は、 印刷 フ ァ イ ルの フ ァ イ ルサ イ ズ と 処理速度を向上 さ せ る ための重要な戦略です。 PDF は、 フ ァ イ ルサ イ ズ を最適化す る ための手段 と し て、 つねに XObject をサポー ト し て き ま し た。 こ れは、 1 個 の印刷要素のために必要なデー タ を その フ ァ イ ル内に 1 回だけ入れ込んで、複数のページ (ま たは同一ページ上の複数の イ ン ス タ ン ス) か ら こ のデー タ への参照を許す も のです。 XObject は、 ラ ス タ 画像か、 任意のテ キ ス ト ・ ベ ク ト ルグ ラ フ ィ ッ ク コ ン テ ン ツ を内容 と す る こ と がで き ます。 PDF におけ る XObject は、 1 個の文書の全体のサ イ ズ を最適化す る こ と に主眼を置いてい ますが、 PDF は現在ま での と こ ろ、 反復す るページ コ ン テ ン ツの レ ン ダ リ ン グ を最適化す る ための手段を一切含んでい ません。た と えばあ る特定のページ上 11.5 PDF/VT によ る可変 ・ ト ラ ンザク シ ョ ン印刷 341 のあ る 画像が、 後で同一文書内の別のページ上に再び現れ る と い う こ と や、 あ る いは次の 印刷ジ ョ ブ内に現れ る か も し れない と い う こ と を、消費 ソ フ ト ウ ェ アに対 し て告げ る こ と ので き る も のが、 PDF 内には何 も ないのです。 PDF/VT は、 PDF におけ る XObject の既存 の概念を拡張 し て、 印刷パフ ォーマ ン ス を最適化する ための以下の手段を追加 し ます : > 一意識別 : XObject に対 し て、 すべての文書を通 じ て一意であ る 識別子 (GTS_XID と い う ) を割 り 当て る こ と がで き ます。 こ の識別子はキ ャ ッ シ ン グの実装のために利用可 能です。 なぜな ら こ の実装は、 同等な XObject を識別す る 必要があ る か ら です。 簡単 な言葉で言えば、 ジ ョ ブ 1 のためにすでに処理 さ れてい る、 かつジ ョ ブ 2 内で再利用 さ れ る こ と が発見 さ れた グ ラ フ ィ ッ ク については、 再度 リ ッ プす る 必要がな く 、 その レ ン ダ リ ン グ結果を キ ャ ッ シ ュ か ら 採 る こ と がで き ます。 > ス コ ープ ヒ ン ト と 環境 コ ン テキス ト : XObject が、 そのグ ラ フ ィ カル内容が再利用 さ れ る ページ群か文書群の範囲に関す る 情報 (GTS_Scope と い う ) を含む こ と がで き ます。 こ れに よ っ て XObject は、 キ ャ ッ シ ュ内のその レ ン ダ リ ン グ結果の有用継続期間に関 す る 情報を伴 う こ と がで き ます : こ の コ ン テ ン ツはカ レ ン ト 受領者のためにだけ再利 用 さ れ る のか、 それ と も 同一フ ァ イ ルない し フ ァ イ ル ス ト リ ーム内の ど こ か別の所で 再利用 さ れ る のか、 あ る いは全 く 再利用 さ れないのか。 環境コ ン テ キ ス ト (GTS_Env と い う ) が与え ら れ る と 、 XObject はグ ロ ーバル用途を、 すなわち、 それが複数の PDF/ VT イ ン ス タ ン ス内で再利用 さ れ る と い う こ と を指定する こ と がで き ます。環境 コ ン テ キ ス ト 文字列について制限は全 く あ り ません。 た と えば、 顧客名やジ ョ ブ名を用いて その環境を識別で き ます。 > カ プ セル化 ヒ ン ト : XObject キ ャ ッ シ ン グ アルゴ リ ズ ムは、 XObject の、 その呼び出 し コ ン テ キ ス ト と 、 その同一ページ (ま たは他のページ群。 た と えば複数のページ を同 一シー ト 上に重ね合わせ る 場合) 上の既存の印刷要素群 と の、 相互作用を考慮に入れ る 必要があ り ます。 た と えば も し も 、 あ る XObject が色や線幅を指定 し てお ら ず、 そ れが参照 さ れ る 時点において有効な色 と 線幅に基づいてその体裁が変わ る な ら ば、 レ ン ダ リ ン グ結果を キ ャ ッ シ ュ し て も 、 こ の変わ る体裁のせいで効果的ではあ り ません。 も し も その XObject が透過要素を含んでお り 、 その既存の背景を その XObject と ブ レ ン ド し なければな ら ない状態の場合に も 、 同様の状況が起 こ り ます。 XObject キ ャ ッ シ ン グ を支援す る ために、PDF/VT はカプセル化 XObject と い う 概念を導入 し てお り 、そ れがそ う であ る こ と を標識で き る よ う に し てい ます(GTS_Encapsulated キーを用いて)。 カプセル化 XObject は、 キ ャ ッ シ ン グ を支援す る 特定の諸規則を満たす必要があ り ま す。 こ れ ら のエン ト リ はすべてオプシ ョ ナルです : PDF/VT は、 反復す る グ ラ フ ィ カル内容の 最適化をいずれ も 必須 と し てい ませんが、 それ ら を利用すれば、 PDF/VT 対応 RIP を用い た と き に目ざ ま し い印刷パフ ォーマ ン ス向上が実現 し ます。 11.5.3 PDF/VT-1 と PDF/VT-2 を生成す る ための諸規則の要約 ク ッ ク ブ ッ ク PDF/VT-1 ・ PDF/VT-2 ・ PDF/VT-2s を生成する ための コ ー ド サン プルが、 PDFlib ク ッ ク ブ ッ ク の pdfvt カ テ ゴ リ 内にあ り ます。 PDFlib を使っ て PDF/VT-1 ・ PDF/VT-2 を作成す る こ と は、 以下の手段で実現で き ます : > PDF/VTはPDF/Xに基づいてい ますので、基礎を なすPDF/X準拠レベルのためのすべて の必要条件を満たす必要があ り ます。 pdfvt ・ pdfx 文書オプシ ョ ンで、 然 るべ き値を用 い る 必要があ り ます。 > 文書部分群を指定す る 必要があ り ます。 DPart API を用い ます。 その文書部分 ヒ エ ラ ル キー内の各 ノ ー ド が、 オプシ ョ ナルに DPM メ タ デー タ を伴 う こ と も で き ます。 その DPart ツ リ ー内の レ コー ド レベルを指定す る こ と も で き ます。 342 第 11 章 : PDF のバージ ョ ン と 規格 > 反復す る グ ラ フ ィ カル内容のための ス コ ープ ヒ ン ト を与え るべ き です。 > その文書が透過を含む場合には、カプセル化 XObject のための諸条件を満たすために追 加の努力を払 う べ き です。 > 既存の PDF 文書か ら ページ を取 り 込む際には、追加の諸規則が適用 さ れます(349 ペー ジ 「11.5.7 PDF/X ・ PDF/VT 文書を PDI で取 り 込む」 参照)。 表 11.19 に、 334 ページ 「11.4.2 一般的必要条件」 で挙げた、 その照応する PDF/X の必要 条件に加え て、 PDF/VT 準拠出力を生成す る ための必須操作 と オプシ ョ ナルな操作を要約 し ます。 こ れ ら の項目は、 特記ない限 り 、 PDF/VT-1 と PDF/VT-2 の両方に対 し て適用 さ れます。 特定の諸側面については、 以下に続 く 各項で詳 し く 説明 し ます。 表 11.19 PDF/VT-1 ・ PDF/VT-2 準拠のための必須操作 と オプ シ ョ ナルな操作 項目 PDF/VT 準拠のための PDFlib 関数 ・ オプ シ ョ ンの必要条件 準拠レ ベル PDF_begin_document( ) の pdfvt オプ シ ョ ン を、 必要な PDF/VT 準拠レ ベルに設定する必要 があ り ます。 例 : pdfvt=PDF/VT-1 (PDF/VT-1) オプ シ ョ ン pdfx=PDF/X-4 が自動的に設定 さ れます。 pdfx オプ シ ョ ンに対 し て他の値を与え る こ と はエ ラ ーです。 (PDF/VT-2) pdfx オプ シ ョ ンに も 、 値 PDF/X-4p ・ PDF/X-5g ・ PDF/X-5pg のいずれか 1 つを 指定する必要があ り ます。 文書部分 ヒ エ ラ ルキー 文書部分 ヒ エ ラ ルキーを指定する必要があ り ます。 こ れは以下の操作を必要 と し ます : > PDF_begin_document( ) : nodenamelist オプ シ ョ ンが、 DPart ツ リ ーのすべてのレ ベルのた めの名前を指定する必要があ り ます。 recordlevel オプ シ ョ ン を用いて、 受領者レ コ ー ド 群に照応する DPart ツ リ ーのレ ベルを指定する こ と も で き ます。 > PDF_begin_dpart( ) ・ PDF_end_dpart( ) : 文書部分 ヒ エ ラ ルキーを構築する必要があ り ます。 > 文書部分群が、 オプ シ ョ ナルに文書部分 メ タ デー タ (DPM) を伴 う こ と も で き ます。 DPM を生成するには、 POCA イ ン タ フ ェ ース を用いて DPM 辞書を構築 し ます。 反復するグ ラ フ ィ カル内容のための ス コ ープ ヒ ン ト PDF_load_image( ) ・ PDF_open_pdi_page( ) ・ PDF_begin_template_ext( )、 および PDF_load_ graphics( ) の templateoptions オプ シ ョ ン : pdfvt オプ シ ョ ンに scope サブオプ シ ョ ン を、 値 unknown ・ singleuse ・ record ・ file ・ stream ・ global の う ちの 1 つ と と も に与え る こ と によ っ て、 反復する画像 ・ テ ン プ レー ト ・ 取 り 込み PDF ページのための用途 ヒ ン ト を与え る必要があ り ます。 scope=stream と scope=global に対 し ては、 サブオプ シ ョ ン environment が PDF/VT 環境 コ ン テキス ト を指定する必要があ り ます。 これはすなわち、 PDF/VT 準拠の リ ーダが、 関 連する XObject 群を管理する ための管理イ ン タ フ ェ ース を提供する ために使え る識別子で す。 た と えば顧客名やジ ョ ブ名を用いてその環境を識別で き ます。 外部グ ラ フ ィ カル 内容 (参照) (PDF/VT-1 と 、 PDF/X-4p に基づいた PDF/VT-2) PDF_begin_template_ext( ) ・ PDF_open_pdi_ page( ) ・ PDF_load_graphics( ) : reference オプ シ ョ ン を避け るべき です。 なぜな ら これは、 基礎を なす PDF/X 規格群で許容 さ れないか ら です。 (PDF/X-5g か PDF/X-5pg に基づいた PDF/VT-2) PDF_begin_template_ext( ) ・ PDF_open_pdi_ page( ) ・ PDF_load_graphics( ) : reference オプ シ ョ ン で与え られる参照先が、 以下の規格の いずれかに準拠 し ている必要があ り ます : PDF/X-1a:2003 ・ PDF/X-3:2003 ・ PDF/X-4 ・ PDF/X-4p。 かつ、 同一の出力イ ン テ ン ト のために作成 さ れている必要があ り ます。 なお、 PDF/X-5g ・ PDF/X-5pg ・ PDF/VT-2 は参照先 と し て許容 さ れません。 こ の制約は、 参照 さ れる文書の連鎖を防止 し ます。 こ の reference オプ シ ョ ン と 、 必要な Acrobat 構成について詳 し く は、 79 ページ 「3.2.5 外 部 PDF 文書内の参照ページ」 を参照 し て く だ さ い。 11.5 PDF/VT によ る可変 ・ ト ラ ンザク シ ョ ン印刷 343 表 11.19 PDF/VT-1 ・ PDF/VT-2 準拠のための必須操作 と オプ シ ョ ナルな操作 項目 PDF/VT 準拠のための PDFlib 関数 ・ オプ シ ョ ンの必要条件 カ プ セル化XObject PDF_begin_document( ) : その文書が透過要素を一切含んでいない場合には、 オプ シ ョ ン usestransparency=false を与え る こ と に よ っ て、 PDFlib が、 テ ン プ レー ト か ら作成 さ れた すべての XObject を、 カ プ セル化 さ れている と 標識で き る よ う にするべき です。 PDF_load_image( ) : 画像が、 renderingintent か mask オプ シ ョ ン を用い るべき です。 そ う でなければ、 347 ページ 「11.5.6 カ プ セル化 XObject」 の諸規則に従 う こ と によ っ て、 で き る だけ多 く の XObject がカ プ セル化 さ れている と 標識 さ れる こ と を可能にするべき で す。 PDF/VT を作成す る ための カ ラ ー戦略 色処理については、 以下の 2 種類の戦略が可能で あ り 、 場合に よ っ ては組み合わせ る こ と も で き ます : > デバ イ ス独立カ ラ ー:出力 イ ン テ ン ト ICC プ ロ フ ァ イ ルの種類にかかわ ら ず、デバ イ ス 独立色空間を使え ます。すなわち ICC ベース か CIELab です。Lab カ ラ ー値 (0, 0, 0) は、 純粋な黒をデバ イ ス独立な形で指定 し ます。 Lab 黒色を手作業で設定す る には、 以下 の呼び出 し を用い ます : p.set_graphics_option("fillcolor={lab 0 0 0}"); > デバ イ ス依存カ ラ ー:デバ イ ス独自のグ レース ケールか RGB か CMYK カ ラ ーを使え ま す。 グ レ ー ス ケ ール カ ラ ーは ど ん な 種類の出力 イ ン テ ン ト に対 し て も 使 え ま すが、 RGB ・ CMYK カ ラ ーは整合する 出力 イ ン テ ン ト と し か使え ません。 ス ポ ッ ト カ ラ ー を、 そ の照応す る 代替色空間に従 っ て使 う こ と も で き ま す。 PDFlib は CIELab を、 内蔵の HKS ・ Pantone ス ポ ッ ト カ ラ ーに対す る代替色空間 と し て用いてい ます ので、 こ れ ら は常に PDF/VT 規格 と と も に使え ます。 カ ス タ ム ス ポ ッ ト カ ラ ーに対 し て は、 その代替色空間を、 それが出力 イ ン テ ン ト と 互換にな る よ う に選び取 る必要があ り ま す。 表 11.20 内のカ ラ ー戦略の要約は、PDF/VT のアプ リ ケーシ ョ ン を計画す る ために有用 でし ょ う 。 表 11.20 PDF/VT のカ ラ ー戦略 出力イ ン テ ン ト ICC プ ロ フ ァ イル その文書内で使え る色空間 CIELab ICC ベース Pantone ・ HKS グレー スケール1 RGB1 CMYK1 グ レースケール ◯ ◯ ◯ ◯ - - RGB2 ◯ ◯ ◯ ◯ ◯ - CMYK ◯ ◯ ◯ ◯ - ◯ 1. ICC プ ロ フ ァ イルを持たないデバイ ス色空間 2. PDF/X 規格はプ リ ン タ プ ロ フ ァ イルを必須 と し ます。 sRGB と い っ たモ ニ タ プ ロ フ ァ イルを使 う こ と はで き ません。 RGB プ リ ン タ プ ロ フ ァ イルは非常に稀です。 PDF/VT ・ PDF/A 両立文書を作成 PDF/VT 印刷文書であ り なが ら 、 同時にアーカ イ ビ ン グのための PDF/A に も 準拠 し てい る 文書を作成す る と 、有用な こ と も あ る で し ょ う (PDF/ A に関する 詳 し い情報は 321 ページ 「11.3 PDF/A に よ る アーカ イ ビ ン グ」 を参照 し て く だ さ い)。 こ の よ う な二重用途の文書を作成する 際には以下に留意 し て く だ さ い : 344 第 11 章 : PDF のバージ ョ ン と 規格 > PDF/A は外部参照を一切許容 し ませんので、PDF/VT-1 のみが PDF/A と 両立可能であ り 、 PDF/VT-2 は不可能です。 以下の文書オプシ ョ ン を用いれば、 PDF/VT ・ PDF/A 両 立文書を作成で き ます : ret = p.begin_document("combo.pdf", "pdfx=PDF/X-4 pdfvt=PDF/VT-1 pdfa=PDF/A-2b"); > こ のマニ ュ アル内で PDF/VT と PDF/A に対 し て述べた制約に従 う 必要があ り 、かつ、両 方の規格で許容 さ れてい る 機能だけ を使え ます。 > 取 り 込まれ る PDF 文書が、受け付け可能であ る ためには、PDF/X 規格 と PDF/A 規格の 両方を遵守 し てい る 必要があ り ます。 11.5.4 文書部分 ヒ エ ラ ルキー と 文書部分 メ タ デー タ (DPM) ク ッ ク ブ ッ ク 文書部分 ヒ エ ラルキーを持 っ た PDF/VT を作成する ための コ ー ド サン プルが、 PDFlib ク ッ ク ブ ッ クの pdfvt カ テ ゴ リ にあ り ます。 文書部分 ヒ エ ラ ルキー を作成 文書内のすべてのページ を、 文書部分 ヒ エ ラ ルキー内に 組織化す る 必要が あ り ま す。 イ ン ボ イ ス 等シ ン プルな場合においては、 こ の ツ リ ー構造 は、 root レベル と recipient レベルの 2 つの レベルか ら 成 り ます。 こ の文書内のページ群 は、 受領者レ コ ー ド 群の線形配列を構成 し てい ます。 こ こ で各レ コー ド は 1 個ない し 複数 のページ を内容 と し てい ます。 こ の文書部分 ヒ エ ラ ルキーの構造を、 文書オプシ ョ ン リ ス ト で指定す る 必要があ り ます。 例 : if (p.begin_document(outfile, "pdfvt=PDF/VT-1 nodenamelist={root recipient} recordlevel=1") == -1) も っ と 複雑な文書は、 も っ と 深い文書 ヒ エ ラ ルキーを必要 と す る か も し れません。 た と え ば、 カ ス タ マ イ ズ さ れ た 小冊子が、 前付 ・ 本文 ・ 後付部か ら 成 る 場合です。 こ れ ら は docpart レベル内で保持 さ れます : if (p.begin_document(outfile, "pdfvt=PDF/VT-1 nodenamelist={root recipient docpart} recordlevel=1") == -1) こ の recordlevel オ プ シ ョ ン は、 そ の 受領者 か レ コ ー ド レ ベ ル を 発 見 で き る 場所 の、 nodenamelist 内でのゼ ロ ベース の番号を指定 し ます。こ れは scope=record オプシ ョ ンに対 し て意味を持ち ます。 ヒ エ ラ ル キーの構造 を 定義 し た後は、 ページ群 を 文書 ヒ エ ラ ル キー ノ ー ド 群内で グ ループ化す る 必要があ り ます。 こ れを達成す る には PDF_begin/end_dpart( ) を用い ます : /* DPartヒエラルキーのルートノードを作成 */ p.begin_dpart(""); p.begin_dpart(""); /* 受領者レベルに新規ノードを作成 */ p.begin_page_ext(...); /* 1個ないし複数のページを作成 */ ... p.end_page_ext(...); p.end_dpart(""); /* 受領者ノードを閉じる */ p.begin_dpart(""); p.begin_page_ext(...); ... p.end_page_ext(...); p.end_dpart(""); /* 受領者レベルに次のノードを作成 */ /* 1個ないし複数のページを作成 */ /* 受領者ノードを閉じる */ 11.5 PDF/VT によ る可変 ・ ト ラ ンザク シ ョ ン印刷 345 /* ルートノードを閉じる */ p.end_dpart(""); こ の PDF_begin/end_dpart( ) への呼び出 し 群が、 nodenamelist オプシ ョ ンに従っ た ツ リ ー 構造を作成す る 必要があ り ます。 すなわち、 その最大ネ ス ト レベルが、 こ の nodenamelist 配列内のエン ト リ の数に照応す る 必要があ り ます。 PDF_begin_document( ) の groups オプシ ョ ン と 、 PDF_begin/end_page_ext( ) の group ・ pagenumber オプ シ ョ ン は、 PDF/VT モー ド では許容 さ れ ま せん。 なぜな ら 、 こ れ ら は DPart 構造を阻害す る か ら です。 文書部分 メ タ デー タ (DPM) を作成 文書部分 ヒ エ ラ ルキー内の各 ノ ー ド に対 し て、1 つ の葉 ノ ー ド に照応す る ページ群に、 ま たは こ の ノ ー ド 配下の下位ツ リ ー全体に適用 さ れ る メ タ デー タ 情報を指定で き ます。 PDF/VT は特定の種類の メ タ デー タ を何 ら 規定 し てい ま せんが、 こ れは CIP4 機構に よ っ て発行 さ れた JDF 規格 と と も に用い ら れ る こ と を意図 し てい ます。 と り わけ、 「ICS — Common Metadata for Document Production Workflows」 (CIP4 の Web サ イ ト か ら 入手可能) と い う 文書が、 印刷業務 ワー ク フ ロ ーで用い る ための メ タ デー タ を記述 し てい ます。 こ の CIP4 メ タ デー タ 形式は、 代表的な PDF デー タ 型を活用 し てお り 、 その メ タ デー タ は、 PDF/VT 規格で仕様化 さ れてい る 形で PDF 出力へ書 き 出 さ れます。 PDFlib ユーザーは、 POCA (PDF Object Creation API = PDF オブジ ェ ク ト 作成 API) イ ン タ フ ェ ース を使っ て、 PDF 辞書 ・ 配列やその他のデー タ 型か ら 成 る 任意のデー タ 構造を 作成す る こ と も で き ます。DPM メ タ デー タ に対する 最上位レベル辞書を、PDF_begin/end_ dpart( ) の dpm オプシ ョ ンへ渡す こ と がで き ます : dpm = p.poca_new("type=dict usage=dpm"); cip4_root = p.poca_new("type=dict usage=dpm"); cip4_metadata = p.poca_new("type=dict usage=dpm"); p.poca_insert(dpm, p.poca_insert(cip4_root, p.poca_insert(cip4_metadata, p.poca_insert(cip4_metadata, p.poca_insert(cip4_metadata, "type=dict "type=dict "type=string "type=string "type=string key=CIP4_Root value=" + cip4_root); key=CIP4_Metadata value=" + cip4_metadata); key=CIP4_Conformance value=base"); key=CIP4_Creator value=starter_pdfvt1"); key=CIP4_JobID value={Kraxi Systems invoice}"); /* DPartヒエラルキー内にノードを作成してDPMメタデータを追加 */ p.begin_dpart("dpm=" + dpm); p.poca_delete(dpm, "recursive=true"); ク ッ ク ブ ッ ク PDFlib pCOS ク ッ ク ブ ッ ク に、 PDF/VT 文書から DPM を取得 し て、 その照応する XML 表現 を作成する ための コ ー ド サン プルがあ り ます。 11.5.5 反復す る グ ラ フ ィ カ ル内容のためのス コ ープ ヒ ン ト ス コ ープ ヒ ン ト pdfvt オプシ ョ ンの scope サブオプシ ョ ン を、然 る べ き 値 と と も に、PDF_ load_image( ) ・ PDF_load_graphics( ) ・ PDF_open_pdi_page( ) ・ PDF_begin_template_ext( ) に 与え る べき です。 こ れを達成する には、 カ レ ン ト PDF 文書内で、 ま たは (な るべ く は) 複 数文書にわた っ て、 画像 ・ ページ ・ テ ンプ レー ト が再利用 さ れ る場所 と 回数を ク ラ イ ア ン ト アプ リ ケーシ ョ ンが知 る 必要があ り ます。 こ の scope オプシ ョ ンは必須ではあ り ません が、 こ れは強 く 推奨 さ れます。 なぜな ら こ れは、 RIP のための重要な最適化情報を提供す 346 第 11 章 : PDF のバージ ョ ン と 規格 る か ら です。 その よ う な情報が得 ら れない場合には、 間違っ てい る おそれのあ る 値を与え る よ り も 、 こ の scope オプシ ョ ン を省略す る か、 値 unknown と と も に指定す るべ き です。 ス コ ープ singleuse ・ record ・ file に対 し ては、 PDFlib は、 その ス コ ープ値がその XObject の実際の使用 と 整合 し てい る か ど う か をチ ェ ッ ク し て、 も し も その ス コ ープが大 き すぎ る と き は、 ロ グ フ ァ イ ル内にた と えば以下の よ う な警告を出力 し ます : XObject with handle 9 was assigned PDF/VT scope 'record', but was used only once (use 'scope=singleuse' instead) こ の よ う な警告を得た と き には、 も っ と 然 る べ き ス コ ープ値を、 その照応す る 画像かグ ラ フ ィ ッ ク か取 り 込み PDF ページかテ ンプ レー ト に割 り 当て る こ と に よ っ て、RIP 内の不必 要な キ ャ ッ シ ン グ を回避 し 、ひいては印刷パフ ォーマ ン ス を向上 さ せ る こ と がで き る か ど う か をチ ェ ッ ク す る べ き です。 あ る XObject への参照が少なすぎ る 場合 (その scope オプシ ョ ン と 比較 し て) には、 ク ラ イ ア ン ト コ ー ド に改善の余地があ り う る こ と を示唆す る警告が発生す る だけですが、あ る XObject への参照が多すぎ る 場合にはエ ラ ーにな り ます。なぜな ら こ れは PDF/VT 規格 に違反す る か ら です。 よ り 具体的には、 以下の状況で例外が発生 し ます : > オプシ ョ ン scope=singleuse が与え ら れてお り 、かつ、その XObject がその文書内で複数 回使用 さ れてい る 。 > オプシ ョ ン scope=record が与え ら れてお り 、かつ、その XObject が複数の受領者レ コ ー ド 内で使用 さ れてい る 。 scope=stream と scope=global に対 し ては、 environment サブオプシ ョ ン を与え る 必要があ り ます。 こ れは、 キ ャ ッ シ ュ さ れたオブジ ェ ク ト を複数の文書にわた っ て識別す る ために 用い ら れ る 、 然 る べ き 文字列を内容 と す る べ き です。 ワー ク フ ロ ーに応 じ て、 顧客参照や ジ ョ ブ参照を こ のオプシ ョ ンのために使 う と よ いで し ょ う 。 た と えば、 複数の印刷ジ ョ ブ にわた っ て頻繁に柄笑え る 企業 ロ ゴ を、 こ の方法で識別す る と よ いで し ょ う 。 一意な ID PDFlib は、 すべての取 り 込まれた PDF ページ ・ 画像 ・ グ ラ フ ィ ッ ク に対 し て、 一意な ID を自動的に割 り 当て ます (グ ラ フ ィ ッ ク に対 し ては、 templateoptions オプシ ョ ン を与え る 必要があ り ます)。 等価な画像 ・ ページ ・ グ ラ フ ィ ッ ク 群に等 し い ID 値が割 り 当て ら れ る こ と に よ り 、 RIP 内での効果的な キ ャ ッ シ ン グ を可能に し てい ま す。 テ ン プ レー ト に対 し ては、 一意な ID を、 pdfvt オプシ ョ ンの xid サブオプシ ョ ン を通 じ てユー ザーが与え る べ き です。 テ ン プ レー ト に対す る 識別子は、 PDF/VT に従っ て等価な PDF フ ォーム XObject を作成する テ ンプ レー ト 定義群 (すなわち、 同一の視覚的出力を持つテ ンプ レー ト ) に対 し て等 し く す る べ き です。 等価でないテ ンプ レー ト は、 異な る識別子を 持つか、 識別子を全 く 持た ない よ う にす る 必要があ り ます。 アプ リ ケーシ ョ ンが、 PDFlib に よ っ て作成 さ れた一意な ID 文字列を必要 と す る 場合、 こ れを取得す る には、 画像 と テ ンプ レー ト に対 し ては PDF_info_image( ) の、 グ ラ フ ィ ッ ク に対 し ては PDF_info_graphics( ) の、 取 り 込まれた PDF ページに対 し ては PDF_info_pdi_ page( ) の、 xid オプシ ョ ン を用い ます。 11.5.6 カ プ セル化 XObject XObject を、 カプセル化 さ れてい る と し て標識す る と 、 処理パフ ォーマ ン ス が大いに向上 し ます。 ただ し 、 XObject を、 カプセル化 さ れてい る と し て標識で き る のは、 完全に不透 明な文書内か、 (透過が使われてい る 文書内では) 特定の必要条件が満た さ れた場合のみ です。 11.5 PDF/VT によ る可変 ・ ト ラ ンザク シ ョ ン印刷 347 文書内の透過 その文書内で透過が使われ る か ど う かを PDFlib はあ ら か じ め知 り ません ので、 ヒ ン ト と し て PDF_begin_document( ) に usestransparency オプシ ョ ン を与え る こ と も で き ます。 ク ラ イ ア ン ト が こ のオプシ ョ ン を用いて、 透過が一切使われていない と 宣明 し た場合には、 すべての XObject が、 カプセル化 さ れてい る と し て標識 さ れます。 その文 書内で透過が使われてい る 場合には、 その XObject 群がカプセル化 さ れてい る と し て標識 さ れ る よ う に す る に は、 ク ラ イ ア ン ト は 特 定 の 諸 規 則 に 従 う 必 要 が あ り ま す。 usestransparency=false が与え ら れたに も かかわ ら ず、その文書が透過要素を含んでいた場 合には、 PDFlib は例外を発生 さ せます。 以下の条件の う ちの 1 つない し 複数が真であれば、 その生成文書内で透過が使われて い る と 見な さ れます : > PDF_load_image( ) か PDF_fill_imageblock( ) が、以下のいずれかのオプシ ョ ン と と も に呼 び出 さ れてい る : >その画像がアルフ ァ チ ャ ン ネルを含んでお り 、 かつ ignoremask オプシ ョ ンが false。 >ピ ク セルあ た り ビ ッ ト 数が複数であ る 画像のハン ド ルを持っ た masked オプシ ョ ン。 > PDF_load_graphics( ) を用いて取 り 込まれた グ ラ フ ィ ッ ク が、 何 ら かの透過要素を含ん でい る。 > PDF_create_gstate( ) が、 以下のいずれかのオプシ ョ ン と と も に呼び出 さ れてい る : >オプシ ョ ン リ ス ト を持っ た (すなわち、 キーワー ド none を持っ てい る のではない) softmask オプシ ョ ン。 >値 1 以外を持っ たオプシ ョ ン opacityfill か opacitystroke のいずれか 1 つ。 >値 None ・ Normal 以外を持っ た blendmode オプシ ョ ン。 > PDF_open_pdi_page( )かPDF_fill_pdfblock( ) を用いて取 り 込まれた PDFページが、何 ら か の透過要素を含んでい る 。 なお、 取 り 込まれた PDF ページ内の透過を識別す る には、 pCOS イ ン タ フ ェース と usespagetransparency 擬似オブジ ェ ク ト を用い ます (詳 し く は pCOS パ ス リ フ ァ レ ン ス を参照 し て く だ さ い)。 XObject を カ プ セル化 さ れてい る と し て標識 PDFlib は、 以下の規則に従っ て、 で き る だけ多 く の XObject を、 カプセル化 さ れてい る と し て標識 し よ う と 試みます : > PDF_load_image( ) か PDF_fill_imageblock( ) を用いて作成 さ れ る XObject は、以下の条件 のいずれかが真であれば、 カプセル化 さ れてい る と し て標識 さ れます : >PDF_load_image( ) の renderingintent オプシ ョ ンが値 Auto 以外 と と も に与え ら れてい る。 >PDF_load_image( ) の mask オプシ ョ ンが値 true と と も に与え ら れてい る 。 > PDF_begin_template_ext( ) か PDF_open_pdi_page( ) か PDF_fill_pdfblock( ) か PDF_load_ graphics( ) を templateoptions オプシ ョ ン と と も に用いて作成 さ れ る XObject は、 も し も 文書オプシ ョ ン usestransparency=false が与え ら れてい る か、transparencygroup オプ シ ョ ンがサブオプシ ョ ン isolated=true と と も に与え ら れてい る場合には、 カプセル化 さ れてい る と し て標識 さ れます。 > 取 り 込まれ る ページが、すでにカプセル化 さ れてい る と し て標識 さ れてい る XObject を 含んでい る 場合には、 こ のプ ロ パテ ィ は、 そのページ を取 り 込むにあ た っ て保持 さ れ ます。 あ る XObject を、 カプセル化 さ れてい る と し て標識す る こ と がで き ない と き は、 警告が ロ グ フ ァ イ ルへ書 き だ さ れます。 カ プ セル化 XObject に対す る ス コ ープ PDF_load_image( ) ・ PDF_fill_imageblock( ) ・ PDF_ load_graphics( ) ・ PDF_open_pdi_page( ) ・ PDF_fill_pdfblock( ) ・ PDF_begin_template_ext( ) を 348 第 11 章 : PDF のバージ ョ ン と 規格 用いて作成す る すべてのカプセル化 XObject に対 し て、 pdfvt オプシ ョ ンの scope サブオ プシ ョ ン を与え る こ と を強 く 推奨 し ま す。 こ の scope サブオプシ ョ ンは、 非カ プセル化 XObject に対 し て与え る こ と も 許容 さ れてい ますので、 も し も 画像かグ ラ フ ィ ッ ク か取 り 込 ま れ る ペー ジ か テ ン プ レ ー ト の 継続期間 が わ か っ て い る な ら ば、 そ の 生成 さ れ る XObject のカプセル化ス テー タ ス にかかわ ら ず、 すべての関連す る API 呼び出 し に こ れを 与え る こ と も で き ます。 11.5.7 PDF/X ・ PDF/VT 文書を PDI で取 り 込む 既存の PDF 文書か ら のページ を PDF/VT 準拠の出力文書内へ取 り 込 も う と す る 際には、 特別な諸規則が適用 さ れます (PDI について詳 し く は 200 ページ 「7.3 PDF ページ を PDI で取 り 込む」 を参照 し て く だ さ い)。 すべての取 り 込まれ る 文書は、 表 11.21 に従っ て互 換な PDF/X・PDF/VT 準拠レベルに準拠 し てい る 必要があ り ます。も し も あ る特定の PDF/ VT 準拠レベルが PDFlib 内で構成 さ れてお り 、 かつ取 り 込まれ る文書がその互換 PDF/X レベルの う ちの 1 つを遵守 し てい る な ら ば、 その生成出力が、 その選択 さ れた PDF/VT 準 拠レベルに準拠す る こ と が保証 さ れ ます。 取 り 込ま れ る 文書は、 受け付け可能な PDF/X レベルの う ちの 1 つを遵守 し ていない場合には、 拒絶 さ れます。 表 11.21 さ ま ざ ま な PDF/VT 出力レ ベルに対する互換 PDF/X ・ PDF/VT 入力レ ベル PDF/X-1a:2003 PDF/X-3:2003 PDF/X-4 PDF/VT-1 PDF/X-4p PDF/X-4p に基づ く PDF/VT-2 DF/X-5g PDF/X-5g に基づ く PDF/VT-2 PDF/X-5pg PDF/X-5pg に基づ く PDF/VT-2 取 り 込まれる文書の PDF/X ・ PDF/VT レ ベル PDF/VT-1 (つねにPDF/X-4に基づ く ) 許容 許容 PDF/X-4pに基づ く PDF/VT-2 許容 許容1 PDF/X-5gに基づ く PDF/VT-2 許容 許容 許容2 許容 2 PDF/X-5pgに基づ く PDF/VT-2 許容 許容 1 許容 2 許容 1,2 PDF/VT 出力レ ベル 1. PDF_process_pdi( ) で action=copyoutputintent を指定する と 、 外部出力イ ン テ ン ト ICC プ ロ フ ァ イルへの参照が コ ピー さ れます。 2. 取 り 込まれたページが、 参照 さ れた XObject を含んでい る と きは、 PDF_open_pdi_page( ) は代理 と 参照の両方を コ ピー し ます。 PDF/VT 取 り 込みでの DPart と DPM の制約 PDF/VT 文書を取 り 込む際には、 以下の制 約に留意 し て く だ さ い : 文書部分 ヒ エ ラ ルキー (DPart) と 文書部分 メ タ デー タ (DPM) は取 り 込ま れ ません。 それ ら を、 pCOS を用いて ク エ リ し て、 PDF_begin/end_dpart( ) と POCA 関数群を用いて再構築す る こ と が可能です。 11.5.8 PDF/VT-2s のための MIME ス ト リ ーム を作成 ク ッ ク ブ ッ ク PDF/VT-2s を生成する ための コ ー ド サン プルが、 PDFlib ク ッ ク ブ ッ ク の pdfvt カ テ ゴ リ に あ り ます。 PDF/VT-2s は、 PDF/VT チ ャ ン ク 群の連鎖を内容 と す る デー タ ス ト リ ーム を記述 し ます。 こ のチ ャ ン ク 群は、 1 個ない し 複数の PDF/VT-1 か PDF/VT-2 フ ァ イ ル と 、 すべての参照 11.5 PDF/VT によ る可変 ・ ト ラ ンザク シ ョ ン印刷 349 さ れてい る フ ァ イ ル群です。 こ の ス ト リ ームデー タ を MIME1 パー ト 群内にパ ッ ケージす る こ と は、 PDFlib の ス コ ープ を超えてい ますので、 アプ リ ケーシ ョ ン側で実装す る 必要が あ り ます。 1 個の PDF/VT-2s ス ト リ ームは、 以下のパー ト 群を内容 と す る 可能性があ り ます : > 1 個ない し 複数の PDF/VT-1 フ ァ イ ル群か PDF/VT-2 フ ァ イ ル集合、ま たは両方の種類。 直接 (参照 さ れていない) 文書 (群) か ら 成っ てい ます。 > その ス ト リ ームが、1 個ない し 複数の、PDF/X-5g か PDF/X-5pg に基づ く PDF/VT-2 フ ァ イ ルを包んでい る 場合には、 PDF/VT-2 準拠文書群か ら 参照 さ れてい る 、 以下の形式 の PDF 文書群 : PDF/X-1a ・ PDF/X-3 ・ PDF/X-4 ・ PDF/X-4p ・ PDF/VT-1。 > その ス ト リ ームが、1 個ない し 複数の、PDF/X-4p か PDF/X-5pg に基づ く PDF/VT-2 フ ァ イ ルを包んでい る場合には、 出力 イ ン テ ン ト 群のための外部 ICC プ ロ フ ァ イ ル群。 PDF/VT-2s は、 デ ィ ス ク フ ァ イ ル内に保管 さ れ る 形式 と し ては意図 さ れてお ら ず、 伝送 用 と し てのみ意図 さ れてい ます。 その内容をデ ィ ス ク 上に保管する には、 PDF/VT 文書の 集合を作成す る 必要があ り ます。 PDF 生成に関す る必要条件 PDF/VT-2s のために PDF 文書を作成す る 際には、 以下の必 要条件を満たす必要があ り ます。PDFlib は文書境界を越え ていかな る 状態情報を も 保持 し ませんので、 こ れ ら の規則に服す る こ と はアプ リ ケーシ ョ ン側の役割です : > 1 つの PDF/VT-2s ス ト リ ーム内のすべての PDF/VT 文書に対 し て、その出力 イ ン テ ン ト が等 し い必要があ り ます。 すなわち、 PDF_load_iccprofile( ) と usage=outputintent か、 PDF_process_pdi( ) と action=copyoutputintent を用いて読み込まれ る ICC プ ロ フ ァ イ ル が、 すべての文書に対 し て同一であ る 必要があ り ます。 > 1 つの PDF/VT-2s ス ト リ ーム内のすべての直接 (すなわち参照 さ れていない) PDF/VT フ ァ イ ルの間で、PDF_begin_document( ) の nodenamelist オプシ ョ ンが同一の値を持つ 必要があ り ます。 同様に、 その ス ト リ ーム内のすべての直接 PDF/VT フ ァ イ ルの間で、 recordlevel オプシ ョ ン ( も し あれば) が同一の値を持つ必要があ り ます。 なお、 PDF/ VT 規格は、 参照 さ れ た PDF/VT フ ァ イ ル群に対 し て も 、 等 し い nodenamelist と recordlevel を必須 と し てい ますが、 こ れは う っか り ミ ス と 思われます。 > PDF_load_image( ) と PDF_open_pdi_page( ) と PDF_begin_template_ext( ) に、pdfvt オプ シ ョ ンのscope=stream か scope=global サブオプシ ョ ン を適切に与え る必要があ り ます。 さ ら に、 environment サブオプシ ョ ンに対 し て も 然る べき 値を与え る 必要があ り ます。 > scope=stream か scope=global の場合には、XObject のキ ャ ッ シ ン グ を文書を越え て可能 にす る ために、PDF_begin_template_ext( ) に xid オプシ ョ ン を与え る こ と を強 く 推奨 し ます。 MIME ス ト リ ーム生成に関す る必要条件 PDF/VT-2s のために MIME ス ト リ ーム を作成 す る 際には、 表 11.22 に挙げ る 必要条件を満たす必要があ り ます。 表 11.22 PDF/VT-2s ス ト リ ームのための MIME の必要条件 実体 Content-Type ヘ ッ ダ 他のヘ ッ ダ と 追加の必要条件 完全なPDF/VT-2s ス ト リ ーム multipart/mixed X-PDFVT-Stream-version: 1 Content-Type ヘ ッ ダ よ り 前に現れる必要があ り ます。 1. MIME 仕様については www.ietf.org/rfc/rfc2045.txt を参照 し て く だ さ い。 350 第 11 章 : PDF のバージ ョ ン と 規格 表 11.22 PDF/VT-2s ス ト リ ームのための MIME の必要条件 実体 Content-Type ヘ ッ ダ 他のヘ ッ ダ と 追加の必要条件 参照 さ れたPDF フ ァ イル application/pdf Content-Disposition: attachment; filename=... 外部ICCプ ロ フ ァ イ ル application/vnd.iccprofile 直接PDF/VT フ ァ イ ル application/pdf すべてのMIMEパー ト filename パラ メ ー タ が必須です。 参照内で用い られま す。 Content-Disposition: attachment; filename=... filename パラ メ ー タ が必須です。 参照内で用い られま す。 Content-Disposition: inline その MIME ス ト リ ーム内で、 すべての参照 さ れた PDF と 外部 ICC フ ァ イル群よ り 後に符号化 さ れる必要があ り ます。 そのス ト リ ーム内のいずれの PDF/VT-2 フ ァ イルか ら も参照 さ れていてはいけません。 Content-Transfer-Encoding: binary 推奨 さ れます。 11.5 PDF/VT によ る可変 ・ ト ラ ンザク シ ョ ン印刷 351 11.6 PDF/UA に よ る ユニバーサルア ク セ シ ビ リ テ ィ 11.6.1 PDF/UA 規格 PDF/UA-1 は、 PDF 文書のユニバーサルア ク セシ ビ リ テ ィ を向上 さ せる ために、 タ グ付 き PDF のエ レ メ ン ト 群や、その他の文書の諸側面の詳細を仕様化 し た も のです。PDF/UA は、 WCAG 2.0 (Web コ ン テ ン ツ ア ク セシ ビ リ テ ィ ガ イ ド ラ イ ン群1) を PDF 文書に適用 し た も の と 捉え る こ と がで き ます。 使用場面が WCAG 2.0 準拠を必要 と す る場合には、 PDF/ UA を用い る こ と に よ り こ のゴールを達成で き ます。 ただ し 例外 と し て、 生成 さ れ る 文書 内にマルチ メ デ ィ アか ス ク リ プテ ィ ン グかア ク シ ョ ン を含め よ う と す る 場合には、 PDF/ UA に加えて WCAG 2.0 も 調べ る 必要があ り ます。 PDF/UA は、 PDF 1.7 と ISO 32000-1 で定義 さ れてい る タ グ付き PDF に基づいてい ま す。 こ れは PDF フ ァ イ ル形式に何 ら かの新た な機能を加えたのではな く 、 主に、 い く つ かのア ク セシ ビ リ テ ィ と タ グ付けの側面が PDF 1.7 ではオプシ ョ ナルであ る のを必須 と し た も のです。 ま た こ れは、 構造エ レ メ ン ト の さ ま ざ ま な種別ど う し の関係を明確化 し てい ます。 ISO 14289-1 で定義 さ れた PDF/UA-1 PDF/UA は、PDF 文書のア ク セシ ビ リ テ ィ を向上 さ せ る ために以下の手段を用いてい ます : > 文書構造に関す る 特定の必要条件を強制。 例 : タ グ付け規則な ど。 > 特定の補足情報を必須化。 例 : メ タ デー タ 、 グ ラ フ ィ ッ ク のための代替テ キ ス ト 。 > ア ク セシ ビ リ テ ィ の目的を阻害す る 特定の PDF 要素を防止。 PDFlib の PDF/UA-1 の実装は、 以下の文書に基づいてい ます : > PDF/UA-1 規格 (ISO 14289-1:2012) PDF/UA ・ PDF/A 両立文書を作成 PDF/UA 文書であ り なが ら 、 同時にアーカ イ ビ ン グの ための PDF/A に も 準拠 し てい る文書を作成す る と 、有用な こ と も あ る で し ょ う (321 ペー ジ 「11.3 PDF/A に よ る アーカ イ ビ ン グ」 を参照)。 実際、 PDF/A-1a/2a/3a を作成 し たい 場合には、 PDF/UA の必要条件を遵守す る こ と に よ っ て、 生成 さ れ る 文書のア ク セシ ビ リ テ ィ を向上 さ せ る こ と を推奨 し ま す。 PDF/A ・ PDF/UA 両立文書を作成す る には、 PDF_ begin_document( ) の pdfa ・ pdfua オプシ ョ ンに対 し て適切な値を与え ます。 例 : ret = p.begin_document("combo.pdf", "pdfa=PDF/A-2a pdfua=PDF/UA-1"); こ の よ う な二重用途の文書を作成す る 際には、 両方の規格に準拠す る両立フ ァ イ ルは、 両 方の規格に よ っ て課せ ら れ る 必要条件に従 う 必要があ り ますので、 留意 し て く だ さ い。 そ の PDF 互換レベルは、 関与す る 規格群の PDF 互換性の最小値です : 取 り 込まれ る PDF 文 書が、 PDF/UA 規格 と PDF/A 規格の両方を遵守 し てい る 必要があ り ます。 タ グ付 き PDF 出力のためには、 PDF/A-1a を避けて、 も っ と 新 し い PDF/A-2a か PDF/ A-3a 規格のほ う で作業す る こ と を推奨 し ます。 なぜな ら 、 PDF/UA-1 と PDF/A-1a の間 には小 さ な衝突がい く つかあ る か ら です : > Scope 属性が、PDF/UA では必須ですが、PDF/A-1a の基礎を成す PDF 1.4 では得 ら れま せん。 結果 と し て、 両立文書内では、 ヘ ッ ダセルを持っ た表の正 し い タ グ付けが不可 能です。 こ の こ と は、 手作業 と 自動の両方の表 タ グ付けにあ ては ま り ま す。 ですので PDF/A-1a においては、正 し く タ グ付けで き る のは、ヘ ッ ダセルを持た ない表のみです。 1. www.w3.org/TR/WCAG20/ 参照 352 第 11 章 : PDF のバージ ョ ン と 規格 > PDF/UA は、注釈の存在下では、ページオプシ ョ ン taborder=structure を必須 と し ます。 し か し 、 こ の taborder オプシ ョ ンは PDF 1.5 を必要 と し ますので、 PDF/A-1a では使 え ません。 結果 と し て、 PDF/A-1a ・ PDF/UA 両立文書内では注釈が使え ません。 ク ッ ク ブ ッ ク PDFlib ク ッ ク ブ ッ ク 内の starter_invoice サン プルが、 PDF/UA-1 ・ PDF/A-2a 両立文書を作 成する方法を演示 し ています。 PDFlib は、 技術的な PDF/UA の必要条件への違反を検出 し た場合には、 例外を発生 さ せ ます。 こ の場合には PDF 出力は何 も 作成 さ れません。 表 11.23 に、 PDF/UA 準拠出力を作 成す る ための一般的必要条件を挙げます。 表 11.23 PDF/UA 準拠のための一般的必要条件 項目 PDF/UA 準拠のための PDFlib 関数 ・ オプ シ ョ ンの必要条件 一般的文書必要条 件 PDF_begin/end_document( ) : pdfua オプ シ ョ ン を PDF/UA-1 に設定する必要があ り ます。 こ れは タ グ付き PDF を必須 と し ます (tagged オプ シ ョ ンは自動的に設定 さ れます)。 PDF 1.7ext3 以上を要する操作 ( リ ッ チ メ デ ィ ア注釈 ・ ポー ト フ ォ リ オな ど) を避ける必要 があ り ます。 オプ シ ョ ン viewerpreferences : サブオプ シ ョ ン displaydoctitle に対 し て true のみが許 容 さ れます。 オプ シ ョ ン permissions : キーワー ド noaccessible が許容 さ れません。 タ グ付け すべての タ グ付け規則 (285 ページ 「構造エ レ メ ン ト に対する ネス ト 規則」 参照) に従 う 必要があ り ます。 checktags 文書オプ シ ョ ン を false に設定 し てはいけません。 フォン ト フ ォ ン ト オプ シ ョ ン embedding を true にする必要があ り ます。 オプ シ ョ ン unicodemap=false と dropcorewidths= true が許容 さ れません。 埋め込みは PDF コ ア フ ォ ン ト について も必須です。 テキス ト 出力 と PUA PUA Unicode キ ャ ラ ク タ (ロ ゴや記号な ど) が、 適切な置換テキス ト を持つ必要があ り ま Unicodeキ ャ ラ ク タ す。 それを囲 う コ ン テ ン ツ ア イ テムに対する PDF_begin_item( ) の ActualText オプ シ ョ ン で 指定するか、 その照応する出力関数の同等の tag オプ シ ョ ン で指定 し ます (327 ページ 「PUA キ ャ ラ ク タ 」 参照)。 不可視テキス ト 埋め込み必須は、 不可視テキス ト (主 と し て OCR の生成結果のために有用) に対 し てのみ 用い ら れてい る フ ォ ン ト についてだけはあてはま り ません。 不可視 と は textrendering=3 です。 こ れは、 optimizeinvisible オプ シ ョ ン を用いて制御する こ と も で き ます。 不可視テキス ト は、 レ ン ダ リ ング さ れる等価物を一切持たない場合には、 Artifact と し て マー ク する必要があ り ます。 レ イ ヤー レ イ ヤーを使え ますが、 ただ し PDF_define_layer( ) と PDF_set_layer_dependency( ) のい く つ かのオプ シ ョ ン を避ける必要があ り ます (PDFlib リ フ ァ レ ン ス参照)。 外部 コ ン テ ン ツ PDF_begin_template_ext( ) ・ PDF_load_graphics( ) ・ PDF_open_pdi_page( ) : reference オプ シ ョ ン を避け る必要があ り ます。 PDF取 り 込み PDF_open_pdi_document( ) : 取 り 込まれる文書が PDF/UA に準拠 し てい る必要があ り ます。 357 ページ 「11.6.4 PDF/UA 文書を PDI で取 り 込む」 を参照 し て く だ さ い。 メ タ デー タ PDF_set_info( ) で key=Title を、 または PDF_begin/end_document( ) で metadata に与え る XMP 内で dc:title を、 空で ない値 と と も に与え る必要があ り ます。 11.6.2 タ グ付けの必要条件 PDF/UA は、 タ グ付 き PDF に基づいてい ますので、 278 ページ 「10.3 タ グ付 き PDF の基 礎」 で説明 し た タ グ付 き PDF の必要条件に従 う 必要があ り ます。 ただ し 、 PDF/UA は こ 11.6 PDF/UA に よ るユニバーサルア ク セシ ビ リ テ ィ 353 れに加え て、 タ グ付けの必要条件を多数課す る こ と に よ っ て、 ア ク セシ ビ リ テ ィ の向上を 図っ てい ます。 意味付けの必要条件 ユーザーは、 文書 ヒ エ ラ ルキーを作成 し 、 以下に挙げ る 意味付け 規則に従 う 必要があ り ます。 適切な構造エ レ メ ン ト を選ぶ こ と は、 PDF/UA 規格準拠の決 定的な構成要素です。 こ れ ら の側面に責任を負 う のはアプ リ ケーシ ョ ン側であ る こ と を理 解する こ と が重要です。 なぜな ら PDFlib は こ れ ら をチ ェ ッ ク で き ないか ら です : > タ グ付けは、 その文書構造に対 し て適切な構造エ レ メ ン ト を用い る 必要があ り ま す : それが見出 し であ る な ら 、 それを見出 し と し て タ グ付けす る 必要があ り ます。 それが 表であ る な ら 、 それを表 と し て タ グ付けす る必要があ り ます。 > その文書に と っ て意味を な さ ない コ ン テ ン ツ を、 その文書 ヒ エ ラ ルキー内に含めては いけ ません。 それは Artifact と し て タ グ付けす る 必要があ り ます。 > 構造エ レ メ ン ト 群を、 論理読み取 り 順序に配列す る 必要があ り ます。 こ れは、 その タ グ群を読み順に作成す る こ と に よ っ て最 も 容易に達成で き ます。 ただ し 、 複雑な レ イ ア ウ ト に対 し ては、 PDF_activate_item( ) を用いて こ れを達成す る こ と も で き ます (305 ページ 「10.4.4 コ ン テ ン ツ を順序に と ら われず作成」 参照)。 > コ ン テ ン ツ の色や形式やレ イ ア ウ ト のせいで、 意図す る 情報がその ま ま ではア ク セシ ブルでない コ ン テ ン ツに、 適切に タ グ付けす る必要があ り ます。 > グ ラ フ ィ ッ ク 内で表現 さ れてい る テ キ ス ト は、 も し それがテ キ ス ト を自然言語で含ま ない場合には (フ ォ ン ト サンプルやス ク リ プ ト サンプルな ど)、 説明を持っ た Alt オプ シ ョ ン を必須 と し ます。 > 画像のキ ャ プシ ョ ン を Caption タ グでマー ク す る必要があ り ます。 > コ ン テ ン ツ が箇条書 き と し て読ま れ る こ と を意図 し てい る 場合には、 箇条書 き エ レ メ ン ト (L) を作成す る 必要があ り ます。 > リ ン ク に、 然 る べ き Link 注釈を伴わせ る 必要があ り ます。 > ヘ ッ ダ と フ ッ タ を Artifact と し て、artifacttype=Pagination と artifactsubtype=Header か Footer と と も に タ グ付けす る 必要があ り ます。 > 論理的に一体であ る グ ラ フ ィ カル要素群のグループに対 し ては、ただ 1 つの Figure を作 成す る 必要があ り ます。 > 脚注 ・ 後注 ・ 注 ラ ベル と 、 その文書内の場所への参照に、 適切に Note か Reference と し て タ グ付けす る 必要があ り ます。 タ グご と の必要条件 表 11.24 に、 PDF/UA 準拠を達成する ための、 タ グ ご と に対す る 必 要条件を挙げます。 こ こ に挙げた標準種別へマ ッ プ さ れた カ ス タ ムエ レ メ ン ト 種別につい て も 、 こ れ ら の規則に従 う 必要があ り ます。 た と えば、 rolemap オプシ ョ ン内でカ ス タ ム タ グ Illustration が Figure へマ ッ プ さ れてい る な ら ば、 それ も Figure に対す る 条件下に置 かれます。 表 11.24 PDF/UA 準拠のための タ グご と の必要条件 エ レ メ ン ト 種別 PDF/UA 準拠のための必要条件 標準エ レ メ ン ト 種 別 PDF_begin_document( ) : rolemap オプ シ ョ ンが標準エ レ メ ン ト 種別を マ ッ プ し てはいけませ ん。 Figure オプ シ ョ ン Alt か ActualText の う ちの 1 つを与え る必要があ り ます。 Formula オプ シ ョ ン Alt を与え る必要があ り ます。 354 第 11 章 : PDF のバージ ョ ン と 規格 表 11.24 PDF/UA 準拠のための タ グご と の必要条件 エ レ メ ン ト 種別 PDF/UA 準拠のための必要条件 Table 表エ レ メ ン ト は、 論理的な表に対 し ては作成する必要があ り ますが、 レ イ アウ ト 目的のた めに作成 さ れる表に対 し ては作成 し てはいけません。 PDFlib に よ っ て組版 さ れる表は自動 的に タ グ付けで き ます。 297 ページ 「10.4.1 自動表 タ グ付け」 を参照 し て く だ さ い。 TH 表はヘ ッ ダ を含むべき です。 TH エ レ メ ン ト に対 し てはオプ シ ョ ン Scope が必須です ( こ れ は、 PDF_fit_table( ) の header オプ シ ョ ンが用い ら れてい る場合には、 自動表 タ グ付けに よ っ て確保 さ れます)。 L エ レ メ ン ト 種別 L (箇条書き) は ListNumbering オプ シ ョ ン を必須 と し ます。 その子 LI (箇条書き項目) 群がいずれも Lbl (ラ ベル) エ レ メ ン ト を含ま ない場合には、 ListNumbering を None にする必要があ り ます。 一方、 も し も ListNumbering=None であ り ながら 、 可視な箇条書き ラ ベルがある場合には、 それ ら をページ装飾 と し て マー ク する必 要があ り ます。 Note Note と し て タ グ付け さ れる脚注 と 後注に対 し ては id オプ シ ョ ンが必須です。 見出 し すべての見出 し に対 し て、 適切な見出 し タ グ を用い る 必要があ り ます。 PDF 文 書内におけ る 見出 し の階層ネ ス ト については 2 通 り のアプ ロ ーチがあ り ます : > 強 く 構造化 さ れた文書 : グループ化エ レ メ ン ト 群が、 必要なだけ深 く ネ ス ト す る こ と に よ っ て、 アーテ ィ ク ル ・ セ ク シ ョ ン ・ 下位セ ク シ ョ ン な ど を持っ た コ ン テ ン ツ の組 織を反映 し ます。 各レベルにおいて、 そのグループ化エ レ メ ン ト の子群は、 1 個の見出 し H と 、 その レベルの コ ン テ ン ツのための 1 個ない し 複数の段落 P と 、 ネ ス ト さ れた 下位セ ク シ ョ ン群のための さ ら な る グループ化エ レ メ ン ト 群か ら 成 る べ き です。 強い 構造は通常、 XML 文書において用い ら れます。 > 弱 く 構造化 さ れた文書 : その文書の構造 ヒ エ ラ ルキーが比較的フ ラ ッ ト であ り 、 ほん の 1 ~ 2 個の レベルのグループ化エ レ メ ン ト 群を持ち、 すべての見出 し ・ 段落やその 他 BLSE 群を それ ら の直接の子 と し ます。 その コ ン テ ン ツの組織が、 その論理構造 と し て反映 さ れず、 特定の見出 し レベル H1 ・ H2 ・ H3 な ど に よ っ て表現で き ます。 見出 し タ グは子孫を一切持て ません。弱い文書構造は通常、HTML内において用い ら れます。 PDF/UA モ ー ド に お い て は、 こ の 区別 を 明示す る た め に、 PDF_begin_document( ) で structuretype オプシ ョ ン を用い る 必要があ り ます。 PDFlib は、 文書構造の種別に応 じ て、 見出 し エ レ メ ン ト の使用に関す る 以下の規則を強制 し ます。 > すべての文書 : >すべての見出 し タ グ内で Title オプシ ョ ン を用い る こ と に よ っ て、文書のセ ク シ ョ ン を 表示す る 必要があ り ます (例 : 「第 1 章」)。 >見出 し エ レ メ ン ト H ・ H1 ・ H2 な どは子孫を一切持っ てはいけ ません。 > 弱 く 構造化 さ れた文書 (structuretype=weak) : >見出 し の連鎖は、 H1 か ら 始ま り 、 数値レベルを一切ス キ ッ プ し てはいけ ません。 た と えば、 H1 H3 と い う 連鎖は許容 さ れません。 >6 個を超え る 見出 し レベルが必要な場合には H7 ・ H8 な ど を使え ます。 >番号な し の見出 し エ レ メ ン ト H を使っ てはいけ ません。 > 強 く 構造化 さ れた文書 (structuretype=strong) : >見出 し のために H を用い る 必要があ り ますが、ただ し その構造 ヒ エ ラ ルキーの各 ノ ー ド 内に複数の H タ グがあ っ てはいけ ません。 >番号付 き の見出 し エ レ メ ン ト H1 ・ H2 な ど を使っ てはいけ ません。 11.6 PDF/UA に よ るユニバーサルア ク セシ ビ リ テ ィ 355 11.6.3 コ ン テ ン ツ種別ご と の追加の必要条件 表 11.25 に、 さ ま ざ ま な コ ン テ ン ツ種別 と イ ン タ ラ ク テ ィ ブ要素に関連 し た PDF/UA の必 要条件 と 推奨事項を挙げます。 表 11.25 コ ン テ ン ツ種別 と イ ン タ ラ ク テ ィ ブ要素ご と に対する PDF/UA の必要条件 と 推奨事項 コ ン テ ン ツ種別 PDF/UA 準拠のための PDFlib 関数 ・ オプ シ ョ ンの必要条件 テキス ト ページ上のすべてのテキス ト の自然言語を宣言する必要があ り ます。 テキス ト 列内の自然 言語の変化 も宣言する必要があ り ます。 こ の自然元 と を宣言する には、 PDF_begin_ document( ) の lang オプ シ ョ ンやその他の手段を用います。 詳 し く は 289 ページ 「言語指 定」 を参照 し て く だ さ い。 エ レ メ ン ト の言語属性はそのすべての子孫へ継承 さ れます。 出力内の .notdef グ リ フ を避ける ために、 フ ォ ン ト オプ シ ョ ン replacementchar が強制的 に error にな り ます。 ベ ク ト ルグ ラ フ ィ ッ ク と ラスタ 画像 ラ ス タ 画像 と ベ ク ト ルグ ラ フ ィ ッ ク に、 Artifact か Figure か Formula と し て タ グ付けす る必要があ り ます。 こ れは、 PDF_rect( ) な どのよ う な低レ ベルパス構築関数 と 、 PDF_draw_ path( ) を用いたパスオブ ジ ェ ク ト と 、 PDF_fit_image( ) や同様の関数にあてはま り ます。 ベ ク ト ルグ ラ フ ィ ッ クかラ ス タ 画像を内容 と し て持つ SVG グ ラ フ ィ ッ ク も、 こ の必要条件の 対象 と な り ます。 取 り 込まれた PDFページ PDF_fit_pdi_page( ) を用いて配置 さ れた、 グ ラ フ ィ ッ ク を含んだ PDF ページに、 Artifact か Figure と し て タ グ付けする必要があ り ます。 注釈 ページ上に注釈が存在する場合 : PDF_begin/end_page_ext( ) : オプ シ ョ ン taborder に対 し て 値 structure のみが許容 さ れます。 PDF_create_annotation( ) で可視の注釈のために type=Link と する場合 : > contents オプ シ ョ ンが必須です。 > PDF_create_action( ) の ismap オプ シ ョ ンが、 リ ン ク注釈内のア ク シ ョ ンに対 し ては許容 さ れません。 PDF_create_annotation( ) で可視の注釈のために種別を Link 以外 と する場合1 : > 1 個の構造エ レ メ ン ト を作成する必要があ り 、 かつその構造エ レ メ ン ト を その文書 ヒ エ ラ ルキー内に正 し い読み取 り 順序で挿入する必要があ り ます。 > サブオプ シ ョ ン ActualText を持っ た contents オプ シ ョ ンか tag オプ シ ョ ンが必須です。 フ ォ ーム フ ィ ール ド ページ上に フ ォ ーム フ ィ ール ド が存在する場合 : PDF_begin/end_page_ext( ) : オプ シ ョ ン taborder に対 し て値 structure のみが許容 さ れます。 PDF_create_field( ) と 、 PDF_add_table_cell( ) のオプ シ ョ ン fieldname ・ fieldtype : PDF_ create_field( ) か tag オプ シ ョ ン を用いて Form タ グ を作成する必要があ り ます。 PDF_create_ field( ) と PDF_create_fieldgroup( ) のオプ シ ョ ンが必須です。 ページ ラ ベル PDF_begin/end_document( ) で labels オプ シ ョ ン を用いて、 お よび PDF_begin/end_page_ext( ) で label オプ シ ョ ン を用いて作成 さ れるページ ラ ベルは、 意味付け的に適切であ るべき で す。 しおり PDF_create_bookmark( ) を用いて し お り を生成する こ と が推奨 さ れます。 こ の し お り 群は、 正 し い読み取 り 順序 と 、 その コ ン テ ン ツのネス ト を反映するべき です。 添付 PDF_load_asset( ) : オプ シ ョ ン description が推奨 さ れます。 添付はそれ自体でア ク セシ ブ ルであ るべき です。 1. 注釈が可視 と 見 な さ れ る のは、 そ の長方形の少 な く と も 一部分が そ のペ ー ジ の CropBox 内 に あ り 、 かつ PDF_create_ annotation( ) の display オ プ シ ョ ンが hidden ・ noview 以外の場合です。 356 第 11 章 : PDF のバージ ョ ン と 規格 11.6.4 PDF/UA 文書を PDI で取 り 込む 既存の PDF 文書か ら のページ を PDF/UA 準拠出力文書へ取 り 込 も う と す る 際には、 追加 の諸規則が適用 さ れます (PDF 取 り 込みについて詳 し く は 200 ページ 「7.3 PDF ページ を PDI で取 り 込む」 を参照 し て く だ さ い)。 既存の PDF 文書か ら ページ を取 り 込むためには、 その取 り 込ま れ る 文書 と ページが、以下の ク ラ イ テ リ アに従っ て カ レ ン ト 文書に互換であ る必要があ り ます (そ う でない場合にはそれは拒絶 さ れます) : > PDF_open_pdi_document( ):PDF/UA 文書のみを取 り 込む こ と がで き 、かつ usetags オプ シ ョ ン を true にす る 必要があ り ます。XMP 文書 メ タ デー タ 内の標準識別に従っ て PDF/ UA に準拠 し ていない文書は PDF_open_pdi_document( ) で拒絶 さ れます。 > PDF_open_pdi_page( ) : 取 り 込まれ る 文書の ロ ールマ ッ プが、PDF_begin_document( ) の rolemap オプシ ョ ン に よ っ て与え ら れたマ ッ ピ ン グ と 互換であ る 必要があ り ます。 こ れはすなわち、 カ ス タ ム エ レ メ ン ト 種別が、 rolemap オプシ ョ ン と 、 取 り 込 ま れ る 文 書の ロ ールマ ッ プ (ま たはそれ以前に取 り 込ま れた文書の ロ ールマ ッ プ) と で、 別々 の標準種別へマ ッ プ さ れていてはいけない と い う こ と です。 > PDF_open_pdi_page( ) : 取 り 込まれ る ページの見出 し 構造が、 生成 さ れ る文書の構造種 別 と 互換であ る 必要があ り ます。 すなわち、 structuretype=weak の場合には H1 ・ H2 な ど のみ(H は不可)がそのページ上で使われてい る必要があ り ます:structuretype=strong の場合には H のみ (H1 ・ H2 は不可) が、 その取 り 込まれ るページ上で使われてい る必 要があ り ます : 番号付 き と 番号な し の見出 し を両方持っ たページは拒絶 さ れます。 PDFlib 内で PDF/UA 準拠が構成 さ れてお り 、 かつ取 り 込まれた文書が上記の必要条件を 遵守 し てい る な ら ば、 生成 さ れ る 文書 も PDFUA に準拠 し てい る こ と が保証 さ れます。 注 PDFlib は、 PDF 入力文書の PDF/UA 準拠に関する検証は行わず、 任意の入力 PDF 文書を PDF/UA へ変換する こ と も で き ません。 11.6 PDF/UA に よ るユニバーサルア ク セシ ビ リ テ ィ 357 358 第 11 章 : PDF のバージ ョ ン と 規格 12 PPS と PDFlib Block Plugin PDFlib Personalization Server (PPS) は、 可変デー タ 処理のための、 テ ンプ レー ト を用いた PDF ワ ー ク フ ロ ーに対応 し てい ます。 ブ ロ ッ ク と い う 概念を用いて、 取 り 込んだページ に、 外部情報源か ら 引 き 出 し た任意量の 1 行ない し 複数行のテ キ ス ト ・ 画像 ・ PDF ペー ジ ・ ベ ク ト ルグ ラ フ ィ ッ ク を入れ込む こ と がで き ます。 こ れを利用すれば、 PDF 文書のカ ス タ マ イ ズ を必要 と す る アプ リ ケーシ ョ ン を容易に実装で き ます。 た と えば : > メ ールの連結 > ダ イ レ ク ト メ ールの宛名印刷 > 納品書 ・ 明細等の発行 > 名刺の項目内容を各人ご と に変更 PDFlib Block Plugin を使えば、 ブ ロ ッ ク を対話的に作成 ・ 編集す る こ と がで き 、 フ ォーム フ ィ ール ド 変換プ ラ グ イ ン を使えば、 既存の PDF フ ォーム フ ィ ール ド を PDFlib ブ ロ ッ ク に変換す る こ と がで き ます。ブ ロ ッ ク へは、PPS を使っ て流 し 込みを行 う こ と がで き ます。 Block Plugin には、 内蔵バージ ョ ンの PPS が含まれてい ますので、 PPS に よ る ブ ロ ッ ク へ の流 し 込み結果を Acrobat 上でプ レ ビ ュ ーす る こ と がで き ます。 注 ブ ロ ッ ク処理を利用するには PDFlib Personalization Server (PPS) が必要です。 PPS はすべ ての PDFlib 商用パ ッ ケージに含まれていますが、PPS に対する ラ イ セ ン スキーを ご購入い ただ く 必要があ り ます。 PDFlib や PDFlib+PDI のラ イ セ ン スキーだけではご利用いただけ ません。 PDF テ ン プ レー ト に対話的にブ ロ ッ ク を作成するには Adobe Acrobat 用 PDFlib Block Plugin が必要です。 ク ッ ク ブ ッ ク 可変デー タ と ブ ロ ッ ク に関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ クの blocks カ テ ゴ リ にあ り ます。 12.1 PDFlib Block Plugin を イ ン ス ト ール Block Plugin と 、 その姉妹製品であ る PDF フ ォーム フ ィ ール ド 変換プ ラ グ イ ンは、 以下の バージ ョ ンの Acrobat で動作 し ます : > Windows 版 Acrobat 8/9/X/XI Standard ・ Professional ・ Pro Extended > OS X 版 Acrobat 8/9/X/XI Professional こ のプ ラ グ イ ンは Acrobat Elements では動作せず、 Adobe Reader の ど のバージ ョ ンで も 動 作 し ません。 Windows 版 Acrobat 8/9/X/XI に PDFlib Block Plugin を イ ン ス ト ール PDFlib Block Plugin と PDF フ ォーム フ ィ ール ド 変換プ ラ グ イ ン を Acrobat に イ ン ス ト ールする には、プ ラ グ イ ンの フ ァ イ ルを Acrobat のプ ラ グ イ ン フ ォ ルダのサブデ ィ レ ク ト リ に入れ る 必要が あ り ます。 こ れは、 プ ラ グ イ ンの イ ン ス ト ー ラ に よ っ て自動的に実行 さ れますが、 手作業 で も で き ます。 プ ラ グ イ ンの フ ァ イ ル名は Block.api と AcroFormConversion.api です。 プ ラ グ イ ン フ ォ ルダの典型的な場所は以下の よ う にな り ます : C:\Program Files\Adobe\Acrobat 11.0\Acrobat\plug_ins\PDFlib Block Plugin OS X 版 Acrobat 8/9/X/XI に PDFlib Block Plugin を イ ン ス ト ール プ ラ グ イ ン フ ォ ル ダ を Finder 内で直接見 る こ と はで き ません。プ ラ グ イ ンの フ ァ イ ルをプ ラ グ イ ン フ ォ ルダに 12.1 PDFlib Block Plugin を イ ン ス ト ール 359 ド ラ ッ グす る のではな く 、 以下の手順を踏みます (Acrobat が動作 し ていない こ と を確認 し て く だ さ い) : > デ ィ ス ク イ メ ージ を ダブル ク リ ッ ク し て、 プ ラ グ イ ン フ ァ イ ルを フ ォ ルダへ抽出 し ま す。 > Adobe Acrobat アプ リ ケーシ ョ ン ア イ コ ン を Finder 内で見つけ ます。通常は以下の よ う な名前の フ ォ ルダ内にあ り ます : /Applications/Adobe Acrobat 11.0 > こ の Acrobat アプ リ ケーシ ョ ン ア イ コ ン を シ ン グル ク リ ッ ク し て、 コ ン テ キ ス ト メ ニ ュ ーを開 き 、 「パ ッ ケージの内容を表示」 を選択 し ます。 > 現れ る Finder ウ ィ ン ド ウ で、Contents/Plug-ins フ ォ ルダへ移動 し 、1 番目の手順で作成 さ れた PDFlib Block Plugin フ ォ ルダ を こ の フ ォ ルダ内へ コ ピー し ます。 多言語 イ ン タ フ ェ ース PDFlib Block Plugin は、 ユーザー イ ン タ フ ェース内で複数言語に 対応 し てい ます。 Acrobat のアプ リ ケーシ ョ ン言語に従っ て、 Block Plugin はその イ ン タ フ ェ ース言語を自動的に選択 し ます。 目下、 英語 ・ ド イ ツ語 ・ 日本語の イ ン タ フ ェース が 利用可能です。 Acrobat が こ れ以外の言語モー ド で動作 し てい る 場合には、 Block Plugin は 英語 イ ン タ フ ェ ース を使用 し ます。 ト ラ ブルシ ュ ーテ ィ ン グ PDFlib Block Plugin が動作 し ない よ う に見 ら れ る 場合は、 以下 をチ ェ ッ ク し て く だ さ い : > 「編集」 → 「環境設定」 (→ 「一般 ...」) → 「一般」 で 「承認 さ れたプ ラ グ イ ンのみを使 用」 チ ェ ッ ク ボ ッ ク ス がオ フ にな っ てい る こ と を確認 し て く だ さ い。 Acrobat が承認済 みモー ド で動作 し てい る と 、 プ ラ グ イ ンは読み込まれません。 > Adobe Designerに よ っ て作成 さ れた PDF フ ォームは、Block Pluginの適切な動作を妨げ る こ と があ り ます。 他の Acrobat のプ ラ グ イ ンの動作について も 同様です。 なぜな ら こ う し た フ ォ ームは、 Acrobat の内部セ キ ュ リ テ ィ モデル と 衝突す る ためです。 ですの で、 Designer の静的な PDF フ ォームは利用せずに、 動的な PDF フ ォームだけ を Block Plugin への入力 と し て用い る こ と を推奨 し ます。 360 第 12 章 : PPS と PDFlib Block Plugin 12.2 ブ ロ ッ ク 概念の概要 12.2.1 文書デザ イ ン と プ ロ グ ラ ム コ ー ド と の分離 PDFlib のデー タ ブ ロ ッ ク を利用する と 、 取 り 込んだページ上に、 可変のテ キ ス ト や画像や PDF ページやベ ク ト ルグ ラ フ ィ ッ ク を簡単に配置で き ます。単純な PDF ページ と 違っ て、 デー タ ブ ロ ッ ク を含むページは、後でサーバサ イ ド で行われ るべ き処理についての情報を 内部に持っ てい ます。 PDFlib ブ ロ ッ ク の概念は、 以下の 2 種類の作業を完全に分離す る も のです : > デザ イ ナーはページ レ イ ア ウ ト を作成 し 、 可変ページ構成要素の位置を指定す る と と も に、 その文字サ イ ズ ・ 色 ・ 画像拡縮 と い っ た関連特性群 も 指定 し ま す。 レ イ ア ウ ト は PDF 文書 と し て作成 し 、 その後デザ イ ナーは、 Acrobat 用 PDFlib Block Plugin を使っ て、 可変デー タ ブ ロ ッ ク と そのそれぞれのプ ロ パテ ィ を指定 し ます。 > プ ロ グ ラ マーは、取 り 込まれ る PDF ページ上の PDFlib ブ ロ ッ ク に含まれ る 情報を、デー タ ベー ス の フ ィ ール ド と い っ た動的な情報 と 紐づけ る コ ー ド を 書 き ま す。 プ ロ グ ラ マーは、 ブ ロ ッ ク の詳細については何 も 知 ら な く て よ く (名前を含むのか ZIP コ ー ド を含むのか、 ページ上の正確な位置、 書式な ど)、 そのため、 ど の よ う な レ イ ア ウ ト 変 更か ら も 独立でい ら れ ます。 ブ ロ ッ ク に関連す る 詳細についてはすべて、 フ ァ イ ル内 のブ ロ ッ ク プ ロ パテ ィ に基づいて PPS の側で処理 し ます。 言いかえれば、 プ ロ グ ラ マーに よ っ て書かれ る コ ー ド は 「デー タ 非依存」 です。 すなわち それは汎用であ り 、 ブ ロ ッ ク のいかな る 特性に も 依存 し ません。 た と えばデザ イ ナーは、 手紙の宛先を入れ る ブ ロ ッ ク をページ上の別の場所へ移動 さ せ る か も し れません し 、あ る いは、 文字サ イ ズ を変え る か も し れません。 一般的なブ ロ ッ ク 処理 コー ド に変更を加え る 必要はな く 、 デザ イ ナーがブ ロ ッ ク プ ロ パテ ィ を Acrobat プ ラ グ イ ン で変更 し て ラ ス ト ネームのかわ り に フ ァ ース ト ネーム を用い る よ う に し さ えすれば、正 し い出力が生成 さ れ ます。 中間ス テ ッ プ と し て、ブ ロ ッ ク への流 し 込みは Acrobat でプ レ ビ ュ ーで き ますので、開 発 と 試験サ イ ク ルを迅速化す る こ と が可能です。 ブ ロ ッ ク プ レ ビ ュ ーには、 ブ ロ ッ ク の定 義内で指定 さ れたデフ ォ ル ト デー タ (文字列や画像フ ァ イ ル名等) が用い ら れます。 12.2.2 ブ ロ ッ ク プ ロパテ ィ ブ ロ ッ ク の動作はブ ロ ッ ク プ ロ パテ ィ で制御す る こ と がで き ま す。 プ ロ パテ ィ は Block Plugin でブ ロ ッ ク に割 り 当て ます。 定義済みブ ロ ッ ク プ ロパテ ィ ブ ロ ッ ク はページ上の長方形 と し て定義 さ れ、 名前 ・ 種 類 ・ その他自由なプ ロ パテ ィ 群を割 り 当て ら れ ます。 こ う し たプ ロ パテ ィ は後で PPS に よ っ て 処理 さ れ ま す。 名前 は、 ブ ロ ッ ク を 識別す る 任意 の 文字列 で あ り 、 た と え ば firstname ・ lastname ・ zipcode の よ う に名づけ る こ と がで き ます。 PPS では、 さ ま ざ ま な 種類のブ ロ ッ ク を使 う こ と がで き ます : > テキス ト 行ブ ロ ッ ク は、 1 行のテ キ ス ト デー タ を持ち ます。 こ のデー タ は、 PPS のテ キ ス ト 行 メ ソ ッ ド で処理 さ れます。 > テキス ト フ ローブ ロ ッ ク は、1 行ない し 複数行のテ キ ス ト デー タ を持ち ます。複数行の テ キ ス ト は PPS のテ キ ス ト フ ロ ーフ ォーマ ッ タ に よ っ て組版 さ れます。 複数のテ キ ス ト フ ロ ーブ ロ ッ ク を連結 し て、 前のブ ロ ッ ク か ら あふれた テ キ ス ト を次のブ ロ ッ ク に 入れ る こ と も 可能です (382 ページ 「 テ キ ス ト フ ロ ーブ ロ ッ ク を連結」 参照)。 > 画像ブ ロ ッ ク は、ラ ス タ 画像を持ち ます。こ れは、DTP アプ リ ケーシ ョ ンで TIFF や JPEG の フ ァ イ ルを貼 り 付け る の と 似てい ます。 12.2 ブ ロ ッ ク 概念の概要 361 > PDF ブ ロ ッ ク は、他の PDF 文書のページか ら 取 り 込んだ任意の PDF 内容を持ち ます。こ れは、 DTP アプ リ ケーシ ョ ン で PDF ページ を貼 り 付け る の と 似てい ます。 > グ ラ フ ィ ッ ク ブ ロ ッ ク は、 ベ ク ト ルグ ラ フ ィ ッ ク を持ち ます。 こ れは、 レ イ ア ウ ト ア プ リ ケーシ ョ ン内で SVG フ ァ イ ルを貼 り 付け る のに似てい ます。 ブ ロ ッ ク は、 その種類に よ っ て異な る さ ま ざ ま な定義済みプ ロ パテ ィ を持っ てい ます。 プ ロ パテ ィ は、 Block Plugin で作成 ・ 変更する こ と がで き ます (368 ページ 「12.3.2 ブ ロ ッ ク プ ロ パテ ィ を編集」 参照)。 定義済みブ ロ ッ ク プ ロ パテ ィ の全一覧が 386 ページ 「12.6 ブ ロ ッ ク のプ ロ パテ ィ 」 にあ り ます。 た と えば、 テ キ ス ト ブ ロ ッ ク ではテ キ ス ト の フ ォ ン ト やサ イ ズ を指定す る こ と がで き 、 画像ブ ロ ッ ク や PDF ブ ロ ッ ク では拡縮倍率や回転を指 定する こ と がで き ます。 PPS はブ ロ ッ ク の種類ご と に、 それを処理す る ための専用の関数 を提供 し てい ます (PDF_fill_textblock( ) 等)。 こ う し た関数は、 取 り 込まれた PDF ページ の中でブ ロ ッ ク を名前で検索 し 、 そのプ ロ パテ ィ を分析 し て、 ク ラ イ ア ン ト の与え たデー タ (一行テ キ ス ト ・ 複数行テ キ ス ト ・ ラ ス タ 画像 ・ PDF ページ ・ ベ ク ト ルグ ラ フ ィ ッ ク の いずれか) を、 新 し いページ上に、 指定 さ れたブ ロ ッ ク プ ロ パテ ィ に従っ て配置 し ます。 プ ロ グ ラ マーは、 その照応す る 、 ブ ロ ッ ク 流 し 込み関数内のオプシ ョ ン を指定す る こ と に よ っ て、 ブ ロ ッ ク プ ロ パテ ィ を オーバ ラ イ ド す る こ と も で き ます。 デ フ ォ ル ト 内容に関す る プ ロパテ ィ 特殊 な ブ ロ ッ ク プ ロ パ テ ィ を 定義 し て、 そ の ブ ロ ッ ク のデフ ォ ル ト 内容を持たせ る こ と も で き ます。 すなわち、 ブ ロ ッ ク 流 し 込み関数に 可変デー タ が与え ら れていない と き や、あ る いはブ ロ ッ ク 内容が次回の印刷実行時には変 わ り う る けれど も 現時点では不変であ る よ う な と き に、 そのブ ロ ッ ク に配置 さ れ る、 テ キ ス ト ・ 画像 ・ PDF ・ グ ラ フ ィ ッ ク いずれかの内容です。 デフ ォ ル ト プ ロ パテ ィ は、 Block Plugin のプ レ ビ ュ ー機能で も 用い ら れます (376 ペー ジ 「12.4 Acrobat でブ ロ ッ ク を プ レ ビ ュ ー」 参照)。 カ ス タ ムブ ロ ッ ク プ ロパテ ィ 定義済みブ ロ ッ ク プ ロ パテ ィ を利用す る こ と に よ り 、 可 変デー タ 処理アプ リ ケーシ ョ ン を手軽に実装する こ と がで き ますが、 こ う し たプ ロ パテ ィ は、 PPS の内部的に既知で自動処理可能な も のに限 ら れて し ま い ます。 よ り 高い柔軟性を 与え る ために、 デザ イ ナーは、 カ ス タ ムプ ロ パテ ィ を ブ ロ ッ ク に割 り 当て る こ と も で き ま す。 カ ス タ ムプ ロ パテ ィ を利用すれば、 ブ ロ ッ ク の概念を拡張 し て、 よ り 高度な可変デー タ 処理アプ リ ケーシ ョ ンの要請に応え る こ と が可能です。 カ ス タ ムプ ロ パテ ィ に関 し てはいかな る 規則 も 存在 し ません。 なぜな ら PPS はカ ス タ ムプ ロ パテ ィ に対 し てはいかな る 処理 も 行わないか ら です。 PPS はただ、 カ ス タ ムプ ロ パ テ ィ を ク ラ イ ア ン ト が利用で き る よ う にする だけです。 ク ラ イ ア ン ト コ ー ド は、 カ ス タ ム プ ロ パテ ィ を取得 し 、 適切に処理す る こ と がで き ます。 ブ ロ ッ ク のカ ス タ ムプ ロ パテ ィ に 基づいて、アプ リ ケーシ ョ ンが レ イ ア ウ ト 関連やデー タ 抽出関連の決定を行え る よ う にす る こ と も 可能です。 た と えば、 科学アプ リ ケーシ ョ ンのためのカ ス タ ムプ ロ パテ ィ であれ ば、数値出力の桁数を指定す る こ と も で き る で し ょ う し 、あ る いは、デー タ ベース の フ ィ ー ル ド 名を カ ス タ ム ブ ロ ッ ク プ ロ パテ ィ と し て定義 し ておいて、 そのブ ロ ッ ク に照応す る デー タ を取得す る ために用い る こ と も で き る で し ょ う 。 12.2.3 PDF の フ ォ ーム フ ィ ール ド を利用 し ないのはなぜか 経験あ る Acrobat ユーザーな ら ば、なぜ我々は新たにブ ロ ッ ク と い う 概念を導入 し たのか、 ど う し て PDF にすでにあ る フ ォーム フ ィ ール ド の し く みを活用 し ないのか、 疑問を抱か れ る か も し れません。 そ も そ も の違いは、 PDF の フ ォーム フ ィ ール ド は対話的に記入 さ れ る こ と を主眼 と し て作 ら れてい る のに対 し て、PDFlib のブ ロ ッ ク は自動的に流 し 込まれ る こ と を目的 と し てい る 点です。対話的記入 と 自動流 し 込みの両方を必要 と す る アプ リ ケー 362 第 12 章 : PPS と PDFlib Block Plugin シ ョ ン の場合であれば、 フ ォ ーム フ ィ ール ド 変換プ ラ グ イ ン を用いて、 PDF フ ォ ーム と PDFlib ブ ロ ッ ク を併用する こ と も 可能です (371 ページ 「12.3.4 PDF フ ォーム フ ィ ール ド を PDFlib ブ ロ ッ ク に変換」 参照)。 両概念の間には類似点 も 多 く あ り ますが、 PDFlib ブ ロ ッ ク には PDF フ ォーム フ ィ ール ド と 比較 し て表 12.1 に示す よ う ない く つかの利点があ り ます。 表 12.1 PDF フ ォ ーム フ ィ ール ド と PDFlib ブ ロ ッ クの比較 機能 PDF フ ォ ーム フ ィ ール ド PDFlib ブ ロ ッ ク 設計の趣旨 対話的利用 自動流 し 込み 文字組版機能 (フ ォ ン ト 指定 ・ 文 - 字サイ ズ指定よ り も高度な) カ ーニ ング ・ 単語間隔 ・ 文字間隔 ・ 下線 / 上線 / 取り消し線 OpenType レ イ アウ ト 機能 - 何ダース も の OpenType レ イ アウ ト 機能 (合字 ・ スワ ッ シ ュ文字 ・ オール ド ス タ イル数字等) 複雑用字系への対応 制約あ り シ ェ ーピ ン グ ・ 双方向テキス ト (ア ラ ビ ア文 字 ・ デーヴ ァ ナーガ リ ー等) フ ォ ン ト 制御 フ ォ ン ト 埋め込み フ ォ ン ト 埋め込み ・ サブ セ ッ ト 化 ・ エ ン コ ー デ ィ ング テキス ト 組版制御 左 ・ 中央 ・ 右揃え 左 ・ 中央 ・ 右 ・ 両端揃え。 各種組版アルゴ リ ズ ム ・ 制御。 イ ン ラ イ ン オプ シ ョ ン を用いて テキ ス ト の見映え を制御可能 テキス ト の途中で フ ォ ン ト その他 - のテキス ト 属性を変え ら れる ○ 追加結果が PDF のページ記述に 組み込まれる - ○ ユーザーが追加フ ィ ール ド の内容 ○ を編集可能 × プ ロパテ ィ の拡張セ ッ ト - ○ (カ ス タ ムブ ロ ッ ク プ ロパテ ィ ) 画像 フ ァ イルを流 し 込める - BMP ・ CCITT ・ GIF ・ PNG ・ JPEG ・ JBIG2 ・ JPEG 2000 ・ TIFF ベ ク ト ルグ ラ フ ィ ッ ク を流 し 込め - る SVG カ ラ ー対応 RGB グ レースケール ・ RGB ・ CMYK ・ Lab ・ スポ ッ ト カ ラ ー (HKS ・ Pantone スポ ッ ト カ ラ ーが Block Plugin に内蔵) PDF 各種規格 - PDF/A ・ PDF/X ・ PDF/VT ・ PDF/UA グ ラ フ ィ ッ クやテキス ト のプ ロパ - テ ィ を流 し 込み時にオーバラ イ ド 可能 ○ 透過内容 - ○ テキス ト ブ ロ ッ ク 群を連結可能 - ○ 12.2 ブ ロ ッ ク 概念の概要 363 12.3 PDFlib Block Plugin で ブ ロ ッ ク を編集 12.3.1 ブ ロ ッ ク を作成 ブ ロ ッ ク ツ ールを ア ク テ ィ ブ にす る PDFlib ブ ロ ッ ク を作成す る ための Block Plugin は、 Acrobat におけ る フ ォーム ツール と 同様です。 ページ上のすべてのブ ロ ッ ク は、 ブ ロ ッ ク ツールがア ク テ ィ ブな時に表示 さ れます。 Acrobat の他の ツールが選択 さ れ る と ブ ロ ッ ク は見え な く な り ますが、 な く な っ たわけではあ り ません。 ブ ロ ッ ク ツールを ア ク テ ィ ブに す る には、 以下のいずれかの操作を行い ます : > 「ツール」 → 「高度な編集」 ペーン (Acrobat X/XI) ま たは 「高度な編集」 ツールバー (Acrobat 9) でブ ロ ッ ク ア イ コ ン を ク リ ッ ク 。 Acrobat で こ の ツールバーが表示 さ れて い な い と き は、 「表示」 → 「ツ ール」 → 「高度な編集」 (Acrobat X/XI) ま たは 「表示」 → 「ツールバー」 → 「高度な編集」 (Acrobat 9) を選択すれば表示 さ せ る こ と がで き ます。 > メ ニ ュ ー項目 「PDFlib ブ ロ ッ ク」 → 「PDFlib ブ ロ ッ ク ツール」 を選択。 ブ ロ ッ ク を作成 ・ 変更 ブ ロ ッ ク ツールを ア ク テ ィ ブに し た ら 、 十字ポ イ ン タ を ド ラ ッ グすれば、 ページ上の希望の位置に希望のサ イ ズのブ ロ ッ ク を作成す る こ と がで き ます。 ブ ロ ッ ク は必ず長方形で、 その辺はページの辺 と 平行にな り ます (ブ ロ ッ ク の内容をペー ジの辺 と 平行でな く す る には rotate プ ロ パテ ィ を用い ます)。 ブ ロ ッ ク の長方形を ド ラ ッ グ し 終わ る と 、 「PDFlib ブ ロ ッ ク プ ロパテ ィ 」 ダ イ ア ロ グが現れ る ので、 ブ ロ ッ ク の さ ま ざ ま なプ ロ パテ ィ を編集する こ と がで き ます (368 ページ 「12.3.2 ブ ロ ッ ク プ ロ パテ ィ を 編集」 参照) 。 ブ ロ ッ ク ツールはブ ロ ッ ク の名前を自動的に作成 し ますが、 こ の名前はプ ロ パテ ィ ダ イ ア ロ グで変更す る こ と も で き ます。ブ ロ ッ ク 名はページ内では一意であ る 必 要があ り ますが、 別のページでは同 じ 名前 も 使え ます。 ダ イ ア ロ グ の上端では、 ブ ロ ッ ク の種類を 「Textline」 (テ キ ス ト 行) ・ 「Textflow」 (テ キ ス ト フ ロ ー) ・ 「Image」 (画像) ・ 「PDF」 ・ 「Graphics」 (グ ラ フ ィ ッ ク ) のいずれかに変更 で き ます。 ブ ロ ッ ク の種類ご と に異な る 色が用い ら れてい ます (図 12.1 参照)。 タ ブは、 ど のブ ロ ッ ク の種類を選択 し てい る かに応 じ て、一度に 1 つだけがア ク テ ィ ブにな っ てい ます。 「PDFlib ブ ロ ッ ク プ ロパテ ィ 」 ダ イ ア ロ グは、 ブ ロ ッ ク の種類に応 じ て、 プ ロ パテ ィ を階層的にい く つかのグループやサブグループに ま と めて表示 し ます。 注 PDF にブ ロ ッ ク を追加 し た り 、既存のブ ロ ッ ク に変更を加えた り し た後は、Acrobat の 「名 前を付けて保存 ...」 コ マ ン ド を使 う ほ う が フ ァ イルサイ ズが小 さ く な り ます (「上書き保 存」 よ り も)。 注 Acrobat 用 Enfocus PitStop プ ラ グ イ ン を使 っ て、 PDFlib ブ ロ ッ ク を含んだ文書を編集する 際、「This document contains PieceInfo from PDFlib. Press OK to continue editing or Cancel to abort.」 と い う メ ッ セージが表示 さ れる こ と があ り ます。 こ の メ ッ セージは気に し な く て かまいません。 こ のよ う な場合、 OK を ク リ ッ ク し て も安全です。 ブ ロ ッ ク を選択 コ ピー ・ 移動 ・ 削除 ・ プ ロ パテ ィ 編集 と いっ たい く つかのブ ロ ッ ク 操作 は、 選択 し た 1 個ない し 複数のブ ロ ッ ク に対 し て動作 し ます。 ブ ロ ッ ク ツールを用いてブ ロ ッ ク を選択す る には、 以下の よ う に操作 し ます : > 1 個のブ ロ ッ ク を選択す る には、 単にそれを シ ン グル ク リ ッ ク し ます。 > 複数のブ ロ ッ ク を選択す る には、Shift キーを押 し なが ら 2 個目以降のブ ロ ッ ク を選択 し ます。 364 第 12 章 : PPS と PDFlib Block Plugin > ページ上のすべてのブ ロ ッ ク を選択す る には、Ctrl+A(Windows の場合)か Cmd+A(OS X の場合) を押すか、 ま たは 「編集」 → 「すべて選択」 を用い ます。 コ ン テキス ト メ ニ ュ ー 1 個ない し 複数のブ ロ ッ ク を選択 し てい る 時には、 コ ン テ キ ス ト メ ニ ュ ーを開けば、 ブ ロ ッ ク 関連のいろいろ な機能 (「PDFlib ブ ロ ッ ク」 メ ニ ューか ら 利 用で き る 諸機能 と 同 じ ) をすばや く 実行す る こ と がで き ます。 コ ン テ キ ス ト メ ニ ューを開 く には、 選択 し た 1 個ない し 複数のブ ロ ッ ク を、 Windows の場合はマ ウ ス の右ボ タ ンで ク リ ッ ク し 、 OS X の場合は Ctrl+ ク リ ッ ク し ます。 た と えば、 ブ ロ ッ ク を削除す る には、 そ れをブ ロ ッ ク ツールで選択 し たのち、 Delete キーを押 し て も よ いです し 、 あ る いは コ ン テ キ ス ト メ ニ ュ ーで 「編集」 → 「削除」 を用い る こ と も で き ます。 ページ上でブ ロ ッ ク のない領域を右 ク リ ッ ク (OS X では Ctrl+ ク リ ッ ク ) す る と 、 そ の コ ン テ キ ス ト メ ニ ュ ーの中には、 ブ ロ ッ ク プ レ ビ ュ ーを作成する ための項目 と 、 ブ ロ ッ ク 機能を構成す る ための項目があ り ます。 ブ ロ ッ ク のサ イ ズ と 位置 ブ ロ ッ ク ツールを使 う と 、 選択 し た 1 個ない し 複数のブ ロ ッ ク を別の位置へ動かす こ と も 可能です。 Shift キーを押 し なが ら ブ ロ ッ ク を ド ラ ッ グす る と 、 横方向か縦方向にだけ動 き ます。 こ れはブ ロ ッ ク を正確に整列 さ せたい と き に便利で し ょ う 。 ポ イ ン タ がブ ロ ッ ク の角の近 く にあ る 時は、 ポ イ ン タ は矢印に変わ り 、 ブ ロ ッ ク のサ イ ズ を変え る こ と がで き ます。 複数のブ ロ ッ ク の位置やサ イ ズ を調整 し たい と き は、 複数のブ ロ ッ ク を選択 し て、「PDFlib ブ ロ ッ ク」 メ ニ ュ ーか コ ン テ キ ス ト メ ニ ュ ーか ら 「整 列」 ・ 「中央揃え」 ・ 「均等配置」 ・ 「サイ ズ」 のいずれかの コ マ ン ド を選択 し ます。 1 個ない し 複数のブ ロ ッ ク の位置を、 矢印キーを使っ て小刻みに変え る こ と も で き ます。 あ る いは、 ブ ロ ッ ク の座標を数値でプ ロ パテ ィ ダ イ ア ロ グに入力す る こ と も で き ます。 座標系の原点はページの左上隅です。 座標は、 その時点で Acrobat で選択 さ れてい る 単位 で表示 さ れます : > Acrobat 9/X/XI で表示単位を変え る には、 以下の よ う に操作 し ます : 「編集」 → 「環境 設定」 (→ 「一般 ...」 ) → 「単位 と ガ イ ド 」 → 「ページ と 定規の単位」 を選択 し 、 イ ン チ ・ セ ンチ メ ー ト ル ・ パ イ カ ・ ポ イ ン ト ・ ミ リ のいずれか を選ぶ。 > カー ソ ルの座標を表示す る には、「表示」 → 「表示切 り 替え」 → 「カ ー ソル座標」 (Acrobat X/XI) ま たは 「表示」 → 「カ ー ソ ル座標」 (Acrobat 9) を選択 し ます。 ただ し こ こ で選択 さ れてい る 単位は Rect プ ロ パテ ィ に対 し てのみ効力を持ち、 それ以外 の数値プ ロ パテ ィ (fontsize 等) に対 し ては一切効力を持ち ません。 グ リ ッ ド を用い て ブ ロ ッ ク を位置付け Acrobat のグ リ ッ ド 機能を活用 し て、 ブ ロ ッ ク の 位置付けやサ イ ズ変更を正確に行 う こ と も で き ます : > グ リ ッ ド を 表示 : 「表示」 → 「表示切 り 替 え」 → 「定規 と グ リ ッ ド 」 → 「グ リ ッ ド 」 (Acrobat X/XI) ま たは 「表示」 → 「グ リ ッ ド 」 (Acrobat 9)。 > グ リ ッ ド ス ナ ッ プ を有効に : 「表示」 → 「表示切 り 替え」 → 「定規 と グ リ ッ ド 」 → 「グ リ ッ ド にスナ ッ プ」(Acrobat X/XI) ま たは「表示」→「グ リ ッ ド にスナ ッ プ」(Acrobat 9)。 > グ リ ッ ド を変更 (図 12.3 参照) : 「編集」 → 「環境設定」 (→ 「一般 ...」) → 「単位 と ガ イ ド 」 を選択 し ます。 そ こ でグ リ ッ ド 線の間隔や位置や色を変え る こ と がで き ます。 「グ リ ッ ド にスナ ッ プ」 を有効に し てい る と 、ブ ロ ッ ク のサ イ ズ と 位置は、構成 し た グ リ ッ ド に揃い ます。 「グ リ ッ ド にスナ ッ プ」 は、 新規作成 し たブ ロ ッ ク に も 効 き ます し 、 既存 のブ ロ ッ ク をブ ロ ッ ク ツールで移動 し た り サ イ ズ を変えた り す る と き に も 効 き ます。 12.3 PDFlib Block Plugin で ブ ロ ッ ク を編集 365 図 12.1 各種ブ ロ ッ ク の視覚化 画像やグ ラ フ ィ ッ ク を選択す る こ と に よ っ て ブ ロ ッ ク を作成 手動でブ ロ ッ ク の長方形 を ド ラ ッ グす る のではな く 、既存のページ内容を使っ てブ ロ ッ ク のサ イ ズ を定義す る こ と も で き ま す。 ま ず、 メ ニ ュ ー項目 「PDFlib ブ ロ ッ ク」 → 「オ ブ ジ ェ ク ト を ク リ ッ ク で ブ ロ ッ ク を定義」 を有効に し ます。 こ れで、 ブ ロ ッ ク ツールを使っ て、 ページ上の画像を ク リ ッ ク し て、 その画像 と 同 じ 位置に同 じ サ イ ズのブ ロ ッ ク を作成す る こ と がで き ます。 そ れ以外のグ ラ フ ィ ッ ク オブジ ェ ク ト を ク リ ッ ク する こ と も で き 、 その場合、 ブ ロ ッ ク ツー ルはそのグ ラ フ ィ ッ ク (た と えば ロ ゴ) 全体を選択 し よ う と し ます。 こ の 「オブ ジ ェ ク ト ク リ ッ ク」 機能は、 ブ ロ ッ ク 定義作業を補助す る ために設け て あ る も のです。 で き た ブ ロ ッ ク の位置やサ イ ズ を変更 し た ければ、 後か ら 何 ら 制約な く 行 う こ と がで き ま す。 ブ ロ ッ ク は、 画像やグ ラ フ ィ ッ ク に固定 さ れて し ま う のではな く 、 ただそれを位置やサ イ ズ の決定の補助 と し て用い る だけです。 366 第 12 章 : PPS と PDFlib Block Plugin 図 12.2 ブ ロ ッ ク プ ロパテ ィ ダ イ ア ログ こ の 「オブジ ェ ク ト ク リ ッ ク 」 機能は、 ど のベ ク ト ルグ ラ フ ィ ッ ク や画像がページ上 で論理的要素を形づ く っ てい る か を認識 し よ う と し ます。いずれかのページ内容が ク リ ッ ク さ れ る と 、 その対象が白かっ た り 非常に大 き か っ た り し ない限 り 、 その外接枠 (対象を 囲む長方形) が選択 さ れます。 その次の段階 と し て、 こ の検知 さ れた長方形に一部入 り 込 んでい る 他の物が選択領域に追加 さ れ、 こ れが繰 り 返 さ れます。 そ う し て最終的にで き た 領域に基づいてブ ロ ッ ク の長方形が生成 さ れ る のです。 結局の と こ ろ 「オブジ ェ ク ト ク リ ッ ク 」機能は、個々の線ではな く グ ラ フ ィ ッ ク 全体を選択 し よ う と す る こ と にな り ます。 フ ォ ン ト プ ロパテ ィ を自動検出 Block Plugin は、 テ キ ス ト 行 ま た は テ キ ス ト フ ロ ーブ ロ ッ ク の位置付け ら れた場所の背景にあ る フ ォ ン ト を分析す る こ と がで き、ブ ロ ッ ク の照 応す る プ ロ パテ ィ を自動的に書 き 込む こ と がで き ます : fontname・fontsize・fillcolor・charspacing・horizscaling・wordspacing・ textrendering・textrise 12.3 PDFlib Block Plugin で ブ ロ ッ ク を編集 367 図 12.3 Acrobat の グ リ ッ ド 設定 フ ォ ン ト プ ロ パテ ィ の自動検出は望ま し く ない結果を も た ら す こ と も あ る ので、背景を無 視 さ せたい場合は、 「PDFlib ブ ロ ッ ク 」 → 「背景フ ォ ン ト ・ 色の検出」 を用いて機能の有 効 ・ 無効を切 り 替え る こ と がで き ます。 デフ ォ ル ト では こ の機能は無効にな っ てい ます。 ブ ロ ッ ク を ロ ッ ク ブ ロ ッ ク は、 う っ か り 移動 し た り サ イ ズ を変え た り 削除 し た り さ れ ない よ う 、 ロ ッ ク し て保護す る こ と がで き ます。 ブ ロ ッ ク ツールがア ク テ ィ ブな状態で、 ブ ロ ッ ク を選択 し 、 その コ ン テ キ ス ト メ ニ ュ ーか ら 「ロ ッ ク」 を選び ま す。 ブ ロ ッ ク が ロ ッ ク さ れてい る と 、 移動 さ せ る こ と も サ イ ズ を変え る こ と も 削除す る こ と も で きず、 そ のプ ロ パテ ィ ダ イ ア ロ グ を編集す る こ と も で き ません。 12.3.2 ブ ロ ッ ク プ ロパテ ィ を編集 新規ブ ロ ッ ク を作成 し た時や、 既存ブ ロ ッ ク を ダブル ク リ ッ ク し た時や、 ブ ロ ッ ク の コ ン テ キ ス ト メ ニ ュ ーか ら 「プ ロパテ ィ 」 を選択 し た時には、 プ ロ パテ ィ ダ イ ア ロ グ が現れ て、 その選択 し たブ ロ ッ ク に関する すべての設定を編集する こ と がで き ます (図 12.2 参 照)。 386 ページ 「12.6 ブ ロ ッ ク のプ ロ パテ ィ 」 で詳述す る よ う に、 プ ロ パテ ィ にはブ ロ ッ ク の種類に応 じ て、 い く つかのグループがあ り ます。 「適用」 ボ タ ンは、 ダ イ ア ロ グ内の 1 個ない し 複数のプ ロ パテ ィ を変更 し た時にのみ有 効にな り ます。 プ ロ パテ ィ の変更をブ ロ ッ ク に適用 し た後には、 ブ ロ ッ ク の名前の中にア ス タ リ ス ク が表示 さ れて、ブ ロ ッ ク が変更 さ れたけれど も ま だデ ィ ス ク には保存 さ れてい ない と い う こ と を示 し ます。 「適用」 ボ タ ンは、 ロ ッ ク さ れたブ ロ ッ ク については無効 と な り ます。 注 ブ ロ ッ ク の種類やプ ロパテ ィ の設定によ っ ては、 表示 さ れないプ ロパテ ィ も あ り ます。 た と えば、 タ ブ設定を編集する ための「hortabmethod=ruler におけるルーラタブ」プ ロパテ ィ サブグループは、「テキスト組版」→「ルーラタブ」 グループの hortabmethod プ ロパテ ィ が ruler に設定 さ れている と き にのみ表示 さ れます。 368 第 12 章 : PPS と PDFlib Block Plugin プ ロ パテ ィ の値を変更す る には、入力 し たい数や文字列を そのプ ロ パテ ィ の入力領域に入 力す る か (例 : linewidth) 、 ド ロ ッ プ ダ ウ ン リ ス ト か ら 値 を 選ぶ か (例 : fitmethod ・ orientate)、 ま たはダ イ ア ロ グの右側にあ る 「...」 ボ タ ン を ク リ ッ ク し て フ ォ ン ト や色の値 やフ ァ イ ル名を選択 し ます (例 : backgroundcolor ・ defaultimage)。 fontname プ ロ パテ ィ の場合は、 シ ス テ ム に イ ン ス ト ール さ れてい る フ ォ ン ト の一覧か ら 選ぶ こ と も で き ま す し 、 カ ス タ ムのフ ォ ン ト 名を打ち込む こ と も で き ます。 フ ォ ン ト 名を入力 し た方式にかか わ ら ず、 その フ ォ ン ト は、 PPS に よ っ てブ ロ ッ ク へ内容が流 し 込まれ る シ ス テ ム上におい て利用可能にな っ てい る こ と が必要です。 変更 さ れたプ ロ パテ ィ は、ブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ グ内で太字で表示 さ れます。ブ ロ ッ ク のいずれかのプ ロ パテ ィ が変更 さ れてい る と き には、その表示 さ れてい る ブ ロ ッ ク 名の後に接尾辞 (*) が付記 さ れ ます。 プ ロ パテ ィ の編集が済んだ ら 、 「適用」 ボ タ ン を ク リ ッ ク し てブ ロ ッ ク を更新 し ます。 定義 し たプ ロ パテ ィ は、 PDF フ ァ イ ル内にブ ロ ッ ク 定 義の一部 と し て格納 さ れます。 重な っ た ブ ロ ッ ク 重な り あ う ブ ロ ッ ク 群は選択 し づ ら い こ と が あ り ま す。 その領域を ク リ ッ ク す る と 必ず最前面のブ ロ ッ ク が選ばれて し ま う か ら です。 こ の よ う な場合には、 コ ン テ キ ス ト メ ニ ュ ーの 「ブ ロ ッ ク の選択」 項目を用いれば、 ブ ロ ッ ク の う ちのいずれか 1 個を名前で選択す る こ と がで き ます。 1 個のブ ロ ッ ク を選んだ直後にその領域で行 う 操 作は、 その選択 し た 1 個のブ ロ ッ ク に対 し てのみ効力を持ち、 他のブ ロ ッ ク に対 し ては効 力を持ち ません。 た と えば Enter を押せば、 選択 し たブ ロ ッ ク のプ ロ パテ ィ を編集で き ま す。 こ の方法を利用すれば、 ブ ロ ッ ク の上に他のブ ロ ッ ク が部分的ない し 完全にかぶ さ っ ていて も 、 簡単にそのブ ロ ッ ク のプ ロ パテ ィ を編集す る こ と がで き ます。 ブ ロ ッ ク プ ロパテ ィ の値を繰 り 返 し 使用 ・ リ セ ッ ト キー入力や ク リ ッ ク の量を い く ら か軽減で き る よ う 、 ブ ロ ッ ク ツールは、 直前のブ ロ ッ ク のプ ロ パテ ィ ダ イ ア ロ グで入力 さ れたプ ロ パテ ィ 値を記憶 し てい ます。 こ う し た値は、 新規ブ ロ ッ ク の作成時に再利用 さ れ ます。 も ち ろんその値は、 いつ別の値でオーバ ラ イ ド し て も か ま い ません。 プ ロ パテ ィ のダ イ ア ロ グで 「全て リ セ ッ ト 」 ボ タ ン を押す と 、 多 く のブ ロ ッ ク プ ロ パ テ ィ がそれぞれのデフ ォ ル ト に リ セ ッ ト さ れます。 以下のア イ テ ムは変更 さ れません : > Name ・ Type ・ Rect ・ Description プ ロ パテ ィ > すべてのカ ス タ ムプ ロ パテ ィ 注 定義済みプ ロパテ ィ のデ フ ォル ト 値は、プ レ ビ ュ ー生成時のプ レースホルダデー タ を保持 する defaulttext ・ defaultimage ・ defaultpdf ・ defaultgraphics プ ロパテ ィ と 混同 し ない よ う にする必要があ り ます (376 ページ 「ブ ロ ッ ク のデ フ ォル ト 内容」 参照)。 複数のブ ロ ッ ク を一度に編集 複数のブ ロ ッ ク のプ ロ パテ ィ を一度に編集すれば、 大い に時間が節約で き ます。 複数のブ ロ ッ ク を選択す る には以下の よ う に操作 し ます : > メ ニ ュ ー項目 「PDFlib ブ ロ ッ ク」 → 「PDFlib ブ ロ ッ ク ツール」 を選択 し てブ ロ ッ ク ツー ルを ア ク テ ィ ブに し ます。 > 1 個目のブ ロ ッ ク を ク リ ッ ク し て選択 し ます。最初に選択 し た こ のブ ロ ッ ク がマ ス タ ー ブ ロ ッ ク です。 他の 1 個ない し 複数のブ ロ ッ ク を Shift+ ク リ ッ ク し て、 選択ブ ロ ッ ク 群に加え ます。 あ る いは、 「編集」 → 「すべて を選択」 を ク リ ッ ク し て、 現在のページ 上のすべてのブ ロ ッ ク を選択す る こ と も で き ます。 > こ れ ら のブ ロ ッ ク の う ちいずれか 1 個を ダブル ク リ ッ ク す る と 、ブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ グが開 き ます。 こ の時ダブル ク リ ッ ク し たブ ロ ッ ク は、 新たにマ ス タ ーブ ロ ッ ク にな り ます。 12.3 PDFlib Block Plugin で ブ ロ ッ ク を編集 369 > あ る いは、 1 個のブ ロ ッ ク を ク リ ッ ク し てマ ス タ ーブ ロ ッ ク と し て指定 し た う えで、 Enter キーを押 し てブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ グ を開 く こ と も で き ます。 プ ロ パテ ィ ダ イ ア ロ グには、選択 さ れてい る すべてのブ ロ ッ ク に適用 さ れ る プ ロ パテ ィ の 部分集合だけが表示 さ れ ま す。 ダ イ ア ロ グ には、 マ ス タ ーブ ロ ッ ク か ら 採 ら れたプ ロ パ テ ィ 値が表示 さ れます。 こ の時、 選択 さ れてい るすべてのブ ロ ッ ク に対 し て、 プ ロ パテ ィ 群を以下の よ う に適用す る こ と がで き ます : > チ ェ ッ ク ボ ッ ク ス 「マ ス タ ーブ ロ ッ ク のすべてのプ ロパテ ィ を適用」 がチ ェ ッ ク さ れ ていない場合 : 「適用」 を ク リ ッ ク す る と 、 ダ イ ア ロ グ内で手変更を加え ら れたプ ロ パ テ ィ 群 (黒でハ イ ラ イ ト さ れてい る ) のみが、 選択 さ れてい る すべてのブ ロ ッ ク へ コ ピー さ れます。 > チ ェ ッ ク ボ ッ ク ス 「マ ス タ ーブ ロ ッ ク のすべてのプ ロパテ ィ を適用」 がチ ェ ッ ク さ れ てい る 場合 : 「適用」 を押す と 、 マ ス タ ーブ ロ ッ ク のすべてのカ レ ン ト プ ロ パテ ィ と 、 ダ イ ア ロ グ内で手変更を加え ら れたすべてのプ ロ パテ ィ が、 選択 さ れてい る すべての ブ ロ ッ ク へ コ ピー さ れます。 こ れを利用 し て、 あ る 1 個のブ ロ ッ ク のブ ロ ッ ク プ ロ パ テ ィ を、 他の 1 個ない し 複数のブ ロ ッ ク へ コ ピーす る こ と も 可能です。 以下の定義済みプ ロ パテ ィ 、 お よ びカ ス タ ムプ ロ パテ ィ は共用で き ません。 すなわち、 こ れ ら は複数のブ ロ ッ ク に対 し て一度に編集する こ と はで き ません : Name・Description・Subtype・Type・Rect・Status 12.3.3 ページ間 ・ 文書間で ブ ロ ッ ク を コ ピ ー Block Plugin は、 現在のページの中で、 ま たは現在の文書の中で、 あ る いは他の文書へ と 、 ブ ロ ッ ク を移動 し た り コ ピー し た り する ための手段をい く つか提供 し てい ます : > ブ ロ ッ ク を マ ウ ス で ド ラ ッ グ し て移動 ・ コ ピー、 ま たは他のページや開いてい る 文書 へブ ロ ッ ク を貼 り 付け > ブ ロ ッ ク を、通常の コ ピー/貼 り 付け操作を用いて、同一文書内の 1個ない し 複数のペー ジへ複製 > ブ ロ ッ ク を、 新 し い フ ァ イ ル (ページが空白の) や、 既存の文書 (既存のページにブ ロ ッ ク を適用) へ書 き 出 し > 他の文書か ら ブ ロ ッ ク を取 り 込み ブ ロ ッ ク の定義を維持 し た ま まページの内容を更新 し たい場合には、ブ ロ ッ ク を保っ た ま ま背景の 1 個ない し 複数のページ を置換す る こ と がで き ます。 そのためには、 「ツール」 → 「ページ」 → 「置換」 (Acrobat X/XI)、 ま たは 「文書」 → 「ページの置換 ...」 (Acrobat 9) を用い ます。 ブ ロ ッ ク を移動 ・ コ ピ ー ブ ロ ッ ク の位置を変え る には、1 個ない し 複数のブ ロ ッ ク を選 択 し て、 新 し い位置へ ド ラ ッ グ し ま す。 ブ ロ ッ ク の コ ピ ー を 作成す る には、 Ctrl キ ー (Windows の場合) か Alt キー (OS X の場合) を押 し なが ら 同様に ド ラ ッ グ し ます。 キー を押 し てい る 間は、 マ ウ ス カー ソ ルが変わ り ます。 コ ピー さ れたブ ロ ッ ク は元のブ ロ ッ ク と 同 じ プ ロ パテ ィ を持ち ますが、 ただ し 名前 と 位置だけは自動的に変更 さ れます。 ま た、 コ ピー/貼 り 付け を使っ て、 ブ ロ ッ ク を、 同一ページ内の他の場所へ、 ま たは 同一文書内の他のページへ、 あ る いは Acrobat でその時点で開いてい る 他の文書へ コ ピー す る こ と も で き ます : > ブ ロ ッ ク ツールを ア ク テ ィ ブに し てか ら 、 コ ピー し たいブ ロ ッ ク 群を選択 し ます。 > Ctrl+C (Windows の場合) か Cmd+C (OS X の場合) を、 ま たは 「編集」 → 「コ ピー」 を 使っ て、 選択 し たブ ロ ッ ク を ク リ ッ プボー ド へ コ ピー し ます。 370 第 12 章 : PPS と PDFlib Block Plugin > コ ピー先ページへ移動 し ます (必要な ら )。 > ブ ロ ッ ク ツールがア ク テ ィ ブであ る こ と を確認 し て、Ctrl+V(Windows の場合)か Cmd+V (OS X の場合) を、 ま たは 「編集」 → 「貼 り 付け」 を使っ て、 ク リ ッ プボー ド か ら ブ ロ ッ ク を現在のページ と 文書へ貼 り 付け ます。 ブ ロ ッ ク を他のページ群へ複製 1 個ない し 複数のブ ロ ッ ク の複製を、現在の文書の中の 任意の数のページ上に一度に作成す る こ と も で き ます : > ブ ロ ッ ク ツールを ア ク テ ィ ブに し てか ら 、 複製 し たいブ ロ ッ ク 群を選択 し ます。 > 「PDFlib ブ ロ ッ ク」 メ ニ ュ ーか コ ン テ キ ス ト メ ニ ュ ーか ら 「取 り 込み と 書き出 し 」 → 「複 製 ...」 を選びます。 > ど のブ ロ ッ ク を複製す る か を選び (「選択 さ れている ブ ロ ッ ク」 ま たは 「 こ のページ上 の全ブ ロ ッ ク」)、 こ の選んだブ ロ ッ ク 群を複製 し たい複製先ページの範囲を選びます。 ブ ロ ッ ク を書 き出す ・ 取 り 込む ブ ロ ッ ク の書 き 出 し /取 り 込み機能を使 う と 、 あ る 1 つのページ上のブ ロ ッ ク の定義や、 あ る 文書内のすべてのブ ロ ッ ク の定義を、 複数の PDF フ ァ イ ル間で共用す る こ と が可能です。 こ れは、 既存のブ ロ ッ ク 定義を維持 し た ま まペー ジ内容を更新 し たい と き に便利です。ブ ロ ッ ク 定義を別フ ァ イ ル と し て書 き出すには以下 の よ う に操作 し ます : > ブ ロ ッ ク ツールを ア ク テ ィ ブに し てか ら 、 書 き 出 し たいブ ロ ッ ク 群を選択 し ます。 > 「PDFlib ブ ロ ッ ク」 メ ニ ュ ーか コ ン テ キ ス ト メ ニ ュ ーか ら 「取 り 込み と 書き出 し 」 → 「書 き出 し ...」 を選択 し ます。 ページ範囲 と 、 ブ ロ ッ ク 定義を持たせたい新規 PDF フ ァ イ ル名を入力 し ます。 ブ ロ ッ ク 定義を取 り 込むには 「PDFlib ブ ロ ッ ク」 → 「取 り 込み と 書き出 し 」 → 「取 り 込み ...」 を選択 し ます。 ブ ロ ッ ク 取 り 込みの際には、 取 り 込んだブ ロ ッ ク を文書内の全ページ に適用す る か、 それ と も あ る ページ範囲にのみ適用する か を選ぶ こ と がで き ます。 複数の ページ を選択 し た場合、 ブ ロ ッ ク 定義は変更 さ れずに各ページへコ ピー さ れます。 取 り 込 むブ ロ ッ ク 定義 よ り も 取 り 込み先範囲のほ う がページ数が多い場合には、 「テ ン プ レー ト を繰 り 返す」 チ ェ ッ ク ボ ッ ク ス を用い る こ と も で き ます。 こ れをチ ェ ッ ク す る と 、 取 り 込 みフ ァ イ ル内のブ ロ ッ ク のシーケ ン ス が、 現在の文書の中で、 文書の終わ り に達す る ま で 繰 り 返 さ れます。 書き出 し で ブ ロ ッ ク を他の文書へ コ ピ ー ブ ロ ッ ク を書 き 出す際には、 そのブ ロ ッ ク 群 を他の文書内のページ群へ直接適用す る こ と も で き ます。 結果 と し て、 あ る文書か ら 別の 文書へブ ロ ッ ク 群を転写す る こ と が可能です。 そのためには、 ブ ロ ッ ク の書 き出 し 先 と し て既存の文書を選びます。 「既存のブ ロ ッ ク を削除」 チ ェ ッ ク ボ ッ ク ス をチ ェ ッ ク す る と 、 書 き 出 し 先の文書にブ ロ ッ ク が存在 し ていて も すべて削除 さ れ、 その後に、 新 し いブ ロ ッ ク 群がその文書へ コ ピー さ れます。 12.3.4 PDF フ ォ ーム フ ィ ール ド を PDFlib ブ ロ ッ ク に変換 PDFlib ブ ロ ッ ク を手動で作成する のではな く 、PDF フ ォーム フ ィ ール ド をブ ロ ッ ク へ自動 変換 さ せ る こ と も で き ます。 こ れは、 複雑な PDF フ ォームがあ っ て PPS で自動流 し 込み さ せたい場合や、 既存の大量の PDF フ ォーム を自動流 し 込みで き る よ う に変換 し たい場 合な ど に特に便利です。1 つのページ上のすべての フ ォーム フ ィ ール ド を PDFlib ブ ロ ッ ク に変換す る には、 「PDFlib ブ ロ ッ ク」 → 「フ ォ ーム フ ィ ール ド の変換」 → 「現在のページ」 を選択 し ます。 文書内のすべての フ ォーム フ ィ ール ド を変換 し たい場合は 「全ページ」 を 選びます。 選択 し た フ ォーム フ ィ ール ド だけ を変換する には (1 個ま たは複数の フ ォーム 12.3 PDFlib Block Plugin で ブ ロ ッ ク を編集 371 フ ィ ール ド を選択す る には、 Acrobat の フ ォーム ツールかオブジ ェ ク ト 選択ツールを選び ます)、 「選択 さ れている フ ォ ーム フ ィ ール ド 」 を選択 し ます。 フ ォ ーム フ ィ ール ド 変換の詳細 自動フ ォ ーム フ ィ ール ド 変換では、 「PDFlib ブ ロ ッ ク」 → 「フ ォ ーム フ ィ ール ド の変換」 → 「変換オプ シ ョ ン ...」 ダ イ ア ロ グで選択 さ れてい る 種 類の フ ォーム フ ィ ール ド が、テ キ ス ト 行ブ ロ ッ ク かテ キ ス ト フ ロ ーブ ロ ッ ク に変換 さ れま す。 デフ ォ ル ト では、 すべての種類の フ ォ ーム フ ィ ール ド が変換 さ れ ま す。 変換 さ れた フ ィ ール ド の属性は、表 12.3 に従っ て、その照応す る ブ ロ ッ ク プ ロ パテ ィ へ変換 さ れます。 同名の複数の フ ォ ーム フ ィ ール ド 同 じ ページ上に あ る 複数の フ ォ ー ム フ ィ ール ド は、 同 じ 名前を持つ こ と が許 さ れてい ますが、それに対 し てブ ロ ッ ク 名はページ上で一意でな ければな り ません。 こ のため、 フ ォーム フ ィ ール ド がブ ロ ッ ク に変換 さ れ る 際には、 生成 さ れ る ブ ロ ッ ク の名前に数の接尾辞が付加 さ れ、 一意なブ ロ ッ ク 名が作成 さ れ ます (372 ページ 「フ ォーム フ ィ ール ド を照応す る ブ ロ ッ ク に関連付け」 も 参照)。 なお、 Acrobat の内部的な問題のため、 複数の フ ォーム フ ィ ール ド が同 じ 名前を持つ場 合の フ ィ ール ド の属性は正 し く 報告 さ れません。複数の フ ィ ール ド が同 じ 名前を持っ てい て、 し か し 属性が異な っ てい る 場合には、 生成 さ れ る ブ ロ ッ ク には こ う し た属性の違いは 反映 さ れ ま せん。 変換処理は こ の場合、 警告 メ ッ セージ を表示 し て、 関係す る フ ォ ーム フ ィ ール ド 群の名前を示 し ます。 こ の場合は、 生成 さ れたブ ロ ッ ク のプ ロ パテ ィ を注意深 く チ ェ ッ ク する 必要があ り ます。 フ ォ ーム フ ィ ール ド を照応す る ブ ロ ッ ク に関連付け 同 じ 名前の フ ィ ール ド が複数あ っ た場合 ( ラ ジオボ タ ン等) 、 変換 さ れた フ ォーム フ ィ ール ド の名前は変更 さ れて し ま っ て い ますか ら 、特定の フ ォーム フ ィ ール ド に照応す る ブ ロ ッ ク を正 し く 同定す る こ と は困難 です。 こ の こ と は特に、FDF ま たは XFDF フ ァ イ ルを ソ ース と し て用いてブ ロ ッ ク への流 し 込みを行い、 その結果を フ ォームへの記入 と 同 じ に し たい場合に問題 と な り ます。 こ の問題を解決す る ため、 AcroFormConversion プ ラ グ イ ンは、 元の フ ォーム フ ィ ール ド に関す る 情報を、 その照応す る ブ ロ ッ ク を作成す る際に、 カ ス タ ムプ ロ パテ ィ 群 と し て 記録 し ます。表 12.2 に、ブ ロ ッ ク を正 し く 同定す る ために利用で き る カ ス タ ムプ ロ パテ ィ の一覧を示 し ます。 プ ロ パテ ィ の型はすべて文字列です。 表 12.2 ブ ロ ッ ク に照応する元のフ ォ ーム フ ィ ール ド を同定する ためのカ ス タ ムプ ロパテ ィ カ ス タ ムプ ロパテ ィ 意味 PDFlib:field:name フ ォ ーム フ ィ ール ド の完全修飾名。 PDFlib:field:pagenumber 元の文書で フ ォ ーム フ ィ ール ド が存在 し ていたページの番号 (文字列で)。 PDFlib:field:type フ ォ ーム フ ィ ール ド の種類。 pushbutton ・ checkbox ・ radiobutton ・ listbox ・ combobox ・ textfield ・ signature の う ちのいずれか。 PDFlib:field:value (type=checkbox の場合のみ) フ ォ ーム フ ィ ール ド の出力値。 表 12.3 PDF フ ォ ーム フ ィ ール ド から PDFlib ブ ロ ッ クへの変換 以下の PDF フ ォ ーム フ ィ ール ド 属性は ... ... 以下の PDFlib ブ ロ ッ ク プ ロパテ ィ に変換 さ れる 全フ ィ ール ド 位置 Rect 名前 Name ツール ヒ ン ト Description 372 第 12 章 : PPS と PDFlib Block Plugin 表 12.3 PDF フ ォ ーム フ ィ ール ド から PDFlib ブ ロ ッ ク への変換 以下の PDF フ ォ ーム フ ィ ール ド 属性は ... ... 以下の PDFlib ブ ロ ッ ク プ ロパテ ィ に変換 さ れる 一般→一般プ ロパテ ィ →表示 と 印刷 Status : 表示 =active 非表示 =ignore 表示 / 印刷 し ない =ignore 非表示 / 印刷する =active 一版→一般プ ロパテ ィ →向き orientate : 0=north、 90=west、 180=south、 270=east 表示方法→テキス ト →フ ォ ン ト fontname 表示方法→テキス ト →フ ォ ン ト サイ ズ fontsize : 文字サイ ズ auto は、 ブ ロ ッ クの高 さ の 3 分の 2 の固定文 字サイ ズに変換 さ れ、 fitmethod は auto に設定 さ れます。 複数行の ブ ロ ッ ク/フ ィ ール ド においては、 こ の組み合わせでは結果 と し て 自動的に適切な文字サイ ズにな るので、 ブ ロ ッ クの高 さ の 3 分の 2 と い う 初期値よ り も 小 さ く な る こ と があ り ます。 表示方法→テキス ト →テキス ト の色 strokecolor ・ fillcolor 表示方法→境界線 と 色→境界線の色 bordercolor 表示方法→境界線 と 色→塗 り つぶ し の色 backgroundcolor 表示方法→境界線 と 色→幅 linewidth : 細 =1、 標準 =2、 太 =3 テキス ト フ ィ ール ド オプ シ ョ ン→整列 position : 左揃え ={left center} 中央 ={center center} 右揃え ={right center} オプ シ ョ ン→デ フ ォル ト defaulttext オプ シ ョ ン→複数行 チ ェ ッ ク あ り な ら テキス ト フ ローブ ロ ッ ク を作成 チ ェ ッ ク な し な ら テキス ト 行ブ ロ ッ ク を作成 ラ ジオボ タ ン ・ チ ェ ッ ク ボ ッ ク ス 「デ フ ォ ル ト でチ ェ ッ ク」 がオ ンの場合 : defaulttext : オプ シ ョ ン→チ ェ ッ ク ボ ッ ク スス タ イル、 チ ェ ッ ク マー ク =4 オプ シ ョ ン→ボ タ ン ス タ イル 円形 =l 十字形 =8 ひ し 形 =u 四角形 =n 星形 =H (文字は ZapfDingbats フ ォ ン ト における各記号を表 し ます) リ ス ト ボ ッ ク ス ・ コ ンポボ ッ ク ス オプ シ ョ ン→選択 さ れてい る (デ フ ォ ル ト ) 項目 defaulttext ボタ ン オプ シ ョ ン→ア イ コ ン と ラ ベル→ラ ベル defaulttext ブ ロ ッ ク を照応す る フ ォ ーム フ ィ ール ド へバ イ ン ド PDFlib フ ォーム フ ィ ール ド と 生成 PDFlib ブ ロ ッ ク を 同期 さ せ る た めに、 生成 さ れ た ブ ロ ッ ク を、 そ の照応す る フ ォ ー ム フ ィ ール ド にバ イ ン ド さ せてお く こ と がで き ます。 言い換えれば、 ブ ロ ッ ク ツールが内部 12.3 PDFlib Block Plugin で ブ ロ ッ ク を編集 373 的に フ ォーム フ ィ ール ド と ブ ロ ッ ク と の紐付け を保持する と い う こ と です。変換処理が再 実行 さ れ る 際、 バ イ ン ド さ れたブ ロ ッ ク は、 その照応する PDFlib フ ォーム フ ィ ール ド の 属性を反映 し て更新 さ れます。 ブ ロ ッ ク がバ イ ン ド さ れてい る と 、 作業の二度手間が省け て便利です : フ ォームが対話的利用のために更新 さ れた時には、 その照応す る ブ ロ ッ ク も 自動的に更新 さ れ る か ら です。 ブ ロ ッ ク 生成後に変換元フ ォーム フ ィ ール ド を残 し た く ない場合は、「PDFlib ブ ロ ッ ク」 → 「 フ ォ ーム フ ィ ール ド の変換」 → 「変換オプ シ ョ ン ...」 ダ イ ア ロ グの 「変換 さ れた フ ォ ー ム フ ィ ール ド を削除」 オプシ ョ ン を選びます。 こ のオプシ ョ ン を選ぶ と 、 フ ォーム フ ィ ー ル ド は変換処理後に完全に削除 さ れます。削除 さ れた フ ィ ール ド に関連づけ ら れていたア ク シ ョ ン (JavaScript な ど) も 、 すべて文書か ら 削除 さ れます。 バ ッ チ変換 フ ォーム フ ィ ール ド を PDFlib ブ ロ ッ ク に変換 し たい PDF 文書が多数あ る 場 合には、 バ ッ チ変換機能 を 利用 し て、 任意の数の文書 を 自動処理す る こ と も で き ま す。 「PDFlib ブ ロ ッ ク」 → 「フ ォ ーム フ ィ ール ド の変換」 → 「バ ッ チ変換 ...」 を選択すれば、 バ ッ チ処理ダ イ ア ロ グが現れます : > 入力フ ァ イ ルは個別に選ぶ こ と も で き ます し 、1 個の フ ォ ルダの中身をすべて ま と めて 処理 さ せ る こ と も で き ます。 > 出力フ ァ イ ルは、入力フ ァ イ ル と 同 じ フ ォ ルダへ書 き出す こ と も で き ます し 、別の フ ォ ルダへ書 き 出す こ と も で き ます。 出力フ ァ イ ルには、 入力フ ァ イ ル と 区別す る ために プ レ フ ィ ッ ク ス を追加す る こ と も で き ます。 > 大量の文書を処理す る 際には、 ロ グ フ ァ イ ルを指定する こ と を推奨 し ます。変換後、 ロ グ フ ァ イ ルには、 処理 さ れたすべての フ ァ イ ルの一覧 と 、 それぞれの変換結果に関す る 詳細が書 き 込ま れてお り 、 エ ラ ーが起 き た場合にはエ ラ ー メ ッ セージ も 書 き 込ま れ ます。 変換処理の間、 変換 さ れ る PDF 文書は Acrobat で表示 さ れますが、 変換が完了す る ま で、 Acrobat の メ ニ ュ ー機能やツールは一切使用で き ません。 12.3.5 Block Plugin のユーザー イ ン タ フ ェ ース を XML で カ ス タ マ イ ズ Block Plugin のユーザー イ ン タ フ ェ ース のい く つかの点は、各 Acrobat セ ッ シ ョ ン ご と に保 管 / 再読み込み さ れてお り 、 XML 構成フ ァ イ ルを通 じ て制御す る こ と が可能です。 サン プル構成フ ァ イ ル factory settings.xml をデ ィ ス ト リ ビ ュ ーシ ョ ンに同梱 し てい ます。 構成 が変更 さ れた と き 、 新 し い設定は user settings.xml に格納 さ れます。 変更 さ れた構成は、 Acrobat が起動 さ れ る たびに読み込まれ、 Acrobat が閉 じ ら れ る たびに書 き 込まれます。 こ の構成フ ァ イ ルは、 以下の よ う な場所に格納 さ れてい ます (シ ス テ ムデ ィ レ ク ト リ の名前 は ロ ーカ ラ イ ズ さ れてい る 可能性があ り ます) : Windows XP: Windows 7以上: OS X: C:\Documents and Settings\<user>\My Documents\PDFlib\Block Plugin 5 C:\Users\<user>\Documents\PDFlib\Block Plugin 5 <home>/Documents/PDFlib/Block Plugin 5 以下の XML エ レ メ ン ト を用いて、 構成を手変更する こ と が可能です : > エ レ メ ン ト /Block_Plugin/MainDialog/CloseOnApply は、ブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ グ の 「適用 し た ら ダ イ ア ロ グ を閉 じ る」 チ ェ ッ ク ボ ッ ク ス の初期状態を制御 し ます。 こ のチ ェ ッ ク ボ ッ ク ス は、 ブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ グ を、 ブ ロ ッ ク を作成 し た後 も 、 ま たはブ ロ ッ ク プ ロ パテ ィ を変更 し た後 も 開いた ま ま に し てお く か ど う か を決定 し ま す。 > エ レ メ ン ト /Block_Plugin/MainDialog/ApplyAllProps は、ブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ グ の 「マ ス タ ーブ ロ ッ ク のすべてのプ ロパテ ィ を適用」 チ ェ ッ ク ボ ッ ク ス の初期状態を 374 第 12 章 : PPS と PDFlib Block Plugin > > > > 制御 し ます。 こ のチ ェ ッ ク ボ ッ ク ス は、 マ ス タ ーブ ロ ッ ク のすべてのプ ロ パテ ィ が選 択 さ れた複数のブ ロ ッ ク へ コ ピー さ れ る か、 それ と も ダ イ ア ロ グ内の変更が加わ っ た プ ロ パテ ィ 群のみか を指定 し ます。 エ レ メ ン ト /Block_Plugin/FontDialog/ShowBaseFonts は、 ブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ グの フ ォ ン ト 一覧 (「書式」 プ ロ パテ ィ グループの fontname プ ロ パテ ィ ) に、 シ ス テ ムに イ ン ス ト ール さ れてい る フ ォ ン ト 群に加えて、 ベース 14 フ ォ ン ト も 表示す る か ど う か を制御 し ます。 エ レ メ ン ト /Block_Plugin/Command/ControlByClick は、メ ニ ュ ー項目「PDFlib ブ ロ ッ ク」 → 「オブ ジ ェ ク ト を ク リ ッ ク で ブ ロ ッ ク を定義」 の初期状態を制御 し ます。 エ レ メ ン ト /Block_Plugin/Command/DetectFonts は、メ ニ ュー項目「PDFlib ブ ロ ッ ク」→ 「背景 フ ォ ン ト ・ 色の検出」 の初期状態を制御 し ます。 (非サポー ト )エ レ メ ン ト /Block_Plugin/Command/KeyAccelerator は、と り う る 値 control ( こ れは Windows では Ctrl キーを、 OS X では Cmd キーを示 し ます) ・ control+shift ・ none を持ち、 以下のキーボー ド シ ョ ー ト カ ッ ト に対す る ア ク セ ラ レー タ キーを制御 し ます : C (コピー ), I (ブロックプロパティダイアログ), V (貼り付け), X (切り取り) こ のエ レ メ ン ト は、 デフ ォ ル ト 構成フ ァ イ ル default.PPSoptions 内でのみ効果を持ち ま す。 なぜな ら キーボー ド シ ョ ー ト カ ッ ト は実行時には変更で き ないか ら です。 こ のエ ン ト リ がない場合は、ア ク セ ラ レー タ は一切利用で き ません。そのデフ ォ ル ト は control です。 12.3 PDFlib Block Plugin で ブ ロ ッ ク を編集 375 12.4 Acrobat で ブ ロ ッ ク を プ レ ビ ュ ー 注 PDFlib デ ィ ス ト リ ビ ュ ーシ ョ ンの中の block_template.pdf 文書で、プ レ ビ ュ ー機能を試す こ と がで き ます。 必要な リ ソ ース ( フ ォ ン ト ・ 画像等) も デ ィ ス ト リ ビ ュ ーシ ョ ンに含ま れています。 PDFlib ブ ロ ッ ク は PPS に よ っ て処理 さ れます。 PPS を用い る こ と で、 ブ ロ ッ ク への流 し 込 み処理について、 そのデー タ ソ ース (デー タ ベース内のテ キ ス ト 、 デ ィ ス ク 上の画像フ ァ イ ル等) や、 生成 さ れ る 文書の書式 ・ 対話的性質を カ ス タ マ イ ズす る こ と がで き ます。 こ の処理について詳 し く は 381 ページ 「12.5 PPS でブ ロ ッ ク へ流 し 込み」 で解説 し ます。 し か し Block Plugin には内蔵バージ ョ ンの PPS が含まれてお り 、 こ れを用いて、 プ ロ グ ラ ミ ン グ を一切必要 と せずに Acrobat 上で、 流 し 込まれたブ ロ ッ ク のプ レ ビ ュ ーバージ ョ ン を生成す る こ と がで き ます。 こ のプ レ ビ ュ ー機能は、 カ ス タ ムプ ロ グ ラ ミ ン グ と 同等の 柔軟性を提供す る こ と はで き ませんが、ブ ロ ッ ク への流 し 込み結果を手軽に眺め る には適 し てい ます。 ブ ロ ッ ク プ レ ビ ュ ーを活用すれば、 ブ ロ ッ ク の位置やサ イ ズ を改善 し た り 、 ブ ロ ッ ク のプ ロ パテ ィ (フ ォ ン ト 名 ・ 文字サ イ ズ等) をチ ェ ッ ク し た り す る こ と がで き ま す。 プ レ ビ ュ ーの表示結果に満足す る ま で、 ブ ロ ッ ク を変更 し 、 プ レ ビ ューを新たに生成 す る こ と がで き ます。 プ レ ビ ュ ーは、 現在のページについて も 、 文書全体について も 生成 で き ます。 プ レ ビ ュ ーはつねに、 新 し い PDF 文書 と し て表示 さ れます。 元の文書 (ブ ロ ッ ク を含 んでい る ) は、 プ レ ビ ュ ーを生成 し て も 変更を受け ません。 プ レ ビ ュー文書は、 必要に応 じ て保存す る こ と も 捨て る こ と も で き ます。 ブ ロ ッ ク のデ フ ォ ル ト 内容 プ ラ グ イ ンでは、サーバサ イ ド のデー タ ソ ース (デー タ ベー ス等) か ら ブ ロ ッ ク のテ キ ス ト ・ 画像 ・ ベ ク ト ルグ ラ フ ィ ッ ク ・ PDF 内容を入手す る こ と は望むべ く も あ り ま せんので、 プ レ ビ ュ ー機能ではつねに、 ブ ロ ッ ク のデフ ォ ル ト 内容 が、 すなわち defaulttext ・ defaultimage ・ defaultpdf ・ defaultgraphics プ ロ パテ ィ で指定 さ れてい る 値が用い ら れます。 通常、 PPS で使われ る 実際のブ ロ ッ ク 内容を代表す る よ う な サンプルデー タ 集合が、 デフ ォ ル ト デー タ と し て用い ら れます。 デフ ォ ル ト 内容を持たな いブ ロ ッ ク は、 プ レ ビ ュ ー生成時には無視 さ れ ます。 Status=ignoredefault のブ ロ ッ ク に ついて も 同様です。 新規ブ ロ ッ ク では、 デ フ ォ ル ト プ ロ パテ ィ は空です。 プ レ ビ ュ ー機能を使 う 前には、 「デ フ ォ ル ト 内 容」 プ ロ パ テ ィ グ ル ー プ の defaulttext ・ defaultimage ・ defaultpdf ・ defaultgraphics プ ロ パテ ィ (ブ ロ ッ ク の種類に よ る ) に書 き 込むか、 あ る いは 「高度な PPS オプ シ ョ ン ...」 ダ イ ア ロ グ内の同 じ 名前のオプシ ョ ンに対 し て適切な値を与え る必要 があ り ます。 注 デ フ ォル ト テキス ト を記号フ ォ ン ト で入力する方法はやや ト リ ッ キーです。 詳 し く は 380 ページ 「デ フ ォル ト テキス ト に記号フ ォ ン ト を用いる」 を参照 し て く だ さ い。 ブ ロ ッ ク プ レ ビ ュ ー を生成 ブ ロ ッ ク プ レ ビ ュ ーを作成す る には、 以下のいずれかの方 法を用い ます : > メ ニ ュ ー項目 「PDFlib ブ ロ ッ ク」 → 「プ レ ビ ュ ー」 → 「プ レ ビ ュ ーの生成」 で。 > 「ツール」 → 「高度な編集」 ペーン (Acrobat X/XI) ま たは 「高度な編集」 ツールバー (Acrobat 9) で PDFlib ブ ロ ッ ク プ レ ビ ュ ーア イ コ ン を ク リ ッ ク 。 Acrobat で こ の ツールバーが表示 さ れていない と き は、 「表示」 → 「ツール」 → 「高度な編集」 (Acrobat 376 第 12 章 : PPS と PDFlib Block Plugin 図 12.4 図 12.1 で示 し た コ ン テナ文書に対する プ レ ビ ュ ー PDF。 ブ ロ ッ ク 情報レ イ ヤー群 と 注釈群 を含んでいます X/XI) ま たは 「表示」 → 「ツールバー」 → 「高度な編集」 (Acrobat 9) を選択すれば表 示 さ せる こ と がで き ます。 > ブ ロ ッ ク ツールがア ク テ ィ ブの と き は、ど のブ ロ ッ ク も ない所を右 ク リ ッ ク すれば、コ ン テ キ ス ト メ ニ ュ ーに項目 「プ レ ビ ュ ーの生成」 と 「プ レ ビ ュ ー設定 ...」 が現れます。 プ レ ビ ュ ーは、 デ ィ ス ク 上の PDF フ ァ イ ルに基づいて作成 さ れます。 Acrobat 上で変更を 行な っ ていた場合、 ブ ロ ッ ク PDF を 「 フ ァ イル」 → 「上書き保存」 ま たは 「フ ァ イル」 → 「名前を付けて保存 ...」 を用いてデ ィ ス ク に保存 し ては じ めて、 その変更はプ レ ビ ューに 反映 さ れます。 変更を受けたブ ロ ッ ク は、 ブ ロ ッ ク の名前の後にア ス タ リ ス ク が付いてい る こ と で識別で き ます。 プ レ ビ ュ ー機能を構成 し て、 プ レ ビ ュ ー作成前にブ ロ ッ ク PDF が自動保存 さ れ る よ う にす る こ と も で き ます。 そ う すれば、 対話的に行な っ た変更が確実 に、 ただちにプ レ ビ ュ ー内で反映 さ れます。 12.4 Acrobat で ブ ロ ッ ク を プ レ ビ ュ ー 377 図 12.5 ブ ロ ッ ク プ レ ビ ュ ー構成 プ レ ビ ュ ー を構成 ブ ロ ッ ク プ レ ビ ュ ーの作成 と 、 その基礎を なす PPS の動作について は、 い く つかの性質を、 「PDFlib ブ ロ ッ ク」 → 「プ レ ビ ュ ー」 → 「プ レ ビ ュ ー設定 ...」 で 構成する こ と がで き ます : > 現在のページ をプ レ ビ ュ ーす る か、 それ と も 文書全体をプ レ ビ ューす る か。 > 生成 さ れ る プ レ ビ ュ ー文書の出力デ ィ レ ク ト リ 。 > ブ ロ ッ ク PDF を プ レ ビ ュ ー作成前に自動保存。 > ブ ロ ッ ク 情報レ イ ヤー と 注釈を追加。 > 生成 さ れ る 出力へブ ロ ッ ク 群を コ ピー。 > 「ブ ロ ッ ク PDF の PDF/A か PDF/UA か PDF/X ス テー タ ス を転写」: こ れ ら の規格では、レ イ ヤー と 注釈の使用は制限 さ れてい ますので、 「ブ ロ ッ ク 情報レ イヤー と 注釈を追加」 オ プシ ョ ン と こ のオプシ ョ ンは同時には使え ません。 > 「ブ ロ ッ ク を プ レ ビ ュ ー フ ァ イルへ コ ピー」 を利用す る と 、 流 し 込みの際に、 PDF ブ ロ ッ ク 群を、 生成 さ れたプ レ ビ ュ ーへ コ ピーす る こ と がで き ます。 ブ ロ ッ ク への流 し 込みが成功 し たか ど う かにかかわ ら ず、 すべてのブ ロ ッ ク が コ ピー さ れます。 > 「高度な PPS オプ シ ョ ン」ダ イ ア ロ グ を利用 し て、PPS API に従っ て PPS 関数のオプシ ョ ン リ ス ト を追加指定す る こ と も で き ます。 た と えば、 PDF_set_option( ) の searchpath オプ シ ョ ン を 用い て、 ブ ロ ッ ク への流 し 込みに使 う フ ォ ン ト や画像が置かれて い る デ ィ レ ク ト リ を指定す る こ と がで き ま す。 高度なオプ シ ョ ン を指定す る 際には、 PPS コ ー ド の開発者 と の連携の も と に行 う こ と を推奨 し ます。 プ レ ビ ュ ーで提供 さ れる情報 生成 さ れ る プ レ ビ ュー文書には、 元のページ内容 (背景) と 、 流 し 込みが行われたブ ロ ッ ク のほかに、 さ ま ざ ま な情報 も 含ま れ る こ と があ り ます。 こ の情報は、 ブ ロ ッ ク や PPS 構成のチ ェ ッ ク や改善に役立つ も のです。 デフ ォ ル ト 内容を 持つア ク テ ィ ブなブ ロ ッ ク それぞれについて、 以下のア イ テ ムが作成 さ れます : > エ ラ ーマー カ : 流 し 込みが成功 し なか っ たブ ロ ッ ク は、 打ち消 し 線の付いた長方形 と し て視覚化 さ れてい ますので、 容易に識別で き ます。 エ ラ ーマーカは、 ブ ロ ッ ク が処 理で き なか っ た と き にはつねに作成 さ れます。 > し お り : ブ ロ ッ ク の処理結果は し お り に ま と め ら れ ます。 こ の し お り は、 ページ番号 と ブ ロ ッ ク の種類に従っ て、 かつエ ラ ーが起 き た と き はエ ラ ーに も 従っ て、 構造化 さ れてい ます。 し お り は 「表示」 → 「表示切 り 替え」 → 「ナビゲーシ ョ ンパネル」 → 「 し 378 第 12 章 : PPS と PDFlib Block Plugin お り 」(Acrobat X/XI)、ま たは「表示」→「ナビゲーシ ョ ンパネル」→「 し お り 」(Acrobat 9) で表示で き ます。 し お り はつねに作成 さ れます。 > 注釈 : 処理 さ れたブ ロ ッ ク ご と に、 ブ ロ ッ ク 内容その も のに加え て、 ページ上に注釈 が作成 さ れます。 こ の注釈の長方形は、元のブ ロ ッ ク の枠を視覚化 し てい ます (デフ ォ ル ト 内容 と 流 し 込みモー ド に よ っ ては、 こ れはブ ロ ッ ク 内容の枠 と は異な る 場合があ る のです)。 こ の注釈の中にはブ ロ ッ ク の名前が入っ てお り 、 ブ ロ ッ ク への流 し 込みが で き なか っ た と き にはエ ラ ー メ ッ セージ も 入っ てい ます。 注釈はデフ ォ ル ト で生成 さ れますが、 プ レ ビ ュ ー構成で無効化する こ と も で き ます。 PDF/A-1 ・ PDF/X 規格では 注釈の使用は制限 さ れてい ますので、 「ブ ロ ッ ク PDF の PDF/A か PDF/UA か PDF/X ス テー タ ス を転写」 オプシ ョ ン を有効にす る と 、 注釈は作成 さ れません。 > レ イ ヤー : ページの内容は、 分析 と デバ ッ グが容易にな る よ う 、 複数の レ イ ヤーに分 けて配置 さ れます。 ページ背景 (すなわち元のページの内容)、 ブ ロ ッ ク の各種類、 流 し 込みがで き なか っ たエ ラ ーブ ロ ッ ク 、 ブ ロ ッ ク 情報を持っ た注釈について、 それぞ れ別々の レ イ ヤーが作成 さ れ ます。 空の ま ま にな る レ イ ヤーについては作成 さ れ ませ ん (エ ラ ーが何 も 起 き なか っ た場合等)。 レ イ ヤー一覧は 「表示」 → 「ナビゲーシ ョ ン パネル」 → 「レ イ ヤー」 で表示で き ます。 デフ ォ ル ト では、 ページ上のすべての レ イ ヤーが表示 さ れ ます。 いずれかの レ イ ヤーの内容を見え な く す る には、 その レ イ ヤー の名前の左の目のア イ コ ン を ク リ ッ ク し ます。 レ イ ヤーの作成は、 プ レ ビ ュ ー構成で 無効化する こ と も 可能です。 PDF/A ・ PDF/X 規格ではレ イ ヤーの使用は制限 さ れてい ますので、 「ブ ロ ッ ク PDF の PDF/A か PDF/UA か PDF/X ス テー タ ス を転写」 オプシ ョ ン を有効にす る と 、 レ イ ヤーは作成 さ れません。 PDF/A か PDF/UA か PDF/X ス テー タ ス を転写 「ブ ロ ッ ク PDF の PDF/A か PDF/UA か PDF/ X ス テー タ ス を転写」 構成は、 こ れ ら の規格に従っ た PDF 出力を作成す る必要があ る と き に有用です。 転写モー ド は、 入力が以下のいずれかの規格に準拠 し てい る と き に有効にで き ます : PDF/A-1a:2005, PDF/A-1b:2005 PDF/A-2a, PDF/A-2b, PDF/A-2u PDF/A-3a, PDF/A-3b, PDF/A-3u PDF/UA-1 PDF/X-1a:2003 PDF/X-3:2003 PDF/X-4・PDF/X-4p PDF/X-5g・PDF/X-5pg プ レ ビ ュ ーが転写モー ド で作成 さ れ る と き は、 PPS は、 ブ ロ ッ ク PDF の以下の性質を、 生 成す る プ レ ビ ュ ーへ複製 し ます : > PDF 規格識別。 > 出力 イ ン テ ン ト 条件。 > ページ寸法。 すべてのページ枠を含みます。 > タ グ付き PDF : 文書言語 ( も し あれば)。 > XMP 文書 メ タ デー タ 。 規格準拠の PDF 文書を転写す る 際には、 すべてのブ ロ ッ ク 流 し 込み操作が、 それぞれの 規格に準拠 し てい る 必要があ り ま す。 た と えば、 出力 イ ン テ ン ト がな ければ、 ICC プ ロ フ ァ イ ルのない RGB 画像は使 う こ と がで き ません。 同様に、 使用 し てい る フ ォ ン ト はす べて埋め込む必要があ り ます。 要請の全一覧は、 321 ページ 「11.3 PDF/A に よ る アーカ イ 12.4 Acrobat で ブ ロ ッ ク を プ レ ビ ュ ー 379 ビ ン グ」 と 、 333 ページ 「11.4 PDF/X に よ る 印刷出力」 に示 し てい ます。 PDF/A ま たは PDF/X 転写モー ド でのブ ロ ッ ク 流 し 込み操作が、 選択 さ れてい る 規格に違反す る と き に は (デフ ォ ル ト 画像が RGB カ ラ ースペース を用いてい る に も かかわ ら ず、 文書が適切な 出力 イ ン テ ン ト を含んでいない場合等) 、 エ ラ ー メ ッ セージが表示 さ れ、 プ レ ビ ューは生 成 さ れません。 こ れに よ り 、 ユーザーは作業フ ロ ーの非常に早い時点で、 規格違反の危険 を感知す る こ と がで き ます。 デ フ ォ ル ト テキス ト に記号 フ ォ ン ト を用い る ブ ロ ッ ク の デ フ ォ ル ト テ キ ス ト を 記号 フ ォ ン ト で与え る には、 2 つの方法があ り ます : > Windowsの文字 コ ー ド 表アプ リ ケーシ ョ ン な ど に示 さ れてい る 8 ビ ッ ト レ ガシ コ ー ド を 用い る : defaulttext に対 し て 8 ビ ッ ト コ ー ド を、 その照応す る 8 ビ ッ ト キ ャ ラ ク タ を リ テ ラ ルに入力す る か (Windows の文字コ ー ド 表か ら コ ピー/ 貼 り 付けす る な ど し て)、 あ る いは数値エ ス ケープシーケ ン ス と し て与え ます。 こ の場合には、 「テキス ト 作成」 プ ロ パテ ィ グループ内の charref プ ロ パテ ィ のデフ ォ ル ト 値を false に し てお く 必要が あ り 、 ま た、 文字参照を用い る こ と はで き ません。 た と えば、 以下のデフ ォ ル ト テ キ ス ト は、 charref=false の と き 、 記号フ ォ ン ト Wingdings の 「ス マ イ リ ー」 グ リ フ を生成 し ます : J \x4A \112 > フ ォ ン ト 内で用い ら れてい る Unicode 値かグ リ フ名を用い る : 「テキス ト 作成」 プ ロ パ テ ィ グループの charref プ ロ パテ ィ を true に設定 し た う えで、記号の文字参照かグ リ フ 名参照を与え ます (110 ページ 「4.6.2 文字参照」 参照)。 た と えば、 以下のデフ ォ ル ト テ キ ス ト は、 charref=true の と き 、 記号フ ォ ン ト Wingdings の 「ス マ イ リ ー」 グ リ フ を 生成 し ます :  &.smileface; なお、 ど ち ら の方法で も 、 ブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ グ上は、 実際の記号グ リ フ ではな く 文字化け し た状態で表示 さ れます。 380 第 12 章 : PPS と PDFlib Block Plugin 12.5 PPS で ブ ロ ッ ク へ流 し 込み PPS でブ ロ ッ ク へ流 し 込みを行 う には、 まずブ ロ ッ ク を含むページ を、PDF_fit_pdi_page( ) 関数で出力ページ上に貼 り 付け る 必要が あ り ま す。 ページ を貼 り 付け た後、 その上のブ ロ ッ ク へ PDF_fill_*block( ) 関数群で流 し 込みを行 う こ と がで き ます。 簡単な例 : 可変テキス ト を テ ン プ レ ー ト に追加 PDF テ ンプ レー ト への動的テ キ ス ト の 追加は、 非常に頻繁に必要 と な る 動作です。 以下の コー ド 断片は、 入力 PDF 文書 (テ ン プ レー ト 、 ブ ロ ッ ク コ ン テナ) の中のページ を開 き 、 それを出力ページ上に配置 し 、 そ し て firstname と い う テ キ ス ト ブ ロ ッ ク に可変テ キ ス ト を入れ込みます : doc = p.open_pdi_document(filename, ""); if (doc == -1) throw new Exception("エラー : " + p.get_errmsg()); page = p.open_pdi_page(doc, pageno, ""); if (page == -1) throw new Exception("エラー : " + p.get_errmsg()); p.begin_page_ext(width, height, ""); /* 取り込んだページを貼り付け */ p.fit_pdi_page(page, 0.0, 0.0, ""); /* 貼り付けたページ上のブロック1個へ流し込み */ p.fill_textblock(page, "firstname", "Serge", "encoding=winansi"); p.close_pdi_page(page); p.end_page_ext(""); p.close_pdi_document(doc); ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの blocks/starter_block ト ピ ッ ク にあ り ます。 ブ ロ ッ ク のプ ロパテ ィ を オーバ ラ イ ド 場合に よ っ てプ ロ グ ラ マーは、 ブ ロ ッ ク の定義 が与え てい る プ ロ パテ ィ 群を一部だけ採用 し 、その他のプ ロ パテ ィ を カ ス タ ムの値でオー バ ラ イ ド し たい こ と があ り ます。 こ れは さ ま ざ ま な場合に有用です : > 業務上の要請で特定のオーバ ラ イ ド が必要 と 判断 さ れ る場合に対応。 > 画像・PDF ページの拡縮倍率を、ブ ロ ッ ク 定義か ら 採 ら ずに、アプ リ ケーシ ョ ンで算出。 > ブ ロ ッ ク の座標を プ ロ グ ラ ム で変え る 。 生成 し たい請求書のデー タ 項目数が一定でな い場合等。 > 別々の ス ポ ッ ト カ ラ ー名を与え る こ と も 可能。 プ リ ン ト サービ ス業務で、 顧客ご と の 要請に合わせる ため。 プ ロ パテ ィ を オーバ ラ イ ド す る には、 PDF_fill_*block( ) 関数群のオプシ ョ ン リ ス ト に、 プ ロ パテ ィ の名前 と 、 その照応す る 値を与え ます。 例 : p.fill_textblock(page, "firstname", "Serge", "fontsize=12"); こ れは、 ブ ロ ッ ク の内部の fontsize プ ロ パテ ィ を、 与えた値 12 でオーバ ラ イ ド し ます。 ほ と ん どすべてのプ ロ パテ ィ 名を、 オプシ ョ ン と し て用い る こ と が可能です。 プ ロ パテ ィ のオーバ ラ イ ド は、 それぞれの関数呼び出 し にのみ適用 さ れ ます。 ブ ロ ッ ク 定義内に保持 さ れ る わけではあ り ません。 12.5 PPS で ブ ロ ッ ク へ流 し 込み 381 流 し 込んだ ブ ロ ッ ク の上に取 り 込んだページ を配置 取 り 込んだページは、 ど のブ ロ ッ ク 流 し 込み関数を使 う よ り も 前に、 出力ページ上に配置 し てお く 必要があ り ます。 と い う こ と は元ページは通常、 ブ ロ ッ ク 内容 よ り も 下に配置 さ れ る こ と にな り ます。 し か し 場合 に よ っ ては、流 し 込みが行われたブ ロ ッ ク よ り も 上に元ページ を配置 し たい こ と も あ る で し ょ う 。 こ れを実現す る には、 PDF_fit_pdi_page( ) の blind オプシ ョ ン を用いてページ を 一度貼 り 付け る こ と に よ り 、 そのページ上のブ ロ ッ ク と その位置を PPS に知 ら せてお き 、 ブ ロ ッ ク への流 し 込みが済んだ後にページ を再び貼 り 付け る こ と に よ り 、実際にページ内 容を表示 さ せます : /* ブロックを用意するためにページをblindモードで配置してページを見えなくする */ p.fit_pdi_page(page, 0.0, 0.0, "blind"); /* ブロックへ流し込み */ p.fill_textblock(page, "firstname", "Serge", "encoding=winansi"); /* ... いろいろなブロックへ流し込み ... */ /* ページを再度配置、今度は見えるように */ p.fit_pdi_page(page, 0.0, 0.0, ""); ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の blocks/block_below_contents ト ピ ッ ク にあ り ま す。 ブ ロ ッ ク へ流 し 込む際に コ ン テ ナページ を無視 取 り 込んだブ ロ ッ ク は、 そのブ ロ ッ ク の背景のページ内容を一切参照せずに、 プ レース ホルダ と し て使っ て も よ いで し ょ う 。 ブ ロ ッ ク を持つ コ ン テナページ を ブ ラ イ ン ド モー ド で、すなわち PDF_fit_pdi_page( ) で blind オプシ ョ ン を指定 し て、 1 個ない し 複数のページ上に貼 り 付けた う えで、 ブ ロ ッ ク への流 し 込みを行 う と い う 方法です。 こ う すれば、 出力ページ上に コ ン テナページ を貼 り 付け る こ と な く 、 ブ ロ ッ ク やそのプ ロ パテ ィ の利点を活用する こ と がで き 、 ま た、 ブ ロ ッ ク を複 数のページ上へ (ま たは同一出力ページ上へ も ) 複製する こ と が可能にな り ます。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の blocks/duplicate_block ト ピ ッ ク にあ り ます。 テキス ト フ ロ ーブ ロ ッ ク を連結 テ キ ス ト フ ロ ーブ ロ ッ ク は、 前のブ ロ ッ ク か ら あふれ たテ キ ス ト が次のブ ロ ッ ク に入 る よ う 、 連結する こ と が可能です。 た と えば、 長い可変テ キ ス ト があ っ て、 別のページへ続かせ る 必要が想定 さ れ る 場合、 2 個のブ ロ ッ ク を連結 し ておけば、 1 個目のブ ロ ッ ク がいっぱいにな っ て も 、 残 り は 2 個目のブ ロ ッ ク へ流 し 込ま れます。 PPS は、 PDF_fill_textblock( ) と ブ ロ ッ ク プ ロ パテ ィ に与え ら れた テ キ ス ト か ら 、 1 個の テ キ ス ト フ ロ ーを内部的に作成 し ます。 連結 さ れていないブ ロ ッ ク の場合は、 こ のテ キ ス ト フ ロ ーはそのブ ロ ッ ク 内に配置 さ れ、その照応す る テ キ ス ト フ ロ ーハン ド ルは呼び出 し が終わっ た時点で削除 さ れ、 あふれたテ キ ス ト は失われます。 連結 さ れた テ キ ス ト フ ロ ーの場合は、 最初のブ ロ ッ ク へ流 し 込んだ後に余っ てい る あ ふれテ キ ス ト を、 その次のブ ロ ッ ク へ流 し 込む こ と がで き ます。 最初のテ キ ス ト フ ロ ーの 余 り がブ ロ ッ ク 内容 と し て使われ、 新たなテ キ ス ト フ ロ ーは作成 さ れません。 テ キ ス ト フ ロ ーブ ロ ッ ク の連結は以下の よ う に動作 し ます : > 連結 さ れたテ キ ス ト ブ ロ ッ ク のチ ェーンの中の最初の PDF_fill_textblock( ) を呼び出す 時は、 textflowhandle オプシ ョ ンに値 -1 (PHP の場合 : 0) を与え る 必要があ り ます。 内部的に作成 さ れたテ キ ス ト フ ロ ーハン ド ルを PDF_fill_textblock( ) が返 し ますので、ア プ リ ケーシ ョ ン側で こ れを保持 し てお く 必要があ り ます。 382 第 12 章 : PPS と PDFlib Block Plugin > PDF_fill_textblock( ) への次の呼び出 し では、前段で返 さ れたテ キ ス ト フ ロ ーハン ド ルを textflowhandle オプシ ョ ンに与え る こ と がで き ます ( こ の と き text 引数にテ キ ス ト を 与えて も 無視 さ れ る ので、 空にす る べ き です)。 ブ ロ ッ ク へ、 テ キ ス ト フ ロ ーの余 り が 流 し 込まれます。 > こ の処理を、 さ ら な る テ キ ス ト フ ロ ーブ ロ ッ ク 群に対 し て繰 り 返す こ と がで き ます。 > 返 さ れたテ キ ス ト フ ロ ーハン ド ルは、PDF_info_textflow( ) に与えれば、ブ ロ ッ ク 流 し 込 みの結果を知 る こ と がで き ます。 終了状況やテ キ ス ト の終了位置な ど がわか り ます。 なお、 fitmethod プ ロ パテ ィ は clip に設定す る 必要があ り ます (textflowhandle を与え て い る と き はど のみち こ れがデフ ォ ル ト です) 。 テ キ ス ト フ ロ ーブ ロ ッ ク を連結す る基本的 な コ ー ド 断片は以下の よ う にな り ます : p.fit_pdi_page(page, 0.0, 0.0, ""); tf = -1; for (i = 0; i < blockcount; i++) { String optlist = "encoding=winansi textflowhandle=" + tf; int reason; tf = p.fill_textblock(page, blocknames[i], text, optlist); text = null; if (tf == -1) break; /* いちばん最近のfit_textflow()呼び出しの結果をチェック */ reason = (int) p.info_textflow(tf, "returnreason"); result = p.get_string(reason, ""); /* テキストが全部配置されたならループを抜ける */ if (result.equals("_stop")) { p.delete_textflow(tf); break; } } ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの blocks/linked_textblocks ト ピ ッ ク にあ り ます。 ブ ロ ッ ク の流 し 込み順序 ブ ロ ッ ク 関数群 PDF_fill_*block( ) は、 プ ロ パテ ィ と ブ ロ ッ ク 内 容を、 以下の順序で処理 し ます : > 背景:backgroundcolor プ ロ パテ ィ が存在 し 、かつ None 以外のカ ラ ースペース キーワー ド を持っ てい る と き は、 ブ ロ ッ ク 領域は指定 さ れた色で塗 ら れます。 > 枠線 :bordercolor プ ロ パテ ィ が存在 し 、かつ None 以外のカ ラ ースペース キーワー ド を 持っ てい る と き は、 ブ ロ ッ ク の枠は指定 さ れた色 と 線幅で描線 さ れます。 > 内容 : 与え ら れたブ ロ ッ ク 内容 と 、 bordercolor ・ linewidth 以外のすべてのプ ロ パテ ィ が処理 さ れます。 > テ キ ス ト 行 ・ テ キ ス ト フ ロ ーブ ロ ッ ク : テ キ ス ト も デフ ォ ル ト テ キ ス ト も 与え ら れて いない と き は、 何の出力 も 行われません。 背景色やブ ロ ッ ク の枠線 も あ り ません。 ネ ス ト さ れた ブ ロ ッ ク ブ ロ ッ ク へ流 し 込みを行 う 前には、 そのブ ロ ッ ク を含むページ を出力ページ上に まず貼 り 付け る 必要があ り ます (そ う でない と 、 ページ を拡縮 ・ 回転 ・ 平行移動 し た後のブ ロ ッ ク の位置を PPS が知 り え ないため)。 ページ をブ ロ ッ ク の コ ン テ 12.5 PPS で ブ ロ ッ ク へ流 し 込み 383 ナ と し てのみ使っ てお り 、 静的内容を新ページへ コ ピー し な く て よ い場合には、 取 り 込ん だページ を、 blind オプシ ョ ン を用いて貼 り 付け る こ と がで き ます。 取 り 込んだページ を、 ど の よ う な方法で出力ページ上に貼 り 付けて も 、 ブ ロ ッ ク への 流 し 込みは行 う こ と がで き ます : > ページは、 PDF_fit_pdi_page( ) で直接貼 り 付け る こ と がで き ます。 > ページは、 テーブルセル内に PDF_fit_table( ) で間接的に貼 り 付け る こ と がで き ます。 > ページは、他の PDF ブ ロ ッ ク の内容 と し て PDF_fill_pdfblock( ) で貼 り 付け る こ と がで き ます。 こ の 3 番目の方法、 すなわち PDF ブ ロ ッ ク へ、 ブ ロ ッ ク を含む他のページ を流 し 込む と い う 方法を用い る と 、 ブ ロ ッ ク コ ン テナ を ネ ス ト す る こ と がで き ま す。 こ れを活用す る と 、 面白い使い方を簡単に実装で き ます。 た と えば、 2 段階のブ ロ ッ ク 流 し 込み処理で、 組み付け と パー ソ ナ ラ イ ゼーシ ョ ンの両方を実装する こ と がで き ます : > 第一層のブ ロ ッ ク コ ン テナページには、い く つかの大 き な PDF ブ ロ ッ ク を置 き ます。こ れ ら は、 印刷す る 紙の上の主要な領域を表 し てい ます。 PDF ブ ロ ッ ク の配置は、 想定 し てい る 紙の後工程を反映 し てい ます (折 り ・ 断裁等)。 > こ の第一層の PDF ブ ロ ッ ク それぞれへ、第二層の コ ン テナ PDF ページ を流 し 込みます。 こ の PDF ページには、 テ キ ス ト ・ 画像 ・ PDF ・ グ ラ フ ィ ッ ク の う ちのいずれかのブ ロ ッ ク を置いてお き 、 それ ら へ可変テ キ ス ト を流 し 込んでパー ソ ナ ラ イ ゼーシ ョ ン を行い ます。 こ の方法で、 ブ ロ ッ ク コ ン テナはネ ス ト す る こ と がで き ます。 ブ ロ ッ ク のネ ス ト は何重で も 可能ですが、 三重以上のネ ス ト が必要にな る こ と は まれで し ょ う 。 こ の第二層のブ ロ ッ ク コ ン テナ (レ タ ーのテ ン プ レー ト ページ な ど) は、 各組み付け ページで同 じ にす る こ と も で き ます し 、 別の も のにす る こ と も で き ます。 も し 同 じ に し た 場合は、 ま ずレ タ ーテ ン プ レ ー ト 上のブ ロ ッ ク 群への流 し 込みを行な っ てか ら 、 その レ タ ーテ ン プ レー ト 自体を次の第一層ブ ロ ッ ク 内に貼 り 付け る 必要があ り ます。 なぜな ら 、 PPS はつねに、 テ ンプ レー ト ページが も っ と も 最近に配置 さ れた位置を用い る か ら です。 ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の blocks/nested_blocks ト ピ ッ ク にあ り ます。 ブ ロ ッ ク の座標 ブ ロ ッ ク の長方形の座標は、 PDF のデフ ォ ル ト 座標系を参照 し てい ま す。ブ ロ ッ ク を含んだページ を PPS で出力ページに配置す る と き には、PDF_fit_pdi_page( ) に対 し てい く つかの位置付け ・ 拡縮オプシ ョ ン を与え る こ と がで き ま す。 こ れ ら のオプ シ ョ ンは、 そのブ ロ ッ ク が処理 さ れ る 際に考慮 さ れます。 こ れを利用す る と 、 1 つのテ ン プ レー ト ページ を出力ページ上に何度で も 配置 し て、そのたびにそのブ ロ ッ ク 群へデー タ を流 し 込む こ と がで き ます。 た と えば 1 枚の組み付け紙上に、 1 つの名刺テ ンプ レー ト を 4 回配置す る と い っ た こ と が可能です。 ブ ロ ッ ク 関数群は、 座標系の変換を正 し く 行い、 すべてのブ ロ ッ ク に対 し て、 それがページ上に配置 さ れ る たびに、 正 し く テ キ ス ト を配置 し ま す。 ク ラ イ ア ン ト に求め ら れ る のはただ、 ページ を配置 し て、 そ し て その配置 し た ページ上のすべてのブ ロ ッ ク を処理す る こ と だけです。 以後はそのページ を、 出力ページ 上の他の場所に配置 し た う えで、その新 し い場所に対 し て さ ら にブ ロ ッ ク 処理操作を行 う こ と がで き 、 こ れを繰 り 返 し てい く こ と が可能です。 Block Plugin におけ る ブ ロ ッ ク 座標の表示の さ れかたは、 PDF フ ァ イ ル内に格納 さ れて い る も の と は異な っ てい ま す。 プ ラ グ イ ン では Acrobat の方式を用いて、 座標の原点を ページの左上隅に置いてい ま すが、 内部座標 (ブ ロ ッ ク 内に格納 さ れてい る も の) では PDF の方式を用いて、 座標の原点をページの左下隅に置いてい る ためです。 プ ロ パテ ィ ダ イ ア ロ グの座標表示は、 Acrobat で指定 さ れてい る 単位に も 従い ます (365 ページ 「ブ ロ ッ ク のサ イ ズ と 位置」 参照)。 384 第 12 章 : PPS と PDFlib Block Plugin ブ ロ ッ ク プ ロパテ ィ で スポ ッ ト カ ラ ー ブ ロ ッ ク プ ロ パテ ィ で特色 (ス ポ ッ ト カ ラ ー) を 使 う には、 「...」 を ク リ ッ ク すれば、 HKS ・ Pantone ス ポ ッ ト カ ラ ーの全一覧を表示 さ せ る こ と がで き ます。 こ れ ら のカ ラ ー名は PPS に内蔵 さ れてお り (90 ページ 「3.4.2 Pantone ・ HKS ・ カ ス タ ム ス ポ ッ ト カ ラ ー」 参照) 、 それ以上の準備な し に使用で き ます。 カ ス タ ム ス ポ ッ ト カ ラ ーに対 し ては、 Block Plugin で代替色を定義す る こ と が可能です。 ブ ロ ッ ク プ ロ パ テ ィ で 代替色 を 指定 し て い な い と き は、 PPS アプ リ ケーシ ョ ン で PDF_ makespotcolor( ) を用いて カ ス タ ム ス ポ ッ ト カ ラ ーを あ ら か じ め定義 し てお く 必要があ り ます。 そ う でない と ブ ロ ッ ク への流 し 込みは失敗 し ます。 12.5 PPS で ブ ロ ッ ク へ流 し 込み 385 12.6 ブ ロ ッ ク のプ ロパテ ィ PPS と Block Plugin では、 ど の種類のブ ロ ッ ク に対 し て も 適用す る こ と ので き る一般プ ロ パテ ィ 群が用意 さ れてい ます。 そのほかに、 ブ ロ ッ ク の種類 「テキス ト 行」 ・ 「テキス ト フ ロー」 ・ 「画像」 ・ 「PDF」 ・ 「グ ラ フ ィ ッ ク」 にそれぞれ特有のプ ロ パテ ィ 群 も あ り ます。 プ ロ パテ ィ は、 ハン ド ル と ア ク シ ョ ン リ ス ト を除いて、 オプシ ョ ン リ ス ト と 同 じ デー タ 型に対応 し てい ます。 ブ ロ ッ ク プ ロ パテ ィ の名前は一般に、 PDF_fit_textline( ) ・ PDF_fit_image( ) と い っ た API 関数に対する オプシ ョ ン と 同 じ です (fitmethod ・ charspacing 等)。 その場合、 それぞれの 動作は、 対応す る オプシ ョ ンの解説に書いて あ る も の と ま っ た く 同 じ です。 12.6.1 管理プ ロパテ ィ 管理プ ロ パテ ィ 群は、 すべての種類のブ ロ ッ ク に適用 さ れます。 必須エン ト リ 群は Block Plugin に よ っ て自動生成 さ れます。 表 12.4 に、 管理プ ロ パテ ィ の一覧を示 し ます。 表 12.4 管理プ ロパテ ィ キーワー ド と り う る値 ・ 解説 Description (文字列) ブ ロ ッ クの機能に関する、 人が読める説明。 エ ン コ ーデ ィ ングは PDFDocEncoding か Unicode (後者の場合は先頭 BOM)。 こ のプ ロパテ ィ は、 ユーザーへの情報提供のためだけにあ り 、 PPS には無視 さ れます。 Locked (論理値) true な ら、 ブ ロ ッ ク と そのプ ロパテ ィ は Block Plugin で編集で き ません。 こ のプ ロパ テ ィ は PPS には無視 さ れます。 デ フ ォ ル ト : false Name (文字列、 必須) ブ ロ ッ クの名前。 ブ ロ ッ ク 名は、 ページ ご と に一意である必要があ り ますが、 文 書内では一意で な く て もかまいません。 3 種のキ ャ ラ ク タ [ ] / は、 ブ ロ ッ ク名には使え ません。 ブ ロ ッ ク名は最長 125 文字です。 Subtype (キーワー ド 、 必須) ブ ロ ッ ク の種類によ っ て、 Text ・ Image ・ PDF・Graphics のいずれか。 テキス ト 行ブ ロ ッ ク と テキス ト フ ローブ ロ ッ ク は、 と も に Subtype が Text にな る こ と に留意 し て く だ さ い。 両者は textflow プ ロパテ ィ によ っ て識別 さ れます。 textflow (論理値) 一行処理か複数行処理かを制御 し ます。 こ のプ ロパテ ィ は、 Block Plugin のユーザー イ ン タ フ ェ ースでは表示 さ れず、 それぞれテキス ト 行ブ ロ ッ ク と テキス ト フ ローブ ロ ッ ク へマ ッ プ さ れます (デ フ ォ ル ト : false) : Type 386 false テキス ト 行ブ ロ ッ ク : テキス ト が一行で組まれ、 PDF_fit_textline( ) で処理 さ れます。 true テキス ト フ ローブ ロ ッ ク : テキス ト が複数行にわた る場合があ り 、 PDF_fit_textflow( ) で 処理 さ れます。 標準テキス ト プ ロパテ ィ 群に加え、 テキス ト フ ロー関連のプ ロパテ ィ 群 も 指定で き ます (表 12.9 参照)。 (キーワー ド 、 必須) つねに Block 第 12 章 : PPS と PDFlib Block Plugin 12.6.2 長方形プ ロパテ ィ 長方形プ ロ パテ ィ 群は、 すべての種類のブ ロ ッ ク に適用 さ れます。 こ れ ら は、 ブ ロ ッ ク の 長方形本体の書式を記述 し ます。 必須エン ト リ 群は Block Plugin に よ っ て自動生成 さ れま す。 表 12.5 に、 長方形プ ロ パテ ィ の一覧を示 し ます。 表 12.5 長方形プ ロパテ ィ キーワー ド と り う る値 ・ 解説 background- (色) こ のプ ロパテ ィ が存在 し 、 かつ None 以外の色空間キーワー ド を持つな らば、 長方形が描か color れ、 与え られた色で塗 られます。 既存のページ内容をおおい隠 し たい と き に有用です。 デ フ ォ ル ト : None bordercolor (色) こ のプ ロパテ ィ が存在 し 、 かつ None 以外の色空間キーワー ド を持つな らば、 長方形が描か れ、 与え られた色で描線 さ れます。 デ フ ォ ル ト : None linewidth (float。 正の値でなければな ら ない) ブ ロ ッ クの長方形を描 く のに用いる線の描線幅。 bordercolor 設定時のみ有効です。 デ フ ォ ル ト : 1 Rect (長方形、 必須) ブ ロ ッ ク の座標。 座標原点はページ左下隅。 ただ し Block Plugin では、 座標は Acrobat の方式で、 すなわちページ左上隅を原点 と し て表 さ れます。 座標の単位は、 Acrobat でそ の時点で選択 さ れている単位で表示 さ れますが、 PDF フ ァ イル内部ではつねにポ イ ン ト 単位で格 納 さ れています。 Status (キーワー ド ) PPS と ブ ロ ッ ク 機能がブ ロ ッ ク を処理する方法を記述 し ます (デ フ ォ ル ト : active) : active ブ ロ ッ ク は、 そのプ ロパテ ィ に従っ て完全に処理 さ れます。 ignore ブ ロ ッ ク は無視 さ れます。 ignoredefault defaulttext/image/pdf/graphics プ ロパテ ィ ・ オプ シ ョ ンが無視 さ れる、 すなわち可 変内容がない と き (特にプ レ ビ ュ ーで) ブ ロ ッ ク が空のま まにな る点を除き、 active と 同 じ です。 こ れは特に、 ブ ロ ッ ク がプ レ ビ ュ ー生成のためのデ フ ォ ル ト 内容を持 っ て い るかも し れないけれど も、 サーバサイ ド で ブ ロ ッ クへ流 し 込みが行われる際にはその ブ ロ ッ ク のデ フ ォ ル ト 内容が用い ら れない よ う に し たい と き に有用です。 また、 ブ ロ ッ ク を プ レ ビ ュ ーする際に も、 ブ ロ ッ ク プ ロパテ ィ から デ フ ォル ト 内容を削除する こ と な く デ フ ォ ル ト 内容を無効化する ために用い る こ と がで き ます。 static 可変内容が配置 さ れません。 ブ ロ ッ ク にデ フ ォル ト のテキス ト ・ 画像 ・ PDF ・ グ ラ フ ィ ッ ク 内容があれば、 それが用い られます。 12.6 ブ ロ ッ クのプ ロパテ ィ 387 12.6.3 書式プ ロパテ ィ 書式プ ロ パテ ィ 群は、 組版の詳細を指定 し ます : > 表 12.6 に、 透過書式プ ロ パテ ィ の一覧を示 し ます。 こ れ ら は、 すべての種類のブ ロ ッ ク に適用 さ れます。 > 表 12.7 に、 テ キ ス ト 書式プ ロ パテ ィ の一覧を示 し ます。 こ れ ら は、 テ キ ス ト 行ブ ロ ッ ク と テ キ ス ト フ ロ ーブ ロ ッ ク に適用 さ れます。 表 12.6 すべてのブ ロ ッ ク種別に対する透過書式プ ロパテ ィ キーワー ド と り う る値 ・ 解説 blendmode (キーワー ド リ ス ト 。 PDF/A-1 モー ド で用い られる と きは値 Normal を持つ必要があ り ます) ブ レ ン ド モー ド の名前 : None・Color・ColorDodge・ColorBurn・Darken・Difference・Exclusion・ HardLight・Hue・Lighten・Luminosity・Multiply・None・Normal・Overlay・Saturation・ Screen・SoftLight。 デ フ ォ ル ト : None opacityfill (float。 PDF/A モー ド で用い られる と きは値 1 を持つ必要があ り ます) 塗 り 操作の不透明度を範囲 0 ~ 1 で表 し た もの。 値 0 は完全透過を意味 し 、 1 は完全不透過を意味 し ます。 opacitystroke (float。 PDF/A モー ド で用い られる と きは値 1 を持つ必要があ り ます) 描線操作の不透明度を範囲 0 ~ 1 で表 し た もの。 値 0 は完全透過を意味 し 、 1 は完全不透過を意味 し ます。 388 第 12 章 : PPS と PDFlib Block Plugin 表 12.7 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク に対する テキス ト 書式プ ロパテ ィ キーワー ド と り う る値 ・ 解説 charspacing (float またはパーセ ン ト 値) 文字間隔。 パーセ ン ト 値は fontsize に対する割合。 デ フ ォ ル ト : 0 decorationabove (論理値) true の場合、 underline ・ strikeout ・ overline オプ シ ョ ン で有効に さ れた テキス ト 装 飾がテキス ト の前面に描かれ、 そ う で なければテキス ト の背面に描かれます。 描画順序を変え る と 、 装飾線の書式に影響を与え ます。 デ フ ォル ト : false fillcolor (色) テキス ト の塗 り 色。 デ フ ォ ル ト : gray 0 (= 黒) 1 fontname (文字列) フ ォ ン ト の名前。 PDF_load_font( ) が求める も の と 同 じ です。 Block Plugin では、 シ ス テム で利用可能な フ ォ ン ト の一覧が表示 さ れます。 ただ し こ う し た フ ォ ン ト 名は、 OS X ・ Windows ・ Unix シ ス テム間で互換 と は限 り ません。 fontname の先頭が 「@」 キ ャ ラ ク タ であ る場合は、 その フ ォ ン ト は縦書き モー ド で適用 さ れます。 ブ ロ ッ ク への流 し 込み時には、 PDF_fill_textblock( ) にオプ シ ョ ン と し て テキス ト のエ ン コ ーデ ィ ン グ を与え る必要があ り ます。 ただ し 、 font オプ シ ョ ンが与え られてい る場合は除き ます。 fontsize1 (float) 文字のサイ ズをポ イ ン ト 単位で指定 し ます horizscaling (float またはパーセ ン ト 値) テキス ト の横伸縮。 デ フ ォ ル ト : 100% italicangle (float) テキス ト の斜体角度を度単位で表 し た もの。 デ フ ォル ト : 0 kerning (論理値) カ ーニ ングの動作。 デ フ ォ ル ト : false overline (論理値) 上線のモー ド 。 デ フ ォ ル ト : false shadow (複合) 影付き効果を生み出 し ます (デ フ ォ ル ト : 影な し )。 以下のサブ プ ロパテ ィ が使用可能で す: fillcolor (色) 影の色。 デ フ ォ ル ト : {gray 0.8} offset (float 2 個かパーセ ン ト 値 2 個の リ ス ト ) テキス ト の参照点か らの影のオ フ セ ッ ト を、 ユーザー座標で、 または文字サイ ズに対するパーセ ン ト 値で表 し た も の。 デ フ ォル ト : {5% -5%} strikeout (論理値) 取 り 消 し 線のモー ド 。 デ フ ォ ル ト : false strokecolor (色) テキス ト の描線色。 デ フ ォ ル ト : gray 0 (= 黒) strokewidth (float ・ パーセ ン ト 値 ・ キーワー ド のいずれか。 textrendering が袋文字に設定 さ れてい る と きの み意味を持ち ます) 袋文字の線幅 (ユーザー座標で、 または percentage に対するパーセ ン ト 値 で)。 キーワー ド auto、またはそれ と 等価な値 0 は、 内蔵のデ フ ォ ル ト を用います。 デ フ ォ ル ト : auto textrendering (整数) テキス ト 表現モー ド 。 Type 3 フ ォ ン ト では値 3 のみ意味を持ち ます (デ フ ォル ト : 0) : 0 P 1 2 3 P テキス ト を塗る 4 テキス ト を塗 り 、 ク リ ッ ピ ングパスに追加 テキス ト を描線 (袋文字) 5 テキス ト を描線 し 、 ク リ ッ ピ ングパスに追加 テキス ト を塗っ て描線 6 テキス ト を塗 っ て描線 し 、 ク リ ッ ピ ングパスに追加 不可視テキス ト 7 テキス ト を ク リ ッ ピ ングパスに追加 (ブ ロ ッ ク では不可) textrise (float またはパーセ ン ト 値) テキス ト の縦方向のオ フ セ ッ ト 。 パーセ ン ト 値は fontsize に対する 割合。 デ フ ォル ト : 0 underline (論理値) 下線のモー ド 。 デ フ ォ ル ト : false 12.6 ブ ロ ッ クのプ ロパテ ィ 389 表 12.7 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク に対する テキス ト 書式プ ロパテ ィ キーワー ド と り う る値 ・ 解説 underlineposition (float ・ パーセ ン ト 値 ・ キーワー ド のいずれか) 下線テキス ト のベース ラ イ ンに対する描線の相対 位置。 パーセ ン ト 値は fontsize に対する割合。 デ フ ォル ト : auto underlinewidth (float ・ パーセ ン ト 値 ・ キーワー ド のいずれか) 下線テキス ト の線幅。 パーセ ン ト 値は fontsize に 対する割合。 デ フ ォ ル ト : auto wordspacing (float またはパーセ ン ト 値) 単語間隔。 パーセ ン ト 値は fontsize に対する割合。 デ フ ォル ト : 0 1. こ のプ ロパテ ィ は、 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク では必須です。 Block Plugin は こ れを自動生成 し ます。 390 第 12 章 : PPS と PDFlib Block Plugin 12.6.4 テキス ト 作成プ ロパテ ィ テ キ ス ト 作成プ ロ パテ ィ 群は、 テ キ ス ト 行 ・ テ キ ス ト フ ロ ーブ ロ ッ ク の前処理工程を指定 し ます。 表 12.8 に、 テ キ ス ト 行 ・ テ キ ス ト フ ロ ーブ ロ ッ ク に適用 さ れ る テ キ ス ト 作成プ ロ パテ ィ の一覧を示 し ます。 表 12.8 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク に対する テキス ト 作成プ ロパテ ィ キーワー ド と り う る値 ・ 解説 charref (論理値) true な ら、 数値参照 ・ 文字参照 ・ グ リ フ 名参照の置き換え を行います。 デ フ ォル ト : グ ローバルな charref オプ シ ョ ン escapesequence (論理値) true な ら、 内容文字列 ・ ハイパーテキス ト 文字列 ・ 名前文字列内のエ スケープ シーケ ン スの置き換え を行います。 デ フ ォ ル ト : グ ローバルな escapesequence オプ シ ョ ン features (キーワー ド の リ ス ト ) script ・ language オプ シ ョ ンに従っ て、 OpenType フ ォ ン ト のどの タ イ ポ グ ラ フ ィ 機能を テキス ト に適用するかを指定 し ます。 フ ォ ン ト 内に存在 し ない機能に対するキー ワー ド は、 エ ラ ーを出 さ ずに無視 さ れます。 以下のキーワー ド を与え る こ と がで き ます : _none フ ォ ン ト 内のどの機能 も適用 し ません。 ただ し vert 機能だけは、 novert キーワー ド で 明示的に無効化する必要があ り ます。 < 名前 > 4 文字の OpenType タ グ名を与えてその機能を有効に し ます。 よ く 用い ら れる機能名は liga ・ ital ・ tnum ・ smcp ・ swsh ・ zero です。 利用で き るすべての機能の名前 と 説明の 全一覧は、 158 ページ 「6.3.1 対応 し ている OpenType レ イ アウ ト 機能」 に示 し ていま す。 no< 名前 > 機能名の前に接尾辞 no をつける と (noliga 等) その機能が無効化 さ れます。 デ フ ォル ト : 横書き モー ド では _none。 縦書き モー ド では vert が自動的に適用 さ れます。 OpenType 機能を利用する には、 PDF_load_font( ) で readfeatures オプ シ ョ ンが必須です。 language (キーワー ド 。 script が与え ら れてい る と きのみ意味を持ち ます) 指定 さ れた言語に従っ て テキス ト が処理 さ れます。 こ れは features ・ shaping オプ シ ョ ン に対 し て意味を持ち ます。 キーワー ド の全一覧は 167 ページ 「6.4.2 用字系 と 言語」 に示 し ています。 例 : ARA (ア ラ ビ ア語) ・ JAN (日本 語) ・ HIN ( ヒ ンデ ィ ー語)。 デ フ ォ ル ト : _none (言語未定義) script (キーワー ド 。 shaping=true の と きは必須) 指定 さ れた用字系に従 っ て テキス ト が処理 さ れます。 こ れは features ・ shaping ・ advancedlinebreak オプ シ ョ ンに対 し て意味を持ち ます。 用字系 と し て も っ と も よ く 用い ら れるキーワー ド は次の と お り です : _none (未定義用字系) latn ・ grek ・ cyrl ・ armn ・ hebr ・ arab ・ deva ・ beng ・ guru ・ gujr ・ orya ・ taml ・ thai ・ laoo ・ tibt ・ hang ・ kana ・ han。 キーワー ド _auto を指定する と 、 テキス ト 内のキ ャ ラ ク タ の多数が属する用字系が選 ばれますが、 ただ し _latn と _none は無視 さ れます。 キーワー ド の全一覧は 167 ページ 「6.4.2 用 字系 と 言語」 に示 し ています。 デ フ ォル ト : _none shaping (論理値) true な ら、 script ・ language オプ シ ョ ンに従っ て文字の字形選択 (シ ェ ーピ ング) が 行われます。 script オプ シ ョ ンが _none 以外の値を持つ必要があ り 、 かつ、 必要な シ ェ ーピ ング テーブルがフ ォ ン ト 内に存在 し てい る必要があ り ます。 デ フ ォ ル ト : false 12.6 ブ ロ ッ クのプ ロパテ ィ 391 12.6.5 テキス ト 組版プ ロパテ ィ 表 12.9 に、 テ キ ス ト フ ロ ーブ ロ ッ ク に対 し てのみ用い る こ と がで き る テ キ ス ト 組版プ ロ パテ ィ の一覧を示 し ます。 ただ し stamp プ ロ パテ ィ だけは、 テ キ ス ト 行ブ ロ ッ ク に対 し て も 用い る こ と がで き ます。 こ れ ら は、 テ キ ス ト フ ロ ーを処理す る ための初期オプシ ョ ン リ ス ト を構築す る ために用い ら れます (PDF_create_textflow( ) の optlist 引数に照応 し てい ま す) 。 テ キ ス ト フ ロ ーで用い る イ ン ラ イ ンオプシ ョ ン リ ス ト は、 プ ラ グ イ ンでは指定す る こ と がで き ず、 サーバ上で PDF_fill_textblock( ) に よ る ブ ロ ッ ク への流 し 込みの際に、 ま た はブ ロ ッ ク の defaulttext プ ロ パテ ィ 内で、 テ キ ス ト 内容の一部 と し て与え る こ と がで き ます。 表 12.9 主にテキス ト フ ローブ ロ ッ ク に対する テキス ト 組版プ ロパテ ィ キーワー ド と り う る値 ・ 解説 adjustmethod (キーワー ド ) minspacing ・ maxspacing オプ シ ョ ン で指定 さ れた制限内で単語間隔を詰めた り 拡げ た り し て も テキス ト の一部が行内に収ま ら ない時、 行の調整に用い る方式 (デ フ ォル ト : auto) : auto 次の方式を順に適用 し ます : shrink ・ spread ・ nofit ・ split。 clip はめ込み枠の右端 (rightindent オプ シ ョ ン を考慮) から はみ出 し た部分を切 り 落 と す 点を除いて、 nofit と 同 じ 。 nofit 最後の単語を次行へ送 り ます。 ただ し 、 残 さ れる (短い) 行が、 nofitlimit オプ シ ョ ン で指定 さ れたパーセ ン ト 値よ り も短 く な ら ない場合に限 り ます。 均等配置の段落で あ っ て も 、 若干がたついて見え る こ と があ り ます。 shrink 単語が行内に収ま ら ない と き、 テキス ト を shrinklimit の制限内で圧縮 し ます。 それで も 収ま ら なければ nofit 方式を適用 し ます。 split 最後の単語を次行へ送ら ず、 強制的にハイ フ ネーシ ョ ン し ます。 テキス ト フ ォ ン ト な ら ハイ フ ンキ ャ ラ ク タ を挿入 し ますが、 記号フ ォ ン ト な ら挿入 し ません。 spread 最後の単語を次行へ送 り 、 残 さ れた (短い) 行を均等配置する よ う 単語内の文字間の間 隔を spreadlimit の制限内で拡げます。 それで均等配置で き なければ nofit 方式を適用 し ます。 advancedlinebreak (論理値) 複雑用字系で必要 と さ れる高度な改行アルゴ リ ズムを適用 し ます。 こ れは タ イ語等、 単 語間の区切 り を空白キ ャ ラ ク タ を用いて示 さ ない用字系での改行に必須です。 locale ・ script オ プ シ ョ ンに従います。 デ フ ォ ル ト : false alignment (キーワー ド ) 段落内の行の書式を指定。 デ フ ォル ト : left。 left 左揃え (leftindent を始点 と し て)。 center 中央揃え (leftindent から rightindent ま での間で)。 right 右揃え (rightindent を終点 と し て)。 justify 両端揃え。 avoidemptybegin (論理値) true な ら、 はめ込み枠先頭の空行が削除 さ れます。 デ フ ォ ル ト : false fixedleading (論理値) true な ら、 各行内で最初に見つかっ た行送 り 値を用います。 そ う で ないな ら、 行内のす べての行送 り 値の う ちの最大値を用います。 デ フ ォル ト : false hortabmethod (キーワー ド ) テキス ト 内の水平 タ ブの扱い。 算出位置がカ レ ン ト テキス ト 位置よ り 左の と きは、 その タ ブは無視 さ れます (デ フ ォ ル ト : relative) : relative hortabsize で指定 さ れた分、 位置を進めます。 typewriter hortabsize の次の倍数ま で位置を進めます。 ruler 392 ruler オプ シ ョ ン内の n 番目の タ ブ値ま で位置を進めます。 こ こ で n は、 その行内でそ れま でに見つか っ た タ ブの数です。 n が タ ブ位置の数を超え る分については、 relative 方式を適用 し ます。 第 12 章 : PPS と PDFlib Block Plugin 表 12.9 主にテキス ト フ ローブ ロ ッ ク に対する テキス ト 組版プ ロパテ ィ キーワー ド と り う る値 ・ 解説 hortabsize (float またはパーセ ン ト 値) 水平 タ ブの幅1。 その解釈は hortabmethod オプ シ ョ ンに依存 し ます。 デ フ ォル ト : 7.5% lastalignment (キーワー ド ) 段落内の最終行の書式。 alignment オプ シ ョ ンのすべてのキーワー ド を用いる こ と がで き るほか、 以下のキーワー ド も用い る こ と がで き ます (デ フ ォ ル ト : auto) : auto alignment オプ シ ョ ンの値を用います。 ただ し それが justify の と きは left を用いま す。 leading (float またはパーセ ン ト 値) テキス ト のベース ラ イ ン間の間隔。 ユーザー座標で、 または文字サイ ズに対するパーセ ン ト 値で指定 し ます。 デ フ ォ ル ト : 100% locale (キーワー ド ) advancedlinebreak=true の と き、 用字系特有の改行方式で用い られる ロ ケール。 キーワー ド は、 以下の 1 個ない し 複数の構成要素から 成 り 、 オプ シ ョ ナルな構成要素は下線キ ャ ラ ク タ 「_」 で区切 られます (その文法は、 NLS/POSIX のロ ケール ID と は若干異な っ ています) : > (必須) ISO 639-2 に従っ た、 小文字 2 文字または 3 文字の言語 コ ー ド (www.loc.gov/standards/ iso639-2 参照)。 例 : en (英語) ・ de ( ド イ ツ語) ・ ja (日本語)。 こ れは language オプ シ ョ ン と は異な っ ています。 > (オプ シ ョ ン) ISO 15924 に従っ た、 4 文字の用字系 コ ー ド (www.unicode.org/iso15924/iso15924codes.html 参照)。 例 : Hira (ひ ら がな) ・ Hebr (ヘブ ラ イ文字) ・ Arab (ア ラ ビ ア文字) ・ Thai ( タ イ文字)。 > (オプ シ ョ ン) ISO 3166 に従 っ た、 大文字 2 文字の国 コ ー ド (www.iso.org/iso/country_codes/iso_ 3166_code_lists 参照)。 例 : DE ( ド イ ツ) ・ CH (ス イ ス) ・ GB (イ ギ リ ス)。 ロケールを指定する こ と は、 高度な改行のために必須ではあ り ません : キーワー ド _none は、 ロ ケール独自の処理が行われない こ と を指定 し ます。 デ フ ォル ト : _none。 例 : de_DE ・ en_US ・ en_GB maxspacing minspacing (float またはパーセ ン ト 値) 単語間の最大間隔 ・ 最小間隔 (ユーザー座標で表すか、 空白キ ャ ラ ク タ の幅に対するパーセ ン ト 値で指定)。 算出 さ れる単語間隔が、 与え ら れた値ま でに制限 さ れます (ただ し 、 wordspacing オプ シ ョ ンはなお加算 さ れます)。 デ フ ォル ト : minspacing=50%、 maxspacing=500% minlinecount (整数) はめ込み枠の最終段落の最小行数。 こ れよ り 行が少ない と きは、 次のはめ込み枠内に配置 さ れます。 値 2 を用いる と 、 段落の中の 1 行だけがはめ込み枠末尾に配置 さ れる (「オー フ ァ ン」) のを避け られます。 デ フ ォル ト : 1 nofitlimit (float またはパーセ ン ト 値) nofit 方式における行の長 さ の下限 (ユーザー座標で表すか、 はめ込 み枠の幅に対するパーセ ン ト 値で指定)。 デ フ ォル ト : 75% parindent (float またはパーセ ン ト 値) 段落の先頭行の左イ ンデン ト 1。 leftindent に こ の値が加算 さ れま す。 このオプ シ ョ ン を行内で指定する と 、 タ ブのよ う に動作 し ます。 デ フ ォ ル ト : 0 rightindent leftindent (float またはパーセ ン ト 値) 全テキス ト 行の右イ ンデン ト ・ 左イ ンデン ト 1。 leftindent が行内で 指定 さ れた場合、 決定 さ れた位置がカ レ ン ト テキス ト 位置よ り 左の と きは、 こ のオプ シ ョ ンはカ レ ン ト 行については無視 さ れます。 デ フ ォ ル ト : 0 ruler2 (float の リ ス ト 、 ま たはパーセ ン ト 値の リ ス ト ) hortabmethod=ruler に対する絶対 タ ブ位置の リ ス ト 1。 この リ ス ト は、 非負エ ン ト リ を昇順で最大 32 個持て ます。 デ フ ォル ト : hortabsize の整数 倍 shrinklimit (パーセ ン ト 値) shrink 方式における テキス ト 長体の下限。 算出 さ れる縮小率が、 与え られた値ま でに制限 さ れます。 ただ し 、 horizscaling オプ シ ョ ンの値が乗算 さ れます。 デ フ ォ ル ト : 85% spreadlimit (float またはパーセ ン ト 値) spread 方式におけ る 2 文字間の間隔の上限 (ユーザー座標で表すか、 文字サイ ズに対するパーセ ン ト 値で指定)。 算出 さ れた文字間隔が、 charspacing オプ シ ョ ンの値 に加算 さ れます。 デ フ ォル ト : 0 12.6 ブ ロ ッ クのプ ロパテ ィ 393 表 12.9 主にテキス ト フ ローブ ロ ッ ク に対する テキス ト 組版プ ロパテ ィ キーワー ド と り う る値 ・ 解説 stamp (キーワー ド 。 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク) こ のオプ シ ョ ン を使 う と 、 ブ ロ ッ ク長方形 内の対角線上にス タ ン プ を作成する こ と がで き ます。 ス タ ン プのテキス ト は可能な限 り 拡大 さ れ て印字 さ れます。 ス タ ン プのテキス ト を枠内に配置する際には、 position ・ fitmethod ・ orientate (north ・ south のみ) オプ シ ョ ンに従います。 デ フ ォル ト : none。 ll2ur 左下隅か ら右上隅へ向か う 対角線上にス タ ン プが配置 さ れます。 ul2lr 左上隅か ら右下隅へ向か う 対角線上にス タ ン プが配置 さ れます。 none ス タ ン プは作成 さ れません。 tabalignchar (整数) タ ブの小数点揃えの整列位置に し たいキ ャ ラ ク タ の Unicode 値。 デ フ ォ ル ト : キ ャ ラ ク タ 「.」 (U+002E) tabalignment2 (キーワー ド の リ ス ト ) タ ブ位置の整列方式。 この リ ス ト 内の各エ ン ト リ はそれぞれ、 ruler オプ シ ョ ン内で、 その照応する エ ン ト リ の整列方式を定義 し ます (デ フ ォル ト : left) : center テキス ト は タ ブ位置で中央揃え さ れます。 decimal 最初に現れる tabalignchar を タ ブ位置で左揃え さ れます。 tabalignchar が見つか ら な い と きは右揃えが適用 さ れます。 left テキス ト は タ ブ位置で左揃え さ れます。 right テキス ト は タ ブ位置で右揃え さ れます。 1. ユーザー座標で、 ま たははめ込み枠の幅に対するパーセ ン ト 値で指定 し ます。 2. タ ブ設定は、 ブ ロ ッ ク プ ロパテ ィ ダ イ ア ロ グの「テキスト組版」グループの「hortabmethod=ruler におけるルーラタブ」サ ブグループ で編集する こ と がで き ます。 394 第 12 章 : PPS と PDFlib Block Plugin 12.6.6 オ ブ ジ ェ ク ト はめ込みプ ロパテ ィ はめ込みプ ロ パテ ィ 群は、 すべての種類のブ ロ ッ ク で利用で き ますが、 い く つかのプ ロ パ テ ィ は、 特定の種類のブ ロ ッ ク でのみ利用で き ます。 こ れ ら は、 ブ ロ ッ ク 内に内容が配置 さ れ る 方法を制御 し ます : > 表 12.10 に、 テ キ ス ト 行 ・ 画像 ・ PDF ・ グ ラ フ ィ ッ ク ブ ロ ッ ク で利用で き る はめ込みプ ロ パテ ィ の一覧を示 し ます。 > 表 12.11 に、テ キ ス ト フ ロ ーブ ロ ッ ク で利用で き る はめ込みプ ロ パテ ィ の一覧を示 し ま す (主に縦方向のはめ込みに関す る も のです)。 オブ ジ ェ ク ト はめ込みア ル ゴ リ ズ ム は、 ブ ロ ッ ク 長方形 を はめ込み枠 と し て用い ま す。 fitmethod=clip の場合を除 き 、 切 り 落 と し は行われません。 ブ ロ ッ ク 内容がブ ロ ッ ク 長方 形か ら はみ出 さ ない よ う に し たい と き は、 fitmethod=nofit を避けて く だ さ い。 表 12.10 テキス ト 行 ・ 画像 ・ PDF ・ グ ラ フ ィ ッ ク ブ ロ ッ ク に対するはめ込みプ ロパテ ィ キーワー ド と り う る値 ・ 解説 alignchar (Unichar またはキーワー ド 。 テキス ト 行ブ ロ ッ ク にのみ適用) 指定 さ れたキ ャ ラ ク タ を テキス ト 内に見つけた と き、 その左下隅を、 ブ ロ ッ ク長方形の左下隅に整列 さ せます。 横書き テキス ト で orientate=north か south の場合には、 position オプ シ ョ ンの 1 番目の値で位置を決定 し ます。 縦書き テキス ト で orientate=west か east の場合には、 position オプ シ ョ ンの 2 番目の値で位置 を決定 し ます。 指定 さ れた位置整列キ ャ ラ ク タ がテキス ト 内にない と きは、 こ のオプ シ ョ ンは無 視 さ れます。 値 0 かキーワー ド none ならば、 位置整列キ ャ ラ ク タ を無効に し ます。 fitmethod は 指定 さ れれば適用 し ますが、 alignchar で強制的に位置付け られるので、 はめ込み枠内にテキス ト 配置する こ と はで き ません。 デ フ ォ ル ト : none dpi (float の リ ス ト 。 画像ブ ロ ッ ク にのみ適用) 縦方向 ・ 横方向の画像解像度を表す 1 個ま たは 2 個の 値。 単位は pixels per inch。 値 0 の場合、 画像内部に解像度が格納 さ れていればそれを用い、 なけ れば 72 dpi と し ます。 fitmethod プ ロパテ ィ が指定 さ れていて、 そのキーワー ド が auto ・ meet ・ slice ・ entire のいずれかな らば、 本プ ロパテ ィ は無視 さ れます。 デ フ ォ ル ト : 0 fitmethod (キーワー ド ) 与え られた内容がブ ロ ッ ク長方形に収ま り き ら ない と きの解決方式。 と り う る値は auto ・ nofit ・ clip ・ meet ・ slice ・ entire。 テキス ト 行 ・ 画像 ・ PDF ・ グ ラ フ ィ ッ ク ブ ロ ッ ク につ いては、 こ のプ ロパテ ィ は標準的に解釈 さ れます (デ フ ォル ト : meet)。 テキス ト フ ローブ ロ ッ ク については、 ブ ロ ッ ク がテキス ト に対 し て小 さ すぎ る と きは、 以下のよ う に解釈 さ れます : auto テキス ト が収ま る ま で、 fontsize と leading を縮めます。 nofit テキス ト を ブ ロ ッ ク下端から はみ出 さ せます。 clip テキス ト を ブ ロ ッ クの端で切 り 落 と し ます。 margin (float の リ ス ト 。 テキス ト 行ブ ロ ッ ク にのみ適用) テキス ト 枠の縦 ・ 横方向の長 さ 差 し 引き を記述 する 1 個または 2 個の値。 デ フ ォル ト : 0 minfontsize (float またはパーセ ン ト 値。 テキス ト 行にのみ適用) fitmethod=auto で shrinklimit を超えた と き、 テキス ト がブ ロ ッ ク長方形に収ま る よ う 縮小 さ れる際に、 許 さ れる最小の文字サイ ズ。 下限 値を、 ユーザー座標で、 ま たはブ ロ ッ ク の高 さ に対するパーセ ン ト 値で指定 し ます。 下限に達 し た と きは、 テキス ト は指定 さ れた minfontsize を文字サイ ズ と し て作成 さ れます。 デ フ ォ ル ト : 0.1% orientate (キーワー ド ) 内容を配置する向き を指定 し ます。 と り う る値は north ・ east ・ south ・ west。 デ フ ォ ル ト : north 12.6 ブ ロ ッ クのプ ロパテ ィ 395 表 12.10 テキス ト 行 ・ 画像 ・ PDF ・ グ ラ フ ィ ッ ク ブ ロ ッ ク に対するはめ込みプ ロパテ ィ キーワー ド と り う る値 ・ 解説 position (float の リ ス ト ) 内容の中における参照点の位置を指定する、 1 個または 2 個の値。 ブ ロ ッ ク内で のパーセ ン ト 値 と し て位置を指定 し ます。 テキス ト 行ブ ロ ッ クのみ : キーワー ド auto を、 リ ス ト の 1 番目の値 と し て用いる こ と も で き ます。 こ れは、 テキス ト の筆記方向が右書きの場合 (ア ラ ビ ア文字 ・ ヘブ ラ イ文字等) には right を意味 し 、 そ う で ない場合 (欧文等) には left を意味 し ます。 デ フ ォ ル ト : {0 0}、 すなわち左下隅 rotate (float) 回転角を度単位で表 し た も の。 処理が始ま る前にブ ロ ッ クが反時計回 り に回転 さ れます。 参照点が回転の中心 と な り ます。 デ フ ォ ル ト : 0 scale (float の リ ス ト ) 縦方向 ・ 横方向の、 求める伸縮倍率を表す 1 個または 2 個の値。 fitmethod プ ロ パテ ィ が指定 さ れていて、 かつそのキーワー ド が auto ・ meet ・ slice ・ entire のいずれかな らば、 本プ ロパテ ィ は無視 さ れます。 デ フ ォル ト : 1 shrinklimit (float またはパーセ ン ト 値。 テキス ト 行ブ ロ ッ ク にのみ適用) fitmethod=auto で テキス ト を収める 際に適用 さ れる縮小倍率の下限。 デ フ ォ ル ト : 0.75 表 12.11 テキス ト フ ローブ ロ ッ ク に対するはめ込みプ ロパテ ィ キーワー ド と り う る値 ・ 解説 firstlinedist (float ・ パーセ ン ト 値 ・ キーワー ド のいずれか) ブ ロ ッ ク長方形上端 と テキス ト 先頭行ベース ラ イ ン と の間隔を、 ユーザー座標で表すか、 そ この文字サイ ズ (fixedleading=true な ら 行の先頭の文 字サイ ズ、 そ う でないな ら 行内のすべての文字サイ ズの う ちの最大値) に対するパーセ ン ト 値で 表すか、 キーワー ド で表 し た もの (デ フ ォ ル ト : leading)。 leading 先頭行について決定 さ れた行送 り 値。 ヒのよ う な、 読み分け記号付きの文字は普通、 は め込み枠上端に接する で し ょ う 。 ascender 先頭行について決定 さ れたア セ ン ダ値。 d や h のよ う な、 大き なアセ ン ダ を持つ文字は 普通、 はめ込み枠上端に接する で し ょ う 。 capheight 先頭行について決定 さ れたキ ャ ッ プハイ ト 値。 H のよ う な大文字は普通、 はめ込み枠上 端に接する で し ょ う 。 xheight 先頭行について決定 さ れた x ハイ ト 値。 x のよ う な小文字は普通、 はめ込み枠上端に接 する で し ょ う 。 fixedleading=false な ら、 先頭行内で見出 さ れたすべての leading ・ ascender ・ xheight ・ capheight 値の う ちの最大値が用い ら れます。 fitmethod 396 (キーワー ド ) 与え られた内容が枠に収ま り き ら ない と きの解決方式。 と り う る値は auto ・ nofit ・ clip。 デ フ ォ ル ト : auto。 テキス ト フ ローブ ロ ッ ク の場合、 ブ ロ ッ クがテキス ト に対 し て 小 さ すぎ る と きは、 以下のよ う に解釈 さ れます : auto テキス ト が収ま る ま で、 fontsize と leading を縮めます。 nofit テキス ト を ブ ロ ッ ク 下端か らはみ出 さ せます。 clip テキス ト を ブ ロ ッ ク の端で切 り 落 と し ます。 第 12 章 : PPS と PDFlib Block Plugin 表 12.11 テキス ト フ ローブ ロ ッ ク に対するはめ込みプ ロパテ ィ キーワー ド と り う る値 ・ 解説 lastlinedist (float ・ パーセ ン ト 値 ・ キーワー ド のいずれか。 fitmethod=nofit の と きは無視 さ れます) テキス ト 最終行ベース ラ イ ン と はめ込み枠下端 と の間隔を、 ユーザー座標で表すか、 文字サイ ズ (fixedleading=true な ら行の先頭の文字サイ ズ、 そ う でないな ら行内のすべての文字サイ ズの う ちの最大値) に対するパーセ ン ト 値で表すか、 キーワー ド で表 し た もの。 デ フ ォ ル ト : 0、 すなわ ちはめ込み枠下端をベース ラ イ ン と し て用い、 デ ィ セ ン ダは普通、 はめ込み枠の下へはみ出すで し ょ う。 descender 最終行について決定 さ れたデ ィ セ ン ダ値。 g や j のよ う な、 デ ィ セ ン ダ を持つ文字は普 通、 はめ込み枠下端に接する で し ょ う 。 fixedleading=false な ら 、 最終行内で見出 さ れたすべてのデ ィ セ ン ダ値の う ちの最大値が用い ら れます。 linespreadlimit (float またはパーセ ン ト 値。 verticalalign=justify の場合のみ) 上下合わせの場合に行送 り を増 やす際の最大値を、 ユーザー座標で表すか、 行送 り に対するパーセ ン ト 値で表 し た もの。 デ フ ォ ル ト : 200% maxlines (整数またはキーワー ド ) はめ込み枠内の最大行数。 あるいはキーワー ド auto を指定 し て、 で き る だけ多 く の行をはめ込み枠内に入れ さ せる こ と も で き ます。 最大行数が入っ た と き、 PDF_fit_ textflow( ) は文字列 _boxfull を返 し ます。 minfontsize (float またはパーセ ン ト 値) 特に fitmethod=auto の と き、 はめ込み枠に収ま る よ う テキス ト が縮 小 さ れる際に許 さ れる最小文字サイ ズ。 下限値を、 ユーザー座標で、 またははめ込み枠の高 さ に 対するパーセ ン ト 値で指定 し ます。 下限に達 し て も なおテキス ト が収ま り き ら ない と きは、 文字 列 _boxfull が返 さ れます。 デ フ ォ ル ト : 0.1% orientate (キーワー ド ) テキス ト を配置する向き を指定 し ます。 と り う る値は north ・ east ・ south ・ west。 デ フ ォル ト : north rotate (float) 回転角を度単位で表 し た もの。 はめ込み枠の左下隅を中心 と し て、 座標系を回転 さ せます。 こ れに よ っ て、 枠 と テキス ト が回転 さ れます。 テキス ト が配置 さ れた時点で回転は リ セ ッ ト さ れ ます。 デ フ ォル ト : 0 verticalalign (キーワー ド ) はめ込み枠内のテキス ト の縦揃え (デ フ ォ ル ト : top) : top 先頭行か ら下へ順に組版。 テキス ト がはめ込み枠に満たない と きは、 テキス ト の下に余 白があ き ます。 center はめ込み枠内の縦方向の中央にテキス ト を配置。 テキス ト がはめ込み枠に満たない と き は、 テキス ト の上下に余白があ き ます。 bottom 最終行か ら上へ順に組版。 テキス ト がはめ込み枠に満たない と きは、 テキス ト の上に余 白があ き ます。 justify はめ込み枠の上端 と 下端にテキス ト を合わせます。 それを実現する ために、 行送 り を増 や し ます。 ただ し 、 linespreadlimit で指定 さ れた限界ま で し か増や し ません。 先頭行 の高 さ は、 firstlinedist=leading の場合のみ増や し ます。 12.6 ブ ロ ッ クのプ ロパテ ィ 397 12.6.7 デ フ ォ ル ト 内容のためのプ ロパテ ィ デフ ォ ル ト 内容に関す る プ ロ パテ ィ 群は、内容が特に与え ら れなかっ た と き のブ ロ ッ ク へ の流 し 込みの方法を指定 し ます。 こ れ ら は と り わけプ レ ビ ュー機能で有用です。 なぜな ら プ レ ビ ュ ーではブ ロ ッ ク にへそのデフ ォ ル ト 内容を流 し 込むか ら です。 表 12.12 に、 デ フ ォ ル ト 内容に関す る プ ロ パテ ィ の一覧を示 し ます。 表 12.12 デ フ ォル ト 内容のためのプ ロパテ ィ キーワー ド と り う る値 ・ 解説 defaultgraphics (文字列。 グ ラ フ ィ ッ ク ブ ロ ッ ク にのみ適用) グ ラ フ ィ ッ クがク ラ イ ア ン ト ア プ リ ケーシ ョ ンか ら 与え ら れなか っ た と き に用い られるグ ラ フ ィ ッ ク フ ァ イルのパス名。1 defaultimage (文字列。 画像ブ ロ ッ ク にのみ適用) 置き換え画像がク ラ イ ア ン ト ア プ リ ケーシ ョ ンから 与え ら れ なかっ た と き に用い られる画像のパス名。 1 defaultpdf (文字列。 PDF ブ ロ ッ ク にのみ適用) 置き換え PDF が ク ラ イ ア ン ト ア プ リ ケーシ ョ ンから与え られ なかっ た と き に用い られる PDF 文書のパス名。 1 defaultpdfpage (整数。 PDF ブ ロ ッ ク にのみ適用) デ フ ォ ル ト PDF 文書内のページのページ番号。 デ フ ォル ト : 1 defaulttext (文字列。 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク にのみ適用) 可変テキス ト が ク ラ イ ア ン ト ア プ リ ケーシ ョ ンか ら与え られなかっ た と き に用い ら れる テキス ト 2 1. フ ァ イル名には絶対パス を付けず、 SearchPath 機能を利用する よ う 、 PPS ク ラ イ ア ン ト ア プ リ ケーシ ョ ン を作 っ てお く ほ う がよいで し ょ う 。 そ う すればブ ロ ッ ク 処理を、 プ ラ ッ ト フ ォ ームや フ ァ イルシ ス テムの細かい違いか ら 切 り 離す こ と がで き ます。 2. テキス ト は winansi エ ン コ ーデ ィ ン グか Unicode で解釈 さ れます。 12.6.8 カ ス タ ムプ ロパテ ィ カ ス タ ムプ ロ パテ ィ は、 すべての種類のブ ロ ッ ク に適用 さ れます。 PPS と プ レ ビ ュ ー機能 か ら は無視 さ れます。 表 12.13 に、 カ ス タ ムプ ロ パテ ィ の命名規則を示 し ます。 表 12.13 すべてのブ ロ ッ ク 種別に対する カ ス タ ムブ ロ ッ ク プ ロパテ ィ キーワー ド と り う る値 ・ 解説 3 種類のキ ャ ラ ク タ [ ] / を含ま ないあ ら ゆる名前 (文字列 ・ 名前 ・ float のいずれか、 または float の リ ス ト ) 各カ ス タ ムプ ロパテ ィ の 値を ど う 解釈するかは、 全 く ク ラ イ ア ン ト ア プ リ ケーシ ョ ンの領分です。 PPS か ら は無視 さ れます。 398 第 12 章 : PPS と PDFlib Block Plugin 12.7 pCOS で ブ ロ ッ ク 名 と プ ロパテ ィ を ク エ リ PPS に よ る 自動ブ ロ ッ ク 処理に加えて、 内蔵の pCOS 機能を使 う と 、 ブ ロ ッ ク 名を評価 し た り 、 標準 ・ カ ス タ ムプ ロ パテ ィ を ク エ リ し た り す る こ と がで き ます。 ク ッ ク ブ ッ ク 取 り 込んだPDFの中に含まれている ブ ロ ッ クのプ ロパテ ィ を ク エ リ する ための完全な コ ー ド サン プルが ク ッ ク ブ ッ クの blocks/query_block_properties ト ピ ッ ク にあ り ます。 ブ ロ ッ ク の数 と 名前を知る ク ラ イ ア ン ト コ ー ド 側では、 取 り 込んだページ上のブ ロ ッ ク の名前 も 数 も 知 ら な く てか ま い ません。 なぜな ら ク エ リ す る こ と も で き る か ら です。 以 下の ス テー ト メ ン ト は、 ページ番号 pagenum のページ上のブ ロ ッ ク の数を返 し ます : blockcount = (int) p.pcos_get_number(doc, "length:pages[" + pagenum + "]/blocks"); 以下の ス テー ト メ ン ト は、 ページ pagenum 上の blocknum 番目のブ ロ ッ ク の名前を返 し ます (ブ ロ ッ ク と ページの番号は 0 か ら 始ま り ます) : blockname = p.pcos_get_string(doc, "pages[" + pagenum + "]/blocks[" + blocknum + "]/Name"); 返 さ れたブ ロ ッ ク 名はその後、 ブ ロ ッ ク のプ ロ パテ ィ を ク エ リ し た り 、 ブ ロ ッ ク へテ キ ス ト ・ 画像 ・ PDF ・ グ ラ フ ィ ッ ク 内容を流 し 込んだ り す る ために利用す る こ と がで き ます。 指定 さ れたブ ロ ッ ク が存在 し ない と き は、 例外が発生 し ます。 こ れを避け る には、 length 接頭辞を用いて、 ブ ロ ッ ク の数を知 り 、 ひいては Blocks 配列の最大添字を知 る こ と がで き ます (配列の添字が 0 か ら 始ま る ため、 ブ ロ ッ ク の数は最大可能添字 よ り 1 大 き い こ と に 留意 し て く だ さ い)。 ブ ロ ッ ク プ ロ パテ ィ を特定す る パス文法において、以下の表現は等価です。 こ こ で、通 し 番号 < 番号 > のブ ロ ッ ク が、その Name プ ロ パテ ィ を < ブ ロ ッ ク名 > に設定 さ れてい る と し ます : pages[...]/blocks[<番号>] pages[...]/blocks/<ブロック名> ブ ロ ッ ク の座標を知る 名前 foo のブ ロ ッ ク の左下隅 と 右上隅を記述す る 2 個の座標ペア (llx, lly) お よ び (urx, ury) は、 以下の よ う に ク エ リ で き ます : llx lly urx ury = = = = p.pcos_get_number(doc, p.pcos_get_number(doc, p.pcos_get_number(doc, p.pcos_get_number(doc, "pages[" "pages[" "pages[" "pages[" + + + + pagenum pagenum pagenum pagenum + + + + "]/blocks/foo/Rect[0]"); "]/blocks/foo/Rect[1]"); "]/blocks/foo/Rect[2]"); "]/blocks/foo/Rect[3]"); 上記の座標はデ フ ォ ル ト 座標系で与え ら れてい る こ と に注意 し て く だ さ い (左下隅が原 点。 ただ し 、 そのページの CropBox に よ っ て変更 さ れてい る可能性 も あ り ます)。 こ れに 対 し て Block Plugin は、 ページ左上隅に原点を持つ Acrobat のユーザー イ ン タ フ ェース座 標系に従っ て座標を表示 し ます。ブ ロ ッ ク の座標を オーバ ラ イ ド す る ための Rect オプシ ョ ンは、 CropBox エン ト リ に よ っ て適用 さ れてい る変更を考慮に入れないので、 元のブ ロ ッ ク か ら ク エ リ さ れた座標は、 CropBox が存在す る 場合には新 し い座標 と し てその ま ま受け 渡す こ と はで き ません。 こ れを回避す る には、 refpoint ・ boxsize オプシ ョ ン を用い る こ と がで き ます。 ま た、 topdown オプシ ョ ンはブ ロ ッ ク 座標を ク エ リ す る際には考慮 さ れない こ と に も 留意 し て く だ さ い。 12.7 pCOS で ブ ロ ッ ク 名 と プ ロパテ ィ を ク エ リ 399 カ ス タ ムプ ロパテ ィ を ク エ リ カ ス タ ム プ ロ パテ ィ は、 以下の例の よ う に ク エ リ す る こ と がで き ます。 こ こ では、ページ pagenum 上の b1 と い う ブ ロ ッ ク か ら プ ロ パテ ィ zipcode を ク エ リ し てい ます : zip = p.pcos_get_string(doc, "pages[" + pagenum + "]/blocks/b1/Custom/zipcode"); ブ ロ ッ ク 内に具体的に何 と い う カ ス タ ムプ ロ パテ ィ があ る かわか ら なければ、実行時にそ の名前を得る こ と も で き ます。b1 と い う ブ ロ ッ ク の最初のカ ス タ ムプ ロ パテ ィ の名前を得 る には、 以下の よ う に し ます : propname = p.pcos_get_string(doc, "pages[" + pagenum + "]/blocks/b1/Custom[0].key"); 番号を 0 のかわ り に 1 つずつ増や し ていけば、すべてのカ ス タ ムプ ロ パテ ィ の名前を得 る こ と がで き ます。 length 接頭辞を用いれば、 カ ス タ ムプ ロ パテ ィ の数を知 る こ と がで き ま す。 存在 し ない ブ ロ ッ ク プ ロパテ ィ と デ フ ォ ル ト 値 ブ ロ ッ ク ま たはプ ロ パテ ィ が実在す る か ど う かを知 る には、 type 接頭辞を用い ます。 パス に対する 型が 0 か null な ら ば、 その オブジ ェ ク ト は PDF 文書内に存在 し てい ません。 なお、 定義済みプ ロ パテ ィ の場合、 こ れはプ ロ パテ ィ のデフ ォ ル ト 値が用い ら れ る こ と を意味 し ます。 カ ス タ ムプ ロパテ ィ の名前空間 さ ま ざ ま な ソ ース か ら の PDF 文書をや り 取 り す る 際に 混乱が生 じ る こ と を避け る ため、 カ ス タ ムプ ロ パテ ィ 名をつけ る と き には必ず、 イ ン タ ー ネ ッ ト ド メ イ ン名を企業固有の接頭辞 と し て用い、 その後に コ ロ ン 「:」 と プ ロ パテ ィ 名 本体を続け る こ と を推奨 し ます。 た と えば、 ACME 社であれば以下の よ う なプ ロ パテ ィ 名 を使用す る のです : acme.com:digits acme.com:refnumber 標準プ ロ パテ ィ と カ ス タ ム プ ロ パテ ィ はブ ロ ッ ク 内で異な る 格納の さ れ方を し てい る の で、 標準 PPS プ ロ パテ ィ 名 (386 ページ 「12.6 ブ ロ ッ ク のプ ロ パテ ィ 」 で定義 さ れてい る も の) がカ ス タ ムプ ロ パテ ィ 名 と 衝突す る こ と は決 し て あ り ません。 400 第 12 章 : PPS と PDFlib Block Plugin 12.8 ブ ロ ッ ク を プ ロ グ ラ ム的に作成 ・ 取 り 込む 12.8.1 POCA で PDFlib ブ ロ ッ ク を作成 PDFlib ブ ロ ッ ク は、PPS に内蔵 さ れてい る POCA イ ン タ フ ェース でプ ロ グ ラ ム的に作成す る こ と も 可能です。 POCA を用い る と 、 ブ ロ ッ ク のために必要な PDF デー タ 構造を作成 し た う えで、 PDF_begin/end_page_ext( ) の blocks オプシ ョ ンに与え る こ と がで き ます。 ブ ロ ッ ク 定義を作成す る 際には、 403 ページ 「12.9 PDFlib ブ ロ ッ ク の仕様」 の要請に従 う 必 要があ り ます。 ブ ロ ッ ク プ ロ パテ ィ は、 386 ページ 「12.6 ブ ロ ッ ク のプ ロ パテ ィ 」 に挙げ たデー タ 型に従っ て作成す る 必要があ り ます。 ク ッ ク ブ ッ ク PDFlib ブ ロ ッ ク を PPS で作成する ための コ ー ド サン プルが PDFlib ク ッ ク ブ ッ ク の blockhandling-and-pps カ テ ゴ リ にあ り ます。 PDFlib ブ ロ ッ ク の仕様には、 1 つのブ ロ ッ ク の名前が 2 回記録 さ れてい る と い う 残念な冗 長性があ り ます : ページの メ イ ン Blocks 辞書内に 1 回 と 、 特定のブ ロ ッ ク 辞書内の Name エン ト リ 内に も う 1 回です。 こ の 2 個の名前は、 そのブ ロ ッ ク に PPS で流 し 込みを行 う 際 や、そのブ ロ ッ ク を Block Plugin でプ レ ビ ュ ーす る 際に問題が起 こ る こ と を避け る ために、 同一でなければな り ません。 PDF_begin/end_page_ext( ) はそのため、 blocks オプシ ョ ンで 与え ら れた辞書が こ の 「同一ブ ロ ッ ク 名」 規則に違反す る ブ ロ ッ ク 定義を含んでい る場合 には、 例外を発生 さ せます。 以下の コ ー ド サンプルでは、 その照応す るペア を青色で示 し てい ます。 以下の コ ー ド 断片では、403 ページ「ブ ロ ッ ク 辞書のキー」で示すブ ロ ッ ク 定義を POCA 関数群を用いて作成す る 様子を演示 し てい ます : /* ブロック辞書を作成 */ blockdict = p.poca_new("containertype=dict usage=blocks"); /* --------------------------------------------------------* テキストブロックを作成 * --------------------------------------------------------*/ textblock = p.poca_new("containertype=dict usage=blocks type=name key=Type value=Block"); container1 = p.poca_new("containertype=array usage=blocks " + "type=integer values={70 640 300 700}"); p.poca_insert(textblock, p.poca_insert(textblock, p.poca_insert(textblock, p.poca_insert(textblock, p.poca_insert(textblock, p.poca_insert(textblock, "type=array "type=name "type=name "type=name "type=name "type=float key=Rect value=" + container1); key=Name value=job_title"); key=Subtype value=Text"); key=fitmethod value=auto"); key=fontname value=Helvetica"); key=fontsize value=12"); /* このブロックをページのブロック辞書内に挿入 */ p.poca_insert(blockdict, "type=dict key=job_title direct=false value=" + textblock); /* --------------------------------------------------------* 画像ブロックを作成 * --------------------------------------------------------*/ imageblock = p.poca_new("containertype=dict usage=blocks " + "type=name key=Type value=Block"); 12.8 ブ ロ ッ ク を プ ログ ラ ム的に作成 ・ 取 り 込む 401 container2 = p.poca_new("containertype=array usage=blocks " + "type=integer values={70 440 300 600}"); p.poca_insert(imageblock, p.poca_insert(imageblock, p.poca_insert(imageblock, p.poca_insert(imageblock, "type=array "type=name "type=name "type=name key=Rect value=" + container2); key=Name value=logo"); key=Subtype value=Image"); key=fitmethod value=auto"); /* このブロックをページのブロック辞書内に挿入 */ p.poca_insert(blockdict, "type=dict key=logo direct=false value=" + imageblock); /* --------------------------------------------------------* PDFブロックを作成 * --------------------------------------------------------*/ pdfblock = p.poca_new("containertype=dict usage=blocks " + "type=name key=Type value=Block"); container3 = p.poca_new("containertype=array usage=blocks " + "type=integer values={70 240 300 400}"); p.poca_insert(pdfblock, p.poca_insert(pdfblock, p.poca_insert(pdfblock, p.poca_insert(pdfblock, "type=array key=Rect value=" + container3); "type=name key=Name value=pdflogo"); "type=name key=Subtype value=PDF"); "type=name key=fitmethod value=meet"); /* このブロックをページのブロック辞書内に挿入 */ p.poca_insert(blockdict, "type=dict key=pdflogo direct=false " + "value=" + pdfblock); /* --------------------------------------------------------* このブロック辞書をカレントページ内に挿入 * --------------------------------------------------------*/ p.end_page_ext("blocks=" + blockdict); /* クリーンナップ */ p.poca_delete(blockdict, "recursive"); 12.8.2 PDFlib ブ ロ ッ ク を取 り 込む 入力文書か ら 1個ない し 複数のPDFlibブ ロ ッ ク を、PDF_process_pdi( ) と action=copyallblocks か action=copyblock で以下の よ う にカ レ ン ト 出力ページへ コ ピーす る こ と も 可能です : if (p.process_pdi(p, doc, 0, "action=copyallblocks block={pagenumber=1}") != 1) { /* エラー */ } こ の よ う にす る と 、マルチ レベルのブ ロ ッ ク 流 し 込みワー ク フ ロ ーを実装す る こ と がで き ます。 ただ し 、 各ページ上でブ ロ ッ ク 名は一意でなければな ら ない こ と に留意 し て く だ さ い。 すなわち、 同 じ 名前を持つ複数のブ ロ ッ ク を同 じ ページ上へ取 り 込む こ と はで き ませ ん。ブ ロ ッ ク を コ ピー時に名称変更す る にはoutputblocknameサブオプシ ョ ン を用い ます。 402 第 12 章 : PPS と PDFlib Block Plugin 12.9 PDFlib ブ ロ ッ ク の仕様 ブ ロ ッ ク の文法は、PDF ページ を構成す る デー タ 構造にアプ リ ケーシ ョ ンが独自デー タ を 追加格納で き る よ う にす る 拡張の し く みを定めた PDF Reference に準拠 し てい ます。 こ こ では PDFlib ブ ロ ッ ク の文法を説明 し ます。 Block Plugin か PDFlib でブ ロ ッ ク を作成す る ユーザーには こ の情報は必要ではあ り ません。 PDFlib ブ ロ ッ ク の PDF オ ブ ジ ェ ク ト 構造 ページ辞書は PieceInfo エ ン ト リ を含んでお り 、 こ のエン ト リ は値 と し て別の辞書を持っ てい ます。 ページ辞書は、 ブ ロ ッ ク 構造の作 成ま たは最終更新の タ イ ム ス タ ンプ を内容 と す る キーLastModified を も 含む必要があ り ま す。 こ の辞書はキー PDFlib を含んでお り 、 こ のキーはアプ リ ケーシ ョ ンデー タ 辞書を値 と し て持っ てい ます。 こ のアプ リ ケーシ ョ ンデー タ 辞書は、 表 12.14 に挙げ る 2 個の標準 キーを含んでい ます。 表 12.14 PDFlib ア プ リ ケーシ ョ ンデー タ 辞書内のエ ン ト リ キー 値 LastModified (日付文字列、 必須) ページ上のブ ロ ッ クが作成 さ れた、 または最近更新 さ れた日時。 こ のエ ン ト リ は、 POCA イ ン タ フ ェ ースで ブ ロ ッ ク を作成 し た場合には PDFlib が作成 し ます。 Private (辞書、 必須) ブ ロ ッ ク リ ス ト (表 12.15 参照) ブ ロ ッ ク リ ス ト と は、 ブ ロ ッ ク 処理に関す る 一般的な情報に加え て、 ページ上のすべての ブ ロ ッ ク の一覧を も 含んだ辞書です。 表 12.15 に、 ブ ロ ッ ク リ ス ト 辞書の中のキーの一覧 を示 し ます。 表 12.15 ブ ロ ッ ク リ ス ト 辞書内のエ ン ト リ キー 値 Blocks (辞書、 必須) キーはそれぞれ、 ブ ロ ッ ク名の名前オブ ジ ェ ク ト 。 その照応する値は、 そのブ ロ ッ ク に対する ブ ロ ッ ク辞書です (表 12.17 参照)。 ブ ロ ッ ク 辞書内の Name キーは、 こ の辞書内のブ ロ ッ ク名 と 同 じ で なければな り ません。 BlockProducer1 (文字列) ブ ロ ッ ク を プ ログ ラ ム的に作成するのに用い ら れた ソ フ ト ウ ェ アの名前。 こ のエ ン ト リ は、 POCA イ ン タ フ ェ ース で ブ ロ ッ ク を作成 し た際に PDFlib に よ っ て作成 さ れます。 PluginVersion1 1 (文字列) ブ ロ ッ ク の作成に使われた Block Plugin のバージ ョ ン識別を表す文字列。 pdfmark (論理値) ブ ロ ッ ク リ ス ト が pdfmark を用いて生成 さ れている場合は true で なければな り ません。 Version (数、 必須) フ ァ イルが準拠する ブ ロ ッ ク仕様のバージ ョ ン番号。 本文書では、 バージ ョ ン 10 の ブ ロ ッ ク 仕様を解説 し ています。 1. キー BlockProducer ・ PluginVersion ・ pdfmark の う ちのいずれか 1 つが、 かつ 1 つのみが存在する必要があ り ます。 ブ ロ ッ ク プ ロパテ ィ のデー タ 型 プ ロ パテ ィ はオプシ ョ ン リ ス ト と 同 じ デー タ 型に対応 し てい ます。 ただ し ハン ド ル と 、 ア ク シ ョ ン リ ス ト の よ う な特化 さ れた リ ス ト には対応 し てい ません。 表 12.16 に、 こ れ ら の型が PDF デー タ 型へど の よ う にマ ッ プ さ れてい る か を 示 し ます。 ブ ロ ッ ク 辞書のキー ブ ロ ッ ク 辞書は、 表 12.17 に挙げ る キーを含む こ と がで き ます。 12.9 PDFlib ブ ロ ッ クの仕様 403 表 12.16 ブ ロ ッ ク プ ロパテ ィ に対するデー タ 型 デー タ 型 PDF での型および注釈 論理値 (論理値) 文字列 (文字列) キーワー ド (名前) (名前) そのプ ロパテ ィ が対応するキーワー ド の リ ス ト にないキーワー ド を与え る と エ ラ ー。 float ・ 整数 (数値) オプ シ ョ ン リ ス ト では点も カ ン マ も 小数点 と し て対応 し ているのに対 し 、 PDF の数値では 点を必要 と し ます。 パーセ ン ト 値 (要素 2 個の配列) 配列の 1 番目の要素は数、 2 番目の要素はパーセ ン ト キ ャ ラ ク タ を持っ た文字 列。 リスト (配列) 色 (要素 2 個か 3 個の配列) 配列の 1 番目の要素は色空間を指定 し 、 2 番目の要素はカ ラ ー値を指定。 色な し を指定するには、 各プ ロパテ ィ を省略する必要があ り ます。 配列の 1 番目の要素に対 し て は以下のエ ン ト リ を指定で き ます : /DeviceGray 2 番目の要素はグ レー値 1 個。 /DeviceRGB 2 番目の要素は RGB 値 3 個の配列。 /DeviceCMYK 2 番目の要素は CMYK 値 4 個の配列。 [/Separation/ スポ ッ ト カ ラ ー名 ] 1 番目の要素は、 キーワー ド Separation と スポ ッ ト カ ラ ー名 1 個を持っ た配列。 2 番目 の要素は濃度値。 オプ シ ョ ン と し て 3 番目の要素で、 スポ ッ ト カ ラ ーの代替色を指定 し ます。 代替色はそ れ自体が 1 個の色配列であ り 、 DeviceGray ・ DeviceRGB ・ DeviceCMYK ・ Lab のいずれか の色空間で表 さ れます。 代替色を指定 し ない と きは、 スポ ッ ト カ ラ ー名は、 PPS が内部 的に知っ てい る色か、 またはア プ リ ケーシ ョ ン で動作時に定義 し ておいた色でなければ な り ません。 [/Lab] 1 番目の要素はキーワー ド Lab を持っ た配列。 2 番目の要素は Lab 値 3 個の配列。 unichar (テキス ト 文字列) UTF-16 BOM U+FEFF で始ま る utf16be 形式の Unicode 文字列 表 12.17 ブ ロ ッ ク辞書内のエ ン ト リ プ ロパテ ィ グループ 値 管理プ ロパテ ィ 群 (い く つかのキーは必須) 表 12.4 に従っ た管理プ ロパテ ィ 群 長方形プ ロパテ ィ 群 (い く つかのキーは必須) 表 12.5 に従っ た長方形プ ロパテ ィ 群 書式プ ロパテ ィ 群 (い く つかのキーは必須) 表 12.6 に従っ た、 すべての種類のブ ロ ッ ク に適用 さ れる 書式プ ロパテ ィ 群 と 、 表 12.7 に従っ た、 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク に適 用 さ れる テキス ト 書式プ ロパテ ィ 群 テキス ト 作成プ ロパテ ィ 群 (オプ シ ョ ン) 表 12.8 に従っ た、 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク に適用 さ れ る テキス ト 作成プ ロパテ ィ 群 テキス ト 組版プ ロパテ ィ 群 (オプ シ ョ ン) 表 12.9 に従っ た、 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク に適用 さ れ る テキス ト 組版プ ロパテ ィ 群 オブ ジ ェ ク ト はめ込みプ ロ (オプ シ ョ ン) 表 12.10 に従っ た、 テキス ト 行 ・ 画像 ・ PDF ・ グ ラ フ ィ ッ ク ブ ロ ッ ク パテ ィ 群 に適用 さ れる オブ ジ ェ ク ト はめ込みプ ロパテ ィ 群 と 、 表 12.11 に従っ た、 テキス ト フ ローブ ロ ッ ク に適用 さ れるはめ込みプ ロパテ ィ 群 404 第 12 章 : PPS と PDFlib Block Plugin 表 12.17 ブ ロ ッ ク辞書内のエ ン ト リ プ ロパテ ィ グループ 値 デ フ ォ ル ト 内容に関する プ (オプ シ ョ ン) 表 12.12 に従 っ た、 デ フ ォ ル ト 内容に関する プ ロパテ ィ 群 ロパテ ィ 群 カスタム (辞書、 オプ シ ョ ン) 表 12.13 に従っ た、 カ ス タ ムプ ロパテ ィ に対するキー / 値ペア を含んだ辞書 例 以下の コ ー ド 断片は、 job_title と い う テ キ ス ト ブ ロ ッ ク と 、 logo と い う 画像ブ ロ ッ ク の、 2 個のブ ロ ッ ク に対する PDF コ ー ド を示 し ます。 こ のテ キ ス ト ブ ロ ッ ク は format と い う カ ス タ ムプ ロ パテ ィ を含んでい ます : << /Contents 12 0 R /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595 842 ] /LastModified (D:20120813200730) /PieceInfo << /PDFlib 13 0 R >> >> 13 0 obj << /Private << /Blocks << /job_title 14 0 R /logo 15 0 R >> /Version 10 /PluginVersion (5.0) >> /LastModified (D:20120813200730) >> endobj 14 0 obj << /Type /Block /Rect [ 70 740 200 800 ] /Name /job_title /Subtype /Text /fitmethod /auto /fontname (Helvetica) /fontsize 12 /Custom << /format 5 >> >> endobj 15 0 obj << /Type /Block /Rect [ 250 700 400 800 ] /Name /logo /Subtype /Image /fitmethod /auto >> 12.9 PDFlib ブ ロ ッ クの仕様 405 406 第 12 章 : PPS と PDFlib Block Plugin A 改訂履歴 日付 更新点 2013 年 6 月 06 日 > PDFlib 9.0.1 に関する更新 2013 年 3 月 12 日 > PDFlib 9.0.0 に関する更新 2011 年 6 月 09 日 > PDFlib 8 VT Edition (内部的には 8.1.0) に関する更新 2010 年 12 月 09 日 > PDFlib 8.0.2 に関する さ ま ざ ま な更新 ・ 修正 2010 年 9 月 22 日 > PDFlib 8.0.1p7 に関する さ ま ざ ま な更新 ・ 修正 2010 年 4 月 13 日 > PDFlib 8.0.1 に関する さ ま ざ ま な更新 ・ 修正 2009 年 12 月 07 日 > PDFlib 8.0.0 に関する更新 2009 年 3 月 13 日 > PDFlib 7.0.4 に関する さ ま ざ ま な更新 ・ 修正 2008 年 2 月 13 日 > PDFlib 7.0.3 に関する さ ま ざ ま な更新 ・ 修正 2007 年 8 月 08 日 > PDFlib 7.0.2 に関する さ ま ざ ま な更新 ・ 修正 2007 年 2 月 19 日 > PDFlib 7.0.1 に関する さ ま ざ ま な更新 ・ 修正 2006 年 10 月 03 日 > PDFlib 7.0.0 に関する更新 と 再構成 2006 年 2 月 21 日 > PDFlib 6.0.3 に関する さ ま ざ ま な更新 ・ 修正。 Ruby の節を追加 2005 年 8 月 09 日 > PDFlib 6.0.2 に関する さ ま ざ ま な更新 ・ 修正 2004 年 11 月 17 日 > PDFlib 6.0.1 に関する小規模な更新 ・ 修正 > 8 章に言語別関数プ ロ ト タ イ プ用新書式導入 > 3 章にハイパーテキス ト の例を追加 2004 年 6 月 18 日 > PDFlib 6 に関する大規模な変更 2004 年 1 月 21 日 > PDFlib 5.0.3 に関する小規模な追加 ・ 修正 2003 年 9 月 15 日 > PDFlib 5.0.2 に関する小規模な追加 ・ 修正。 ブ ロ ッ クの仕様を追加 2003 年 5 月 26 日 > PDFlib 5.0.1 に関する小規模な更新 ・ 修正 2003 年 3 月 26 日 > PDFlib 5.0.0 に関する全面的変更 と 書き直 し 2002 年 6 月 14 日 > PDFlib 4.0.3 に関する小規模な変更 と .NET バイ ンデ ィ ングに関する追加 2002 年 1 月 26 日 > PDFlib 4.0.2 に関する小規模な変更 と IBM eServer エデ ィ シ ョ ンに関する追加 2001 年 5 月 17 日 > PDFlib 4.0.1 に関する小規模な変更 2001 年 4 月 1 日 > PDFlib 4.0.0 の PDI ・ 他機能を解説 2001 年 2 月 5 日 > PDFlib 3.5.0 のテ ン プ レー ト ・ CMYK 機能を解説 2000 年 12 月 22 日 > ColdFusion 解説 と PDFlib 3.03 に関する追加。 COM エデ ィ シ ョ ン を別マニ ュ アルに 2000 年 8 月 8 日 > Delphi 解説 と PDFlib 3.02 に関する小規模な追加 2000 年 7 月 1 日 > PDFlib 3.01 に関する追加 ・ 説明の明瞭化 A 改訂履歴 407 日付 更新点 2000 年 2 月 20 日 > PDFlib 3.0 に関する変更 1999 年 8 月 2 日 > PDFlib 2.01 に関する小規模な変更 ・ 追加 1999 年 6 月 29 日 > 言語バイ ンデ ィ ン グご と に節を分離 > PDFlib 2.0 に関する追加 1999 年 2 月 1 日 > PDFlib 1.0 に関する小規模な追加 (公開せず) 1998 年 8 月 10 日 > PDFlib 0.7 に関する追加 (一つのお客様用のみ) 1998 年 7 月 8 日 > PDFlib 0.6 の PDFlib ス ク リ プ テ ィ ングサポー ト を初めて記述 1998 年 2 月 25 日 > PDFlib 0.5 に関 し て説明を若干追加 1997 年 9 月 22 日 > PDFlib 0.4 と 本マニ ュ アルを初めて公開 索引 記号 D .NET バイ ンデ ィ ング 44 defaultgray/rgb/cmyk 色空間 89 descender 153 DLL (ダ イ ナ ミ ッ ク リ ン ク ラ イ ブ ラ リ ) 36 dpi 計算 181 A Acrobat のブ ロ ッ ク作成用プ ラ グ イ ン 359 Active Server Pages 37 Adobe Font Metrics (AFM) 115 AES 暗号化アルゴ リ ズム 81 AFM (Adobe Font Metrics) 115 ArtBox 76 AS/400 72 ascender 153 asciifile オプ シ ョ ン 72 auto → hypertextformat autocidfont オプ シ ョ ン 144 autosubsetting オプ シ ョ ン 143 B Big Five 108 BleedBox 76 BMP 95, 186 bytes → hypertextformat C C++ と .NET 46 C++ バイ ンデ ィ ング 32 capheight 153 CCITT 186 CCSID 104 CEF フ ォ ン ト 116, 191 characters per inch 154 CIE L*a*b* カ ラ ースペース 90 circle():VB での問題 38 CLI (Common Language Interface) 32 CMap 106 CMaps 106 Cobol バイ ンデ ィ ン グ 40 COM (Component Object Model) バイ ンデ ィ ング 35 CPI (characters per inch) 154 CropBox 76 currentx ・ currenty オプ シ ョ ン 153 C バイ ンデ ィ ング 29 E EBCDIC 72 ebcdicutf8 → hypertextformat errorpolicy オプ シ ョ ン 202 EUDC (エ ン ド ユーザー定義キ ャ ラ ク タ ) フ ォ ン ト 113 EXIF JPEG 画像 183 G GBK 108 get_buffer() 70 GIF 185 global.asa 38 grid.pdf 74 H HKS カ ラ ー 93 hypertextformat オプ シ ョ ン 101 I IBM zSeries ・ iSeries/i5 72 iccprofilegray/rgb/cmyk オプ シ ョ ン 89 ignoremask 188 iSeries/i5 72 ISO 10646 (Unicode) 125 ISO 15930 (PDF/X) 333 ISO 19005 (PDF/A) 321 ISO 32000 (PDF 1.7) 320 J Javadoc 43 Java バイ ンデ ィ ング 41 JBIG2 184 JFIF 183 Johab 108 JPEG 183 EXIF 形式の画像 183 JPEG2000 184 索引 409 L R leading 153 LWFN (LaserWriter Font) 115 RAW 画像デー タ 186 RC4 暗号化アルゴ リ ズム 81 REALbasic バイ ンデ ィ ング 55 regsvr32 36 resourcefile オプ シ ョ ン 69 RPG バイ ンデ ィ ング 56 Ruby バイ ンデ ィ ング 58 M masked 188 MediaBox 76 MSI 35 O Objective-C バイ ンデ ィ ン グ 47 OBJR 構造エ レ メ ン ト イ ン タ ラ ク テ ィ ブ要素のための 300, 302 OpenType フ ォ ン ト 113 overline オプ シ ョ ン 156 P page 182 Pantone カ ラ ー 91 PDF_EXIT_TRY( ) 31 PDF_get_buffer() 70 PDF_set_parameter() 69 PDF/A 321 PDF/UA 352 PDF/X 333 PDFlib 機能一覧 21 PDFlib Personalization Server 359 pdflib.upr 69 PDFLIBRESOURCE 環境変数 69 PDFlib の機能 21, 25 PDF 取 り 込みラ イ ブ ラ リ (PDI) 200 PDI (PDF 取 り 込み) 200 pdiusebox オプ シ ョ ン 203 Perl バイ ンデ ィ ング 49 permissions 85 PFA (Printer Font ASCII) 115 PFB (Printer Font Binary) 115 PFM (Printer Font Metrics) 115 PHP バイ ンデ ィ ング 52 PNG 183, 188 POCA (PDF オブ ジ ェ ク ト 作成 API) ブ ロ ッ ク を作成する ための 401 POCA (PDF オブ ジ ェ ク ト 作成 API) 文書部分 メ タ デー タ (DPM) のための 346 PostScript Type 1 フ ォ ン ト 115 PPS (PDFlib Personalization Server) 359 Printer Font ASCII (PFA) 115 Printer Font Binary (PFB) 115 Printer Font Metrics (PFM) 115 Python バイ ンデ ィ ング 54 410 索引 S S/390 72 scale():VB での問題 38 SearchPath オプ シ ョ ン 66 Shift-JIS 108 SING フ ォ ン ト 115 sRGB カ ラ ースペース 88 strikeout オプ シ ョ ン 156 subsetminsize オプ シ ョ ン 144 SVG 191 フ ォ ン ト 114 T textformat オプ シ ョ ン 101 textrendering オプ シ ョ ン 156 textx ・ texty オプ シ ョ ン 153 TIFF 185 topdown オプ シ ョ ン 75 TrimBox 76 TrueType フ ォ ン ト 113 TTC (TrueType コ レ ク シ ョ ン) 113 TTC (TrueType Collection) 173 Type 1 フ ォ ン ト 115 Type 3 (ユーザー定義) フ ォ ン ト 116 U UHC 108 UNC 37 underline オプ シ ョ ン 156 UPR (Unix PostScript Resource) 64 usehypertextencoding オプ シ ョ ン 101 usercoordinates オプ シ ョ ン 73 utf16 → hypertextformat utf16be → hypertextformat utf16le → hypertextformat utf8 → hypertextformat UTF 形式 96 V VB.NET 45 VBA 35 Visual Basic 38 Visual Basic for Applications 35 W Web 最適化 PDF 277 Windows イ ン ス ト ー ラ 35 WOFF フ ォ ン ト 114 X XMP メ タ デー タ 275 プ レーン テキス ト で 83 XObject 78 x ハイ ト 153 Z zSeries 72 あ アセ ン ダ 153 暗号化 81 フ ァ イル添付 83 い 一意識別 PDF/VT のための XObject の 342 一時領域の必要 277 イ ン コ ア生成 70 印刷ス ト リ ーム順序 293 イ ン ス ト ール , サイ レ ン ト 36 イ ン タ ーネ ッ ト サービ ス プ ロバイ ダ 36 イ ン チ 73 イ ン ラ イ ン画像 182 う 上付き 154 え エ スケープ シーケ ン ス 109 エ ラ ー処理 61 エ ン コ ーデ ィ ン グ カ ス タ ム 104 シ ス テムか らの取得 104 お オー ト メ ーシ ョ ン 35 か カ ーニ ン グ 154 外在透過 188 回転 74 拡縮画像 181 カ ス タ ムエ レ メ ン ト 種別 287 カ ス タ ムエ ン コ ーデ ィ ング 104 画像デー タ の再利用 181 画像の拡縮 181 画像フ ァ イル形式 183 画像マス ク 187, 189 カテゴ リ リ ソ ース 65 カ プ セル化 XObject PDF/VT のための 347 カ プ セル化 ヒ ン ト PDF/VT のための 342 カ レ ン ト 点 77 環境変数 PDFLIBRESOURCE 69 韓国語 107, 108, 173 き 記号フ ォ ン ト グ リ フ を選択 128 機能 PDFlib の 21, 25 機能一覧 PDFlib 21 基本多言語面 95 キ ャ ッ プハイ ト 153 キ ャ ラ ク タ と グ リ フ 95 キ ャ ラ ク タ メ ト リ ッ ク 153 行送 り 153 切 り 抜き 76 く グ ラ デ ィ エ ン ト 94 グ ラ フ ィ ッ ク 191 グ リ フ 95 記号 フ ォ ン ト から 選択 128 グ リ フ ID (GID) 指定 118 置換 122 入手可能性 148 グ リ フ レ ッ ト 115 け 権限 82 権限パスワー ド 81 言語バイ ンデ ィ ング→バイ ンデ ィ ング こ コ ア フ ォ ン ト 134 高度な改行 237 コ ピー ページ枠を 210 索引 411 さ て 最適化 PDF 277 サイ レ ン ト イ ン ス ト ール 36 座標系 73 下向き 74 メ ー ト ル 73 サブ セ ッ ト 化 143 サブパス 76 デ ィ セ ン ダ 153 テキス ト 位置 153 テキス ト 進行方向 173, 178 テキス ト バ リ エーシ ョ ン 153 テキス ト メ ト リ ッ ク 153 デ フ ォ ル ト 座標 73 添付パスワー ド 81 テ ン プ レー ト 78 し しおり 構造を持っ た 302 シ ス テムエ ン コ ーデ ィ ン グ対応 104 下付き 154 下向き座標 74 出力イ ン テ ン ト 336 PDF/A のための 324 私用領域 (PUA) 95, 127 所有者パスワー ド 81 す スケー ラ ブルベ ク ト ルグ ラ フ ィ ッ ク 191 ス コ ープ ヒ ン ト PDF/VT のための 346 ス コ ープ ヒ ン ト と 環境 コ ン テキス ト PDF/VT のための 342 ス タ イル名 Windows の 137 スポ ッ ト カ ラ ー (分版カ ラ ースペース) 90 スムーズシ ェ ーデ ィ ング 94 ス レ ッ ド モデル 35 せ セキ ュ リ テ ィ 81 線形化 PDF 277 た ダウ ンサン プ リ ン グ 181 タ グ付き し お り 302 縦書き 173, 178 単位 73 ち 中国語 106, 108, 173 つ 強 く 構造化 さ れた文書 355 と 透過 187 PDF/VT 内の 348 取 り 込まれた PDF ページ内で検出 348 等幅フ ォ ン ト 154 な 内容文字列 100 名前文字列 100 に 日中韓 (日本語 ・ 中国語 ・ 韓国語) Windows コ ー ド ページ 108 カ ス タ ム フ ォ ン ト 173 構成 107 標準フ ォ ン ト 106 日本語 106, 108, 173 ぬ 塗 り 76 ね ネス ト 例外の 30 は バイ ト サービ ング 277 バイ ト 順序マー ク (BOM) 96, 101 ハイパーテキス ト 文字列 100 バイ ンデ ィ ン グ 29 パス 76 パスオブ ジ ェ ク ト 77 パスワー ド 81, 82 パ タ ーン 94 バ ッ ク ス ラ ッ シ ュ置換 109 反復グ ラ フ ィ カル コ ン テ ン ツ 341 ひ 評価版 11 412 索引 標準エ レ メ ン ト 種別 282 標準化異体字シーケ ン ス 177 標準出力条件 PDF/X のための 336 描線 76 ふ フ ァ イル検索 66 フ ァ イル添付 暗号化 さ れた 83 フ ォ ーム XObject 78 フ ォ ーム フ ィ ール ド : PDFlib ブ ロ ッ クへの変換 371 フォン ト AFM フ ァ イル 115 CEF 116, 191 OpenType 113 PDF コ アセ ッ ト 134 PFA フ ァ イル 115 PFB フ ァ イル 115 PFM フ ァ イル 115 PostScript Type 1 115 SING 115 SVG 114 TrueType 113 TrueType コ レ ク シ ョ ン 113 Type 3 (ユーザー定義) 116 Type 3 (ユーザー定義) フ ォ ン ト 116 Windows のス タ イル名 137 WOFF 114 埋め込みの法的側面 143 記号グ リ フ を選択 128 サブ セ ッ ト 化 143 等幅 154 メ ト リ ッ ク 153 ユーザー定義 (Type 3) 116 リ ソ ース構成 64 フ ォ ン ト 名エ イ リ ア ス設定 132 不可視テキス ト 389 複数ページ画像 フ ァ イル 182 袋文字 389 プ ラグイ ン ブ ロ ッ ク作成用 359 ブ レ ン ド 94 ブロ ッ ク POCA で作成 401 プ ラ グ イ ン 359 ブ ロ ッ ク プ ロパテ ィ 361 文書部分 ヒ エ ラ ルキー 341, 345 文書部分 メ タ デー タ (DPM) 341, 346 ページサイ ズ規格 75 ページサイ ズ限界 Acrobat の 76 ページ定義 73 ベース ラ イ ン圧縮 183 ベ ク ト ルグ ラ フ ィ ッ ク 191 ほ ホス ト エ ン コ ーデ ィ ン グ 103 ホス ト フ ォ ン ト 136 ま マス ク画像 187 マス タ ーパスワー ド 81 み ミ リ メ ー ト ル 73 め メ ー ト ル座標 73 メ ト リ ッ ク 153 メ モ リ 内に PDF 文書を生成 70 も 文字参照 110 ゆ ユーザースペース 73 ユーザー定義 (Type 3) フ ォ ン ト 116 ユーザーパスワー ド 81 よ 用字系固有の改行 237 横書き 173, 178 読み上げ順序 293 弱 く 構造化 さ れた文書 355 り リ ソ ース カ テ ゴ リ 65 れ 例外 61 レ イ ヤー と PDI 203 レ コ ー ド レ ベル PDF/VT のための 341 レ ン ダ リ ング イ ン テ ン ト 90 へ ろ ページ ご と のダウン ロー ド 277 ロールマ ッ プ 索引 413 カ ス タ ムエ レ メ ン ト 種別に対する 287 論理読み取 り 順序 293 414 索引 索引 415 ABC PDFlib GmbH Franziska-Bilek-Weg 9 80339 München, Germany www.pdflib.com 電話 +49 • 89 • 452 33 84-0 FAX +49 • 89 • 452 33 84-99 ご質問がある と きは、 PDFlib メ ー リ ング リ ス ト と tech.groups.yahoo.com/group/pdflib にある アー カ イ ブ を チ ェ ッ ク し て く だ さ い ラ イ セ ン ス発行のお問い合わせ [email protected] サポー ト [email protected] (お持ちの ラ イ セ ン ス番号をお書 き く だ さ い)
© Copyright 2024 Paperzz