close

Enter

Log in using OpenID

7 - PDFlib

embedDownload
ABC
PDFlib, PDFlib+PDI, PPS
A library for generating PDF on the fly
PDFlib 9.0.7
チ ュ ー ト リ アル
C, C++, Cobol, COM, Java, .NET, Objective-C,
Perl, PHP, Python, REALbasic/Xojo, RPG, Ruby 用
Copyright © 1997–2016 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
疑問点がおあ り の場合は groups.yahoo.com/neo/groups/pdflib/info にある 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/Xojo バイ ンデ ィ ング 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
PDF 文書の最大サ イ ズ と その他の制限 71
3.1.6
マルチ ス レ ッ ド プ ロ グ ラ ミ ン グ 72
3.1.7
EBCDIC ベース のプ ラ ッ ト フ ォームで PDFlib を使 う 72
3.2 ページ記述 74
3.2.1
座標系 74
3.2.2
ページサ イ ズ 76
3.2.3
直接パス と パス オブジ ェ ク ト 77
3.2.4
テ ンプ レー ト (フ ォーム XObject) 79
3.2.5
外部 PDF 文書内の参照ページ 80
3.3 PDF のパスワー ド セキ ュ リ テ ィ 82
3.3.1
PDF におけ る パス ワー ド セキ ュ リ テ ィ 82
3.3.2
PDFlib を用いて PDF 文書をパ ス ワ ー ド 保護 85
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
4
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.2 Unicode のキ ャ ラ ク タ と グ リ フ 118
5.2.1 グ リ フ ID 118
5.2.2 グ リ フ に対す る Unicode マ ッ ピ ン グ 118
5.2.3 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
5.4.3
5.4.4
5.4.5
5.4.6
記号フ ォ ン ト に対す る エン コ ーデ ィ ン グ を選ぶ 127
例 : Wingdings 記号フ ォ ン ト 内のグ リ フ を選択 128
フ ォ ン ト を検索 131
Windows ・ OS X/macOS 上のホ ス ト フ ォ ン ト 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 レ イ ア ウ ト 機能 162
6.4 複雑用字系出力 166
6.4.1 複雑用字系 166
6.4.2 用字系 と 言語 168
6.4.3 複雑用字系のシ ェ ーピ ン グ 170
6.4.4 双方向組版 170
6.4.5 ア ラ ビ ア文字テ キ ス ト 組版 172
6.5 日本語 ・ 中国語 ・ 韓国語テキス ト 出力 174
6.5.1 TrueType ・ OpenType 日中韓フ ォ ン ト を用い る 174
目次
5
6.5.2
EUDC ・ SING フ ォ ン ト に よ る 外字キ ャ ラ ク タ 175
6.5.3
6.5.4
OpenType レ イ ア ウ ト 機能 と 高度な日中韓テ キ ス ト 出力 176
Unicode 異体字セ レ ク タ と 異体字シーケ ン ス 178
6.5.5
標準日中韓フ ォ ン ト 179
7 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む
ラ ス タ 画像 181
7.1.1 基本的な画像処理 181
7.1
7.1.2
7.1.3
対応画像フ ァ イ ル形式 183
ク リ ッ ピ ン グパス 186
7.1.4
7.1.5
画像マ ス ク と 透過 187
画像に着色 189
7.2 SVG グ ラ フ ィ ッ ク 191
7.2.1
7.2.2
対応 SVG 種別 191
SVG 処理上の考慮事項 191
7.2.3
7.2.4
SVG グ ラ フ ィ ッ ク のサ イ ズ 193
フ ォ ン ト 選択 193
7.2.5
見つか ら ない フ ォ ン ト 、 見つか ら ないグ リ フ を扱 う 196
7.2.6
7.2.7
ベ ク ト ルグ ラ フ ィ ッ ク と テ キ ス ト だけではない SVG 内容 197
対応 し ていない SVG 機能 198
7.3 PDF ページ を PDI で取 り 込む 201
7.3.1
7.3.2
PDI の機能 と 用途 201
PDFlib+PDI を使用 201
7.3.3
7.3.4
文書 ・ ページ関連のチ ェ ッ ク 203
取 り 込んだ PDF 文書の具体的特徴 203
7.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置 206
7.4.1
7.4.2
単純にオブジ ェ ク ト を配置 206
オブジ ェ ク ト を点上か線上か枠内に配置 206
7.4.3
7.4.4
オブジ ェ ク ト の向 き を変え る 208
オブジ ェ ク ト を回転 209
7.4.5
7.4.6
ページサ イ ズの調整 210
配置 さ れた画像 と PDF ページに関す る 情報を ク エ リ 212
8 テキス ト と 表の組版
213
テキス ト 行を配置 ・ はめ込む 213
8.1
6
8.1.1
8.1.2
単純なテ キ ス ト 行配置 213
テ キ ス ト を枠内に位置付け 214
8.1.3
8.1.4
テ キ ス ト を枠へはめ込み 215
テ キ ス ト を文字で揃え る 217
8.1.5
8.1.6
ス タ ンプ を配置 218
リ ーダ を用い る 218
目次
181
8.1.7
8.1.8
8.1.9
パ ス上テ キ ス ト 219
影付 き テ キ ス ト 220
Acrobat で編集で き る 透か し 220
8.2 複数行のテキス ト フ ロー 223
8.2.1 テ キ ス ト フ ロ ーをはめ込み枠に配置 225
8.2.2 段落の組版のオプシ ョ ン 226
8.2.3 イ ン ラ イ ンオプシ ョ ン リ ス ト と マ ク ロ 227
8.2.4 タ ブ位置 230
8.2.5 番号付き リ ス ト と 段落間隔 230
8.2.6 制御キ ャ ラ ク タ と キ ャ ラ ク タ マ ッ ピ ン グ 232
8.2.7 ハ イ フ ネーシ ョ ン 234
8.2.8 ウ ィ ド ー行 ・ オーフ ァ ン行 235
8.2.9 標準改行アルゴ リ ズ ムの制御 236
8.2.10 高度な用字系固有の改行 239
8.2.11 テ キ ス ト をパ ス ・ 画像に回 り 込ませ る 240
8.3 表の組版 244
8.3.1 単純な表を配置 245
8.3.2 表セルの さ ま ざ ま な内容 248
8.3.3 表 と 列の幅 250
8.3.4 さ ま ざ ま な種類の内容を持っ た表 251
8.3.5 表 イ ン ス タ ン ス 254
8.3.6 表組版のアルゴ リ ズ ム 257
8.4 範囲枠 261
8.4.1 テ キ ス ト 行を装飾 261
8.4.2 テ キ ス ト フ ロ ー内で範囲枠を用い る 262
8.4.3 範囲枠 と 画像 263
9 イ ン タ ラ ク テ ィ ブ機能
9.1
265
リ ン ク ・ し お り ・ 注釈 265
9.2 フ ォ ーム フ ィ ール ド と JavaScript 268
9.3 地理空間 PDF 273
9.3.1 地理空間 PDF を Acrobat で利用 273
9.3.2 地理座標系 と 投影座標系 273
9.3.3 座標系の例 274
9.3.4 Acrobat におけ る 地理空間 PDF の制約 275
10 文書交換
277
10.1 XMP メ タ デー タ 277
10.2 Web 最適化 (線形) PDF 279
10.3 タ グ付き PDF の基礎 280
目次
7
10.3.1
10.3.2
10.3.3
10.3.4
10.3.5
10.3.6
10.3.7
論理構造ツ リ ー (構造 ヒ エ ラ ルキー) 281
標準 ・ カ ス タ ムエ レ メ ン ト 種別 284
ページ装飾 289
テ キ ス ト 処理 291
代替記述 ・ 置換テ キ ス ト ・ 略語拡張 293
印刷ス ト リ ーム順序 と 論理読み取 り 順序 295
Adobe Acrobat におけ る タ グ付 き PDF の諸問題 296
10.4 タ グ付き PDF の高度な ト ピ ッ ク 299
10.4.1 自動表 タ グ付け 299
10.4.2 イ ン タ ラ ク テ ィ ブ要素 302
10.4.3 箇条書 き 305
10.4.4 コ ン テ ン ツ を順序に と ら われず作成 307
10.4.5 タ グ付き PDF ページ を PDI で取 り 込む 309
10.4.6 WCAG 2.0 のための PDFlib の さ ま ざ ま な技法 312
11 PDF のバージ ョ ン と 規格
321
11.1 Acrobat ・ PDF のバージ ョ ン 321
11.2 PDF 標準 ISO 32000 324
11.3 PDF/A によ る アー カ イ ビ ング 325
11.3.1 各種の PDF/A 規格 325
11.3.2 一般的必要条件 326
11.3.3 色 と 画像の必要条件 327
11.3.4 イ ン タ ラ ク テ ィ ブ機能に対す る 必要条件 330
11.3.5 レベル U 準拠のための追加の PDF/A の必要条件 330
11.3.6 レベル A 準拠のための追加の PDF/A の必要条件 331
11.3.7 PDF/A 文書を PDI で取 り 込み 332
11.3.8 PDF/A のための XMP 文書 メ タ デー タ 334
11.4 PDF/X によ る印刷出力 337
11.4.1 PDF/X 規格フ ァ ミ リ 337
11.4.2 一般的必要条件 338
11.4.3 色 と 画像の必要条件 339
11.4.4 イ ン タ ラ ク テ ィ ブ機能のための必要条件 343
11.4.5 PDF/X 文書を PDI で取 り 込む 343
11.5 PDF/VT によ る可変 ・ ト ラ ンザ ク シ ョ ン印刷 345
11.5.1 PDF/VT 規格 345
11.5.2 PDF/VT の諸概念 346
11.5.3 PDF/VT-1 と PDF/VT-2 を生成する ための諸規則の要約 347
11.5.4 文書部分 ヒ エ ラ ルキー と 文書部分 メ タ デー タ (DPM) 349
11.5.5 反復す る グ ラ フ ィ カル内容のための ス コ ープ ヒ ン ト 351
11.5.6 カプセル化 XObject 352
11.5.7 PDF/X ・ PDF/VT 文書を PDI で取 り 込む 353
11.5.8 PDF/VT-2s のための MIME ス ト リ ーム を作成 354
8
目次
11.6 PDF/UA によ るユニバーサルア ク セシ ビ リ テ ィ 356
11.6.1 PDF/UA-1 規格 356
11.6.2 タ グ付けの必要条件 357
11.6.3 コ ン テ ン ツ種別ご と の追加の必要条件 359
11.6.4 PDF/UA 文書を PDI で取 り 込む 360
12 PPS と PDFlib Block Plugin
363
12.1 PDFlib Block Plugin を イ ン ス ト ール 363
12.2 ブ ロ ッ ク概念の概要 366
12.2.1 文書デザ イ ン と プ ロ グ ラ ム コ ー ド と の分離 366
12.2.2 ブ ロ ッ ク プ ロ パテ ィ 366
12.2.3 PDF の フ ォーム フ ィ ール ド を利用 し ないのはなぜか 367
12.3 PDFlib Block Plugin で ブ ロ ッ ク を編集 369
12.3.1 ブ ロ ッ ク を作成 369
12.3.2 ブ ロ ッ ク プ ロ パテ ィ を編集 373
12.3.3 ページ間 ・ 文書間でブ ロ ッ ク を コ ピー 375
12.3.4 PDF フ ォーム フ ィ ール ド を PDFlib ブ ロ ッ ク に変換 376
12.3.5 Block Plugin のユーザー イ ン タ フ ェース を XML でカ ス タ マ イ ズ 379
12.4 Acrobat で ブ ロ ッ ク を プ レ ビ ュ ー 381
12.5 PPS で ブ ロ ッ クへ流 し 込み 386
12.6 ブ ロ ッ クのプ ロパテ ィ 391
12.6.1 管理プ ロ パテ ィ 391
12.6.2 長方形プ ロ パテ ィ 392
12.6.3 書式プ ロ パテ ィ 393
12.6.4 テ キ ス ト 作成プ ロ パテ ィ 396
12.6.5 テ キ ス ト 組版プ ロ パテ ィ 397
12.6.6 オブジ ェ ク ト はめ込みプ ロ パテ ィ 400
12.6.7 デフ ォ ル ト 内容のためのプ ロ パテ ィ 403
12.6.8 カ ス タ ムプ ロ パテ ィ 403
12.7 pCOS で ブ ロ ッ ク名 と プ ロパテ ィ を ク エ リ 404
12.8 ブ ロ ッ ク を プ ログ ラ ム的に作成 ・ 取 り 込む 406
12.8.1 POCA で PDFlib ブ ロ ッ ク を作成 406
12.8.2 PDFlib ブ ロ ッ ク を取 り 込む 407
12.9 PDFlib ブ ロ ッ ク の仕様 408
A 改訂履歴
索引
411
413
目次
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.7
...あなたのライセンスキー ...
こ の ラ イ セ ン ス フ ァ イ ル内には、 複数の 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.7\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/macOS ・ 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/macOS では、 <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
の API 一覧は不完全です。 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/macOS 版 ・ Windows 版あ り ) を用いて対話的に作成す る こ
と がで き 、 その中に、 PPS を用いて自動的に流 し 込みを行い ます。 こ のプ ラ グ イ ン も
PPS に含まれてい ます。
PDFlib を使 う には PDFlib は さ ま ざ ま な プ ラ ッ ト フ ォ ー ム 上で利用可能です。 Unix ・
Windows ・ OS X/macOS のいずれで も 利用す る こ と がで き 、 ま た、 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/macOS ・ 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 の主な新機能 ・ 改良機能を以下に挙げます。
こ れ以外に も 多 く の新機能があ り ます。詳 し く は表 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/DC に従っ た 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 ~ DC)
線形化 (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/macOS シ ス テムに イ ン ス ト ール さ れている フ ォ ン ト (「ホス ト フ ォ ン ト 」)
の直接利用
あ ら ゆる種類のフ ォ ン ト の埋め込み。 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/DC)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/macOS 版 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_begin_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
Infrastructure) で使 う 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 デ ィ ス ト リ ビ ュ ーシ ョ ン (pstring_utf8.cpp) に含まれてい ます。
> プ レーン C++ 文字列を用い る こ と も で き ます。こ れは、PDFlib 7 ま でのバージ ョ ン を利
用 し て開発 さ れた既存 C++ アプ リ ケーシ ョ ン と の互換のためです。 こ の互換方式は既
存アプ リ ケーシ ョ ンのためにのみ推奨 さ れ る も のであ り 、 新規プ ロ ジ ェ ク ト には推奨
さ れません ( ソ ース コ ー ド 互換性については 33 ページ 「レ ガシ アプ リ ケーシ ョ ン と の
フル ソ ース コ ー ド 互換」 を参照)。
新 し い イ ン タ フ ェ ース では、PDFlib メ ソ ッ ド に受け渡 さ れ る 文字列 と 、PDFlib メ ソ ッ ド か
ら 受け取 る 文字列はすべて、 ネ イ テ ィ ブ wstring であ る と 前提 し ます。 wchar_t デー タ 型
のサ イ ズに応 じ て、 wstring は UTF-16 (2 バ イ ト キ ャ ラ ク タ 群) か UTF-32 (4 バ イ ト キ ャ
ラ ク タ 群) でエン コ ー ド さ れた Unicode 文字列を内容 と し て持つ と 見な さ れます。 ソ ース
32
第 2 章 : PDFlib の言語バイ ンデ ィ ング
コ ー ド 内の リ テ ラ ル文字列は、 ワ イ ド 文字列であ る こ と を示すために接頭辞 L をつけ る 必
要があ り ます。 リ テ ラ ル内の 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
2.2 C++ バイ ンデ ィ ング
33
C++ におけ る エ ラ ー処理 PDFlib API 関数は、 エ ラ ー発生時には C++ 例外を発生 さ せま
す。 こ の例外は ク ラ イ ア ン ト コ ー ド 内で C++ の try ~ catch 節を用いて キ ャ ッ チ さ れ る 必
要 が あ り ま す。 詳細 な エ ラ ー情報提供 の た め、 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) は、 相互作用す る さ ま ざ ま な ソ フ ト ウ ェ ア コ ン ポーネ ン
ト のための言語非依存な規格です。 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.7\bin\pdflib _
com.dll に対する 実行パー ミ ッ シ ョ ン と が必要です。
> イ ン ス ト ール実行時には、 シ ス テ ム の レ ジ ス ト リ に対す る 書 き 込みパー ミ ッ シ ョ ン が
必要です。 Administrator ない し Power Users グループの権限があれば通常充分です。
PDFlib の MSI イ ン ス ト ー ラ PDFlib は MSI パ ッ ケージ (Microsoft's Windows Installer) と
し て入手可能です。 MSI パ ッ ケージは、 イ ン ス ト ール ・ 修復 ・ ア ン イ ン ス ト ール機能を提
供す る も のです。 PDFlib を MSI パ ッ ケージか ら イ ン ス ト ールする には、 単に .msi フ ァ イ
ルを ダブル ク リ ッ ク す る か、 右 ク リ ッ ク し て 「 イ ン ス ト ール」 を選択 し ます。
PDFlib COM コ ン ポーネ ン ト の イ ン ス ト ール用に提供 さ れてい る プ ロ グ ラ ム を実行 さ
せ る と 、 自動的に、 PDFlib で COM が完全利用で き る よ う にな り ます。 説明の完全を期す
る ため、 以下、 PDFlib の利用に必要な実行時環境を挙げ ま す ( イ ン ス ト ールルーチ ン に
よ っ て自動的に こ の よ う にな り ます) :
> PDFlib COM の DLL pdflib_com.dll を、 イ ン ス ト ール し たデ ィ レ ク ト リ へ コ ピー。
2.3 COM バイ ンデ ィ ング
35
> PDFlib COM の DLL は Windows の レ ジ ス ト リ への登録が必要です。イ ン ス ト ー ラ は自己
登録 PDFlib DLL を使っ て登録を行い ます。
> PDFlib の ラ イ セ ン ス版を イ ン ス ト ール し た場合、 ラ イ セ ン ス キーを シ ス テ ムに入れ る 。
サ イ レ ン ト イ ン ス ト ール PDFlib を他の ソ フ ト ウ ェ アパ ッ ケージに含めて再配布す る 必
要のあ る 場合や、SMS の よ う な ツールで管理 さ れた多数のマシ ンに イ ン ス ト ールす る 必要
のあ る 場合には、 手動で PDFlib を各マシ ンに イ ン ス ト ールす る のは大変な作業で し ょ う 。
その よ う な場合 PDFlib はユーザー入力な し で自動 イ ン ス ト ール さ せ る こ と も 可能です。
MSI イ ン ス ト ー ラ はサ イ レ ン ト イ ン ス ト ールに対応 し てい ます。 た と えば、 コ マ ン ド
ラ イ ンで次の コ マ ン ド を実行すれば、 ユーザー入力な し で PDFlib を イ ン ス ト ールで き ま
す:
msiexec.exe /I PDFlib-x.y.z-MSWin32-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/macOS の場合 : 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-C で使 う こ と も で き ますが、 Objective-C 用の真
正言語バ イ ンデ ィ ン グ も あ り ます。 PDFlib フ レーム ワ ー ク には以下の種類があ り ます :
> PDFlib : OS X/macOS 用
> PDFlib_ios : iOS 用
ど ち ら の フ レーム ワー ク も C・C++・Objective-C 用の言語バ イ ンデ ィ ン グ を含んでい ます。
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:@""];
コ ー ド 補完のための XCode Code Sense は PDFlib フ レーム ワ ー ク で使用で き ます。
2.7 Objective-C バイ ンデ ィ ング
47
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 バ イ ン デ ィ ン グ
Perl 用 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/macOS の場合 : 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.16/i686-linux
Windows DLL pdflib_pl.dll と モジ ュ ール pdflib_pl.pm ・ PDFlib/PDFlib.pm が、 カ レ ン ト
デ ィ レ ク ト リ で検索 さ れ る か、以下の Perl コ マ ン ド で出力 さ れ る デ ィ レ ク ト リ で検索 さ れ
ます :
perl -e "use Config; print $Config{sitearchexp};"
上記 コ マ ン ド の一般的な出力は次の よ う にな り ます。
C:\Program Files\Perl5.16\site\lib
デー タ 型
す。
引数は、表 2.7 に挙げ る デー タ 型に従っ て PDFlib API へ渡 さ れ る 必要があ り ま
表 2.7 Perl バイ ンデ ィ ングにおけるデー タ 型
API デー タ 型
Perl バイ ンデ ィ ングにおけるデー タ 型
文字列デー タ 型
string
バイ ナ リ デー タ 型
string
2.8 Perl バイ ンデ ィ ング
49
Perl におけ る エ ラ ー処理 Perl バ イ ンデ ィ ン グは、 PDFlib のエ ラ ーを ネ イ テ ィ ブ Perl 例
外に翻訳 し ます。 Perl の例外は、 適切な言語構造を適用す る こ と に よ り 取 り 扱 う こ と がで
き ます。 すなわち、 問題の起 こ り そ う な箇所を次の よ う に挟みます :
eval {
...いろいろなPDFlib命令...
};
if ([email protected]) {
die("$0: PDFlib例外が発生しました:\[email protected]");
文字列処理の複数の方式 アプ リ ケーシ ョ ン での必要に応 じ て、 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 文字列を作成 し ます :
$delta = "\N{GREEK CAPITAL LETTER DELTA}";
Encode モジ ュ ールは多 く のエ ン コ ーデ ィ ン グに対応 し てお り 、 そのエ ン コ ーデ ィ ン グ間
変換のための イ ン タ フ ェ ース を持っ てい ます :
50
第 2 章 : PDFlib の言語バイ ンデ ィ ング
use Encode 'decode';
$data = decode("iso-8859-3", $data);
# レガシからUTF-8へ変換
2.8 Perl バイ ンデ ィ ング
51
2.9 PHP バ イ ン デ ィ ン グ
PDFlib PHP 版を イ ン ス ト ール PDFlib を PHP で使 う 際の さ ま ざ ま な方式やオプシ ョ ンに
関す る 詳細な情報は、 PDFlib-in-PHP-HowTo.pdf 文書に記載 し て あ り ます。 こ の文書はデ ィ
ス ト リ ビ ュ ーシ ョ ンパ ッ ケージに含まれてお り 、 ま た、 PDFlib ウ ェ ブサ イ ト に も 掲載 し て
あ り ます。
PHP を設定 し て、 外部の PDFlib ラ イ ブ ラ リ について PHP が認識す る 必要があ り ます。
2 通 り の選択肢があ り ます :
> php.ini に以下の行の う ちのいずれか を追加す る :
extension=php_pdflib.so
; Unix・OS X/macOS用
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 が置かれてい
る デ ィ レ ク ト リ の中でのみ検索 し ます。 なお、 PDFlib は UTF-8 符号化 さ れた フ ァ イ ル
名を受け付け ますが、PHP の dirname( ) 関数は通常は WinAnsi 等のホ ス ト エン コ ーデ ィ
ン グ を返す こ と に留意 し て く だ さ い。 こ の場合には、 デ ィ レ ク ト リ か フ ァ イ ルの名前
を UTF-8 へ変換す る 必要があ り ます。 詳 し く は 97 ページ 「4.2.2 UTF-8 対応のあ る 言
語バ イ ンデ ィ ン グ」 を参照 し て く だ さ い。 例 :
$searchpath = dirname(dirname(__FILE__)).'/data';
$searchpath = $p->convert_to_unicode("auto", $searchpath, "outputformat=utf8");
プ ラ ッ ト フ ォームに依存 し ない フ ァ イ ル名の取 り 扱い を行 う には、 SearchPath 機能の利用
を強 く 推奨 し ます (64 ページ 「3.1.3 リ ソ ース構成 と フ ァ イ ル検索」 参照)。
52
第 2 章 : PDFlib の言語バイ ンデ ィ ング
デー タ 型
す。
引数は、表 2.8 に挙げ る デー タ 型に従っ て PDFlib API へ渡 さ れ る 必要があ り ま
表 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 を用い て開発 PHP Development Tools (PDT) は 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 メ ソ ッ ド に対す る コ ー ド 補完 と 状況依存ヘルプで支援 し
ます。
2.9 PHP バイ ンデ ィ ング
53
2.10 Python バ イ ン デ ィ ン グ
PDFlib Python 版を イ ン ス ト ール Pythonの拡張機構は共有 ラ イ ブ ラ リ を実行時に読み込
む こ と に よ っ て動作 し ま す。 PDFlib バ イ ンデ ィ ン グ を動作 さ せ る には、 以下の よ う に、
Python イ ン タ プ リ タ が Python 用 PDFlib ラ イ ブ ラ リ を利用で き る よ う にす る 必要があ り ま
す。 こ の ラ ッ パは、PYTHONPATH 環境変数に列挙 さ れたデ ィ レ ク ト リ 内で検索 さ れます。
Python ラ ッ パの名前はプ ラ ッ ト フ ォームに よ っ て異な り ます :
> Unix ・ OS X/macOS : 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()
54
第 2 章 : PDFlib の言語バイ ンデ ィ ング
2.11 REALbasic/Xojo バ イ ン デ ィ ン グ
PDFlib REALbasic/Xojo 版を イ ン ス ト ール REALbasic/Xojo 用 PDFlib プ ラ グ イ ン
(PDFlib.rbx) を、 REALbasic/Xojo アプ リ ケーシ ョ ンが存在する フ ォ ルダの中の Plugins と
い う フ ォ ルダに コ ピーす る 必要があ り ます。 REALbasic/Xojo 用 PDFlib プ ラ グ イ ンは、 単
一のパ ッ ケージで頒布 さ れ、 OS X/macOS ・ Windows ・ Linax 版を含んでい ます。
こ の こ と はつま り 、 REALbasic/Xojo の任意のバージ ョ ン を使っ て、 すべての対応 し て
い る プ ラ ッ ト フ ォ ーム のためのア プ リ ケーシ ョ ン を ビ ル ド す る こ と がで き る こ と を意味
し ます。 ス タ ン ド ア ロ ンのアプ リ ケーシ ョ ン を生成す る 際、 REALbasic は PDFlib プ ラ グ イ
ンの中の適切な部分を選択 し て、 そのプ ラ ッ ト フ ォームで必要な部分だけ を、 生成 さ れ る
アプ リ ケーシ ョ ンの中に イ ン ク ルー ド し ます。
追加の REALbasic/Xojo ク ラ ス PDFlib プ ラ グ イ ンはオブジ ェ ク ト ヒ エ ラ ルキーに 2 つの
新た な ク ラ ス を追加 し ます :
> PDFlib ク ラ ス。 すべての PDFlib API メ ソ ッ ド を含んでい ます。
> PDFlibException ク ラ ス。RuntimeException か ら 派生 し た も ので、PDFlib が発生 さ せ る 例
外を扱 う のに使え ます (後述)。
PDFlib を使っ て、 コ ン ソ ールアプ リ ケーシ ョ ンだけでな く GUI アプ リ ケーシ ョ ン も 作成
す る こ と がで き ます。 PDFlib は コ ン ト ロ ールではないので、 コ ン ト ロ ールパレ ッ ト に新た
なア イ コ ンは イ ン ス ト ール さ れません。 し か し 、 PDFlib プ ラ グ イ ンが利用可能であれば、
REALbasic/Xojo は PDFlib の ク ラ ス と その関連 メ ソ ッ ド を認識 し ます。 た と えば、 ス テー
ト メ ン ト 補完機能や引数チ ェ ッ ク 機能は PDFlib API メ ソ ッ ド に対 し て完全に動作 し ます。
デー タ 型
ます。
引数は、 表 2.10 に挙げ る デー タ 型に従っ て PDFlib API へ渡 さ れ る 必要があ り
表 2.10 REALbasic/Xojo バイ ンデ ィ ン グにおけるデー タ 型
API デー タ 型
REALbasic/Xojo バイ ンデ ィ ングにおけるデー タ 型
文字列デー タ 型
string
バイ ナ リ デー タ 型
MemoryBlock
REALbasic/Xojo におけ る エ ラ ー処理 例外発生時には PDFlib は ク ラ ス PDFlibException の
ネ イ テ ィ ブな REALbasic/Xojo 例外を発生 さ せます。 PDFlib 例外は REALbasic/Xojo の標準
的技法で処理す る こ と がで き ます : try ~ catch ブ ロ ッ ク を用い る か (推奨)、 Exception ブ
ロ ッ ク で処理す る かの ど ち ら かです。
2.11 REALbasic/Xojo バイ ンデ ィ ング
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 版を イ ン ス ト ール Ruby の拡張機構、共有 ラ イ ブ ラ リ を動作時に読み込む こ
と に よ っ て動作 し ます。 PDFlib バ イ ンデ ィ ン グが動作する には、 Ruby 用の PDFlib 拡張 ラ
イ ブ ラ リ の場所を Ruby イ ン タ プ リ タ が知っ ていて利用で き る 必要があ り ます。 たいてい
の 場 合、 こ の ラ イ ブ ラ リ (Windows ・ Unix の 場 合 : PDFlib.so。 OS X/macOS の 場合 :
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 Rails は、 Ruby に よ る Web 開発を実現す る オープン ソ ース フ レー
ム ワ ー ク です。Ruby 用 PDFlib 拡張は Ruby on Rails で利用可能です。Ruby on Rails 用 PDFlib
作成例を実行す る には以下の手順に従っ て く だ さ い :
> Ruby と Ruby on Rails を イ ン ス ト ール。
> コ マ ン ド ラ イ ンか ら 新規 コ ン ト ロ ー ラ を セ ッ ト ア ッ プ :
$ rails new pdflibdemo
$ cd pdflibdemo
$ cp <PDFlibディレクトリ>/bind/ruby/<バージョン>/PDFlib.so vendor/ # .so/.dll/.bundleを使用
58
第 2 章 : PDFlib の言語バイ ンデ ィ ング
$ 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-programming カ テ ゴ リ にあ り ます。
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出力は継続できない
*/
62
第 3 章 : PDF 文書を作成
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの general-programming/error_handling ト ピ ッ ク に
あ り ます。
警告 問題の状況に よ っ ては、 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 は、 それぞれの仮想フ ァ イ ルに内部 ロ ッ ク
をかけてお き 、 その内容が も う 必要な く な っ た時には じ めて ロ ッ ク を外 し ます。 そのデー
3.1 PDFlib プ ロ グ ラ ミ ングの一般的特徴
63
タ を ただちに コ ピー し てお く よ う ク ラ イ ア ン ト が PDFlib に要求 し た場合 (PDF_create_
pvf( ) で copy オプシ ョ ン を指定) を除いては、 仮想フ ァ イ ルの内容を ク ラ イ ア ン ト が変
更・削除・解放す る こ と が許 さ れ る のは、PDFlib が ロ ッ ク が外 し た後に限 ら れます。PDFlib
は、 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 フ ァ イ ルはテ キ ス ト フ ァ イ ルであ り 、 その構造は非常に単純で、
テ キ ス ト エデ ィ タ で簡単に書 く こ と がで き ま す し 、 自動生成 さ せ る こ と も で き ま す。 ま
ず、 その文法を見てみま し ょ う :
3.1 PDFlib プ ロ グ ラ ミ ングの一般的特徴
65
> それぞれの行は最大 1023 キ ャ ラ ク タ ま で。
> 行末のバ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ 「\」 は、 行終端を キ ャ ン セル し ます。 こ れは行を
延長 し たい と き に使え ます。
> パーセ ン ト 「%」 キ ャ ラ ク タ は、 行末ま での注釈を開始 さ せます。 行デー タ の一部であ
る (すなわち注釈を開始 さ せない) パーセ ン ト キ ャ ラ ク タ は、直前にバ ッ ク ス ラ ッ シ ュ
キ ャ ラ ク タ を付けて保護す る 必要があ り ます。
> 行終端 を 保護す る バ ッ ク ス ラ ッ シ ュ と 、 パーセ ン ト キ ャ ラ ク タ を 保護す る バ ッ ク ス
ラ ッ シ ュ キ ャ ラ ク タ と の直前のバ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ 群は、 行デー タ の一部で
あ る な ら 二重にす る 必要があ り ます。
> ピ リ オ ド 「.」 を単独で用い る と 、 セ ク シ ョ ンの終了を意味 し ます。
> すべてのエン ト リ は、 大文字 ・ 小文字を区別 し ます。
> スペースは、 リ ソ ース名中 と フ ァ イ ル名中をのぞ く あ ら ゆ る 箇所で無視 さ れます。
> リ ソ ース の名前を値は、 等号 「=」 を一切含んではいけ ません。
> 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} {/パス/パス/ディレクトリ2}}");
66
第 3 章 : PDF 文書を作成
検索パ ス を複数設定す る こ と も で き 、 ま た、 複数のデ ィ レ ク ト リ 名を 1 回の呼び出 し の中
で与え る こ と も で き ます。空白キ ャ ラ ク タ を含んだデ ィ レ ク ト リ 名に よ る 問題を避け る た
めに、 エン ト リ が 1 個だけの場合に も 中カ ッ コ を二重に用い る こ と を推奨 し ます。 空の文
字列 リ ス ト (例 : {{}}) は、 既存のすべての検索パス を、 デフ ォ ル ト 項目 も 含めて削除 し
ます。
こ の検索を無効にす る には、 フルパ ス に よ る 指定を PDFlib 関数の中に書き ます。 なお、
SearchPath リ ソ ー ス カ テ ゴ リ の機能は以下の よ う にプ ラ ッ ト フ ォ ーム依存にな っ てい ま
す:
> Windows の場合、PDFlib はレ ジ ス ト リ か ら の項目群で SearchPath を初期化 し ます。以下
の レ ジ ス ト リ エン ト リ にパス名の リ ス ト を セ ミ コ ロ ン 「;」 で区切っ て指定す る こ と が
可能です。 こ れ ら は以下の順序で検索 さ れます :
HKLM\SOFTWARE\PDFlib\PDFlib9\9.0.7\SearchPath
HKLM\SOFTWARE\PDFlib\PDFlib9\SearchPath
HKLM\SOFTWARE\PDFlib\SearchPath
> COM イ ン ス ト ー ラ は、 こ の SearchPath レ ジ ス ト リ エン ト リ を、 以下のデ ィ レ ク ト リ で
初期化 し ます (PDFlib を別の場所に イ ン ス ト ール し た場合には同様のデ ィ レ ク ト リ ) :
C:\Program Files\PDFlib\PDFlib 9.0.7\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/macOS ・ 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/macOS では、 <rootpath> は まず /usr/local へ置 き 換え ら れ、 ついで
HOME デ ィ レ ク ト リ へ置 き 換え ら れます。 i5/iSeries では、 <rootpath> は空です。
デ フ ォ ル ト フ ァ イ ル名 と ラ イ セ ン ス フ ァ イ ル ・ リ ソ ース フ ァ イ ル デフ ォ ル ト では、 以
下の フ ァ イ ル名が、 デフ ォ ル ト 検索パ スデ ィ レ ク ト リ 群の中で検索 さ れます :
3.1 PDFlib プ ロ グ ラ ミ ングの一般的特徴
67
licensekeys.txt
pdflib.upr
(ライセンスファイル。MVSの場合: license)
(リソースファイル。MVSの場合: upr)
こ の機能を利用す る と 、 ラ イ セ ン ス フ ァ イ ルを、 環境変数や実行時オプシ ョ ン を一切設定
し ないで扱 う こ と がで き ます。
サン プル 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/macOS ・ 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
68
第 3 章 : PDF 文書を作成
Unix シ ス テ ム ・ OS X/macOS では、 <rootpath> は、 まず /usr/local で、 ついで HOME
デ ィ レ ク ト リ で置 き 換え ら れます。 i5/iSeries では <rootpath> はは空です。 こ の機能を
利用すれば、環境変数や実行時オプシ ョ ン を一切指定せずに ラ イ セ ン ス フ ァ イ ル ・UPR
フ ァ イ ル ・ リ ソ ース を取 り 扱 う こ と も で き ます。
> 環境変数 PDFLIBRESOURCEFILE が定義 さ れていれば、その値を PDFlib は、読み込むべ き
UPR フ ァ イ ルの名前 と し ます。 こ の フ ァ イ ルが読み込めない と き は例外が発生 し ます。
> 環境変数 PDFLIBRESOURCEFILE が定義 さ れていない場合、PDFlib は以下の名前の フ ァ イ
ルを開 こ う と し ます :
upr (MVSの場合。データセットが期待される)
pdflib/<バージョン>/fonts/pdflib.upr (IBM i5/iSeriesの場合)
pdflib.upr (Windows・Unix・その他すべてのシステムの場合)
こ の フ ァ イ ルが読み込めない と き は例外は発生 し ません。
> Windows では上記以外に PDFlib は以下の レ ジ ス ト リ エン ト リ を読み込 も う と し ます。以
下の順に検索 さ れます :
HKLM\Software\PDFlib\PDFlib9\9.0.7\resourcefile
HKLM\Software\PDFlib\PDFlib9\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 か ら 開始)
を オプシ ョ ン と し て指定 し ます。 た と えば以下の呼び出 し :
3.1 PDFlib プ ロ グ ラ ミ ングの一般的特徴
69
idx = p.get_option("SearchPath", "resourcenumber=" + n);
sp = p.get_string(idx, "");
は、 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 デー タ
の転送) に関す る タ イ ミ ン グ上の、 ひいてはバ ッ フ ァ 容量上の束縛条件は、 ク ラ イ ア ン ト
70
第 3 章 : PDF 文書を作成
側で構成す る こ と がで き る ので、 柔軟性が非常に高 く な っ てい ます。 環境に よ っ て、 PDF
文書を ま る ご と 一度に取 り 出すのが好都合な場合 も あ る で し ょ う し 、複数のチ ャ ン ク に分
け る のが よ い場合 も あ る で し ょ う し 、た く さ んの コ マ切れに分けて PDFlib の内部文書バ ッ
フ ァ 量 を 抑 え る のが望 ま し い場合 も あ る で し ょ う 。 放出の手法 を 設定す る には、 PDF_
open_document_callback( ) で flush オプシ ョ ンの値を指定 し ます。
3.1.5 PDF 文書の最大サ イ ズ と その他の制限
PDF 文書のサ イ ズ
多 く のユーザーはギガバ イ ト 単位の PDF 文書を扱 う 必要には迫 ら れ
ないで し ょ う が、 業務アプ リ ケーシ ョ ンのなかには、 大量の請求書や明細な ど を含む文書
を作成 し た り 処理 し た り す る 必要があ る も のがあ り ます。PDFlib 自体は生成す る 文書のサ
イ ズにいかな る 制約 も 設けてい ませんが、 PDF Reference やい く つかの PDF 規格に よ っ て
課せ ら れ る い く つかの制限があ り ます :
> 10 GB フ ァ イ ルサ イ ズ制限:PDF 文書は伝統的に、相互参照テーブルに よ っ て内部的に、
10 進 10 桁すなわち 1010-1 バ イ ト ま でに制限 さ れて き ま し た。 こ れはお よ そ 9.3 GB に
あ た り ます。 し か し 、 圧縮オブジ ェ ク ト ス ト リ ーム を用いれば こ の制約は超え る こ と
がで き ます。 10 GB を超え る 出力文書を作成 し よ う と す る な ら 、 PDF 1.5 以上が必要で
す。 圧縮オブジ ェ ク ト ス ト リ ームはいずれにせ よ フ ァ イ ル全体のサ イ ズ を低減 さ せま
すが、 objectstreams 実装の一部であ る 圧縮相互参照ス ト リ ームは も はや 10 進 10 桁の
制限下には置かれず、 し たがっ て 10 GB を超え る PDF 文書の作成を可能に し ます。 圧
縮オブジ ェ ク ト ス ト リ ームは、optimize ・ linearize 文書オプシ ョ ンのいずれかが true に
設定 さ れてい る 場合には、 作成す る こ と がで き ません。
> オブジ ェ ク ト の数 : 一文書内のオブジ ェ ク ト の数は全般的には PDF に よ っ て制限 さ れ
てい ませんが、 PDF/A ・ PDF/X-4 ・ PDF/X-5 規格では、 一文書内の間接オブジ ェ ク ト
の数を 8,388,607 個に制限 し てい ます。一文書が こ の制限を超え る オブジ ェ ク ト を必要
と する と き は、 PDFlib は PDF/A-1 ・ PDF/X-4 ・ PDF/X-5 モー ド では例外を発生 さ せま
す。 それ以外のモー ド ではつねに、 も っ と オブジ ェ ク ト の多い文書を作成で き ます。 こ
のチ ェ ッ ク を、 文書オプシ ョ ン limitcheck=false を用いて無効化す る こ と も で き ます。
PDF 内のオブジ ェ ク ト の数は、 ページ内容の複雑 さ や、 相互参照要素の数な ど に依存
し ます。 シ ンプルな内容の大容量文書は通常ページ あ た り 4 ~ 10 個のオブジ ェ ク ト を
持ち ますので、100 ~ 200 万ページ程度の文書であれば、規格が要求す る こ のオブジ ェ
ク ト 制限を超えずに作成す る こ と がで き ます。
PDF の制限
PDFlib は、特定の実体に制約を課す こ と に よ っ て、PDF Reference か Acrobat、
ま たは何 ら かの PDF 規格に よ っ て課せ ら れ る 制限に準拠する PDF 出力を作成 し ます。 こ
れ ら の制限を以下に記 し ます。
以下の制限が、 値を然 る べ く 変更す る こ と に よ っ て強制 さ れます :
> PDF 内におけ る 最小の絶対浮動小数点値:0.000015。 こ れ よ り 小 さ な絶対値を持つ数は
0 へ置換 さ れます。
> (PDF 1.4。ただ し それ よ り 新 し い PDF バージ ョ ンにはあ ては ま り ません)PDF 内におい
て浮動小数点数 と し て表現で き る 最大の絶対値 : 32767.0。 こ れ よ り 大 き な絶対値を持
つ数は、 その最 も 近い整数へ置換 さ れます。
PDF 形式は特定の諸制限を課 し てい ます。以下のいずれか 1 つの制限を超え る と 例外が発
生 し ます :
> PDF 内において許容 さ れ る 最大の数値 : 2,147,483,647
> ハ イ パーテ キ ス ト 文字列の最大長 : 65535
3.1 PDFlib プ ロ グ ラ ミ ングの一般的特徴
71
> ページ上のテ キ ス ト 文字列の最大長 : kerning=false かつ wordspacing=0 の場合には
32,763 バ イ ト (すなわち、 CID フ ォ ン ト の場合には 16,381 キ ャ ラ ク タ )。 そ う でない
な ら 4095 キ ャ ラ ク タ
> 以下のオプシ ョ ンの リ ス ト エン ト リ は最大 8191 個に制限 さ れてい ます :
views, namelist, polylinelist, fieldnamelist, itemnamelist, itemtextlist, children, group
> PDF/A-1/2/3 と PDF/X-4/5 内におけ る 最大間接オブジ ェ ク ト 数 : 8,388,607
3.1.6 マルチ ス レ ッ ド プ ロ グ ラ ミ ン グ
PDFlib の ス レ ッ デ ィ ン グ動作は、次の よ う に特徴づけ ら れます : PDFlib その も のはシ ン グ
ル ス レ ッ ド ですが、 マルチ ス レ ッ ド アプ リ ケーシ ョ ン で安全に使用す る こ と がで き ます。
1 つの PDFlib オブジ ェ ク ト が 1 つの ス レ ッ ド 内でのみ使用 さ れ る と い う よ く あ る 状況にお
いては、 マルチ ス レ ッ デ ィ ン グに関する 特別な注意は一切必要あ り ません。 同一の PDFlib
オブジ ェ ク ト が複数の ス レ ッ ド 内で使用 さ れ る 場合には、 その PDFlib オブジ ェ ク ト が複
数の ス レ ッ ド に よ っ て同時にア ク セ ス さ れ る こ と のない よ う 、アプ リ ケーシ ョ ンはそれ ら
の ス レ ッ ド を同期 さ せ る 必要があ り ます。 典型的なシナ リ オは PDFlib オブジ ェ ク ト 群の
プールを利用する も ので、 そ こ では各ス レ ッ ド が、 新規 PDFlib オブジ ェ ク ト を作成す る
のではな く 、 既存の PDFlib オブジ ェ ク ト を 1 つ取 り 出 し て、 そ し て文書を作成 し た後に、
そのオブジ ェ ク ト が も う 必要ない場合には、 それを プールへ返 し ます。 同一の PDFlib オ
ブジ ェ ク ト を、 その出力文書が完了す る 前に別の ス レ ッ ド で使用す る こ と は、 アプ リ ケー
シ ョ ンに と っ ていかな る 利点を も 与え る こ と はめっ たにな く 、 推奨 さ れません。
3.1.7 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 入出力フ ァ イ ル
72
第 3 章 : PDF 文書を作成
> PFB フ ォ ン ト ア ウ ト ラ イ ン フ ァ イ ル ・ PFM フ ォ ン ト メ ト リ ッ ク フ ァ イ ル
> TrueType ・ OpenType フ ォ ン ト フ ァ イ ル
> 画像フ ァ イ ル ・ ICC プ ロ フ ァ イ ル
3.1 PDFlib プ ロ グ ラ ミ ングの一般的特徴
73
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 に設定 さ れていれば、ページ内容に対 し て も イ ン タ ラ ク テ ィ ブ要素に対 し て も 同 じ 座
標系が使え る と い う こ と です。
74
第 3 章 : PDF 文書を作成
座標を視覚化 PDFlib のユーザーが PDF の座標系を扱 う のを支援す る ために、 PDFlib の
デ ィ ス ト リ ビ ュ ーシ ョ ンには grid.pdf と い う PDF フ ァ イ ルが含まれてい ます。 こ の PDF
フ ァ イ ルは、 よ く 使われ る い く つかのページサ イ ズの座標を視覚化する も のです。 望みの
サ イ ズのページ を何か透明な も のに印刷すれば、PDFlib での開発のために有用な道具にな
る か も し れません。
ページ座標は、 Acrobat では以下の よ う に し て視覚化で き ます :
> カー ソ ル座標を表示す る には以下を用い ます :
Acrobat X/XI/DC : 「表示」 → 「表示切 り 替え」 → 「カ ー ソ ル座標」
> 座標は、Acrobat で現在選択 さ れてい る 単位で表示 さ れます。表示単位を変更す る には、
Acrobat X/XI/DC では次の よ う に操作 し ます : 「編集」 → 「環境設定」 (→ 「一般 ...」)
→ 「単位 と ガ イ ド 」 を選択 し て、 ポ イ ン ト ・ イ ンチ ・ ミ リ ・ パ イ カ ・ セ ンチ メ ー ト ル
の う ちのいずれか を選びます。
ただ し 、 表示 さ れ る 座標系はページの左上隅が原点であ り 、 PDF のデフ ォ ル ト であ る 左下
隅の原点 と は異な る ので注意が必要です。 Acrobat の座標表示 と 合わせた座標系を選ぶ方
法については 75 ページ 「下向 き 座標を用い る 」 を参照 し て く だ さ い。
オ ブ ジ ェ ク ト を回転 重要な こ と は、 一度ページ上に描いた も のは変更がで き ない と い
う こ と です。 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 の変換関数で簡単に設定す る こ と がで き ます。 と こ ろが、 こ の変
換はテ キ ス ト 出力に対 し て も 効力を持つので (テ キ ス ト が簡単に上下ひっ く り 返 り ます)、
テ キ ス ト が裏返 し にな っ て し ま わない よ う にす る には、ほかに も 何 ら かの呼び出 し を行 う
こ と が必要にな り ます。
3.2 ページ記述
75
下向 き 座標が簡単に利用で き る よ う にす る ため、 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 のす
べての枠エン ト リ に対応 し てい ます。PDFlib の ク ラ イ ア ン ト で指定で き る エン ト リ を以下
に挙げます (それぞれの定義は PDF リ フ ァ レ ン ス よ り )。 こ う し た項目はあ る 種の環境で
有用です :
76
第 3 章 : PDF 文書を作成
表 3.2 Acrobat の最小 ・ 最大ページサイ ズ
PDF 表示ソ フ ト
最小ページサイ ズ
最大ページサイ ズ
userunit オプ シ ョ ン な し
(デ フ ォ ル ト )
1/24" = 3 pt = 0.106 cm
200" = 14400 pt = 508 cm
userunit オプ シ ョ ンあ り
3 ユーザー単位
14 400 ユーザー単位
userunit の最大値は 75 000 なので、 可能なページサイ
ズは最大 14 400×75 000 = 1 080 000 000 ポ イ ン ト =
381 km
> 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 つお よ び関連す る 関数で処理す る 必要があ り ます。 こ れ ら の関数
はパ ス を消費 し 削除 し ます。 パス を複数回使 う 唯一の方法は、PDF_save( ) と PDF_restore( )
を用い る こ と です。
3.2 ページ記述
77
直接パ ス を作成 し ておいて上記の操作を何 も 適用 し ない と エ ラ ーにな り ま す。 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( ) を用いてページ記述上で利用す る こ と がで き ま
す。 すなわち塗っ た り 、 描線 し た り 、 ク リ ッ ピ ン グパ ス と し て用いた り す る こ と がで
き ます。
> パ ス オブジ ェ ク ト を、 テ キ ス ト フ ロ ーの回 り こ み形状 と し て用い る こ と がで き ま す :
テ キ ス ト が任意の形状の内部 ま た は外部 を 回 り こ む よ う に組 ま れ ま す (240 ページ
「8.2.11 テ キ ス ト をパス ・ 画像に回 り 込ませる 」 参照)。
> テ キ ス ト をパ ス上に配置す る こ と も で き ます。 すなわち、 キ ャ ラ ク タ 群がパ ス の直線
や曲線に沿っ て並べ ら れます (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);
パ ス オブジ ェ ク ト をいちいち描画操作で作成する のではな く 、取 り 込み画像か ら ク リ ッ ピ
ン グパ ス を抽出す る こ と も で き ます :
image = p.load_image("auto", "image.tif", "clippingpathname={path 1}");
/* 画像のクリッピングパスからパスオブジェクトを作成 */
path = (int) p.info_image(image, "clippingpath", "");
78
第 3 章 : PDF 文書を作成
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( ) 関数でページ上ま たは他のテ ンプ レー ト 上に貼 り 付け る こ と がで き ます (206
ページ 「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);
あ ら ゆ る テ キ ス ト ・ グ ラ フ ィ ッ ク ・ 色関数がテ ンプ レー ト 上では使え ます。 ただ し 、 以下
の関数は、 テ ンプ レー ト を作成 し てい る 間には使っ てはいけ ません :
3.2 ページ記述
79
> 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/
VT-2 の重要な要素です。 参照ページ を表示す る には、 Acrobat を以下の よ う に正 し く 構成
す る こ と が重要です (外部参照群を含んでい る 文書を コ ン テナ文書 と いい ます。 参照ペー
ジ (群) を持つ外部 PDF 文書を参照先フ ァ イ ル と いい ます) :
> 「編集」 → 「環境設定」 → 「一般 ...」 → 「ページ表示」 → 「参照 XObject タ ーゲ ッ ト を表
示」 : 「つねに」 に設定 (設定 「PDF-X/5 準拠のもののみ」 は、 Acrobat X/XI/DC のバグ
のため動作 し ません)。
> 「編集」 → 「環境設定」 → 「一般 ...」 → 「ページ表示」 → 「参照 さ れる フ ァ イルの場
所」 : 参照先フ ァ イ ルがあ る デ ィ レ ク ト リ の名前を入力。
> 「編集」 → 「環境設定」 → 「一般 ...」 → 「セキ ュ リ テ ィ (拡張)」 → 「セキ ュ リ テ ィ 特権
の場所」 → 「 フ ォルダのパス を追加」 : コ ン テナ文書があ る デ ィ レ ク ト リ の名前を追加。
こ れは 「拡張セキ ュ リ テ ィ を有効にする」 の設定にかかわ ら ず行 う 必要があ り ます。
参照先ページは、 コ ン テナ PDF 内部でその フ ァ イ ル名 と ページ番号が指定 さ れてお り 、以
下の条件すべて を満たす と き にのみ代理でな く それが表示 さ れます :
> コ ン テナ文書が Acrobat の構成に従っ て信頼 さ れてい る 。
> 指定 さ れたデ ィ レ ク ト リ 内で参照先フ ァ イ ルが見つか っ た。
> 参照先フ ァ イ ルがパ ス ワー ド を一切要求せず、 エ ラ ーな く 開 く こ と がで き る 。
> コ ン テナ文書内で指定 さ れた参照ページのページ番号が参照先フ ァ イ ル内に存在 し て
いる。
> PDF/X-5 のみ:参照先内の ID と 特定の XMP メ タ デー タ エン ト リ 群が、コ ン テナ文書内
のその照応す る エン ト リ 群 と 整合す る 必要があ り ます。
こ れ ら の条件に 1 つで も 違反 し てい る と き は、 参照先ページでな く 代理が表示 さ れます。
Acrobat はいかな る エ ラ ー メ ッ セージ も 出 し ません。
参照先ページの代理 PDFlib は、 以下のオブジ ェ ク ト のいずれか を、 参照ページに対す
る プ レース ホルダ (代理) と し て用い る こ と がで き ます :
> 別の取 り 込み PDF ページ (参照先を単純化 し た も の等)。外部参照先に対す る 代理 と し
て用い ら れ る PDF ページは、 参照先ページ と 同 じ ページ寸法であ る 必要があ り ます。
80
第 3 章 : 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);
代理は、 ページ上に通常どお り に配置す る こ と がで き ます。 それは、 外部参照先への参照
を保持 し ます。
3.2 ページ記述
81
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)
pCOS アルゴ リ ズム 1
RC4 40 ビ ッ ト (脆弱な アルゴ リ ズム。 使用する
べき で ない)
32 キ ャ ラ ク タ (Latin-1)
PDF 1.4 (Acrobat 5)
pCOS アルゴ リ ズム 2
RC4 128 ビ ッ ト (脆弱。 使用するべき で ない)
32 キ ャ ラ ク タ (Latin-1)
PDF 1.5 (Actobat 6)
pCOS アルゴ リ ズム 3
PDF 1.4 と 同 じ 、 ただ し 暗号化方式の異な る応用
(脆弱。 使用するべき でない)
32 キ ャ ラ ク タ (Latin-1)
PDF 1.6 (Actobat 7) ・ PDF 1.7 =
ISO 32000-1 (Acrobat 8)
pCOS アルゴ リ ズム 4
AES-128
32 キ ャ ラ ク タ (Latin-1)
82
第 3 章 : PDF 文書を作成
最大パスワー ド 長 と パス
ワー ド エ ン コ ーデ ィ ング
表 3.3 各 PDF バージ ョ ンにおける暗号化アルゴ リ ズム ・ キー長 ・ パスワー ド 長
PDF と Actoba のバージ ョ ン、
pCOS アルゴ リ ズム番号
暗号化アルゴ リ ズム と キー長
最大パスワー ド 長 と パス
ワー ド エ ン コ ーデ ィ ング
PDF 1.7ext3 (Acrobat 9)
pCOS アルゴ リ ズム 9
パスワー ド 処理に欠陥を持っ た AES-256 (脆弱。 127 UTF-8 バイ ト
(Unicode)
使用するべき でない)
PDF 1.7ext8 (Acrobat X/XI/DC) ・
PDF 2.0 = ISO 32000-2
pCOS アルゴ リ ズム 11
パスワー ド 処理が改善 さ れた AES-256
127 UTF-8 バイ ト
(Unicode)
なお、 AES-256 については、 OS X/macOS (OS X/macOS 10.10.3 ま でについて確認済) と
iOS (iOS 8.1.3 ま でについて確認済) 上のネ イ テ ィ ブ PDF ビ ュ ーアは こ れに対応 し てい ま
せん。
パスワー ド 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 は、 低解像度印刷 (150 dpi) と 高解像度印刷の区別に対応 し てい ます。
低解像度印刷は、 ページの ラ ス タ 画像を生成 し 、 こ れは私的利用にのみ適 し てい ます
が、 高解像度での複製がで き ない よ う にな っ てい ます。 画像ベース の印刷は、 低い出
力品質 と な る のみな ら ず、 印刷処理をかな り 遅 く さ せ る こ と に も 留意 し て く だ さ い。
> 変更を許可 : 以下の一覧は、 さ ま ざ ま な文書変更操作に対す る 制御を提供 し ます :
3.3 PDF のパスワー ド セキ ュ リ テ ィ
83
ページの挿入、削除、回転
フォームフィールドへの入力と既存の署名フィールドに署名
注釈の作成、フォームフィールドの入力と既存の署名フィールドに署名
ページの抽出を除くすべての操作
> 内容の コ ピーは、 「テキス ト 、 画像、 およびその他の内容のコ ピーを有効にする」 を通
じ て制御 さ れます。 こ れは、 「ス ク リ ーン リ ーダーデバイ スのテキス ト ア ク セス を有効
にする」 を用いて有効化す る こ と も で き ますが、 PDF 2.0 では、 PDF リ ーダはつねに
ア ク セシ ビ リ テ ィ に対応す る べ き なので、 こ の設定は非推奨 と 見な さ れます。
文書に対 し て、 「印刷を許可 : な し 」 と い っ た ア ク セ ス制限を指定す る と 、 Acrobat 内の各
機能 も 無効にな り ます。 ただ し 、 こ れはサー ド パーテ ィ の PDF ビ ュ ーア等の ソ フ ト ウ ェ
アについて も そ う であ る と は限 り ません。 ア ク セ ス権限に従 う か ど う かは、 PDF ツールの
開発者次第なのです。 実際、 い く つかの PDF ツールは、 権限設定を ま る で無視す る こ と
が知 ら れてお り 、 有償で入手可能な PDF ク ラ ッ キ ン グ ツールを利用すれば、 すべてのア
ク セ ス 制限を無効にす る こ と が可能です。 こ れは、 暗号を ク ラ ッ ク す る 話 と は関係がな
く 、 PDF フ ァ イ ルを表示可能 と す る 限 り 、 それが印刷 さ れない よ う にす る 方法は存在 し な
いのです。 こ の こ と は ISO 32000-1 に以下の よ う に説明 さ れてい ます :
「ひ と たび文書が開かれて成功裡に復号 さ れれば、 準拠 リ ーダは技術的には文書の内容
全体へのア ク セス を有する。暗号化辞書内に指定 さ れた文書権限群を強制する実質は、PDF
暗号化内には何も 存在 し ない。」
暗号化文書構成要素 デフ ォ ル ト では、 PDF 暗号化はつねに文書のすべての構成要素を
網羅 し ます。 し か し 、 文書のい く つかの構成要素だけ を暗号化 し 、 それ以外は暗号化 し た
く ない と い う 利用場面 も 存在 し ます :
> PDF 1.5 (Acrobat 6) で、 プ レーン テ キ ス ト メ タ デー タ と い う 機能が導入 さ れま し た。
こ の機能を使 う と 、 暗号化文書は、 暗号化 さ れていない文書 XMP メ タ デー タ を内容 と
し て持つ こ と がで き ます。 こ れは、 検索エ ン ジ ン が暗号化文書か ら も 文書 メ タ デー タ
を取得で き る よ う にす る ためです。
> PDF 1.6 (Acrobat 7) 以降、 フ ァ イ ル添付を暗号化 し て、 それ以外は文書を保護 し ない
と い う こ と が可能にな り ま し た。 こ の方法に よ り 、 保護 さ れていない文書を、 機密の
添付のための入れ物 と し て利用す る こ と がで き ます。
セキ ュ リ テ ィ 推奨事項 ユーザーパ ス ワ ー ド (文書を開 く ために必要な) を持っ た PDF
のみが ク ラ ッ キ ン グか ら 安全であ る こ と に留意 し て く だ さ い。 ク ラ ッ ク さ れ る おそれのあ
る 暗号化を し て し ま わないためには、 以下の推奨事項を守る べき です :
> 1 ~ 6 キ ャ ラ ク タ か ら 成 る パ ス ワー ド は避け る べき です。 なぜな ら それは、すべての可
能なパ ス ワ ー ド を試行す る 攻撃 (パ ス ワ ー ド に対す る ブルー ト フ ォ ー ス攻撃) に対 し
て脆いか ら です。
> パ ス ワ ー ド は、 プ レーン テ キ ス ト な単語には似ていないべ き です。 なぜな ら そのパ ス
ワ ー ド は、 すべてのプ レーン テ キ ス ト な単語を試行す る 攻撃 (辞書攻撃) に対 し て脆
いか ら です。 パ ス ワ ー ド は非アルフ ァ ベ ッ ト のキ ャ ラ ク タ を含むべ き です。 自分の配
偶者やペ ッ ト の名前、 誕生日な ど、 容易に突 き と め ら れ る ア イ テ ム を用いてはいけ ま
せん。
> 現代的な AES アルゴ リ ズ ムが、 以前の RC4 アルゴ リ ズ ム よ り も 望ま し いです。
> PDF 1.7ext3 (Acrobat 9) に従っ た AES-256 は避け る べ き です。 なぜな ら 、 それはパ ス
ワ ー ド チ ェ ッ ク アルゴ リ ズ ム に脆弱性があ り 、 パ ス ワ ー ド に対す る ブルー ト フ ォ ー ス
攻撃が可能にな っ てい る か ら です。 こ の理由か ら 、 Acrobat X/XI/DC と PDFlib では、
84
第 3 章 : PDF 文書を作成
新規文書を保護す る ためには 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 PDFlib を用いて PDF 文書をパスワー ド 保護
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 は、 既知の脆弱性のために決 し て使用 さ れません。
> PDF 1.7ext8 ・ PDF 2.0 : Acrobat X/XI/DC に従っ た AES-256 が使用 さ れます。
40 ビ ッ ト 暗号化は安全ではないので、 PDFlib はつねに 128 ビ ッ ト キーを使用 し 、 40 ビ ッ
ト キ ー は決 し て 暗号化 に は適用 し ま せ ん。 た だ し 、 40 ビ ッ ト 暗号化 さ れ た 文書 は、
PDFlib+PDI ・ PPS に対す る 入力 と し ては受け付け ら れます。
パスワー ド を PDFlib で設定 パ ス ワ ー ド は、 PDF_begin_document( ) の userpassword ・
masterpassword オプシ ョ ンで設定で き ます。 PDFlib は、 生成 さ れ る 文書のために ク ラ イ
ア ン ト が与えたパ ス ワー ド と 、 以下の方式で相互作用 し ます :
> ユーザーパ ス ワ ー ド か権限設定が与え ら れていなが ら 、 マ ス タ ーパ ス ワ ー ド が与え ら
れていない場合には、 通常のユーザーが簡単にセキ ュ リ テ ィ 設定を変更す る こ と がで
き る ので、いかな る 保護 も 無効 と な り ます。 こ の理由か ら 、PDFlib は こ の状況を エ ラ ー
と 見な し ます。
> ユーザーパ ス ワ ー ド と マ ス タ ーパ ス ワ ー ド が同 じ の場合には、 そ の フ ァ イ ルのユー
ザー と 所有者の区別が も はやつかないので、 こ の場合 も 効果的な保護は無効 と な り ま
す。 PDFlib は こ の状況を エ ラ ー と 見な し ます。
3.3 PDF のパスワー ド セキ ュ リ テ ィ
85
> 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 が指定 さ れていな く て も、 フ ォ ーム
フ ィ ール ド への記入を拒みます。
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/macOSのみ)
<colordir>/<ファイル名>.icc
(Windows・OS X/macOSのみ)
<colordir>/<ファイル名>.icm
(Windows・OS X/macOSのみ)
Windows では colordir は、オペレーテ ィ ン グ シ ス テ ムがデバ イ ス依存 ICC プ ロ フ ァ イ ル
を 格 納 し て い る デ ィ レ ク ト リ を 示 し ま す (た と え ば
C:\Windows\System32\
spool\drivers)。 OS X/macOS では 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 に対 し て
は、 プ リ ン タ ま たはモニ タ プ ロ フ ァ イ ルを出力 イ ン テ ン ト と し て指定で き ます。 詳 し く は
337 ページ 「11.4 PDF/X に よ る 印刷出力」 と 325 ページ 「11.3 PDF/A に よ る アーカ イ ビ
ン グ」 を参照 し て く だ さ い。
デバ イ ス独立な 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 では こ の代替色を用いて、 画面表示やス ポ ッ ト カ ラ ー非対
応機 (事務用プ リ ン タ な ど) への印刷を行い ま す。 印刷機では、 要求 さ れた ス ポ ッ ト カ
ラ ーが適用 さ れ、文書内で用い ら れてい る その他すべてのプ ロ セ ス カ ラ ー と と も に印刷 さ
れます。
PDFlib は、 さ ま ざ ま な組み込みス ポ ッ ト カ ラ ー ラ イ ブ ラ リ に も 対応 し てい ます し 、 カ
ス タ ム (ユーザー定義) ス ポ ッ ト カ ラ ーに も 対応 し てい ます。 ス ポ ッ ト カ ラ ー名が PDF_
makespotcolor( ) に よ っ て要求 さ れ る と 、 PDFlib は まず、 その要求 さ れた ス ポ ッ ト カ ラ ー
が PDFlib 組み込み ラ イ ブ ラ リ の う ちのいずれかの中で見つか る か ど う かをチ ェ ッ ク し ま
90
第 3 章 : PDF 文書を作成
す。 も し 見つかれば、 PDFlib は代替色に関 し て、 組み込まれた値を用い ます。 見つか ら な
い場合、 その ス ポ ッ ト カ ラ ーはユーザー定義色 と 見な さ れ る ので、 ク ラ イ ア ン ト 側でそれ
に対 し て適切な代替カ ラ ー値を与え る 必要があ り ます(カ レ ン ト カ ラ ーを通 じ て)。ス ポ ッ
ト カ ラ ーには濃度を指定す る こ と がで き ます。 すなわち、 0 か ら 1 ま でのパーセ ン ト 値 と
と も に用い る こ と がで き ます。
デフ ォ ル ト では、 組み込み ス ポ ッ ト カ ラ ーはカ ス タ ム代替値で再定義す る こ と はで き
ません。 し か し 、 こ の動作は spotcolorlookup オプシ ョ ン で変更す る こ と がで き ます。 こ
れを使 う と 、古いアプ リ ケーシ ョ ンが異な る 色定義を用いてい る よ う な場合 と の互換性が
と れます し 、 ま た、 Pantone カ ラ ーに対す る PDFlib の Lab 代替値を扱 う こ と ので き ない
ワー ク フ ロ ーにおいて も 有用です。
PDFlib は、 PDF/X か PDF/A の準拠レベルが選択 さ れてい る と 、 自動的に適切な代替
色を生成 し ます (337 ページ 「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 カ ラ ーを表 し ていな
か っ た場合には、 警告が ロ グ記録 さ れます。 以下の コ ー ド ス ニペ ッ ト は、 あ る 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.4 高度な色処理
91
表 3.7 PDFlib に内蔵の Pantone スポ ッ ト カ ラ ー ラ イ ブ ラ リ
カ ラーラ イ ブ ラ リ名
カ ラ ー名の例
注
PANTONE ソ リ ッ ド /コ ー ト 紙
PANTONE 185 C
PANTONE+ ソ リ ッ ド / コ ー ト 紙 -336
New
PANTONE 2071 C
2012 年追加の 336 色
PANTONE PLUS ソ リ ッ ド / コ ー ト 紙
PANTONE 2337 C
2014 年追加の範囲 2337 ~ 2427 の 84 色
PANTONE ソ リ ッ ド /上質紙
PANTONE 185 U
PANTONE+ ソ リ ッ ド /上質紙 -336 New
PANTONE 2071 U
2012 年追加の 336 色
PANTONE PLUS ソ リ ッ ド /上質紙
PANTONE 2337 U
2014 年追加の範囲 2337 ~ 2427 の 84 色
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 年追加
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 年追加
PANTONE ヘキサク ローム/コ ー ト 紙
PANTONE H 305-1
C
非推奨。 廃止予定
PANTONE ヘキサク ローム/上質紙
PANTONE H 305-1
U
非推奨。 廃止予定
PANTONE ソ リ ッ ド イ ン ヘキサ ク ローム PANTONE 185 HC
/コー ト 紙
PANTONE ソ リ ッ ド ト ゥ プ ロ セス/ コ ー PANTONE 185 PC
ト紙
PANTONE カ ラ ーブ リ ッ ジ CMYK (PC) で置き
換え
PANTONE ソ リ ッ ド ト ゥ プ ロ セス/ コ ー PANTONE 185 EC
ト 紙 (EURO)
PANTONE カ ラ ーブ リ ッ ジ CMYK (EURO) で置
き換え
PANTONE Goe / コ ー ト 紙
PANTONE 42-1-1 C 2008 年追加の 2058 色。 非推奨
PANTONE Goe /上質紙
PANTONE 42-1-1 U 2008 年追加の 2058 色。 非推奨
92
第 3 章 : PDF 文書を作成
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 つ多 く 必
要であ る と い う 点を除けば、 カ ス タ ム ス ポ ッ ト カ ラ ーの定義 と 利用は、 組み込みス ポ ッ ト
カ ラ ーの利用 と 同様に行 う こ と がで き ます :
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 高度な色処理
93
3.4.3 パ タ ー ン と スムーズシ ェ ーデ ィ ン グ
単色の色のかわ り に、パ タ ーンやス ムーズシ ェーデ ィ ン グ を特殊な色 と し て利用す る こ と
も で き ます。 任意の物の描線や塗 り に使用で き ます。
パ タ ー ン パ タ ーンは、任意の数の塗 り 操作を 1 つの実体に ま と めた も のに よ っ て定義 さ
れます。 こ のグループは任意の他の物の塗 り や描線に用い る こ と がで き 、 塗 り の場合は全
域内に、 描線の場合はパ ス 上に グループが コ ピ ー (縦横に並ぶ) さ れ ま す。 パ タ ーン を
使っ た作業では次の手順を踏みます :
> まず、PDF_begin_pattern_ext( ) と PDF_end_pattern( ) の間でパ タ ーン を定義 し なければ
な り ません。 パ タ ーンの定義にはたいていの画像オペレー タ が利用で き ます。
> PDF_begin_pattern_ext( )
に よ っ て返 さ れたパ タ ーンハン ド ルは、 PDF_set_graphics_
option( ) ま たは PDF_setcolor( ) でオプシ ョ ン fill/strokecolor を用いて、 パ タ ーン を カ レ
ン ト カ ラ ー と し て設定す る ために用い る こ と がで き ます。
PDF_begin_pattern_ext( ) の 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/Xojo
> 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/macOS の場合:iso8859-1(ただ し OS X/macOS 上の 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 コ ー ド ページについては 174 ページ 「6.5.1 TrueType ・ OpenType 日中韓フ ォ
ン ト を用い る 」 参照) :
font = p.load_font("Helvetica", "cp1250", "");
シ ン グルバ イ ト コ ー ド ページは内部の 8 ビ ッ ト エン コ ーデ ィ ン グに変換 さ れ る のに対
し 、 マルチバ イ ト コ ー ド ページは実行時に unicode へマ ッ プ さ れます。 テ キ ス ト は、 選
んだ コ ー ド ページ と 互換の形式で与え る 必要があ り ます (た と えば cp932 に対 し ては
SJIS)。
> Linux では、 iconv 機能が対応 し てい る すべての コ ー ド セ ッ ト 識別子を使え ます。
> 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(オプション)
104
第 4 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング
space
exclam
...
32
33
0x0020
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/macOS ・ 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
EUC- H, -V
JIS X 0208 文字集合+富士通 FMR 拡張、 Shift-JIS エ ン コ ーデ ィ ング
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
GBK- EUC- H, -V
Macintosh、 GB 2312-80 文字集合、 EUC-CN エ ン コ ーデ ィ ング、 Script
Manager コ ー ド 2
GBKp-EUC-H
GBKp-EUC-V
106
JIS X 0208 文字集合、 EUC-JP エ ン コ ーデ ィ ング
Microsoft コ ー ド ページ 936 (charset 134)、 GBK 文字集合、 GBK エ ン コ ー
デ ィ ング
GBK-EUC-H と 同 じ だが、 半角英字を プ ロポーシ ョ ナル形に替え、 コ ー ド
0x24 へ元 (エ) のかわ り に ド ル ($) を マ ッ プ し た もの。
第 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, -V
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 の集合の外の CMap を与え る
必要があ る 場合があ り ます。適切な CMap 定義を持っ た テ キ ス ト フ ァ イ ルが得 ら れ る と い
う 前提であれば、 こ れは、 CMap フ ァ イ ル (後述) を構成 し てそのカ ス タ ム CMap の名前
を エン コ ーデ ィ ン グ と し て与え る こ と に よ っ て実現で き ます。
カ ス タ ム CMap は、 生成 さ れ る PDF 出力の中へ常に埋め込まれます。 標準日中韓フ ォ
ン ト に適用す る こ と はで き ません。
CMap 構成 定義済み CMap の 1 つを用いて日本語 ・ 中国語 ・ 韓国語 (日中韓) テ キ ス ト
を作成す る には、 PDFlib は、 その照応す る CMap フ ァ イ ルを必要 と し ます。 入っ て く る テ
キ ス ト を処理 し て、日中韓エン コ ーデ ィ ン グ を Unicode へマ ッ プす る ためです。CMap フ ァ
イ ルは別パ ッ ケージで入手で き ます。 以下の よ う に イ ン ス ト ールす る 必要があ り ます :
> Windows では CMap フ ァ イ ルは、 PDFlib の イ ン ス ト レーシ ョ ンデ ィ レ ク ト リ 内の
resource/cmap デ ィ レ ク ト リ に置いておけば、 自動的に見つけ ら れます。
> それ以外のシ ス テ ムでは CMap フ ァ イ ルは、任意の好都合なデ ィ レ ク ト リ の中に置 く こ
と がで き 、 実行時に SearchPath を設定す る こ と で、 CMap フ ァ イ ルを手動で構成す る
必要があ り ます :
p.set_option("SearchPath={{/パス/パス/resource/cmap}}");
4.5 日本語 ・ 中国語 ・ 韓国語エ ン コ ーデ ィ ング
107
日中韓 CMap フ ァ イ ルの検索先を構成す る 方式ではな く 、 適切な SearchPath 定義を含む
UPR 構成フ ァ イ ルを指す よ う PDFLIBRESOURCEFILE 環境変数を設定する こ と も で き ます。
カ ス タ ム日中韓 フ ォ ン ト のための コ ー ド ページ PDFlib は表 4.6 に挙げ る コ ー ド ページ
に対応 し てい ます。 Windows では PDFlib は さ ら に、 シ ス テ ムに イ ン ス ト ール さ れてい る
任意の日中韓 コ ー ド ページに対応 し てい ます。
表 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/macOS ・
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
例:
&shy;
&euro;
&lt;
&gt;
&amp;
&Alpha;
U+00AD
U+00AD
U+00AD
U+00AD
U+00AD
U+0391
ソフトハイフン
ユーログリフ (実体名)
小なり記号
大なり記号
アンパサンド記号
ギリシャ文字?
数値文字参照 Unicode キ ャ ラ ク タ に対す る 数値文字参照 も HTML 4.0 で定義 さ れてい ま
す。 こ れはハ ッ シ ュ キ ャ ラ ク タ 「#」 と 10 進ま たは 16 進の数値を必要 と し 、 16 進数値の
は小文字か大文字の 「X」 キ ャ ラ ク タ を頭につけ ます。 例 :
&#173;
&#xAD;
&#229;
&#xE5;
110
U+00AD
U+00AD
U+00AD
U+00E5
ソフトハイフン
ソフトハイフン
文字aの上に小さな丸 (10進)
文字aの上に小さな丸 (16進、小文字x)
第 4 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング
&#Xe5;
&#x20AC;
&#8364;
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 に設定す る 必要があ り ます。 例 :
font = p.load_font("Helvetica", "winansi", "");
if (font == -1) { ... }
p.setfont(font, 24);
p.set_option("charref=true");
p.fit_textline("Price: 500&euro;", x, y, "");
こ のグ ロ ーバルオプシ ョ ンは、 それ以降に使用 さ れ る すべての名前文字列 ・ ハ イ パーテ キ
ス ト 文字列 ・ 内容文字列に影響を与え ますが、 それは望む と こ ろではない場合 も あ る か も
し れ ま せん。 文字参照を内容文字列に限定す る ためには、 かわ り に以下のテ キ ス ト オプ
シ ョ ン を用い ます :
font = p.load_font("Helvetica", "winansi", "");
if (font == -1) { ... }
p.set_text_option("charref=true font=" + font + " fontsize=24");
p.fit_textline("Price: 500&euro;", x, y, "");
文字参照を使 う う えでのその他の注意点を挙げます :
> 文字参照は、 内容文字列 ・ ハ イ パーテ キ ス ト 文字列 ・ 名前文字列のいずれで も 使え ま
す。 例外 と し て、 フ ォ ン ト 独自グ リ フ名参照は上述の よ う に内容文字列でのみ動作 し
ます。
> 文字参照はbuiltin エン コ ーデ ィ ン グのテ キ ス ト 内では置換 さ れません。し か し 、unicode
エン コ ーデ ィ ン グ を用い る こ と に よ っ て記号フ ォ ン ト に対 し て文字参照を使 う こ と は
で き ます。
> 文字参照はオプシ ョ ン リ ス ト 内では置換 さ れません。 ただ し 、 Unichar デー タ 型のオプ
シ ョ ン内では認識 さ れます。 こ の場合、 「&」 ・ 「;」 修飾は外す必要があ り ます。 こ の認
識はつねに有効であ り 、 charref オプシ ョ ンには従い ません。
> 非 Unicode 対応言語バ イ ンデ ィ ン グでは、 textformat=utf16 ・ utf16be ・ utf16le の と き は
文字参照は 2 バ イ ト 値で表す必要があ り ます。encoding=unicode かつ textformat=bytes
の と き は文字参照は ASCII で表す必要があ り ます (EBCDIC ベース のプ ラ ッ ト フ ォー
ム で も )。
> 1 個のア ンパサン ド キ ャ ラ ク タ は、 文字参照の開始 と 見な さ れます。 ただ し 、 その後に
セ ミ コ ロ ン 「;」 が見つか り 、 かつ 「&」 と 「;」 の間のキ ャ ラ ク タ 群が文字参照 と し て
有効であ る 場合に限 り ます。 そ う でない場合には、 そのア ンパサン ド キ ャ ラ ク タ 「
&」 は変更 さ れない ま ま と な り ます。 文字参照を開始 さ せずにア ンパサン ド キ ャ ラ ク タ
「&」 を表 し たい場合には、 文字参照 &amp; を使用する こ と が推奨 さ れます。
> 文字参照の可能性のあ る 文字列が無効の場合(た と えば&#の後に無効な 10進値群が続
いてい る 場合や、 「&」 の後に未知の実体名が続いてい る 場合) には、 その動作はオプ
シ ョ ン glyphcheck に依存 し ます :
glyphcheck=none : その文字列はその ま ま保たれます。
glyphcheck=replace : その文字列は置換キ ャ ラ ク タ で置換 さ れます。
glyphcheck=error : エ ラ ーが発生 し 、 テ キ ス ト 処理は停止 し ます。 errorpolicy=exception
の場合には例外が発生 し ます。
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/macOS 上では、シ ス テ ムに イ ン ス ト ール さ れた 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 レ イ ア ウ
ト 機能」 参照) のほか、 複雑用字系シ ェ ーピ ン グのためのテーブルを含む こ と
も で き ま す (166 ページ 「6.4 複雑用字系出力」 参照) 。 なお、 フ ァ イ ル名の接尾辞 も 、
Windows Explorer に よ っ て表示 さ れ る ロ ゴ も 、 フ ォ ン ト 内に OpenType レ イ ア ウ ト 機能が
あ る か ど う かについては何 も 語 ら ない こ と に留意 し て く だ さ い。詳 し く は 158 ページ 「6.3
OpenType レ イ ア ウ ト 機能」 を参照 し て く だ さ い。
OpenType フ ォ ン ト は、すべてのプ ラ ッ ト フ ォーム上で動作す る 単一の コ ン テナ形式を
提供 し てい ますが、 OpenType には以下の よ う に さ ま ざ ま な種類があ り 、 こ れが混乱の元
にな る こ と も あ り ますので、 それを理解 し てお く こ と も 有用で し ょ う :
> ア ウ ト ラ イ ン形式:OpenType フ ォ ン ト は、TrueType と PostScript のいずれをベース と し
た グ リ フ記述 も 内容 と し て持つ こ と がで き ま す。 PostScript ベース のほ う は Compact
Font Format (CFF) や Type 2 と も 呼ばれ、 たいてい *.otf 接尾辞をつけて用い ら れま
す。 Windows Explorer は OpenType フ ォ ン ト をつねに 「O」 ロ ゴで表示 し ます。
5.1 フ ォ ン ト 形式
113
> TrueType フ ォ ン ト と 、TrueType ア ウ ト ラ イ ン を持っ た OpenType フ ォ ン ト と は、と も に
*.ttf 接尾辞を用いてい る 可能性があ る ため、 容易には見分けがつ き ません。 こ の識別
の難 し さ か ら 、 Windows Explorer は右記の基準で動作 し ます : .ttf フ ォ ン ト が電子署名
を含んでい る な ら ば、 それは 「O」 ロ ゴ で表示 さ れ、 そ う でな ければそれは 「TT」 ロ
ゴ で表示 さ れます。 し か し 、 電子署名は OpenType フ ォ ン ト において必須なわけでは
あ り ませんので、 こ れはプ レーン な旧来の TrueType フ ォ ン ト と OpenType フ ォ ン ト と
を見分け る 有用な基準 と し ては利用で き ません。
> CID (キ ャ ラ ク タ ID) アーキ テ ク チ ャ が日中韓フ ォ ン ト に対 し て用い ら れてい ます。 現
代の CID フ ォ ン ト は、 PostScript ア ウ ト ラ イ ン を持つ OpenType *.otf フ ォ ン ト と し て
パ ッ ケージ さ れてい ます。 実用的な観点か ら は、 こ れはプ レーン な OpenType フ ォ ン
ト と 見分けがつ き ません。 Windows Explorer は OpenType CID フ ォ ン ト をつねに 「O」
ロ ゴ で表示 し ます。
> OpenType コ レ ク シ ョ ンは、 OpenType 1.7 仕様で導入 さ れま し た。 こ れは、 関連す る
OpenType フ ォ ン ト 群を 1 個の合体フ ァ イ ル内へま と め る と い う 点において、TrueType
コ レ ク シ ョ ン と 似てい ます。 OpenType コ レ ク シ ョ ンは *.ttf 接尾辞 (TrueType コ レ ク
シ ョ ン と 全 く 同 じ ) を用い ます。 OS X/macOS 10.8 以上 と Adobe Creative Suite CS6 以
上は こ れに対応 し てい ますが、 Windows 8.1 以下は こ れに対応 し てい ません。
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 フ ォ ン ト が生成 さ れます。
114
第 5 章 : フ ォ ン ト 処理
生成 さ れた フ ォ ン ト は、ユーザー定義の Type 3 フ ォ ン ト の よ う に扱われます(116 ペー
ジ 「5.1.8 Type 3 フ ォ ン ト 」 参照)。 ユーザー指定の リ ソ ース名を内部 SVG フ ォ ン ト 名に
結びつけ、 両方の名前を用いてその フ ォ ン ト を読み込め る よ う にす る FontnameAlias リ
ソ ース が自動的に作成 さ れます。 SVG フ ォ ン ト は通常、 フ ァ イ ル名拡張子 .svg を用いて
い ます。
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/macOS 上では、 リ ソ ース を利用 し た PostScript Type 1 フ ォ ン ト 、すなわち LWFN
(LaserWriter Font) ア ウ ト ラ イ ン フ ォ ン ト に も 対応 し てい ます。 こ の種の フ ォ ン ト には
フ ォ ン ト スーツ ケース (FOND リ ソ ース。 FFIL と も い う ) がついてお り 、 その中に メ
ト リ ッ ク デー タ が入っ てい ます (ス ク リ ーン フ ォ ン ト も 入っ てい ますが PDFlib はそれ
は無視 し ます)。
> PostScript ホ ス ト フ ォ ン ト を扱 う 際には、 LWFN はその フ ォ ン ト スーツ ケース と 同 じ
デ ィ レ ク ト リ に置かれてい る 必要があ り 、 かつ 5+3+3 規則に従っ て命名 さ れてい る 必
要があ り ます。
PostScript フ ォ ン ト 名 フ ォ ン ト フ ァ イ ルを扱 う 際には、任意のエ イ リ ア ス を利用で き ま
す (131 ページ 「フ ォ ン ト デー タ の ソ ース」 参照)。 フ ォ ン ト の内部名を知 り たい と き 、 そ
れを取得で き る 方法はい く つかあ り ます :
> フ ォ ン ト ア ウ ト ラ イ ン フ ァ イ ル (*.pfa か *.pfb) を開き 、 そのエン ト リ /FontName の後
の文字列を探 し ます。 こ のエン ト リ か ら 、 最初のキ ャ ラ ク タ (\) を省いて、 残 り のキ ャ
ラ ク タ を フ ォ ン ト 名 と し て使い ます。
> Windows ・ OS X/macOS 上では、 フ ォ ン ト フ ァ イ ルを ダブル ク リ ッ ク す る と 、 その フ ォ
ン ト のサンプルが現れて フ ォ ン ト の 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 を以
下の場所か ら ダ ウ ン ロ ー ド す る こ と がで き ます :
5.1 フ ォ ン ト 形式
115
www.adobe.com/devnet/opentype/gdk/topic.html
SING フ ォ ン ト はたいてい、1 個のグ リ フ だけ を内容 と し て持ち ます (あわせて縦書 き 字体
も 含む こ と も あ り ます)。 こ の 「 メ イ ン」 グ リ フ の Unicode 値は、 PDFlib で取得す る こ と
がで き 、 それにはグ リ フ ID を要求 し 、 ついで こ のグ リ フ ID に対す る Unicode 値を要求 し
ます :
maingid = (int) p.info_font(font, "maingid", "");
uv = (int) p.info_font(font, "unicode", "gid=" + maingid);
SING フ ォ ン ト を、 PDF_load_font( ) の fallbackfonts オプシ ョ ンの forcechars オプシ ョ ンの
gaiji サブオプシ ョ ン を用いて予備フ ォ ン ト と し て利用す る こ と を推奨 し ます。 詳 し く は
175 ページ 「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, "");
116
第 5 章 : フ ォ ン ト 処理
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);
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 か ら テ キ ス ト と し て正 し く 抽出で き な く な り ます。 ただ し 、 こ の動作は変更す
る こ と も で き 、 それは特に日中韓キ ャ ラ ク タ に対 し て有用です。 詳 し く は 175 ページ 「外
字キ ャ ラ ク タ に対す る PUA 値を温存」 を参照 し て く だ さ い。
PDFlib が PUA 値を マ ッ プな し グ リ フ に割 り 振っ てい く 際には、 以下のプール内の若い
値か ら 順に用いてい き ます :
118
第 5 章 : フ ォ ン ト 処理
> 基本 と な る のは基本多言語面 (BMP) 内の Unicode PUA 領域、 すなわち範囲 U+E000 ~
U+F8FF です。 必要であれば こ れに加え、 第 15 面 (U+F0000 to U+FFFFD) 内の PUA
値 も 用い ら れます。
> その フ ォ ン ト が内部的にすでに割 り 振っ てい る 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 キ ャ ラ ク タ の後に、 そのキ ャ ラ
ク タ の特定の グ リ フ 異体字 を 選択す る 異体字セ レ ク タ が続 き う る も のが あ り ま す (178
ページ 「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 の場合には、 例外が発生 し ます。 こ れを利用す る と 、 読めない
テ キ ス ト 出力を避け る こ と がで き る で し ょ う 。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの fonts/glyph_replacement ト ピ ッ ク にあ り ます。
5.3.3 グ リ フ ID を転換
決定 さ れた グ リ フ ID は ま だ最終的な も のではあ り ません。 なぜな ら 最終出力を作成す る
前に、 い く つかの転換を行わなければな ら ない可能性があ る か ら です。 具体的に ど の よ う
な転換が必要かは、 フ ォ ン ト やい く つかのオプシ ョ ンに よ っ て異な り ます。 以下の ス テ ッ
プは、 非 Unicode CMap で keepnative=true の場合を除き 、 すべてのエン コ ーデ ィ ン グに対
し て行われます。
縦書き グ リ フ 縦書 き モー ド の フ ォ ン ト では、い く つかのグ リ フは縦書 き 字体へ置 き 換わ
る 可能性があ り ます。 こ の置換は、 フ ォ ン ト 内に vert OpenType レ イ ア ウ ト 機能テーブル
が必要です。
OpenType レ イ ア ウ ト 機能 OpenType 機能は、 合字 ・ ス ワ ッ シ ュ キ ャ ラ ク タ ・ ス モール
キ ャ ピ タ ルをは じ め と す る さ ま ざ ま な タ イ ポグ ラ フ ィ バ リ エーシ ョ ン を、 1 個ない し 複数
のグ リ フ ID を他の値へ置 き 換え る こ と に よ っ て作成す る こ と がで き ます。OpenType 機能
については 158 ページ 「6.3 OpenType レ イ ア ウ ト 機能」 で解説 し てい ます。 OpenType レ
イ ア ウ ト 機能は、 適切な フ ォ ン ト に対 し てのみ有効であ り (162 ページ 「OpenType レ イ
ア ウ ト 機能のための要件」 参照)、 かつ features オプシ ョ ンに従っ て適用 さ れます。
5.3 テキス ト 処理パイ プ ラ イ ン
123
複雑用字系のシ ェ ー ピ ン グ シ ェ ー ピ ン グは、 テ キ ス ト の順序を替え、 ま た、 キ ャ ラ ク
タ の位置に よ っ て適切な字体の グ リ フ を決定 し ま す (例 : ア ラ ビ ア文字キ ャ ラ ク タ の頭
字 ・ 中字 ・ 尾字 ・ 単独形) 。 こ れは適切な フ ォ ン ト に対 し てのみ有効であ り (168 ページ
「シ ェ ーピ ン グのための要件」 参照)、 かつ 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 ページ 「数値文字参照」 参照) :
&#xF04A;
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
&#xF04A;

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
&#xF04A;

charref
&.#x4A;

charref
&.smileface;

ï•ã 2

\xEF\x81\x8A 4

escapesequence3
unicode
5
(な し )
escapesequence
\x4A
(な し )
charref
&#xF04A;

bytes
&.#x4A;

charref
&.smileface;

J
(な し )
\x4A
(な し )
J
escapesequence
utf16, utf8
builtin
bytes

charref
utf8
bytes
ページ上の印字結果
(encoding=unicode で上記 と 同 じ )
charref
&#xF04A;

charref
&.#x4A;

charref
&.smileface;

J

\x4A

escapesequence
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/macOS オペレーテ ィ ン グ シ ス テ ムか ら 持っ て来た フ ォ ン ト (ホ ス ト
フォン ト)
> 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 の名前であ る (179 ページ 「6.5.5 標準日中韓フ ォ ン ト 」 参照)。
> フ ォ ン ト 名が、こ れ以前に同一文書内で PDF_begin_font( ) で作成 さ れた Type 3 フ ォ ン ト
の名前 と 一致す る (116 ページ 「5.1.8 Type 3 フ ォ ン ト 」 参照)。
> フ ォ ン ト 名が、フ ォ ン ト 名を TrueType ま たは OpenType フ ォ ン ト フ ァ イ ルの名前 と 紐づ
け る FontOutline リ ソ ース内の名前 と 一致す る 。
> フ ォ ン ト 名が、フ ォ ン ト 名を PostScript Type 1 フ ォ ン ト の メ ト リ ッ ク フ ァ イ ルの名前 と
紐づけ る FontAFM ま たは FontPFM リ ソ ース内の名前 と 一致す る 。
132
第 5 章 : フ ォ ン ト 処理
> フ ォ ン ト 名が、 フ ォ ン ト 名を SVG フ ォ ン ト フ ァ イ ルの名前 と 紐づけ る FontOutline リ
ソ ース内の名前 と 一致 し 、 かつ、 HostFont リ ソ ース内の名前 と 一致 し ない。
> フ ォ ン ト 名が、 フ ォ ン ト 名を シ ス テ ム に イ ン ス ト ール さ れてい る フ ォ ン ト の名前 と 紐
づけ る HostFont リ ソ ース内の名前 と 一致す る 。
> フ ォ ン ト 名が欧文 コ ア フ ォ ン ト の名前 と 一致す る (134 ページ 「欧文 コ ア フ ォ ン ト 」 参
照)。
> フ ォ ン ト 名が、 シ ス テ ム に イ ン ス ト ール さ れてい る ホ ス ト フ ォ ン ト の名前 と 一致す る
(136 ページ 「5.4.5 Windows ・ OS X/macOS 上のホ ス ト フ ォ ン ト 」 参照)。
> フ ォ ン ト 名が フ ォ ン ト フ ァ イ ルのベース名 (すなわち フ ァ イ ル名接尾辞を除いた名前)
と 一致す る 。
フ ォ ン ト が見つか ら なか っ た と き は、 フ ォ ン ト 読み込みは以下のエ ラ ー メ ッ セージ を出 し
て止ま り ます :
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、 174 ペ ー ジ 「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 フ ォ ン ト 名は任意に選べます:
5.4 フ ォ ン ト を読み込む
133
p.set_option("FontOutline={f1=msgothic.ttc}");
font = p.load_font("f1:0", "unicode", "");
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/macOS に イ ン ス ト ール さ れて
い る フ ォ ン ト の リ ス ト 内で探 し ます。シ ス テ ムに イ ン ス ト ール さ れてい る フ ォ ン ト を ホス
ト フ ォ ン ト と いい ます。 ホ ス ト フ ォ ン ト の名前は ASCII でエン コ ー ド さ れてい る 必要があ
り ます。 Windows では Unicode も 使え ます。 ホ ス ト フ ォ ン ト について詳 し く は 136 ページ
「5.4.5 Windows ・ OS X/macOS 上のホ ス ト フ ォ ン ト 」 を参照 し て く だ さ い。 例 :
134
第 5 章 : フ ォ ン ト 処理
font = p.load_font("Verdana", "unicode", "");
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 は、 日中韓テ キ ス ト のための さ ま ざ ま な標準フ ォ ン ト に対
応 し てい ます。 詳細 と フ ォ ン ト 名一覧は 179 ページ 「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/macOS 上のホ ス ト フ ォ ン ト
OS X/macOS ・ 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/macOS 上のホ ス ト フ ォ ン ト 名 OS X に入っ てい る Font Book ユーテ ィ リ テ ィ を利
用すれば、 イ ン ス ト ール さ れてい る ホ ス ト フ ォ ン ト の名前を知 る こ と がで き ます。 プ ロ グ
ラ ム的にホ ス ト フ ォ ン ト の リ ス ト を作成す る には、 Apple の Font Tool Suite1 を推奨 し ま
す。 こ の コ マ ン ド ラ イ ンユーテ ィ リ テ ィ の集合には ftxinstalledfonts と い う プ ロ グ ラ ムが
含まれてお り 、 こ れは イ ン ス ト ール さ れてい る すべての フ ォ ン ト の正確な名前を知 る ため
に有用です。 PDFlib はホ ス ト フ ォ ン ト の名前 と し てい く つかの種類に対応 し てい ます :
> 「一意」 フ ォ ン ト 名 : こ れは、 東ア ジ ア フ ォ ン ト 等に対 し て Unicode でエン コ ー ド さ れ
てい る 場合 も あ る フ ォ ン ト 名です。 一意フ ォ ン ト 名を知 る には、 タ ー ミ ナル ウ ィ ン ド
ウ で以下の コ マ ン ド を実行 し ます ( 「:」 を含むエン ト リ 群が出力に含まれ る こ と があ
り ますが、 こ れは除去す る 必要があ り ます) :
ftxinstalledfonts -u
> PostScript フ ォ ン ト 名。PostScript フ ォ ン ト 名を知る には、タ ー ミ ナル ウ ィ ン ド ウ で下記
の コ マ ン ド を実行 し ます :
ftxinstalledfonts -p
OS X/macOS 上で ホ ス ト フ ォ ン ト を用い る際に起 こ り う る問題 私た ち の テ ス ト に よ れ
ば、 新規に イ ン ス ト ール さ れた フ ォ ン ト は、 ユーザーが コ ン ソ ールか ら ロ グ ア ウ ト し て、
再び ロ グ イ ンす る ま で、 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 ビ ッ ト 値で指
定す る こ と はで き ません。 こ の制約を回避する には文字参照かグ リ フ名参照 (&euro; 等)
を用い ます (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}}
}
ア ラ ビ ア文字 フ ォ ン ト に欧文キ ャ ラ ク タ を追加
文字テ キ ス ト 組版」 で解説 し てい ます。
こ の用途は 172 ページ 「6.4.5 ア ラ ビ ア
足 り ないグ リ フ を つ き と める 無償提供 さ れてい る フ ォ ン ト Unicode BMP Fallback SIL は、
実際のグ リ フ でな く 各 Unicode キ ャ ラ ク タ の 16 進値を表示 し ます。 こ の フ ォ ン ト は、ワー
ク フ ロ ーにお け る フ ォ ン ト 関連の問題 を 診断す る の に非常に有用 な と き が あ り ま す。
fallbackfonts オプシ ョ ン に対 し て以下の フ ォ ン ト 読み込みオプ シ ョ ン を用い て、 任意の
フ ォ ン ト を、足 り ないキ ャ ラ ク タ が視覚化 さ れ る よ う こ の特殊な予備フ ォ ン ト で強化す る
こ と がで き ます :
fallbackfonts={{fontname={Unicode BMP Fallback SIL} encoding=unicode}}
フ ォ ン ト に外字キ ャ ラ ク タ を追加 こ の用途は 175 ページ 「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/macOS か Windows に イ ン ス ト ール ×
さ れている TrueType ・ OpenType ・ Type 1
ホス ト フ ォ ン ト
×
非 コ ア Type 1 フ ォ ン ト
○
embedding=true の場合のみ
TrueType ・ OpenType ・ SING ・ WOFF ・
SVG フ ォ ン ト
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 フ ォ ン ト
> WOFF フ ォ ン ト
> Type 3 フ ォ ン ト (特別な扱いが必要、 144 ページ 「Type 3 フ ォ ン ト のサブセ ッ ト 化」 を
参照)
サブセ ッ ト 化を要求 さ れてい る フ ォ ン ト が文書内で使われてい る 場合、PDFlib は実際にテ
キ ス ト 出力に使われてい る キ ャ ラ ク タ を調べます。サブセ ッ ト 化の動作を制御す る にはい
く つかの方法があ り ます (autosubsetting は指定 し ていない と し て) :
> デフ ォ ル ト のサブセ ッ ト 化の動作は autosubsetting オプシ ョ ン で制御 さ れます。も し こ
のオプシ ョ ンが true な ら ば、 サブセ ッ ト 化可能なすべての フ ォ ン ト に対 し てサブセ ッ
ト 化が有効にな り ま す (特別な扱いが必要な Type 3 フ ォ ン ト の場合を除 き ます、 後
述)。 デフ ォ ル ト 値は true です。
> autosubsetting=true の場合:subsetlimit オプシ ョ ンはパーセ ン ト 値を持ち ます。文書内
で用い ら れてい る 、 あ る フ ォ ン ト 内のグ リ フ の数が こ の割合を超え る 場合には、 その
フ ォ ン ト のサブセ ッ ト 化は無効 と な り 、 かわ り に フ ォ ン ト 全体が埋め込ま れ ます。 こ
れに よ っ て処理時間があ る 程度短縮で き ますが、 そのかわ り に出力フ ァ イ ルの容量は
大 き く な り ます。 以下の フ ォ ン ト オプシ ョ ンはサブセ ッ ト 限界を 75% に設定 し ます :
subsetlimit=75%
1. も っ と 明確に言えば : その フ ォ ン ト の OS/2 テーブル内の fsType フ ラ グが値 2 を持つ場合。
5.5 フ ォ ン ト の埋め込み と サブ セ ッ ト 化
143
subsetlimit のデフ ォ ル ト 値は 100 パーセ ン ト です。 言い換えれば、 ク ラ イ ア ン ト が明
示的に 100 パーセ ン ト 未満の限界値を要求 し ない限 り 、 PDF_load_font( ) で要求 さ れ る
サブセ ッ ト 化オプシ ョ ンは効力を持ち ます。
> autosubsetting=true の場合:subsetminsize オプシ ョ ン を用い る と 、容量の小 さ な フ ォ ン
ト のサブセ ッ ト 化を完全に無効にす る こ と がで き ます。 元の フ ォ ン ト フ ァ イ ルの容量
が subsetminsize の値 よ り も KB 単位で小 さ い場合、 その フ ォ ン ト のサブセ ッ ト 化は無
効にな り ます。
初期 フ ォ ン ト サブ セ ッ ト を指定 フ ォ ン ト サブセ ッ ト は、 文書内で使われてい る すべて
のグ リ フ のア ウ ト ラ イ ン記述を含んでい ます。 こ れはすなわち、 生成 さ れ る 文書サブセ ッ
ト は文書ご と に変化す る こ と を意味 し ます。 なぜな ら 一般に、 各文書内ではそれぞれ異な
る キ ャ ラ ク タ (ひいてはグ リ フ) のセ ッ ト が用い ら れてい る か ら です。 フ ォ ン ト サブセ ッ
ト を埋め込んだた く さ んの小 さ な文書を大 き な文書へ連結する 際には、フ ォ ン ト サブセ ッ
ト がそれぞれま ち ま ちであ る こ と は厄介です:埋め込まれてい る サブセ ッ ト は全部互いに
異な る ため、 除去で き ないのです。
こ う し た場合のために、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( ) だけが必要で
あ り 、 それ以外に実際のグ リ フ の形を定義す る 呼び出 し は一切不要です。 グ リ フ定義
の開始 と 終了の間で他の関数を呼び出 し た場合、 それは PDF 出力に対 し て何 ら 効力を
持たず、 例外 も 一切発生 し ません。
144
第 5 章 : フ ォ ン ト 処理
> 2 回目は、 こ の フ ォ ン ト のテ キ ス ト をすべて作成 し た後に行 う 必要があ り 、実際のグ リ
フ のア ウ ト ラ イ ンか ビ ッ ト マ ッ プ を定義 し ます。 フ ォ ン ト と グ リ フ の メ ト リ ッ ク は、 1
回目ですでにわか っ てい る ので無視 さ れ ま す。 最後のページが作成 さ れた後、 PDFlib
は ど のグ リ フ が文書内で使われてい る か も 知っ てい る ので、 必要な グ リ フ定義だけ を
埋め込んで フ ォ ン ト サブセ ッ ト を構成 し ます。
使われていないグ リ フ群の定義のための API 関数呼び出 し 群は警告な く 無視 さ れます。
エ ラ ー コ ー ド を返せ る 関数 (PDF_load_image( ) 等) はエ ラ ー値を返 し ますが、 それを
ア プ リ ケーシ ョ ン 側は無視す る 必要が あ り ま す。 使われて い な い グ リ フ を 本当のエ
ラ ーか ら 区別す る ためには、 PDF_get_errnum( ) に よ っ て返 さ れ る エ ラ ー メ ッ セージ番
号をチ ェ ッ ク す る 必要があ り ます : も し ゼ ロ であれば、 そのグ リ フは無視 さ れてい る 、
すなわち本当のエ ラ ーは起 こ っ ていない と い う こ と です。
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("&euro;", "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);
詳 し く は 223 ページ 「8.2 複数行のテ キ ス ト フ ロ ー」 を参照 し て く だ さ い。
6.1 テキス ト 出力方式
151
表内のテキス ト テ キ ス ト 行 と テ キ ス ト フ ロ ーを使っ て、表セル内にテ キ ス ト を配置す る
こ と も で き ます。 詳 し く は 244 ページ 「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 オプシ ョ ンで司 ら れますが、 詳 し く は 176 ページ 「6.5.3 OpenType レ イ ア ウ ト
機能 と 高度な日中韓テ キ ス ト 出力」 で解説 し ます。
> 複雑用字系のシ ェーピ ン グ と 縦書 き テ キ ス ト 出力のための OpenType 機能群。こ れ ら は
shaping ・ script オプシ ョ ンに従っ て自動的に評価 さ れます (166 ページ 「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
大文字からのス
モールキ ャ ピ タ ル
大文字キ ャ ラ ク タ を ス モールキ ャ ピ タ ルに変え ます。
calt
コ ン テキス ト 字体
デ フ ォル ト グ リ フ を、 よ り 良い連結動作を与え る字体へ置き換え。 一部ない し 全部
のグ リ フ を連結 さ せる よ う デザイ ン さ れた用字系書体で使用 さ れます。
case
ケースセ ン シ テ ィ
ブ字体
さ ま ざ ま な ア ク セ ン ト 記号を上へず ら し て、 全大文字シーケ ン スや横並び数字 と の
調和を高めます。 ま た、 オール ド ス タ イル数字を横並び数字に変え ます。
ccmp
グ リ フ 合成 / 分解
グ リ フ字体の数を最小化する ために、 1 個のキ ャ ラ ク タ を 2 個のグ リ フ へ分解 し た
り 、 あるいはよ り 良いグ リ フ 処理のために 2 個のキ ャ ラ ク タ を 1 個のグ リ フ に合成
し た り する こ と が望ま し い場合があ り ます。 この機能はそのよ う な合成 / 分解を許
し ます。
clig
コ ン テキス ト 合字
グ リ フ列を、 タ イ ポグ ラ フ ィ 的観点から よ り 好ま し い 1 個のグ リ フへ置き換え。 他
の合字機能群 と 異な り 、 clig は、 その合字が推奨 さ れる コ ン テキス ト を指定 し ま
す。 この能力は、 い く つかの用字系デザイ ンにおいて、 またスウ ォ ッ シ ュ合字に対
し て重要です。
cswh
コ ン テキス ト ス
ウォ ッ シュ
デ フ ォル ト グ リ フ を、 指定 さ れた コ ン テキス ト において、 照応する スウ ォ ッ シ ュへ
置き換え。
dlig
随意合字
グ リ フ列を、 タ イ ポグ ラ フ ィ 的観点から よ り 好ま し い 1 個のグ リ フへ置き換え。
dlig は、 ユーザーの好みに よ っ て、 特殊効果のために用いる こ と がで き る合字を
カバー し ます。
dnom
分母
ス ラ ッ シ ュの直後の数字を分母数字へ置き換え
falt
改行箇所語尾グ リ
フ
行末グ リ フ を、 こ の目的のために特にデザイ ン さ れた字体 (必要に応 じ て前幅が短
か っ た り 長かっ た り し ます) へ置き換え る こ と に よ っ て、 テキス ト の均等割 り 付け
を助けます。
fina
語尾形
単語の末尾にあ るグ リ フ を、 こ の使用目的のためにデザイ ン さ れた字体へ置き換
え。 これは、 欧文の続け字において広 く 用い られてお り 、 ま た、 ア ラ ビ ア文字等 さ
ま ざ ま な非欧文用字系において必須です。
frac
分数
ス ラ ッ シ ュ で区切られた数字群を、 「通用の」 (斜め線に よ る) 分数へ置き換え
hist
歴史的字体
デ フ ォル ト の (現行の) 字体を歴史的字体へ置き換え。 い く つかの字の字体は過去
には広 く 用い ら れていま し たが、 現在では時代遅れに見え ます。
hlig
歴史的合字
デ フ ォル ト の (現行の) 合字を歴史的合字へ置き換え。
init
語頭形
単語の先頭にあ るグ リ フ を、 こ の使用目的のためにデザイ ン さ れた字体へ置き換
え。 これは、 欧文の続け字において広 く 用い られてお り 、 ま た、 ア ラ ビ ア文字等 さ
ま ざ ま な非欧文用字系において必須です。
isol
単独形
グ リ フの基準形を、 その単独形へ置き換え。
liga
標準合字
グ リ フ列を、 タ イ ポグ ラ フ ィ 的観点から よ り 好ま し い 1 個のグ リ フへ置き換え。
liga は、 デザイ ナー / 製造者が通常の条件において用い られるべき と 判定 し た合
字を カバー し ます。
160
第 6 章 : テキス ト 出力
表 6.1 欧文 タ イ ポグ ラ フ ィ 用の対応 OpenType 機能 (日中韓テキス ト 用の OpenType 機能は表 6.6 に挙げます)
キー
ワー
ド
名前
説明
lnum
横並び数字
数字を オール ド ス タ イルから デ フ ォ ル ト の横並び字体へ変え ます。
locl
ロー カ ラ イ ズ字体
グ リ フのデ フ ォル ト 字体から ロー カ ラ イ ズ字体への置換を有効に し ます。 こ の機能
は script ・ language オプ シ ョ ン を必要 と し ます。
medi
語中形
単語の途中にあ るグ リ フ を、 こ の使用目的のためにデザイ ン さ れた字体へ置き換
え。 こ れは、 単独で用い られる ためにデザイ ン さ れているデ フ ォ ル ト 形 と は異な り
ます。 これは、 欧文の続け字において広 く 用い ら れてお り 、 また、 ア ラ ビ ア文字等
さ ま ざ ま な非欧文用字系において必須です。
mgrk
数学ギ リ シ ャ文字
ギ リ シ ャ文字グ リ フの標準 タ イ ポグ ラ フ ィ 字体を、 その照応する、 数学的表記で広
く 用い られている字体へ置き換え。
numr
分子
ス ラ ッ シ ュの直前の数字を分子数字へ置き換え、 タ イ ポグ ラ フ ィ ス ラ ッ シ ュ を分数
ス ラ ッ シ ュへ置き換え。
onum
オール ド ス タ イル
数字
数字を、 デ フ ォル ト の横並び形式か ら オール ド ス タ イル字体に変え ます。
ordn
序数
デ フ ォル ト のアル フ ァ ベ ッ ト グ リ フ を、 その照応する、 数字の後に用いる ための序
数字体へ置き換え。 通常、 Numero (U+2116) キ ャ ラ ク タ も作成 し ます。
ornm
飾 り 文字
ビ ュ レ ッ ト キ ャ ラ ク タ と ASCII キ ャ ラ ク タ 群を飾 り 文字へ置き換え。
pcap
プテ ィ ッ ト キャ ピ
タル
小文字キ ャ ラ ク タ を プ テ ィ ッ ト キ ャ ピ タ ルに、 すなわち通常のス モールキ ャ ッ プ よ
り 背の低い大文字に変え ます。
pnum
プ ロポーシ ョ ナル
数字
等幅 (表形式) 数字を、 プ ロポーシ ョ ナル幅を持つ数字へ置き換え。
salt
ス タ イ リ ステ ィ ッ
ク 字体
デ フ ォル ト 字体を ス タ イ リ ス テ ィ ッ ク字体へ置き換え。 こ れら の異体字は、 スワ ッ
シ ュや歴史的 と い っ た決ま っ た分類には必ず し も あてはま り ません。
sinf
科学的下付き
横並びま たはオール ド ス タ イル数字を、 主に化学や数学表記用の下付き数字 (よ り
小 さ なグ リ フ) へ置き換え。
smcp
ス モールキ ャ ピ タ
ル
小文字キ ャ ラ ク タ を スモールキ ャ ピ タ ルに変え ます。
ss01
...
ss20
ス タ イ リ ステ ィ ッ
ク 集合 1 ~ 20
個々のグ リ フのス タ イ リ ス テ ィ ッ ク 字体 (salt 機能を参照) に加えて、 あ るいは
それに替えて、 フ ォ ン ト によ っ ては、 その文字集合の 1 個ない し 複数の一部分に照
応する ス タ イ リ ス テ ィ ッ ク異体字グ リ フ群の集合を含んでいる ものがあ り ます。
例 : 欧文フ ォ ン ト 内の小文字に対 し て複数の異体字。
subs
下付き
デ フ ォル ト グ リ フ を下付き グ リ フへ置き換え。
sups
上付き
横並びま たはオール ド ス タ イル数字を上付き数字へ置き換え (主に脚注表示用)、
小文字を上付き文字へ置き換え (主に フ ラ ン ス語敬称の省略形用)。
swsh
スワ ッ シ ュ
デ フ ォル ト グ リ フ を、 照応する スワ ッ シ ュ グ リ フ へ置き換え。
titl
見出 し 化
デ フ ォル ト グ リ フ を、 照応する、 見出 し 用にデザイ ン さ れた字体へ置き換え。
tnum
等幅数字
プ ロポーシ ョ ナル数字を等幅 (表形式) 数字へ置き換え。
unic
ユニケース
大文字 と 小文字を、 小文字 と ス モールキ ャ ピ タ ル字体の混在する集合へマ ッ プ し
て、 高 さ 一定のアルフ ァ ベ ッ ト に し ます。
zero
ス ラ ッ シ ュ付きゼ
ロ
数字ゼロに対するグ リ フ を、 中空部に斜め線を引いた字体へ置き換え。
6.3 OpenType レ イ アウ ト 機能
161
図 6.3
Microsoft の font property extension は フ ォ
ン ト 内の OpenType 機能一覧を表示 し ます
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 個ない し 複数の予備フ ォ ン ト と にわた る グ リ フ群には適用 さ れません。
162
第 6 章 : テキス ト 出力
> 必ず、 必要な場面でそのつど各機能を有効 ・ 無効を切 り 替えて く だ さ い。 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 は期待どお
り の出力を生成 し ます。 すなわち合字な し で ス モールキ ャ ピ タ ルを適用 し ます。
制御キ ャ ラ ク タ で合字を無効に 言語に よ っ ては、 あ る 特定の状況では合字を使っ ては
いけない も のがあ り ます。 ド イ ツ語な ど の言語におけ る タ イ ポグ ラ フ ィ 規則では、 複合語
の境界を ま た ぐ合字の使用を禁 じ てい ます。 た と えば f+i の組み合わせは、 単語 Schilfinsel
内では合字へ置 き 換え てはいけ ません。合成 さ れた 2 つの単語の境界を ま たいでい る か ら
です。
先述の よ う に、 合字な ど の OpenType 機能の処理は、 features オプシ ョ ンで有効 ・ 無効
を切 り 替え る こ と がで き ます。上記の よ う な例外的場合のたびに合字を オプシ ョ ンで無効
に し てい く のは面倒です。 シ ンプルな合字制御を提供する ために、 テ キ ス ト 内の制御キ ャ
ラ ク タ で合字を無効にす る 機能があ り ますので、 こ れを利用すれば、 機能の有効 ・ 無効を
た く さ んのオプシ ョ ンで切 り 替え る 必要はな く な り ます。連続す る キ ャ ラ ク タ の間にゼロ
幅非接合子 (U+200C、 &zwnj。 表 6.4 も 参照) キ ャ ラ ク タ を挿入すれば、 合字が features
オプ シ ョ ン で有効に し て あ っ て も 、 その箇所は合字へ置 き 換わ ら な く な り ま す。 た と え
ば、 以下の コ ー ド は f+i 合字を作成 し ません :
<features={liga charref=true}>Schilf&zwnj;insel
用字系 ・ 言語固有の OpenType レ イ アウ ト 機能 OpenType 機能は、 あ ら ゆ る 場面で適用
さ れ る も の も あ り ます し 、 あ る 特定の用字系に対 し て実装 さ れてい る も の も あ り ます。 あ
る 特定の用字系 と 言語 と の組み合わせに対 し て実装 さ れてい る も の も あ り ま す。 こ のた
め、 features オプシ ョ ンに加え て script ・ language テ キ ス ト オプシ ョ ン を与え る こ と が可
能です。 こ れ ら が実効性を持つのは、 その機能が フ ォ ン ト 内で用字系ま たは言語に固有な
形で実装 さ れてい る 場合のみです。
6.3 OpenType レ イ アウ ト 機能
163
た と えば、 f ・ i グ リ フ に対す る 合字は、 い く つかの フ ォ ン ト においては、 ト ル コ 語が
選ばれてい る と き には得 ら れません (なぜな ら ト ル コ 語では点のない i が頻出する ため、 i
の合字形はそれ と 混同 し やすいか ら です) 。 その よ う な フ ォ ン ト を用いてい る 場合に、 以
下のテ キ ス ト フ ロ ーオプシ ョ ンは、用字系 / 言語を一切指定 し ていないので合字を作成 し
ます :
<features={liga}>fi
し か し 、 以下のテ キ ス ト フ ロ ーオプシ ョ ン リ ス ト は、 ト ル コ 語オプシ ョ ンがあ る ので合字
を作成 し ません :
<script=latn language=TRK features={liga}>fi
locl 機能は、 明示的に言語固有のキ ャ ラ ク タ 字体を選択 し ます。 liga 機能は、 言語固有の
合字を含んでい ます。 言語固有機能のい く つかの例 :
セルビア語用キャラクタ字体:
<features={locl} script=cyrl language=SRB charref>&#x0431;
ウルドゥー語用数字字体:
<features={locl} script=arab language=URD charref>&#x0662;&#x0663;&#x0664;&#x0665;
使え る 言語 ・ 用字系キーワ ー ド については 168 ページ 「6.4.2 用字系 と 言語」 を参照 し て
く だ さ い。
OpenType 機能 と シ ェ ー ピ ン グ を組み合わせ 複雑用字系の シ ェ ー ピ ン グ (166 ページ
「6.4 複雑用字系出力」 を参照) は、 自動的に選ばれ る OpenType フ ォ ン ト 機能に大 き く 依
存 し てい ま す。 し か し 、 フ ォ ン ト に よ っ ては、 シ ェ ー ピ ン グ のために自動的に選ばれ る
OpenType 機能を、 ク ラ イ ア ン ト アプ リ ケーシ ョ ンが選んだ OpenType 機能 と 組み合わせ
る こ と が意味を持つ場合があ り ます。 PDFlib は、 まずユーザーが選んだ OpenType 機能を
適用 し (オプシ ョ ン 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)
164
第 6 章 : テキス ト 出力
{
/* 機能にフォントとPDFlibが対応している */
}
6.3 OpenType レ イ アウ ト 機能
165
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 番目のキ ャ ラ ク タ を入れ替えた ら ど う な る ので し ょ
う か。 こ の理由か ら 、 シ ェ ーピ ン グ さ れた テ キ ス ト の中での書式の変更は、 単語の途
中では行わずに、 単語の境界でのみ行 う 必要があ り ます。
166
第 6 章 : テキス ト 出力
表 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. 末尾の空白キャラクタに注意。
6.4 複雑用字系出力
167
シ ェ ー ピ ン グのための要件 複雑用字系のシ ェ ーピ ン グ と と も に用い る ための フ ォ ン ト
は、 対象用字系のグ リ フ群を含んでい る と い う こ と に加えて、 以下の要件を満た し てい る
必要があ り ます :
> 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 レ イ ア ウ ト 機能」
168
第 6 章 : テキス ト 出力
を参照)。 若干の機能は、 script ・ language オプシ ョ ンに従っ て動作が変わ る こ と があ り ま
すが、 こ れ ら のオプシ ョ ン な し で も 使え る のに対 し (liga 等)、 locl 機能は script ・ language
オプシ ョ ン と 組み合わせてのみ意味を持ち ます。
注 テキス ト フ ローにおけ る高度な改行 (239 ページ 「8.2.10 高度な用字系固有の改行」 を参
照) で も、 言語固有の処理が行われますが、 これは 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 と 等価 と し て
扱います。
6.4 複雑用字系出力
169
6.4.3 複雑用字系のシ ェ ー ピ ン グ
シ ェ ーピ ン グ処理は、 キ ャ ラ ク タ が単語の先頭 ・ 途中 ・ 末尾ま たは単独位置のいずれにあ
る かに よ っ て適切な グ リ フ字体を選択 し ます。シ ェ ーピ ン グは、ア ラ ビ ア文字・ ヒ ンデ ィ ー
文字テ キ ス ト 処理の不可欠な要素です。 シ ェ ーピ ン グは、 2 個以上のキ ャ ラ ク タ 列を適切
な合字へ置 き 換え る こ と も あ り ます。シ ェーピ ン グ処理は適切な キ ャ ラ ク タ 字体を自動的
に決定 し ますので、 明示的な合字 と Unicode の表示形 (例 : U+FB50 か ら 始ま る ア ラ ビ ア
文字表示形群 A) を入力キ ャ ラ ク タ と し て用いてはいけ ません。
複雑用字系は、1 つのキ ャ ラ ク タ に対 し て複数の異な る グ リ フ字体を必要 と し 、 かつ こ
れ ら のグ リ フ を選択 し 配置す る ための追加の規則を要する こ と か ら 、複雑用字系のシ ェー
ピ ン グはあ ら ゆ る 種類の フ ォ ン ト で働 く わけではな く 、必要な情報を含んだ適当な フ ォ ン
ト が必要です。 シ ェ ーピ ン グは、 必要な機能テーブルを含む TrueType ・ OpenType フ ォ ン
ト で働 き ます (要件の詳細は 168 ページ 「シ ェーピ ン グのための要件」 を参照)。
シ ェーピ ン グは、同一フ ォ ン ト 内のキ ャ ラ ク タ 群に対 し てのみ行 う こ と がで き ます。な
ぜな ら シ ェ ーピ ン グ情報は特定の フ ォ ン ト に固有の も のだか ら です。 た と えば、 複数の異
な る フ ォ ン ト にわた る 合字を形成す る こ と は意味があ り ませんので、複雑用字系のシ ェー
ピ ン グは、複数の異な る フ ォ ン ト か ら のキ ャ ラ ク タ を含む単語には適用す る こ と がで き ま
せん。
シ ェ ー ピ ン グ動作を オーバ ラ イ ド 場合に よ っ ては、 ユーザーがデフ ォ ル ト シ ェ ーピ ン
グ 動作 を オーバ ラ イ ド し た い こ と も あ り ま す。 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/ を参照。
170
第 6 章 : テキス ト 出力
双方向アルゴ リ ズム を オーバ ラ イ ド 自動双方向処理は多 く の場合において適切な結果
を与え ますが、 場合に よ っ ては明示的なユーザー制御が必要な こ と も あ り ます。 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 に
従っ た方向組版 コ ー ド (テ キ ス ト 内にあれば) か ら 推定 さ れます。
6.4 複雑用字系出力
171
> 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 に挙げた組版キ ャ ラ ク タ を用いて、 合字を
強制 し た り 禁止 し た り す る こ と がで き ま す。 た と えば、 以下の例のゼ ロ 幅非結合子は、
キ ャ ラ ク タ が合字を形成す る こ と を禁止 し て、 正 し い略称表記を生成 し てい ます :
&#x0623;&#x064A;&ZWNJ;&#x0628;&#x064A;&ZWNJ;&#x0625;&#x0645;
ア ラ ビ ア文字テキス ト におけ る タ ト ウ ィ ール タ ト ウ ィ ールキ ャ ラ ク タ U+0640 (カ シー
ダ と も い う ) を 1 個ない し 複数挿入す る こ と に よ っ て、 ア ラ ビ ア単語を引 き 伸ばす こ と が
で き ます。PDFlib は自動的に タ ト ウ ィ ールキ ャ ラ ク タ を挿入す る こ と に よ る テ キ ス ト の均
等揃えは行い ませんが、 こ のキ ャ ラ ク タ を自分で入力テ キ ス ト 内に挿入 し て単語を引 き 伸
ばす こ と はで き ます。
172
第 6 章 : テキス ト 出力
ア ラ ビ ア文字 フ ォ ン ト に欧文キ ャ ラ ク タ を追加 い く つか の ア ラ ビ ア 文字 フ ォ ン ト は、
欧文キ ャ ラ ク タ に対す る グ リ フ を一切含んでい ません。 OS X/macOS にバン ド ル さ れてい
る ア ラ ビ ア文字フ ォ ン ト 等が こ れにあ た り ます。 こ の場合は fallbackfonts オプシ ョ ン を
使っ て、 欧文キ ャ ラ ク タ を ア ラ ビ ア文字フ ォ ン ト に連結す る こ と がで き ます。 PDFlib は、
欧文ま たはア ラ ビ ア文字のテ キ ス ト 入力に従っ て自動的に両フ ォ ン ト を切 り 替え ます。す
なわち、 アプ リ ケーシ ョ ン側で フ ォ ン ト を切 り 替え る 必要はな く 、 欧文 と ア ラ ビ ア文字が
混在す る テ キ ス ト を 1 個の フ ォ ン ト 指定で与え る こ と がで き ます。
fallbackfonts オプシ ョ ン に対 し て以下の フ ォ ン ト 読み込みオプシ ョ ン リ ス ト を用い る
と 、 読み込んだア ラ ビ ア文字フ ォ ン ト へ Helvetica フ ォ ン ト か ら 欧文キ ャ ラ ク タ を追加す
る こ と がで き ます :
fallbackfonts={
{fontname=Helvetica encoding=unicode forcechars={U+0021-U+00FF}}
}
6.4 複雑用字系出力
173
6.5 日本語 ・ 中国語 ・ 韓国語テ キス ト 出力
6.5.1 TrueType ・ OpenType 日中韓 フ ォ ン ト を用い る
PDFlib は、 TrueType ・ TrueType Collections (TTC) ・ OpenType 形式の日中韓フ ォ ン ト に対
応 し てい ます。 日中韓フ ォ ン ト は以下の よ う に処理 さ れます :
> embedding オプシ ョ ンが true な ら ば、フ ォ ン ト は CID フ ォ ン ト に変換 さ れて、PDF 出力
に埋め込まれます。
> Windows 上の日中韓ホ ス ト フ ォ ン ト 名は、BOM 付 き UTF-8 形式か UTF-16 形式で PDF_
load_font( ) に与え る こ と がで き ます。 OS X/macOS では非欧文ホ ス ト フ ォ ン ト 名に対
応 し てい ません。
以下の例では、 中国語テ キ ス ト を ArialUnicodeMS フ ォ ン ト で印字 し てい ます。 フ ォ ン ト
は、 シ ス テ ムに イ ン ス ト ール さ れてい る か、 あ る いは 131 ページ 「5.4.4 フ ォ ン ト を検索」
に従っ て構成 さ れてい る 必要があ り ます :
font = p.load_font("Arial Unicode MS", "unicode", "");
if (font == -1) { ... }
p.fit_textline("\u4e00\u500b\u4eba", x, y, "fontsize=24");
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 フ ォ ン ト では縦書 き には対応 し てい ません) :
> CMap 以外のエン コ ーデ ィ ン グ を持つ TrueType ・ OpenType フ ォ ン ト の場合は、 vertical
オプシ ョ ン を与えれば縦書 き で利用で き ます。
> 「@」 キ ャ ラ ク タ で始ま る フ ォ ン ト 名はつねに縦書 き で処理 さ れます。
174
第 6 章 : テキス ト 出力
> 標準日中韓フ ォ ン ト ・ CMap については、 横書 き か縦書き かは、 適切な CMap 名を選ぶ
こ と に よ っ てエン コ ーデ ィ ン グ と と も に選択 さ れます。 CMap 名の末尾が -H な ら 横書
き が選択 さ れ、 -V な ら 縦書 き が選択 さ れます。
デフ ォ ル ト では、 縦書 き ではすべてのグ リ フ が同 じ 高 さ を持ち ま す。 ただ し TrueType ・
OpenType フ ォ ン ト は、 縦書 き についてプ ロ ポーシ ョ ナルな メ ト リ ッ ク を内容 と す る こ と
も で き ます。 PDFlib では、 フ ォ ン ト オプシ ョ ン readverticalmetrics を設定す る こ と に よ っ
て、 その よ う なプ ロ ポーシ ョ ナルな縦書 き メ ト リ ッ ク を使用 さ せ る こ と も 可能です。
注 字間は縦書き では負の値でなければな り ません。 こ れは、 文字を 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}
}
外字キ ャ ラ ク タ に対す る PUA 値を温存
場合に よ っ ては、 た と えば Windows EUDC フ ォ
ン ト (後述) では、 その フ ォ ン ト に よ っ て外字キ ャ ラ ク タ が私用領域 (PUA) 内の Unicode
値へマ ッ プ さ れてい ます。 デフ ォ ル ト では、 PDFlib は PUA 値を ToUnicode CMap 内の
U+FFFD (Unicode 置換キ ャ ラ ク タ ) へ置 き 換え ます。 結果 と し て、 その よ う な キ ャ ラ ク
タ は、 生成 さ れ る PDF か ら 正 し く 抽出で き ません。
こ の動作は、preservepua フ ォ ン ト 読み込みオプシ ョ ン を用いて変え る こ と も で き ます。
あ る フ ォ ン ト に対 し て こ れが true に設定 さ れてい る 場合には、 PUA 値を持つ外字キ ャ ラ
ク タ はその Unicode 値を温存 し ますので、 その外字は、 生成 さ れ る PDF か ら 正 し く 抽出
で き ます。
6.5 日本語 ・ 中国語 ・ 韓国語テキス ト 出力
175
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={{...ディレクトリ名...}}");
ま たは 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
ハングル
韓文漢字キ ャ ラ ク タ を、 その照応するハングル (音素) キ ャ ラ ク タ へ置き換え。
176
第 6 章 : テキス ト 出力
表 6.6 日本語 ・ 中国語 ・ 韓国語テキス ト 用の対応 OpenType レ イ アウ ト 機能 ( こ れに加えて表 6.1 に、 一般的利用
のための OpenType レ イ アウ ト 機能を挙げています)
キー
ワー
ド
名前
説明
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) の字
形へ置き換え。
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° 時計回 り に回転)。
6.5 日本語 ・ 中国語 ・ 韓国語テキス ト 出力
177
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("&#x2268; &#x2268;&#xFE00;", 50, 700,
"fontname={Cambria Math} encoding=unicode fontsize=24 charref=true");
p.fit_textline("&#x3402;&#xE0100; &#x3402;&#xE0101;", 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 参照
178
第 6 章 : テキス ト 出力
図 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
6.5 日本語 ・ 中国語 ・ 韓国語テキス ト 出力
179
表 6.7 日本語 ・ 中国語 ・ 韓国語テキス ト 用の Acrobat の標準フ ォ ン ト ・ CMap (エ ン コ ーデ ィ ング)
ロ ケール
フォン ト名
対応 CMap (エ ン コ ーデ ィ ング)
2
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
中国語
簡体字
AdobeSongStd-Light
中国語
繁体字
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 機能 と テ キ ス ト フ ロ ー組版機能が利用で き る こ と
です。
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( ) の最後の引数は、 画像の位置付け ・ 拡縮 ・ 回転を指定で き る さ ま ざ ま な
オプシ ョ ン を持たせ る こ と ので き る オプシ ョ ン リ ス ト です。 こ のオプシ ョ ン群については
206 ページ 「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 画像フ ァ イ ル
内の元の色空間に変更を加え ません。
> (非サポー ト ) 1 個・3 個・4 個の色要素を持つ、JPX ラ ッ パのない生の JPEG 2000 コ ー ド
ス ト リ ーム ( し ば し ば *.j2k) を取 り 込む こ と がで き ます。
> 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");
外在透過 外在の場合には、 2 つの段階が必要で、 ど ち ら も 画像操作を伴い ます。 第一に、
マ ス ク と し て後で使 う ためのグ レース ケール画像を 1 つ用意する 必要があ り ます。そのた
めにはマ ス ク 画像を読み込みます。グ レース ケール画像を使っ てマ ス ク を構築す る こ と が
で き ます。 TIFF 画像の場合には、 マルチ ス ト リ ッ プ画像を避け る ため、 PDF_load_image( )
で nopassthrough オプシ ョ ン を推奨 し ます。
マ ス ク 内で ピ ク セル値が 0 (ゼ ロ ) の部分の画像は塗 ら れ、 ピ ク セル値が 0 でない部分は
背景が透けて見え ます。 ピ ク セルあ た り のビ ッ ト 数が 1 よ り 大き い場合、 中間値は前景画
像を背景にブ レ ン ド さ せて透過効果を生みます。
第二段階 と し て、 そのマ ス ク を別の画像に masked オプシ ョ ンで適用 し ます :
mask = p.load_image("png", maskfilename, "");
if (mask == -1)
throw new Exception("エラー:" + p.get_errmsg());
String optlist = "masked=" + mask;
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 上の複数の画像に変換す
り こ と があ り 、 その場合、 マス クはその各画像に対 し て独立にかかる こ と にな り ます。 通
常 こ のよ う な こ と は意図 さ れていないので、 この種の画像はマス ク と し て も マス ク対象画
像 と し て も 拒否 さ れます。 また、 内在の場合 と 外在の場合 と を互いに混在 さ せない こ と が
重要です。 つま り 、 透過カ ラ ー値を持つ画像を マス ク と し て使っ てはいけません。
188
第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ 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 オプシ ョ ン を使
う 必要があ り ます (189 ページ 「7.1.5 画像に着色」 参照)。
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);
7.1 ラ ス タ 画像
189
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 グ ラ フ ィ ッ ク 内に埋め込ま
れます。
制約について 198 ページ 「7.2.7 対応 し ていない 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( ) の最後の引数は、 位置付け ・ 拡縮 ・ 回転のための さ ま ざ ま なオプシ ョ
ン をサポー ト し てい る オプシ ョ ン リ ス ト です。 こ れ ら のオプシ ョ ンに関す る 詳細は、 206
ページ 「7.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置」 で説明 し ます。
ク ッ ク ブ ッ ク SVG の取 り 扱いのための コ ー ド サン プルが、PDFlib ク ッ ク ブ ッ クの graphics カ テ ゴ リ にあ
り ます。
1 個の文書内で同一のグ ラ フ ィ ッ ク を複数回使用 PDFlib は、 ベ ク ト ルグ ラ フ ィ ッ ク を
取 り 込むための、 以下の異な る 方式をサポー ト し てい ます :
7.2 SVG グ ラ フ ィ ッ ク
191
> デフ ォ ル ト では、 グ ラ フ ィ ッ ク デー タ は、 ページ ・ パ タ ーン ・ テ ン プ レー ト ・ グ リ フ
記述の内容ス ト リ ーム内に イ ン ラ イ ン に書 き 込ま れ ます。 こ れがデフ ォ ル ト の動作で
あ り 、 こ れは、 そのグ ラ フ ィ ッ ク がその文書内にち ょ う ど 1 回だけ配置 さ れ る 場面に
対 し て推奨 さ れます。も し 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 文書へ変換
し 、 それ以外のページ内容を追加 し ない場合には、 こ れは許容で き る アプ ロ ーチです。
192
第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む
こ の fittingpossible チ ェ ッ ク は、 カ レ ン ト でア ク テ ィ ブな グ ロ ーバル ・ 文書 ・ ページオプ
シ ョ ン群 と 、 カ レ ン ト 出力 イ ン テ ン ト を使用 し ます。 ですので こ のチ ェ ッ ク は、 PDF_fit_
graphics( ) への実際の呼び出 し の直前にのみ走 ら せ る こ と を推奨 し ます。
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 属性
が得 ら れ な い場合に有用です。 こ の場合に は、 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>
7.2 SVG グ ラ フ ィ ッ ク
193
<font-family>,<font-weight>,<font-normstyle>
<font-family>,<font-normweight>,<font-normstyle>
こ こ で <font-normweight> は
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 を用い ます。
194
第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む
のオプシ ョ ン
フ ォ ン ト 構成 Windows シ ス テ ム では、 PDFlib は、 シ ス テ ムに イ ン ス ト ール さ れてい る す
べての フ ォ ン ト にア ク セ ス で き ます (136 ページ 「5.4.5 Windows ・ OS X/macOS 上のホ ス
ト フ ォ ン ト 」 参照)。 た と えば、 SVG フ ォ ン ト 指定
font-family="Verdana" font-weight="bold"
は、 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 SVG グ ラ フ ィ ッ ク
195
7.2.5 見つか ら ない フ ォ ン ト 、 見つか ら ないグ リ フ を扱 う
見つか ら ない フ ォ ン ト と デ フ ォ ル ト フ ォ ン ト すべての フ ォ ン ト 読み込み試行が失敗 し
た場合、PDFlib は、PDF_load_graphics( ) の defaultfontfamily オプシ ョ ンで定義 さ れた fontfamily 名 を 持つデ フ ォ ル ト フ ォ ン ト を 読み込 も う と 試み ま す。 デ フ ォ ル ト では、 Arial
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}}}
196
第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む
なお、 さ き に説明 し た defaultfontfamily オプシ ョ ンで指定 さ れた フ ォ ン ト は、 フ ォ ン ト が
見つか ら ない と き に使用 さ れ る のに対 し て、 こ の予備技法は、 フ ォ ン ト は得 ら れ る が必要
な グ リ フ を全部は含んでいない場合にあ ては ま り ます。
グ ロ ーバルな予備 フ ォ ン ト フ ァ ミ リ を指定 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
を用い る と 、 こ のパ タ ーン を カ ス タ マ イ ズ し た り 、 あ る いはカ ス タ ムの画像ま たはテ ンプ
レー ト を フ ォールバ ッ ク 視覚効果 と し て与え る こ と がで き ます。見つか ら ない画像が自動
的に置換 さ れ る こ と を避けたい場合には以下のオプシ ョ ン を用い ます :
errorconditions={references={image}}
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 リ フ ァ レ ン ス参照)。 グ ラ フ ィ ッ ク の外部に位置す る リ ン ク は無視
7.2 SVG グ ラ フ ィ ッ ク
197
さ れます。 PDF 注釈の contents オプシ ョ ンに、 SVG リ ン ク の xlink:title 属性が も し あれば
それが、 なければ タ ーゲ ッ ト URI が記入 さ れます。 タ グ付 き PDF モー ド では、 生成 さ れ
た リ ン ク に対 し て、 Link エ レ メ ン ト 1 個 と 、 関連する OBJR エ レ メ ン ト 1 個が作成 さ れま
す。 ただ し 、 カ レ ン ト でア ク テ ィ ブな ア イ テ ムがページ装飾か擬似エ レ メ ン ト であ る 場合
を除き ます。
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 = {elements={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
198
第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む
> グ リ フ選択のためのエ レ メ ン ト 群 :
altGlyph, altGlyphDef, altGlyphItem, glyphRef
> その他のエ レ メ ン ト 群 :
cursor, foreignObject, vkern
制約のあ る SVG エ レ メ ン ト ・ 属性 ・ プ ロパテ ィ 以下の属性 と プ ロ パ テ ィ に は制約が
あ り ます :
> い く つかの CSS 規則に対応 し てい ません。 例 : @import ・ @font-face
> フ ォ ン ト 選択プ ロ パテ ィ font-variant には、キー ワー ド small-caps でのみ、かつOpenType
機能 smcp を含むフ ォ ン ト に対 し てのみ対応 し てい ます。
> テ キ ス ト 体裁プ ロ パテ ィ text-decoration の複数の値の組み合わせには対応 し てい ませ
ん。 PDFlib は文字飾 り 要素を、 別個の塗 り ・ 描線色を持つ領域 と し て描 く のではな く 、
文字飾 り 要素を直線 と し て描 き ます。 こ の直線は、 塗 り 色があればそれで、 なければ
描線色で描かれます。
> textPath エ レ メ ン ト に対す る rotate 属性には対応 し てい ません。
> clipPath エ レ メ ン ト は、その ク リ ッ ピ ン グパ ス が SVG フ ォ ン ト 内のグ リ フ群か ら 成っ て
い る 場合には何 ら 効力を持ち ません。
> stroke 属性を持っ た SVG フ ォ ン ト 内のテ キ ス ト を描線す る こ と はで き ず、常に塗 ら れま
す。
> プ ロ パテ ィ 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, 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)
縦書きテキストに対するtextLength・lengthAdjust (text・textpath・tref・tspan)
version (svg)
zoomAndPan (svg)
xlink:role (すべてのエレメント)
xlink:show (すべてのエレメント)
xlink:type (すべてのエレメント)
7.2 SVG グ ラ フ ィ ッ ク
199
機能文字列に よ っ て識別 さ れる機能の う ち非対応の も の W3C は、SVG の機能の う ち ア
プ リ ケーシ ョ ン ご と に対応 し て も し な く て も よ い各部分について、それぞれを識別す る た
め に 用 い る こ と の で き る 機能文字列 の 一覧 を、 http://www.w3.org/TR/2003/REC-SVG1120030114/feature.html で示 し てい ます。 以下の一覧に、 PDFlib が完全には対応 し ていない
機能に対す る 機能文字列を示 し ます :
完全に非対応の機能 :
http://www.w3.org/TR/SVG11/feature#SVGDOM*
http://www.w3.org/TR/SVG11/feature#ContainerAttribute
http://www.w3.org/TR/SVG11/feature#Filter
http://www.w3.org/TR/SVG11/feature#BasicFilter
http://www.w3.org/TR/SVG11/feature#DocumentEventsAttribute
http://www.w3.org/TR/SVG11/feature#GraphicalEventsAttribute
http://www.w3.org/TR/SVG11/feature#AnimationEventsAttribute
http://www.w3.org/TR/SVG11/feature#Cursor
http://www.w3.org/TR/SVG11/feature#ExternalResourcesRequired
http://www.w3.org/TR/SVG11/feature#View
http://www.w3.org/TR/SVG11/feature#Script
http://www.w3.org/TR/SVG11/feature#Animation
http://www.w3.org/TR/SVG11/feature#Extensibility
一部非対応の機能 :
http://www.w3.org/TR/SVG11/feature#ConditionalProcessing
非対応の属性:requiredFeatures・requiredExtensions
http://www.w3.org/TR/SVG11/feature#Text
非対応のエレメント:altGlyph・altGlyphDef・altGlyphItem・glyphRef
http://www.w3.org/TR/SVG11/feature#PaintAttribute
非対応のプロパティ:color-interpolation・color-rendering
http://www.w3.org/TR/SVG11/feature#GraphicsAttribute
非対応のプロパティ:display・image-rendering・pointer-events・shape-rendering
http://www.w3.org/TR/SVG11/feature#XlinkAttribute
非対応の属性:xlink:role・xlink:arcrole・xlink:show・xlink:actuate
http://www.w3.org/TR/SVG11/feature#Font
非対応のエレメント:font-face-format
200
第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む
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 ブ ロ ッ ク と あわせて利用 さ れ る こ と をおすすめ し ます (363 ページ 「12 章 PPS と
PDFlib Block Plugin」 参照)。
7.3.2 PDFlib+PDI を使用
ク ッ ク ブ ッ ク PDF 取 り 込みの諸側面に関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ ク の pdf_import カ テ ゴ
リ にあ り ます。
一般的考察 重要な注意点 と し て、 PDI は実際のページ内容だけ を取 り 込みますので、 取
り 込む PDF 文書内に存在 し てい る か も し れない イ ン タ ラ ク テ ィ ブ機能 (た と えばサ ウ ン
ド ・ ムービー ・ フ ァ イ ル添付 ・ ハ イ パーテ キ ス ト リ ン ク ・ フ ォーム フ ィ ール ド ・ JavaScript ・
し お り ・ サ ム ネール ・ ノ ー ト ) は一切取 り 込み ま せん。 こ う し た イ ン タ ラ ク テ ィ ブ機能
は、 その照応す る PDFlib 関数で生成す る こ と がで き ます。
以下のア イ テ ム を取 り 込む こ と も で き ます :
7.3 PDF ページ を PDI で取 り 込む
201
> 構造エ レ メ ン ト タ グ を取 り 込め ます(詳 し く は 204 ページ「 タ グ付き PDF 文書内のペー
ジ を取 り 込む」 を参照)
> レ イ ヤ定義を取 り 込め ます(詳 し く は 204 ページ「レ イ ヤーを持つ PDF ページ を取 り 込
む」 を参照)
> (PPS のみ)PDFlib ブ ロ ッ ク を、PDF_process_pdi( ) と オプシ ョ ン action=copyallblocks ま た
は copyblock で取 り 込め ます (407 ページ 「12.8.2 PDFlib ブ ロ ッ ク を取 り 込む」 参照)。
取 り 込んだページ内の個々の要素を他の PDFlib 関数で再利用す る こ と はで き ません。 た
と えば、取 り 込んだ文書内の フ ォ ン ト を他の何 ら かの内容のために再利用す る こ と は不可
能です。 必要な フ ォ ン ト はすべて PDFlib 内で構成す る 必要があ り ます。 取 り 込んだ複数
の文書が同 じ フ ォ ン ト の埋め込みフ ォ ン ト デー タ を それぞれ持っ ていた と し て も 、フ ォ ン
ト デー タ の重複を PDI は解消 さ せません。 他方、 取 り 込んだ PDF 内で欠けてい る フ ォ ン
ト があれば、 生成 さ れ る PDF 出力フ ァ イ ル内で も その フ ォ ン ト は欠けた ま ま です。 最適
な方法 と し ては、 取 り 込む文書はな る べ く 開いた ま ま に し ておいたほ う が、 同 じ フ ォ ン ト
が何度 も 出力文書内に埋め込まれずにすみます。
取 り 込んだ PDF のページ を出力ページ上に配置する ために PDFlib+PDI はテ ンプ レー ト
機能 (フ ォーム XObject) を利用 し ます。 他の PDF 文書か ら 取 り 込まれたページ を含む文
書を さ ら に PDFlib+PDI で処理す る こ と も で き ます。
PDF ページ を取 り 込むための コ ー ド 断片 既存 PDF 文書内のページの取 り 込みは非常に
単純な コ ー ド 構造で実現可能です。 以下の コ ー ド ス ニペ ッ ト は、 既存文書のページ を開
き 、 そのページ内容を出力 PDF 文書内に コ ピー し ます (出力 PDF 文書はあ ら か じ め開い
てい る 必要があ り ます) :
int
doc, page, pagecount, pageno = 1;
String filename = "input.pdf";
if (p.begin_document(outfilename, "") == -1) {...}
...
doc = p.open_pdi_document(infilename, "");
if (doc == -1)
throw new Exception("エラー:" + p.get_errmsg());
/* 入力文書内のページ数。全ページを取り込むのに有用 */
pagecount = (int) p.pcos_get_number(doc, "length:pages");
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( ) の最後の引数は、 取 り 込むページの位置付け ・ 拡縮 ・ 回転を指示す る
さ ま ざ ま なオプシ ョ ン を持ち う る オプシ ョ ン リ ス ト です。 こ のオプシ ョ ンについては詳 し
く は 206 ページ 「7.4 画像・グ ラ フ ィ ッ ク ・取 り 込み PDF ページ を配置」で解説 し てい ます。
202
第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む
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 ス テー タ ス と 非互換の場合には、 拒否 さ れます。
詳 し く は以下の項を参照 し て く だ さ い :
>332 ページ 「11.3.7 PDF/A 文書を PDI で取 り 込み」。
>343 ページ 「11.4.5 PDF/X 文書を PDI で取 り 込む」。
>353 ページ 「11.5.7 PDF/X ・ PDF/VT 文書を PDI で取 り 込む」。
>360 ページ 「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 を優先採用 し ます。 76 ページ 「3.2.2 ページサ イ ズ」 参照)。
> ページに適用 さ れてい る 回転は保持 さ れます。
7.3 PDF ページ を PDI で取 り 込む
203
cloneboxes オプシ ョ ンは PDFlib+PDI に対 し て、 取 り 込みページのすべてのページ枠を生
成出力ページへ コ ピーす る よ う 指示 し 、 その結果、 すべてのページサ イ ズ情報が転写 さ れ
ます。
あ る いは、 pdiusebox オプ シ ョ ン を用い て明示的に、 ページの MediaBox ・ CropBox ・
TrimBox ・ ArtBox エン ト リ の う ちのいずれか を ( も し あれば) 用いて取 り 込みページのサ
イ ズ を決め る よ う PDI に指示す る こ と も で き ます。
そ し て、 PDF_open_pdi_page( ) の transform オプシ ョ ン を用いて、 取 り 込みページに対
し て、 拡大 ・ 縮小や回転な ど、 任意の変換を適用する こ と も で き ます。
色の扱い PDFlib+PDI は、取 り 込んだ PDF 文書の色を一切変更 し ません。 た と えば、PDF
が ICC カ ラ ープ ロ フ ァ イ ルを含んでい る 場合、 こ れは出力文書内に保持 さ れます。ページ
が透過グループエン ト リ を含んでい る 場合、 それは、 生成 さ れ る フ ォーム XObject へ複製
さ れます。 ただ し 、 PDF_open_pdi_page( ) の transparencygroup オプシ ョ ンが別の扱いを
要請 し てい る 場合を除 き ます。
タ グ付き PDF 文書内のページ を取 り 込む デフ ォ ル ト では、 タ グは、 入力文書 と 出力文
書の両方が タ グ付け さ れていれば取 り 込まれます。 ただ し 、 タ グ取 り 込みは、 PDF_open_
pdi_document( ) と PDF_open_pdi_page( ) の usetags オプシ ョ ンで無効にす る こ と も で き ま
す。 詳 し く は 309 ページ 「10.4.5 タ グ付 き PDF ページ を PDI で取 り 込む」 を参照 し て く
だ さ い。
レ イ ヤー を持つ PDF ページ を取 り 込む PDFlib はつねに、 ページ上のすべての レ イ ヤー
(技術的には 「オプシ ョ ナル内容」 と いい ます) の内容を取 り 込みます。 レ イ ヤーの可視
ス テー ト を含むレ イ ヤー定義 も 、 その レ イ ヤーが、 取 り 込んだページ群の う ちのいずれか
で使用 さ れていれば、 取 り 込ま れます。 ただ し 、 レ イ ヤー定義の取 り 込みは、 PDF_open_
pdi_document( ) の uselayers オプシ ョ ンで無効にす る こ と も で き ます。取 り 込んだ レ イ ヤー
群の整頓を さ ら に制御す る には、取 り 込んだ レ イ ヤー群に付加 さ れ る レ イ ヤー リ ス ト の中
に階層構造的な タ イ ト ルレ イ ヤーを作成す る PDF_open_pdi_document( ) の parenttitle を
用い る こ と も で き ます (た と えばフ ァ イ ル名を与え る ために)。parentlayer オプシ ョ ンは、
同様に動作 し ますが、 ただ し ユーザー定義レ イ ヤーのハン ド ルを と り ます。
地理参照付 き 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 オプシ ョ ン を使 う こ と がで き ます。 こ れは取 り 込んだ フ ァ イ ル内の冗長なオ
204
第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む
ブジ ェ ク ト を検知 し て、生成す る 出力の体裁や品質を そ こ な う こ と な く そ う し たオブジ ェ
ク ト を削除 し ます。
暗号化 さ れた 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 に設定 さ れ る 。
7.3 PDF ページ を PDI で取 り 込む
205
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 の場合には意味があ り ません。
なぜな ら こ の場合、 そのオブジ ェ ク ト は位置付け ら れ る だけであ り 、 拡縮は行われないか
206
第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む
ら です。 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 さ ま ざ ま なはめ込み方式に従っ て画像を枠内にはめ込む
生成 さ れる出力
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.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置
207
生成 さ れる出力
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 オプシ ョ ンは、 座標系全体には一切影響せずに、 配置す る オブジ ェ ク
ト にだけ影響を及ぼ し ます。
208
第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む
図 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 オプシ ョ ンの
一般的な動作を図示 し ます。
7.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置
209
画像を回転 さ せて配置 まずは じ めに、 画像を 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 参照)、 画像の ま わ り にふちが残
り ま す。 ページサ イ ズ を画像 よ り 小 さ く す る と 、 画像の一部は切 り 落 と さ れ ま す。 ま ず
は、 ページサ イ ズ を オブジ ェ ク ト の大 き さ と ち ょ う ど同 じ に し ま し ょ う :
210
第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む
図 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 のページサ イ ズや裁ち落 と し 等が必ず入力文書のペー
ジ と 同 じ にな る よ う にす る こ と がで き ま す。 こ れは特にプ リ プ レ ス 分野において重要で
す。
7.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置
211
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);
212
第 7 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む
8 テキス ト と 表の組版
8.1 テキス ト 行を配置 ・ はめ込む
一行のテ キ ス ト をページ上に配置す る ための関数PDF_fit_textline( )には さ ま ざ ま な組版オ
プシ ョ ンがあ り ます。 こ の節では も っ と も 重要なオプシ ョ ン をい く つか よ く 使われ る 応用
例を用いて解説 し ます。こ う し たオプシ ョ ンの完全な説明は PDFlib リ フ ァ レ ン スにあ り ま
す。 PDF_fit_textline( ) のオプシ ョ ンの多 く は PDF_fit_image( ) のオプシ ョ ン と 同 じ です。
ですので こ こ ではテ キ ス ト 関連の利用例のみを示 し ます。画像の組版については、206 ペー
ジ 「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 参照)。
それ以外の高 さ を テ キ ス ト 枠に対 し て指定す る には、範囲枠機能を使い ます (261 ペー
ジ 「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 オプシ ョ ン を用い る と 、 テ キ ス ト の影付 き 効果を生み出す こ と がで き ます。 影の
色 と 、 メ イ ン テ キ ス ト か ら の横 ・ 縦距離を、 サブオプシ ョ ン内で指定で き ます :
p.fit_textline("Long Distance Glider", x, y,
"fillcolor=rosybrown shadow={offset={3, -3}}");
8.1.9 Acrobat で編集で き る透か し
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の text_output/watermark ト ピ ッ ク にあ り ます。
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
テ キ ス ト 行機能を使 う と 、テ キ ス ト に対 し て さ ま ざ ま な組版オプシ ョ ン を適用す る こ と が
で き ます。 こ のテ キ ス ト は、 ページに組み込まれた一部分 と な り 、 最終 PDF 文書内で簡
単に編集す る こ と はで き ま せん。 し か し 、 Acrobat は 「透か し 」 機能を提供 し てい ま す。
こ の機能を利用す る と 、 Adobe Acrobat で後で変更や削除で き る ページ内容を作成で き ま
す (無料の Reader では不可)。 ただ し 、 こ の機能は PDF 標準 ISO 32000 に含まれてい る も
のではな く 、 Acrobat に実装 さ れてい る 独自拡張です。 ですので こ の機能は、 すべての標
準準拠 PDF ビ ュ ーアで動作す る こ と が保証 さ れてい る も のではあ り ません。
Acrobat の透か し は、 1 行ない し 複数のテ キ ス ト 行か、 1 つの画像か、 1 つの PDF ペー
ジ を、 1 つのテ ンプ レー ト (フ ォーム XObject) 内に ラ ッ プ し て、 その透か し の組版特性
群の XML 記述を加え る こ と に よ っ て動作 し ます。 既存の透か し を Acrobat で編集す る に
は以下の よ う に操作 し ます :
> Acrobat DC:「ツール」→「PDF を編集」→「透か し 」→「更新 ...」ま たは「削除 ...」を ク リ ッ ク 。
> Acrobat XI : 「ツール」 → 「ページ」 → 「ページデザイ ンの編集」 → 「透か し 」 → 「更
新 ...」 ま たは 「削除 ...」 を ク リ ッ ク 。
す る と 「透か し を更新」 ダ イ ア ロ グが開 き ますので (図 8.12 参照)、 そ こ で透か し のテ キ
ス ト や、 その配置 ・ 体裁や、 対象 と す る ページ範囲を指定で き ます。 こ のテ キ ス ト の体裁
は、 こ のダ イ ア ロ グ を用いた後に変わ る 可能性 も あ り ま す。 なぜな ら 、 こ のダ イ ア ロ グ
は、 文字間隔や下線、 テ キ ス ト 表現モー ド な ど、 あ ら ゆ る テ キ ス ト 組版オプシ ョ ンに対応
し てい る わけではないか ら です。
こ の透か し は、 画面表示上で、 ま たは印刷ページ上で、 あ る いは両方で印字 さ れ る よ
う 指定す る こ と が可能です ( こ の Acrobat のダ イ ア ロ グの中の 「表示方法オプ シ ョ ン ...」)。
こ れは、 適切な画面 ・ 印刷設定を施 さ れた 「透か し 」 と い う レ イ ヤーを通 じ て実現 さ れま
す。 ただ し PDF/A ・ PDF/X ・ PDF/UA においては、 レ イ ヤー と レ イ ヤーオプシ ョ ンには
さ ま ざ ま な制約が課せ ら れてい ます。
PDFlib は、 そのテ ンプ レー ト 機能を拡張す る こ と に よ っ て こ の透か し 機能に対応 し て
い ます。PDF_begin_template_ext( ) を用いてテ ンプ レー ト を作成す る 際に、その watermark
オプ シ ョ ン を 用い て こ れに標識す る こ と が可能です。 その場合、 こ の テ ン プ レ ー ト は、
図 8.12
Acrobat の
透か し ダ イ
ア ログ
8.1 テキス ト 行を配置 ・ はめ込む
221
PDF_fit_textline( ) を用いて作成 さ れたただ 1 行のテ キ ス ト のみを内容 と し てい る 必要があ
り ます。 そ う し て生成 さ れた透か し は、 自動的にすべてのページに加え ら れ (あ る いは一
部のページに も 可)、 後で Acrobat を用いて変更ま たは削除す る こ と が可能です。
注 複数行 ・ 画像 ・ PDF ページ を内容 と する透か し には現状対応 し ていません。
以下の コ ー ド 断片は、 編集可能な透か し の定義を演示 し てい ます。 こ の透か し は、 こ の透
か し を定義 し た後に作成 さ れ る すべてのページに自動的に追加 さ れます。 なお、 指定 し て
い る 文字サ イ ズは意味を持ち ません。 なぜな ら 、 こ う し てで き た テ ンプ レー ト はいずれに
せ よ そのページ内に収め ら れ る か ら です :
p.begin_template_ext(0, 0, "watermark={location=ontop opacity=60%}");
p.fit_textline("Preliminary", 0, 0,
"fontsize=12 fontname=Helvetica-Bold encoding=unicode fillcolor=red " +
"boxsize={595 842} stamp=ll2ur");
p.end_template_ext(0, 0);
222
第 8 章 : テキス ト と 表の組版
8.2 複数行のテキス ト フ ロ ー
1 行のテ キ ス ト をページ上に配置す る 機能だけでな く 、 PDFlib は、 任意の長 さ のテ キ ス ト
を配置で き る テ キ ス ト フ ロ ー と い う 機能に も 対応 し てい ます。 テ キ ス ト は何行に も 、 何段
に も 、 あ る いは何ページに も わた る こ と がで き 、 ま たその見ばえは さ ま ざ ま なオプシ ョ ン
で制御す る こ と がで き ます。 フ ォ ン ト ・ サ イ ズ ・ 色 と いっ た文字属性を、 テ キ ス ト の ど の
部分にで も 適用す る こ と がで き ます。 テ キ ス ト の両端揃え ・ 片端揃えや、 段落の イ ンデン
ト や、 タ ブ位置 と い っ たテ キ ス ト フ ロ ー属性を指定で き ます。 テ キ ス ト の中に ソ フ ト ハ イ
フ ンで示 し た改行機会が考慮 さ れます。 図 8.13 ・ 図 8.14 は、 請求書の さ ま ざ ま な部分が
ページ上にテ キ ス ト フ ロ ー機能を用いて配置で き てい る さ ま を例示 し た も のです。 こ う し
た出力を制御す る ためのオプシ ョ ンについて、 以下の項で詳 し く 説明 し ます。
図 8.13
テキス ト フ ロー
の組版
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 複数行のテキス ト フ ロー
223
複数行のテ キ ス ト フ ロ ーは、 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.
224
3.
C one H ea d R oc ke t
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.14
テキス ト フ ロー
の組版
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.15 参照)。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの 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 複数行のテキス ト フ ロー
225
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
226
はめ込み枠 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.15
テキス ト フ ローを
2 つのはめ込み枠
に配置
leftindent = 15
parindent = 20
leading = 140%
図 8.16
オプ シ ョ ン を用いて
テキス ト フ ローを配置
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.16 参照):
String
optlist =
"leftindent=15 rightindent=10 parindent=20 alignment=justify " +
"leading=140% fontname=Helvetica fontsize=8 encoding=unicode";
8.2.3 イ ン ラ イ ン オ プ シ ョ ン リ ス ト と マ ク ロ
図 8.16 のテ キ ス ト は ま だ完璧ではあ り ません。 見出 し 「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 複数行のテキス ト フ ロー
227
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 オプシ ョ ン を用いて記号グ リ フ の数を指定 し ます。 なお、
文字参照 (&lt; 等) を回避策 と し て用い る こ と はで き ません。
マ ク ロ 上記のテ キ ス ト はい く つかの種類の段落でで き てい ます。すなわち見出 し と 本文
であ り 、 本文には さ ら に イ ンデン ト のあ る も の と ない も の と があ り ます。 こ う し た各種の
段落を それぞれの形に組版 し てい く わけですが、 し か し テ キ ス ト フ ロ ーが も っ と 長ければ
同 じ 指定を何度 も し な ければな り ま せん。 段落替えのたびに、 照応す る イ ン ラ イ ン オプ
シ ョ ン群を書かな く て済む よ う にす る には、 イ ン ラ イ ンオプシ ョ ン群を マ ク ロ に ま と めれ
ば、 テ キ ス ト 内か ら そのマ ク ロ を名前で参照す る こ と がで き ます。 図 8.17 に示す よ う な 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.17
イ ン ラ イ ン オプ シ ョ
ン と マ ク ロの併用
228
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 複数行のテキス ト フ ロー
229
hortabmethod ruler
tabalignment left
ruler 30
図 8.18
テキス ト を
表 と し て配置
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.18 に示 し ます) :
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_text ト ピ ッ ク にあ り ま
す。
注 複雑な表を作成するには PDFlib の表機能を推奨 し ます (244 ページ 「8.3 表の組版」 参照)。
8.2.5 番号付き リ ス ト と 段落間隔
イ ン ラ イ ンオプシ ョ ンleftindentを用いて番号付 き リ ス ト を組む方法を以下に示 し ます(図
8.19 参照) :
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.
230
第 8 章 : テキス ト と 表の組版
leftindent = &indent
parindent = – &indent 1.
2.
図 8.20
マ ク ロによ る
番号付き リ ス ト
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.20 に 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.19
番号付き リ ス ト
8.2 複数行のテキス ト フ ロー
231
落の最終行のベース ラ イ ン と 、 空行のベース ラ イ ン と の間隔です。 以下の例は、 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}}
232
第 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 複数行のテキス ト フ ロー
233
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.21
上 : 無駄な改行のある テキス ト
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.21 に、 処置前のテ キ ス ト のテ キ ス ト フ ロ ー出力 と 、 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)、 文字実体を用い る こ と がで き ます : &shy;
グ リ フ 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
234
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.22
テキス ト 両端揃えで ソ フ ト ハイ フ ン あ り 。
デ フ ォル ト 設定 と 広いはめ込み枠を使用。
図 8.23
テキス ト 両端揃えで ソ フ ト ハイ フ ン な し 。
デ フ ォ ル ト 設定 と 広いはめ込み枠を使用。
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.22 に、テ キ ス ト 両端揃えのデフ ォ ル ト 設定で生成 さ れたテ キ ス ト 出力を示 し ます。完
璧な見ばえ と な っ てい ま す。 なぜな ら 条件が最適だか ら です : はめ込み枠枠が充分広 く
て、 し か も 、 明示的なハ イ フ ネーシ ョ ン機会を ソ フ ト ハ イ フ ン キ ャ ラ ク タ で指定 し て あ る
か ら です。 図 8.23 を見 る と 、 明示的 ソ フ ト ハ イ フ ンがない場合で も 出力はおおむね良好
です。 オプシ ョ ン リ ス ト はど ち ら の場合 も 以下の よ う にな り ます :
fontname=Helvetica fontsize=9 encoding=winansi alignment=justify
8.2.8 ウ ィ ド ー行 ・ オー フ ァ ン行
1 つの段落の先頭の 1 行 (ない し 複数行) だけが段ま たはページの下端に現れ る と き 、 こ
れを オーフ ァ ン と いい ます。 同様に、 1 つの段落の末尾の 1 行 (ない し 複数行) が次の段
ま たはページの先頭に現れ る と き 、 こ れを ウ ィ ド ー と いい ます。 高品質な文字組版におい
て、 孤立 し たオーフ ァ ン行ま たは ウ ィ ド ー行は望ま し く ない と 考え ら れてい ます。
オー フ ァ ン制御 テ キ ス ト フ ロ ーオプシ ョ ン minlinecount は、 はめ込み枠の末尾段落の
最少行数を指定 し ます。 行がそれ よ り も 少ない場合には、 それ ら は次のはめ込み枠の中に
配置 さ れます。値 minlinecount=2 を用い る と 、 はめ込み枠の末尾の段落の 1 行のオーフ ァ
ン行を避け る こ と がで き ます。
ウ ィ ド ー制御 PDFlib は、将来のテ キ ス ト フ ロ ー配置について何 も 知 り ませんので、 ウ ィ
ド ー行を直接制御す る こ と はで き ません。 し か し 、 ク ラ イ ア ン ト コ ー ド 内に以下の仕組み
で ウ ィ ド ー制御を実装す る こ と は可能です :
> テ キ ス ト フ ロ ーの先頭部分 を、 先頭はめ込み枠内へブ ラ イ ン ド モー ド (オプ シ ョ ン
blind=true) で、 すなわち実際の出力を生成せずにはめ込みます。
> テ キ ス ト フ ロ ーの次の部分を、2 番目のはめ込み枠内へブ ラ イ ン ド モー ド ではめ込みま
す。 PDF_info_textflow( ) を キーワ ー ド firstparalinecount と と も に呼び出す こ と に よ っ
て、 こ の 2 番目のはめ込み枠の先頭段落の行数を ク エ リ し ます。 も し こ の結果が 1 な
ら ば、 1 行 ウ ィ ド ーを見つけた こ と にな り ます。
> そ う であれば、先頭はめ込み枠へ rewind オプシ ョ ン を用いて戻 る こ と がで き ますので、
アルゴ リ ズ ム で、 ウ ィ ド ー行を避け る ためにはめ込みオプシ ョ ン群を調整す る 必要が
8.2 複数行のテキス ト フ ロー
235
あ り ます。 た と えば こ れは、 先頭はめ込み枠内の行数を maxlines オプシ ョ ン を用いて
減 ら す こ と に よ っ て実現で き ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の text_output/widows_and_orphans ト ピ ッ ク にあ り
ます。
8.2.9 標準改行アルゴ リ ズムの制御
PDFlib は洗練 さ れた改行アルゴ リ ズ ム を実装 し てい ます。改行アルゴ リ ズ ム を制御す る テ
キ ス ト フ ロ ーオプシ ョ ン を表 8.2 に挙げます
改行規則 1 つの単語、 ない し 両端を スペース キ ャ ラ ク タ で挟ま れた一連のテ キ ス ト が、
1 つの行に収ま り き ら ない場合、 次の行へ送 る 必要が出て き ます。 こ の よ う な状況で改行
アルゴ リ ズ ムは、 ど のキ ャ ラ ク タ の後で改行が可能か を決定 し ます。
た と えば、 -12+235/8*45 の よ う な数式は絶対に途中で改行 さ れませんが、 一方、 文字列
PDF-345+LIBRARY はマ イ ナ ス の所で次行に送 ら れ る 可能性があ り ます。 テ キ ス ト が ソ フ ト
ハ イ フ ン キ ャ ラ ク タ を含んでいればその う ちのいずれかの後で改行 さ れ る 可能性 も あ り
ます。
括弧 と 引用符については、 開 く 所 と 閉 じ る 所 と で規則が異な り ます : 括弧や引用符が
開 く 所では改行機会は一切与え ら れません。 引用符については、 どれが開いて どれが閉 じ
てい る のかを判定す る 手段 と し て、 引用符のペア を数え てい く 仕組みにな っ てい ます。
表 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。
236
第 8 章 : テキス ト と 表の組版
表 8.2 改行アルゴ リ ズムを制御する ためのオプ シ ョ ン
オプ シ ョ ン
説明
charclass
(ペアの リ ス ト 。 こ こ でペアの 1 番目の要素はキーワー ド であ り 、 2 番目の要素は Unichar または
Unichar の リ ス ト ) 指定 さ れた Unichar が、 指定 さ れたキーワー ド によ っ て分類 さ れる こ と に よ り 、
そのキ ャ ラ ク タ (群) の改行時動作を決定 し ます :
letter
文字 (a B 等) と 同様に動作
punct
句読点文字 (+ / ; : 等) と 同様に動作
open
開きかっ こ ([ 等) と 同様に動作
close
閉 じ かっ こ (] 等) と 同様に動作
default
すべてのキ ャ ラ ク タ 分類を PDFlib 内蔵のデ フ ォル ト に リ セ ッ ト
例 : charclass={ close » open « letter {/ : =} punct & }
hyphenchar
(Unichar またはキーワー ド ) 改行箇所で ソ フ ト ハイ フ ンに置き換わるべきキ ャ ラ ク タ の Unicode
値。 デ フ ォル ト : U+00AD (SOFT HYPHEN)、 ただ し それがフ ォ ン ト 内になければ U+002D
(HYPHEN-MINUS)。
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/
iso15924-codes.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。
イ ン ラ イ ン オプシ ョ ン リ ス ト は通常は改行機会を生み出 し ません。 それは単語内での
オプシ ョ ン変更を可能にす る ためです。 ただ し 、 オプシ ョ ン リ ス ト が スペース キ ャ ラ ク タ
で挟まれてい る 場合はオプシ ョ ン リ ス ト の開始位置に改行機会があ り ます。 も し そのオプ
シ ョ ン リ ス ト で改行が起 き て し か も alignment=justify の場合、オプシ ョ ン リ ス ト の前にあ
る スペース群は破棄 さ れます。 オプシ ョ ン リ ス ト の後の スペース群は保持 さ れ、 次行先頭
に表れます。
8.2 複数行のテキス ト フ ロー
237
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.24 狭いはめ込み枠で テキス ト 両端揃え。 デ フ ォ ル ト 設定を用いています
単語間ツ メ (minspacing オプ シ ョ ン)
行に長体 (shrink 方式 ・ shrinklimit オプ シ ョ ン)
強制ハイ フ ネーシ ョ ン (split 方式)
単語間アケ (spread 方式 ・ maxspacing オプ シ ョ ン)
改行を防止 charclass オプシ ョ ン を使 う と 、 テ キ ス ト フ ロ ーが特定のキ ャ ラ ク タ の後で
改行 さ れ る のを防止す る こ と がで き ます。 た と えば、 以下のオプシ ョ ンはキ ャ ラ ク タ / の
直後での改行を防止 し ます :
charclass={letter /}
ひ と つなが り のテ キ ス ト が複数行に泣 き 別れて し ま う の を防ぐ には、それを avoidbreak ~
noavoidbreak で く く る と い う 方法があ り ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の text_output/avoid_linebreaking ト ピ ッ ク にあ り
ます。
日中韓テキス ト の組版 テ キ ス ト フ ロ ーエ ン ジ ン は、 日中韓テ キ ス ト を扱え る よ う に作
ら れてい る ので、 Unicode 標準の通 り 、 日中韓キ ャ ラ ク タ を表意文字 と し て適切に取 り 扱
い ます。 その結果、 日中韓テ キ ス ト はけ っ し てハ イ フ ネーシ ョ ン さ れません。 組版の品質
を高め る ため、 日中韓テ キ ス ト でテ キ ス ト フ ロ ーを使 う と き は、 以下の組版オプシ ョ ン を
推奨 し ます。 こ う す る と 、 欧文テ キ ス ト が混在 し ていて も そ こ でハ イ フ ネーシ ョ ンが行わ
れな く な り 、 ま た、 均等に間隔を あ けたテ キ ス ト 出力が作成 さ れます :
hyphenchar=none
alignment=justify
shrinklimit=100%
spreadlimit=100%
縦書き はテ キ ス ト フ ロ ーでは対応 し てい ません。
狭いはめ込み枠で テキス ト 両端揃え はめ込み枠が狭ければ狭いほ ど、 両端揃えのテ キ
ス ト を制御す る ためのオプシ ョ ンが重要にな っ てい き ます。 図 8.24 は、 狭いはめ込み枠
でテ キ ス ト が さ ま ざ ま な方式で両端揃え さ れた出力結果を例示 し てい ます。 図 8.24 のオ
プシ ョ ン設定は基本的におおむね良好ですが、 ただ、 maxspacing がやや広すぎ る 単語間
隔を与え てい る のが気にな り ます。 と はいえ、 狭いはめ込み枠に対 し ては こ れは こ の ま ま
に し てお く こ と を推奨 し ます。 でない と 、 split 方式に よ る 見苦 し い強制ハ イ フ ネーシ ョ ン
の発生頻度が高ま る で し ょ う 。
はめ込み枠が狭すぎ る ために不適切な箇所が強制ハ イ フ ネーシ ョ ン さ れて し ま う 場合
は、 対処を考慮 し て、 ソ フ ト ハ イ フ ン を入れ る な り 、 テ キ ス ト 両端揃え を制御す る オプ
シ ョ ン を変え る な り する 必要があ る で し ょ う 。
238
第 8 章 : テキス ト と 表の組版
テキス ト 両端揃え で shrinklimit オ プ シ ョ ン 見 た 目に も っ と も 受け入れやすい解決策
は shrinklimit オプシ ョ ン を小 さ く す る こ と で し ょ う 。 こ のオプシ ョ ンは、 shrink 方式でか
か る 長体の割合の下限を指定す る も のです。 図 8.25a は、 テ キ ス ト に shrinklimit=50% ま
で長体をかけ る こ と で強制ハ イ フ ネーシ ョ ン を防いでい る 様子を示 し てい ます。
テキス ト 両端揃え で spreadlimit オ プ シ ョ ン 字間 を 拡げ る こ と で改行 を 制御す る の も
一つの方法です。 こ れは spread 方式で行われ、 spreadlimit オプシ ョ ンで制御 さ れます。 し
か し こ の方式は美 し く ないのでめっ たに使われないで し ょ う 。 図 8.25b は、 spreadlimit=5
を使っ て、 字間の最大を非常に広 く 5 単位 と し た例です。
図 8.25 狭いはめ込み枠内の両端揃え テキス ト のためのオプ シ ョ ン
生成 さ れる出力
PDF_fit_textline( ) に与え るオプ シ ョ ン リ ス ト
a)
passing the time. We
offer revolutionary
brand new developments
of the traditional
common paper planes.
If your lesson, conference,
or lecture turn out to
alignment=justify shrinklimit=50%
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.25c は、 行
の最小幅 50% を指定 し た場合の出力結果を示 し てい ます。
8.2.10 高度な用字系固有の改行
PDFlib は、 標準の改行アルゴ リ ズ ム に加え て、 追加の改行アルゴ リ ズ ム を実装 し てい ま
す。 こ の高度な改行アルゴ リ ズ ムは、 い く つかの用字系では必須であ り 、 ま た、 必須でな
いその他の用字系 / ロ ケールの組み合わせのなかに も 、 こ れに よ り 改行動作が改善 さ れ る
も のがあ り ます。 こ れは advancedlinebreak オプシ ョ ン で有効にす る こ と がで き ます。 改
行はテ キ ス ト の言語に依存 し ますので、 高度な改行アルゴ リ ズ ムは script オプシ ョ ン (表
6.2 参照) と locale オプシ ョ ン (PDFlib リ フ ァ レ ン ス参照) に従い ます。 高度な改行は、
以下の状況において正 し い改行機会を決定 し ます :
> タ イ 文字等、 テ キ ス ト 内の空白キ ャ ラ ク タ の存在に改行が依拠 し ない用字系に対 し て。
以下のテ キ ス ト フ ロ ーオプシ ョ ンは、 タ イ 文字に対 し て高度な改行を有効に し ます :
<advancedlinebreak script=thai locale=tha>
8.2 複数行のテキス ト フ ロー
239
> 仏文テ キ ス ト 内で引用符 と し て用い ら れ る «» ギユ メ キ ャ ラ ク タ 等、 あ る 特定の句読点
キ ャ ラ ク タ の特別な扱いを必要 と す る 用字系 / ロ ケールの組み合わせにおいて。 下記
のテ キ ス ト フ ロ ーオプシ ョ ンは、仏文テ キ ス ト に対 し て高度な改行を有効に し ます。そ
の結果、 単語を囲 う ギユ メ キ ャ ラ ク タ が行末で単語 と 泣 き 別れ し な く な り ます :
<advancedlinebreak script=latn locale=fr>
locale テ キ ス ト フ ロ ーオプシ ョ ンは language テ キ ス ト オプシ ョ ン (表 6.3 参照) と 違 う こ
と に留意 し て く だ さ い : locale オプシ ョ ンは同 じ 3 文字の言語識別子で始ま る こ と がで き
ますが、1 個ない し 2 個の追加部分を任意に含む こ と も で き ます。ただ し 、こ れ ら が PDFlib
で必要にな る こ と は まれです。
8.2.11 テキス ト をパス ・ 画像に回 り 込ませる
回 り 込み機能を利用す る と 、 任意の形状にテ キ ス ト を入れた り 、 テ キ ス ト をパ ス に回 り 込
ませ る こ と がで き ます。 範囲枠、 明示的な長方形 / 多角形 / 円 / 曲線、 パ ス オブジ ェ ク ト
のいずれか を用いて、 テ キ ス ト フ ロ ーに対す る 回 り 込み領域を指定す る こ と がで き ます。
画像が ク リ ッ ピ ン グパ ス を内蔵 し てい る 場合には、テ キ ス ト を その画像の ク リ ッ ピ ン グパ
ス に自動的に回 り 込ませ る こ と も 可能です。
範囲枠を持つ画像に テキス ト を回 り 込ませる 最初の作成例 と し て、 テ キ ス ト フ ロ ーの
中に画像を配置 し て、 テ キ ス ト を その画像全体の ま わ り に回 り 込ませてみま し ょ う 。 まず
画像を読み込み、 枠内の希望の位置に配置 し ま す。 こ の画像を後で名前で参照す る ため
に、 オプシ ョ ン リ ス ト 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.26 参照) :
result = p.fit_textflow(textflow, left_x, left_y, right_x, right_y,
"wrap={usematchboxes={{img}}}");
テ キ ス ト を配置す る 前に、同 じ 範囲枠名を使っ て さ ら にほかの画像をはめ込んでい く こ と
も で き ます。 その場合、 テ キ ス ト はすべての画像を回 り 込みます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の text_output/wrap_text_around_images ト ピ ッ ク に
あ り ます。
図 8.26
範囲枠を持つ画像にテキス ト を回 り 込ませる
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.
240
第 8 章 : テキス ト と 表の組版
図 8.27
三角形の輪郭にテキス ト を回 り 込ませる
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.
任意のパスに テキス ト を回 り 込ませる パ ス オブジ ェ ク ト を作成 し て (77 ページ 「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);
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( ) でページ上に
8.2 複数行のテキス ト フ ロー
241
配置す る 必要があ り ます。テ キ ス ト を回 り 込ませ る のに適切なパ ス オブジ ェ ク ト を作成す
る ために、 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);
PDF_fit_textflow( ) を複数回呼び出 し て同一の wrap オプシ ョ ン を与え る こ と も で き ます。
こ れは多段組等、配置 さ れた画像が複数のテ キ ス ト フ ロ ーはめ込み枠に重な っ てい る と き
に有用です。
非長方形形状に テキス ト を回 り 込ませる パ ス オブジ ェ ク ト を回 り こ み輪郭 と し て作成
す る のではな く 、 パ ス要素群を直接 Textflow オプシ ョ ン群で指定す る こ と も で き ます。
テ キ ス ト は、範囲枠で指定 さ れ る 長方形を回 り 込ませ る だけでな く 、任意のグ ラ フ ィ ッ
ク 要素を回 り 込み輪郭 と し て定義す る こ と も で き ます。た と えば以下のオプシ ョ ン リ ス ト
は、 三角形の ま わ り にテ キ ス ト を回 り 込ませます (図 8.27 参照) :
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 個ない し 複数の輪郭の中にテ キ ス ト が配置 さ れます。 以下のオプシ ョ ン
242
第 8 章 : テキス ト と 表の組版
図 8.29
重な り 合 う 輪郭へ流 し 込む
50% 100%
図 8.28
ひ し 形へテキス ト
を流 し 込む
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%
リ ス ト を使えば、 ひ し 形の中へテ キ ス ト を流 し 込む¥ こ と がで き ます。 こ こ で座標は、 は
め込み枠の長方形に対す る パーセ ン ト 値 と し て与え てい ます (図 8.28 参照) :
wrap={ addfitbox polygons={ {50% 100%
10% 50%
50% 0%
90% 50%
50% 100%} } }
なお、 こ こ で も showborder=true オ プ シ ョ ン を 使 っ て輪郭 を 図示 し て あ り ま す。 も し
addfitbox オプシ ョ ン をつけなければ、 ひ し 形は空の ま ま、 その ま わ り にテ キ ス ト が回 り
込む こ と にな り ます。
重な り 合 う 輪郭へ流 し 込む 次の例 と し て、 重な り 合 う 2 つの多角形か ら 成 る 輪郭へ流
し 込みを行な っ てみま し ょ う 。 た と えば六角形の中に四角形が入っ た輪郭です。 addfitbox
オプシ ョ ン を使えば、 はめ込み枠自体は流 し 込みの範囲か ら 除外 さ れ、 その後の リ ス ト の
中の多角形は、 重な り 合っ てい る 領域を除いて流 し 込みが行われます (図 8.29 参照) :
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 複数行のテキス ト フ ロー
243
8.3 表の組版
表組版機能を使 う と 、 複雑な表を自動組版す る こ と がで き ます。 表のセルには、 一行か複
数行のテ キ ス ト か、 画像か、 SVG グ ラ フ ィ ッ ク か、 PDF ページ を入れ る こ と がで き ます。
表は 1 個のはめ込み枠に収ま ら な く て も よ く 、 複数のページにわた る こ と が可能です。
ク ッ ク ブ ッ ク 表の諸側面に関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ ク の tables カ テ ゴ リ にあ り ます。
表の一般的特徴 表組版機能の説明は、以下の概念 と 用語に も と づき ます(図 8.30 参照):
> 表は、 長方形の輪郭を持つ仮想のオブジ ェ ク ト です。 横方向の表行 と 縦方向の列でで
き てい ます。
> 単純セルは、 表内の長方形の領域であ り 、 表行 と 列の交差 と し て定義 さ れ ます。 連結
セルは、 複数の列か複数の表行、 ない し 両方にわた っ てい ます。 セル と い う 用語を用
い る と き は、 単純セル と 連結セルの両方を指す も の と し ます。
> 表は、1 つのはめ込み枠に収ま り き る こ と も あ り ます し 、複数のはめ込み枠が必要にな
る こ と も あ り ます。1 つのはめ込み枠に配置 さ れた表行群は、表イ ン ス タ ン ス を構成 し
ます。 PDF_fit_table( ) は、 1 回呼び出 さ れ る ご と に、 1 つのはめ込み枠に 1 つの表 イ ン
ス タ ン ス を配置 し ます (254 ページ 「8.3.5 表 イ ン ス タ ン ス」 参照)。
> ヘ ッ ダ と フ ッ タ は、表の最初か最後にあ る 1 個ない し 複数の表行のかた ま り であ り 、す
べての表 イ ン ス タ ン ス の上端か下端に繰 り 返 し 現れ ます。 ヘ ッ ダに も フ ッ タ に も 属 さ
ない表行は本体表行 と 呼びます。
> オプシ ョ ナルな キ ャ プシ ョ ン (図 8.30 では示 さ れてい ません) は、 表の説明を配置す
る ために使え る 追加の要素です。 こ れは表の任意の辺に配置す る こ と がで き ます。
ヘッダ
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.30
表の例
例 と し て、 図 8.30 の表を作成す る すべての側面を説明 し てい き ます。 表組版オプシ ョ ン
の完全な説明については PDFlib リ フ ァ レ ン ス を参照 し て く だ さ い。表の作成は まず、各表
セルの内容 と 視覚的プ ロ パテ ィ を PDF_add_table_cell( ) で定義 し てい く こ と か ら 始ま り ま
す。 それか ら 、 PDF_fit_table( ) を 1 回ない し 複数回呼び出 し て、 その表を配置 し ます。
244
第 8 章 : テキス ト と 表の組版
表を配置す る 際には、 そのはめ込み枠の大 き さ と 、 その表行や列の罫線 と 塗 り 分け を
指定す る こ と も で き ます。 セルご と の塗 り 分けな ど の細かい指定には、 範囲枠機能を使っ
て く だ さ い (詳 し く は 261 ページ 「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 表の組版
245
以下の コ ー ド 断片は、 こ の単純な表を作成す る 方法を示 し ます。 結果を図 8.31a に示 し ま
す。
/* 複数行のテキストフローで表セルに入れるテキスト */
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);
246
第 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.31a において、
4 つのテ キ ス ト 行セルは以下のオプシ ョ ン リ ス ト で配置 さ れてい ます :
optlist = "fittextline={position={left center} font=" + font +
" fontsize=8} colwidth=80 margin=4";
テ キ ス ト フ ロ ーセルは特殊なオプシ ョ ン を一切使わずに追加 さ れてい ます。テ キ ス ト 行を
縦方向中央に配置 し たために、 Benefit の行がテ キ ス ト フ ロ ーの分だけ下へずれます。
図 8.31 テキス ト 行 と テキス ト フ ローを表セル内で整列 さ せる
生成 さ れる出力
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.31b に示 し た よ う に、 セルの辺か ら セルの中身 ま での縦間隔は、 それがテ キ ス ト フ
ロ ーであ る かテ キ ス ト 行であ る かにかかわ ら ず、 すべて同 じ に し たい も のです。 こ れを実
現す る ために、 まずテ キ ス ト 行のためのオプシ ョ ン リ ス ト を用意 し ま し ょ う 。 表行の高 さ
を固定値 14 ポ イ ン ト 、テ キ ス ト 行の位置を左上で余白 4 ポ イ ン ト と し て定義 し ま し ょ う 。
さ き に与えたオプシ ョ ン fontsize=8 は、 文字の高 さ を正確には表 し てお ら ず、 上下に
い く ら かあ き がで き てい ます。 で も 、 大文字の高 さ はフ ォ ン ト の capheight 値で正確に表
さ れます。 ですので、 fontsize={capheight=6} を用いれば、 文字サ イ ズが結果的にほぼ 8 ポ
イ ン ト にな り 、 ま た (margin=4 と あわせて) 高 さ の合計が 14 ポ イ ン ト と な っ て rowheight
オプ シ ョ ン と 照応 し ま す。 ですので全体 と し ては、 テ キ ス ト 行セルに対す る PDF_add_
table_cell( ) のオプシ ョ ン リ ス ト は次の よ う に し ま し ょ う :
8.3 表の組版
247
/* テキスト行セルに用いるオプションリスト */
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.32 に示す要素があ り ます。
࠹ࠠࠬ࠻ⴕ
࠹ࠠࠬ࠻ⴕ
࠹ࠠࠬ࠻ⴕ
࠹ࠠࠬ࠻ⴕ
࠹ࠠࠬ࠻ⴕ
࠹ࠠࠬ࠻ࡈࡠ࡯ ....................
..............................................
..............................................
࠹ࠠࠬ࠻ⴕ
図 8.32
表セルの さ ま ざ ま
な内容
テキス ト 行に よ る一行テキス ト テ キ ス ト は、 PDF_add_table_cell( ) の text 引数で与え ま
す。 fittextline オプシ ョ ンで、 PDF_fit_textline( ) の組版オプシ ョ ンのすべて を与え る こ と
がで き ます。 デフ ォ ル ト のはめ込み方式は fitmethod=nofit です。 テ キ ス ト がセルに収ま
り き ら ない と き は、 セルが大 き く な り ま す。 こ れを避け る には、 fitmethod=auto を使え
ば、 shrinklimit オプシ ョ ン の範囲内でテ キ ス ト が縮 ま り ま す。 表行の高 さ が指定 さ れな
かっ た場合は、 組版機能はテ キ ス ト サ イ ズの 2 倍を表セルの高 さ と し ます ( よ り 正確にい
う と : boxheight の 2 倍。 こ れは、 別途指定 さ れない限 り デフ ォ ル ト 値 {capheight none}
を持ち ます)。 テ キ ス ト が回転 さ せて あ る と き の表行の幅について も 同 じ です。
248
第 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 表の組版
249
フ ォ ーム フ ィ ール ド 表セル内の フ ォ ーム フ ィ ール ド は、 PDF_create_field( ) の name ・
type 引数 (ただ し こ の関数を呼び出す必要はあ り ません) に照応す る PDF_add_table_cell( )
の fieldname ・ fieldtype オプシ ョ ンで作成す る こ と がで き ます。 fitfield オプシ ョ ンでは、
PDF_create_field( ) のすべてのオプシ ョ ン を指定可能です。セル枠が フ ィ ール ド 長方形 と し
て用い ら れます。
セル内枠内で セル内容を位置付け デ フ ォ ル ト では、 セル内容はセル枠に合わせて位置
付け ら れます。 PDF_add_table_cell( ) で margin オプシ ョ ン を使えば、 セルの端 と の間に間
隔を指定す る こ と がで き ます。 その結果で き る 長方形を、 セル内枠 と 呼びます。 余白が 1
つで も 定義 さ れていれば、 セル内容はセル内枠に合わせて配置 さ れます (図 8.33 参照)。
余白が 1 つ も 定義 さ れていない と き は、 セル内枠はセル枠 と 同 じ です。
こ れ と あわせて、 セルの内容は、 内容依存のはめ込みオプシ ョ ン で与え たオプシ ョ ン
に も 従 う こ と があ り ます。 251 ページ 「8.3.4 さ ま ざ ま な種類の内容を持っ た表」 で説明 し
ます。
਄૛⊕
࠮࡞ౝᨒ
Ꮐ૛⊕
ฝ૛⊕
図 8.33
内容を セル内枠に
はめ込み
࠮࡞ᨒ
ਅ૛⊕
8.3.3 表 と 列の幅
セルを表に追加す る 際には、 そのセルが ま たが る 列か表行、 ま たは両方の数を、 colspan ・
rowspan オプシ ョ ン で定義 し ます。 デフ ォ ル ト ではセルの列は 1 つ、 表行 も 1 つです。 表
の列 と 表行の総数は、 セルを追加す る ご と に、 それぞれの値だけ自動的に加算 さ れ ます。
図 8.34 に、 3 列 ・ 4 表行の表の例を示 し ます。
1
1
1
2
1
3
1
4
㧟ߟߩ ............ ೉ߦ ............ ࠊߚࠆ ............ ࠮࡞
ⴕ1
㧞ߟߩ ...... ೉ߦ ...... ࠊߚࠆ ...... ࠮࡞
ⴕ2
ⴕ3
ⴕ4
250
3 2
න⚐࠮࡞
2 3
㧟ߟߩ ....
න⚐࠮࡞
.... ⴕߦ ....
න⚐࠮࡞
න⚐࠮࡞
.... ࠊߚࠆ࠮࡞
೉1
೉2
2 4
第 8 章 : テキス ト と 表の組版
೉3
図 8.34
単純セル と 、 複数の表行や
列を連結 し たセル
さ ら に、 colwidth オプシ ョ ン を使っ て、 セルが ま たが る 最初の列の幅を明示的に与え る こ
と も で き ます。 各セルご と に、 その最初の列の幅を決めて与え る と 、 それ ら の幅の値はす
べて、 表全体の幅に自動的に加算 さ れてい き ます。 図 8.35 に例を示 し ます。
1
1
1
2
1
3
1
4
colspan=3
colwidth=50
colspan=2
colwidth=50
colspan=1
colwidth=50
図 8.35
列幅を足 し 合わせる
と 表全体の幅に
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.36 参照)。
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.36
1 番目の表行の右 4 セルは、 同 じ 列伸縮
グループに属 し ているので、 同 じ 幅にな
り ます。
絶対座標が使われてい る 場合 (パーセ ン ト 値でな く ) 、 列幅を定義 さ れていないセルがあ
る と き は、 その未決定の幅は以下の よ う に し て算定 さ れます : まず、 テ キ ス ト 行を含む各
セルについて、 列幅かテ キ ス ト の幅 (回転 さ れてい る テ キ ス ト の場合はテ キ ス ト の高 さ )
に も と づいて、 実際の幅が算出 さ れます。 それか ら 、 残 り の表幅が、 ま だ決定 し ていない
列幅に均等に分配 さ れます。
8.3.4 さ ま ざ ま な種類の内容を持 っ た表
以下のい く つかの項では、 図 8.37 に示す よ う な、 さ ま ざ ま な種類の内容を持っ た表の例
を、 一歩ずつ作成 し てい き ま し ょ う 。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの tables/mixed_table_contents ト ピ ッ ク にあ り ま
す。
前準備 と し て、 2 つの フ ォ ン ト を読み込む必要があ り ます。 表のはめ込み枠の大 き さ を、
その左下隅 と 右上隅の座標に よ っ て定義 し 、 3 つの表列の幅を指定 し ま し ょ う 。 そ し て、
新規ページ を A4 サ イ ズで開始 し ま し ょ う :
double llx = 100, lly = 500, urx = 360, ury = 600; // 表の座標
8.3 表の組版
251
int c1 = 50, c2 = 120, c3 = 90; // 3つの表列の幅
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 ポ イ ン ト と り ます。 247 ページ 「セルの内容の縦位置を調整」
で述べたの と 同様に、fontsize={capheight=6} を用いて、 テ キ ス ト の縦揃え を統一 し ま し ょ
う。
こ の見出 し 「Giant Wing」 のセルは、 行全体でな く 3 列中 2 列 し か連結 し ないので、 行
ベース の塗 り 分けオプシ ョ ンでは色がつけ ら れません。 かわ り に範囲枠機能を使っ て、 セ
ルが覆 う 長方形を灰色の背景色で塗 り ま し ょ う 。範囲枠機能について詳 し く は 261 ページ
「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.37 さ ま ざ ま な内容の表セルを一歩ずつ追加
生成 さ れる表
生成手順
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 ポ イ ン ト と り ます。
252
第 8 章 : テキス ト と 表の組版
optlist = "fittextline={position={left top} font=" + normalfont +
" fontsize={capheight=6}} rowheight=14 colwidth=" + c1 + " margin=4";
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, "");
8.3 表の組版
253
optlist = "fittextline={font=" + boldfont + " fontsize=9} pdipage=" + page +
" colwidth=" + c3 + " rrowspan=3 margin=4";
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 つの表 イ ン ス タ ン ス を配置 し ます。 こ れ ら のはめ込
み枠は、 同 じ ページに多段組レ イ ア ウ ト 等で配置 し てお く こ と も 、 ま たは複数のページに
配置 し てお く こ と も で き ます。
254
第 8 章 : テキス ト と 表の組版
図 8.38 の表は、 3 つのページにわた っ てい ます。 各ページに 1 つずつあ る はめ込み枠
に、 各表 イ ン ス タ ン ス が 1 つずつ配置 さ れます。 PDF_fit_table( ) を呼び出すたびに、 最初
の行はヘ ッ ダ と し て定義 さ れ、 最後の行はフ ッ タ と し て定義 さ れます。
図 8.38
表は複数の表イ ン ス タ
ン スに分解 さ れ、 各は
め込み枠に 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
Benefit Our Paper
With this Plane
paper rocket
you
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
以下の コ ー ド 断片は、 表を配置 し き る ま で表 イ ン ス タ ン ス をはめ込みつづけ る ための、 一
般的なループ を示 し ます。 配置す る べ き 表 イ ン ス タ ン ス があ る 限 り 、 そのつど新規ページ
を作成 し ます。
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 ("テキストフロー内でユーザーリターンを検出しました");
}
}
8.3 表の組版
255
/* 表内で使ったテキストフローハンドルも削除されます */
p.delete_table(tbl, "");
ヘ ッ ダ ・ フ ッ タ PDF_fit_table( ) で header ・ footer オプシ ョ ン を使えば、 表の最初か最後
の行の数を定義 し て、それが各表 イ ン ス タ ン ス の上端か下端に配置 さ れ る よ う にす る こ と
がで き ます。 fill オプシ ョ ンで area=header か area=footer を使 う と 、 ヘ ッ ダ ・ フ ッ タ を別
の色で塗 る こ と がで き ます。 ヘ ッ ダ行群は表定義の最初の n 行か ら 成 り 、 フ ッ タ 行群は最
後の m 行か ら 成っ てい ます。
ヘ ッ ダ と フ ッ タ は、 PDF_fit_table( ) で表 イ ン ス タ ン ス ご と に指定 し ます。 結果 と し て、
表 イ ン ス タ ン ス ご と に異な る も のに も な り え ます:ヘ ッ ダ / フ ッ タ をつけた表 イ ン ス タ ン
ス と 省いた表 イ ン ス タ ン ス を混在 さ せ る 、 と い っ た こ と も 可能です。 それに よ り た と え
ば、 最後の表 イ ン ス タ ン ス で特別な行を指定する 、 と い っ た こ と も 可能にな り ます。
表行の連動 い く つ か の 表 行 を 必 ず 同 じ 表 イ ン ス タ ン ス に 入 れ さ せ た い と き は、
rowjoingroup オプシ ョ ン を使っ て、それ ら を同 じ 表行連動グループに割 り 当て る こ と がで
き ます。 表行連動グループは、 連続す る 複数の表行を持ち ます。 こ のグループの表行はす
べて、 複数の表 イ ン ス タ ン ス に別れ さ せ ら れ る こ と がな く な り ます。
セルで複数表行を連結 し て も 、 それ ら の表行は自動的に連動グループにはな り ません。
はめ込み枠が低すぎ る はめ込み枠が低すぎ て、 必要なヘ ッ ダ ・ フ ッ タ 行 と 、 最低 1 つ
の本体表行ない し 行連動グループが入 ら ない と き は、 表がはめ込み枠に収ま る ま で、 行の
高 さ が一律に縮め ら れます。 ただ し 必要な縮小率が、 vertshrinklimit で設定 し た限界 よ り
も 小 さ い と き は、 縮小は行われずに、 PDF_fit_table( ) は文字列 _error、 ま たはそれぞれの
エ ラ ー メ ッ セージ を返 し ます。 縮小を一切 さ せた く ない と き は、 vertshrinklimit=100% を
使い ます。
はめ込み枠が狭すぎ る 表のはめ込み枠の座標は、PDF_fit_table( ) を呼び出す際に明示的
に与え ます。 与え た列幅を合計 し た実際の表幅が、 その表のはめ込み枠を超え た と き は、
表 が は め 込 み枠 に 収 ま る ま で すべ て の 列 が 縮 め ら れ ま す。 た だ し 必要 な 縮小 率 が、
horshrinklimit で設定 し た限界 よ り も 小 さ い と き は、 縮小は行われずに、 PDF_fit_table( ) は
文字列 _error、 ま たはそれぞれのエ ラ ー メ ッ セージ を返 し ます。 縮小を一切 さ せた く ない
と き は、 horshrinklimit=100% を使い ます。
セルを分割 セルが行を連結 し てい る 場合、後のほ う の行がはめ込み枠に収ま ら ない と き
は、 そのセルは分割 さ れます。 画像 ・ PDI ページ ・ SVG グ ラ フ ィ ッ ク ・ テ キ ス ト 行セルの
場合は、 セル内容は次の表 イ ン ス タ ン ス で も 繰 り 返 さ れます。 テ キ ス ト フ ロ ーセルの場合
は、 セル内容は後の表行のセルに続 き ます。
256
第 8 章 : テキス ト と 表の組版
図 8.39 に、 テ キ ス ト フ ロ ーセルが分割 さ れて テ キ ス ト フ ロ ーが次の表行に続いてい る
様子を示 し ます。 図 8.40 に、 画像セルが次の表 イ ン ス タ ン ス の最初の行で繰 り 返 さ れ る
様子を示 し ます。
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.39
セルの分割
表行を分割 表のはめ込み枠に最後の本体行が収ま り き ら ない と き 、それは普通は分割 さ
れません。 こ の動作は PDF_fit_table( ) の minrowheight オプシ ョ ン で制御 さ れ、 デフ ォ ル
ト 値は 100% です。 こ のデフ ォ ル ト 設定では、 表行は分割 さ れず、 ま る ご と 次の表 イ ン ス
タ ン スへ配置 さ れます。
minrowheight 値を減 ら せば、 最後の本体行を分割 さ せて、 表行の内容の う ち指定 し た
割合を 1 つ目の部分に、 残 り を次の部分に配置す る こ と がで き ます。
図 8.40 に、 テ キ ス ト フ ロ ー 「It's amazingly robust」 … が分割 さ れ、 次の表 イ ン ス タ ン
ス の最初の本体行へテ キ ス ト フ ロ ーが続 く 様子を示 し ます。複数行にわた る 画像セルが分
割 さ れ、 画像は繰 り 返 さ れます。 「Benefit」 セル も 繰 り 返 さ れます。
図 8.40
表行の分割
1 Giant Wing
⴫ࠗࡦࠬ
࠲ࡦࠬ1
⴫ࠗࡦࠬ
࠲ࡦࠬ2
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.3.6 表組版のアルゴ リ ズム
こ の項では、 表組版機能が表を配置す る 際に行 う ス テ ッ プ を詳説 し ます。 以下、 横書 き テ
キ ス ト の場合について述べます。 し か し 、 「表行高 さ 」 と 「列幅」 と い う 言葉を互いに入
れ替えれば、 縦書 き や回転テ キ ス ト に も あ ては ま り ます。
PDF_fit_table( ) へ の 最 初 の 呼 び 出 し の 際 に は、 オ プ シ ョ ン colwidth ・ rowheight ・
fittextline ・ fittextflow がすべてのセルについて吟味 さ れ、 表全体の幅 と 高 さ が、 列幅、 表
行高 さ 、 テ キ ス ト 行 ・ テ キ ス ト フ ロ ー内容、 先頭はめ込み枠の幅に基づいて算出 さ れ ま
す。 はめ込み枠の高 さ は無限 と 見な さ れます。 先頭表 イ ン ス タ ン ス (すなわち先頭はめ込
み枠内の表先頭部分の配置) は PDF_fit_table( ) の fitmethod オプシ ョ ンに従っ て算出 さ れ
ます。
先頭はめ込み枠 よ り も その後のはめ込み枠の幅が広い場合、 表セルはそのはめ込み枠
の幅を完全に満たす よ う 拡げ ら れは し ません。 こ の結果、 はめ込み枠が先頭はめ込み枠 よ
り も 広い表 イ ン ス タ ン ス はすべてデフ ォ ル ト で同一の幅を有 し ます。はめ込み枠を完全に
満たすには、 オプシ ョ ン fitmethod=auto を与え る 必要があ り ます。 fitmethod=meet を用
い る と 、 セルの高 さ が、 そのア スペ ク ト 比を保つ よ う 拡げ ら れます。
8.3 表の組版
257
先頭はめ込み枠 よ り も その後のはめ込み枠の幅が狭い場合、 表セルの幅は、 その狭い
はめ込み枠を満たす よ う 縮め ら れます。
テキス ト 行を持つ表セルの高 さ と 幅を算出 表組版機能は ま ず、 テ キ ス ト 行を持つ表セ
ルの う ち、 colwidth ま たは rowheight のない表列ま たは表行にわた る も のすべてのサ イ ズ
を決定 し ます。 こ れを実現す る ために、 fittextline オプシ ョ ンに従っ てテ キ ス ト 行の、 ひ
いては表セルの幅を算出 し ます。 テ キ ス ト サ イ ズの 2 倍を表セルの高 さ と 見な し ます ( よ
り 正確にい う と : 枠高 さ の 2 倍。 こ れは、 別途指定 さ れない限 り デフ ォ ル ト 値 {capheight
none} を持ち ます) 。 縦書 き テ キ ス ト については、 も っ と も 幅の広いキ ャ ラ ク タ の幅がセ
ル幅 と し て用い ら れます。 西向 き ま たは東向き のテ キ ス ト については、 テ キ ス ト 高 さ の 2
倍がセル幅 と し て用い ら れます。
こ の求め ら れた表セルの幅 と 高 さ が、 その後、 その表セルがわた る 表列 ま たは表行の
う ち、 colwidth ま たは rowheight が指定 さ れていない も のすべてに均等に按分 さ れます。
仮の表サ イ ズ を算出 次の ス テ ッ プ と し て組版機能は、 表の仮の幅 と 高 さ を、 それぞれ
列幅 ・ 表行高 さ すべての合計 と し て算出 し ます。 パーセ ン ト 値で指定 さ れてい る 列幅 と 表
行高 さ は、 先頭はめ込み枠の幅 と 高 さ に基づいて絶対値へ変換 さ れます。 colwidth ま たは
rowheight を持た ない列ま たは表行が ま だあ る 場合には、 仮の表サ イ ズが先頭はめ込み枠
に等 し く な る ま で、 残 り の余白が均等に按分 さ れます。
rowheightdefault オプシ ョ ン を用いて、 はめ込み枠の高 さ を完全に満たすか (キーワー
ド auto と distribute)、 それ と も 広 さ を節約する か (キーワー ド minimum) を指定す る こ
と も で き ま す。 rowheight オ プ シ ョ ン で 明 示 的 に 表 行 の 高 さ を 指 定 し た 場 合 に は、
rowheightdefault 設定はつねにオーバ ラ イ ド さ れます。
小 さ すぎ る セルを拡大 こ こ で組版機能はすべてのセル内枠を決定 し ます(図8.33参照)。
余白の合計がセルの幅ま たは高 さ よ り 小 さ い と き は、 そのセル枠は、 そのセルに属す る す
べての列 と 表行を均等に拡大す る こ と に よ っ て適切に拡大 さ れます。
テキス ト 行の横方向をはめ込む 組版機能は、 テ キ ス ト 行を持つすべてのセルの幅を拡
げて、 テ キ ス ト 行が文字サ イ ズ を下げな く て も セルにはめ込め る よ う に し ます。 こ れが可
能でない と き は、 テ キ ス ト 行は自動的に fitmethod=auto で配置 さ れます。 こ れに よ っ て、
テ キ ス ト 行がセル内枠か ら はみ出 さ な い こ と が保証 さ れ ま す。 fittextline オプ シ ョ ン で
fitmethod=auto に設定す る と 、 セル幅が拡が る のを防ぐ こ と がで き ます。
colscalegroup オプシ ョ ン を用い る と 、 同一の列伸縮グループに属す る すべての列が必
ず等 し い幅に伸縮 さ れ る よ う に、 すなわち こ れ ら の幅が統一 さ れて、 グループ内で最 も 広
い幅に合わせ ら れ る よ う にす る こ と がで き ます (図 8.36 参照)。
強制ハ イ フ ネーシ ョ ン を避け る 算出 さ れた表幅がはめ込み枠 よ り 小 さ い と き は、 組版
機能はテ キ ス ト フ ロ ーセルの幅を拡げて、テ キ ス ト が強制ハ イ フ ネーシ ョ ン な し にはめ込
め る よ う に し ます。 こ れはオプシ ョ ン checkwordsplitting=false で回避す る こ と も で き ま
す。 こ の よ う なセルの幅は、 表幅がはめ込み枠の幅に等 し く な る ま で拡げ ら れます。
PDF_info_table( ) の horboxgap キーを用いて、表幅 と はめ込み枠幅の差を ク エ リ で き ま
す。
テキス ト の縦方向をはめ込む 組版機能は、 すべてのテ キ ス ト 行 ・ テ キ ス ト フ ロ ーセル
の高 さ を拡げて、テ キ ス ト 行ま たはテ キ ス ト フ ロ ーが文字サ イ ズ を下げずにセル内枠には
め込め る よ う 試みます。 ただ し 、 テ キ ス ト 行ま たはテ キ ス ト フ ロ ーに対 し てサブオプシ ョ
258
第 8 章 : テキス ト と 表の組版
ン fitmethod=auto が設定 さ れてい る 場合、 ま たはテ キ ス ト フ ロ ーが continuetextflow オ
プシ ョ ンで他のセルに続いてい る 場合には、 セル高 さ は拡が り ません。
こ のセル高 さ を拡げ る 処理は、 テ キ ス ト 行 ま たはテ キ ス ト フ ロ ーを内容 と し て持つセ
ルに対 し てのみ適用 さ れ、 それ以外の種類のセル内容、 すなわち画像 ・ グ ラ フ ィ ッ ク ・ PDI
ページ ・ パ ス オブジ ェ ク ト ・ 注釈 ・ フ ィ ール ド に対 し ては適用 さ れません。
rowscalegroup オプシ ョ ン を用い る と 、 同一の表行伸縮グループに属す る すべての表行
が必ず等 し い高 さ に伸縮 さ れ る よ う にす る こ と がで き ます。
表を次のはめ込み枠へ続け る 算出 さ れた表全体の高 さ がはめ込み枠 よ り も 大 き い (す
なわち、 すべての表セルをはめ込み枠に収め る こ と がで き ない) と き は、 組版機能は、 そ
のはめ込み枠に収ま ら ない初めての表行に出会 う 前に、そのはめ込み枠内に表行を配置す
る こ と を止め ます。
1 つのセルが複数行にわた り 、 そのすべての行がはめ込み枠に収ま ら ない と き は、 こ の
セルは分割 さ れます。 セルが画像 ・ PDI ページ ・ SVG グ ラ フ ィ ッ ク ・ パ ス オブジ ェ ク ト ・
注釈 ・ フ ォーム フ ィ ール ド を内容 と し て持つ と き は、 repeatcontent=false が指定 さ れてい
ない限 り 、 そのセル内容は次のはめ込み枠内で繰 り 返 さ れ ま す。 し か し テ キ ス ト フ ロ ー
は、 セルがわた る 後続の表行に続 き ます (図 8.39 参照)。
rowjoingroup オプシ ョ ン を用い る と 、 1 つの表行連動グループに属す る すべての表行
が必ず 1 つのはめ込み枠内に現れ る よ う にす る こ と がで き ます。ヘ ッ ダ ま たはフ ッ タ に属
す る すべての表行 と 1 つの本体行は、 自動的に表行連動グループ を形成 し ます。 ですので
組版機能は、はめ込み枠に収ま ら ない初めての行に出会 う 前に表行を配置す る こ と を止め
ます (図 8.38 参照)。
return オプシ ョ ン を用い る と 、 対象行を配置 し た後にその表 イ ン ス タ ン ス内に絶対 も
う 表行が配置 さ れない よ う にす る こ と がで き ます。
表行を分割 表行は、 非常に高い と き 、 ま たは 1 個の本体行 し かない と き には、 分割 さ れ
る こ と があ り ます。 末尾の本体行が表のはめ込み枠に完全に収ま ら ない と き は、 それはま
る ご と 次のはめ込み枠へ移動 さ れます。 こ の動作は PDF_fit_table( ) の minrowheight オプ
シ ョ ン で制御す る こ と がで き ま す。 こ のオプ シ ョ ン のデフ ォ ル ト 値は 100% です。 こ の
minrowheight 値を小 さ く す る と 、 末尾本体行の内容の う ち指定 し た割合がカ レ ン ト はめ
込み枠に配置 さ れ、 その行の残 り は次のはめ込み枠に配置 さ れます (図 8.40 参照)。
PDF_info_table( ) の rowsplit キーワー ド を用い る と 、 表行が分割 さ れてい る か ど う か を
チ ェ ッ ク す る こ と がで き ます。
算出 さ れた表幅を調節 算出 さ れ る 表幅は、 テ キ ス ト 行の横方向をはめ込んだ後な ど、決
定ス テ ッ プのいずれかの後に、 はめ込み枠 よ り も 大き く な る こ と があ り ます。 こ の場合に
は、 表幅がはめ込み枠の幅に等 し く な る ま で、 すべての列幅が均等に縮め ら れます。 こ の
縮小処理は horshrinklimit オプシ ョ ンに よ っ て制限 さ れます。
PDF_info_table( ) の horshrinking キー ワー ド を用い る と 、 横縮小倍率を ク エ リ す る こ と
がで き ます。
horshrinklimit の閾値を超え る と 、 以下のエ ラ ー メ ッ セージが現れます :
Calculated table width $1 is too large (> $2, shrinking $3)
こ こ で $1 は算出 さ れた表幅を示 し 、 $2 は可能な最大の幅、 $3 は horshrinklimit 値です。
表のサ イ ズ を小 さ いはめ込み枠に合わせて調整 直前のはめ込み枠に対 し て算出 さ れた
表幅が、 カ レ ン ト はめ込み枠に対 し て大 き すぎ る と き は、 組版機能は、 表幅がカ レ ン ト は
8.3 表の組版
259
め込み枠の幅に等 し く な る ま ですべての列を縮め ま す。 ただ し セル内容は調整 さ れ ま せ
ん。 表幅を改めて計算 し なおすには、 PDF_fit_table( ) を rewind=1 をつけて呼び出 し ます。
260
第 8 章 : テキス ト と 表の組版
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.41a 参照)。
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.41b 参照)。
8.4 範囲枠
261
枠の高 さ を増や し て文字サ イ ズに一致 さ せたい と き は、 boxheight={fontsize descender}
が使え ます (図 8.41c 参照)。
次の ス テ ッ プ と し ては、 範囲枠の左 ・ 右 ・ 下へ変位を加え て拡げ、 枠のすべての端を
テ キ ス ト と 均等な間隔に し てみま し ょ う 。 さ ら に枠線幅を指定 し て、 範囲枠の ま わ り に長
方形を描き ま し ょ う (図 8.41d 参照)。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の text_output/text_on_color ト ピ ッ ク にあ り ます。
図 8.41 さ ま ざ ま なサブオプ シ ョ ンの範囲枠を使 っ て テキス ト 行を装飾
生成 さ れる出力
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.42 参照) :
図 8.42 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>";
262
第 8 章 : テキス ト と 表の組版
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.43 に示 し ます。
For information about
Giant Wing Paper
Planes see the Web
site of Kraxi Systems,
Inc.
図 8.43
テキス ト フ ローの一部分に
Web リ ン ク を追加
8.4.3 範囲枠 と 画像
画像に リ ン ク を追加 画像で覆われた領域に Web リ ン ク を追加す る には、 画像の範囲枠
が使え ます。 コ ー ド は先述の 262 ページ 「テ キ ス ト フ ロ ーの範囲枠に 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 サブオプシ ョ ン群を使っ て、 画像が
覆 う 領域 よ り も ふち を大 き く し ま し ょ う 。 あ る いは、 枠を その分太 く す る と い う 方法 も あ
8.4 範囲枠
263
り ます。 図 8.44 に、 ふち をつけ る ために PDF_fit_image( ) で使 う オプシ ョ ン リ ス ト を示 し
ます。
図 8.44 画像の範囲枠を使っ て画像にふち をつける
生成 さ れる出力
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.45 参照)。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の 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.45 画像の範囲枠の座標を使っ て テキス ト 行をはめ込む
生成 さ れる出力
生成手順
Foto: Kraxi
手順 1 : 画像を範囲枠 と と も にはめ込み
(x2, y2)
264
第 8 章 : テキス ト と 表の組版
手順 2 : 範囲枠情報を得て座標 (x2, y2) を取得
手順 3 : 取得 し た座標 (x2, y2) か ら orientate=west オプ シ ョ ン で テ
キス ト 行を開始
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 リ ン ク ・ し お り ・ 注釈
265
加え て上記で作成 し た 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 リ ン ク の作成例については 261 ページ 「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";
266
第 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 リ ン ク ・ し お り ・ 注釈
267
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 ト ピ ッ ク にあ り ま
す。
単純な テキス ト フ ィ ール ド 今度は、 テ キ ス ト フ ィ ール ド をページ右上隅付近に作成 し
ます。 ユーザーは今日の日付を こ の フ ィ ール ド に入力す る こ と がで き ます。 フ ォ ン ト ハン
268
第 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
269
テ キ ス ト フ ィ ール ド が フ ォーマ ッ ト さ れ る よ う にす る には、 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
桁区切 り のス タ イル :
270
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
271
"// 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);
272
第 9 章 : イ ン タ ラ ク テ ィ ブ機能
9.3 地理空間 PDF
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの interactive/starter_geospatial ト ピ ッ ク にあ り
ます。
9.3.1 地理空間 PDF を Acrobat で利用
PDF 1.7ext3 では、 地理空間参照情報 (世界座標) を PDF ページ内容に追加す る こ と がで
き る よ う にな っ てい ます。 Acrobat では、 地理空間参照付き PDF 文書でい く つかの こ と が
で き ます (Acrobat ・ Acrobat Reader DC では、 「ツール」 → 「も の さ し 」 を有効にす る 必
要があ り ます。 Acrobat X/XI では、 「ツール」 ペーンの上端のボ タ ン を使っ て 「分析」 ツー
ルバーを表示 さ せ る 必要があ り ます。 Adobe Reader X/XI では、 「編集」 → 「分析」 → 「地
図位置ツール」) :
> マ ウ ス カー ソ ルの下の地図上の位置の座標を表示 : 「地図位置ツール」 。 マ ウ ス カー ソ
ルの下の地図上の位置の座標を、右 ク リ ッ ク し て 「座標を ク リ ッ プボー ド に コ ピー」 を
選択す る こ と で コ ピーで き ます。
> 地図上の位置を検索 : 「地図位置ツール」 →右 ク リ ッ ク し て 「位置を検索」 を選択→求
め る 座標を入力。
> 地図上の位置を マー ク : 「地図位置ツール」 →右 ク リ ッ ク し て 「位置を マー ク 」 を選択。
> 地図上の距離 ・ 周辺 ・ 面積を測定 : 「もの さ し ツール」。
Acrobat Reader では上記の う ち最初の 2 つの機能だけが利用可能です。 地理空間測定のた
めの さ ま ざ ま な設定を、 「編集」 → 「環境設定」 (→ 「一般 ...」) → 「もの さ し (地図情報)」
で変更で き ます。 た と えば座標読み上げのための望ま し い座標系な ど です。
PDFlib の地理空間機能は以下の関数 と オプシ ョ ンで実装 さ れてい ます :
> 1 つのページに対 し て、 1 つない し 複数の地理参照付 き 領域を、 PDF_begin/end_page_
ext( ) の viewports オプシ ョ ン ( と サブオプシ ョ ン georeference) を用いて割 り 当て る こ
と がで き ます。 ビ ュ ーポー ト を使 う と 、 ページ上の別々の領域で別々の地理空間参照
(georeference オプシ ョ ン で指定) を用い る こ と が可能にな り ます。 こ れはた と えば同
一ページ上に複数の地図があ る と き な ど に有用です。 こ の方式は、 地理空間 PDF への
対応を有する すべての PDF ビ ュ ーアで動作 し ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの geospatial/starter_geospatial ト ピ ッ ク にあ り
ます。
> PDF_load_image( ) の georeference オプシ ョ ン を使 う と 、画像に地球ベース の座標を割 り
当て る こ と がで き ます。 こ の方式は、 Acrobat では動作 し ますが、 Avenza PDF Maps ア
プ リ では対応 し てい ません (試験 し たバージ ョ ン : iOS 用 Avenza 2.7 ・ Android 用 1.7)。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの geospatial/georeferenced_image ト ピ ッ ク にあ り
ます。
> PDF_open_pdi_page( ) ・ PDF_load_graphics( ) ・ PDF_begin_template_ext( ) の georeference
オプシ ョ ン を用いて地球ベース の座標を フ ォーム XObject に割 り 当て る こ と も で き ま
す。 し か し こ の方式は、 Acrobat DC を含むいずれの既知のビ ュ ーアにおいて も 対応 し
ていないため、 推奨 し ません。
9.3.2 地理座標系 と 投影座標系
地理座標系は地球を地理座標で、 すなわち緯度 と 経度を度単位で表 し て記述 し ます。 投影
座標系は、 地理座標系の上に指定す る こ と がで き 、 地理座標系におけ る 点か ら 二次元 (投
9.3 地理空間 PDF
273
影) 座標系への変換を記述 し ます。 こ こ か ら 算出 さ れ る 座標を Northing ・ Easting 値 と い
い、 投影座標系では角度は も はや不要です。 地理座標系が GPS な ど の全球的応用分野で
用い ら れてい る のに対 し て、投影はそれ よ り も あ る 程度局地的な地図製作な ど の応用分野
で必要 と な り ます。
歴史的 ・ 数学的理由に よ り 、 世界 じ ゅ う で さ ま ざ ま な座標系が用い ら れてい ます。 地
理座標系 ・ 投影座標系 と も 、 EPSG ・ WKT と い う 2 種類の普及 し た方式で記述す る こ と が
で き ます。
EPSG EPSG は何千 も の座標系の集合で あ り 、 おのおのが数値 コ ー ド で参照 さ れ ま す。
EPSG は、 今はな き 欧州石油調査グループの略称であ り 、 現在は国際石油 ・ 天然ガ ス生産
者協会 (OGP) に よ っ て保守 さ れてい ます。
EPSG 参照 コ ー ド は、 EPSG デー タ ベース内の座標系群の う ちの 1 つを指 し 示 し ます。
EPSG デー タ ベース全体を、 以下の場所か ら ダ ウ ン ロ ー ド す る こ と がで き ます :
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],
274
第 9 章 : イ ン タ ラ ク テ ィ ブ機能
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",
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 X/XI/DC で扱 う なかで、私たちは以下の難点に遭遇 し てい ます:
> EPSG コ ー ド は地理座標系に対 し ては ま っ た く 動作せず、投影系に対 し てのみ動作す る
よ う です。
回避策 : EPSG コ ー ド でな く 、 その照応す る WKT を使 う こ と 。
> 地理空間デー タ を フ ォーム XObject に紐付けて も 動作 し ません。 こ の理由か ら 、 PDF_
open_pdi_page( )・PDF_begin_template_ext( )・PDF_load_graphics( )に対 し て georeference
オプシ ョ ン を指定す る こ と は推奨 し ません。 PDF Reference に従えば こ れは動作す る べ
き なのですが。
ベ ク ト ルベース の地図を作成す る ための回避策 : 地理空間デー タ をページに紐付け る
こ と はで き ます。すなわち、PDF_begin_page_ext( ) の viewports オプシ ョ ン を用い ます。
> 重な り 合っ た地図 : 同一ページ上に複数の画像ベース の地図を貼 り 付け る こ と がで き
ます。 複数の地図が重な り 合っ てい る と き 、 重な り 合っ てい る 領域内の点の座標を表
示 さ せる と 、 Acrobat は、 最後に貼 り 付け ら れた地図の座標を用い ます ( こ れがすなわ
ち見えてい る 地図で も あ り ますので こ れは理にかな っ てい ます)。 し か し 、 双方の画像
ハン ド ルが同一の (すなわち PDF_load_image( ) への 1 回の呼び出 し で取得 さ れた) 場
9.3 地理空間 PDF
275
合には、 Acrobat は も はや さ ま ざ ま な画像の領域を考慮 し な く な り ます : 1 番目の画像
の座標が誤っ て 2 番目の画像の領域へ拡張 さ れ、 誤っ た座標表示 と な っ て し ま い ます。
回避策:同一ページ上に同 じ 画像をベース に し た地図を複数枚貼 り 付けたい と き は、そ
の画像を複数回開 く こ と 。
> 面積 も の さ し ツールは地理座標系に対 し ては正 し く 動作せず、 投影系に対 し てのみ正
し く 動作 し ます。
276
第 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 プ ロ パテ ィ に対す る 追加規
則が適用 さ れます : 334 ページ 「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 メ タ デー タ
277
p.end_document(optlist);
p.delete_pvf("/xmp/document.xmp");
278
第 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 は、 4KB 未満の文書を、 その実際の線形化ス テー
タ ス にかかわ ら ず、 非線型化であ る と 見な し ます。
Acrobat は ま た、 2 GB よ り 大 き な PDF 文書を、 線形化 さ れてい る と 見な し ません。
線形化に必要な一時領域 PDFlib では、 線形化を行 う には、 まずその文書全体の作成が
完了す る 必要があ り ます。 線形化処理は、 文書の作成が完了 し た後に別個の段階 と し て行
われ る のです。 こ のため、 PDFlib で最適化を行 う には、 追加の格納領域が必要にな り ま
す。 必要な一時領域はおお よ そ、 生成 さ れた文書 (線形化前の) と 同 じ 容量です。 PDFlib
は線形化デー タ を、 PDF_begin_document( ) の inmemory オプシ ョ ンに従っ て、 メ モ リ 内
か一時デ ィ ス ク フ ァ イ ルの ど ち ら かに格納 し ます。
10.2 Web 最適化 (線形) PDF
279
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 のための追加規則群に
従 う こ と を推奨 し ます : 詳 し く は 356 ページ 「11.6 PDF/UA に よ る ユニバーサルア ク セシ
ビ リ テ ィ 」 を参照 し て く だ さ い。
すべての PDF/UA の必要条件には従え ない場合には (た と えば PDF/UA に準拠 し てい
ない既存の PDF を元に文書を組み立てなければな ら ないな ど の理由で)、 PDF/UA モー ド
を無効に し て、 で き る 限 り 多 く の PDF/UA 規則に従 う こ と を推奨 し ます。
図 10.1
画面上のテキス ト をキ ャ プ
チ ャ し て点字デバイ ス上に表
示する ス ク リ ーン リ ーダ
280
第 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/DC で
10.3 タ グ付き PDF の基礎
281
図 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);
デフ ォ ル ト では、 構造エ レ メ ン ト は、 カ レ ン ト でア ク テ ィ ブな ア イ テ ムの子 と し て、 他の
子ア イ テ ムがすでに存在すればそれ ら すべての後に、 挿入 さ れます。 エ レ メ ン ト が論理的
282
第 10 章 : 文書交換
順序で作成 さ れ る な ら ば、 こ れに よ っ て正 し い ツ リ ー構造が得 ら れます。 も っ と 高度な技
法については 307 ページ 「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 に対 し て、 必要なテーブル タ グ群を作成す る よ う 指示 し ます (299
ページ 「10.4.1 自動表 タ グ付け」 参照)。 表セルに対 し て自動的に生成 さ れた TH ・ TD
タ グは、 PDF_add_table_cell( ) の tag オプシ ョ ンで さ ら に修飾する こ と も で き ます。
> PDF_fit_textflow( ) : 完全な テ キ ス ト フ ロ ー イ ン ス タ ン ス は新規の構造エ レ メ ン ト を形
成 し ます。
> 生成 さ れ る エ レ メ ン ト は、カ レ ン ト でア ク テ ィ ブな ア イ テ ムの、ま たは parent オプシ ョ
ンで与え ら れてい る ア イ テ ムの子です。
> グループ化エ レ メ ン ト は、PDF_begin_item( ) でのみ作成する こ と がで き 、他のいかな る
関数の tag オプシ ョ ン を用いて も 作成で き ませんが、 ただ し PDF_begin_document( ) は
例外です。
10.3 タ グ付き PDF の基礎
283
場合に よ っ ては、 短縮 タ グ付け を用いて、 ネ ス ト さ れた タ グ を作成す る こ と が必須、 ま た
は便利です : その例については 302 ページ 「 リ ン ク と その他の注釈種別」 を参照 し て く だ
さ い。
短縮 タ グ付けは、 生成 さ れ る 構造エ レ メ ン ト の ID を明か し ませんので、 こ れは PDF_
activate_item( ) と 、あ る いは tag オプシ ョ ンの parent サブオプシ ョ ン と と も には使え ませ
ん。 なぜな ら こ れ ら は構造エ レ メ ン ト ID を必要 と す る か ら です。
10.3.2 標準 ・ カ ス タ ムエ レ メ ン ト 種別
標準エ レ メ ン ト 種別 PDF は、 幅広い文書分類に対応す る よ う 設計 さ れた多数の標準エ
レ メ ン ト 種別に対応 し てい ます。 PDFlib は、 表 10.1 に従っ て こ れ ら すべての標準エ レ メ
ン ト 種別に対応 し てい ます。 こ の表の中で示 し てい る 説明は、 適切な種別を選ぶ助け と な
る こ と を意図 し てい ます。 表 10.1 は ま た、 288 ページ 「ブ ロ ッ ク レベル構造エ レ メ ン ト と
イ ン ラ イ ン構造エ レ メ ン ト 」 で説明する BLSE/ILSE の区別 も 示 し てい ます。
グループ化エ レ メ ン ト は、他のエ レ メ ン ト 群を保持す る コ ン テナです。こ れは直接ペー
ジ 要素 を 内容 と す る こ と は で き ま せ ん。 PDF が 完全 な 文書 を 内容 と す る 場合 に は、
Document エ レ メ ン ト を構造ツ リ ーのルー ト と し て用い る べ き です。 PDF が文書の一部分
を内容 と す る 場合には、 Part ・ Art ・ Sect ・ Div のいずれかをルー ト と し て用い る べ き です。
ルー ト エ レ メ ン ト は、 PDF_begin_document( ) の tag オプシ ョ ンで簡便に与え る こ と がで
き ます。
擬似エ レ メ ン ト 種別は、 いかな る 構造エ レ メ ン ト を も 作成す る こ と な く 、 コ ン テ ン ツ
を特定の特性でマー ク ア ッ プす る ために用い ら れます。 こ れは主に、 ページ装飾を マー ク
ア ッ プする ために用い ら れます (289 ページ 「10.3.3 ページ装飾」 参照)。
表 10.1 タ グ付き PDF 内の標準エ レ メ ン ト 種別 ( タ グ) と 、 PDFlib によ っ て追加 さ れた擬似エ レ メ ン ト 種別
種別
説明
グループ化 ( コ ン テナ) エ レ メ ン ト
Document
(文書) 完全な文書。 構造ツ リ ーのルー ト エ レ メ ン ト と し て推奨 し ます
Part
(部分) アーテ ィ クル群またはセ ク シ ョ ン群を グループ化する ための、 文書の大規模な部分
Art
(アーテ ィ クル) 単独の物語または解説を構成する、 比較的自己完結 し ている テキス ト の本文
Sect
(セ ク シ ョ ン) 関連する コ ン テ ン ツ エ レ メ ン ト 群を グループ化する ための コ ン テナ。 た と えばセ ク
シ ョ ンは、 見出 し 1 個 と 、 い く つかの導入段落群 と 、 下位セ ク シ ョ ン群 と し てその中にネス ト さ
れた 2 個以上の他のセ ク シ ョ ン を内容 と するか も し れません。
Div
(分割) 一般的ブ ロ ッ ク レ ベルエ レ メ ン ト またはエ レ メ ン ト 群のグループ
BlockQuote
(ブ ロ ッ ク 引用) 周囲のテキス ト の作成者以外の誰かに帰する 1 個ない し 複数の段落から成る テキ
ス ト の部分
Caption
(キ ャ プ シ ョ ン) テーブルか リ ス ト か図を説明する テキス ト の短い部分
TOC
(目次) 目次項目群 (エ レ メ ン ト 種別 TOCI) および / または他のネス ト さ れた目次エ ン ト リ 群
(TOC) から成る リ ス ト 。
TOCI
(目次項目) 目次の メ ンバ。 こ れは適切な Link エ レ メ ン ト を内容 と するべき です。
Index
(イ ンデ ッ ク ス) 文書の主本文内における指定 さ れた テキス ト の出現を指 し 示す Reference エ レ メ
ン ト を伴っ た識別テキス ト を内容 と する項目の列
284
第 10 章 : 文書交換
表 10.1 タ グ付き PDF 内の標準エ レ メ ン ト 種別 ( タ グ) と 、 PDFlib によ っ て追加 さ れた擬似エ レ メ ン ト 種別
種別
説明
NonStruct
(非構造エ レ メ ン ト ) 固有の構造上の意義を全 く 持たないグループ化エ レ メ ン ト 。 こ れはただグ
ループ化の目的にのみ供 し ます。 こ の種別のエ レ メ ン ト は、 Div と は、 こ れは他の文書形式へ解釈
または書き出 し さ れない と い う 点において異な り ます。 し か し 、 こ の子孫群は通常どお り 処理 さ
れます。
Private
(プ ラ イ ベー ト エ レ メ ン ト ) ア プ リ ケーシ ョ ンに属する プ ラ イ ベー ト コ ン テ ン ツ を内容 と するグ
ループ化エ レ メ ン ト 。 こ の種別の構造上の意義は仕様化 さ れていません。 こ の Private エ レ メ ン
ト も、 その子孫エ レ メ ン ト のいずれも、 他の文書形式へは解釈も書き出 し も さ れません。
見出 し ・ 段落エ レ メ ン ト (BLSE)
H
(見出 し 。 PDF/UA-1 では structuretype=strong の場合のみ) 文書の コ ン テ ン ツの下位分割部分の
ためのラ ベル。 こ れは、 その親の最初の子であ るべき です。 H エ レ メ ン ト は、 階層的なネス ト 化の
ために意図 さ れています。
H1~H6
特定のレ ベルを持つ見出 し 。 こ れは、 ア プ リ ケーシ ョ ンがセ ク シ ョ ン群を階層的にネス ト で き な
いために見出 し のレ ベルを そのネス ト 化のレ ベルから 判定で き ない場合に用いるべき です。
P
(段落) 一般的段落エ レ メ ン ト 、 すなわち、 見出 し ではないテキス ト の低レ ベルな分割部分
ラ ベル ・ リ ス ト エ レ メ ン ト (BLSE)
L
(箇条書き) 同様の意味 ・ 重要性を持 っ た項目の列
LI
(箇条書き項目) 箇条書きの個々の メ ンバ
Lbl
( ラ ベル) 同一箇条書き内で、 あ るいは同様の項目群の他のグループ内で、 あ る特定の項目を他か
ら 区別する名前または番号。 た と えば、 ビ ュ レ ッ ト リ ス ト または番号付き リ ス ト では、 ビ ュ レ ッ
ト キ ャ ラ ク タ またはその箇条書き項目の番号および伴 う 約物。
LBody
(箇条書き ボデ ィ ) 箇条書き項目の説明コ ン テ ン ツ
テーブルエ レ メ ン ト (すべてのテーブル タ グは自動的に作成可能です。 299ページ 「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 と は異な り ます。
Note
( ノ ー ト ) 文書の本文内か ら参照 さ れる、 脚注や後注 と い っ た説明テキス ト のア イ テム。 こ のエ レ
メ ン ト は Lbl を子 と し て持つ こ と がで き ます。
Reference
(参照) 文書内のど こ か別の場所にあ る コ ン テ ン ツへの言及
10.3 タ グ付き PDF の基礎
285
表 10.1 タ グ付き PDF 内の標準エ レ メ ン ト 種別 ( タ グ) と 、 PDFlib によ っ て追加 さ れた擬似エ レ メ ン ト 種別
種別
説明
BibEntry
(目録エ ン ト リ ) 何らかの言及 さ れた コ ン テ ン ツの外部ソ ース を識別する参照。 こ のエ レ メ ン ト は
Lbl を子 と し て持つ こ と がで き ます。
Code
( コ ー ド ) コ ン ピ ュ ー タ プ ロ グ ラ ムのテキス ト フ ラ グ メ ン ト
イ ン タ ラ ク テ ィ ブ要素のためのエ レ メ ン ト (ILSE) (302ページ 「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
実のページ コ ン テ ン ツから 区別 さ れるべき ページ装飾 (289 ページ 「10.3.3 ページ装飾」 参照)。
ASpan
(ア ク セシ ビ リ テ ィ スパン。 PDF には Span と し て書き込まれますが、 イ ン ラ イ ン ア イ テム Span と
は区別する必要があ り ます) 構造エ レ メ ン ト に属 し ない、 あ るいは構造エ レ メ ン ト の一部分であ
る よ う な コ ン テ ン ツ に対 し て、 ア ク セシ ビ リ テ ィ 特性群を紐付けます。 こ の ASpan 擬似エ レ メ ン
ト は、 Alt ・ ActualText ・ Lang ・ E と い っ たア ク セ シ ビ リ テ ィ 属性を持 っ た Span と し て書き込まれ
ます。 ASpan は、 いかな る構造エ レ メ ン ト と も紐付き ません。
ReversedChars
(非推奨) 右書き用字系の中の、 反転 し たキ ャ ラ ク タ 群に よ る テキス ト を指定。
Clip
(非推奨) マー ク さ れた切 り 抜き列を指定。 こ れは、 ク リ ッ ピ ングパス またはテキス ト 表現モー ド
7 のテキス ト のみを内容 と する列であ り 、 目に見え るグ ラ フ ィ ッ ク または PDF_save( )/PDF_
restore( ) を一切含みません。
286
第 10 章 : 文書交換
構造エ レ メ ン ト に対す る ネ ス ト 規則 構造エ レ メ ン ト を作成す る にあ た っ ては、 さ ま ざ
ま な規則に従 う 必要があ り ます。 こ れ ら の規則を表 10.2 に ま と めて あ り ます。 こ の規則
は、 列挙 し た標準エ レ メ ン ト 種別 と 、 各標準種別へ ロ ールマ ッ プ さ れた カ ス タ ムエ レ メ ン
ト 種別 (289 ページ 「カ ス テ ムエ レ メ ン ト 種別 と ロ ールマ ッ プ」 参照) に対 し て適用 さ れ
ます。 PDF/UA-1 には追加の規則群が適用 さ れます (356 ページ 「11.6 PDF/UA に よ る ユ
ニバーサルア ク セシ ビ リ テ ィ 」 参照)。
新規構造エ レ メ ン ト に対す る ネ ス ト 規則は、 PDF_begin_document( ) の checktags オプ
シ ョ ン を用いて無効に し た り 、 緩和 し た り する こ と も で き ます。 し か し こ れは、 無効な構
造 ヒ エ ラ ルキーを生み出す可能性があ り ますので推奨 し ません。 こ のオプシ ョ ンは、 レ ガ
シアプ リ ケーシ ョ ンのための移行の助け と し て意図 さ れてい る も のです。 表 10.2 内のい
く つかの規則を 「厳格規則」 と し て標識 し てい ます。 オプシ ョ ン checktags=relaxed は、 こ
の厳格規則群以外のすべての規則を強制 し ます。
表 10.2 PDF_begin_item( ) と 、 さ ま ざ ま な関数の tag オプ シ ョ ンに対する タ グネス ト 規則
ア イ テム
規則
直接 コ ン テ ン ツ
以下のエ レ メ ン ト は、 直接ページ コ ン テ ン ツ、 すなわち テキス ト か画像かベ ク ト ルグ ラ
フ ィ ッ ク を内容 と し て持つ こ と がで き ます :
H, H1, H2, ...
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。 こ れ らの場合にはオプ シ ョ ン
Placement=Block を推奨 し ます。
ブ ロ ッ ク レ ベル
エレ メ ン ト
以下のブ ロ ッ ク レ ベルエ レ メ ン ト は、 直接 コ ン テ ン ツ を子 と し て持 っ てはいけません。 す
なわち、 コ ン テ ン ツが作成で き る前に、 然るべき グループ化エ レ メ ン ト か BLSE が作成 さ
れる必要があ り ます :
L, LI, Table, TR, THead, TFoot, TBody
厳格規則 : P エ レ メ ン ト はグループ化エ レ メ ン ト を内容 と し て持つ こ と がで き ません。
擬似 ・ イ ン ラ イ ン
エレ メ ン ト
擬似エ レ メ ン ト (すなわち Artifact, ASpan, ReversedChars, Clip) と 、 以下の ILSE は、
inline=true の場合には子孫を一切持 っ てはいけません :
Code, BibEntry, Note, Quote, Reference, Span
ただ し こ れら のエ レ メ ン ト は、 inline=false の場合には子を持つ こ と がで き ます。
擬似エ レ メ ン ト と 、 以下の ILSE の中には、 inline=true の場合にはページ装飾を作成で き
ません : Span,Quote, Note, Reference, BibEntry, Code
10.3 タ グ付き PDF の基礎
287
表 10.2 PDF_begin_item( ) と 、 さ ま ざ ま な関数の tag オプ シ ョ ンに対する タ グネス ト 規則
ア イ テム
規則
表エ レ メ ン ト
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) は、 特定の書式や動作を持つ、 コ ン テ ン ツ の、 よ り 小 さ な
素片です。 BLSE と ILSE は表 10.1 で示 し てい ます。 その区別は、 い く つかの タ グ付けオ
プシ ョ ンに対 し て意味を持ち ます。詳 し く は PDFlib リ フ ァ レ ン ス を参照 し て く だ さ い。そ
の他の違いを表 10.3 に挙げます。
エ レ メ ン ト 種別 BibEntry ・ Code ・ Note ・ Quote ・ Reference ・ Span の通常か イ ン ラ イ ンかの
ス テー タ ス は、 PDF_begin_item( ) の inline オプシ ョ ン で、 ま たは tag オプシ ョ ンで変え る
こ と も で き ます。 ア ク セシ ビ リ テ ィ ス パン を強制的に通常 (inline=false) にす る こ と は、
た と えば、 複数ページに分割 さ れてい る 段落が複数言語を含んでい る 時に推奨 さ れ ます。
あ る いは、 その ア イ テ ム を閉 じ て、 次のページで新規のア イ テ ム を始め る こ と も 可能で
す。 イ ン ラ イ ン ア イ テ ムは、 それが開かれたページ上で閉 じ る 必要があ り ます。
288
第 10 章 : 文書交換
表 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/DC で以下の よ う に表
示 ・ 編集で き ます :
> 「表示」 → 「表示切 り 替え」 → 「ナビゲーシ ョ ンパネル」 → 「 タ グ」 を選択 し 、 「 タ グ」
パネルの上端にあ る メ ニ ュ ーボ タ ン を ク リ ッ ク し て、 ド ロ ッ プダ ウ ン リ ス ト か ら 「ロー
ルマ ッ プ を編集」 を選択
10.3.3 ページ装飾
実質的な コ ン テ ン ツ と ページ装飾 ページの さ ま ざ ま な コ ン テ ン ツ は、 以下のカ テ ゴ リ
のいずれかにあ ては ま り ます :
> 実質的な コ ン テ ン ツ。 文書作成者に よ っ て、 その文書の意味を伝え る ために作成 さ れ
てい ます。 その文書の論理構造ツ リ ーは、 実際の コ ン テ ン ツ を成すオブジ ェ ク ト 群を
記述 し てい る ほか、 注釈 も 含む場合があ り ます。
10.3 タ グ付き PDF の基礎
289
> 実質的なページ コ ン テ ン ツ に貢献 し てお ら ず、 ページネーシ ョ ン ま たは レ イ ア ウ ト 目
的のために作成 さ れてい る グ ラ フ ィ ッ ク ま たはテ キ ス ト オブジ ェ ク ト を、 ページ装飾
と いい ます。ページ装飾は、構造ツ リ ー内に含まれてお ら ず、 ス ク リ ーン リ ーダに よ っ
て読み上げ ら れません。
ページ装飾を標識す る こ と は、テ キ ス ト 折 り 返 し と ア ク セシ ビ リ テ ィ を向上 さ せ る ために
強 く 推奨 さ れ、 ま た PDF/UA-1 では必須です。 典型的なページ装飾は、 反復 さ れ る ヘ ッ
ダ ・ フ ッ タ 、 ページ番号、 背景画像、 その他各ページ上で反復 さ れ る ア イ テ ムです。
Acrobat におけ る ページ装飾 ページ装飾は、 Acrobat X/XI/DC で以下の方式のいずれか
でチ ェ ッ ク で き ます :
> 「ツール」 → 「ア ク セシ ビ リ テ ィ 」 → 「読み上げ順序」 (Acrobat DC) ま たは 「TouchUp
読み上げ順序」 (Acrobat X/XI) を選択す る と 、 ページ上の コ ン テ ン ツ エ レ メ ン ト を表
示ま たは編集で き ます。 ページ装飾は、 Acrobat の 「TouchUp 読み上げ順序 (TURO)」
ツール内では 「背景」 と 呼ばれてい ま す。 こ れは構造エ レ メ ン ト と は異な り 、 TURO
を ア ク テ ィ ブに し た際にふち と タ グ名を用いて視覚化 さ れません。
> ページ装飾を識別す る には、 「表示」 → 「表示切 り 替え」 → 「ナ ビ ゲーシ ョ ンパネル」
→ 「 コ ン テ ン ツ」 を選択 し ます。 「 コ ン テ ン ツ」 パネルには、 すべてのページ コ ン テ ン
ツ が、 それぞれの構造エ レ メ ン ト 種別名ま たは 「ページ装飾」 のいずれか適切なほ う
と と も に一覧表示 さ れ ます。 ページ装飾は読み上げ ら れ ませんので、 ページ上に、 照
応す る 番号付 き ブ ロ ッ ク はあ り ません。 ただ し 、 こ の一覧内のページ装飾を ク リ ッ ク
す る と 、 その照応す る 、 ページ上の コ ン テ ン ツ エ レ メ ン ト がハ イ ラ イ ト さ れます。
> ページ装飾を検索 : 「表示」 → 「表示切 り 替え」 → 「ナビゲーシ ョ ンパネル」 → 「 タ グ」
を選択 し 、 「 タ グ」 パネルの上端にあ る メ ニ ュ ーボ タ ン を ク リ ッ ク し て、 「検索 ...」 の
後、 ド ロ ッ プダ ウ ン リ ス ト か ら 「ページ装飾」 を選択 し ます。 ページ装飾は文書構造
の一部分ではあ り ませんので、 タ グナ ビ ゲーシ ョ ンパネルに も 順序パネルに も 、 照応
す る エン ト リ はあ り ません。
> 「表示」 → 「読み上げ ...」 を有効にす る と 、 Acrobat がページ上の構造エ レ メ ン ト を読み
上げ る こ と がで き る よ う にな り ます。 ページ装飾は読み上げ ら れません。
コ ン テ ン ツ を ページ装飾 と し て指定 ページ装飾は、 PDFlib で、 PDF_begin_item( ) 内で
Artifact タ グ名で指定す る こ と がで き ます (ページ装飾は構造エ レ メ ン ト の意味において
は本当は タ グではない と い う こ と は さ てお き ) :
id = p.begin_item("Artifact", "");
あ る いは、 ページ装飾は、 短縮 タ グ付けで、 すなわち さ ま ざ ま な関数の tag オプシ ョ ンで
指定する こ と も で き ます :
p.fit_textline(text, x, y, "tag={tagname=Artifact}");
ページ装飾は、 BLSE がカ レ ン ト でア ク テ ィ ブでない と き にのみ作成す る こ と を推奨 し ま
す。 し か し 、 アプ リ ケーシ ョ ンに よ っ ては こ れはつねに可能 と はかぎ り ませんので、 ペー
ジ装飾が作成 さ れ る 際には、PDFlib はカ レ ン ト でア ク テ ィ ブなエ レ メ ン ト を自動的に中断
し 、 そのページ装飾の後でそれを再びア ク テ ィ ブ化 し ます。 なお、 タ グ ネ ス ト 規則 (287
ページ 「構造エ レ メ ン ト に対す る ネ ス ト 規則」 参照) は、 ILSE 内にページ装飾を許容 し
ません。
290
第 10 章 : 文書交換
ページ装飾を分類 非 実 質 的 な ペ ー ジ コ ン テ ン ツ は、 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 に従っ て作成 さ れ る 範囲
枠長方形。
> 表装飾 : 自動表 タ グ付けが有効の場合には (299 ページ 「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 の基礎
291
> こ の文書言語は、 任意の構造 レ ベル上に あ る 個別の ア イ テ ム につい て、 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 の場合、 こ の並びは以下の よ う に表現で き ます :
&#x001B;&#x6465;&#x001B;
(=de)
テキス ト フ ロ ー を持つ タ グ付き PDF を生成 テ キ ス ト フ ロ ー機能 (223 ページ 「8.2 複数
行のテ キ ス ト フ ロ ー」 参照) は、 テ キ ス ト 組版のための強力な機能群を提供 し ます。 個別
のテ キ ス ト フ ラ グ メ ン ト は ク ラ イ ア ン ト 制御下ではな く な り 、PDFlib に よ っ て自動的に組
版 さ れますので、 テ キ ス ト フ ロ ーを持つ タ グ付き PDF を生成す る 際にはい く ら か注意を
払 う 必要があ り ます :
> 単一のテ キ ス ト フ ロ ーはめ込み枠の内容全体を構造エ レ メ ン ト の一部分 と す る こ と は
で き ます。 し か し 、 テ キ ス ト フ ロ ー枠が個別の構造エ レ メ ン ト を内容 と す る こ と はで
き ません。
> 1 個のテ キ ス ト フ ロ ーのすべての部分 (あ る 特定のテ キ ス ト フ ロ ーハン ド ルでの PDF_
fit_textflow( ) へのすべての呼び出 し ) は、 単一の構造エ レ メ ン ト の中に含まれ る べ き
です。
> 1 個のテ キ ス ト フ ロ ーの各部分が複数のページにわた る 場合があ り 、それ ら のページは
他の構造ア イ テ ム群を含んでい る 可能性があ り ますので、 適切な親ア イ テ ム を選択す
る こ と に注意を払 う べ き です (parent オプシ ョ ン と し て -1 を用い る のではな く 。 そ う
し て し ま う と 、 誤っ た親エ レ メ ン ト を指 し 示すおそれがあ り ます)。
> テ キ ス ト フ ロ ー内に リ ン ク やその他の注釈 を 作成す る た めに範囲枠機能 を 用い る 場
合、 こ の注釈を構造ツ リ ー内に正 し く 位置付け る こ と は困難です。
292
第 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=&#x00AD;}");
Type 3 フ ォ ン ト の特性 タ グ付 き PDF 文書内で用い ら れ る すべての Type 3 フ ォ ン ト につ
いて、 PDF_begin_font( ) の familyname ・ stretch ・ weight オプシ ョ ンに妥当な値を与え る
必要があ り ます。
10.3.5 代替記述 ・ 置換テキス ト ・ 略語拡張
タ グ付 き PDF は、 追加情報な し では容易に読めない画像 ・ テ キ ス ト のア ク セシ ビ リ テ ィ
を向上 さ せ る 機能群を提供 し てい ます。
10.3 タ グ付き PDF の基礎
293
代替記述 (Alt) テ キ ス ト へ自然に翻訳 さ れないア イ テ ムに、 代替記述を Alt オプシ ョ ン
を通 じ て割 り 当て る こ と がで き ます。 た と えば画像 ・ 数式や、 contents オプシ ョ ン を持た
ない注釈な ど です。
こ の代替記述は、 ス ク リ ーン リ ーダが読め る 1 個の ま る ご と の単語ない し 句か ら 成 る
べ き です。 こ の記述の末尾は、 ス ク リ ーン リ ーダがそれを後続テ キ ス ト と 合体 さ せて し ま
わない よ う 、 ピ リ オ ド か空白キ ャ ラ ク タ かいずれか適切なほ う と す る べ き です。 「こ の画
像の内容は …」 と い っ た先頭句を代替記述に入れ る こ と は避け る こ と を推奨 し ます。 こ の
Alt 値は、 その構造エ レ メ ン ト と そのすべての子の記述を提供 し ます。 ASpan 擬似エ レ メ
ン ト を用い る と 、 構造エ レ メ ン ト の一部分に Alt を割 り 当て る こ と がで き ます。
た と えば、 企業 ロ ゴの画像を、 Alt オプシ ョ ン を通 じ て記述 し て も よ いで し ょ う :
p.fit_image(image, x, y, "tag={tagname=Figure Alt={Kraxi企業ロゴ }}")
置換テキス ト (ActualText) テ キ ス ト へ変換 さ れ る ア イ テ ム であ っ て も 、 それが何 ら か
の非標準的な方式で表現 さ れてい る 場合には、それに代替テ キ ス ト を ActualText オプシ ョ
ン を通 じ て割 り 当て る こ と がで き ます。た と えばス ワ ッ シ ュ キ ャ ラ ク タ や ド ロ ッ プキ ャ ッ
プを持っ た図や、 ピ ク セル群を用いて単語を表現 し てい る 画像な ど です。 一方で、 ス キ ャ
ン さ れたページに対す る OCR テ キ ス ト は、 ActualText ではな く 不可視テ キ ス ト (すなわ
ち textrendering=3) と し て与え る べ き です。
こ の代替テ キ ス ト は、 人がその コ ン テ ン ツ を見た時に見え る も の と 同等の 1 個ない し
複数のキ ャ ラ ク タ を内容 と す る べ き です。 こ の ActualText 値は、 その構造エ レ メ ン ト と そ
のすべての子に対す る 代替 と し ての役割を果た し ま す。 ASpan 擬似エ レ メ ン ト を用い る
と 、 構造エ レ メ ン ト の一部分に ActualText を割 り 当て る こ と がで き ます。
た と えば、 対応す る Unicode 値が全 く 得 ら れない記号 flower グ リ フ に対 し て、 適切な
ActualText を割 り 当て る こ と で、 こ のグ リ フ が実際にはビ ュ レ ッ ト キ ャ ラ ク タ U+2022 と
し て用い ら れてい る こ と を明 ら かにす る こ と がで き ます :
p.fit_textline("&.flower;", x, y, "tag={tagname=ASpan ActualText={&#x2022;} } ...");
代替テキス ト と 置換テキス ト に対す る ネ ス ト 規則 Alt ・ ActualText 属性を用い る 際には、
以下の規則に従 う 必要があ り ます :
> Alt と ActualText は、対象構造エ レ メ ン ト 配下の下位 ヒ エ ラ ルキー全体を覆い ますので、
そ の構造エ レ メ ン ト の構造 ヒ エ ラ ル キ ー内の いずれか の祖先がすで に Alt 属性か
ActualText 属性を含んでい る 場合には、 ど ち ら の属性 も 許容 さ れません。
> Alt か ActualText 属性を持つエ レ メ ン ト は、直接 コ ン テ ン ツ か、1 個ない し 複数の Link エ
レ メ ン ト を内容 と し て持つ必要があ り ます。 こ の属性が Link エ レ メ ン ト に適用 さ れ る
場合には、 それは、 直接 コ ン テ ン ツか、 PDF_create_annotation( ) に よ っ て作成 さ れた
1 個ない し 複数の OBJR エ レ メ ン ト を内容 と し て持つ必要があ り ます (302 ページ 「 リ
ン ク と その他の注釈種別」 参照)。 そ う でない と 、 その属性が ど のページ上で読み上げ
ら れ る べ き なのか を決定す る こ と が不可能にな り ます。 こ の規則は当該エ レ メ ン ト 自
体に適用 さ れ ます : 直接 コ ン テ ン ツ を持つ子エ レ メ ン ト を持っ ていて も 充分ではあ り
ません。
Acrobat におけ る代替 ・ 置換テキス ト 構造エ レ メ ン ト の Alt・ActualText 属性は、Acrobat
X/XI/DC で以下の よ う に表示で き ます :
> 「表示」 → 「表示切 り 替え」 → 「ナビゲーシ ョ ンパネル」 → 「 タ グ」 を選択 し 、 ヒ エ ラ
ルキー内の構造エ レ メ ン ト を右 ク リ ッ ク し て、 「プ ロパテ ィ ...」 を 選択す る と 、 オブ
294
第 10 章 : 文書交換
ジ ェ ク ト プ ロ パテ ィ ダ イ ア ロ グが表示 さ れます。 「 タ グ」 タ ブに、 「実際のテキス ト 」 ・
「代替テキス ト 」 属性が表示 さ れてい ます。
略語拡張 (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 では、 すべての コ ン テ ン ツ
が意味付け上正 し い順序で タ グ付け さ れてい る こ と が必須であ り 、 すなわち、 その構造 ヒ
エ ラ ルキーはそのページ コ ン テ ン ツ を人が読む順に含んでい る 必要があ り ます。正 し い タ
グ付けに よ り 、 ス ク リ ー ン リ ーダ が コ ン テ ン ツ を 論理順に表現で き る よ う に な り ま す。
ページ装飾は構造ツ リ ーの一部分ではあ り ませんので、論理読み取 り 順序か ら は除外 さ れ
てい ます。
Acrobat におけ る読み取 り 順序 と 印刷ス ト リ ーム順序
論理読み取 り 順序は、Acrobat X/
XI/DC で以下の方式でチ ェ ッ ク で き ます :
> 「表示」 → 「表示切 り 替え」 → 「ナビゲーシ ョ ンパネル」 → 「 タ グ」 を選択 し 、 エ レ メ
ン ト の順序を上か ら 下へチ ェ ッ ク し ます。 こ の順序付けは、 望む読み取 り 順序を正確
に反映 し てい る べき です。
> 「表示」 → 「読み上げ ...」 を有効にす る と 、 Acrobat にページ内容を、 その文書内で指定
さ れてい る 読み取 り 順序で読み上げ さ せ る こ と がで き ます。
「順序」 ・ 「 コ ン テ ン ツ」 パネルでは、 ページ コ ン テ ン ツ を印刷ス ト リ ーム順序で一覧表示
し てい ます。
コ ン テ ン ツ を論理読み取 り 順序で作成 多 く の状況において う ま く い く 自然な方式は、 1
個の構造エ レ メ ン ト のすべての構成部分を シーケ ン シ ャ ルに生成 し 、ついで論理シーケ ン
ス内の次のエ レ メ ン ト へ移っ てい く こ と です。 専門的にい う と 、 構造ツ リ ーは単一の深 さ
優先 ト ラ バーサルに よ っ て作成 さ れ、 ページ内容を作成す る PDFlib 関数は、 内容が読ま
れ る 順に呼び出 さ れます。
10.3 タ グ付き PDF の基礎
295
7
1
1
2
6
5
3
2
図 10.3
論理読み取 り 順序
(左) と 印刷ス ト リ ー
ム順序 (右)
5
8
3
4
6
7
4
8
PDFlib では、 コ ン テ ン ツ を任意の順序で作成 し なが ら も なお構造 ヒ エ ラ ルキーを論理
順に作成する ためのい く つかの方法が可能です。 こ れ ら の方式は 307 ページ 「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 バージ ョ ン
説明 ・ 推奨 ・ 回避策
Acrobatの折 り 返 し 機能
296
第 10 章 : 文書交換
X
XI
DC
表 10.4 タ グ付き PDF 処理に関連する Acrobat の問題
問題が起 こ る
Acrobat バージ ョ ン
説明 ・ 推奨 ・ 回避策
X
XI
DC
○
○
○
○
BLSE は、 構造上の子エ レ メ ン ト と 直接 コ ン テ ン ツ エ レ メ ン ト のど ち ら も内容 と す
る こ と がで き ます。 し か し 、 構造ア イ テムの子を混合種別 (すなわち、 ページ コ ン
テ ン ツ列 と 非イ ン ラ イ ン構造エ レ メ ン ト の両方) と する と 、 折 り 返 し が失敗する
(Acrobat XI では折 り 返 し がブ ロ ッ ク さ れる) こ と があるので避けるべき です。 折 り
返 し 機能を、 またア ク セ シ ビ リ テ ィ チ ェ ッ カ と 読み上げを も正 し く 動作 さ せるには、
混合コ ン テ ン ツが必要な場合には直接エ レ メ ン ト を最初の子エ レ メ ン ト の前に入れ
る こ と を推奨 し ます。 また、 混合種別を子に持つ構造エ レ メ ン ト は、 直接 コ ン テ ン
ツ を持つただ 1 つの子エ レ メ ン ト を内容 と するべき であ り 、 かつそれは最初の子で
あ るべき です。
○
○
折 り 返 し が、 topdown オプ シ ョ ン で生成 さ れたページ上のテキス ト を誤っ て反転 さ
せる。
○
○
○
ア ク テ ィ ブ化 し たア イ テムが コ ン テ ン ツ だけ を含み、 構造上の子を含ま ない場合に、 ○
折 り 返 し が失敗する こ と があ る。 特にそのア イ テムが別のページ上で ア ク テ ィ ブ化
さ れた場合に顕著です。 こ の問題は、 ア ク テ ィ ブ化 し たア イ テムを非イ ン ラ イ ン
Span タ グで ラ ッ プする こ と で回避で き ます。
○
○
フ ォ ーム フ ィ ール ド (電子署名フ ィ ール ド を含む) を持つページが折 り 返 し で きず、 ○
その場合に警告を引き起こ す。
○
○
取 り 込まれた PDF ページが折 り 返 し モー ド で表示 さ れない。
Acrobatのア ク セシ ビ リ テ ィ チ ェ ッ カ
Alt 属性が Figure タ グについて無視 さ れる。
○
○
○
ア ク セシ ビ リ テ ィ チ ェ ッ カが、 構造エ レ メ ン ト 群が個別の言語属性を保持 し ていて
も 、 文書レ ベルでの Lang 属性を求める。
○
○
○
ア ク セシ ビ リ テ ィ チ ェ ッ カが、 取 り 込まれたページの一部分である画像に対する代
替記述を無視する。
○
○
○
ア ク セシ ビ リ テ ィ チ ェ ッ カが、 チ ェ ッ ク マー ク記号を持 っ た種類チ ェ ッ ク ボ ッ ク ス ○
の フ ォ ーム フ ィ ール ド について 「Character encoding – failed」 と 警告を発するが、 読
み上げ機能はそのフ ィ ール ド 内容を完璧に読み上げる。
○
○
-
○
○
Acrobat が コ ン テ ン ツ を 「あ り のま まに」 抽出する : Alt ・ ActualText オプ シ ョ ンが ○
無視 さ れ、 さ ら に Private ・ NonStruct タ グ も無視 さ れます。
○
○
ILSE (た と えば Code ・ Quote ・ Reference) には代替記述を与え る必要があ り ます。
Alt オプ シ ョ ンが用い られている と 、 読み上げ機能ではその与え られている テキス
ト が読み上げ ら れますが、 他の形式へ書き出 さ れるのは実際の コ ン テ ン ツにな り ま
す。 ActualText オプ シ ョ ンが用い ら れている と 、 その与え られている テキス ト が読
み上げ と 書き出 し の両方に用い られます。
○
○
○
○
○
○
他の形式へ書き出 し
取 り 込まれた PDF ページが Form タ グ を含んでいる場合、 ActualText オプ シ ョ ン で
与え られている テキス ト は書き出 さ れるが、 Alt 属性が無視 さ れる。 ただ し 、 読み
上げ機能はど ち らのオプ シ ョ ンに対 し て も 動作 し ます。
Acrobatの読み上げ機能
タ グ付きのページが PDI で配置 さ れてお り 、 かつページ装飾のみを内容 と し ている
場合に も 、 読み上げ機能がその配置 さ れているページの コ ン テ ン ツ を読み上げる。
10.3 タ グ付き PDF の基礎
297
表 10.4 タ グ付き PDF 処理に関連する Acrobat の問題
問題が起 こ る
Acrobat バージ ョ ン
説明 ・ 推奨 ・ 回避策
X
XI
DC
○
-
-
○
-
-
○
○
○
Acrobat で文書を保存 し た後に、 構造エ レ メ ン ト の属性がな く な る こ と があ る。 ア
○
ク セ シ ビ リ テ ィ のために意味を持つ属性群も同様にな く な る こ と がある。 例 : Table
エ レ メ ン ト の属性 Summary。
○
○
Alt 属性 と ActualText 属性が Figure タ グについて無視 さ れる。
Acrobatプ リ フ ラ イ ト に よ るPDF検証
Acrobat プ リ フ ラ イ ト 内の検証プ ロ フ ァ イル 「PDF の構文に関する問題点を レ ポー
ト 」 が、 タ グ付きのページが PDI で配置 さ れている と 、 誤 っ て 「矛盾する
ParentTree マ ッ ピ ング」 と 報告する。
その他のAcrobatの機能
タ グパネル内の「検索 ...」機能が、 ページ装飾を誤っ てマー ク な し コ ン テ ン ツ と
し て報告する。 例 : 表装飾。 対照的に、 こ れら のア イ テムは コ ン テ ン ツパネル内で
は 「 コ ン テナ < ページ装飾 >」 と し て正 し く 表示 さ れる。
298
第 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/DC で以
下の よ う に視覚化で き ます :
> 「表示」 → 「ア ク セシ ビ リ テ ィ 」 → 「読み上げ順序」 (Acrobat DC) ま たは 「TouchUp 読
み上げ順序」 (Acrobat X/XI) を選択。 テーブルエ レ メ ン ト がハ イ ラ イ ト さ れ、 テーブ
ルの左上隅近 く の小 さ な番号で標識 さ れます。テーブルサマ リ が存在す る 場合には、そ
れは こ の小 さ な番号の後に表示 さ れます。
> テーブルの左上隅にあ る 番号ま たは構造種別名を選択 し 、 「TouchUp 読み上げ順序」 ダ
イ ア ロ グ内の 「テーブルエデ ィ タ ー」 を ク リ ッ ク 。 表構造が縦横の線で視覚化 さ れ ま
す。 「テーブルエデ ィ タ ーオプ シ ョ ン」 ダ イ ア ロ グ内で、 Acrobat に、 表セルの種別に
従っ て TH/TD ア イ コ ン を表示 さ せ る こ と がで き ます (図 10.4 参照)。
> 表セルを右 ク リ ッ ク し て、 「テーブルセルのプ ロパテ ィ ...」 を選択する と 、 そのセル種
別 (ヘ ッ ダセルな ら TH、 デー タ セルな ら TD)、 scope 属性、 rowspan ・ colspan 属性、
header/ID 値をチ ェ ッ ク で き ます。
10.4 タ グ付き PDF の高度な ト ピ ッ ク
299
図 10.4
タ グ付き PDF 表のための
Acrobat のテーブルエデ ィ タ ー
がヘ ッ ダ (TH) ・ デー タ (TD)
セルを表示
なお、 Acrobat においてテーブルエデ ィ タ ーで作業す る にあ た っ ては以下の制約があ り ま
す:
> 表セルを視覚化す る 線が、 誤っ た位置に表示 さ れ る こ と があ り ます。
> 表が、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が指定 さ れていて も )。
300
第 10 章 : 文書交換
>そのセルの id を指定 し た Headers オプシ ョ ン を別のセルが含んでい る 場合には、こ の
タ ーゲ ッ ト セルは強制的にTHにな り ます(た と えtagname=TDが指定 さ れていて も )。
>そのセルが、PDF_fit_table( ) の header オプシ ョ ン で指定 さ れてい る と お り の表ヘ ッ ダ
の一部分で あ る 表行に含 ま れ て い る 場合には、 そ れは TH で ラ ッ プ さ れ、 ま た、
Scope=Column が追加 さ れま