You are on page 1of 430

ABC

PDFlib, PDFlib+PDI, PPS


A library for generating PDF on the fly
PDFlib 10.0.0

チ ュ ー ト リ アル
C ・ C++ ・ Java ・ .NET ・ .NET Core ・ Objective-C ・
Perl ・ PHP ・ Python ・ RPG ・ Ruby 用
Copyright © 1997–2022 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

jp.sales@pdflib.com
jp.support@pdflib.com (ラ イ セ ン ス番号をお知らせ く だ さ い)

こ の出版物および こ こ に含まれた情報はあ り のま まに供給 さ れる ものであ り 、 通知な く 変更 さ れる こ と が


あ り 、 ま た、 PDFlib GmbH によ る誓約 と し て解釈 さ れるべき ものではあ り ません。 PDFlib GmbH はいかな
る誤 り や不正確に対 し て も責任や負担を全 く 負 う ものではな く 、 こ の出版物に関するいかな る類の (明示
的 ・ 暗示的または法定に関わら ず) 保障を も行 う ものではな く 、 そ し て、 いかな る そ し てすべての売買可
能性の保障 と 、 特定の目的に対する適合性 と 、 サー ド パーテ ィ ーの権利の侵害 と を明白に否認 し ます。

PDFlib と PDFlib ロ ゴは PDFlib GmbH の登録商標です。 PDFlib ラ イ セ ン ス保持者は PDFlib の名称 と ロ ゴ を彼


らの製品の文書内で用いる権利を与え られます。 ただ し 、 こ れは必須ではあ り ません。

PDFlib は PANTONE® スポ ッ ト カ ラ ーデー タ を含んでいます © Pantone LLC, 2019。


ソ フ ト ウ ェ ア ア プ リ ケーシ ョ ンやユーザー向け文書で表示 さ れる PANTONE® カ ラ ーは PANTONE 定義規格
と 一致 し ない場合があ り ます。 正確な色については最新の PANTONE Color Publication を ご覧 く だ さ い。
PANTONE® およびその他の Pantone, Inc. の商標は Pantone, Inc. に帰属 し ます。 © Pantone, Inc., 2003.
Pantone, Inc. は PDFlib GmbH に対 し て PDFlib ソ フ ト ウ ェ ア と の組み合わせでのみ使用する ための頒布ラ イ
セ ン ス さ れた色デー タ および/またはソ フ ト ウ ェ アの著作権者です。 PANTONE カ ラ ーデー タ および/また
はソ フ ト ウ ェ アは PDFlib ソ フ ト ウ ェ アの実行の部分 と し て以外に他のデ ィ ス ク上や メ モ リ ー内へ複製 し て
はいけません。

PDFlib は HKS Warenzeichenverband e.V か ら ラ イ セ ン ス を受けた HKS® スポ ッ ト カ ラ ーデー タ を含んでいま


す。

PDFlib は以下のサー ド パーテ ィ ー コ ンポーネ ン ト を含んでいます :


Adobe CMap リ ソ ース群、 Copyright © 1990-2019 Adobe
AES ・ Arcfour ・ SHA アルゴ リ ズム、 Copyright © 1995-1998 Eric Young
Brotli 伸長 コ ー ド 、 Copyright © 2009, 2010, 2013-2016 by the Brotli Authors
Curl マルチ プ ロ ト コ ルフ ァ イル転送ラ イ ブ ラ リ ー、 Copyright © 1996-2021 Daniel Stenberg
Expat XML パーサ、 Copyright © 2001-2019 Expat maintainers
ICClib、 Copyright © 1997-2021 Graeme W. Gill
ICU International Components for Unicode、 Copyright © 1991-2020 Unicode, Inc.
libjpeg、 Copyright © 1991-2020, Thomas G. Lane, Guido Vollbeding
libpng、 Copyright ©2006-2017 Glenn Randers-Pehrson, Copyright © 2018-2019 Cosmin Truta
Libtiff 画像ラ イ ブ ラ リ ー、 Copyright © 1988-1997 Sam Leffler、 Copyright © 1991-1997 Silicon Graphics, Inc.
MD5 メ ッ セージダ イ ジ ェ ス ト 、 Copyright © 1991-2 RSA Data Security, Inc.
NotoSans フ ォ ン ト 群、 Copyright © 2012 Google Inc. All Rights Reserved.
OpenJPEG ラ イ ブ ラ リ ー、 Copyright © 2002-2014, Université catholique de Louvain (UCL), Belgium
OpenSSL 暗号ラ イ ブ ラ リ ー、 Copyright © 1998-2018 The OpenSSL Project
sRGB v2 ICC プ ロ フ ァ イル、 Copyright © International Color Consortium 2016
WOFF2 フ ォ ン ト 伸長、 Copyright © 2013-Packard Company2017 by the WOFF2 Authors
Zlib 圧縮ラ イ ブ ラ リ ー、 Copyright © 1995-2017 Jean-loup Gailly and Mark Adler

PDFlib Block Plugin は以下のサー ド パーテ ィ ー コ ンポーネ ン ト を も含んでいます :


wxWidgets Cross-Platform GUI Library、 Copyright © 2018 © 1998 Julian Smart、 © 2018 wxWidgets
目次
0 PDFlib のラ イ セ ン スキーを適用 11

1 は じ めに 15

1.1 PDFlib と は 15

1.2 説明書 と サン プルの案内 17

1.3 構成の必要事項 19

1.4 PDFlib/PDFlib+PDI/PPS 10.0 の新機能 20

1.5 廃止 ・ 削除 し た メ ソ ッ ド と オプ シ ョ ン 23

1.6 PDFlib の機能 24

1.7 PDFlib+PDI と pCOS イ ン タ ー フ ェ イ スの追加的機能 28

1.8 PPS と Block Plugin の追加的機能 29

1.9 製品別機能一覧 30

2 PDFlib の言語バイ ンデ ィ ング 31

2.1 C バイ ンデ ィ ン グ 31

2.2 C++ バイ ンデ ィ ン グ 35

2.3 Java バイ ンデ ィ ング 37

2.4 .NET バイ ンデ ィ ング 39

2.5 Objective-C バイ ンデ ィ ン グ 42

2.6 Perl バイ ンデ ィ ン グ 44

2.7 PHP バイ ンデ ィ ング 46

2.8 Python バイ ンデ ィ ン グ 48

2.9 RPG バイ ンデ ィ ング 49

2.10 Ruby バイ ンデ ィ ング 51

3 PDF 文書を作成 55

3.1 PDFlib プ ロ グ ラ ミ ン グの一般的特徴 55


3.1.1 例外処理 55
3.1.2 ロ グ記録 57
3.1.3 PDFlib 仮想フ ァ イ ルシ ス テ ム (PVF) 58
3.1.4 リ ソ ース構成 と フ ァ イ ル検索 59
3.1.5 PDF 文書を メ モ リ ー内に生成 64

目次 3
3.1.6 PDF 文書の最大サ イ ズ と その他の制限 65
3.1.7 Web 最適化 (線形) PDF 66
3.1.8 マルチ ス レ ッ ド プ ロ グ ラ ミ ン グ 66
3.1.9 EBCDIC ベース のプ ラ ッ ト フ ォームで PDFlib を使 う 66

3.2 ページ記述 68
3.2.1 座標系 68
3.2.2 ページ寸法 70
3.2.3 直接パ ス 71
3.2.4 パ ス オブジ ェ ク ト 72
3.2.5 テ ンプ レー ト (フ ォーム XObject) 74

3.3 PDF のパスワー ド セキ ュ リ テ ィ ー 76


3.3.1 PDF におけ る パ ス ワー ド セキ ュ リ テ ィ ー 76
3.3.2 PDFlib を用いて PDF 文書をパス ワー ド 保護 76

3.4 XMP メ タ デー タ 79

3.5 連携フ ァ イル 80

4 色 と 透過 83

4.1 デバイ ス色空間 83

4.2 ICC プ ロ フ ァ イルによ る色管理 85


4.2.1 ICC プ ロ フ ァ イ ルを読み込む 85
4.2.2 ICC プ ロ フ ァ イ ルを使用 86
4.2.3 高度な色管理制御 88

4.3 デバイ ス独立な CIE L*a*b* カ ラ ー 90

4.4 Pantone ・ HKS ・ カ ス タ ムスポ ッ ト カ ラ ー 91

4.5 DeviceN カ ラ ー 94

4.6 シ ェ ーデ ィ ング と シ ェ ーデ ィ ングパ タ ーン 98

4.7 タ イ リ ングパ タ ーン 100

4.8 透過ブ レ ン ド モー ド 101

4.9 オブ ジ ェ ク ト の色を変更 104


4.9.1 ブ レ ン ド モー ド を用いて色を変え る 104
4.9.2 ソ フ ト マ ス ク を用いて色を変え る 105

4.10 オーバープ リ ン ト 制御 107

5 Unicode と レ ガシ エ ン コ ーデ ィ ング 109

5.1 Unicode の重要な諸概念 109

5.2 Unicode 対応言語バイ ンデ ィ ン グ 111


5.2.1 ネ イ テ ィ ブ Unicode 文字列のあ る 言語バ イ ンデ ィ ン グ 111

4 目次
5.2.2 UTF-8 対応のあ る 言語バ イ ンデ ィ ン グ 111
5.2.3 デフ ォ ル ト UTF-8 対応のあ る 言語バ イ ンデ ィ ン グ 111

5.3 非 Unicode 対応言語バイ ンデ ィ ング 113


5.3.1 ネ イ テ ィ ブな Unicode 文字列のない言語バ イ ンデ ィ ン グ 113
5.3.2 Unicode 処理 と 各種文字列 113
5.3.3 シ ン グルバ イ ト (8 ビ ッ ト ) エン コ ーデ ィ ン グ 116
5.3.4 日本語 ・ 中国語 ・ 韓国語 CMap (廃止済) 118

5.4 キ ャ ラ ク タ ーを指定 121


5.4.1 エ ス ケープシーケ ン ス 121
5.4.2 文字参照 122

6 フォン ト 127

6.1 フ ォ ン ト 形式 127
6.1.1 TrueType フ ォ ン ト 127
6.1.2 OpenType フ ォ ン ト 127
6.1.3 SVG ・ COLR ・ sbix 形式の OpenType カ ラ ーフ ォ ン ト 128
6.1.4 WOFF ・ WOFF2 フ ォ ン ト 130
6.1.5 PostScript Type 1 フ ォ ン ト (廃止済) 131
6.1.6 SING フ ォ ン ト (グ リ フ レ ッ ト ) 131
6.1.7 Type 3 フ ォ ン ト 131

6.2 Unicode のキ ャ ラ ク タ ー と グ リ フ 133


6.2.1 グ リ フ ID 133
6.2.2 グ リ フ に対する Unicode マ ッ ピ ン グ 133

6.3 フ ォ ン ト を読み込む 135


6.3.1 テ キ ス ト フ ォ ン ト に対す る エン コ ーデ ィ ン グ を選ぶ 135
6.3.2 記号フ ォ ン ト に対す る エン コ ーデ ィ ン グ を選ぶ 137
6.3.3 例 : Wingdings 記号フ ォ ン ト 内のグ リ フ を選択 138
6.3.4 フ ォ ン ト を検索 141
6.3.5 Windows ・ macOS 上のホ ス ト フ ォ ン ト 144
6.3.6 フ ォールバ ッ ク フ ォ ン ト 146

6.4 フ ォ ン ト の埋め込み と サブ セ ッ ト 化 149


6.4.1 埋め込み 149
6.4.2 サブセ ッ ト 化 149

6.5 フ ォ ン ト 情報を ク エ リ ー 151


6.5.1 フ ォ ン ト 非依存のエン コ ーデ ィ ン グ ・ Unicode ・ グ リ フ名 ク エ リ ー 151
6.5.2 フ ォ ン ト 依存のエン コ ーデ ィ ン グ ・ Unicode ・ グ リ フ名 ク エ リ ー 152
6.5.3 コ ー ド ページ網羅性 と フ ォールバ ッ ク フ ォ ン ト を ク エ リ ー 153

7 テキス ト 出力 155

7.1 テキス ト 出力方式 155

目次 5
7.2 フ ォ ン ト メ ト リ ッ ク と テキス ト ス タ イル 157
7.2.1 フ ォ ン ト と グ リ フ の メ ト リ ッ ク 157
7.2.2 カーニ ン グ 157
7.2.3 テ キ ス ト ス タ イ ル 158

7.3 絵文字シーケ ン ス 161

7.4 OpenType レ イ アウ ト 機能 163


7.4.1 対応 し てい る OpenType レ イ ア ウ ト 機能 163
7.4.2 テ キ ス ト 行 ・ テ キ ス ト フ ロ ーで OpenType レ イ ア ウ ト 機能 166
7.4.3 用字系 ・ 言語固有の OpenType レ イ ア ウ ト 機能 167

7.5 複雑用字系の出力 170


7.5.1 複雑用字系 170
7.5.2 シ ェーピ ン グ処理を制御 171
7.5.3 双方向組版 172
7.5.4 ア ラ ビ ア語テ キ ス ト 組版 173

7.6 日本語 ・ 中国語 ・ 韓国語テキス ト 出力 175


7.6.1 TrueType ・ OpenType 日中韓フ ォ ン ト を用い る 175
7.6.2 横書 き と 縦書 き 175
7.6.3 EUDC ・ SING フ ォ ン ト に よ る 外字キ ャ ラ ク タ ー 176
7.6.4 OpenType レ イ ア ウ ト 機能 と 日中韓テ キ ス ト 出力 177

7.7 Unicode 異体字セ レ ク タ ー (UVS) 179


7.7.1 各種の異体字シーケ ン ス 179
7.7.2 PDFlib で異体字シーケ ン ス 180

7.8 テキス ト 処理パイ プ ラ イ ン 182


7.8.1 入力文字列を Unicode へ正規化 182
7.8.2 Unicode 値を グ リ フ ID へ変換 183
7.8.3 グ リ フ ID を転換 184

8 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む 187

8.1 ラ ス タ ー画像 187


8.1.1 基本的な画像処理 187
8.1.2 対応画像フ ァ イ ル形式 189
8.1.3 ク リ ッ ピ ン グパ ス 192
8.1.4 画像透過 193
8.1.5 画像に ス ポ ッ ト カ ラ ーか DeviceN カ ラ ーで着色 197
8.1.6 復号配列を用いて カ ラ ー値を変え る 197

8.2 SVG グ ラ フ ィ ッ ク 199


8.2.1 対応 SVG 種別 199
8.2.2 SVG 処理上の考慮事項 199
8.2.3 SVG グ ラ フ ィ ッ ク の寸法 201
8.2.4 フ ォ ン ト 選択 202
8.2.5 見つか ら ない フ ォ ン ト 、 見つか ら ないグ リ フ を扱 う 204

6 目次
8.2.6 SVG カ ラ ー拡張 205
8.2.7 ベ ク ト ルグ ラ フ ィ ッ ク ・ テ キ ス ト 以外の SVG 内容 208
8.2.8 対応 し ていない SVG 機能 209

8.3 PDF ページ を PDI で取 り 込む 211


8.3.1 PDI の機能 と 用途 211
8.3.2 PDFlib+PDI を使用 211
8.3.3 文書 ・ ページ関連のチ ェ ッ ク 213
8.3.4 注釈 ・ フ ォーム フ ィ ール ド ・ ア ク シ ョ ン を取 り 込む 213
8.3.5 取 り 込んだ PDF 文書の さ ら な る 特徴 215
8.3.6 文書関連のプ ロ パテ ィ を転写 217
8.3.7 ページ関連のプ ロ パテ ィ を転写 219

8.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置 221


8.4.1 単純にオブジ ェ ク ト を配置 221
8.4.2 オブジ ェ ク ト を点上か線上か枠内に配置 221
8.4.3 オブジ ェ ク ト の向 き を変え る 223
8.4.4 オブジ ェ ク ト を回転 224
8.4.5 ページ寸法の調整 225
8.4.6 配置 さ れた画像 と PDF ページに関す る 情報を ク エ リ ー 226

9 テキス ト と 表の組版 229

9.1 テキス ト 行を配置 ・ はめ込む 229


9.1.1 単純なテ キ ス ト 行配置 229
9.1.2 テ キ ス ト を枠内に位置付け 230
9.1.3 テ キ ス ト を枠へはめ込み 231
9.1.4 テ キ ス ト を文字で揃え る 233
9.1.5 ス タ ンプ を配置 234
9.1.6 リ ーダーを用い る 234
9.1.7 パス上テ キ ス ト 235
9.1.8 影付 き テ キ ス ト 236
9.1.9 Acrobat で編集で き る 透か し 236

9.2 複数行のテキス ト フ ロー 238


9.2.1 テ キ ス ト フ ロ ーをはめ込み枠に配置 240
9.2.2 段落の組版のオプシ ョ ン 241
9.2.3 イ ン ラ イ ンオプシ ョ ン リ ス ト と マ ク ロ 242
9.2.4 タ ブ位置 245
9.2.5 番号付き リ ス ト と 段落間隔 245
9.2.6 制御キ ャ ラ ク タ ー と キ ャ ラ ク タ ーマ ッ ピ ン グ 247
9.2.7 ハ イ フ ネーシ ョ ン 249
9.2.8 ウ ィ ド ー行 ・ オーフ ァ ン行 250
9.2.9 標準改行アルゴ リ ズ ムの制御 251
9.2.10 高度な用字系固有の改行 254
9.2.11 テ キ ス ト をパス ・ 画像に回 り 込ませ る 255

目次 7
9.3 表の組版 259
9.3.1 単純な表を配置 260
9.3.2 表セルの さ ま ざ ま な内容 263
9.3.3 表 と 列の幅 265
9.3.4 さ ま ざ ま な種類の内容を持っ た表 266
9.3.5 表 イ ン ス タ ン ス 269
9.3.6 表組版のアルゴ リ ズ ム 271

9.4 範囲枠 275


9.4.1 テ キ ス ト 行を装飾 275
9.4.2 テ キ ス ト フ ロ ー内で範囲枠を用い る 276
9.4.3 範囲枠 と 画像 277

10 イ ン タ ラ ク テ ィ ブ機能 279

10.1 リ ン ク ・ し お り ・ 注釈 279

10.2 フ ォ ーム フ ィ ール ド と JavaScript 282

10.3 ス ク リ ーン注釈 と 表現ア ク シ ョ ン を用いたマルチ メ デ ィ ア 285

10.4 地理空間 PDF 289


10.4.1 地理空間 PDF を Acrobat で利用 289
10.4.2 地理座標系 と 投影座標系 289
10.4.3 座標系の例 290
10.4.4 Acrobat におけ る 地理空間 PDF の制約 291

11 タ グ付き PDF と PDF/UA 293

11.1 タ グ付き PDF の基礎 293


11.1.1 論理構造ツ リ ー (構造 ヒ エ ラ ルキー) を作成 293
11.1.2 標準構造種別 297
11.1.3 PDF 1.7 の構造要素ネ ス テ ィ ン グ規則 303
11.1.4 PDF 2.0 の構造要素ネ ス テ ィ ン グ規則 303
11.1.5 カ ス タ ム構造種別 ・ ロ ールマ ッ プ ・ カ ス タ ム タ グセ ッ ト 308
11.1.6 ページ装飾 309
11.1.7 テ キ ス ト 処理 311
11.1.8 代替記述 ・ 置換テ キ ス ト ・ 略語拡張 313
11.1.9 印刷ス ト リ ーム順序 と 論理読み取 り 順序 314
11.1.10Adobe Acrobat におけ る タ グ付 き PDF の不具合 315

11.2 タ グ付き PDF 作成の高度な ト ピ ッ ク 317


11.2.1 自動表 タ グ付け 317
11.2.2 イ ン タ ラ ク テ ィ ブ要素に タ グ付け 320
11.2.3 イ ン タ ラ ク テ ィ ブ要素に タ グ付けす る PDF 2.0 の機能 325
11.2.4 リ ス ト に タ グ付け 325
11.2.5 内容を順序に と ら われず作成 327

8 目次
11.3 タ グ付き PDF ページ を PDI で取 り 込む 330

11.4 PDF/UA によ るユニバーサルア ク セシ ビ リ テ ィ ー 335


11.4.1 PDF/UA-1 規格 335
11.4.2 タ グ付けの要件 337
11.4.3 内容種別ご と の追加の要件 339
11.4.4 PDF/UA 文書のページ を PDI で取 り 込む 340

12 PDF のバージ ョ ン と 規格 341

12.1 PDF のバージ ョ ン 341


12.1.1 PDF のバージ ョ ンの概観 341
12.1.2 PDF 1.x の機能 342
12.1.3 PDF 2.0 の機能 343
12.1.4 PDF の廃止済の機能 343

12.2 PDF/A によ る アー カ イ ビ ング 346


12.2.1 各種の PDF/A 規格 346
12.2.2 一般的要件 347
12.2.3 色 と 画像の要件 348
12.2.4 イ ン タ ラ ク テ ィ ブ機能に対す る 要件 351
12.2.5 レベル U 準拠のための追加の PDF/A の要件 352
12.2.6 レベル A 準拠のための追加の PDF/A の要件 352
12.2.7 PDF/A 文書を PDI で取 り 込み 354
12.2.8 PDF/A のための XMP 文書 メ タ デー タ 355

12.3 PDF/X によ る印刷出力 358


12.3.1 PDF/X 規格フ ァ ミ リ ー 358
12.3.2 一般的要件 359
12.3.3 出力 イ ン テ ン ト と 色の要件 360
12.3.4 画像 と 透過の要件 363
12.3.5 イ ン タ ラ ク テ ィ ブ機能のための要件 363
12.3.6 PDF/X 文書を PDI で取 り 込む 365

12.4 PDF/VT によ る可変 ・ ト ラ ンザ ク シ ョ ン印刷 367


12.4.1 PDF/VT 規格 367
12.4.2 PDF/VT の諸概念 367
12.4.3 PDF/VT-1 を生成す る ための規則の要約 369
12.4.4 文書部分 ヒ エ ラ ルキー と 文書部分 メ タ デー タ (DPM) 370
12.4.5 反復する グ ラ フ ィ カル内容のための ス コ ープ ヒ ン ト 372
12.4.6 カプセル化 XObject 373
12.4.7 PDF/X ・ PDF/VT 文書を PDI で取 り 込む 374

13 PPS と PDFlib Block Plugin 375

13.1 PDFlib Block Plugin を イ ン ス ト ール 375

13.2 ブ ロ ッ ク の概念の概要 378

目次 9
13.2.1 文書デザ イ ン と プ ロ グ ラ ム コ ー ド の分離 378
13.2.2 ブ ロ ッ ク のプ ロ パテ ィ 378
13.2.3 なぜ PDF の フ ォーム フ ィ ール ド を使わないの 379

13.3 PDFlib Block Plugin で ブ ロ ッ ク を編集 381


13.3.1 ブ ロ ッ ク を作成 381
13.3.2 ブ ロ ッ ク プ ロ パテ ィ を編集 384
13.3.3 ページ間 ・ 文書間でブ ロ ッ ク を コ ピー 386
13.3.4 Block Plugin のユーザー イ ン タ ーフ ェ イ ス を XML でカ ス タ マ イ ズ 388

13.4 PDF フ ォ ーム フ ィ ール ド を PDFlib ブ ロ ッ ク に変換 389

13.5 ブ ロ ッ ク を Acrobat で プ レ ビ ュ ー 392

13.6 PPS で ブ ロ ッ ク に流 し 込み 397

13.7 ブ ロ ッ ク のプ ロパテ ィ 402


13.7.1 管理プ ロ パテ ィ 402
13.7.2 長方形プ ロ パテ ィ 403
13.7.3 書式プ ロ パテ ィ 404
13.7.4 テ キ ス ト 作成プ ロ パテ ィ 407
13.7.5 テ キ ス ト 組版プ ロ パテ ィ 408
13.7.6 オブジ ェ ク ト はめ込みプ ロ パテ ィ 411
13.7.7 デフ ォ ル ト 内容のためのプ ロ パテ ィ 414
13.7.8 カ ス タ ムプ ロ パテ ィ 414

13.8 pCOS で ブ ロ ッ ク 名 と プ ロパテ ィ を ク エ リ ー 415

13.9 ブ ロ ッ ク を プ ログ ラ ム的に作成 ・ 取 り 込む 417


13.9.1 POCA で PDFlib ブ ロ ッ ク を作成 417
13.9.2 PDFlib ブ ロ ッ ク を取 り 込む 418

13.10 PDFlib ブ ロ ッ クの仕様 419

A 改訂履歴 423

索引 425

10 目次
0 PDFlib のラ イ セ ン スキーを適用
評価版の制約 PDFlib GmbH に よ っ て提供 さ れ る PDFlib ・ PDFlib+PDI ・ PPS のすべてのバ
イ ナ リ ーバージ ョ ンは、 商用 ラ イ セ ン ス を取得 し たか否かにかかわ ら ず、 完全に動作す る
評価版 と し て利用で き ます。 ただ し 非 ラ イ セ ン ス版は、 すべての生成 さ れ る ページ上に、
www.pdflib.com と い う デモ ス タ ンプを横断印字 し 、 ま た、 内蔵の pCOS イ ン タ ーフ ェ イ ス
は小容量の文書 (10 ページ以下、 フ ァ イ ルサ イ ズ 1 MB 以下) に制限 さ れます。 非 ラ イ セ
ン ス のバ イ ナ リ ーは、 業務目的に使用 し てはな ら ず、 こ の製品を評価す る ためにのみ使用
で き ます。 PDFlib GmbH 製品はいずれ も 、 業務目的に使用す る には有効な ラ イ セ ン ス が必
要です。
PDFlib ラ イ セ ン ス の取得を ご検討いただいてい る 企業で、 評価段階やプ ロ ト タ イ プの
デモ期間中に評価制約の除去を ご希望の場合は、sales@pdflib.com 宛に企業情報・プ ロ ジ ェ
ク ト 内容を簡単に ご説明いただければ、 一時的な ラ イ セ ン ス キーを ご提供 し ま す (評価
キーの提供要請をお断 り す る 権利を私達は保持いた し ます。た と えば匿名に よ る ご希望の
場合な ど)。
PDFlib ・ PDFlib+PDI ・ PDFlib Personalization Server (PPS) は、 1 つのパ ッ ケージ と し て
頒布 さ れてはい ますが、 それぞれ異な る 製品であ り 、 別々の ラ イ セ ン ス キーを必要 と し ま
す。 PDFlib+PDI の ラ イ セ ン ス キーは PDFlib に対 し て も 有効ですが、 その逆は無効であ り 、
ま た、 PPS の ラ イ セ ン ス キーは PDFlib+PDI と PDFlib に対 し て有効です。 すべての ラ イ セ
ン ス キーはプ ラ ッ ト フ ォーム依存であ り 、購入 さ れた対象のプ ラ ッ ト フ ォームで し か使用
で き ません。
PDFlib ま たは PDI の ラ イ セ ン ス キーを ご購入いただいた ら 、 それを適用 し てデモ ス タ
ンプを除去 し て く だ さ い。 ラ イ セ ン ス キーを設定す る にはい く つかの方法があ り ます。 以
下にそれを解説 し ます。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の general/license_key ト ピ ッ ク にあ り ます。

ラ イ セ ン スキー を API 呼び出 し で実行時に適用 ス ク リ プ ト やプ ロ グ ラ ム に行を追加 し


て、 ラ イ セ ン ス キーを実行時に設定す る よ う に し ます。 PDFlib オブジ ェ ク ト を イ ン ス タ ン
ス化 し た直後に (C の場合 : PDF_new( ) の後に)、 license オプシ ョ ン を設定す る 必要があ
り ます。 具体的な文法は、 使用す る プ ロ グ ラ ミ ン グ言語に よ っ て異な り ます :
> C++ ・ Java ・ .NET/C# ・ Python ・ Ruby の場合 :

p.set_option("license=...あなたのライセンスキー ...")

> C の場合 :

PDF_set_option(p, "license=...あなたのライセンスキー ...")

> Objective-C の場合 :

[pdflib set_option: @"license=...あなたのライセンスキー ..."];

> Perl ・ PHP の場合 :

$p->set_option("license=...あなたのライセンスキー ...")

> RPG の場合 :

c callp PDF_set_option(p:%ucs2('license=...あなたのライセンスキー
...')

11
ラ イ セ ン ス フ ァ イ ルを使用 実行時の呼び出 し で ラ イ セ ン ス キー を 与え る のではな く 、
その ラ イ セ ン ス キーを テ キ ス ト フ ァ イ ルに入力 し てお く と い う 方法 も あ り ます。以下の形
式に従っ て く だ さ い (PDFlib のデ ィ ス ト リ ビ ュ ーシ ョ ンにはすべて、 ラ イ セ ン ス フ ァ イ ル
テ ンプ レー ト licensekeys.txt が入っ てい る ので、 それを利用す る こ と も で き ます)。 1 個の
「#」 キ ャ ラ ク タ ーで始ま る 行は、 注釈を内容 と し てお り 、 無視 さ れます。 2 行目は、 ラ イ
セ ン ス フ ァ イ ル自体のバージ ョ ン情報を内容 と し てい ます :
# Licensing information for PDFlib GmbH products
PDFlib license file 1.0
PDFlib 10.0.0 ...あなたのライセンスキー ...

こ の ラ イ セ ン ス フ ァ イ ル内には、 複数の PDFlib GmbH 製品に対する ラ イ セ ン ス キー群を、


それぞれ別の行に記述す る こ と も で き ます。 ま た、 複数のプ ラ ッ ト フ ォームに対する ラ イ
セ ン ス キー群を内容 と し て持たせ る こ と に よ り 、 同一の ラ イ セ ン ス フ ァ イ ルを複数のプ
ラ ッ ト フ ォームで共用す る こ と も 可能です。 ラ イ セ ン ス フ ァ イ ルは、 以下の方法で構成す
る こ と がで き ます :
> licensekeys.txt と い う 名前の フ ァ イ ルが、 すべてのデフ ォ ル ト 位置で検索 さ れます (13
ページ 「デフ ォ ル ト フ ァ イ ル検索パ ス」 を参照)。
> licensefile オプシ ョ ン を set_option( ) API メ ソ ッ ド で設定する こ と も で き ます :

p.set_option("licensefile={/ファイルへの/パス/licensekeys.txt}");

> ラ イ セ ン ス フ ァ イ ルを指 し 示す環境(シ ェ ル)変数を設定する こ と も で き ます。Windows


では、 シ ス テ ムの コ ン ト ロ ールパネルを使っ て、 「シ ス テム」 → 「詳細」 → 「環境変数」
を選択 し ます。 Unix では、 以下の よ う な コ マ ン ド を適用 し ます :
export PDFLIBLICENSEFILE=/ファイルへの/パス/licensekeys.txt

> IBM System i では、 ラ イ セ ン ス フ ァ イ ルは ASCII で符号化 さ れてい る 必要があ り ます


(asciifile オプシ ョ ン を参照)。 ラ イ セ ン ス フ ァ イ ルを以下の よ う に指定で き ます ( こ の
コ マ ン ド は、 ス タ ー ト ア ッ ププ ロ グ ラ ム QSTRUP 内で指定する こ と がで き 、 すべての
PDFlib GmbH 製品で動作 し ます) :
ADDENVVAR ENVVAR(PDFLIBLICENSEFILE) VALUE('/PDFlib/10.0/licensefile.txt') LEVEL(*SYS)

レ ジ ス ト リ ー内へ ラ イ セ ン スキー Windows では、 以下の レ ジ ス ト リ ー値に ラ イ セ ン ス


フ ァ イ ルの名前を書 き 込む と い う 方法 も あ り ます :
HKLM\SOFTWARE\PDFlib\PDFLIBLICENSEFILE

ま たは、以下の レ ジ ス ト リ ー値の う ちのいずれか 1 つに ラ イ セ ン ス キーを直接書き 込む こ


と も で き ます :
HKLM\SOFTWARE\PDFlib\PDFlib10\license
HKLM\SOFTWARE\PDFlib\PDFlib10\10.0.0\license

注 64 ビ ッ ト Windows シ ス テム上で レ ジ ス ト リ ーを手作業で扱 う 際には注意 し て く だ さ い :


通常どお り 、 64 ビ ッ ト の PDFlib バイ ナ リ ーは Windows レ ジス ト リ ーの 64 ビ ッ ト ビ ュ ー
と と も に動作 し 、64 ビ ッ ト シ ス テム上で動作する 32 ビ ッ ト の PDFlib バイ ナ リ ーはレ ジ ス
ト リ ーの 32 ビ ッ ト ビ ュ ー と と も に動作 し ます。 32 ビ ッ ト 製品に対する レ ジ ス ト リ ーキー
を手作業で追加する と きは、 必ず 32 ビ ッ ト 版の regedit ツールを使用 し て く だ さ い。 こ れ
は 「ス タ ー ト 」 ダ イ ア ログから 以下によ っ て起動する こ と がで き ます :

12 第 0 章 : PDFlib のラ イ セ ン スキーを適用
%systemroot%\syswow64\regedit

デ フ ォ ル ト フ ァ イ ル検索パス Unix ・ Linux ・ macOS ・ IBM System i では、 パ ス ・ デ ィ レ ク


ト リ ー名を何 も 指定 し な く て も 、デフ ォ ル ト でい く つかのデ ィ レ ク ト リ ーで フ ァ イ ル群が
検索 さ れます。 UPR フ ァ イ ル ( さ ら な る 検索パ ス を含んでい る 場合 も あ る ) を検索 し て読
み込む前に、 以下のデ ィ レ ク ト リ ーが検索 さ れます :
<rootpath>/PDFlib/PDFlib/10.0/resource/cmap
<rootpath>/PDFlib/PDFlib/10.0/resource/font
<rootpath>/PDFlib/PDFlib/10.0/resource/icc
<rootpath>/PDFlib/PDFlib/10.0
<rootpath>/PDFlib/PDFlib
<rootpath>/PDFlib

Unix ・ Linux ・ macOS では、 <rootpath> は、 まず /usr/local で、 ついで HOME デ ィ レ ク ト


リ ーで置 き 換え ら れます。 IBM System i では <rootpath> は空です。

ラ イ セ ン ス フ ァ イ ル と リ ソ ース フ ァ イ ルに対す る デ フ ォ ル ト フ ァ イ ル名 デ フ ォ ル ト
で、 以下の フ ァ イ ル名が、 デフ ォ ル ト 検索パ スデ ィ レ ク ト リ ー群の中で検索 さ れます :
licensekeys.txt (ライセンスファイル)
pdflib.upr (リソースファイル)

こ の機能を利用す る と 、 環境変数や ラ ン タ イ ム オプシ ョ ン を一切設定せずに ラ イ セ ン ス


フ ァ イ ルを扱 う こ と も で き ます。

ア ッ プデー ト と ア ッ プ グ レ ー ド ア ッ プデー ト (あ る 製品の古いバージ ョ ン か ら その同


じ 製品の新 し いバージ ョ ンへの切 り 換え) かア ッ プグ レー ド (PDFlib か ら PDFlib+PDI ま
たは PPS への、 ま たは PDFlib+PDI か ら PPS への切 り 換え) を購入 さ れた場合、 あ る いは
ご自分のサポー ト 契約の一部 と し て新 し い ラ イ セ ン ス キーを受け取っ た場合には、 その
ア ッ プデー ト か ア ッ プ グ レ ー ド に対 し て受け取っ た新 し い ラ イ セ ン ス キーを適用す る 必
要があ り ます。 前の製品に対す る 古い ラ イ セ ン ス キーは利用で き な く な り ます。

ま だ ラ イ セ ン ス さ れていない機能を評価 いずれの機能 も 、 ソ フ ト ウ ェ ア に対 し て ラ イ
セ ン ス キーを一切適用せずに完全に評価で き ます。 し か し 、 あ る 特定製品に対す る 有効な
ラ イ セ ン ス キーの適用後は、 それ よ り も 高いカ テ ゴ リ ーの機能は利用で き な く な り ます。
た と えば、 有効な PDFlib の ラ イ セ ン ス キーを イ ン ス ト ールす る と 、 PDI の機能を試用で き
な く な り ます。 同様に、 PDFlib+PDI の ラ イ セ ン ス キーを イ ン ス ト ール し た後は、 パー ソ ナ
ラ イ ゼーシ ョ ン機能 (ブ ロ ッ ク 関数群) を利用で き な く な り ます。
あ る 製品に対す る ラ イ セ ン ス キーがすでに イ ン ス ト ール さ れてい る 時は、 そのかわ り
にダ ミ ーの ラ イ セ ン ス文字列 「0」 (数字のゼ ロ ) を設定すれば、 それ よ り も 高い製品 ク ラ
ス の機能を試用で き る よ う にな り ます。 そ う す る こ と に よ り 、 それ以前に無効に さ れた関
数が有効にな り 、 ま た、 すべてのページ を横断す る デモ ス タ ンプが再び有効にな り ます。

さ ま ざ ま な ラ イ セ ン シ ン グオ プ シ ョ ン PDFlib の 1 台ない し 複数のサーバー上での利用


や、 PDFlib を利用者自身の製品 と と も に再配布す る こ と に対 し ては、 それぞれ異な っ た ラ
イ セ ン シ ン グオプシ ョ ン を利用可能です。サポー ト 契約や ソ ース コ ー ド 契約 も 提供 し てい
ます。 ラ イ セ ン シ ン グについての詳細情報 と PDFlib 購入申込フ ォームは PDFlib デ ィ ス ト
リ ビ ュ ーシ ョ ンの中にあ り ます。PDFlib の ラ イ セ ン ス の入手にご関心をお持ちいただけた
場合や、 ご質問につ き ま し て何な り と 、 当社ま でご連絡 く だ さ い。

13
14 第 0 章 : PDFlib のラ イ セ ン スキーを適用
1 は じ めに
1.1 PDFlib と は
PDFlib は、 PDF 文書を生成 ・ 操作す る 、 定評あ る 開発者向け コ ン ポーネ ン ト です。 PDFlib
の主要 タ ーゲ ッ ト は、 Web サーバー上での動的な PDF 生成 と 、 あ ら ゆ る 種類のサーバー ・
デス ク ト ッ プ ・ モバ イ ルアプ リ ケーシ ョ ンにおけ る PDF 生成です。 PDFlib を利用すれば、
デー タ ベース の内容か ら 動的に PDF 文書を生成で き ます。 すなわち動的な Web ページ と
同様の こ と がで き る のです。 1997 年以来、 PDFlib は幅広いユース ケース と 開発環境にお
いて実力を証明 し てい ます。 アプ リ ケーシ ョ ンのプ ロ グ ラ マーが、 PDFlib を用いて、 テ キ
ス ト ・ 画像 ・ グ ラ フ ィ ッ ク ・ イ ン タ ラ ク テ ィ ブ要素を有す る PDF 出力を生成 し ます。
PDFlib は、 世界 じ ゅ う の何万 も のユーザー様に現にご利用いただいてい ます。 こ の よ
う な大ス ケールでデプ ロ イ し ていただいてい る おかげ も あ り 、 当社は API と 、 内部実装
と 、 生成する PDF 出力を さ ら に改良 ・ フ ァ イ ンチ ュ ーンで き てい ます。 関連する PDF ・
PDF/A ・ PDF/X ・ PDF/UA ・ PDF/VT の ISO 規格に準拠する こ と と 、 普及 し てい る PDF
ビ ュ ーアー と の互換を と る こ と に高い優先度を与え てい ます。PDFlib は、PDF 形式が提供
し てい る すべての機能に対応 し てい ます。
PDFlib の製品フ ァ ミ リ ーは、 3 つの種類 と し て提供 し てい ます : PDFlib と 、 PDFlib+PDI
(PDF Import) と 、PDFlib Personalization Server (PPS) (Adobe Acrobat 用 PDFlib Block Plugin
が付属) です。

PDFlib PDFlib は PDF 文書を生成す る さ ま ざ ま な メ ソ ッ ド を提供 し ます。 それに よ っ て、


PDF 文書にテ キ ス ト ・ グ ラ フ ィ ッ ク ・ 画像を持たせた り 、 注釈や し お り な ど イ ン タ ラ ク
テ ィ ブ要素を持たせた り す る こ と が可能です。 PDFlib の API は、 PDF の生成を さ ま ざ ま
な レベルにおいて行え る よ う にな っ てい ます。異な る レベルを自由に混在 さ せ る こ と も 可
能です。
低レベルの API を用い る と 、 ア イ テ ム を個別にページに配置で き ます。 その際に整形
情報を アプ リ ケーシ ョ ンか ら 与え る こ と がで き ます。 レ イ ア ウ ト がすでに決ま っ てい る ア
プ リ ケーシ ョ ン (画面表示な ど) において、 テ キ ス ト ・ 画像な ど オブジ ェ ク ト を直接 PDF
ページに配置で き ます。
高レベルの API は、 強力な整形機能を提供 し ます :
> 一行テ キ ス ト 出力で、 さ ま ざ ま な整形制御を行え ます。
> テ キ ス ト フ ロ ー整形機能で、任意の量のテ キ ス ト を、1 個ない し 複数の段ま たはページ
に配置で き ます。 テ キ ス ト を四角形でない形状に整形 し た り 、 画像を回 り 込ませた り 、
イ ン タ ラ ク テ ィ ブ要素や、タ グ付 き PDF の構造情報を持たせた り す る こ と も 可能です。
> 柔軟な表整形機能で、 表セル内に テ キ ス ト ・ 画像 ・ グ ラ フ ィ ッ ク ・ 注釈 ・ フ ォ ー ム
フ ィ ール ド な ど あ ら ゆ る 種類の内容を配置で き ます。 大 き な表を複数ページにわた っ
て配置す る こ と も 可能です。 表整形の細かい指定 も 多様なオプシ ョ ンで制御で き ます。
> 画像 と SVG の配置を、 さ ま ざ ま なはめ込み ・ 整形 メ ソ ッ ド に よ っ て行え ます。

PDFlib+PDI (PDF Import) PDFlib+PDF は、 PDFlib の機能を すべて有 し て い る う え に、


PDF Import Library PDI と い う 、 既存の PDF ページ と イ ン タ ラ ク テ ィ ブ要素を、 生成す る
PDF 出力に入れ込む ラ イ ブ ラ リ ーを持っ てい ます。 PDFlib+PDI を利用す る と 、 PDFlib で
で き る こ と はすべてで き る う え、 以下 も 可能にな り ます :
> 1 枚のシー ト に複数の PDF ページ を組み付け
> 既存の PDF ページにヘ ッ ダー・ フ ッ タ ー・ ス タ ンプ・ページ番号な ど テ キ ス ト を加え る

1.1 PDFlib と は 15
> 既存のページに企業 ロ ゴ な ど画像を貼 り 付け
> 複数の PDF ページ を並べ替え た り 、組み合わせた り 、修正 し た り し なが ら も 、PDF/A ・
PDF/X ・ PDF/UA への準拠を維持

PDFlib Personalization Server (PPS) と PDFlib Block Plugin PDFlib Personalization


Server (PPS) は、 PDFlib+PDI を有 し てい る う えに、 PDFlib ブ ロ ッ ク を使っ て可変デー タ
処理を行 う メ ソ ッ ド も 持っ てい ます。 PPS を利用する と アプ リ ケーシ ョ ンが レ イ ア ウ ト の
変更か ら 影響を受けな く な り ます。
デザ イ ナーはレ イ ア ウ ト の PDF を作 り 、 可変テ キ ス ト ・ 画像 ・ グ ラ フ ィ ッ ク のための
プ レース ホルダー と し たい領域を、 Acrobat 用 PDFlib Block Plugin を用いてマー ク し ます。
こ の PDFlib Block Plugin にはプ レ ビ ュ ー機能があ る ので、 指定 し たプ ロ パテ ィ に従っ てブ
ロ ッ ク への流 し 込みが行われた場合の結果を見る こ と がで き ます。
開発者は、 PDFlib ブ ロ ッ ク にテ キ ス ト ・ 画像 ・ ベ ク ト ルグ ラ フ ィ ッ ク ・ PDF ページ を
流 し 込む コ ー ド を書 き ます。彼はブ ロ ッ ク の書式や位置については知 ら な く て も 大丈夫で
す。 PPS を利用す る と 、 PDFlib+PDI でで き る こ と はすべてで き る う え、 テ キ ス ト と 画像か
ら メ ールを自動生成 し た り 、 テ ンプ レー ト 流 し 込みで取引 ・ 明細処理を行な っ た り 、 販促
資料をパー ソ ナ ラ イ ズ し た り 、1 つのデー タ ベース か ら 個別の部品カ タ ロ グ を生成 し た り 、
複数の製品に対 し て カ ス タ マ イ ズ し た説明書を制作 し た り する こ と が可能です。

PDFlib を使 う には PDFlib は、 Unix ・ Windows ・ macOS のほか、 IBM System i ・ IBM Z な


ど EBCDIC ベース のシ ス テ ム を含む多様なプ ラ ッ ト フ ォームで利用可能です。PDFlib は C
と C++ で書かれてい ますが、 他のい く つかの言語 と プ ロ グ ラ ミ ン グ環境か ら も 利用可能
です。 こ れ ら を言語バ イ ンデ ィ ン グ と 呼びます。 こ れ ら のバ イ ンデ ィ ン グは、 現在のすべ
ての Web 開発環境 と ス タ ン ド ア ロ ーン開発環境を カバー し てい ます。そのアプ リ ケーシ ョ
ン プ ロ グ ラ ミ ン グ イ ン タ ーフ ェ イ ス (API) は学習が容易であ り 、 し か も ど のバ イ ンデ ィ
ン グで も 同 じ です。 現状、 以下のバ イ ンデ ィ ン グ をサポー ト し てい ます :
> C and C++
> Java
> .NET
> Objective-C (macOS ・ iOS) ・ Swift
> Perl
> PHP
> Python
> RPG (IBM System i)
> Ruby

16 第 1 章 : は じ めに
1.2 説明書 と サン プルの案内
当社では、 PDFlib 製品の有効活用を支援す る ため、 以下に挙げ る 資料を提供 し てい ます。

すべての言語バ イ ン デ ィ ン グ用の ミ ニサン プル hello ・ image ミ ニサンプルが、 すべて


のパ ッ ケージ、 すべての言語バ イ ンデ ィ ン グで利用可能です。 こ れ ら は、 テ キ ス ト と 画像
を出力する 最小限のサンプル コ ー ド を示 し てい ます。 こ の ミ ニサンプルは主に、 PDFlib が
正 し く イ ン ス ト ールで き た こ と を確認 し た り 、PDFlib アプ リ ケーシ ョ ン コ ー ド の書 き 方を
さ っ と 把握 し た り す る のに便利です。

すべての言語バ イ ン デ ィ ン グ用のス タ ー タ ーサン プル ス タ ー タ ーサン プルが、 すべて


のパ ッ ケージに入っ てお り 、 すべての言語バ イ ンデ ィ ン グで利用可能です。 重要な ト ピ ッ
ク のための出発点 と し て便利であ り 、 シ ンプルなテ キ ス ト ・ 画像出力、 テ キ ス ト フ ロ ー ・
表組版、 PDF/A ・ PDF/X ・ PDF/UA 作成、 その他多 く の ト ピ ッ ク を カバー し てい ます。 こ
の ス タ ー タ ーサンプルを見れば、PDFlib 製品を用いて特定の目的を達す る ための基本的な
技法を知 る こ と がで き ます。 ス タ ー タ ーサンプルを見てみる こ と を強 く 推奨 し ます。

PDFlib チ ュ ー ト リ アル PDFlib チ ュ ー ト リ アル ( こ のマニ ュ アル) は、 すべてのパ ッ ケー


ジに入っ ていて、 重要な さ ま ざ ま なプ ロ グ ラ ミ ン グ概念を さ ら に詳 し く 説明 し てお り 、 各
種の小 さ な コ ー ド 断片 も 含んでい ます。 コ ー ド を ス タ ー タ ーサンプル よ り も 拡張 し てい く
にあ た っ ては、 こ の PDFlib チ ュ ー ト リ アルの中の関連す る 内容を知っ てお く べき です。

注 こ の PDFlib チ ュ ー ト リ アルでは多 く の例を Java 言語で示 し ています。 具体的な文法は言


語ご と に異な り ますが、PDFlib プ ログ ラ ミ ングの基本概念はどの言語バイ ンデ ィ ングで も
同 じ です。

PDFlib API リ フ ァ レ ン ス PDFlib API リ フ ァ レ ン スは、すべてのパ ッ ケージに入っ ていて、


PDFlib のアプ リ ケーシ ョ ンプ ロ グ ラ ミ ン グ イ ン タ ーフ ェ イ ス (API) を構成す る すべての
関数 ・ オプシ ョ ン を簡明に記述 し てい ます。 使え る オプシ ョ ンや入力条件な ど従 う べ き プ
ロ グ ラ ミ ン グ規則を調べ る には、 こ の PDFlib API リ フ ァ レ ン ス が絶対の規範です。 PDFlib
を用いて開発を行 う 際には必ず こ の PDFlib API リ フ ァ レ ン ス を使用 し て く だ さ い。

pCOS パス リ フ ァ レ ン ス pCOS イ ン タ ーフ ェ イ ス を利用する と 、 PDF 文書か ら さ ま ざ ま


な特性を ク エ リ ーす る こ と がで き ます。 pCOS は PDFlib+PDI ・ PPS に内蔵 さ れてい ます。
こ の pCOS パ ス リ フ ァ レ ン ス は、PDF 文書内の個々の対象を指 し 示 し てその対応す る 値を
取得す る ために用い ら れ る パ ス文法の説明を内容 と し てい ます。

PDFlib ク ッ ク ブ ッ ク PDFlib ク ッ ク ブ ッ ク は、さ ま ざ ま な タ ス ク のための PDFlib コ ーデ ィ


ン グ断片を何百 も 集めた も のです。 ク ッ ク ブ ッ ク の ト ピ ッ ク 群は Java ・ PHP 用ですが、 簡
単に他のプ ロ グ ラ ミ ン グ言語に合わせて変え る こ と がで き ます。 なぜな ら PDFlib API は、
対応す る すべての言語バ イ ンデ ィ ン グについて等価だか ら です。 こ の PDFlib ク ッ ク ブ ッ
ク は、 以下の URL にあ り ます :
www.pdflib.com/pdflib-cookbook/

pCOS ク ッ ク ブ ッ ク pCOS ク ッ ク ブ ッ ク は、 PDFlib+PDI と PPS に含まれてい る pCOS イ


ン タ ーフ ェ イ ス の Java コ ー ド 断片を集めた も のです。 以下の URL にあ り ます :
www.pdflib.com/pcos-cookbook/

1.2 説明書 と サン プルの案内 17


TET ク ッ ク ブ ッ ク PDFlib TET (Text and Image Extraction Toolkit =テ キ ス ト 抽出ツール
キ ッ ト )は、PDF 文書か ら テ キ ス ト や画像を抽出す る ための別製品です。こ れを PDFlib+PDI
と 組み合わ る と 、 PDF 文書を その内容に応 じ て処理す る こ と がで き ます。 TET ク ッ ク ブ ッ
ク は、TET のための Java と XSLT の コ ー ド 断片を集めてい ます。こ れは、TET と PDFlib+PDI
の組み合わせを演示す る サンプルのグループ を含んでい ます。 た と えば、 ページ上のテ キ
ス ト に応 じ て Web リ ン ク や し お り を追加 し た り 、 検索単語をハ イ ラ イ ト し た り 、 テ キ ス
ト に応 じ て文書を分割 し た り 、 目次を作成 し た り な ど です。 こ の TET ク ッ ク ブ ッ ク は以
下の URL にあ り ます :
www.pdflib.com/tet-cookbook/

18 第 1 章 : は じ めに
1.3 構成の必要事項
以前のバージ ョ ン と 異な り 、 PDFlib 10 では、 特定の操作をす る 際に外部フ ァ イ ルが必要
と な る 場合があ り ます。 こ の必要 と な る フ ァ イ ルは PDFlib のパ ッ ケージに含まれてい ま
す。 こ れ ら の フ ァ イ ルを適切なデ ィ レ ク ト リ ーへ コ ピー し て こ れ ら のデ ィ レ ク ト リ ーへの
ア ク セ ス を構成す る のはユーザー側の役割です。外部フ ァ イ ルへのア ク セ ス を構成す る 方
法は searchpath な どい く つかあ り ますので、 詳 し く は 59 ページ 「3.1.4 リ ソ ース構成 と
フ ァ イ ル検索」 を参照 し て く だ さ い。外部フ ァ イ ルが必要にな る 操作を表 1.1 に挙げます。

表 1.1 構成の必要事項
フ ァ イル 必要な場合
resource/codepage/*.cpg PDF_load_font( ) と 暗黙的フ ォ ン ト 読み込みで レ ガシー 8 ビ ッ ト エ ン コ ーデ ィ ング
iso8859-2 ~ iso8859-16、 cp1250 ~ cp1251、 cp1253 ~ cp1258 のいずれかを用いる
場合 (116 ページ 「5.3.3 シ ングルバイ ト (8 ビ ッ ト ) エ ン コ ーデ ィ ング」 を参照)
resource/font/*.ttf PDF_create_annotation( ) で type=Caret ・ FreeText ・ Line ・ Stamp のいずれかを用い、
し か も font オプ シ ョ ン も template オプ シ ョ ン も与え ない場合。
PDF_fit_pdi_page( ) で useannots (デ フ ォ ル ト で有効です) か usefields を用いて、
フ ォ ーム フ ィ ール ド か上記いずれかの種別の注釈を含んでいるページ を取 り 込み、
し か も その注釈か フ ィ ール ド に体裁ス ト リ ームがない場合。
resource/cmap/* PDF_load_font( ) と 暗黙的フ ォ ン ト 読み込みでいずれかのレ ガシー日中韓エ ン コ ー
デ ィ ング (CMap) を用いる場合。 なお、 こ れら のエ ン コ ーデ ィ ングは廃止済です
(118 ページ 「5.3.4 日本語 ・ 中国語 ・ 韓国語 CMap (廃止済)」 を参照)

1.3 構成の必要事項 19
1.4 PDFlib/PDFlib+PDI/PPS 10.0 の新機能
PDFlib/PDFlib+PDI/PPS 10.0 と Block Plugin 6 の最 も 重要な新機能 と 改良機能を以下概観 し
ます。 他に も 多 く の新機能があ り ますので、 詳 し く は表 1.2 と PDFlib API リ フ ァ レ ン ス を
参照 し て く だ さ い。

カ ラ ー フ ォ ン ト と 絵文字 OpenType カ ラ ーフ ォ ン ト では、 グ リ フ記述で色 と 透過 も 指定


で き ま す。 こ れは特に絵文字 フ ォ ン ト で よ く 使われ ま す。 PDFlib は、 SVG か Microsoft
COLR グ リ フ に基づ く カ ラ ーフ ォ ン ト に対応 し た と と も に、 OpenType 機能 ・ 異体字セ レ
ク タ ー ・ 絵文字異体字シーケ ン ス (個々の絵文字の肌の色や性別を変え た り する ために活
用) に も 対応 し てい ます。

フ ォ ーム フ ィ ール ド と 注釈を PDFlib+PDI で取 り 込み PDFlib+PDI は長 ら く 、ページ内容


のみ を 取 り 込んで、 イ ン タ ラ ク テ ィ ブ要素 を 無視 し て き ま し た。 リ ン ク な ど 注釈種別、
フ ォーム フ ィ ール ド 、 ア ク シ ョ ン、 JavaScript をページ内容 と と も に取 り 込む こ と に よ り 、
イ ン タ ラ ク テ ィ ブ要素の機能を確実に維持する よ う に し ま し た。た と え取 り 込んだページ
を並べ替え て配置 し た り 、 取 り 込んだ複数のページ を出力の 1 ページに配置 し た り し て
も 、 イ ン タ ラ ク テ ィ ブ要素の機能が維持 さ れ ま す。 ページ を拡大縮小 ・ 回転 し た場合に
は、 その中の注釈の長方形 も 然 る べ く 変換 さ れます。 注釈 と フ ォーム フ ィ ール ド の取 り 込
みが PDF/A ・ PDF/UA ・ PDF/X と 互換にな っ てい ます。

注釈 あ ら ゆ る 種類の注釈 (コ メ ン ト ) の作成について、 オーバーホールを行い、 拡張


し 、 かつシ ンプルに し ま し た。 注釈の体裁ス ト リ ームが自動的に生成 さ れ、 PDF/A モー
ド においてその規格が許すかぎ り 注釈がサポー ト さ れます。

フ ォ ーム流 し 込み 取 り 込んだ フ ォ ーム フ ィ ール ド への流 し 込みを で き る よ う に し ま し


た。 た と えば、 取 り 込んだテ キ ス ト フ ォームに内容を書 き 込んだ り で き ます。 取 り 込んだ
フ ォーム フ ィ ール ド の内容 と 体裁 (色 ・ 枠な ど) を変え る こ と も 可能です し 、 元の状態の
ま ま に し てお く こ と も で き ます。

マルチ メ デ ィ ア PDF の ス ク リ ーン注釈 と 表現ア ク シ ョ ン を用いて動画フ ァ イ ル ・ 音声


フ ァ イ ルを利用で き る よ う に し ま し た。 こ れ ら はサ ウ ン ド 注釈 ・ ムービー注釈 よ り も 強力
であ る と と も に、 PDFlib 10 で も Acrobat DC で も も はや対応 し ていない廃止済の Flash テ
ク ノ ロ ジーを必要 と し ない も のです。

PDF 2.0 に対応 PDFlib は、 ISO 32000-2:2017 と 年月入 り 改訂版 ISO 32000-2:2020 に従っ
て PDF 2.0 に対応 し ま し た。 こ れに よ る 新機能は、 タ グ付 き PDF のための新たな構造エ
レ メ ン ト 種別 と ネ ス テ ィ ン グ規則や、 グ ラ フ ィ ッ ク 機能、 暗号化、 イ ン タ ラ ク テ ィ ブ要
素、 文書レベル と ページ レベルの出力 イ ン テ ン ト な ど多岐にわた り ます。 PDFlib+PDI と
PPS も PDF 2.0 文書を処理 し ます。 PDF 2.0 で廃止済 と さ れた機能は PDFlib で も 廃止ま た
は削除 し て あ り ます。

色管理 埋め込み ICC プ ロ フ ァ イ ルを内蔵 し ていない RGB 画像に対 し 、業界標準の sRGB


ICCプ ロ フ ァ イ ルを自動的に適用す る よ う に し ま し た。こ れに よ り 色の再現性が担保 さ れ、
PDF/A ・ PDF/X 文書で RGB 画像を使用で き ます。
透過を有す る PDF ページ と SVG グ ラ フ ィ ッ ク を取 り 込んだ際の色の再現性について
も 、 その場合には透過グループ を自動的に生成す る よ う に し たので、 シ ンプルに担保で き
る よ う にな り ま し た。

20 第 1 章 : は じ めに
PDF 出力の最適化 PDF の ICC プ ロ フ ァ イ ルな ど オブジ ェ ク ト を キ ャ ッ シ ュ し 、 重複を
検出す る よ う に し ま し た。 こ れに よ り 、 内容ス ト リ ームの演算子を減 ら す最適化 と も あい
ま っ て、 PDF の フ ァ イ ルサ イ ズがかな り 小 さ く な り ます。 10 GB を超え る 大 き な PDF 文
書を最適化 ・ 線形化 し つつ生成で き る よ う に し ま し た。

SVG の取 り 込み SVG の処理について、 CSS デ ィ レ ク テ ィ ブな ど い く つかの点を改良 し


ま し た。 リ モー ト の フ ォ ン ト や画像な ど リ ソ ース を ネ ッ ト ワー ク か ら 取 り 寄せ る こ と がで
き ます。

フ ォ ン ト 対応 と テキス ト 処理 カ ラ ーフ ォ ン ト 対応以外の改良点
> WOFF2 形式の フ ォ ン ト を使え る よ う に し ま し た。
> OpenType レ イ ア ウ ト 機能への対応を改良 し ま し た。
> Type 3 フ ォ ン ト の生成を改良 し ま し た。

便利機能 既存の多 く の API メ ソ ッ ド に便利オプシ ョ ン を設け、よ く あ る タ ス ク の手順が


シ ンプルにな る 改良を行い ま し た。 た と えばグ ラ フ ィ ッ ク ス テー ト プ ロ パテ ィ を、 多 く の
API メ ソ ッ ド においてオプシ ョ ンで直接与え る こ と を可能に し ま し たので、gstate オブジ ェ
ク ト を作成 し 適用す る 手間が省け ます。 パス オブジ ェ ク ト を、 テ キ ス ト フ ロ ーや表整形機
能ですでに作成 し て あ る 範囲枠の中に描け る よ う に し ま し た。
デフ ォ ル ト の PDF 出力の互換性は PDF 1.7 拡張レベル 8 です。 こ れは Acrobat X/XI/
DC の フ ァ イ ル形式です。

Pantone® カ ラ ー ラ イ ブ ラ リ ー を ア ッ プデー ト 内蔵の Pantone ス ポ ッ ト カ ラ ーデー タ


ベース について、 ソ リ ッ ド コ ー ト 紙 ・ ソ リ ッ ド 上質紙カ ラ ー ラ イ ブ ラ リ ーへの最新の追加
を カバーす る 拡張を行い ま し た。ヘキサ ク ロ ーム カ ラ ー ラ イ ブ ラ リ ーな ど Pantone, Inc. が
も はやサポー ト し ていない ス ポ ッ ト カ ラ ーについては削除 し て あ り ます。

pCOS イ ン タ ー フ ェ イ ス pCOS イ ン タ ーフ ェ イ ス (PDFlib+PDI ・ PPS に内蔵 さ れてい る )


で PDF の内容を ク エ リ ーで き る 疑似オブジ ェ ク ト を追加 し ま し た。 新た な PDF 規格 ・
フ ォーム フ ィ ール ド ・ 署名 ・ ICC プ ロ フ ァ イ ルな ど です。

タ グ付き PDF と PDF/UA 複数ページにわた っ てい る 表に対 し ては、自動表 タ グ付け機能


が Table エ レ メ ン ト を 1 つだけ タ グ付けす る よ う 修正 し ま し た。 複数行にわた っ てい る リ
ン ク については、 複数の長方形を持つ リ ン ク 注釈を 1 つだけ生成 し ます。 構造エ レ メ ン ト
を テ キ ス ト フ ロ ーの イ ン ラ イ ンで書式オプシ ョ ン と と も に与え る こ と がで き ます。
PDF 2.0 は構造エ レ メ ン ト の関係について厳格なモデルを導入 し ま し た。 PDFlib は新
たな PDF 2.0 の構造種別 と 属性に対応 し てお り 、新た な構造エ レ メ ン ト ネ ス テ ィ ン グ規則
を強制 し ます。 タ グ名前空間 ( タ グセ ッ ト ) と 構造移動先に対応 し てい ます。
タ グのない文書を PDF/UA にページ装飾 と し て取 り 込め る よ う に し ま し たので、PDF/
UA と し て使用で き ない既存の装飾的な内容を シ ンプルに処理で き ます。

PDFlib Personalization Server (PPS) と Block Plugin Acrobat 用 PDFlib Block Plugin につ
いて、 使いやす く す る さ ま ざ ま な改良を行い ま し た。 た と えば、 画面 と プ レ ビ ュ ーで見え
る ブ ロ ッ ク の数を フ ィ ル タ ーで一時的に減 ら せます。ブ ロ ッ ク を小刻みに動かすか大幅に
動かすかを簡単に切 り 替え ら れます。ブ ロ ッ ク のプ ロ パテ ィ を追加 し てオーバープ リ ン ト
設定な ど あ ら ゆ る グ ラ フ ィ ッ ク ス テー ト オプシ ョ ン に対応 さ せ ま し た。 構造エ レ メ ン ト
( タ グ) をブ ロ ッ ク プ ロ パテ ィ と し て利用で き 、 プ レ ビ ュ ーが PDF/UA の転写に対応 し て
い ます。

1.4 PDFlib/PDFlib+PDI/PPS 10.0 の新機能 21


ネ ッ ト ワーキ ン グ リ モー ト の リ ソ ー ス を ネ ッ ト ワ ー ク か ら 取 り 寄せ る こ と の で き る
PDFlib の API メ ソ ッ ド を追加 し ま し た。環境で提供 さ れてい る 手段を使わずに取 り 寄せが
可能です。SVG の処理が、フ ォ ン ト や画像な ど リ モー ト の リ ソ ース を自動的に取得 し ます。

言語バ イ ン デ ィ ン グ すべての言語バ イ ンデ ィ ン グ を最新バージ ョ ンへア ッ プデー ト し


て あ り ます。 Perl ・ PHP ・ Ruby バ イ ンデ ィ ン グはデフ ォ ル ト で UTF-8 有効化 し ま し た。
C++ バ イ ンデ ィ ン グは、C++11 と C++20 で導入 さ れた Unicode 文字列型 u8string/u16string/
u32string に対応 し てい ます。

その他改良 さ ま ざ ま な領域の新機能 :
> Type 3 フ ォ ン ト 内に着色あ り のグ リ フ と な し のグ リ フ を混用可能。
> パ ス オブジ ェ ク ト に書式オプシ ョ ン を追加。

コ ー ド ベース を現代化、 コ ー ド セキ ュ リ テ ィ ー を向上 コ ー ド を レ ビ ュ ー し 、 よ り 堅牢


にす る ため改良 し て あ り ます。 Acrobat の期限切れのバージ ョ ンや RIP への対処な ど不要
な コ ー ド を削除 し ま し た。 廃止済の機能を削除 し た結果、 コ ー ド が小 さ く て ク リ ーンに も
な り ま し た。 PDFlib 内で使用 し てい る 各種のサー ド パーテ ィ ーの ラ イ ブ ラ リ ーについて、
セ キ ュ リ テ ィ ー改良 と 脆弱性保護の恩恵を受け る ために最新バージ ョ ンへア ッ プデー ト
し て あ り ます。

22 第 1 章 : は じ めに
1.5 廃止 ・ 削除 し た メ ソ ッ ド と オ プ シ ョ ン
PDFlib 9 や も っ と 前のバージ ョ ンでは、 数多 く の PDFlib の API メ ソ ッ ド を廃止済 と 宣言
し てお り ま し たが、 API メ ソ ッ ド を削除 し た こ と は こ れま で全 く な く 、 マ イ グ レーシ ョ ン
を考慮 し て残 し て あ り ま し た。 PDFlib 10 では、 PDFlib 9 ない し それ以前のバージ ョ ンで
廃止済 と 宣言 し ていた API メ ソ ッ ド をすべて削除 し ま し た。たいていの場合は単純に 1 対
1 の置き 換え をすれば よ い よ う に し て あ り ます。
同様に、 廃止済のオプシ ョ ン を削除 し て あ り ます。 たいていの場合は機能自体は残 し
て あ り 、 単純に移行先のオプシ ョ ンへ置 き 換えれば よ い よ う に し て あ り ます。
完全にな く し た機能 も あ り ます。 市場で需要がないか (一例 と し て参照 XObject)、 OPI
や Flash な ど PDF 2.0 で廃止済 と 宣言 さ れてい る こ と が理由です。
PDFlib 9 のアプ リ ケーシ ョ ンは、 も し 廃止済の機能を全 く 使用 し ていなければ、 修正
せずに PDFlib 10 で使用で き ます。 御自身のアプ リ ケーシ ョ ンが廃止済の機能を使用 し て
い る 場合には、 PDFlib Migration Guide を御一読下 さ い。 こ の文書には、 廃止 ・ 削除 さ れた
API メ ソ ッ ド と オプシ ョ ンの具体的な一覧 と 、 アプ リ ケーシ ョ ン コ ー ド を ど う 変更す る 必
要があ る かに関す る 説明があ り ます。
PDFlib Migration Guide では、PDFlib 10 へ移行す る 前に PDFlib 9 で廃止済の機能を特定
す る 方法 も 説明 し てい ます。

1.5 廃止 ・ 削除 し た メ ソ ッ ド と オプ シ ョ ン 23
1.6 PDFlib の機能
表 1.2 に挙げ る PDF 生成機能があ り ます。新たな機能 と 改良 し た機能には脚注を付 し てい
ます。 ただ し PDF 出力の改良 (フ ァ イ ルが小 さ く な っ たな ど) と プ ロ グ ラ ミ ン グ便利機
能については個別に挙げてい ません。

表 1.2 PDFlib の機能一覧


分類 機能

各種 PDF PDF 1.4 ~ PDF 1.7 拡張レ ベル 8 ・ PDF 2.01

線形化 (Web 最適化) PDF に よ る、 Web 上でのバイ ト サービ ン グ

大容量出力、 10 GB を超え る PDF フ ァ イルサイ ズ

PDF のための ISO 32000-1 : PDF 1.7 の標準化バージ ョ ン


ISO 規格群 ISO 32000-2 : 年月入 り 改訂版 ISO 32000-2:2020 を含む 1 : PDF 2.0
ISO 15930 : PDF/X-3/4/5。 グ ラ フ ィ ッ ク アー ト 業界向け
ISO 19005-1/2/3 : PDF/A-1/2/3。 アー カ イ ビ ン グ用
ISO 16612-2 : PDF/VT-1。 可変 ・ ト ラ ンザ ク シ ョ ン印刷用
ISO 14289-1 : PDF/UA-1。 ユニバーサルア ク セ シ ビ リ テ ィ ー用

フォン ト TrueType フ ォ ン ト (TTF ・ TTC)


PostScript か TrueType のアウ ト ラ イ ン を持つ OpenType フ ォ ン ト (TTF ・ OTF ・ OTC)

SVG ・ COLR (Microsoft) ・ sbix (Apple) 形式の OpenType カ ラ ー フ ォ ン ト

WOFF ・ WOFF21 フ ォ ン ト (Web Open Font Format = Web オープ ン フ ォ ン ト 形式)

ユーザー定義 (Type 3) フ ォ ン ト によ る ビ ッ ト マ ッ プ ・ ロ ゴ ・ カ ラ ー フ ォ ン ト

欧文 ・ 日中韓テキス ト のための OpenType レ イ アウ ト 機能に対応 1 : 合字 ・ ス モール


キ ャ ッ プ ス ・ オール ド タ イ プ数字 ・ スワ ッ シ ュ キ ャ ラ ク タ ー ・ 簡体 / 繁体 ・ 縦書き字体な

Windows または macOS シ ス テムに イ ン ス ト ール さ れている フ ォ ン ト にア ク セス

フ ォ ン ト の埋め込み と サブ セ ッ ト 化

EUDC ・ SING フ ォ ン ト (グ リ フ レ ッ ト ) によ る日中韓外字キ ャ ラ ク タ ー

フ ォ ールバ ッ ク フ ォ ン ト : 足 り ないグ リ フ を他の フ ォ ン ト のグ リ フへ置き換え

テキス ト 出力 さ ま ざ ま な フ ォ ン ト で テキス ト 出力。 テキス ト に下線 ・ 上線 ・ 取 り 消 し 線

フ ォ ン ト 内のグ リ フ を数値 ・ Unicode 値 ・ グ リ フ名のいずれかで指定可能

カ ーニ ン グによ る文字間隔の改善

異体字セ レ ク タ ー と 絵文字異体字シーケ ン ス 1

テキス ト を太字化 ・ 斜体化 ・ 影付き

パス上テキス ト

柔軟なス タ ン プ メ ソ ッ ド

テキス ト フ ロー組版 テキス ト を、 1 個ない し 複数の長方形内に、 または任意形状領域内に組版。 ハイ フ ネー


シ ョ ン (ユーザー定義ハイ フ ネーシ ョ ン位置が必要)、 フ ォ ン ト と 色の変更、 揃え方式、
タ ブ、 リ ーダー、 制御 コ マ ン ド 、 タ グ 1 を指定可能

言語固有の処理を用いて高度な改行 : 対象は タ イ語な ど

柔軟な画像貼 り 付け ・ 組版

24 第 1 章 : は じ めに
表 1.2 PDFlib の機能一覧
分類 機能

画像または画像の ク リ ッ ピ ングパスにテキス ト を回 り 込み

表組版 さ ま ざ ま なユーザー設定に従 っ て表行 ・ 表列の寸法を自動計算 し て配置する表組版機能。


複数ページにわた る表も 可能。

表セル内にテキス ト ・ 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ ・ パスオブ ジ ェ ク ト ・ 注釈 ・


フ ォ ーム フ ィ ール ド を配置可能

表セルを、 枠線 ・ 背景色オプ シ ョ ン を指定 し て組版可能

貼 り 付け画像な ど各種オブ ジ ェ ク ト の座標を参照する範囲枠の概念

インタ ラ クテ ィ ブ フ ォ ーム フ ィ ール ド 1 : すべての フ ィ ール ド オプ シ ョ ン と JavaScript を設定可能


要素

PDF の注釈 1 ( コ メ ン ト ) : PDF リ ン ク ・ 起動 リ ン ク (他の文書種別) ・ Web リ ン ク な ど

PDF 2.0 の注釈の属性 : 不透明な ど 1


長方形でない注釈、 複数の長方形を持つ リ ン ク注釈 1

し お り ・ 注釈 ・ ページ を開 く / 閉 じ る な ど各種イ ベン ト に対する ア ク シ ョ ン を作成


し お り を作成。 さ ま ざ ま なオプ シ ョ ン ・ 制御を設定可能

ページ遷移効果 (シ ェ ー ド ・ モザイ ク な ど)

リ ン ク ・ し お り ・ 文書を開 く ア ク シ ョ ンに名前付き移動先

ページ ラ ベル (ページのシ ンボ リ ッ ク名) を作成

マルチ メ デ ィ ア PDF 内に 3D ア ニ メ ーシ ョ ン を埋め込み、 それを JavaScript で制御

音声 と 動画を埋め込み、 または外部フ ァ イルか Web サーバーを参照 : ス ク リ ーン注釈 と 表


現ア ク シ ョ ン を使用 1

国際化 基本多言語面 (BMP) 外の追加キ ャ ラ ク タ ーを含む Unicode 14、 Unicode 正規形に対応


日本語 ・ 中国語 ・ 韓国語テキス ト のための日中韓 フ ォ ン ト

日中韓異体字グ リ フのための表意文字異体字シーケ ン ス (IVS)

日本語 ・ 中国語 ・ 韓国語テキス ト の縦書き

ア ラ ビ ア語 ・ タ イ語 ・ デーヴ ァ ナーガ リ ーな どの複雑用字系のキ ャ ラ ク タ ーシ ェ ーピ ング

ア ラ ビ ア語 ・ ヘブ ラ イ語な どの右書き用字系の双方向テキス ト 組版
SVG ベ ク ト ル SVG 形式のベ ク ト ル画像を取 り 込み。 SVG ・ CSS1 ・ ネ ッ ト ワー ク リ ソ ース 1 内の ICC プ ロ
グラ フ ィ ッ ク フ ァ イル、 CMYK ・ スポ ッ ト カ ラ ー

画像 BMP ・ GIF ・ PNG ・ TIFF ・ JBIG2 ・ JPEG ・ JPEG 2000 ・ CCITT ラ ス タ ー画像を読み込み

画像情報を ク エ リ ー (ピ ク セル寸法 ・ 解像度 ・ ICC プ ロ フ ァ イル ・ ク リ ッ ピ ングパスな ど)

TIFF ・ JPEG 画像内の ク リ ッ ピ ン グパス を使用

TIFF ・ PNG 画像内のアル フ ァ チ ャ ン ネル (透過) を使用

画像マス ク (透過画像に色を適用)、 スポ ッ ト または DeviceN カ ラ ーを用いて画像に着色

色 グ レースケール ・ RGB (数値 ・ 16 進 ・ HTML カ ラ ー名) ・ CMYK ・ CIE L*a*b* カ ラ ー

PANTONE® (PANTONE+ も) ・ HKS® スポ ッ ト カ ラ ー内蔵 1

プ ロ セス またはスポ ッ ト カ ラ ーに基づ く DeviceN (n 色) 色空間

1.6 PDFlib の機能 25


表 1.2 PDFlib の機能一覧
分類 機能

ユーザー定義スポ ッ ト カ ラ ー

複数のプ ロ セス カ ラ ーまたはスポ ッ ト カ ラ ーの間のカ ラ ーシ ェ ーデ ィ ング (スムーズ


シ ェ ーデ ィ ング)。 パ タ ーン塗 り ・ 描線

色管理 ICC プ ロ フ ァ イルによ る ICC ベース カ ラ ー 1

テキス ト ・ 図形 ・ ラ ス タ ー画像のレ ン ダ リ ング イ ン テ ン ト

ICC プ ロ フ ァ イルを埋め込むか外部参照 し て PDF 2.0 ・ PDF/A ・ PDF/X での出力イ ン テ ン


ト と し て使用

多色 (xCLR) PDF/X-5n で外部参照出力イ ン テ ン ト ICC プ ロ フ ァ イル

PDF 2.0 の文書レ ベルまたはページ レ ベルの出力イ ン テ ン ト ICC プ ロ フ ァ イル

アー カ イ ビ ング PDF/A-1a/1b ・ PDF/A-2a/b/u ・ PDF/A-3a/b/u : XMP 拡張スキーマ を含む

グ ラ フ ィ ッ ク アー ト PDF/X-3 ・ PDF/X-4 ・ PDF/X-4p ・ PDF/X-5n


オーバープ リ ン ト ・ テキス ト ノ ッ ク アウ ト ・ 黒点補償 1 な どの設定

ア ク セシ ビ リ テ ィ ー タ グ付き PDF に よ る ア ク セシ ビ リ テ ィ ー
注釈 ・ フ ォ ーム フ ィ ール ド な ど イ ン タ ラ ク テ ィ ブ要素の タ グ付け 1

表 1 ・ ページ装飾の自動 タ グ付け

PDF/UA-1 に よ るユニバーサルア ク セシ ビ リ テ ィ ー

テキス ト フ ロー内の タ グ付け 1


1
PDF 2.0 の タ グ名前空間 ( タ グセ ッ ト )
PDF 2.0 の構造種別 ・ 属性 ・ タ グネス テ ィ ング規則 1
1
構造移動先、 すなわち、 特定の構造エ レ メ ン ト を指す リ ン ク

可変文書印刷 可変 ・ ト ラ ンザ ク シ ョ ン印刷のための PDF/VT-1


(VDP)

ベク ト ル 一般的な基本ベ ク ト ルグ ラ フ ィ ッ ク 要素 1 : 線 ・ 曲線 ・ 円弧 ・ 楕円 ・ 長方形な ど
グラ フ ィ ッ ク

透過 (不透明) ・ ブ レ ン ド モー ド

再利用可能なパスオブ ジ ェ ク ト 1、 ク リ ッ ピ ン グパス を画像から 取 り 込み

レ イ ヤー 表示を切 り 替え られる オプ シ ョ ナルなページ内容

注釈 ・ フ ォ ーム フ ィ ール ド を レ イ ヤー上に配置可

セキ ュ リ テ ィ ー PDF 文書または添付を暗号化

Unicode パスワー ド

印刷不可 ・ コ ピー不可な ど、 文書権限設定の指定

地理参照付き PDF 地理空間参照情報を持つ PDF

メ タ デー タ 文書情報 : 標準 フ ィ ール ド ( タ イ ト ル ・ サブ タ イ ト ル ・ 作成者 ・ キーワー ド ) ・ ユーザー


定義 フ ィ ール ド
XMP メ タ デー タ を文書情報 フ ィ ール ド と 同期

ユーザー定義のカ ス タ ム XMP メ タ デー タ

26 第 1 章 : は じ めに
表 1.2 PDFlib の機能一覧
分類 機能

TIFF ・ JPEG ・ JPEG 2000 ・ SVG グ ラ フ ィ ッ ク内の XMP 画像 メ タ デー タ を処理

プ ログ ラ ミ ング C ・ C++ ・ Java ・ .NET ・ Objective-C ・ Perl ・ PHP ・ Python ・ RPG ・ Ruby の言語バイ ンデ ィ ン
グ1
1
イ ン タ ーネ ッ ト か ら コ ン テ ン ツ を ダウ ン ロー ド するヘルパー メ ソ ッ ド

仮想 フ ァ イルシ ス テムに よ る イ ン メ モ リ ー処理 (デー タ ベースの画像処理な ど)

PDF 文書をデ ィ ス ク フ ァ イルか直接 メ モ リ ー上へ生成

埋め込みシ ス テム 埋め込みシ ス テムのための、 必要 リ ソ ース を削減 し た PDFlib Mini Edition (ME)

1. PDFlib 10 の新機能ま たはかな り 改良 し た機能

1.6 PDFlib の機能 27


1.7 PDFlib+PDI と pCOS イ ン タ ー フ ェ イ スの追加的
機能
PDFlib+PDI と PPS には、 表 1.2 に示 し た基本的な PDF 生成機能に加え て、 表 1.3 に挙げ
る 機能があ り ます。

表 1.3 PDFlib+PDI の追加的機能


分類 機能

PDF 入力 (PDI) 既存 PDF 文書か ら ページ を取 り 込む

PDF 2.0 ま でのすべてのバージ ョ ンの PDF を取 り 込み可能

ア ク シ ョ ン を含む注釈 と フ ォ ーム フ ィ ール ド を取 り 込み1。 注釈の長方形を、 配置 し た


ページに合わせて変換、 すなわち拡大縮小 ・ 回転。 リ ン ク注釈の機能を、 ページ を並べ替
えて も維持

取 り 込んだ フ ォ ーム フ ィ ール ド に流 し 込み 1

暗号化文書を取 り 込み
複数の取 り 込まれた PDF 文書にわた る冗長なオブ ジ ェ ク ト (同一フ ォ ン ト な ど) を削除

異常な入力 PDF 文書を修復

取 り 込まれた PDF 文書から PDF/A ・ PDF/X 出力イ ン テ ン ト を コ ピー


タ グ付き PDF コ ン テ ン ツ集約 : タ グ付き PDF 文書のページ群を、 構造エ レ メ ン ト 群を含
めて取 り 込み

レ イ ヤー定義 (オプ シ ョ ナルな内容) を取 り 込み

非常に大き な文書から 内容を取 り 込む際のパフ ォ ーマ ン ス向上 1

pCOS pCOS イ ン タ ー フ ェ イ ス を用いて PDF 文書 ・ ページに関する詳細を ク エ リ ー


イ ン ターフ ェ イス

PDF 規格 ・ フ ォ ーム フ ィ ール ド ・ 署名 ・ ICC プ ロ フ ァ イルな ど PDF の詳細を ク エ リ ーする


ための追加的な pCOS 疑似オブ ジ ェ ク ト 1

1. PDFlib+PDI 10 の新機能

28 第 1 章 : は じ めに
1.8 PPS と Block Plugin の追加的機能
PDFlib Personalization Server (PPS) でのみ、 表 1.2 に示 し た基本的な PDF 生成機能 と 、 表
1.3 に示 し た PDF 取 り 込み機能に加えて、 表 1.4 に挙げ る 機能 も 利用可能です。

表 1.4 PDFlib Personalization Server (PPS) の追加的機能


分類 機能

可変文書印刷 PDF をパー ソ ナ ラ イ ズ : PDFlib ブ ロ ッ ク にテキス ト ・ 画像 ・ PDF デー タ ・ SVG ベ ク ト ルグ


(VDP) ラ フ ィ ッ ク を流 し 込み

PPS を用いて PDFlib ブ ロ ッ ク を プ ログ ラ ム的に作成

取 り 込まれた文書から PDFlib ブ ロ ッ ク を コ ピー

PDFlib Block Plugin PDFlib Block Plugin で、 Windows ・ macOS 版 Acrobat 上で PDFlib ブ ロ ッ ク を対話的に作成

PPS ブ ロ ッ ク 流 し 込みを Acrobat 上で プ レ ビ ュ ー

表示 ・ プ レ ビ ュ ーする ブ ロ ッ ク を、 ブ ロ ッ クの名称 ・ 種別 ・ 寸法 ・ 位置に基づいて フ ィ ル


タ ー1

ブ ロ ッ ク を プ レ ビ ュ ー フ ァ イルへコ ピー

Acrobat 上で ブ ロ ッ ク を対話的に作成 ・ 編集する際のスナ ッ プグ リ ッ ド

ブ ロ ッ ク を小幅または大幅に動か し て、 シ ン プルながら 正確な位置合わせ 1

オーバープ リ ン ト 設定な どすべてのグ ラ フ ィ ッ ク ス テー ト プ ロパテ ィ を ブ ロ ッ ク プ ロパ


テ ィ と し て利用可能 1

ブ ロ ッ ク コ ン テナの PDF/A ・ PDF/UA ・ PDF/X ス テー タ ス を転写

PDF フ ォ ーム フ ィ ール ド を PDFlib ブ ロ ッ ク に変換 し て、 自動流 し 込み可能に


テキス ト フ ローブ ロ ッ ク を連結 し て、 ブ ロ ッ ク であふれたテキス ト を次のブ ロ ッ ク へ

ブ ロ ッ ク プ ラ グ イ ンに PANTONE® ・ HKS® スポ ッ ト カ ラ ー名を内蔵 1

ブ ロ ッ クの内容に タ グ付け 1

1. Block Plugin 6 の新機能 ・ 改良機能

1.8 PPS と Block Plugin の追加的機能 29


1.9 製品別機能一覧
PDFlib フ ァ ミ リ ーの ど の製品に ど の機能があ る か を表 1.5 に具体的に挙げます。

表 1.5 製品別機能一覧

PDFlib+PDI
PDFlib

PPS
機能 API メ ソ ッ ド ・ オプ シ ョ ン
基本的な PDF 生成 以下に挙げる もの以外すべて ○ ○ ○
1
線形化 (Web 最適化) PDF PDF_begin_document( ) の linearize オプ シ ョ ン ○ ○ ○

PDF を最適化 (効果的で ない ク ラ イ ア ン PDF_end_document( ) の optimize オプ シ ョ ン ○1 ○ ○


ト コ ー ド と 、 最適化 さ れていない取 り 込
み PDF 文書に対 し て)

PDF/A 準拠のために添付を解析 PDF/A-2 モー ド において PDF_load_asset( ) で ○1 ○ ○


type=Attachment を使用

ポー ト フ ォ リ オ作成のために PDF 文書を PDF_add_portfolio_file( ) の password オプ シ ョ ン ○1 ○ ○


解析

既存の PDF 文書を取 り 込み すべての PDI 関数 ― ○ ○

pCOS を用いて PDF から 情報を ク エ リ ー すべての pCOS 関数 ― ○ ○

ブ ロ ッ ク に可変デー タ を流 し 込み PDF_fill_*block( ) ― ― ○
ブ ロ ッ ク を プ ログ ラ ム的に作成 PDF_poca_new( ) : オプ シ ョ ン usage=blocks ― ― ○
PDF_begin/end_page_ext( ) : オプション blocks

ブ ロ ッ ク を生成出力へ コ ピー PDF_process_pdi( ) : オプ シ ョ ン ― ― ○
action=copyblock ま たは action=copyallblocks

PPS で利用する ための PDFlib ブ ロ ッ ク を Acrobat 用 PDFlib Block Plugin ― ― ○


対話的に作成

1. こ の機能には内部的に PDI を必要 と するので、 PDFlib ソ ース コ ー ド パ ッ ケージ では利用で き ません

30 第 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++ ラ ン タ イム ラ イ ブ ラ リ ーに対 し てア プ リ ケーシ ョ ン
が明示的に リ ン ク さ れていない限 り 、 未解決の外部参照エ ラ ーが出る可能性があ り ます。

C におけ る エ ラ ー処理 PDFlib は、 try ~ catch 節に よ る 構造化例外処理に対応 し てい ま


す。 ですので、 C と C++ の ク ラ イ ア ン ト では、 PDFlib で発生 し た例外を キ ャ ッ チ し て、 そ
の例外に対 し て適切に反応する こ と がで き ます。 catch 節で ク ラ イ ア ン ト は、 問題の正 し
い性質を記 し た文字列 と 、 一意な例外番号 と 、 例外を発生 さ せた PDFlib API メ ソ ッ ド の名
前 と を得 る こ と がで き ます。 例外処理を持つ PDFlib C ク ラ イ ア ン ト プ ロ グ ラ ムの一般的
構造は以下の よ う にな り ます :
PDF *p;

/* 新規PDFlibオブジェクトを作成 */
if ((p = PDF_new()) == (PDF *) 0)
{
printf("PDFlibオブジェクトを作成できませんでした(メモリー不足)\n");
return(2);
}
PDF_TRY(p)
{
...PDFlib命令群...
}
PDF_CATCH(p)
{
printf("PDFlib例外が発生しました:\n");
printf("[%d] %s: %s\n",
PDF_get_errnum(p), PDF_get_apiname(p), PDF_get_errmsg(p));
PDF_delete(p);
return(2);
}

PDF_delete(p);

2.1 C バイ ンデ ィ ング 31
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) /* 外側のcatchブロック */
{
/* さらにエラーをクリーンアップ */

32 第 2 章 : PDFlib の言語バイ ンデ ィ ング
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 を必要時にのみ読み込みたい場合に有用です。 PDFlib では こ の
よ う な動的な利用法を可能にす る ための し く みを特に設けて あ り ます。 こ れは以下の規則
に し たがっ て動作 し ます (hellodl.c サンプルを例に示 し ます) :
> 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 を コ ンパ イ ル し て、 アプ リ ケーシ ョ ン を それに リ ン ク さ せ
る。
Linux で静的 ラ イ ブ ラ リ ーか ら 共有 ラ イ ブ ラ リ ーを作成す る には、 以下の コ マ ン ド を利用
し ます :
mkdir tmp
cd tmp
ar x ../libpdf.a
g++ -shared -o libpdf.so *

こ れで共有 ラ イ ブ ラ リ ーがで き ますので、 アプ リ ケーシ ョ ン を C++ ラ ン タ イ ム ラ イ ブ ラ


リ ーに リ ン ク す る 必要は も う あ り ません。

2.1 C バイ ンデ ィ ング 33
C で Unicode 文字列 文字列を初期化す る には以下の方法があ り ます :
> 対応す る サ ロ ゲー ト ペア(UTF-16 符号単位が 2 つ)を 4 バ イ ト と し て ビ ッ グエンデ ィ ア
ンのバ イ ト 順序で与え る :
PDF_fit_textline(p, "\x3C\xD8\xCF\xDC", 4, 100, 100,
"fontname=EmojiOneColor textformat=utf16be fontsize=50");

あ る いはバ イ ト 列は リ ト ルエンデ ィ ア ンのバ イ ト 順序で与え る こ と も で き ます :


PDF_fit_textline(p, "\xD8\x3C\xDC\xCF", 4, 100, 100,
"fontname=EmojiOneColor textformat=utf16le fontsize=50");

> PDFlib 文字参照 (122 ページ 「5.4.2 文字参照」 を参照) は、 開発環境か ら 独立であ り 、
以下の よ う に charref オプシ ョ ン を用いて有効化で き ます :
PDF_fit_textline(p, "&#x1F0CF;", 0,
100, 100, "charref=true fontname=EmojiOneColor fontsize=50");

34 第 2 章 : PDFlib の言語バイ ンデ ィ ング
2.2 C++ バ イ ン デ ィ ン グ
C++ のためのオブジ ェ ク ト 指向な ラ ッ パーを PDFlib ク ラ イ ア ン ト か ら 利用可能です。 こ
れは pdflib.hpp ヘ ッ ダーフ ァ イ ルを必要 と し てお り 、 ま た こ の フ ァ イ ルは pdflib.h を イ ン
ク ルー ド し てい ます。 テ ンプ レー ト 駆動な PDFlib イ ン タ ーフ ェ イ ス は、 PDFlib と デー タ
をや り 取 り す る ための文字列型を複数サポー ト し てい ます。

wstring に基づ く デ フ ォ ル ト イ ン タ ー フ ェ イ ス API のすべての文字列に対 し て、 C++ の


std::wstring 型の文字列が使用 さ れ ます。 後述の型のいずれか を選択 し ていない限 り は こ
れがデフ ォ ル ト の文字列型です。
こ のデフ ォ ル ト イ ン タ ーフ ェ イ ス では、 PDFlib メ ソ ッ ド と や り 取 り す る すべての文字
列はネ イ テ ィ ブの wstring であ る と 前提 し ます。 wstring の内容は、 wchar_t デー タ 型のサ
イ ズに よ っ て、 UTF-16 (2 バ イ ト キ ャ ラ ク タ ー群) か UTF-32 (4 バ イ ト キ ャ ラ ク タ ー群)
の ど ち ら かで符号化 さ れた Unicode 文字列であ る と 見な さ れます。 ソ ース コ ー ド 内の リ テ
ラ ル文字列については、 ワ イ ド 文字列であ る こ と を示すには接頭辞 L をつけ る 必要があ り
ます。 wstring リ テ ラ ルを初期化す る には以下の方法があ り ます :
> Unicode コ ー ド 点を、接頭辞 \u と 16 進 4 桁か、接頭辞 \U と 16 進 8 桁で与え る 。後者では、
有効な キ ャ ラ ク タ ーの頭 3 桁は必ず 0 と な り ます (サ ロ ゲー ト ペアには対応 し てい ま
せん) :
wstring unistring = L"\U0001F0CF";

> Unicode キ ャ ラ ク タ ーを ソ ース コ ー ド 内で直接与え て、その ソ ース フ ァ イ ルを UTF-8 や


UTF-16 な ど然 る べ き Unicode エン コ ーデ ィ ン グで保存。 こ の ソ ース のエン コ ーデ ィ ン
グ を コ ンパ イ ラ ーに伝え てお く 必要があ り ます。 た と えば GCC では UTF-8 が ソ ース
フ ァ イ ルのデフ ォ ル ト エ ン コ ーデ ィ ン グですが、 他のエ ン コ ーデ ィ ン グ を コ マ ン ド ラ
イ ン オ プ シ ョ ン で -finput-charset=UTF-16LE な ど と 指定す る こ と も 可能です。 Visual
Studio の場合はオプシ ョ ンは /source-charset:utf-8 な ど と な り ます。
> PDFlib 文字参照 (122 ページ 「5.4.2 文字参照」 を参照) は、 開発環境か ら 独立であ り 、
以下の よ う に charref オプシ ョ ン を用いて有効化で き ます :
p.fit_textline(L"&#x1F0CF;",
100, 100, "charref=true fontname=EmojiOneColor fontsize=50");

hello サンプルな ど C++ のサンプルではすべて、デフ ォ ル ト の std::wstring イ ン タ ーフ ェ イ


ス を使っ た例を示 し てい ます。

注 こ の wstring イ ン タ ー フ ェ イ スは IBM Z シ ス テムでは使え ません。 かわ り に u16string/


u32string イ ン タ ー フ ェ イ ス を使用 し て く だ さ い (以下を参照)

u8string/u16string/u32string に基づ く オ プ シ ョ ナルな UTF-8/UTF-16/UTF-32 イ ン タ ー


フ ェ イ ス std::u16string ・ std::u32string 型は最低 C++11 が必須であ り 、 std::u8string 型は
C++20 が必須です。 こ れ ら の イ ン タ ーフ ェ イ スは Unicode キ ャ ラ ク タ ー群を UTF-8・UTF-
16 ・ UTF-32 のいずれかの形式で保管 し ます。 こ れ ら を有効化す る には、 pdflib.hpp を イ
ン ク ル ー ド す る 前 に、 PDFLIB_CPP_U8STRING ・ PDFLIB_CPP_U16STRING ・ PDFLIB_CPP_
U32STRING マ ク ロ のいずれか 1 つを設定 し ます。 それ ら の使用例を hello_u8string ・ hello_
u16string ・ hello_u32string サンプルで示 し てい ます。

2.2 C++ バイ ンデ ィ ング 35
string に基づ く オ プ シ ョ ナルな UTF-8 イ ン タ ー フ ェ イ ス C++ のすべてのバージ ョ ンが
std::string 型をサポー ト し てい ます。 こ の イ ン タ ーフ ェ イ ス を有効化する には、 pdflib.hpp
を イ ン ク ルー ド す る 前に、PDFLIB_CPP_STRING マ ク ロ を設定 し ます。u8string イ ン タ ーフ ェ
イ ス と 異な り 、 こ の文字列型には UTF-8 コ ンパ イ ラ ーサポー ト があ り ません。 UTF-8 列
を持つ文字列を適切に作成 ・ 解釈す る のは ク ラ イ ア ン ト コ ー ド 側の役割です。
こ の UTF-8 ベース の std::string イ ン タ ーフ ェ イ ス の使用例を hello_string サンプルで示
し てい ます。

C++ におけ る エ ラ ー処理 PDFlib API メ ソ ッ ド は、 エ ラ ー発生時には C++ 例外を発生 さ


せます。 こ の例外は ク ラ イ ア ン ト コ ー ド 内で C++ の try ~ catch 節を用いて キ ャ ッ チ さ れ
る 必要があ り ます。 詳細なエ ラ ー情報提供のため、 PDFlib ク ラ ス にはパブ リ ッ ク ク ラ ス
PDFlib::Exception があ り ます。 こ のパブ リ ッ ク ク ラ ス は、 詳 し いエ ラ ー メ ッ セージ取得の
ための メ ソ ッ ド と 、 例外番号取得のための メ ソ ッ ド と 、 例外を発生 さ せた API メ ソ ッ ド の
名前を取得す る ための メ ソ ッ ド と を公開 し てい ます。
PDFlib ルーチンが発生 さ せ る C++ 準拠の例外は規則どお り に動作 し ます。 以下の コ ー
ド 断片は、 PDFlib が発生 さ せた例外を キ ャ ッ チ し ます :
try {
PDFlib p;
...PDFlib命令群...
catch (PDFlib::Exception &ex) {
wcerr << L"PDFlib例外が発生しました: " << endl
<< L"[" << ex.get_errnum() << L"] " << ex.get_apiname()
<< L": " << ex.get_errmsg() << endl;
}

実行時に読み込まれる DLL と し て PDFlib を利用 C++ バ イ ンデ ィ ン グでは、 PDFlib を自


分のアプ リ ケーシ ョ ン に実行時に結合 さ せ る こ と も で き ます (33 ページ 「実行時に読み
込まれ る DLL と し て PDFlib を利用」 を参照)。 動的読み込みは、 pdflib.hpp を イ ン ク ルー
ド す る アプ リ ケーシ ョ ンモジ ュ ールを コ ンパ イ ルす る 際に、以下の よ う に し て有効にす る
こ と がで き ます :
#define PDFCPP_DL 1

こ れに加え て、 追加モジ ュ ール pdflibdl.c を コ ンパ イ ル し て、 で き る オブジ ェ ク ト フ ァ イ


ルに自分のアプ リ ケーシ ョ ン を リ ン ク さ せ る 必要があ り ます。動的読み込みの詳細は こ の
PDFlib オブジ ェ ク ト 内に隠蔽 さ れてい ますので、 こ れは C++ API に影響を与え ません : す
べての メ ソ ッ ド 呼び出 し は、動的読み込みが有効に さ れてい る か否かにかかわ ら ず同 じ に
見え ます。

36 第 2 章 : PDFlib の言語バイ ンデ ィ ング
2.3 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=. hello

こ のプ ロ パテ ィ の値をチ ェ ッ ク す る には以下の よ う に し ます :
System.out.println(System.getProperty("java.library.path"));

上記に加え、 プ ラ ッ ト フ ォームに よ っ て以下の手順を行 う 必要があ り ます :


> Unix : libpdflib_java.so ラ イ ブ ラ リ ー (macOS の場合 : libpdflib_java.jnilib) は、 共有 ラ
イ ブ ラ リ ーのためのデフ ォ ル ト 格納場所の う ちのいずれかに置 く か、 適切に設定 し た
デ ィ レ ク ト リ ーに置 く 必要があ り ます。
> Windows:pdflib_java.dll ラ イ ブ ラ リ ーは、Windows のシ ス テ ムデ ィ レ ク ト リ ーに置 く か、
PATH 環境変数で列挙 さ れたデ ィ レ ク ト リ ーに置 く 必要があ り ます。

Java におけ る エ ラ ー処理 Java バ イ ンデ ィ ン グは、 PDFlib のエ ラ ーを ネ イ テ ィ ブ Java 例


外に翻訳 し ます。 例外が起 き る と PDFlib は PDFlibException ク ラ ス のネ イ テ ィ ブ Java 例外
を発生 さ せます。 こ の Java 例外は通常の try/catch 技法で処理で き ます :
try {
p = new pdflib();
...PDFlib命令群...

} catch (PDFlibException e) {
System.err.println("PDFlib例外が発生しました:");
System.err.println("[" + e.get_errnum() + "] " + e.get_apiname() +
": " + e.get_errmsg());

} catch (Exception e) {
System.err.println(e);

} finally {
if (p != null) {
p.delete(); /* PDFlibオブジェクトを削除 */
}
}

2.3 Java バイ ンデ ィ ング 37
PDFlib は適切な throws 節を宣言 し ますので、 ク ラ イ ア ン ト の コ ー ド では、 起 こ り う る す
べての PDFlib 例外を キ ャ ッ チす る か、 それ ら を自分で宣言 し なければな り ません。

Java で Unicode 文字列 Java の String オブジ ェ ク ト は UTF-16 形式の文字列を表現 し て


い ます。 ですので、 BMP 外の、 すなわち U+FFFF を超え る Unicode 値についてはサ ロ ゲー
ト ペア と し て表現する 必要があ り ます。BMP外のUnicode コ ー ド 点を 1個のcharかCharacter
で表す こ と はで き ません。 文字列を初期化する には以下の方法があ り ます :
> Unicode コ ー ド 点を int 値 と し て与え て、 それを String へ変換 :
String unistring = new String(Character.toChars(0x1F0CF));

> 対応す る サ ロ ゲー ト ペア (UTF-16 符号単位が 2 つ) を与え る :


String unistring = new String("\uD83C\uDCCF");

> Unicode キ ャ ラ ク タ ーを ソ ース コ ー ド 内で直接与えて、その ソ ース フ ァ イ ルを UTF-8 や


UTF-16 な ど然 る べ き Unicode エン コ ーデ ィ ン グで保存。 こ の ソ ース のエン コ ーデ ィ ン
グ を コ ン パ イ ラ ーに伝 え て お く 必要が あ り ま す。 そ の た め に は javac オ プ シ ョ ン
encoding="utf8" で直接伝え る か、 あ る いは IDE で適切な設定に よ っ て伝え ます。
> PDFlib 文字参照 (122 ページ 「5.4.2 文字参照」 を参照) は、 開発環境か ら 独立であ り 、
以下の よ う に charref オプシ ョ ン を用いて有効化で き ます :
p.fit_textline("&#x1F0CF;",
100, 100, "charref=true fontname=EmojiOneColor fontsize=50");

PDFlib の Javadoc 仕様書 PDFlib パ ッ ケージには、PDFlib の Javadoc 仕様書が含まれてい


ます。 こ の Javadoc は、すべての PDFlib API メ ソ ッ ド の短い記述 し か含んでい ませんので、
詳 し く は PDFlib API リ フ ァ レ ン ス を参照 し て く だ さ い。
PDFlib の Javadoc を Eclipse で設定する には以下の よ う に操作 し ます :
> パ ッ ケージ ・ エ ク ス プ ロ ー ラ ーで Java プ ロ ジ ェ ク ト を右 ク リ ッ ク し 、 「Javadoc ロ ケー
シ ョ ン」 を選択 し ます。
> 「ブ ラ ウズ ...」 を ク リ ッ ク し て、Javadoc が置かれてい る パ ス (PDFlib パ ッ ケージに含ま
れてい ます) を選びます。

こ の手順をふめば、 「Java 参照」 パースペ ク テ ィ ブや 「ヘルプ」 メ ニ ュ ーな ど で PDFlib の


Javadoc をブ ラ ウ ズで き る よ う にな り ます。

38 第 2 章 : PDFlib の言語バイ ンデ ィ ング
2.4 .NET バ イ ン デ ィ ン グ
注 こ の .NET バイ ンデ ィ ングは、対応 し てい るすべてのプ ラ ッ ト フ ォ ームのための汎用のパ ッ
ケージ と し て提供 さ れます。 ただ し 、 それで も、 プ ラ ッ ト フ ォ ームご と の ラ イ セ ン スキー
が必要であ り 、 こ のラ イ セ ン ス を他のプ ラ ッ ト フ ォ ームへ転用する こ と はで き ません。

.NET バ イ ンデ ィ ン グの一般的特性を表 2.1 に挙げます。

表 2.1 .NET バイ ンデ ィ ングの一般的特性


トピック .NET バイ ンデ ィ ン グの実装

.NET 対応 .NET Standard 2.0 以上。 例 : .NET Core 2/3, ・ .NET 5/6

.NET Framework 対応 .NET Framework 4.6.1 以上


タ ーゲ ッ ト プ ラ ッ ト フ ォ ー Windows ・ Linux ・ macOS。 プ ラ ッ ト フ ォ ーム/アーキテ ク チ ャ ーの組み合わ
ム せの正確な一覧については system-requirements.txt を参照 し て く だ さ い

ダウン ロー ド パ ッ ケージ すべての対応プ ラ ッ ト フ ォ ームのためのユニバーサル zip パ ッ ケージ

パ ッ ケージ内容 NuGet パ ッ ケージにマネージ ド と ネ イ テ ィ ブのラ イ ブ ラ リ ー、 説明書、 サン


プルを包含

実装 マネージ ド コ ー ド を持つ C# アセ ン ブ リ ー PDFlib_dotnet.dll と 、 ネ イ テ ィ


ブ コ ー ド を持つプ ラ ッ ト フ ォ ーム固有の共有 ラ イ ブ ラ リ ー PDFlib_dotnet_
native.[dll|so|dylib]

.NET 統合 明示的 PInvoke を通 じ た C# Interop

バージ ョ ニ ング方式 バージ ョ ニ ング方式は .NET の規則に準拠。 .NET バージ ョ ン番号は、 NuGet
キ ャ ッ シ ュや .csproj プ ロ ジ ェ ク ト フ ァ イルの中で見る こ と がで き ます。 こ
れは製品の メ ジ ャ ー と マ イ ナーの リ リ ース番号 と は異な っ ています。 両方の
バージ ョ ニ ング方式の間のマ ッ ピ ン グは compatibility.txt にあ り ます。

PDFlib.NET を イ ン ス ト ール 製品は NuGet パ ッ ケージ と し て与え ら れてお り 、 そのパ ッ


ケージ名はバージ ョ ン番号を含んでい ます。 内部的には .NET 用パ ッ ケージは .NET の規
則に従っ た セマ ン テ ィ ッ ク なバージ ョ ン を使用 し てい ま す。 結果 と し て、 内部的なバー
ジ ョ ン番号は、 通常の製品のバージ ョ ン番号 と は異な っ てい ます。 両方の付番方式に対す
る マ ッ ピ ン グ テーブルが compatibility.txt にあ り ます。
こ の NuGet パ ッ ケージ を ロ ーカルに イ ン ス ト ールす る には以下のいずれかの方式を用
い ます :
> dotnet コ マ ン ド ラ イ ン ツール (全プ ラ ッ ト フ ォーム)。 こ の方式については次項で詳説
し ます。
> Visual Studio の Package Manager UI (Windows ・ macOS)
> Visual Studio の Package Manager Console (Windows)
> nuget コ マ ン ド ラ イ ン ツール (全プ ラ ッ ト フ ォーム)

提供 し てい る サンプル群のためのプ ロ ジ ェ ク ト フ ァ イ ル群は、 タ ーゲ ッ ト フ レーム ワー ク


.NET Core 3.1 に対 し て作成 さ れて い ま す ( タ ーゲ ッ ト フ レ ー ム ワ ー ク モ ニ カ ー TFM=
netcoreapp3.1) ので、 .NET Core 3.1 以上で動作 し ます。 他の フ レーム ワー ク を タ ーゲ ッ ト
にす る には、 た と えば以下の よ う にプ ロ ジ ェ ク ト フ ァ イ ル内の TFM を合わせ る 必要があ
り ます。
<PropertyGroup>
<OutputType>Exe</OutputType>

2.4 .NET バイ ンデ ィ ング 39
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>

dotnet コ マ ン ド ラ イ ン ツ ールを用い て .NET 用 PDFlib を イ ン ス ト ール 提 供 し て い る


hello プ ロ ジ ェ ク ト を例に、 dotnet ユーテ ィ リ テ ィ ーを用いて イ ン ス ト ール ・ 構成 ・ ビル
ド を行 う プ ロ セ ス を説明 し ます :
> 製品パ ッ ケージ を、 好 き なデ ィ レ ク ト リ ーへ解凍 し ます。
> コ マ ン ド シ ェ ルで、 hello プ ロ ジ ェ ク ト デ ィ レ ク ト リ ーへ cd し ます :
cd <installdir>\bind\dotnet\csharp\hello

> ( こ の ス テ ッ プ は、 提 供 し て い る サ ン プ ル 群 で は 必 要 あ り ま せ ん。 ロ ー カ ル の
NuGet.Config フ ァ イ ルを用いてパ ッ ケージ を参照 し てい る か ら です) NuGet パ ッ ケー
ジ を、 アプ リ ケーシ ョ ンのプ ロ ジ ェ ク ト デ ィ レ ク ト リ ーへ複製 し ます :
<installdir>/bind/dotnet/PDFlib_dotnet.X.Y.Z.nupkg

> ( こ の ス テ ッ プは、提供 し てい る サンプル群では必要あ り ません。すでに PDFlib への参


照を含んでい る か ら です) 以下の コ マ ン ド を、 適切なバージ ョ ン番号 と と も に入力 し
ます (バージ ョ ン番号は .nupkg フ ァ イ ルの名前の中にあ り ます) :
dotnet add package PDFlib_dotnet.X.Y.Z

こ の コ マ ン ド は PDFlib 参照を .csproj プ ロ ジ ェ ク ト フ ァ イ ルに追加 し ます。こ れは ま た、


PDFlib を ロ ーカル NuGet パ ッ ケージ内に、 も し ま だ存在 し ていなければ イ ン ス ト ール
し ます。 例 :
~/.nuget/packages/pdflib_dotnet/X.Y.Z

こ のキ ャ ッ シ ュ 化があ る ので、 *.nupkg を複製する 必要があ る のは最初のプ ロ ジ ェ ク ト


に対 し てのみです。 それ よ り 後のプ ロ ジ ェ ク ト 群では、 パ ッ ケージ フ ァ イ ルはキ ャ ッ
シ ュ か ら 取 ら れ る ので必要あ り ません。
> こ れで、 hello プ ロ ジ ェ ク ト を ビル ド し て実行 し てみ る こ と がで き ます :
dotnet build
dotnet run

結果 と し て、 アプ リ ケーシ ョ ンデ ィ レ ク ト リ ーに hello.pdf 出力文書が生成 さ れてい る の


が見つか る はずです。
そ の ま ま 使え る 構成 を 持 っ た 完全な 作成例がすべて のパ ッ ケ ージ に入 っ て い ま す。
.NET バ イ ン デ ィ ン グ を 適切に参照 し た ら 、 そ れ以後は PDFlib_dotnet.PDFlib ・ PDFlib_
dotnet.PDFlibException ク ラ ス を使用で き ます。

.NET Framework プ ロ ジ ェ ク ト 内に PDFlib.NET を イ ン ス ト ール Visual Studio で .NET


Framework プ ロ ジ ェ ク ト に PDFlib.NET を追加する には以下の と お り 操作 し て く だ さ い( こ
の方式は C++ ・ ASP.NET プ ロ ジ ェ ク ト では使え ません) :
> NuGet パ ッ ケージマネージ ャ ーで PDFlib_dotnet.x.y.z.nupkg への参照を追加。 する と 、
PDFlib_dotnetへの参照 と packages.config管理フ ァ イ ルがプ ロ ジ ェ ク ト に追加 さ れます。
> packages.config の コ ン テ キ ス ト メ ニ ュ ーで 「package.config を PackageReference に移行
する ...」 を選択す る こ と に よ っ て、 こ の参照 (初期状態では PDFlib_dotnet.dll だけ を指
し てい ます) を NuGet パ ッ ケージ参照へ変換。

40 第 2 章 : PDFlib の言語バイ ンデ ィ ング
.NET におけ る エ ラ ー処理 .NET バ イ ンデ ィ ン グは .NET の例外に対応 し てお り 、 実行時
に問題が発生す る と 、 詳細なエ ラ ー メ ッ セージ を持っ た例外を発生 さ せます。 こ う し た例
外を キ ャ ッ チ し て適切に対処す る のは ク ラ イ ア ン ト 側の役目です。 そ う し ない場合、.NET
Framework が例外を キ ャ ッ チ し て、 たいていはアプ リ ケーシ ョ ン を停止 さ せます。
PDFlib は、 例外関連情報 を 伝 え る た め に、 メ ン バー get_errnum ・ get_errmsg ・ get_
apiname を持つ自前の例外 ク ラ ス PDFlib_dotnet.PDFlibException を定義 し てい ます。PDFlib
は IDisposable イ ン タ ーフ ェ イ ス を実装 し てい る ので、 ク ラ イ ア ン ト は Dispose( ) メ ソ ッ ド
を呼び出 し て ク リ ーン ア ッ プが可能です。
ク ラ イ ア ン ト コ ー ド では、 PDFlib が発生 さ せ る .NET の例外を、 通常の try ~ catch 構
造を用いて処理で き ます :
try {
p = new PDFlib();
...PDFlib命令群...
catch (PDFlibException e) {
// pdflibが投げた例外をキャッチした
Console.WriteLine("PDFlib例外が発生しました:\n");
Console.WriteLine("[{0}] {1}: {2}\n",
e.get_errnum(), e.get_apiname(), e.get_errmsg());
} finally {
if (p != null) {
p.Dispose();
}
}

C# で Unicode 文字列 C# の String オブジ ェ ク ト は UTF-16 形式の文字列を表現 し てい


ます。 ですので、 BMP 外の、 すなわち U+FFFF を超え る Unicode 値についてはサ ロ ゲー ト
ペア と し て表現す る 必要があ り ます。BMP 外の Unicode コ ー ド 点を 1 個の char か Character
で表す こ と はで き ません。 文字列を初期化す る には以下の方法があ り ます :
> Unicode コ ー ド 点を int 値 と し て与えて、 それを String へ変換 :
String unistring = Char.ConvertFromUtf32(0x1F0CF);

> 対応す る サ ロ ゲー ト ペア (UTF-16 符号単位が 2 つ) を与え る :


String unistring = "\uD83C\uDCCF";

> Unicode キ ャ ラ ク タ ーを ソ ース コ ー ド 内で直接与え て、その ソ ース フ ァ イ ルを UTF-8 や


UTF-16 な ど然 る べ き Unicode エン コ ーデ ィ ン グで保存。 こ の ソ ース のエン コ ーデ ィ ン
グ を コ ンパ イ ラ ーに伝え てお く 必要があ り ま す。 そのためには直接伝え る か、 あ る い
は IDE で適切な設定に よ っ て伝え ます。
> PDFlib 文字参照 (122 ページ 「5.4.2 文字参照」 を参照) は、 開発環境か ら 独立であ り 、
以下の よ う に charref オプシ ョ ン を用いて有効化で き ます :
p.fit_textline("&#x1F0CF;",
100, 100, "charref=true fontname=EmojiOneColor fontsize=50");

2.4 .NET バイ ンデ ィ ング 41
2.5 Objective-C バ イ ン デ ィ ン グ
C ・ C++ 言語バ イ ンデ ィ ン グ を Objective-C で使 う こ と も で き ますが、 Objective-C 用の真
正な言語バ イ ンデ ィ ン グ も あ り ます。 こ の PDFlib フ レーム ワ ー ク は、 macOS で使え る も
の と iOS で使え る も のがあ り ます。
こ れ ら の フ レーム ワー ク は C ・ C++ ・ Objective-C 用の言語バ イ ンデ ィ ン グ を含んでい
ます。

PDFlib Objective-C 版を イ ン ス ト ール PDFlib を 自分の ア プ リ ケーシ ョ ン で使 う た めに


は、 PDFlib.framework をデ ィ レ ク ト リ ー /Library/Frameworks へコ ピーす る 必要があ り ま
す。こ のフ レーム ワ ー ク を別の場所に イ ン ス ト ールする こ と も 可能ですが、Apple の install_
name_tool の使用が必要です。 こ の ツールについては こ こ では説明 し ません。 PDFlib メ
ソ ッ ド 定義を持つ PDFlib_objc.h ヘ ッ ダーフ ァ イ ルを アプ リ ケーシ ョ ン ソ ース コ ー ド 内で
取 り 込む必要があ り ます :
#import "PDFlib/PDFlib_objc.h"

PDFlib フ レーム ワー ク を アプ リ 内に埋め込むには、Xcode の コ ー ド 署名はバージ ョ ン番号


A を持つフ レーム ワ ー ク を受け付け る のに対 し て、PDFlib 製品は数字のバージ ョ ン番号を
用いてい ます。 こ れを解決す る には、 以下の よ う に適切に名づけた フ レーム ワ ー ク フ ォ ル
ダーを作成 し ます :
cd PDFlib.framework/Versions
mv 10.x.y A
rm Current
ln -s A Current

引数命名規則 PDF メ ソ ッ ド 呼び出 し にあ た っ ては、 引数を、 以下の規則に従っ て与え


る 必要があ り ます :
> 1 番目の引数の値は、 メ ソ ッ ド 名の直後に、 コ ロ ン キ ャ ラ ク タ ーで区切っ て与え ます。
> その後の各引数については、 その引数の名前 と 値 ( こ れ も 互いに コ ロ ン キ ャ ラ ク タ ー
で区切っ て) を与え る 必要があ り ます。 引数名は、 PDFlib API リ フ ァ レ ン ス か PDFlib_
objc.h 内で見つけ る こ と がで き ます。

た と えば、 PDFlib API リ フ ァ レ ン ス内の以下の行は :


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 フ レーム ワー ク で使用で き ます。

Objective-C におけ る エ ラ ー処理 Objective-C バ イ ンデ ィ ン グは、 PDFlib エ ラ ーを、 ネ


イ テ ィ ブ Objective-C 例外へ翻訳 し ます。 実行時の問題が発生 し た と き には、 PDFlib は、
PDFlibException ク ラ ス のネ イ テ ィ ブ Objective-C 例外を発生 さ せます。 こ の例外は通常の
try/catch 機構で処理で き ます :

42 第 2 章 : PDFlib の言語バイ ンデ ィ ング
PDFlib p = NULL;

@try {
PDFlib *pdflib = [[PDFlib alloc] init];
...PDFlib命令群...
}
@catch (PDFlibException *ex) {
NSLog(@"Error %ld in %@(): %@\n",
[ex get_errnum], [ex get_apiname], [ex get_errmsg]);
}
@catch (NSException *ex) {
NSLog(@"%@: %@", [ex name], [ex reason]);
}
@finally {
if (pdflib)
[pdflib release];
}

get_errmsg メ ソ ッ ド のほかに、例外オブジ ェ ク ト の reason フ ィ ール ド を使っ てエ ラ ー メ ッ


セージ を取得す る こ と も で き ます。

2.5 Objective-C バイ ンデ ィ ング 43
2.6 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(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.32/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.32\site\lib

Perl におけ る エ ラ ー処理 Perl バ イ ンデ ィ ン グは、 PDFlib のエ ラ ーを ネ イ テ ィ ブ Perl 例


外に翻訳 し ます。 Perl の例外は、 適切な言語構造を適用する こ と に よ り 取 り 扱 う こ と がで
き ます。 すなわち、 問題の起 こ り そ う な箇所を次の よ う に挟みます :
eval {
my $p = new PDFlib::PDFlib;
...PDFlib命令群...
};
if ($@) {
die("$0: PDFlib例外が発生しました:\n$@");

44 第 2 章 : PDFlib の言語バイ ンデ ィ ング
Perl で Unicode 文字列 文字列を初期化す る には以下の方法があ り ます :
> Unicode コ ー ド 点を 16 進値 と し て与え る (サ ロ ゲー ト ペアには対応 し てい ません) :
$unistring="\x{1F0CF}";

> Unicode キ ャ ラ ク タ ー名を与え る :


unistring = "\N{PLAYING CARD BLACK JOKER}";

> Unicode キ ャ ラ ク タ ーを ソ ース コ ー ド 内で直接与え て、その ソ ース フ ァ イ ルを然 る べ き


Unicode エン コ ーデ ィ ン グで保存。UTF-8 の ソ ース フ ァ イ ルには use utf8 プ ラ グマ を含
め る 必要があ り ます。 UTF-16 の ソ ース フ ァ イ ルは先頭に BOM を付け る 必要があ り ま
す。
> PDFlib 文字参照 (122 ページ 「5.4.2 文字参照」 を参照) は、 開発環境か ら 独立であ り 、
以下の よ う に charref オプシ ョ ン を用いて有効化で き ます :
p.fit_textline("&#x1F0CF;",
100, 100, "charref=true fontname=EmojiOneColor fontsize=50");

2.6 Perl バイ ンデ ィ ング 45
2.7 PHP バ イ ン デ ィ ン グ
PDFlib PHP 版を イ ン ス ト ール PDFlib を PHP で使 う 際の さ ま ざ ま な方式やオプシ ョ ンに
関す る 詳細な情報は、 PDFlib-in-PHP-HowTo.pdf 文書に記載 し て あ り ます。 こ の文書はデ ィ
ス ト リ ビ ュ ーシ ョ ンパ ッ ケージに含まれてお り 、 ま た、 PDFlib ウ ェ ブサ イ ト に も 掲載 し て
あ り ます。
PDFlib ラ イ ブ ラ リ ーについて PHP が認識す る よ う PHP を構成する 必要があ り ます。
php.ini に以下の行を追加 し て く だ さ い :
extension=php_pdflib

PHP は、 ラ イ ブ ラ リ ーを検索す る と き 、 Unix では php.ini の中の extension_dir 変数で指定


さ れたデ ィ レ ク ト リ ーの中を捜 し 、 Windows ではその他に標準のシ ス テ ムデ ィ レ ク ト リ ー
の中 も 捜 し ます。 ど のバージ ョ ンの PHP PDFlib バ イ ンデ ィ ン グが イ ン ス ト ール し て あ る
か を確認する には、 次の よ う な一行 PHP ス ク リ プ ト を用い ます :
<?phpinfo()?>

そ う す る と 、 カ レ ン ト の PHP の設定に関 し て、 長い情報ページが表示 さ れます。 こ のペー


ジの中で PDFlib と い う 見出 し のセ ク シ ョ ン をチ ェ ッ ク し て く だ さ い。

PHP に合わせた PDFlib 関数のエ ラ ー戻 り 値 PHP では、 メ ソ ッ ド 内でのエ ラ ー発生時に


値 0 (FALSE) を返す方式が用い ら れてい る ので、 PDFlib API メ ソ ッ ド はすべて、 エ ラ ー
発生時に -1 でな く 0 を返す よ う 変更 し て あ り ます。 こ の変更については、 PDFlib API リ
フ ァ レ ン ス の メ ソ ッ ド 解説に記 し て あ り ます。 ただ し Java の コ ー ド 断片では、 エ ラ ー時
に -1 を返す通常の PDFlib の方式を用いてい る ので、 読む際には注意 し て く だ さ い。

PHP におけ る フ ァ イ ル名処理 PDF や画像な ど のデ ィ ス ク 上のパ ス の指定の無い フ ァ イ


ル名や相対パ ス のフ ァ イ ル名は、 PHP の Unix 版 と Windows 版 と では異な っ た取 り 扱い を
受け ます :
> Unix シ ス テ ム上の PHP は、パ ス部分を ま っ た く 持たない フ ァ イ ルを、ス ク リ プ ト が置か
れてい る デ ィ レ ク ト リ ーの中で検索 し ます。
> Windows 上の PHP は、パ ス部分を ま っ た く 持たない フ ァ イ ルを、PHP DLL が置かれてい
る デ ィ レ ク ト リ ーの中でのみ検索 し ます。 PDFlib は UTF-8 符号化 さ れた フ ァ イ ル名を
受け付け ますが、 PHP の dirname( ) メ ソ ッ ド は Windows ではカ レ ン ト のシ ス テ ム コ ー
ド ページ を使用 し ます。 こ の場合には、 デ ィ レ ク ト リ ーか フ ァ イ ルの名前を UTF-8 へ
変換す る 必要があ り ます。 詳 し く は 111 ページ 「5.2.3 デフ ォ ル ト UTF-8 対応のあ る
言語バ イ ンデ ィ ン グ」 を参照 し て く だ さ い。 例 :
$searchpath = dirname(dirname(__FILE__)).'/data';
$searchpath = $p->convert_to_unicode("auto", $searchpath, "outputformat=utf8");

プ ラ ッ ト フ ォームに依存 し ない フ ァ イ ル名の取 り 扱い を行 う には、 SearchPath 機能の利用


を強 く 推奨 し ます (59 ページ 「3.1.4 リ ソ ース構成 と フ ァ イ ル検索」 参照)。

PHP におけ る例外処理 PHP は構造化例外処理に対応 し てい る ため、 PDFlib 例外は PHP


例外 と し て発生 し ます。 PDFlib は ク ラ ス PDFlibException の例外を発生 さ せます。 こ の ク
ラ ス は PHP の標準の Exception ク ラ ス を派生 さ せた も のです。 標準的な try ~ catch 技法
を用いて PDFlib 例外を扱 う こ と がで き ます :

46 第 2 章 : PDFlib の言語バイ ンデ ィ ング
try {
$p = new PDFlib();
...PDFlib命令群...

} catch (PDFlibException $e) {


print "PDFlib例外が発生しました:\n";
print "[" . $e->get_errnum() . "] " . $e->get_apiname() . ": "
$e->get_errmsg() . "\n";
}
catch (Throwable $e) {
die("PHP例外が発生しました: " . $e->getMessage() . "\n");
}

Eclipse と Zend Studio を用いて開発 PHP Development Tools (PDT) は Eclipse と Zend
Studio に よ る PHP 開発に対応 し てい ます。 PDT は、 以下に示す手順で、 状況依存ヘルプ
に対応す る よ う 設定す る こ と がで き ます。
PDFlib を Eclipse 設定に追加 し て、すべての PHP プ ロ ジ ェ ク ト に知 ら れ る よ う に し ます:
> 「Window」 → 「Preferences」 → 「PHP」 → 「Source Paths」 → 「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 メ ソ ッ ド に対す る コ ー ド 補完 と 状況依存ヘルプで支援 し
ます。

PHP で Unicode 文字列 文字列を初期化す る には以下の方法があ り ます :


> Unicode コ ー ド 点を 16 進形式で与え る (サ ロ ゲー ト ペアには対応 し てい ません) :
$unistring = "\u{1F0CF}";

> Unicode キ ャ ラ ク タ ーを PHP ソ ース内で直接与え て、その ソ ース フ ァ イ ルを UTF-8 形式


で保存。
> PDFlib 文字参照 (122 ページ 「5.4.2 文字参照」 を参照) は、 開発環境か ら 独立であ り 、
以下の よ う に charref オプシ ョ ン を用いて有効化で き ます :
p.fit_textline("&#x1F0CF;",
100, 100, "charref=true fontname=EmojiOneColor fontsize=50");

2.7 PHP バイ ンデ ィ ング 47
2.8 Python バ イ ン デ ィ ン グ
PDFlib Python 版を イ ン ス ト ール Pythonの拡張機構は共有 ラ イ ブ ラ リ ーを実行時に読み
込む こ と に よ っ て動作 し ます。 PDFlib バ イ ンデ ィ ン グ を動作 さ せる には、 以下の よ う に、
Python イ ン タ プ リ タ ーが Python 用 PDFlib ラ イ ブ ラ リ ーを利用で き る よ う にする 必要があ
り ます。 こ の ラ ッ パーは、 PYTHONPATH 環境変数に列挙 さ れたデ ィ レ ク ト リ ー内で検索
さ れます。 Python ラ ッ パーの名前はプ ラ ッ ト フ ォームに よ っ て異な り ます :
> Unix ・ macOS : pdflib_py.so
> Windows : pdflib_py.pyd
PDFlib ラ イ ブ ラ リ ーのほかに、以下の フ ァ イ ル も ラ イ ブ ラ リ ー と 同 じ デ ィ レ ク ト リ ーに入
れてお く 必要があ り ます :
> PDFlib/PDFlib.py
> PDFlib/__init__.py (Python 2.7 の場合のみ)

Python におけ る エ ラ ー処理 Python バ イ ンデ ィ ン グはエ ラ ー時に PDFlibException を発生


さ せます。 Python 例外は通常の try/catch で取 り 扱 う こ と がで き ます :
try:
p = PDFlib()

...PDFlib命令群...
except PDFlibException:
print("PDFlib例外が発生しました:
print("[%d] %s: %s" % (ex.errnum, ex.apiname, ex.errmsg))

except Exception:
print(ex)

finally:
if p:
p.delete()

Python で Unicode 文字列 文字列を初期化す る には以下の方法があ り ます :


> Unicode コ ー ド 点を 16 進 8 桁で与え る :
$unistring = "\U0001F0CF";

> サ ロ ゲー ト は以下の よ う に与え る こ と も で き ます :


unistring = "\uD83C\uDCCF".encode('utf-16', 'surrogatepass').decode('utf-16')

> Unicode キ ャ ラ ク タ ーを Python ソ ース内で直接与えて、その ソ ース フ ァ イ ルを UTF-8 形


式で保存。
> PDFlib 文字参照 (122 ページ 「5.4.2 文字参照」 を参照) は、 開発環境か ら 独立であ り 、
以下の よ う に charref オプシ ョ ン を用いて有効化で き ます :
p.fit_textline("&#x1F0CF;",
100, 100, "charref=true fontname=EmojiOneColor fontsize=50");

48 第 2 章 : PDFlib の言語バイ ンデ ィ ング
2.9 RPG バ イ ン デ ィ ン グ
PDFlib は、 PDFlib 関数を埋め込まれた ILE-RPG プ ロ グ ラ ム を コ ンパ イ ルす る ために必要
なすべてのプ ロ ト タ イ プ と い く つかの有用な定数 と を定義 し た /copy モジ ュ ールを提供 し
てい ます。

Unicode 文字列処理 PDFlib が提供す る 関数はすべて、可変長の Unicode 文字列を引数 と


し て用いてい る ので、%UCS2 ビル ト イ ン関数を使っ てシ ン グルバ イ ト 文字列を Unicode 文
字列に変換す る 必要があ り ます。PDFlib の関数が返す文字列はすべて可変長の Unicode 文
字列です。 こ れ ら の Unicode 文字列を シ ン グルバ イ ト 文字列に変換する には %CHAR ビル
ト イ ン関数を使い ます。

注 %CHAR ・ %UCS2 関数は、 カ レ ン ト ジ ョ ブの CCSID を使っ て文字列を Unicode と 変換 し ま


す。 PDFlib に同梱の例では CCSID 37 (US EBCDIC) をベース と し ています。 この コ ー ド ペー
ジは CHGJOB CCSID(37) を用いて設定で き ます。 この例を これ以外の コ ー ド ページ で走ら
せる と 、 オプ シ ョ ン リ ス ト 内のい く つかのキ ャ ラ ク タ ー ({ [ ] } な ど) が正 し く 翻訳 さ れ
ない こ と があ り ます。

すべての文字列は可変長文字列 と し て渡 さ れ る ので、文字列長を明示的に指定す る 必要の


あ る さ ま ざ ま な関数では 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))

こ れで、 CRTBNDRPG コ マ ン ド (ま たは PDM の中のオプシ ョ ン 14) を用いてプ ロ グ ラ ム


を コ ンパ イ ルで き る よ う にな り ま し た :

2.9 RPG バイ ンデ ィ ング 49
ADDLIBLE LIB(PDFLIB)
CRTBNDRPG PGM(PDFLIB/HELLO) SRCFILE(PDFLIB/QRPGLESRC) SRCMBR(*PGM) DFTACTGRP(*NO)
BNDDIR(PDFLIB/PDFLIB)

生成 さ れたプ ロ グ ラ ム を実行す る 前に、 以下の コ マ ン ド を適用する 必要があ り ます :


chgcurdir '/pdflib/pdflib/x.y/x.y.z/bind/rpg'

生成 さ れた PDF 文書は、 同一デ ィ レ ク ト リ ー内に見つけ る こ と がで き ます。


引数は、 表 2.2 に挙げ る デー タ 型に従っ て PDFlib API へ渡 さ れ る 必要があ り ます。

表 2.2 RPG バイ ンデ ィ ングにおけるデー タ 型


API デー タ 型 RPG バイ ンデ ィ ングにおけるデー タ 型

文字列デー タ 型 Unicode 文字列 (%ucs2 を使用)

バイ ナ リ ーデー タ data

RPG におけ る エ ラ ー処理 ILE-RPG で書かれた PDFlib ク ラ イ ア ン ト では、 ILE-RPG が提


供す る monitor/on-error/endmon エ ラ ー処理機構を利用する こ と がでい ます。 あ る いは、
ILE-RPG の *PSSR グ ロ ーバルエ ラ ー処理サブルーチン を用いて例外を モニ タ ーする 方法 も
あ り ま す。 ジ ョ ブ ロ グ にはエ ラ ー番号 と 、 失敗 し た関数、 お よ び例外の原因が示 さ れ ま
す。 PDFlib は呼び出 し 側プ ロ グ ラ ムへエ ス ケープ メ ッ セージ を送 り ます。
c eval p=PDF_new
*
c monitor
*
c eval doc=PDF_begin_document(p:%ucs2('/tmp/my.pdf'):docoptlist)
:
:
* エラー処理
c on-error
* このエラーについて何かします
* PDFlibオブジェクトの解放を忘れないように
c callp PDF_delete(p)
c endmon

50 第 2 章 : PDFlib の言語バイ ンデ ィ ング
2.10 Ruby バ イ ン デ ィ ン グ
PDFlib Ruby 版を イ ン ス ト ール Ruby の拡張機構、共有 ラ イ ブ ラ リ ーを動作時に読み込む
こ と に よ っ て動作 し ます。 PDFlib バ イ ンデ ィ ン グが動作する には、 Ruby 用の PDFlib 拡張
ラ イ ブ ラ リ ーの場所を Ruby イ ン タ プ リ タ ーが知っ ていて利用で き る 必要があ り ます。 た
い て いの場合、 こ の ラ イ ブ ラ リ ー (Windows ・ Unix の場合 : PDFlib.so。 macOS の場合 :
PDFlib.bundle) が イ ン ス ト ール さ れ る 場所は、 ロ ーカル ruby イ ン ス ト ールデ ィ レ ク ト リ ー
の site_ruby ブ ラ ンチの中であ り 、 すなわち、 次の よ う な名前のデ ィ レ ク ト リ ーの中に イ
ン ス ト ール さ れます :
/usr/local/lib/ruby/site_ruby/<バージョン>/

ただ し Ruby は、 こ れ以外のデ ィ レ ク ト リ ーへ も 拡張を探 し に行 き ます。 こ れ ら のデ ィ レ


ク ト リ ーの一覧を取得す る には、 次の ruby コ ールを用い る こ と がで き ます :
ruby -e "puts $:"

こ の一覧はたいていの場合、 カ レ ン ト デ ィ レ ク ト リ ーを含んでい ますので、 テ ス ト 目的に


おいては、PDFlib 拡張 ラ イ ブ ラ リ ー と ス ク リ プ ト を同 じ デ ィ レ ク ト リ ーに入れ る だけで よ
いで し ょ う 。

Ruby におけ る エ ラ ー処理 Ruby バ イ ンデ ィ ン グは、 PDFlib 例外を ネ イ テ ィ ブ Ruby 例外


に翻訳する エ ラ ーハン ド ラ ーを イ ン ス ト ール し ます。こ う し た Ruby 例外は、通常の rescue
技法で扱 う こ と がで き ます :
begin
p = PDFlib.new
...PDFlib命令群...
rescue PDFlibException => pe
print "PDFlib例外が発生しました:\n"
print "[" + pe.get_errnum.to_s + "] " + pe.get_apiname + ": "+pe.get_errmsg+ "\n"
rescue Exception => e
print e.backtrace.join("\n") + "\n" + e.to_s
ensure
p.delete() if p
end

Ruby で Unicode 文字列 文字列を初期化す る には以下の方法があ り ます :


> Unicode コ ー ド 点を 16 進 4 桁か 5 桁か 6 桁で与え る (サ ロ ゲー ト ペアには対応 し てい ませ
ん) :
$unistring = "\u{1F0CF}";

> Unicode キ ャ ラ ク タ ーを Ruby ソ ース内で直接与えて、その ソ ース フ ァ イ ルを UTF-8形式


で保存。
> PDFlib 文字参照 (122 ページ 「5.4.2 文字参照」 を参照) は、 開発環境か ら 独立であ り 、
以下の よ う に charref オプシ ョ ン を用いて有効化で き ます :
p.fit_textline("&#x1F0CF;",
100, 100, "charref=true fontname=EmojiOneColor fontsize=50");

2.10 Ruby バイ ンデ ィ ング 51
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を使

$ 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 で扱いたい と い う と き に役立
ち ます。

52 第 2 章 : PDFlib の言語バイ ンデ ィ ング
2.10 Ruby バイ ンデ ィ ング 53
54 第 2 章 : PDFlib の言語バイ ンデ ィ ング
3 PDF 文書を作成
3.1 PDFlib プ ロ グ ラ ミ ン グの一般的特徴
ク ッ ク ブ ッ ク プ ログ ラ ミ ングの一般的な諸側面に関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ クの
general カ テ ゴ リ ーにあ り ます。

3.1.1 例外処理
あ る 種のエ ラ ーは、 多 く の言語で例外 と 呼ばれてい ます。 こ の呼び方は理にかな っ てい ま
す。 そ う し たエ ラ ーは ま さ に例外であ っ て、 プ ロ グ ラ ムの動作中にそんなに頻繁には起 こ
ら ないだろ う と 予想 さ れ る 類の も のだか ら です。 一般に採 ら れ る 方針 と し ては、 エ ラ ーが
頻繁に起 き そ う な呼び出 し については従来型のエ ラ ー伝達方式 (すなわち、 -1 な ど特殊
な戻 り 値でエ ラ ーを示す) を用い る けれど も 、 まれに し か起 こ ら ないエ ラ ーで、 こ んな特
例に ま で場合分け を増や し て コ ー ド をやや こ し く す る の も ど う か と 思われ る よ う な場合
については例外方式を用い る 、 と い う のが普通です。 PDFlib のや り 方 も ま さ に こ れ と 同 じ
です : た と えば、 かな り の頻度でエ ラ ーが起 き そ う な操作 と し ては :
> 出力フ ァ イ ルを、 権限がないのに開 こ う と す る
> PDF を読み込みたい と き 、 間違っ た フ ァ イ ル名で開 こ う と す る
> 画像フ ァ イ ルが壊れてい る のに開 こ う と す る

PDFlib では、 こ の よ う なエ ラ ーを特殊な戻 り 値で示 し ます。 それぞれの値は PDFlib API リ


フ ァ レ ン ス に示 し て あ り ます (たいていは -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 プ ログ ラ ミ ングの一般的特徴 55


の読み込みがで き ない と き 、 たいていの ク ラ イ ア ン ト は文書を放棄 し て し ま う で し ょ う
が、 ク ラ イ ア ン ト に よ っ ては、 別の フ ォ ン ト を使っ て何 と か し たい と い う 場合 も あ り え ま
す。 その よ う な と き は、 問題が よ り 詳 し く 記 さ れたエ ラ ー メ ッ セージ を取得 し たい場合 も
あ る で し ょ う 。 そ の よ う な 場合 に は、 PDF_get_errnum( ) ・ PDF_get_errmsg( ) ・ PDF_get_
apiname( ) 関数を、問題発生 し た呼び出 し の直後に呼び出す こ と がで き ます。具体的には、
エ ラ ー値 -1 (PHP の場合 : 0) を返 し て き た呼び出 し の直後に呼び出 し ます。

エ ラ ーポ リ シー PDFlib はエ ラ ー状況を検出す る と 、い く つかの戦略の う ちの 1 つに従っ


て反応 し ます。 こ れは errorpolicy オプシ ョ ンで構成で き ます。 エ ラ ーコ ー ド を返す可能性
のあ る メ ソ ッ ド はすべて、 errorpolicy オプシ ョ ンに も 対応 し てい ます。 以下のエ ラ ーポ リ
シーに対応 し てい ます :
> errorpolicy=return : エ ラ ー状況が検出 さ れた と き 、 メ ソ ッ ド がエ ラ ー値 -1 (PHP の場
合 : 0) を返 し ます。 アプ リ ケーシ ョ ン開発者は こ の戻 り 値をチ ェ ッ ク し て問題を突き
と め、 その問題に対 し て アプ リ ケーシ ョ ン ご と に適切な方法で対処す る 必要があ り ま
す。 こ のアプ ロ ーチではエ ラ ー処理に統一的な アプ ロ ーチがで き る ので、 推奨 し ます。
> errorpolicy=exception : エ ラ ー状況が検出 さ れた と き 、 例外を発生 さ せます。 出力文書
は 不 完 全 で 使 え な い も の に な り ま す の で 破 棄 す る 必 要 が あ り ま す (こ れ は
removefragments 文書オプシ ョ ン を用いて自動化す る こ と も 可能です)。 こ の方式を使
う と 、 エ ラ ー条件分岐を さ ぼっ て手軽にプ ロ グ ラ ミ ン グがで き ますが、 そのかわ り 問
題が起 き る と 出力文書は、 た と えそれが致命的でない、 アプ リ ケーシ ョ ン側で対処で
き る 可能性のあ る 問題であ っ て も 失われて し ま い ます。

以下の コ ー ド 断片群は、 例外処理に関す る さ ま ざ ま な戦略を演示 し ます。 こ の さ ま ざ ま な


例は、 存在す る か し ないかわか ら ない フ ォ ン ト を読み込 も う と し てい ます。
errorpolicy=return の と き は、 戻 り 値がエ ラ ーか ど う かをチ ェ ッ ク す る 必要があ り ます。
それが失敗を示 し てい る と き は、 失敗の原因を ク エ リ ーす る こ と で、 状況を適切に さ ば く
こ と がで き る で し ょ う :
font = p.load_font("MyFontName", "unicode", "errorpolicy=return");
if (font == -1)
{
/* フォントハンドルが無効。しかしPDF出力は継続可能。*/
errmsg = p.get_errmsg();
/* 別のフォントを試すか諦める */
...
}
/* フォントハンドルは有効。継続 */

errorpolicy=exception の と き は、 エ ラ ーが発生 し た ら 文書は放棄 し なければな り ません :


font = p.load_font("MyFontName", "unicode", "errorpolicy=exception");
/* 例外が発生しなければフォントハンドルは有効。
* 例外が発生したら、PDF出力は継続できない
*/

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の general-programming/error_handling ト ピ ッ ク に


あ り ます。

警告 問題の状況に よ っ ては、 PDFlib がそれを内部的に検出 し て も 、 例外を発生 さ せてプ


ロ グ ラ ムの流れを さ え ぎ る 正当な理由にはな ら ない も の も あ り ます。例外を発生 さ せる の

56 第 3 章 : PDF 文書を作成
ではな く 、状況の説明が ロ グ記録 さ れます( ロ グ記録機能について さ ら に詳 し く は 57 ペー
ジ 「3.1.2 ロ グ記録」 を参照)。 警告に関 し ては以下のアプ ロ ーチを推奨 し ます :
> 開発局面では警告の ロ グ記録を有効に し て、 その ロ グ フ ァ イ ル内のすべての警告 メ ッ
セージ を注意深 く 研究 し ます。 こ う し た警告は、 コ ー ド やデー タ にひそむ問題を示 し
てい る 可能性があ り ますか ら 、 その原因を理解ない し 除去す る よ う 努めなければな り
ません。
> 運用局面では警告の ロ グ記録を無効に し て、 問題が起 き た と き だけ再び有効に し ます。

3.1.2 ロ グ記録
PDFlib は、 以下の項目を記録す る ロ グ フ ァ イ ルを生成で き ます :
> すべての API 呼び出 し 、お よ びその引数群 と オプシ ョ ン群。 なお、PDFlib 言語 ラ ッ パー
に よ っ て発 さ れた さ ら な る API 呼び出 し も ロ グ記録に含まれ る 場合があ り ます (文字
列変換のためな ど)。
> API メ ソ ッ ド に よ っ て返 さ れた戻 り 値 と ハン ド ル。
> 各呼び出 し に対す る タ イ ム ス タ ンプ。
> 廃止済の API メ ソ ッ ド ・ オプシ ョ ンの使用に関す る 情報。
> 例外を発生 さ せ る ほ ど ではないが、 アプ リ ケーシ ョ ンの開発フ ェ ーズの間に調べ る べ
き 警告 メ ッ セージ。
> サポー ト ケース の調査に有用であ り う る 内部動作に関す る 詳細。

ロ グ フ ァ イ ルの内容は、 アプ リ ケーシ ョ ン開発者に と っ て、 プ ロ グ ラ ム フ ロ ーの中の問題


を特定す る う えで重要な助け と な り え ます。 ロ グ記録は実行時に以下の よ う に有効化で き
ます :
p.set_option("logging={filename={mylogfile.log}}");

あ る いは、 ロ グ記録を環境変数を通 じ て有効化 さ せ る こ と も 可能です。 ロ グ記録 さ れ る 情


報の量は、 さ ま ざ ま な ロ グ記録 ク ラ ス と 、 各 ク ラ ス に対す る レ ベルを用いて制御で き ま
す。 詳 し く は PDFlib API リ フ ァ レ ン ス を参照 し て く だ さ い。
ロ グ記録は通常、 本番環境においては有効化す る べ き ではな く 、 開発フ ェ ーズ中にの
み、 かつ問題を解析す る 必要があ る 時に有効化 さ れ る べ き も のです。 PDFlib GmbH のサ
ポー ト では、 ユーザーの問題を話 し 合 う ために ロ グ フ ァ イ ルを要請する こ と があ り ます。
以下は、 デフ ォ ル ト の ロ グ記録 ク ラ ス を用いた典型的な ロ グ フ ァ イ ルか ら 数行を抜粋
し た も のです :
PDF_load_image(p_0x2201c20, "auto", "nesrin.jpg", /*c*/0, "")
[0]

PDF_begin_page_ext(p_0x2201c20, 10.000000, 10.000000, "")


[Begin page #1]
PDF_fit_image(p_0x2201c20, 0, 0.000000, 0.000000, "adjustpage")
PDF_close_image(p_0x2201c20, 0)
PDF_end_page_ext(p_0x2201c20, "")
[End page #1]

PDF_end_document(p_0x2201c20, "")
[Full product name: "PDFlib Personalization Server"]
[Document ID: <C98301CB2D4EAC2972D34CAAAE929021> <C98301CB2D4EAC2972D34CAAAE929021>]
[Size of document: 34842 bytes]
[End document #1]

3.1 PDFlib プ ログ ラ ミ ングの一般的特徴 57


3.1.3 PDFlib 仮想 フ ァ イ ルシ ス テム (PVF)
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の general/data_from_memory ト ピ ッ ク にあ り ます。

デ ィ ス ク 上の フ ァ イ ル と は別に、 ク ラ イ ア ン ト は、 PDFlib Virtual File System (PVF) と い


う し く みを利用す る こ と も で き ます。 こ れを用い る と 、 メ モ リ ー内のデー タ を直接供給す
る こ と がで き る ので、 デ ィ ス ク の フ ァ イ ルを扱 う 必要が ま っ た く あ り ません。 こ れには速
度向上 と い う 利点があ り ます。 PVF はデー タ ベース か ら 取 り 出 し たデー タ な ど の よ う に、
フ ァ イ ル と し てデ ィ ス ク 上に存在 し ていない時に も 活用で き ます。 ま たそれ以外に も 、 ク
ラ イ ア ン ト の必要 と す る デー タ が、何 ら かの処理の結果 と し て メ モ リ ー上にすでに存在 し
てい る 場合に対 し て一般に有用です。
PVF の基本 コ ン セプ ト は、 仮想の読み取 り 専用フ ァ イ ルに名前を付けて、 それを通常
のフ ァ イ ル名 と ま っ た く 同 じ よ う に、あ ら ゆ る API メ ソ ッ ド で使用で き る よ う にする と い
う も のです。 UPR の構成フ ァ イ ルで も 使用す る こ と がで き ます。 仮想フ ァ イ ル名は、 ク ラ
イ ア ン ト が任意に名づけ る こ と がで き ます。 も ち ろん、 仮想フ ァ イ ル名は、 通常のデ ィ ス
ク のフ ァ イ ル と 名前衝突が起 こ ら ない よ う な も のに し なければな り ません。 そのため、 以
下の よ う な体系的な命名規則を推奨 し ま す (filename は、 ク ラ イ ア ン ト が名づけ る 部分
で、 各カ テ ゴ リ ー内で一意な名前です) 。 ま た、 フ ァ イ ル名の拡張子について も 、 標準に
従 う こ と を推奨 し ます :
> ラ ス タ ー画像フ ァ イ ル : /pvf/image/filename
> フ ォ ン ト のア ウ ト ラ イ ン フ ァ イ ル (実際の フ ォ ン ト 名を フ ァ イ ル名の先頭部分 と し て
用い る こ と を推奨) : /pvf/font/filename
> ICC プ ロ フ ァ イ ル : /pvf/iccprofile/filename
> PDF 文書 : /pvf/pdf/filename

フ ァ イ ル名を指定 さ れて捜す時、 PDFlib は まず、 その指定 さ れた フ ァ イ ル名が既知の仮想


フ ァ イ ルのなかにあ る か ど う か をチ ェ ッ ク し ます。 その後に、 指定 さ れた フ ァ イ ルをデ ィ
ス ク 上で開 こ う と し ます。

仮想 フ ァ イ ルの継続期間 仮想 フ ァ イ ルでデー タ が提供 さ れた と き には、 それ をす ぐ に


消費す る 関数 も あ る で し ょ う し 、 その フ ァ イ ルの一部分だけ を まず読んで、 残 り の部分は
後の時点で使 う と い う 関数 も あ る で し ょ う 。 そのため、 各仮想フ ァ イ ルの継続期間につい
ては細心の注意を払 う 必要があ り ます。 PDFlib は、 それぞれの仮想フ ァ イ ルに内部 ロ ッ ク
をかけてお き 、 その内容が も う 必要な く な っ た時には じ めて ロ ッ ク を外 し ます。 そのデー
タ を た だちに コ ピ ー し てお く よ う ク ラ イ ア ン ト が PDFlib に要求 し た場合 (PDF_create_
pvf( ) で copy オプシ ョ ン を指定) を除いては、 仮想フ ァ イ ルの内容を ク ラ イ ア ン ト が変
更・削除・解放す る こ と が許 さ れ る のは、PDFlib が ロ ッ ク が外 し た後に限 ら れます。PDFlib
は、 PDF_delete( ) が実行 さ れた と き には、 自動的にすべての仮想フ ァ イ ルを削除 し ます。
し か し 、 フ ァ イ ルの実際の内容 (仮想フ ァ イ ルの元デー タ ) はつねに ク ラ イ ア ン ト が解放
し なければいけ ません。

さ ま ざ ま な戦略 PVF では、 仮想フ ァ イ ルのための必要 メ モ リ ーの管理アプ ロ ーチは複


数あ り え ます。 ど のアプ ロ ーチで も 考慮の対処 と す る べ き こ と は、 PDFlib は、 仮想フ ァ イ
ル名を用いた API呼び出 し が終わっ た後で も ま だその仮想フ ァ イ ルの内容へのア ク セ ス を
必要 と する か も し れない と い う こ と と 、 PDF_end_document( ) の後であれば も う ア ク セ ス
を必要 と す る こ と は全 く ない と い う こ と です。留意す る 必要があ る のは、PDF_delete_pvf( )
を呼んで も 実際の フ ァ イ ルの内容が解放 さ れ る わけではな く (copy オプシ ョ ン を指定 し
た場合は例外)、 その PVF フ ァ イ ル名を管理 し ていた対応する デー タ 構造が解放 さ れ る だ
けだ と い う こ と です。 よ っ て、 以下の よ う な戦略があ り え ます :

58 第 3 章 : PDF 文書を作成
> メ モ リ ー使用を最小にす る : 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 生成を用い ます (64 ページ 「3.1.5 PDF 文書を メ モ
リ ー内に生成」 参照)。

3.1.4 リ ソ ース構成 と フ ァ イ ル検索


高度な応用アプ リ ケーシ ョ ンでは、PDFlib に さ ま ざ ま な リ ソ ース を利用 さ せ る 必要があ り
ます。 た と えばフ ォ ン ト フ ァ イ ル ・ ICC カ ラ ープ ロ フ ァ イ ルな ど です。 PDFlib の リ ソ ース
管理を、 プ ラ ッ ト フ ォームに依存 し ない、 カ ス タ マ イ ズの容易な も のにす る ためには、 構
成フ ァ イ ルを作成 し てお く こ と がで き ます。 構成フ ァ イ ルの中には、 利用可能な さ ま ざ ま
な リ ソ ース と その対応す る デ ィ ス ク フ ァ イ ル名を記述 し てお く のです。 こ の よ う な静的な
構成フ ァ イ ルだけではな く て、 PDF_set_option( ) に よ る リ ソ ース の追加を用いた動的な実
行時構成 を 行 う こ と も 可能です。 構成 フ ァ イ ルに関 し て は PDFlib は、 Unix PostScript
Resource (UPR) と い う 簡単なテ キ ス ト 形式を用いてい ます。 こ の、 PDFlib で用い る 形の
UPR フ ァ イ ル形式については後述 し ます。
enumeratefonts オプシ ョ ン を用い る と 、PDFlib に、検索パ ス上に存在す る すべての フ ォ
ン ト を収集 さ せ る こ と がで き ます (141 ページ 「フ ォ ン ト リ ソ ース リ ス ト を自動生成」 を
参照)。

リ ソ ースの カ テ ゴ リ ー PDFlib の対応 し てい る リ ソ ース カ テ ゴ リ ーを表 3.1 に挙げます。


多 く の カ テ ゴ リ ーは、 リ ソ ー ス 名 (PDFlib API 内で用い る ための) を、 仮想かデ ィ ス ク

3.1 PDFlib プ ログ ラ ミ ングの一般的特徴 59


ベース のフ ァ イ ルへマ ッ プす る も のです。 表 3.1 にあ る も の以外の リ ソ ース カ テ ゴ リ ーは
無視 さ れます。 カ テ ゴ リ ー名は大文字 ・ 小文字区別 さ れます。 その値は名前文字列 と し て
扱われます。 すなわち、 ASCII か UTF-8 (行頭に BOM 付き ) で、 あ る いは IBM Z の場合
には 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 ・ WOFF2 の う ちいず
れかの フ ォ ン ト フ ァ イル
Encoding encodingname=filename 8 ビ ッ ト エ ン コ ーデ ィ ングまたは コ ー ド ページのテーブルを
持っ たテキス ト フ ァ イル
HostFont fontname=hostfontname シ ス テムに イ ン ス ト ール さ れている フ ォ ン ト の名前 (通常、
両方の フ ォ ン ト 名は等 し い)
FontnameAlias aliasname=fontname PDFlib がすでに知っ ている フ ォ ン ト に対 し てエ イ リ ア ス を作

ICCProfile profilename=filename ICC カ ラ ープ ロ フ ァ イル名

UPR フ ァ イ ル形式 UPR フ ァ イ ルはテ キ ス ト フ ァ イ ルであ り 、 その構造は非常に単純で、


テ キ ス ト エデ ィ タ ーで簡単に書 く こ と がで き ます し 、 自動生成 さ せ る こ と も で き ます。 ま
ず、 その文法を見てみま し ょ う :
> それぞれの行は最大 1023 キ ャ ラ ク タ ーま で。
> 行末のバ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ ー 「\」 は、 行終端を キ ャ ン セル し ます。 こ れは行
を延長 し たい と き に使え ます。
> パーセ ン ト 「%」 キ ャ ラ ク タ ーは、 行末ま での注釈を開始 さ せます。 行デー タ の一部で
あ る (すなわち注釈を開始 さ せない) パーセ ン ト キ ャ ラ ク タ ーは、直前にバ ッ ク ス ラ ッ
シ ュ キ ャ ラ ク タ ーを付けて保護す る 必要があ り ます。
> 行終端を保護す る バ ッ ク ス ラ ッ シ ュ と 、 パーセ ン ト キ ャ ラ ク タ ーを保護す る バ ッ ク ス
ラ ッ シ ュ キ ャ ラ ク タ ー と の直前のバ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ ー群は、 行デー タ の一
部であ る な ら 二重にす る 必要があ り ます。
> ピ リ オ ド 「.」 を単独で用い る と 、 セ ク シ ョ ンの終了を意味 し ます。
> すべてのエン ト リ ーは、 大文字 ・ 小文字を区別 し ます。
> スペース は、 リ ソ ース名中 と フ ァ イ ル名中をのぞ く あ ら ゆ る 箇所で無視 さ れます。
> リ ソ ース の名前を値は、 等号 「=」 を一切含んではいけ ません。
> 1 個の リ ソ ース が複数回定義 さ れた場合は、最後の定義がそれ以前の定義を上書き し ま
す。

UPR フ ァ イ ルは以下の部分か ら 成っ てい ます :
> フ ァ イ ルの種類を示すおま じ ない行。 次の形を と り ます :
PS-Resources-1.0

60 第 3 章 : PDF 文書を作成
> フ ァ イ ル中で記述 さ れ る すべての リ ソ ース カ テ ゴ リ ーを一覧に し たセ ク シ ョ ン。 省略
可能です。 各行に 1 つずつ リ ソ ース カ テ ゴ リ ーを記述 し ます。 こ の一覧は、 ピ リ オ ド
1 個だけの行に よ っ て終了 し ます。利用可能な リ ソ ース カ テ ゴ リ ーについては後述 し ま
す。 こ の省略可能なセ ク シ ョ ンが存在 し ない場合であ っ て も 、1 個の ピ リ オ ド キ ャ ラ ク
タ ーは存在す る 必要があ り ます。
> フ ァ イ ルのは じ めに挙げ ら れた リ ソ ース カ テ ゴ リ ーそれぞれについてセ ク シ ョ ンが 1
つずつ。 各セ ク シ ョ ンは、 リ ソ ース カ テ ゴ リ ーを示す 1 行で始ま り 、 その後に、 利用
可能な リ ソ ース を記述す る 行が任意の行数つづ き ます。 こ の一覧は、 ピ リ オ ド 1 個だ
けの行に よ っ て終了 し ます。 各 リ ソ ースデー タ 行には リ ソ ース の名前を書 き ます (等
号は ク ォ ー ト す る 必要があ り ます) 。 その リ ソ ース が フ ァ イ ル名を必要 と す る 場合に
は、 等号の後に こ の名前を付け加え る 必要があ り ます。 リ ソ ース エ ン ト リ ーに列挙 さ
れた フ ァ イ ルを PDFlib が さ がす時には SearchPath (以下を参照) が適用 さ れます。

フ ァ イ ル検索 と SearchPath リ ソ ース カ テ ゴ リ ー PDFlib は さ ま ざ ま なデー タ ア イ テ ム


をデ ィ ス ク 上の フ ァ イ ルか ら 読み込みます。 た と えば ラ ス タ ー画像 ・ フ ォ ン ト ア ウ ト ラ イ
ン ・ フ ォ ン ト メ ト リ ッ ク 情報 ・ PDF 文書 ・ ICC カ ラ ープ ロ フ ァ イ ルな ど です。 相対パ ス名
で も 絶対パ ス名で も ない、パ ス指定を ま っ た く つけない フ ァ イ ル名を用い る こ と も で き ま
す。 SearchPath リ ソ ー ス カ テ ゴ リ ーを使 う と 、 必要なデー タ フ ァ イ ルのあ る デ ィ レ ク ト
リ ーのパ ス名の一覧を指定す る こ と がで き ます。何か フ ァ イ ルを開かなければな ら ない と
き 、 PDFlib は、 まずその ま ま の フ ァ イ ル名で フ ァ イ ルを開 こ う と し ます。 こ の試みが失敗
す る と 、 PDFlib は、 SearchPath リ ソ ース カ テ ゴ リ ーで指定 さ れたデ ィ レ ク ト リ ー群の中で
その フ ァ イ ルが開けないか ど う か、 成功す る ま で一つ一つ試 し ます。 SearchPath 項目を蓄
積 さ せ る こ と も で き 、 それ ら は逆順に検索 さ れ ま す (後の時点で設定 さ れたパ ス ほ ど、
も っ と 早 く に設定 さ れた も の よ り も 先に検索 さ れ る )。 こ の機能を使 う と 、 PDFlib のアプ
リ ケーシ ョ ン を、プ ラ ッ ト フ ォーム依存な フ ァ イ ルシ ス テ ム体系か ら 解 き 放つ こ と がで き
ます。 検索パ ス エン ト リ ーを設定する には以下の よ う に し ます :
p.set_option("SearchPath={{/パス/パス/ディレクトリー 1} {/パス/パス/ディレクトリー
2}}");

検索パ ス を複数設定す る こ と も で き 、 ま た、 複数のデ ィ レ ク ト リ ー名を 1 回の呼び出 し の


中で与え る こ と も で き ます。空白キ ャ ラ ク タ ーを含んだデ ィ レ ク ト リ ー名に よ る 問題を避
け る ために、 エ ン ト リ ーが 1 個だけの場合に も 中カ ッ コ を二重に用い る こ と を推奨 し ま
す。 空の文字列 リ ス ト (例 : {{}}) は、 既存のすべての検索パ ス を、 デフ ォ ル ト 項目 も 含
めて削除 し ます。
こ の検索を無効にす る には、 フルパス に よ る 指定を PDFlib 関数の中に書き ます。 なお、
SearchPath リ ソ ー ス カ テ ゴ リ ーの機能は以下の よ う にプ ラ ッ ト フ ォ ーム依存にな っ てい
ます :
> Windows の場合、PDFlib はレ ジ ス ト リ ーか ら の項目群で SearchPath を初期化 し ます。以
下の レ ジ ス ト リ ーエン ト リ ーにパ ス名の リ ス ト を セ ミ コ ロ ン 「;」 で区切っ て指定す る
こ と が可能です。 こ れ ら は以下の順序で検索 さ れます :
HKLM\SOFTWARE\PDFlib\PDFlib10\10.0.0\SearchPath
HKLM\SOFTWARE\PDFlib\PDFlib10\SearchPath
HKLM\SOFTWARE\PDFlib\SearchPath

デ フ ォ ル ト フ ァ イ ル検索パス Unix ・ Linux ・ macOS ・ IBM System i シ ス テ ムでは、 パス ・


デ ィ レ ク ト リ ー名を一切指定 し な く て も 、い く つかのデ ィ レ ク ト リ ーがデフ ォ ル ト で フ ァ
イ ル検索 さ れます。 UPR フ ァ イ ル (追加の検索パ ス を内容 と し て持つ可能性のあ る ) を検
索 し て読み取 る 前に、 以下のデ ィ レ ク ト リ ーが検索 さ れます :

3.1 PDFlib プ ログ ラ ミ ングの一般的特徴 61


<rootpath>/PDFlib/PDFlib/10.0/resource/cmap
<rootpath>/PDFlib/PDFlib/10.0/resource/codepage
<rootpath>/PDFlib/PDFlib/10.0/resource/font
<rootpath>/PDFlib/PDFlib/10.0/resource/icc
<rootpath>/PDFlib/PDFlib/10.0
<rootpath>/PDFlib/PDFlib
<rootpath>/PDFlib

Unix ・ Linux ・ macOS では、 <rootpath> は まず HOME デ ィ レ ク ト リ ーへ置 き 換え ら れ、 つ


いで /usr/local へ置 き 換え ら れます。 IBM System i では、 <rootpath> は空です。
上記の最後のエ ン ト リ ーは と り わけ複数の製品のための ラ イ セ ン ス フ ァ イ ルを格納す
る のに有用です。
デフ ォ ル ト の検索パ ス が必要ない場合には、 空の searchpath を与え る こ と に よ っ てそ
れを無効化す る こ と に よ っ て、 フ ァ イ ル操作を加速で き ます。

デ フ ォ ル ト フ ァ イ ル名 と ラ イ セ ン ス フ ァ イ ル ・ リ ソ ース フ ァ イ ル デフ ォ ル ト では、 以
下のフ ァ イ ル名が、 デフ ォ ル ト 検索パスデ ィ レ ク ト リ ー群の中で検索 さ れます :
licensekeys.txt (ライセンスファイル。MVSの場合: license)
pdflib.upr (リソースファイル。MVSの場合: upr)

こ の機能を利用す る と 、 ラ イ セ ン ス フ ァ イ ルを、 環境変数や実行時オプシ ョ ン を一切設定


し ないで扱 う こ と がで き ます。

サン プル UPR フ ァ イ ル UPR 構成フ ァ イ ルの作成例を以下に挙げます :


PS-Resources-1.0
.
SearchPath
/usr/local/lib/fonts
users/kurt/my_images
.
FontOutline
ArialMT=Arial.ttf
.
HostFont
Wingdings=Wingdings
.
ICCProfile
highspeedprinter=cmykhighspeed.icc
.

UPR リ ソ ース フ ァ イ ルを検索 組み込み リ ソ ース (た と えば PDF コ ア フ ォ ン ト ・ sRGB


ICC プ ロ フ ァ イ ル) やシ ス テ ム リ ソ ース (た と えばホ ス ト フ ォ ン ト ) だけが使われ る 場合
には、 UPR 構成フ ァ イ ルは必要 と は さ れません。 なぜな ら 、 と り たてて構成がな く て も 、
必要な リ ソ ース をすべて PDFlib が見つけ ら れ る か ら です。
それ以外の リ ソ ー ス を 使い た い場合は、 そ の リ ソ ー ス を 指定す る た め に、 PDF_set_
option( ) (後述) を呼び出すか、 UPR リ ソ ース フ ァ イ ルに記述 し ます。 こ の フ ァ イ ルを、
PDFlib は、 最初の リ ソ ース が要求 さ れた時に自動的に読み込みます。 その過程は詳 し く は
以下の と お り です :
> Unix シ ス テ ム ・ macOS ・ IBM System i では、 パ ス ・ デ ィ レ ク ト リ ー名を一切指定 し な く
て も 、 デフ ォ ル ト でい く つかのデ ィ レ ク ト リ ーで ラ イ セ ン ス ・ リ ソ ー ス フ ァ イ ルが検

62 第 3 章 : PDF 文書を作成
索 さ れます。 UPR フ ァ イ ルを検索 し て読み取 る 前に、 以下のデ ィ レ ク ト リ ーが検索 さ
れます ( こ の順に) :
<rootpath>/PDFlib/PDFlib/10.0/resource/icc
<rootpath>/PDFlib/PDFlib/10.0/resource/fonts
<rootpath>/PDFlib/PDFlib/10.0/resource/cmap
<rootpath>/PDFlib/PDFlib/10.0
<rootpath>/PDFlib/PDFlib
<rootpath>/PDFlib

Unix シ ス テ ム ・ macOS では、 <rootpath> は、 まず /usr/local で、 ついで HOME デ ィ レ


ク ト リ ーで置 き 換え ら れます。 IBM System i では <rootpath> は空です。 こ の機能を利
用すれば、 環境変数や実行時オプシ ョ ン を一切指定せずに ラ イ セ ン ス フ ァ イ ル ・ UPR
フ ァ イ ル ・ リ ソ ース を取 り 扱 う こ と も で き ます。
> 環境変数 PDFLIBRESOURCEFILE が定義 さ れていれば、その値を PDFlib は、読み込むべ き
UPR フ ァ イ ルの名前 と し ます。 こ の フ ァ イ ルが読み込めない と き は例外が発生 し ます。
> 環境変数 PDFLIBRESOURCEFILE が定義 さ れていない場合、PDFlib は以下の名前の フ ァ イ
ルを開 こ う と し ます :
upr (MVSの場合。データセットが期待される)
pdflib/<バージョン>/fonts/pdflib.upr (IBM System iの場合)
pdflib.upr (Windows・Unix・その他すべてのシステムの場合)

こ の フ ァ イ ルが読み込めない と き は例外は発生 し ません。


> Windows では上記以外に PDFlib は以下の レ ジ ス ト リ ーエン ト リ ーを こ の順に読み込 も
う と し ます :
HKLM\Software\PDFlib\PDFlib10\10.0.0\resourcefile
HKLM\Software\PDFlib\PDFlib10\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( ) を使っ て直接個々の リ ソ ース を構成す る こ と も で き ます。 こ の メ ソ ッ ド
はカ テ ゴ リ ー名 と それに対応す る リ ソ ー ス エ ン ト リ ーを と り ま す。 リ ソ ー ス 記述の部分

3.1 PDFlib プ ログ ラ ミ ングの一般的特徴 63


は、 UPR リ ソ ー ス フ ァ イ ルで こ のカ テ ゴ リ ーのセ ク シ ョ ン に書 く の と 同 じ よ う に書 き ま
す。 た と えば :
p.set_option("FontOutline={Foobar-Bold=foobb.otf}");

注 フ ォ ン ト 構成の詳 し い説明は 141 ページ 「6.3.4 フ ォ ン ト を検索」 を参照 し て く だ さ い。

リ ソ ース値を ク エ リ ー リ ソ ース エン ト リ ーを設定する だけでな く 、PDF_get_option( ) を


使っ て ク エ リ ーする こ と も で き ます。 カ テ ゴ リ ー名を キー と し て、 リ ソ ース の番号 (1 か
ら 開始) をオプシ ョ ン と し て指定 し ます。 た と えば以下の呼び出 し :
idx = p.get_option("SearchPath", "resourcenumber=" + n);
sp = p.get_string(idx, "");

は、 SearchPath リ ス ト 内の n 番目のエン ト リ ーを取得 し ます。 要求 さ れた カ テ ゴ リ ーに対


し て利用可能なエン ト リ ーの数 よ り も n が大 き い と き は、 空文字列が返 さ れます。 返 さ れ
た文字列は、 何 ら かの API メ ソ ッ ド が次に呼び出 さ れ る ま で有効です。

3.1.5 PDF 文書を メ モ リ ー内に生成


フ ァ イ ル上に PDF 文書を生成す る だけではな く 、 PDFlib を使っ て メ モ リ ー内に直接 PDF
を生成 さ せ る こ と も で き ます ( イ ン コ ア生成 と いい ます)。 こ の技法は、何 ら デ ィ ス ク ベー
ス の入出力が伴わ な い た めに速度の面で利点が あ り ま す し 、 PDF 文書 を た と えば直接
HTTP で流 し た り す る こ と も で き ます。 Web 管理者が聞いて特に喜びそ う なのは、 自分の
サーバーにテ ン ポ ラ リ PDF フ ァ イ ルを散 ら か さ れずに済む と い う こ と で し ょ う 。
生成 さ れ る デー タ は、 定期的に少 し ずつ集め る こ と も で き ます し (た と えば各ページ
がで き る ご と に)、 最後に ま る ご と PDF 文書にな っ てか ら ひ と かた ま り で取 り 出す こ と も
で き ます (PDF_end_document( ) の後で) 。 PDF デー タ の細切れでの生成お よ び消費には
い く つかの利点があ り ます。 第一に、 デー タ 全体が メ モ リ ー内に収ま る 必要がないので、
メ モ リ ー必要量が小 さ く て済みます。 第二に、 こ の方式では速度 も 上が る 可能性があ り ま
す。 なぜな ら 、 遅い接続でデー タ を伝送 し てい る 場合で も 、 最初の 1 チ ャ ン ク を送 り 出 し
てい る 間に、 次の 1 チ ャ ン ク が も う 生成中だか ら です。 ただ し 、 生成 さ れ る デー タ の総量
は文書全体がで き あが る ま でわか り ません。
createpvf オプシ ョ ン を用い る と 、PDF デー タ をデ ィ ス ク フ ァ イ ルへ書き 込む こ と な く 、
メ モ リ ー内へ生成 し 、 その後それを PDFlib に渡す こ と がで き ます (59 ページ 「PDF 出力
を仮想フ ァ イ ル内に作成」 参照)。

能動 イ ン コ ア PDF 生成 イ ン タ ー フ ェ イ ス PDF デー タ を メ モ リ ー内 に 作成す る に は、


PDF_begin_document( ) で空の フ ァ イ ル名を指定 し 、PDF_get_buffer( ) でデー タ を取得 し ま
す:
p.begin_document("", "");
...文書を作成...
p.end_document("");

buf = p.get_buffer();
... バッファー内のPDFデータを利用 ...
p.delete();

注 バ ッ フ ァ ー内の PDF デー タ はバイ ナ リ ーデー タ と し て扱 う 必要があ り ます。

64 第 3 章 : PDF 文書を作成
こ れは 「能動」 モー ド と 捉え ら れます。 なぜな ら 、 バ ッ フ ァ ー内容をいつ取 り 出 し たいか
を ク ラ イ ア ン ト 側で決めてい る か ら です。能動モー ド はすべての対応言語バ イ ンデ ィ ン グ
で利用可能です。

注 C と C++ のク ラ イ ア ン ト では、 返っ て き たバ ッ フ ァ ーを解放 し てはいけません。

受動 イ ン コ ア PDF 生成 イ ン タ ー フ ェ イ ス 「受動」 モー ド は、C と C++ の言語バ イ ンデ ィ


ン グでのみ利用可能です。 こ の場合、 ユーザーは、 1 つの コ ールバ ッ ク 関数を イ ン ス ト ー
ル し ます (PDF_open_document_callback( ) を通 じ て)。 こ の関数は、 PDFlib に よ っ て、 予
測不可能な さ ま ざ ま な時点で呼ばれます。PDF デー タ が消費 さ れ る のを待っ てい る 時には
いつで も 呼ばれ る こ と にな り ます。 放出 ( ラ イ ブ ラ リ ーか ら ク ラ イ ア ン ト への PDF デー
タ の転送) に関す る タ イ ミ ン グ上の、 ひいてはバ ッ フ ァ ー容量上の束縛条件は、 ク ラ イ ア
ン ト 側で構成す る こ と がで き る ので、 柔軟性が非常に高 く な っ てい ます。 環境に よ っ て、
PDF 文書を ま る ご と 一度に取 り 出すのが好都合な場合 も あ る で し ょ う し 、複数のチ ャ ン ク
に分け る のが よ い場合 も あ る で し ょ う し 、 た く さ んの コ マ切れに分けて PDFlib の内部文
書バ ッ フ ァ ー量を抑え る のが望ま し い場合 も あ る で し ょ う 。 放出の手法を設定する には、
PDF_open_document_callback( ) で flush オプシ ョ ンの値を指定 し ます。

3.1.6 PDF 文書の最大サ イ ズ と その他の制限


PDF 文書のサ イ ズ 多 く のユーザーはギガバ イ ト 単位の PDF 文書を扱 う 必要には迫 ら れ
ないで し ょ う が、 業務アプ リ ケーシ ョ ンのなかには、 大量の請求書や明細な ど を含む文書
を作成 し た り 処理 し た り す る 必要があ る も のがあ り ます。PDFlib 自体は生成す る 文書のサ
イ ズにいかな る 制約 も 設けてい ませんが、 PDF Reference やい く つかの PDF 規格に よ っ て
課せ ら れ る い く つかの制限があ り ます :
> 10 GB フ ァ イ ルサ イ ズ制限:PDF 1.4 の文書は、相互参照テーブルに よ っ て、10 進 10 桁
すなわち 1010-1 バ イ ト ま でに制限 さ れて き ま し た。 こ れはお よ そ 9.3 GB にあ た り ま
す。 10 GB を超え る 出力文書を作成 し よ う と す る な ら 、 PDF 1.5 以上を使用す る 必要が
あ り ます。こ のバージ ョ ンは、10 桁制限に も はや縛 ら れない圧縮オブジ ェ ク ト ス ト リ ー
ム をサポー ト し てい ますので、 10 GB を超え る PDF 文書の作成が可能です。
> オブジ ェ ク ト の数 : 一文書内のオブジ ェ ク ト の数は全般的には PDF に よ っ て制限 さ れ
てい ませんが、 PDF/A ・ PDF/X-4 ・ PDF/X-5 規格では、 一文書内の間接オブジ ェ ク ト
の数を 8,388,607 個に制限 し てい ます。一文書が こ の制限を超え る オブジ ェ ク ト を必要
と す る と き は、 PDFlib は PDF/A-1 ・ PDF/X-4 ・ PDF/X-5 モー ド では例外を発生 さ せま
す。 それ以外のモー ド ではつねに、 も っ と オブジ ェ ク ト の多い文書を作成で き ます。 こ
のチ ェ ッ ク を、 文書オプシ ョ ン limitcheck=false を用いて無効化する こ と も で き ます。
PDF 内のオブジ ェ ク ト の数は、 ページ内容の複雑 さ や、 相互参照要素の数な ど に依存
し ます。 シ ンプルな内容の大容量文書は通常ページ あ た り 4 ~ 10 個のオブジ ェ ク ト を
持ち ますので、100 ~ 200 万ページ程度の文書であれば、規格が要求す る こ のオブジ ェ
ク ト 制限を超えずに作成す る こ と がで き ます。

PDF の制限 PDFlib は、特定の実体に制約を課す こ と に よ っ て、PDF Reference か Acrobat、


ま たは何 ら かの PDF 規格に よ っ て課せ ら れ る 制限に準拠す る PDF 出力を作成 し ます。 こ
れ ら の制限を以下に記 し ます。
以下の制限が、 値を然 る べ く 変更す る こ と に よ っ て強制 さ れます :
> PDF 内におけ る 最小の絶対浮動小数点値:0.000015。 こ れ よ り 小 さ な絶対値を持つ数は
0 へ置換 さ れます。

3.1 PDFlib プ ログ ラ ミ ングの一般的特徴 65


> (PDF 1.4。ただ し それ よ り 新 し い PDF バージ ョ ンにはあ ては ま り ません)PDF 内におい
て浮動小数点数 と し て表現で き る 最大の絶対値 : 32767.0。 こ れ よ り 大き な絶対値を持
つ数は、 その最 も 近い整数へ置換 さ れます。

PDF 形式は特定の諸制限を課 し てい ます。以下のいずれか 1 つの制限を超え る と 例外が発


生 し ます :
> PDF 内において許容 さ れ る 最大の数値 : 2,147,483,647
> ハ イ パーテ キ ス ト 文字列の最大長 : 65535
> ページ上のテ キ ス ト 文字列の最大長 : 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.7 Web 最適化 (線形) PDF


PDFlib は、 線形化 と い う 処理を PDF 文書に対 し て適用する こ と がで き ます (PDF の線形
化は 「最適化」 ・ 「Web 表示用に最適化」 と も いい ます)。 線形化は、 PDF フ ァ イ ル内部の
オブジ ェ ク ト 群を再配列す る と と も に、ア ク セ ス高速化のために活用 さ れ う る 補足情報を
追加 し ます。
非線形化 PDF は、 ク ラ イ ア ン ト へま る ご と 転送 さ れ る 必要があ り ますが、 Web サー
バーは線形化 PDF 文書を、 バ イ ト サービ ン グ と い う 処理を用いて、 1 ページずつ転送する
こ と が可能です。 こ れに よ っ て、 Web ブ ラ ウ ザーは、 PDF 文書の個別のページ を別々に
取得す る こ と が可能にな り ます。 その結果 と し て、 その文書の最初のページが、 文書全体
がサーバーか ら ダ ウ ン ロ ー ド さ れ終わ る のを待つ こ と な く 、 ユーザーに提示 さ れます。
PDF をバ イ ト サービ ン グす る 利点を活かすには、 PDF 文書を線形化 し てお く 必要があ
り ます。 こ れは PDF_begin_document( ) の linearize オプシ ョ ン で実現で き ます :
p.begin_document(outfilename, "linearize");

3.1.8 マルチ ス レ ッ ド プ ロ グ ラ ミ ン グ
PDFlib その も のはシ ン グルス レ ッ ド ですが、マルチ ス レ ッ ド アプ リ ケーシ ョ ンで安全に使
用する こ と がで き ます。1 つの PDFlib オブジ ェ ク ト が 1 つの ス レ ッ ド 内でのみ使用 さ れ る
と い う よ く あ る 状況においては、マルチ ス レ ッ デ ィ ン グに関する 特別な注意は一切必要あ
り ません。 同一のオブジ ェ ク ト が複数の ス レ ッ ド で使用 さ れ る 場合には、 その PDFlib オ
ブジ ェ ク ト が複数の ス レ ッ ド に よ っ て同時にア ク セ ス さ れ る こ と のない よ う 、アプ リ ケー
シ ョ ンはそれ ら の ス レ ッ ド を同期 さ せ る 必要があ り ます。 典型的なシナ リ オは PDFlib オ
ブジ ェ ク ト 群のプールを利用する も ので、 そ こ では各ス レ ッ ド が、 新規 PDFlib オブジ ェ
ク ト を作成す る のではな く 、 既存の PDFlib オブジ ェ ク ト を 1 つ取 り 出 し て、 そ し て文書
を作成 し た後に、 そのオブジ ェ ク ト が も う 必要ない場合には、 それを プールへ返 し ます。
同一の PDFlib オブジ ェ ク ト を、 その出力文書が完了する 前に別の ス レ ッ ド で使用する こ
と は、 いかな る 利点を も 与え る こ と はめ っ たにな く 、 推奨 さ れません。

3.1.9 EBCDIC ベースのプ ラ ッ ト フ ォ ームで PDFlib を使 う


PDF フ ァ イ ル形式の中のオペレー タ ー と 制御構造は ASCII ベース であ り 、 EBCDIC ベース
のプ ラ ッ ト フ ォーム IBM System i・IBM Z では正 し く 動作 し ません (ただ し zLinux は ASCII
ベース ですので こ の限 り ではあ り ません) 。 し か し 、 特別な メ イ ン フ レームバージ ョ ンの

66 第 3 章 : PDF 文書を作成
PDFlib を利用すれば、 ASCII ベース の PDF オペレー タ ー と EBCDIC の (ま たはそれ以外
の) テ キ ス ト 出力 と を混ぜ る こ と がで き ます。 こ う し た EBCDIC セーフ なバージ ョ ンの
PDFlib は、さ ま ざ ま なオペレーテ ィ ン グ シ ス テ ムやマシ ン アーキ テ ク チ ャ ーで利用可能で
す。
PDFlib の さ ま ざ ま な機能を EBCDIC ベース のプ ラ ッ ト フ ォームで活用す る ためには、
以下のア イ テ ムは EBCDIC テ キ ス ト 形式で与え ら れ る こ と が期待 さ れます( よ り 具体的に
は、 IBM System i では コ ー ド ページ 037 で、 IBM Z では コ ー ド ページ 1047 で) :
> UPR 構成フ ァ イ ル
> エン コ ーデ ィ ン グ フ ァ イ ル ・ コ ー ド ページ フ ァ イ ル
> PDFlib 関数の文字列引数
> 入出力フ ァ イ ル名
> 環境変数 (実行環境が対応 し てい る 場合)
> PDFlib のエ ラ ー メ ッ セージ も EBCDIC 形式で生成 さ れます (Java 以外)。

ASCII 形式の入力テ キ ス ト フ ァ イ ルを使いたい場合は、 asciifile オプシ ョ ン を true に設定


し ます (デフ ォ ル ト は、 IBM Z では false、 IBM System i では true)。 する と PDFlib は、 こ
れ ら の フ ァ イ ルが ASCII エン コ ーデ ィ ン グで書かれてい る と 期待す る よ う にな り ます。 た
だ し その場合で も 、文字列引数はやは り EBCDICエン コ ーデ ィ ン グであ る と 期待 さ れます。
こ れに対 し 、以下のア イ テ ムはつねにバ イ ナ リ ーモー ド で取 り 扱 う 必要があ り ます (す
なわち、 いかな る 変換 も 行っ てはいけ ません) :
> PDF 入出力フ ァ イ ル
> PFB フ ォ ン ト ア ウ ト ラ イ ン フ ァ イ ル ・ PFM フ ォ ン ト メ ト リ ッ ク フ ァ イ ル
> TrueType ・ OpenType フ ォ ン ト フ ァ イ ル
> 画像フ ァ イ ル ・ ICC プ ロ フ ァ イ ル

3.1 PDFlib プ ログ ラ ミ ングの一般的特徴 67


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 に設定 さ れていれば、ページ内容に対 し て も イ ン タ ラ ク テ ィ ブ要素に対 し て も 同 じ 座
標系が使え る と い う こ と です。

68 第 3 章 : PDF 文書を作成
座標を視覚化 PDFlib のユーザーが PDF の座標系を扱 う のを支援する ために、 PDFlib の
デ ィ ス ト リ ビ ュ ーシ ョ ンには grid.pdf と い う PDF フ ァ イ ルが含まれてい ます。 こ の PDF
フ ァ イ ルは、 よ く 使われ る い く つかのページ寸法の座標を視覚化す る も のです。 望みの寸
法のページ を何か透明な も のに印刷すれば、PDFlib での開発のために有用な道具にな る か
も し れません。
Acrobat DC でページ座標を視覚化す る には以下の と お り 操作 し ます :
> カー ソ ル座標を表示す る には以下を用い ます :
「表示」 → 「表示切 り 替え」 → 「カ ー ソ ル座標」
> 座標は、Acrobat で現在選択 さ れてい る 単位で表示 さ れます。表示単位を変更す る には、
次の と お り 操作 し ます : 「編集」 → 「環境設定」 (→ 「一般 ...」) → 「単位 と ガ イ ド 」 を
選択 し て、 ポ イ ン ト ・ イ ンチ ・ ミ リ ・ パ イ カ ・ セ ンチ メ ー ト ルの う ちのいずれか を選
びます。

ただ し 、 表示 さ れ る 座標系はページの左上隅が原点であ り 、 PDF のデフ ォ ル ト であ る 左下


隅の原点 と は異な る ので注意が必要です。 Acrobat の座標表示 と 合わせた座標系を選ぶ方
法については 69 ページ 「下向 き 座標を用い る 」 を参照 し て く だ さ い。

オ ブ ジ ェ ク ト を回転 重要な こ と は、 一度ページ上に描いた も のは変更がで き ない と い


う こ と です。 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");

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の textflow/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 ページ記述 69
下向 き 座標が簡単に利用で き る よ う にす る ため、 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 リ フ ァ レ ン ス よ り )。 こ う し た項目はあ る 種の環
境で有用です :

70 第 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 ページ記述 71
直接パ ス を作成 し ておいて上記の操作を何 も 適用 し ない と エ ラ ーにな り ま す。 PDFlib
の ス コ ープ体系に従えば、 ク ラ イ ア ン ト は こ の制約に自然に従 う こ と にな り ます。 パ ス の
書式属性 (色 ・ 線幅な ど) を変えたい場合はかな ら ず、 描画操作の開始前に行 う 必要があ
り ます。 こ の規則を一言で言えば 「パス記述の途中で、 書式を変えてはいけ ません」。
パ ス を ただ作成 し ただけではページには何 も 現れ ません。 塗 り か描線をパ ス に適用 し
なければ目に見え る 結果は得 ら れません :
p.set_graphics_option("strokecolor=red");
p.moveto(100, 100);
p.lineto(200, 100);
p.stroke();

たいていのグ ラ フ ィ ッ ク 関数では、 カ レ ン ト 点 と い う 概念を利用 し てい ます。 こ れは、 描


画に用いてい る ペンの位置 と 捉え る こ と がで き ます。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の graphics/starter_graphics ト ピ ッ ク にあ り ます。

3.2.4 パス オ ブ ジ ェ ク ト
パ ス オブジ ェ ク ト は、 直接パ ス よ り も 便利で強力な も のです。 パ ス を構築する ためのすべ
ての描画操作を カプセル化 し ます。 直接パ ス と 異な り 、 パス オブジ ェ ク ト は、 PDF_delete_
path( ) を用いて明示的に破棄す る ま で複数回使用で き ます。パ ス に関する 情報については
PDF_info_path( ) を用いて取得で き ます。 パ ス オブジ ェ ク ト を作成す る 方法は複数あ り ま
す:

パス オ ブ ジ ェ ク ト を直接作成 PDF_add_path_point( ) を呼び出す と 、 点群お よ び紐付い


たパ ス要素群がパ ス オブジ ェ ク ト に追加 さ れます。 こ の メ ソ ッ ド は、 新規に構築 さ れたパ
ス に対 し て、 既存のパ ス オ ブ ジ ェ ク ト への参照 を 追加す る こ と も で き ま す。 PDF_add_
path_point( ) では、 パ ス構築を実現す る ためのい く つかの便利なオプシ ョ ン を使え ます。
以下の コ ー ド 断片は、 円 1 個を持つシ ンプルなパ ス オブジ ェ ク ト を作成 し 、 それをページ
上の別々の 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);

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の graphics/starter_graphics ト ピ ッ ク にあ り ます。

パス オ ブ ジ ェ ク ト を画像の ク リ ッ ピ ン グパスか ら 作成 TIFF ま たは JPEG ラ ス タ ー画像


内に含まれてい る ク リ ッ ピ ン グパス を、 PDF_info_image( ) と キーワ ー ド clippingpath を用
いて取得で き ます :
image = p.load_image("auto", "image.tif", "clippingpathname={path 1} infomode");

path = (int) p.info_image(image, "clippingpath", "");


if (path == -1)
throw new Exception("エラー : クリッピングパスが見つかりません!");

p.draw_path(path, 0, 0, "stroke");

72 第 3 章 : PDF 文書を作成
こ れは、 任意のパ ス 群を取 り 込むための簡便な方式を提供 し ま す。 画像本体の ピ ク セル
デー タ が必要ない場合には、 infomode オプシ ョ ン を用いて画像を読み込む こ と に よ っ て
出力フ ァ イ ルサ イ ズ を減 ら す こ と も 可能です。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク のgraphics/import_path_from_image ト ピ ッ ク にあ り


ます。

パスオ ブ ジ ェ ク ト を SVG パス文法か ら 作成 SVG パ ス文法を用いてパ ス オブジ ェ ク ト を


構築す る こ と も 可能です。 こ の文法は、 path エ レ メ ン ト の d 属性に対 し て必要な も の と
同 じ です (www.w3.org/TR/SVG11/paths.html#PathData を参照)。 SVG グ ラ フ ィ ッ ク フ ァ イ
ル全体が必要なわけではな く 、 PDF_add_path_point( ) の svgpath オプシ ョ ンに与え る パ ス
記述を内容 と する 文字列があれば足 り ます。 パ ス が SVG フ ァ イ ルか ら 直接由来 し てい る
場合には下向 き の座標を使用 し てい る ので、PDFlib で使 う ために合わせ る 必要があ り ます
(topdown ページオプシ ョ ン を指定 し てい る 場合であ っ て も )。 第一に、 scale={1 -1} を与え
る こ と に よ っ てパ ス を ア ン ミ ラ ー し ます。 第二に、 以下の コ ー ド 断片の よ う に、 PDF_info_
path( ) を使っ てパス の外接枠の隅の座標を決定 し 、 望む位置にそれを配置 し ます。 こ こ で
(x1, y1) は左下隅です :
String svgPath="M 100 100 L 300 100 L 200 300 z";

/* 上記のSVGパス記述からパスオブジェクトを作成 */
int path = p.add_path_point(-1, 0, 0, "addpath", "svgpath = {" + svgPath + "} close");
String mirroropt = "scale= {1 -1}";

double corner_x = p.info_path(path, "x1", mirroropt);


double corner_y = p.info_path(path, "y1", mirroropt);
double target_x = 200, target_y = 500;

/* 選択した隅を、望む位置に配置。「topdown」ページオプションを用いている場合には
(target_x-corner_x, target_y+corner_y)をかわりに使用。
*/
p.draw_path(path, target_x-corner_x, target_y-corner_y,
mirroropt + " stroke linewidth=3");

ク ッ ク ブ ッ ク A full code sample can be found in the Cookbook topic graphics/svg_path.

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の graphics/svg_path ト ピ ッ ク にあ り ます。

パスオ ブ ジ ェ ク ト を オ ブ ジ ェ ク ト の外接枠か ら 作成 配置 さ れた PDF ページ ・SVG グ ラ


フ ィ ッ ク ・ パ ス ・ ラ ス タ ー画像 ・ 表組み ・ 範囲枠 ・ テ キ ス ト フ ロ ー ・ テ キ ス ト 行を内包す
る 長方形 (外接枠) を、 対応す る PDF_info_*( ) メ ソ ッ ド を用いて抽出で き ます :
optlist = "boxsize={400 300} fitmethod=clip matchbox={name=border}";
p.fit_image(image, 200, 150, optlist);

int path = (int) p.info_matchbox("border", 1, "boundingbox");


p.draw_path(path, 0, 0, "close stroke linewidth=10 strokecolor=red");
p.delete_path(path);

パスオ ブ ジ ェ ク ト を使用 パ ス オブジ ェ ク ト を作成 ま たは取得 し た後には、 それを さ ま


ざ ま な目的に使え ます :
> PDF_draw_path( ) を用いて、 ページ上でそのパ ス の塗 り ・ 描線を行な っ た り 、 パ ス を ク
リ ッ ピ ン グパ ス と し て使用 し た り す る こ と がで き ます。

3.2 ページ記述 73
> PDF_fit_textflow( ) を用いてそのパ ス に複数行テ キ ス ト を回 り 込ませる : テ キ ス ト が任
意の形状の内部ま たは外部を回 り こ む よ う に組まれます (255 ページ 「9.2.11 テ キ ス ト
をパ ス ・ 画像に回 り 込ませ る 」 参照)。
> PDF_fit_textline( ) を用いてそのパス の上にテ キ ス ト を配置、すなわち、キ ャ ラ ク タ ー群
がそのパ ス の曲線に沿っ て並びます (235 ページ 「9.1.7 パ ス上テ キ ス ト 」 参照)。
> PDF_add_table_cell( ) を用いてパ ス オブジ ェ ク ト 群を表セル内に配置。

3.2.5 テ ン プ レ ー ト ( フ ォ ーム XObject)
テ ン プ レ ー ト (PDF 内の フ ォ ーム XObject) PDFlib では、 技術用語で フ ォ ーム XObject
と 呼ばれ る PDF の機能に対応 し てい ます。 し か し こ の用語は、 対話的な フ ォーム と ま ぎ
ら わ し いため、 私達は こ の機能を 「テ ン プ レー ト 」 と 呼び ま す。 PDFlib のテ ン プ レ ー ト
は、 ページ外のバ ッ フ ァ ー と 捉え る こ と がで き 、 そ こ ではテ キ ス ト ・ ベ ク ト ル ・ 画像の操
作が行え ます (ページ上で直接操作す る のではな く ) 。 テ ンプ レー ト がで き た ら 、 それは
ラ ス タ ー画像の よ う に使 う こ と がで き 、 任意の回数、 任意のページに貼 り 付け る こ と が可
能です。 画像同様、 テ ンプ レー ト には拡縮や斜形化な ど の幾何学的変形を施す こ と がで き
ます。 1 つのテ ンプ レー ト を複数のページで使っ た場合には (ない し は同 じ ページで複数
回)、 テ ンプ レー ト を構成す る PDF オペレー タ ーは実際には PDF フ ァ イ ル中に 1 回 し か
書かれていないので、 PDF 出力フ ァ イ ルサ イ ズの節約にな り ます。 テ ンプ レー ト は、 複数
のページに繰 り 返 し 現れ る も のに対 し て推奨 さ れ ます。 た と えば、 毎ページ同 じ 背景や、
企業 ロ ゴや、 CAD ソ フ ト ・ 地図作成 ソ フ ト の吐 き 出す図記号な ど です。 テ ンプ レー ト は、
ク リ ッ ピ ン グパ ス を持っ た ラ ス タ ー画像を複数回配置する 場合に も 推奨 さ れます。テ ンプ
レー ト を作成す る には以下の方法があ り ます :
> PDF_begin_template_ext( ) で直接。
> ベ ク ト ルグ ラ フ ィ ッ ク か ら PDF_load_graphics( ) と templateoptions オプシ ョ ンで間接的
に。
> ラ ス タ ー画像か ら PDF_load_image( ) と templateoptions オプシ ョ ンで間接的に。こ のオ
プシ ョ ンがない と 、 PDF_load_image( ) は、 画像 XObject と い う 同様の PDF 構造を作成
し ます。

注 PDF_open_pdi_page( ) で取 り 込まれた PDF ページ も PDF フ ォ ーム XObject を作成 し ます


が、 こ れはテ ン プ レー ト 関数ではな く PDI 関数で扱われます。

テ ンプ レー ト は以下の よ う に利用で き ます :
> PDF_fit_image( ) を用いてそのテ ンプ レー ト をページ上ま たは他の コ ン テ ン ツ ス ト リ ー
ム上に配置 (後述) :
> そのテ ン プ レー ト に よ っ て定義 し た輝度 ソ フ ト マ ス ク を用いて グ ラ フ ィ ッ ク ス テー ト
を作成 (PDF_create_gstate( ) のオプシ ョ ン softmask のサブオプシ ョ ン template、 105
ページ 「4.9.2 ソ フ ト マ ス ク を用いて色を変え る 」 参照)。
> SVG グ ラ フ ィ ッ ク を読み込む際の フ ォールバ ッ ク (背景) と し て (PDF_load_graphics( )
のオプシ ョ ン fallbackimage)。
> 注釈の体裁 と し て (PDF_create_annotation( ) のオプシ ョ ン template のサブオプシ ョ ン
normal/rollover/down)。
> 押 し ボ タ ン フ ォーム フ ィ ール ド の体裁 と し て (PDF_create_field( ) のオプシ ョ ン icon/
icondown/iconrollover)。

テ ン プ レ ー ト を PDFlib で作成 ・ 利用 テ ンプ レー ト は、ラ ス タ ー画像 と ま っ た く 同様に、


PDF_fit_image( ) メ ソ ッ ド でページ上ま たは他のテ ンプ レー ト 上に貼 り 付け る こ と がで き

74 第 3 章 : PDF 文書を作成
ます (221 ページ 「8.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);

あ ら ゆ る テ キ ス ト ・ グ ラ フ ィ ッ ク ・ 色関数がテ ンプ レー ト 上では使え ます。 ただ し 、 以下


の関数は、 テ ンプ レー ト を作成 し てい る 間には使っ てはいけ ません :
> PDF_begin_item( ) と 、 さ ま ざ ま な関数の tag オプシ ョ ン :構造エ レ メ ン ト はテ ンプ レー
ト 内では作成で き ません。
> すべての イ ン タ ラ ク テ ィ ブ関数 : こ れ ら は、 配置 し たい文書ページ上で定義 し な けれ
ばな ら ず、 テ ンプ レー ト の一部 と し て生成す る こ と はで き ません。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の general/repeated_contents ト ピ ッ ク にあ り ます。

3.2 ページ記述 75
3.3 PDF のパス ワー ド セキ ュ リ テ ィ ー
3.3.1 PDF におけ るパスワー ド セキ ュ リ テ ィ ー
PDF のパ ス ワ ー ド セキ ュ リ テ ィ ーは、 以下の保護機能を提供 し ます :
> ユーザーパ ス ワ ー ド (開 く パ ス ワ ー ド と も 呼ばれ ます) が、 フ ァ イ ルを閲覧す る ため
に開 く ために必要。 ユーザーパ ス ワ ー ド を持つフ ァ イ ルのみが、 ク ラ ッ キ ン グか ら 安
全です!
> マ ス タ ーパ ス ワ ー ド (所有者ま たは権限パ ス ワ ー ド と も 呼ばれ ます) が、 権限、 ユー
ザーま たはマ ス タ ーパ ス ワ ー ド と い っ たセ キ ュ リ テ ィ ー設定を変更す る ために必要で
す。 ユーザーパ ス ワ ー ド と マ ス タ ーパ ス ワ ー ド を持っ た フ ァ イ ルは、 いずれかのパ ス
ワー ド を与え る こ と に よ っ て、 閲覧す る ために開 く こ と がで き ます。
> 権限設定が、 PDF 文書に対す る 、 印刷やテ キ ス ト 抽出 と いっ た特定の操作を制限 し ま
す。
> 添付パ ス ワ ー ド を、 文書自体の本体内容ではな く 、 フ ァ イ ル添付だけ を暗号化す る た
めに与え る こ と がで き ます。

PDF 文書が こ のいずれかの保護機能を使用する 場合には、 その文書は暗号化 さ れます。

権限制限 PDF は、 文書の操作に関す る さ ま ざ ま な制約を符号化す る こ と がで き 、 こ れ


は個別に許可 し た り 禁止 し た り す る こ と がで き ます :
> 印刷を許可 : 印刷が許可 さ れていなければ、 Acrobat の印刷ボ タ ンは無効の ま ま にな り
ます。 Acrobat は、 低解像度印刷 (150 dpi) と 高解像度印刷の区別に対応 し てい ます。
低解像度印刷は、 ページの ラ ス タ ー画像を生成 し 、 こ れは私的利用にのみ適 し てい ま
すが、 高解像度での複製がで き ない よ う にな っ てい ます。 画像ベー ス の印刷は、 低い
出力品質 と な る のみな ら ず、 印刷処理を かな り 遅 く さ せる こ と に も 留意 し て く だ さ い。
> 変更を許可 : 以下の一覧は、 さ ま ざ ま な文書変更操作に対す る 制御を提供 し ます :

ページの挿入、削除、回転
フォームフィールドへの入力と既存の署名フィールドに署名
注釈の作成、フォームフィールドの入力と既存の署名フィールドに署名
ページの抽出を除くすべての操作

Adobe Reader が表示す る 権限制限は信頼で き ない こ と に留意 し て く だ さ い。 た と えば、


それはアセ ンブ リ 機能を持っ ていないので、文書内の実際の権限設定にかかわ ら ず、つ
ねに 「文書アセ ン ブ リ : 許可 し ない」 と 表示 し ます。
> 内容の コ ピーは、 「テキス ト 、 画像、 お よびその他の内容の コ ピーを有効にする」 を通
じ て制御 さ れます。 こ れは、 「ス ク リ ーン リ ーダーデバイ スのテキス ト ア ク セス を有効
にする」 を用いて有効化す る こ と も で き ますが、 PDF 2.0 では、 PDF リ ーダーはつね
にア ク セシ ビ リ テ ィ ーに対応す る べ き なので、 こ の設定は廃止済です。

文書に対 し て、 「印刷を許可 : な し 」 と いっ た ア ク セ ス制限を指定す る と 、 Acrobat 内の各


機能 も 無効にな り ます。 ただ し 、 こ れは他の PDF ビ ュ ーアーで も そ う と は限 り ません。 ア
ク セ ス権限に従 う か ど う かは、 PDF ツールの開発者次第なのです。

3.3.2 PDFlib を用いて PDF 文書をパスワー ド 保護


PDFlib は、PDF 文書を生成す る 際に、標準のセキ ュ リ テ ィ ー機能を適用する こ と がで き ま
す。 保護 さ れた PDF 文書か ら 、 PDFlib+PDI か PDFlib Personalization Server (PPS) でペー
ジ を取 り 込むには、 マ ス タ ーパ ス ワ ー ド か shrug オプシ ョ ン が必要です。 文書のプ ロ パ

76 第 3 章 : PDF 文書を作成
テ ィ を pCOS イ ン タ ーフ ェ イ ス で ク エ リ ーす る 際には、 pCOS モー ド で制御 さ れます。 た
と えば、 XMP 文書デー タ ・ 文書情報フ ィ ール ド ・ し お り ・ 注釈内容は、 その文書がユー
ザーパ ス ワ ー ド を必要 と し ない場合には (ま たはユーザーパ ス ワー ド のみが与え ら れた場
合には)、 マ ス タ ーパ ス ワ ー ド な し で取得で き ます。 こ れについては pCOS パ ス リ フ ァ レ
ン ス で さ ら に詳 し く 説明 し てい ます。

注 PDFlib GmbH 製品で PDF 文書を Reader 有効化する (た と えば Acrobat Reader で注釈を許
す) こ と はで き ません。

暗号化アルゴ リ ズム と キー長 パ ス ワ ー ド を用いて文書を保護す る ために使用 さ れ る 暗


号化アルゴ リ ズ ム と キー長は、 PDF_begin_document( ) の compatibility オプシ ョ ンに従っ
て生成 さ れ る 文書の PDF バージ ョ ンに依存 し ます :
> PDF 1.4 ・ 1.5 : 利用可能なセキ ュ ア な暗号化アルゴ リ ズ ムがないので、 暗号化をサポー
ト し てい ません。
> PDF 1.6 ・ PDF 1.7 ・ PDF 1.7ext3 : AES-128 が使用 さ れますが、 こ れ ら の PDF バージ ョ
ン での暗号化は廃止済です。 PDF 1.7ext3 (Acrobat 9) に従っ た AES-256 は、 その既知
の脆弱性があ る ので、 全 く 使用 さ れません。
> PDF 1.7ext8 ・ PDF 2.0 : Acrobat X/XI/DC に従っ た AES-256 が使用 さ れます。 こ れが推
奨 さ れ る アルゴ リ ズ ム です。デフ ォ ル ト の PDF 出力バージ ョ ンは PDF 1.7ext8 なので、
こ れがデフ ォ ル ト で使用 さ れます。

パスワー ド を PDFlib で設定 パ ス ワ ー ド は、 PDF_begin_document( ) の userpassword ・


masterpassword オプシ ョ ンで設定で き ます。 PDFlib は、 生成 さ れ る 文書のために ク ラ イ
ア ン ト が与え たパ ス ワ ー ド と 、 以下の方式で相互作用 し ます :
> ユーザーパ ス ワ ー ド か何 ら かの権限制限が与え ら れていなが ら 、 マ ス タ ーパ ス ワ ー ド
が与え ら れていない場合には、 通常のユーザーが簡単にセキ ュ リ テ ィ ー設定を変更す
る こ と がで き る ので、 いかな る 保護 も 無効 と な り ます。 こ の理由か ら 、 PDFlib は こ の
状況を エ ラ ー と 見な し ます。
> ユーザーパ ス ワ ー ド と マ ス タ ーパ ス ワ ー ド が同 じ の場合には、 その フ ァ イ ルのユー
ザー と 所有者の区別が も はやつかないので、 こ の場合 も 効果的な保護は無効 と な り ま
す。 PDFlib は こ の状況を エ ラ ー と 見な し ます。
> AES-256 では Unicode のパ ス ワ ー ド が許 さ れますが、AES-128 のパ ス ワ ー ド は Latin-1 文
字集合に限 ら れます。
> パ ス ワー ド は、AES-256 の場合には 127 UTF-8 バ イ ト で、AES-128 の場合には 32 キ ャ ラ
ク タ ーで切 り 捨て ら れます。

権限を PDFlib で設定 操作制限は PDF_begin_document( ) の permissions オプシ ョ ンで設


定す る こ と がで き ます。 それは操作制限の入っ た 1 個ない し 複数の文字列で構成 さ れ ま
す。 permissions オプシ ョ ン を設定す る 際には masterpassword オプシ ョ ン も 設定 し なけれ
ばな り ません。なぜな ら そ う でなければユーザーが簡単に権限設定を取 り 除けて し ま う か
ら です。デフ ォ ル ト ではすべての操作が許可 さ れてい ます。操作制限を指定す る と Acrobat
のその機能は無効にな り ます。操作制限はユーザーパ ス ワー ド な し で適用す る こ と がで き
ます。 以下の例の よ う に スペース で区切れば、 複数の制限キーワー ド を指定す る こ と も で
き ます :
p.begin_document(filename, "masterpassword=abcd1234 permissions={noprint nocopy}");

表 3.3 に、 使え る すべての操作制限キー ワー ド を挙げます。

3.3 PDF のパスワー ド セキ ュ リ テ ィ ー 77


ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の general/permission_settings ト ピ ッ ク にあ り ま
す。

表 3.3 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 が指定 さ れていない場合は、 印刷は 「画像
と し て印刷」 機能に制限 さ れます。 すなわち その場合、 ページが低解像度に変換 さ れた も
のを印刷する こ と し かで き ません。
plain- 暗号化文書で も、 文書の メ タ デー タ を暗号化 し ないま まに し ます。 これは XMP メ タ デー タ
metadata にのみ影響 し 、 文書情報 フ ィ ール ド には影響 し ません。

暗号化 フ ァ イ ル添付 添付 フ ァ イ ルは、 それ以外は暗号化 さ れていない文書の中に あ っ


て も 、 暗号 化 す る こ と が 可 能 で す。 こ れ を 実現す る に は、 PDF_begin_document( ) で
attachmentpassword オプシ ョ ン を与え ます。

78 第 3 章 : PDF 文書を作成
3.4 XMP メ タ デー タ
文書情報フ ィ ール ド のかわ り と し て、 あ る いはそれに加え る も の と し て、 PDFlib は メ タ
デー タ を指定する ための フ レーム ワ ー ク と し て、 XMP (Extensible Metadata Platform) に
対応 し てい ます。 XMP は ISO 16684-1:2012 と し て標準化 さ れてい ます。 PDFlib におけ る
XMP 対応にはい く つかの側面があ り ますので、 以下説明 し ます。

ク ッ ク ブ ッ ク シ ン プルな XMP サン プルが、ク ッ ク ブ ッ ク ト ピ ッ ク interchange/embed_xmp 内にあ り ます。

多 く の場合、 XMP は文書全体に メ タ デー タ を紐付け る ために用い ら れ ます。 文書レベル


メ タ デー タ のほかに、 XMP はページ ・ フ ォ ン ト ・ 画像 ・ グ ラ フ ィ ッ ク ・ 画像 ・ 取 り 込み
PDF ページに対 し て与え る こ と も で き ます。 こ れは、 さ ま ざ ま な メ ソ ッ ド の metadata オ
プシ ョ ンで実現で き ます。 た と えば :
metadata={filename=info.xmp inputencoding=winansi}

こ の metadata オプシ ョ ンは、 完全な XMP メ タ デー タ ス ト リ ーム ない し はその一部分を


受け付け ます。 PDFlib は、 ユーザーが与えた XMP メ タ デー タ を、 XML 規則 と XMP/RDF
規則に従っ て検証 し ます。 PDF/A の場合には、 カ ス タ ム XMP プ ロ パテ ィ に対す る 追加規
則が適用 さ れます : 355 ページ 「12.2.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/X と は無関係です) XMP ス キーマ内に配置 さ れますが、 PDF/A モー ド
では、 PDF/A ではカ ス タ ム XMP プ ロ パテ ィ には拡張ス キーマ記述が必須なので、 無視 さ
れます。

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}";
}

p.end_document(optlist);
p.delete_pvf("/xmp/document.xmp");

3.4 XMP メ タ デー タ 79
3.5 連携 フ ァ イ ル
注 連携フ ァ イルに関する さ ら な る情報が、 PDF 協会が発行 し た Application Note 0002 にあ
り ます (www.pdfa.org/resource/pdf-2-0-application-note-002-associated-files/)。

連携フ ァ イ ルはフ ァ イ ル添付 と 似てい ますが、PDF 文書内の個別のオブジ ェ ク ト にデー タ


を接続する ために使え ます。 連携フ ァ イ ルを使 う と 、 任意の形式の コ ン テ ン ツ を PDF の
オブジ ェ ク ト に紐付け る こ と がで き 、 関係の種類 も 指定で き ます。 1 つない し 複数のフ ァ
イ ルを 1 つのオブジ ェ ク ト と 連携 さ せ る こ と が可能です。 こ れは さ ま ざ ま な API メ ソ ッ ド
のオプシ ョ ン associatedfiles を用いて実現で き ます。
連携フ ァ イ ルは、 PDF_load_asset( ) を用いて読み込む必要があ り ます。 通常の フ ァ イ ル
添付 と 異な り 、 連携フ ァ イ ルはデフ ォ ル ト では Acrobat の添付ペーンに リ ス ト さ れてい ま
せん。 アセ ッ ト をオプシ ョ ン documentattachment を用いて読み込む と 、 その連携フ ァ イ
ルは文書添付の リ ス ト に入 り ます。 その結果、 こ の連携フ ァ イ ル (群) は添付の一覧で見
え る よ う にな り ます。 こ れ ら のフ ァ イ ルは、 オプシ ョ ン external=true を与え ていない限
り 、 生成 さ れ る PDF 文書の中に埋め込まれます。
連携フ ァ イ ルは PDF 2.0 の一部ですが、PDF/A-3 で導入 さ れてお り 、そち ら は連携フ ァ
イ ルに以下の制限を課 し ます :
> 埋め込んでいない外部フ ァ イ ルへの参照、 すなわち external=true は許 さ れません。
> 連携フ ァ イ ルを構造 ヒ エ ラ ルキー (文書オプシ ョ ン structureassociatedfiles) と XMP メ
タ デー タ に対 し て使 う こ と は許 さ れません。

連携フ ァ イ ルに対応 し てい る すべての API メ ソ ッ ド と オプシ ョ ン を表 3.4 に挙げます。 用


途では relationship オプシ ョ ンの よ く あ る 値に も 言及 し てい ます。

表 3.4 associatedfiles オプ シ ョ ン またはサブオプ シ ョ ンに対応 し ている API メ ソ ッ ド

API メ ソ ッ ド フ ァ イルの連携対象 用途の例

PDF_end_document( ) 文書全体 ZUGFeRD と Factur-X は、 そのイ ンボ イ スの


XML 版を PDF/A-3 文書内へ埋め込みます
(relationship=Alternative)。
その文書に対 し て、 ワー ド プ ロ セ ッ サーかス プ
レ ッ ド シー ト の元 フ ァ イル
(relationship=Source)

PDF_begin/end_page_ext( ) ページ ベン ダー独自の PieceInfo 辞書に対する代替 と


し て連携 フ ァ イルが機能 し え ます

PDF_begin/end_document( ) ・ XMP メ タ デー タ XMP メ タ デー タ に対 し て スキーマ記述


PDF_begin/end_page_ext( ) な (relationship=Schema)
どオプ シ ョ ン metadata を
持つ API メ ソ ッ ド

PDF_load_graphics( ) で テ ン プ レー ト か取 り 込んだペー 図表に対 し て生デー タ 、 表に対 し て CSV デー


templateoptions ジのために作 っ た フ ォ ーム タ 、 グ ラ フ に対 し て生の測定デー タ
PDF_open_pdi_page( ) XObject、 またはグ ラ フ ィ ッ ク (relationship=Data)。
PDF_begin_template_ext( ) 数式に対 し て MathML 表現
(relationship=Alternative)

PDF_load_image( ) 取 り 込んだ画像のために作 っ た 画像に対 し て ソ ースデー タ


画像 XObject (relationship=Source)

80 第 3 章 : PDF 文書を作成
表 3.4 associatedfiles オプ シ ョ ン またはサブオプ シ ョ ンに対応 し ている API メ ソ ッ ド

API メ ソ ッ ド フ ァ イルの連携対象 用途の例


PDF_create_annotation( ) 注釈 (type=FileAttachment でオ リ ッ チ メ デ ィ ア注釈か 3D 注釈に対 し て ソ ース
プ シ ョ ン attachment を用いた場 デー タ (relationship=Source)
合には、 埋め込んだ フ ァ イルは
かわ り にページに連携 し ます)
PDF_begin_item( )、 ま たは さ 論理構造 ヒ エ ラ ルキー内の構造 レ スポン シ ブ PDF は、 HTML ・ SVG ・
ま ざ ま な メ ソ ッ ド の tag オ エ レ メ ン ト JavaScript ・ CSS を埋め込む こ と に よ っ て、 他
プシ ョ ン の形式へ変換 さ れた際にその構造エ レ メ ン ト の
内容にス タ イル付けを し ます
(relationship=Alternative か Supplement)

PDF_end_document( ) で 論理構造 ヒ エ ラ ルキー全体 その構造ツ リ ーを他の形式へ変換する ための補


structureassociatedfiles 足情報 (relationship=Supplement)

PDF_begin/end_dpart( ) DPart ヒ エ ラ ルキー内の文書部分 その文書パー ト に関する追加情報


(relationship=Supplement)

ク ッ ク ブ ッ ク 連携 フ ァ イ ル を 文書内の さ ま ざ ま な オ ブ ジ ェ ク ト に つ な ぐ 完全 な コ ー ド サ ン プ ルが、
PDFlib ク ッ ク ブ ッ クの ト ピ ッ ク interchange/associated_files 内にあ り ます。 PDF 文書か
ら 連 携 フ ァ イ ル を 取 得 す る コ ー ド サ ン プ ル が、 PDFlib ク ッ ク ブ ッ クの ト ピ ッ ク
interchange/retrieve_associated_files 内にあ り ます。

以下の コ ー ド 断片は、 フ ァ イ ルアセ ッ ト を読み込んで、 それをページに連携 し 、 その際に


その関係を Data と 指定 し てい ます :
af = p.load_asset("Attachment", af_filename, "relationship=Data");

if (af == -1) {
throw new Exception("エラー : " + p.get_errmsg());
}

p.begin_page_ext(0, 0, "associatedfiles={" + af + "} width=a4.width height=a4.height");

3.5 連携フ ァ イル 81
82 第 3 章 : PDF 文書を作成
4 色 と 透過
ク ッ ク ブ ッ ク 色空間は、塗 り 操作 と 描線操作に対 し てそれぞれ別個に指定で き ます。 た と えば fillcolor ・
strokecolor オプシ ョ ン を使用 し ます。PDF において色空間は画像に対 し て も 使用 さ れます
が、 PDFlib は通常、 画像の色空間を自動的に決定 し ます。 ただ し カ ラ ー関連のオプシ ョ ン
が PDF_load_image( ) で与え ら れた場合を除 き ます。

ク ッ ク ブ ッ ク カ ラ ー処理の コ ー ド サン プルがPDFlib ク ッ ク ブ ッ クの color カ テ ゴ リ ーにあ り ます。color/


starter_color サン プルにすべての色空間の使用が演示 さ れています。

4.1 デバ イ ス色空間
デバ イ ス独自の色空間は、 おそ ら く 、 色を記述す る ために最 も 広 く 用い ら れ る 手段です。
名前の と お り 、 こ れは、 あ る 特定のデバ イ ス に よ っ て解釈 さ れ る も の と し て色を記述 し ま
す。 デバ イ ス の例 と し てはモニ タ ーやプ リ ン タ ーや印刷機な ど です。 デバ イ ス独自カ ラ ー
は、 ど のデバ イ ス で出力を行 う かに よ っ て、 見た目が異な り ます。 こ の望ま し く ない性質
があ る ので、 デバ イ ス カ ラ ーは、 PDF/A と PDF/X においては、 直接的には許 さ れてお ら
ず、然 る べ き 出力 イ ン テ ン ト ICC プ ロ フ ァ イ ルかデフ ォ ル ト 色空間 と と も にのみ使用が許
さ れます。

グ レ ース ケール色空間 グ レース ケールカ ラ ーは、 色空間キーワー ド gray を用いて要求


す る こ と がで き 、 1 個のグ レー値です。 グ レー値は 0 =黒か ら 1 =白ま での範囲です。 例 :
p.set_graphics_option("fillcolor={{ gray 0.5 }");

RGB 色空間 加法的な RGB 色空間の色は、 赤 ・ 緑 ・ 青の成分を混ぜて作 ら れます。 RGB


カ ラ ーは、 色空間キー ワー ド rgb を用いて要求する こ と がで き 、 赤 ・ 緑 ・ 青の割合を指定
す る 範囲 0 ~ 1 の 3 個の RGB 値であ り 、 (0, 0, 0) =黒、 (1, 1, 1) =白にな り ます。 広 く 用い
ら れてい る 範囲 0 ~ 255 の RGB カ ラ ー値を、 PDFlib が要求す る 範囲 0 ~ 1 へス ケールす
る には、 255 で割 る 必要があ り ます。
数値で RGB 値を指定せず、その HTML 名ま たは 16 進値で RGB カ ラ ーを指定す る こ と
も で き ます。 例 :
p.set_graphics_option("fillcolor={{ rgb 1 0 0 }");
p.set_graphics_option("fillcolor=pink");
p.set_graphics_option("fillcolor={#FFC0CB})";

CMYK 色空間 減法的な CMYK 色空間の色は、 シア ン ・ マゼン タ ・ イ エ ロ ー ・ 黒 (「キー」)


の成分を混ぜて作 ら れます。 CMYK 値は、 色空間キーワー ド cmyk を用いて要求す る こ と
がで き 、 シ ア ン ・ マゼン タ ・ イ エ ロ ー ・ 黒を表す範囲 0 ~ 1 の 4 個の CMYK 値であ り 、 0
=色な し 、 1 =色フルを表 し ます。 (0, 0, 0, 0) =白、 (0, 0, 0, 1) =黒にな り ます。 CMYK カ
ラ ーの極性はグ レース ケール・RGB カ ラ ー と は異な っ てい る こ と に注意 し て く だ さ い。例:
p.set_graphics_option("fillcolor={{ cmyk 0 1 0 0 }");

こ の CMYK 色空間の 特質 と し て、 CMYK オ ブ ジ ェ ク ト の オ ーバー プ リ ン ト 動作 を、


overprintmode オプシ ョ ン を用いて制御で き る と い う こ と があ り ます (107 ページ 「 CMYK
カ ラ ーに対す る オーバープ リ ン ト モー ド 」 参照)。

4.1 デバイ ス色空間 83


デバ イ ス カ ラ ー を デ フ ォ ル ト 色空間を用いてデバ イ ス独立 カ ラ ーへマ ッ プ デ バ イ ス
色空間は、 デバ イ ス 独立色空間へ、 デ フ ォ ル ト 色空間を用いて マ ッ プす る こ と が可能で
す : 詳 し く は 87 ページ 「 デバ イ ス カ ラ ーを ICC ベース の色空間へマ ッ プ」 を参照 し て く
だ さ い。 こ れは、RGB ま たは CMYK の画像ま たはグ ラ フ ィ ッ ク な ど、デバ イ ス独自カ ラ ー
を有する デー タ が、 PDF/A ま たは PDF/X の中で、 合致する 出力 イ ン テ ン ト を持たずに使
用 さ れてい る 場合に有用です。

84 第 4 章 : 色 と 透過
4.2 ICC プ ロ フ ァ イ ルに よ る色管理
イ ン タ ーナシ ョ ナル カ ラ ー コ ン ソ ーシ ア ム (ICC) は、 入力デバ イ スや出力デバ イ ス の
色の特徴を指定する ための フ ァ イ ル形式を定義 し ま し た。 PDFlib は、 ICC プ ロ フ ァ イ ル と
レ ン ダ リ ン グ イ ン テ ン ト に よ る 色管理に対応 し てい ます。 ICC プ ロ フ ァ イ ルは、 色管理 さ
れた ワ ー ク フ ロ ー と 、 PDF/X ・ PDF/A と い っ た多 く の PDF 規格において、 重要な役割を
担い ます。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが、 starter_color サン プル と ク ッ ク ブ ッ ク の color/iccprofile_to_


image ト ピ ッ ク にあ り ます。

4.2.1 ICC プ ロ フ ァ イ ルを読み込む


注 よ く ある印刷条件のためのICC カ ラ ープ ロ フ ァ イル群への推奨 と リ ン ク がwww.pdflib.com
で入手可能です。

受け入れ可能な ICC プ ロ フ ァ イ ル ICC プ ロ フ ァ イ ル を 読み込む に は PDF_load_


iccprofile( ) を用い ます。 プ ロ フ ァ イ ルは、 そのプ ロ フ ァ イ ルの ICC バージ ョ ン番号 ・ デバ
イ ス ク ラ ス ・ デー タ 色空間に よ っ て定ま る 条件を満たす必要があ り ます。 PDF 1.4 は ICC
プ ロ フ ァ イ ルバージ ョ ン 2.x に対応 し てお り 、 PDF 1.5 以上は ICC プ ロ フ ァ イ ルバージ ョ
ン 4.x に対応 し てい ます。 表 4.1 に、 ICC プ ロ フ ァ イ ルに関す る デバ イ ス ク ラ ス と デー タ
色空間に関す る 、 その用途に応 じ た追加の要請を詳述 し ます。

表 4.1 さ ま ざ ま な用途に対する ICC プ ロ フ ァ イルの要請


ICC プ ロ フ ァ イルの用途 (詳 し く は表 4.2 を参 デバイ ス ク ラ ス デー タ 色空間
照)

PDF/X-3/4 のための出力イ ン テ ン ト prtr グ レー ・ RGB ・ CMYK

PDF/X-5n のための出力イ ン テ ン ト prtr xCLR (n 色)


PDF 2.0 ・ PDF/A のための、 文書レ ベルかペー prtr ・ mntr グ レー ・ RGB ・ CMYK
ジ レ ベルの出力イ ン テ ン ト

透過グループ色空間 prtr ・ mntr ・ scnr ・ spac グ レー ・ RGB ・ CMYK

ICC プ ロ フ ァ イルのその他すべての用途 prtr ・ mntr ・ scnr ・ spac グ レー ・ RGB ・ CMYK ・ Lab

ICC プ ロ フ ァ イ ルを検索 PDFlib は、PDF_load_iccprofile( ) に与え ら れた profilename 引数


を用い、 以下の手順を踏んで ICC プ ロ フ ァ イ ルを検索 し ます :
> profilename=sRGB な ら ば、 PDFlib はその内部 sRGB プ ロ フ ァ イ ル (後述) を用い、 検索
は打ち切 ら れます。
> ICCProfile リ ソ ース カ テ ゴ リ ー内にprofilename と い う 名前の リ ソ ース があ る か ど う かを
チ ェ ッ ク し ます。 も し あれば、 その値を フ ァ イ ル名 と し て以下の手順で用い ます。 そ
の よ う な リ ソ ース がない場合は、 profilename を フ ァ イ ル名 と し て直接用い ます。
> 前の手順で決定 さ れた フ ァ イ ル名を用い、以下の組み合わせを 1 つずつ順に試 し てみ る
こ と に よ り 、 デ ィ ス ク 上の フ ァ イ ルを検索 し ます :
<ファイル名>
<ファイル名>.icc
<ファイル名>.icm
<colordir>/<ファイル名> (Windows・macOSのみ)

4.2 ICC プ ロ フ ァ イルに よ る色管理 85


<colordir>/<ファイル名>.icc (Windows・macOSのみ)
<colordir>/<ファイル名>.icm (Windows・macOSのみ)

Windows では colordir は、オペレーテ ィ ン グ シ ス テ ムがデバ イ ス依存 ICC プ ロ フ ァ イ ル


を 格納 し て い る デ ィ レ ク ト リ ー を 示 し ま す (た と え ば C:\Windows\System32\spool\
drivers)。 macOS では colordir と し て以下のパ ス が試み ら れます :
/System/Library/ColorSync/Profiles
/Library/ColorSync/Profiles
/Network/Library/ColorSync/Profiles
~/Library/ColorSync/Profiles

sRGB 色空間 と sRGB ICC プ ロ フ ァ イ ル PDFlib は、 sRGB と い う 標準的な RGB 色空間に


対応 し てい ます。 こ れは、 デジ タ ルカ メ ラ の よ う な消費者向け RGB デバ イ スやカ ラ ープ
リ ン タ ー・ モニ タ ーの よ う な事務機器におけ る 簡単な色管理のために広 く 利用 さ れてい ま
す。 PDFlib はそれに必要な ICC プ ロ フ ァ イ ルデー タ を内蔵 し てい ます。 ですか ら sRGB プ
ロ フ ァ イ ル を 明示的に 構成す る 必要は あ り ま せ ん。 こ れ を 利用す る に は、 PDF_load_
iccprofile( ) を profilename=sRGB で呼び出 し ます。便利なシ ョ ー ト カ ッ ト と し て、PDF_load_
iccprofile( ) で作成 さ れた ICC ハン ド ルが期待 さ れ る すべての場所において、かわ り にキー
ワ ー ド srgb を与え る こ と も で き ます。 画像フ ァ イ ルの中に ICC プ ロ フ ァ イ ルが埋め込ま
れていなければ、こ の sRGB プ ロ フ ァ イ ルが RGB 画像に対 し てデフ ォ ル ト で適用 さ れます。
sRGB プ ロ フ ァ イ ルは、 デバ イ ス ク ラ ス mntr (出力デバ イ ス) に属 し ます。 すなわち、
こ れは PDF/A に対す る 出力 イ ン テ ン ト と し ては使用で き ますが、 PDF/X に対する 出力 イ
ン テ ン ト と し ては使用で き ません。

4.2.2 ICC プ ロ フ ァ イ ルを使用


PDFlib は表 4.2 に挙げ る 用途のための ICC プ ロ フ ァ イ ルに対応 し てい ます。

表 4.2 ICC プ ロ フ ァ イルの さ ま ざ ま な用途


用途 関係する API メ ソ ッ ド ・ オプ シ ョ ン

ページ上のテキス ト と ベ ク ト ルグ ラ フ ィ ッ ク に PDF_set_option( ) で iccprofilegray/rgb/cmyk   および


ICC ベースの色空間を設定 PDF__setcolor( ) で colorspace=iccbasedgray/rgb/cmyk
色オプ シ ョ ン で iccbased キーワー ド

取 り 込んだ画像に ICC プ ロ フ ァ イルを適用 PDF_load_image( ) : オプ シ ョ ン iccprofile

画像に埋め込まれた ICC プ ロ フ ァ イルを処理ま PDF_load_image( ) : オプ シ ョ ン honoriccprofile


たは無視

画像に埋め込まれた ICC プ ロ フ ァ イルを ク エ PDF_info_image( ) で keyword=iccprofile


リー

グ レースケースか RGB か CMYK デー タ を ICC PDF_begin_page_ext( ) ・ PDF_begin_template_ext( ) ・ PDF_begin_


ベースの色空間へマ ッ プする ためのデ フ ォ ル ト pattern_ext( ) ・ PDF_begin_font( ) : オプ シ ョ ン defaultgray/
色空間を設定 defaultrgb/defaultcmyk

PDF/X または PDF/A 文書の出力イ ン テ ン ト を、 PDF_load_iccprofile( ) : オプ シ ョ ン usage=outputintent


参照ま たは埋め込み ICC プ ロ フ ァ イルで指定

PDF 2.0 のページ レ ベルの出力イ ン テ ン ト を、 埋 PDF_begin_page_ext( ) : オプ シ ョ ン outputintents


め込み ICC プ ロ フ ァ イルで指定

86 第 4 章 : 色 と 透過
表 4.2 ICC プ ロ フ ァ イルの さ ま ざ ま な用途
用途 関係する API メ ソ ッ ド ・ オプ シ ョ ン

透過 ・ ブ レ ン ド モー ド のためのブ レ ン ド 色空間 PDF_begin/end_page_ext( ) ・ PDF_open_pdi_page( ) ・ PDF_begin_


を指定 template_ext( ) ・ PDF_load_graphics( ) で templateoptions : オプ
シ ョ ン transparencygroup、 サブオプ シ ョ ン colorspace

スポ ッ ト カ ラ ーのための代替色空間 PDF_set_graphics_option( ) : 色オプ シ ョ ン でキーワー ド


spotname と iccbased 代替色、 または PDF_set_graphics_
option( ) でオプ シ ョ ン fillcolor の後に PDF_makespotcolor( )。

DeviceN カ ラ ーのための代替色空間 PDF_create_devicen( ) : オプ シ ョ ン alternate でサブオプ シ ョ


ン iccbased

ICC プ ロ フ ァ イル内の色成分の数を ク エ リ ー PDF_get_option( ) でキーワー ド icccomponents

画像 (ICC タ グ付き 画像) 内の埋め込みプ ロ フ ァ イ ルを用い る 画像の な か に は、 そ の


画像のカ ラ ー値の特徴を記述 し た ICC プ ロ フ ァ イ ルが埋め込まれてい る も のがあ り ます。
た と えば、埋め込まれた ICC プ ロ フ ァ イ ルは、画像デー タ の生成に用い ら れた ス キ ャ ナー
の色特性を記述す る こ と がで き ます。 PDFlib は、 JPEG ・ JPEG 2000 ・ PNG ・ TIFF 画像フ ァ
イ ル形式の中に埋め込まれた ICC プ ロ フ ァ イ ルを処理 し ます。 honoriccprofile オプシ ョ ン
が true に設定 さ れてい る 場合 (デフ ォ ル ト ではそ う な っ てい ます)、 画像内に埋め込まれ
てい る ICC プ ロ フ ァ イ ルはその画像か ら 抽出 さ れ、 PDF 出力内に埋め込ま れます。
PDF_info_image( ) のキーワ ー ド iccprofile を使 う と 、 画像内に埋め込ま れてい る プ ロ
フ ァ イ ルに対する ICC プ ロ フ ァ イ ルハン ド ルを得 る こ と がで き ます。 こ れは、 同 じ プ ロ
フ ァ イ ルを複数の画像に適用す る 必要があ る 場合に有用です。
未知の ICC プ ロ フ ァ イ ル内の色成分数をチ ェ ッ ク す る には icccomponents オプシ ョ ン
を用い ます。

外部 ICC プ ロ フ ァ イ ルを画像に適用 画像に埋め込まれてい る ICC プ ロ フ ァ イ ルを使 う


のではな く 、 外部プ ロ フ ァ イ ルを各画像に適用す る こ と も で き ます。 そのためには PDF_
load_image( ) の iccprofile オプシ ョ ンでプ ロ フ ァ イ ルハン ド ルを与え ます。

ページ記述に対 し て ICC ベース色空間 テ キ ス ト やベ ク ト ル グ ラ フ ィ ッ ク の カ ラ ー値


は、 ICC ベース の色空間で直接指定す る こ と がで き ます。 色オプシ ョ ンで、 ICC プ ロ フ ァ
イ ルをハン ド ルで指定 し 、 その後に続けて色要素を然る べき 数だけ (た と えば CMYK プ
ロ フ ァ イ ルな ら 4 要素) 指定 し ます :
icchandle = p.load_iccprofile("myCMYK", "usage=iccbased errorpolicy=exception");
p.set_graphics_option("fillcolor={iccbased=" + icchandle + " 0 1 0 0}";

あ る いは、 色空間を、 グ ロ ーバルな iccprofilegray ・ iccprofilergb ・ iccprofilecmyk オプシ ョ


ンの う ちいずれか 1 つへの値 と し て ICC プ ロ フ ァ イ ルハン ド ルを与え る こ と に よ っ て設定
す る こ と も 可能です。 その後、 ICC ベース のカ ラ ー値を、 色オプシ ョ ンか PDF_setcolor( )
に対 し て、 iccbasedgray ・ iccbasedrgb ・ iccbasedcmyk のいずれかの色空間キーワ ー ド と と
も に与え る こ と がで き ます。

デバ イ ス カ ラ ー を ICC ベースの色空間へマ ッ プ PDFには、デバ イ ス依存な グ レー・RGB・


CMYK カ ラ ーをデバ イ ス独立な ICC ベース の色へマ ッ プす る 機能があ り ます。 こ れを利
用す る と 、 その ま ま ではデバ イ ス依存な カ ラ ー値に対 し て、 正確な測色指定を与え る こ と

4.2 ICC プ ロ フ ァ イルに よ る色管理 87


が で き ま す。 こ れ を 実現す る には、 PDF_begin_page_ext( ) ・ PDF_begin_template_ext( ) ・
PDF_begin_pattern_ext( ) ・ PDF_begin_font( ) の defaultgray ・ defaultrgb ・ defaultcmyk オプ
シ ョ ンに、 然 る べ き ICC プ ロ フ ァ イ ルハン ド ルを与え ます。 以下の例は、 sRGB 色空間を、
ページ上のテ キ ス ト ・ 画像 ・ ベ ク ト ルグ ラ フ ィ ッ ク のデフ ォ ル ト RGB 色空間 と し て設定
し ます :
p.begin_page_ext(595, 842, "defaultrgb=srgb");

デフ ォ ル ト 色空間が外部 ICC プ ロ フ ァ イ ルに由来する 場合には、プ ロ フ ァ イ ルハン ド ルを


まず作成す る 必要があ り ます :
/* ICCプロファイルハンドルを作成 */
icchandle = p.load_iccprofile("myRGB", "usage=iccbased errorpolicy=exception");
p.begin_page_ext(595, 842, "defaultrgb=" + icchandle);

出力 イ ン テ ン ト プ ロ フ ァ イ ル 出力デバ イ ス のプ ロ フ ァ イ ルを用いて、 PDF 2.0 ま たは


PDF/X ま たは PDF/A 文書のための出力条件を指定する こ と がで き ます。 そのためには、
PDF_load_iccprofile( ) で usage=outputintent を指定 し ます。 PDF/A に対 し ては、 プ リ ン
タ ーま たはモニ タ ープ ロ フ ァ イ ルを出力 イ ン テ ン ト と し て指定で き 、 PDF/X ではプ リ ン
タ ープ ロ フ ァ イ ルのみ許 さ れます。詳 し く は 358 ページ 「12.3 PDF/X に よ る 印刷出力」 と
346 ページ 「12.2 PDF/A に よ る アーカ イ ビ ン グ」 を参照 し て く だ さ い。

4.2.3 高度な色管理制御
PDFlib アプ リ ケーシ ョ ンはデバ イ ス独立な カ ラ ー値を指定で き ますが、あ る 特定の出力デ
バ イ ス において、 その色を正確に再現で き ない こ と が あ る か も し れ ま せん。 こ の場合に
は、 何 ら かの妥協が行われ る 必要があ り ます。 こ の処理を色域圧縮 と いい ます。 こ れは、
色の範囲を、 そのデバ イ ス に よ っ て再現可能な、 よ り 狭い範囲へ縮め る 処理です。 PDF は
こ の処理を細か く 調整す る 制御をい く つか提供 し てい ます。

レ ン ダ リ ン グ イ ン テ ン ト レ ン ダ リ ン グ イ ン テ ン ト は、 個別の画像に対 し て、 PDF_load_
image( ) に renderingintent オプシ ョ ン を与え る こ と に よ っ て指定で き ます。 レ ン ダ リ ン グ
イ ン テ ン ト は、 テ キ ス ト と ベ ク ト ル グ ラ フ ィ ッ ク に対 し て も 、 PDF_create_gstate( ) に
renderingintent オプシ ョ ン を与え る こ と に よ っ て指定で き ます。 利用可能なすべての レ ン
ダ リ ン グ イ ン テ ン ト を表 4.3 に挙げます。

表 4.3 利用可能な レ ン ダ リ ング イ ン テ ン ト
インテン ト 説明 典型的用途
Auto レ ン ダ リ ング イ ン テ ン ト を PDF フ ァ イル内で一切指定 ページ内容に関 し て充分な情報が
せず、 デバイ スのデ フ ォ ル ト イ ン テ ン ト をかわ り に使 得られません

AbsoluteColorimetric デバイ スの白色点 (紙色の白な ど) に対 し 補正を一切 ベ タ 色の正確な再現。 それ以外の
行わない。 色域外の色は、 デバイ スの色域の中で最も 用途には推奨 さ れません
近い値へマ ッ プ さ れます。
RelativeColorimetric 色デー タ をデバイ スの色域へ圧縮。 白色点を互いに ベ ク ト ルグ ラ フ ィ ッ ク
マ ッ プ し ます (すなわち、 最も 明るい色はたいてい白
紙色によ っ て実現 さ れます)。 それ以外の色は若干シ フ
ト さ れる こ と にな り ます。
Saturation 色の彩度を温存。 カ ラ ー値はシ フ ト さ れる場合があ り ビ ジネスグ ラ フ ィ ッ ク
ます。

88 第 4 章 : 色 と 透過
表 4.3 利用可能な レ ン ダ リ ング イ ン テ ン ト
イ ンテン ト 説明 典型的用途
PerceptualColor 色の関係を温存。 見た目の美 し さ を優先 し て、 色域内 現実画像
の色 も色域外の色 も変更 し ます。

黒点補償 黒点補償は、 最 も 暗い色が、 出力デバ イ ス が出せ る 最 も 暗い色へマ ッ プ さ れ る


よ う 、 色変換を調整 し ます。 こ れは RelativeColorimetric レ ン ダ リ ン グ イ ン テ ン ト が白につ
いて出すの と 同様の効果を黒について出す も のです。 それは最 も 明 る い色を、 出力デバ イ
ス が出せ る 最 も 明 る い色へマ ッ プす る も のだか ら です。
黒点補償は、 コ ン ト ラ ス ト を高め る こ と に よ っ て画像の質を向上 さ せ る 可能性があ り
ます。 PDF 2.0 でのみ利用可能であ り 、 PDF_create_gstate( ) の useblackptcomp オプシ ョ ン
でのみ有効化で き ます。

4.2 ICC プ ロ フ ァ イルに よ る色管理 89


4.3 デバ イ ス独立な CIE L*a*b* カ ラ ー
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが starter_color サン プル内にあ り ます。

デバ イ ス独立な カ ラ ー値を、 CIE 1976 L*a*b* 色空間 (略 し て Lab) において指定する こ と


がで き ます。 こ の L*a*b* 色空間におけ る 色は、 3 個の値 L ・ a ・ b に よ っ て指定 さ れます
(図 4.1 参照)。 輝度 (ま たは明度) L は 0 ~ 100 の範囲にわた り ます。 値 a と b は範囲 -
128 ~ 127 で色彩を記述 し ます。 値 a は緑 (-128) か ら マゼン タ レ ッ ド (+127) ま での範
囲にわた り 、 値 b は青 (-128) か ら 黄色 (+127) ま での範囲にわた り ます。 正の数は暖
色 (黄色 ・ マゼン タ レ ッ ド ) を記述 し 、 負の数は寒色 (緑 ・ 青) を記述 し ます。 a ・ b 軸
の交点 (a=b=0) は無彩色のグ レー値を記述 し 、 黒 (0, 0, 0) か ら 白 (100, 0, 0) ま での範囲
にわた り ます。
こ の Lab 色空間の重要な特性 と し て、 RGB ・ CMYK と 異な り 、 知覚的に一様であ る と
い う こ と があ り ます。 すなわち、 色ど う し の数値の差が等 し ければ、 その視覚的な差 も 等
し く な り ます。 こ れに よ っ て、 複数の色の混ぜ合わせの計算がは る かに簡単にな り ます。
各色の Lab 値の加重平均を と れば よ いか ら です。96 ページ 「 Lab 代替空間を持っ た ス ポ ッ
ト カ ラ ー群に基づ く DeviceN 色空間」 では こ の こ と を利用 し て PostScript 変換関数を生成
し ます。
Lab 値は、 白色点 も あ わせて指定 さ れてい る 場合にのみ、 絶対的な色を指定 し ま す。
PDFlib は、 白色点 と し て、 標準光源 D50 (日中光 5000 K、 2゜ 測定者) を使用 し ます。
PDFlib は Lab 色空間に以下の よ う に対応 し てい ます :
> Lab カ ラ ーを テ キ ス ト ・ ベ ク ト ルグ ラ フ ィ ッ ク に使用する には、 色オプシ ョ ン と PDF_
setcolor( ) において、色空間キーワ ー ド lab と 、L ・ a ・ b 値の 3 個の数値を用い ます。例 :
p.set_graphics_option("fillcolor={lab 100 0 0}");

PDF/A モー ド では、 デフ ォ ル ト の黒の塗 り ・ 描線色は、 出力 イ ン テ ン ト が指定 さ れて


いなければ、 デバ イ ス独立な Lab (0, 0, 0) と し て指定 さ れます。
> PDFlib は内蔵デー タ ベース において、すべての HKS ・ Pantone ス ポ ッ ト カ ラ ーの代替カ
ラ ー値に Lab 色空間を使用 し てい ます。
> Lab 色空間を用いた TIFF 画像を取 り 込め ます。
> Lab 色空間を用いた ICC プ ロ フ ァ イ ルを、PDF_load_iccprofile( ) を用いて読み込め ます。
ただ し 、 出力 イ ン テ ン ト と し て使用 し よ う と す る 場合、 ま たは transparencygroup オプ
シ ョ ンに使用 し よ う と す る 場合を除 き ます。 なぜな ら PDF は こ れ ら の箇所では Lab を
許 さ ないか ら です。

図 4.1 CIE L*a*b* 色空間

90 第 4 章 : 色 と 透過
4.4 Pantone ・ HKS ・ カ ス タ ムスポ ッ ト カ ラ ー
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが、 starter_color サン プル と ク ッ ク ブ ッ ク の color/spot_color ト
ピ ッ ク にあ り ます。

スポ ッ ト カ ラ ーのための Separation 色空間 PDFlib は ス ポ ッ ト カ ラ ーに対応 し てい ます


(技術的には PDF では Separation 色空間 と し て知 ら れます)。 ス ポ ッ ト カ ラ ー と は、 プ ロ
セ ス カ ラ ーの混色領域外にあ る カ ス タ ム カ ラ ーの印刷に用い ら れ る も のです。 ス ポ ッ ト カ
ラ ーは名前で指定 さ れ、 PDF では代替色を伴 う 必要があ り ます。 こ の代替色は、 その ス
ポ ッ ト カ ラ ーに近い色が選ばれますが、 ま っ た く 同 じ 色ではあ り ません。 PDF ビ ュ ーアー
や RIP は、 こ の代替色を用いて、 画面表示やス ポ ッ ト カ ラ ー非対応機 (事務用プ リ ン タ ー
な ど) への印刷を行い ます。 印刷機では、 要求 さ れた ス ポ ッ ト カ ラ ーが適用 さ れ、 文書内
で用い ら れてい る その他すべてのプ ロ セ ス カ ラ ー と と も に印刷 さ れます。
PDFlib は、 さ ま ざ ま な組み込み ス ポ ッ ト カ ラ ー ラ イ ブ ラ リ ーに対応 し てお り 、 かつ、
カ ス タ ム (ユーザー定義) ス ポ ッ ト カ ラ ーに も 対応 し てい ます。 ス ポ ッ ト カ ラ ー名が PDF_
makespotcolor( ) に よ っ て要求 さ れ る と 、 PDFlib は まず、 その要求 さ れた ス ポ ッ ト カ ラ ー
が PDFlib 組み込み ラ イ ブ ラ リ ーの う ちのいずれかの中で見つか る か ど う かをチ ェ ッ ク し
ます。 も し 見つかれば、 PDFlib は代替色に関 し て、 内蔵の Lab 値を用い ます。 見つか ら な
い場合、 その ス ポ ッ ト カ ラ ーはユーザー定義色 と 見な さ れ る ので、 ク ラ イ ア ン ト 側でそれ
に対 し て適切な代替カ ラ ー値を、 カ ラ ーオプシ ョ ン群の spotname カ ラ ーキー ワ ー ド で
(あ る いは PDF_setcolor( ) を使用の際にはカ レ ン ト 塗 り 色を通 じ て) 与え る 必要があ り ま
す。 ス ポ ッ ト カ ラ ーには濃度を指定す る こ と も で き ます。 すなわち、 0 =色な し =白か ら
1 =最大濃度 ま で の色濃度 を 指定す る パー セ ン ト 値 と と も に用い る こ と が で き ま す。
Separation 色空間はつねに減法的です (RGB の よ う な加法的な色空間では 0 =黒にな る の
と 異な り ) 。 ス ポ ッ ト カ ラ ーが定義 さ れた ら 、 それ を用いて、 テ キ ス ト ・ ベ ク ト ルグ ラ
フ ィ ッ ク を 描 く こ と も で き ま す し 、 グ レ ー ス ケール画像に着色す る こ と も で き ま す し 、
シ ェ ーデ ィ ン グ を構築す る こ と も で き ます。 なお、 画像に ス ポ ッ ト カ ラ ーで着色す る 際に
は、 PDFlib はその色の極性を自動的に反転 さ せます (197 ページ 「 グ レース ケール画像に
ス ポ ッ ト カ ラ ーで着色」 参照)。
デフ ォ ル ト では、 組み込み ス ポ ッ ト カ ラ ーはカ ス タ ム代替値で再定義す る こ と はで き
ません。 こ の動作は、 PDF_set_option( ) の spotcolorlookup オプシ ョ ン を用いて変更す る こ
と も で き ます。 こ れを使 う と 、 古いアプ リ ケーシ ョ ンが異な る 色定義を用いてい る よ う な
場合 と の互換性が と れます し 、 ま た、 Pantone カ ラ ーに対す る PDFlib の Lab 代替値を扱 う
こ と ので き ない ワ ー ク フ ロ ーにおいて も 有用です。

注 組み込み Pantone®・HKS® スポ ッ ト カ ラ ーのデー タ と その対応する商標については、PDFlib


ソ フ ト ウ ェ ア での使用のためのラ イ セ ン ス を PDFlib GmbH は各商標権者から取得 し てい
ます。

Pantone® カ ラ ー Pantone カ ラ ーは世界的に有名で広 く 利用


さ れてい ます。 PDFlib は、 Pantone Matching System® (名前付
き カ ラ ー数千色を有する ) に完全対応 し てい ます。 表 4.4 に示
すデ ジ タ ル カ ラ ー ラ イ ブ ラ リ ー に あ る す べ て の カ ラ ー ス
ウ ォ ッ チ名が利用で き ます。
ス ポ ッ ト カ ラ ー名は大文字 ・ 小文字を区別 し ます。 上記の
例 と 同様に大文字を使っ て く だ さ い。 例示の よ う に、 必ず接
頭 辞 PANTONE を ス ウ ォ ッ チ 名 に つ け る 必要 が あ り ま す。
Pantone カ ラ ー名は次の方式に従っ て構成 さ れます :

4.4 Pantone ・ HKS ・ カ ス タ ムスポ ッ ト カ ラ ー 91


PANTONE <id> <paperstock>

こ こ で <id> は色の識別子であ り (た と えば 185)、 <paperstock> はペーパース ト ッ ク な ど


指定の頭文字です (た と えば C は coated = コ ー ト 紙)。 ス ウ ォ ッ チ名を構成する 各成分の
間には スペース を 1 つずつ入れ る 必要があ り ます。 PANTONE 接頭辞では じ ま る 名前の ス
ポ ッ ト カ ラ ーが要求 さ れたに も かかわ ら ず、 その名前が有効な Pantone カ ラ ーを表 し てい
なか っ た場合には、 警告が ロ グ記録 さ れます。 以下の コ ー ド ス ニペ ッ ト は、 あ る Pantone
カ ラ ーを濃度値 70 パーセ ン ト で用いた例です :
p.set_graphics_option("fillcolor={ spotname {PANTONE 281 U} 0.7 }");

表 4.4 PDFlib に内蔵の Pantone スポ ッ ト カ ラ ー ラ イ ブ ラ リ ー


カ ラ ー ラ イ ブ ラ リ ー名 カ ラ ー名の例 注
PANTONE ソ リ ッ ド / コ ー ト 紙 PANTONE 185 C 2012 年追加の範囲 2001 ~ 2336 の 336 色。
2014 年追加の範囲 2337 ~ 2427 の 84 色。
2016 年追加の範囲 2428 ~ 3599 の 112 色。
2019 年追加の範囲 4001 ~ 4294 の 294 色。

PANTONE ソ リ ッ ド /上質紙 PANTONE 185 U 2012 年追加の範囲 2001 ~ 2336 の 336 色。


2014 年追加の範囲 2337 ~ 2427 の 84 色。
2016 年追加の範囲 2428 ~ 3599 の 112 色。
2019 年追加の範囲 4001 ~ 4294 の 294 色。

PANTONE 拡張色域/上質紙 (XGC) PANTONE 185 XGC 2015 年追加の 1736 色

PANTONE パス テル/ コ ー ト 紙 PANTONE 9461 C


PANTONE パス テル/上質紙 PANTONE 9461 U

PANTONE メ タ リ ッ ク/ コ ー ト 紙 PANTONE 871 C

HKS® カ ラ ー HKS カ ラ ーシ ス テ ムは ド イ ツ な ど の欧州諸国で


広 く 利用 さ れてい ます。 PDFlib は HKS カ ラ ーに完全対応 し て
い ます。 表 4.5 に挙げ る デジ タ ルカ ラ ー ラ イ ブ ラ リ ーにあ る カ
ラ ース ウ ォ ッ チ名がすべて利用可能です。
ス ポ ッ ト カ ラ ー名は大文字 ・ 小文字を区別 し ま す。 上記の
例 と 同様に大文字 を使っ て く だ さ い。 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 }");

92 第 4 章 : 色 と 透過
表 4.5 PDFlib に内蔵の HKS スポ ッ ト カ ラ ー ラ イ ブ ラ リ ー
カ ラ ー ラ イ ブ ラ リ ー名 カ ラ ー名の例 注

HKS K HKS 43 K グロ ス アー ト 紙用 88 色 (Kunstdruckpapier)

HKS N HKS 43 N ナチ ュ ラル紙用 86 色 (Naturpapier)

HKS E HKS 43 E 連続ス テーシ ョ ナ リ / コ ー ト 用 88 色 (Endlospapier)

HKS Z HKS 43 Z ニ ュ ース プ リ ン ト 用 50 色 (Zeitungspapier)

カ ス タ ムスポ ッ ト カ ラ ー 上述の組み込みス ポ ッ ト カ ラ ーのほかに、 PDFlib ではカ ス タ


ム ス ポ ッ ト カ ラ ーに も 対応 し てい ます。 こ れは、 任意の名前 と (ただ し 組み込みの色 と か
ち合 う 名前は使え ません) 代替色を持つ こ と がで き ます。 こ の代替色は、 画面表示 と 低品
位印刷に用い ら れますが、 高品位の色分版には用い ら れません。 カ ス タ ム ス ポ ッ ト カ ラ ー
に適切な代替色を与え る のは ク ラ イ ア ン ト 側の役割です。
ス ポ ッ ト カ ラ ーは、 fillcolor/strokecolor テ キ ス ト ま たはグ ラ フ ィ ッ ク 書式オプシ ョ ン と
その他の色関連オプシ ョ ンで設定で き ます。 代替色は、 ス ポ ッ ト カ ラ ー定義内で直接与え
る こ と がで き ます :
fillcolor={spotname {CompanyRed} 1.0 {cmyk 0 0.78 0.88 0}}

あ る いは、 カ レ ン ト 塗 り 色を用いて ス ポ ッ ト カ ラ ーを定義す る こ と も 可能です。 こ の場合


には、 カ レ ン ト 塗 り 色が代替色 と し て用い ら れます。 カ レ ン ト 塗 り 色を代替色 と し て設定
す る ために呼び出 し が 1 つ多 く 必要であ る と い う 点を除けば、カ ス タ ム ス ポ ッ ト カ ラ ーの
定義 と 利用は、 組み込みス ポ ッ ト カ ラ ーの利用 と 同様に行 う こ と がで き ます :
/* 代替色として使いたいカレント塗り色を設定 */
p.setcolor("fill", "cmyk", 0 0.78 0.88 0);
/* カレント塗り色からスポットカラーを生成 */
spot = p.makespotcolor("CompanyRed");

/* 塗りにスポットカラーを設定 */
p.set_graphics_option("fillcolor={spotname {CompanyRed} 0.7 }");

CMYK プ ロ セ ス カ ラ ーに基づ く Separation 色空間 ス ポ ッ ト カ ラ ー名は一般に、 任意に


選ぶ こ と がで き ますが、 イ ン キ名 Cyan ・ Magenta ・ Yellow ・ Black はつねに CMYK プ ロ セ
ス カ ラ ーを指 し ます。 こ の こ と を利用 し て、 特定の CMYK チ ャ ン ネル (た と えばマゼン
タ ) のみに描画を行い、 他のチ ャ ン ネルに影響を与えない よ う にす る こ と も 可能です。 こ
れは、 フル CMYK カ ラ ーで Cyan=Yellow=Black=0 に よ っ て描画を行 う の と は異な り ます。
後者はシ ア ン ・ イ エ ロ ー ・ 黒チ ャ ン ネルの既存の内容を消去す る か ら です ( こ の動作はデ
バ イ ス依存設定を用いて変え る こ と も 可能です。107 ページ 「4.10 オーバープ リ ン ト 制御」
参照)。 た と えば、 次の呼び出 し は :
fillcolor={spotname Magenta 0.5 {cmyk 0 1 0 0}}

次の よ う に CMYK カ ラ ーを直接使用す る の と は異な り ます :


fillcolor={cmyk 0 0.5 0 0}

なぜな ら 前者の呼び出 し ではシ ア ン ・ イ エ ロ ー ・ 黒チ ャ ン ネル内の既存の内容は変更 さ れ


ませんが、 後者の呼び出 し ではそれ ら を 0% に設定す る か ら です (オーバープ リ ン ト 設定
に依存)。

4.4 Pantone ・ HKS ・ カ ス タ ムスポ ッ ト カ ラ ー 93


4.5 DeviceN カ ラ ー
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが、starter_color サン プル と ク ッ ク ブ ッ クの color/devicen_color ト
ピ ッ ク にあ り ます。

DeviceN 色空間は、 任意の数の名前付 き 色成分に対応 し てお り 、 ス ポ ッ ト カ ラ ーを一般化


し た も の と と ら え る こ と がで き ます。 その イ ン キ群は、 プ ロ セ ス カ ラ ーの集合か ら 採る こ
と も で き ます し (通常 CMYK ですが、 それ以外の色空間 も 可)、 任意の ス ポ ッ ト カ ラ ー群
と す る こ と も で き ます。 DeviceN カ ラ ーの応用は以下の と お り です :
> 4 色 よ り も 多 く のプ ロ セ ス カ ラ ーを使 う こ と に よ っ て色域 (印刷可能な色の集合) を拡
げてい る 印刷系 も あ り ます。 た と えば、 CMYK に加え てオ レ ン ジ ・ 緑 ・ 紫に基づ く 7
色印刷系があ り ます。
> CMYK プ ロ セ ス カ ラ ー群の部分集合 (た と えばシ ア ン と マゼン タ のみ) を内容 と する
DeviceN 色空間を用い る と 、 CMYK カ ラ ーのオブジ ェ ク ト を他の CMYK オブジ ェ ク ト
群にオーバープ リ ン ト す る べ き と き に有用です。
> DeviceN カ ラ ーを用いて、 ス ポ ッ ト カ ラ ー と プ ロ セ ス カ ラ ーの間のシ ェーデ ィ ン グ (な
め ら かな色遷移) を構築 し た り 、 複数の ス ポ ッ ト カ ラ ーの間のシ ェ ーデ ィ ン グ を構築
し た り す る こ と も 可能です。
> パ ッ ケージ印刷では、伝統的な ス ポ ッ ト カ ラ ー群を使用で き ないので、n 色を使用する
こ と が多いです。 追加のカ ラ ーチ ャ ン ネルを用いて、 目に見え る 色には直接関係 し な
い情報を記録す る こ と も 行われてい ます。 た と えばワ ニ スやダ イ ラ イ ン な ど です。

PDF_create_devicen( ) メ ソ ッ ド は、 DeviceN 色空間ハ ン ド ル を返 し ま す。 こ れ を使っ て、


fillcolor/strokecolor な ど の色関連オプシ ョ ン を用いて描画操作を行 う こ と も で き ま す し 、
PDF_shading( ) を用いてシ ェ ーデ ィ ン グ を構築する こ と も で き ます し 、 PDF_load_image( )
の colorize オプシ ョ ン を用いて ラ ス タ ー画像に着色する こ と も で き ます。 DeviceN カ ラ ー
には濃淡をつけ る こ と も で き ま す。 すなわち、 そのそれぞれの カ ラ ーチ ャ ン ネルに対 し
て、各カ ラ ーチ ャ ン ネルの濃 さ を o =色な し =白か ら 1 =最大濃度ま での範囲で指定する
割合値を持たせて使用す る こ と が可能です。 DeviceN 色空間はつねに減法的です (RGB な
ど加法的な色空間において 0 =黒 と な る の と 異な り ます)。
PDF_create_devicen( ) には、 イ ン キ名の リ ス ト と 、 代替カ ラ ー名 と 、 濃度変換関数を実
装 し た PostScript コ ー ド が必須です。 こ の変換関数は、 DeviceN 色空間の N 個のカ ラ ー値
を、 代替色空間におけ る 対応す る カ ラ ー値群へ変換す る も のであ る 必要があ り ます。 こ の
代替カ ラ ー値群は、出力デバ イ ス がその DevicefN 色空間に対応 し ていない場合 (モニ タ ー
上な ど) に表現に用い ら れます。 以下に、 CMYK プ ロ セ ス カ ラ ーか ス ポ ッ ト カ ラ ー群か ら
構築 さ れた DeviceN 色空間に対す る 、 Lab を 代替色 と し て使用す る 場合の、 然 る べ き
PostScript 変換関数を示 し ます。 こ れ以外の組み合わせに対 し て然る べき PostScript 変換
関数を作 る には工夫が必要です。
PDF 1.6 以上に対する 出力を生成する 際には、 PDFlib は DeviceN 属性辞書を出力 し ま
す。 こ の辞書には、 すべての既知の ス ポ ッ ト カ ラ ーに対する Colorants エン ト リ ーが含ま
れてい ます。 こ れに よ っ て PDF ビ ュ ーアーは確実に、 その名前付き イ ン キ群を個別に表
現す る ための充分な情報を得 ら れます し 、その イ ン キ群を ブ レ ン ド する こ と も で き る よ う
にな り ます。 こ の手法の利点は、 Acrobat においてオーバープ リ ン ト プ レ ビ ュ ー設定にか
かわ ら ず色表示が正 し く な る こ と にあ り ます。 かつ、 Acrobat において PostScript 変換関
数がな く て も そのページ を表現で き る よ う にな り ます。 ただ し 、 こ の変換関数はいずれに
せ よ 、与え なければな り ません。 なぜな ら サー ド パーテ ィ ービ ュ ーアーや RIP は、DeviceN
カ ラ ーを代替色空間で表現す る 際に PostScript 関数を頼る か も し れないか ら です。

94 第 4 章 : 色 と 透過
PDF/X-4/5 モー ド においては、 PDF_create_devicen( ) の前に、 その DeviceN 色空間にお
いて使用 さ れ る すべてのカ ス タ ム ス ポ ッ ト カ ラ ーについて、 PDF_makespotcolor( ) を呼び
出す必要があ り ます。 こ れは一般に画面表示を向上 さ せますので、 PDF/X-4-5 を生成 し
ない場合であ っ て も 推奨 さ れます。

NChannel 色空間 PDF 1.6 では、 DeviceN 色空間の拡張 と し て、 NChannel と い う も のが


導入 さ れま し た。 NChannel 色空間は、 PDF ビ ュ ーアーや RIP が正確な色表現を行 う こ と
を助け る 情報を追加で内容 と し て持ち ます。 こ の情報は、 その DeviceN 色空間におけ る
個々の イ ン キに対す る 代替色空間 と (結合 さ れた濃度変換関数だけでな く ) 、 プ ロ セ ス色
空間 と 、 成分名群を含みます。 NChannel は さ ら に、 印刷 イ ン キの混ぜ合わせ動作を記述
し た情報を含む こ と も 可能ですが、 こ れは目下 PDFlib では対応 し てい ません。 NChannel
色空間では、その イ ン キ群に対す る 個別の代替色を持つ Colorants エン ト リ ーが必須です。
こ れは PDFlib に よ っ て自動的に生成 さ れます。 NChannel 色空間では さ ら に、 プ ロ セ ス色
空間 の 名前 と そ の イ ン キ 名群 も 必須 で す。 こ れ ら に つ い て は process オ プ シ ョ ン と
colorspace ・ components サブオプシ ョ ンで与え る 必要があ り ます。
NChannel 色空間を作成す る には、PDF_create_devicen( ) でオプシ ョ ン subtype=nchannel
を用い ます。 こ の設定の利点は、 こ のサブ タ イ プを持っ た DeviceN 色空間は Acrobat の
「オーバープ リ ン ト プ レ ビ ュ ー」 設定に依存 し な く な る こ と です。 場合に よ っ ては、 ス ク
リ ーン プ レ ビ ュ ーを正 し く す る ために こ の Acrobat 設定が必要にな る こ と があ る のです
が、 NChannel は自動的に Acrobat を こ の表示モー ド へ切 り 替え ます。

CMYK プ ロ セ ス カ ラ ーに基づ く DeviceN 色空間 以下の例においては、 マゼ ン タ と イ エ


ロ ーの イ ン キ で構成 さ れ た、 CMYK カ ラ ーの部分集合 を 使い、 かつ代替色空間 と し て
DeviceCMYK を使い ます。 その変換関数はシ ンプルです。 なぜな ら CMYK 代替色空間のシ
ア ン ・ 黒成分に対す る ゼ ロ 値を補足 し てい る だけだか ら です :
devicen = p.create_devicen(
"names={Magenta Yellow} alternate=devicecmyk transform={{0 0 4 1 roll}}");
p.set_graphics_option("fillcolor={devicen " + devicen + " 0.5 1}");

その色を設定する 際には N 個のカ ラ ー値を与え る 必要があ り ます (上の例では N=2)。 上


の例で作成 し た DeviceN 色空間は、 マゼン タ と イ エ ロ ーのチ ャ ン ネルにのみ描画 し 、 シ ア
ン と 黒のチ ャ ン ネルを変更 し ません。 こ れは、 フル CMYK カ ラ ーで Cyan=Black=0 と し て
描画を行 う と シ ア ン と ブ ラ ッ ク のチ ャ ン ネルにおけ る 既存の内容が消去 さ れ る (オーバー
プ リ ン ト 設定に依存) の と 異な り ます。
便宜のために、 表 4.6 に、 CMYK イ ン キのすべての可能な部分集合に対す る 、 CMYK を
代替色空間 と し た場合の、 DeviceN PostScript 変換関数を挙げます。
同様の技法を用いて、 CMYK 画像チ ャ ン ネルの部分集合のみを表現す る こ と も 可能で
す。 た と えば以下の コ ー ド 断片は、 黒チ ャ ン ネルのみを使 う 、 それ以外の 3 個のチ ャ ン ネ
ルを None へ置 き 換え る DeviceN 色空間を作成 し ます。 その画像デー タ 内には 4 個のカ
ラ ーチ ャ ン ネルがあ る ため、 こ の PostScript 変換関数はシ ア ン と マゼ ン タ と イ エ ロ ーの
チ ャ ン ネルをゼ ロ 値へ置 き 換え てい ます( こ れは、表 4.6 の PostScript 関数が既存のカ ラ ー
値群をゼ ロ へ置 き 換え る のでな く 足 り ない 0 値群を補っ てい る の と 異な り ます) :
devicen = p.create_devicen(
"names={None None None Black} " +
"alternate=devicecmyk transform={{4 1 roll pop pop pop 0 0 0 4 -1 roll}}");
optlist = "width=4000 height=3000 bpc=8 colorize=" + devicen;
image = p.load_image("raw", filename, optlist);

4.5 DeviceN カ ラ ー 95
表 4.6 CMYK プ ロ セ ス イ ンキの部分集合群に対する、 alternate=devicecmyk の場合の DeviceN PostScript 変換関数

CMYK 部分集合に対する PostScript 変換関数 CMYK 部分集合に対する PostScript 変換関数


DeviceN イ ンキ名 DeviceN イ ンキ名

Cyan {0 0 0} Magenta Black {0 3 1 roll 0 exch}

Magenta {0 0 0 4 1 roll} Yellow Black {0 0 4 2 roll}

Yellow {0 0 0 4 2 roll} Cyan Magenta Yellow {0}

Black {0 0 0 4 3 roll} Cyan Magenta Black {0 exch}

Cyan Magenta {0 0} Cyan Yellow Black {0 3 1 roll}

Cyan Yellow {0 exch 0} Magenta Yellow Black {0 4 1 roll}

Cyan Black {0 0 3 -1 roll} Cyan Magenta Yellow Black { }

Magenta Yellow {0 0 4 1 roll}

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の color/colorize_image_with_DeviceN_color ト ピ ッ


ク にあ り ます。

Lab 代替空間を持 っ た スポ ッ ト カ ラ ー群に基づ く DeviceN 色空間 複 数 の ス ポ ッ ト カ


ラ ーを DeviceN イ ン キ と し て用い る こ と は、 ス ポ ッ ト カ ラ ーの間のシ ェ ーデ ィ ン グの基礎
を提供 し ます。 デバ イ ス依存な代替色空間に対 し ては、 然る べき PostScript 変換関数を実
装す る のはかな り 大変です。 なぜな ら RGB や CMYK は非線形な特性を有する か ら です。
Lab 色空間の色を混ぜ合わせ る のはは る かに容易です。なぜな ら 知覚的に一様だか ら です。
ですので、 各色の Lab 値の加重平均を計算する だけで色を組み合わせる こ と がで き ます。
以下の PostScript コ ー ド は、2 個の Pantone カ ラ ーに対 し て こ の方式を実装 し てい ます。そ
の 2 色の Lab 代替値を コ ー ド の先頭で与え る 必要があ り ます :
% N=2かつLab代替を持つDeviceNに対するPostScript変換関数。
% 濃度値群を重みとして用いてL/a/b値の加重平均を計算することにより
% Labカラーどうしを混ぜ合わせます

80 28 75 % 色1=PANTONE 123 UのLab値群


31.7647 0 -17 % 色2=PANTONE 289 UのLab値群

% L値どうしを混ぜ合わせ
7 index 6 index mul % t1*L1
7 index 4 index mul % t2*L2
add 9 1 roll % ボトム: L = t1*L1 + t2*L2

% a値どうしを混ぜ合わせ
7 index 5 index mul % t1*a1
7 index 3 index mul % t2*a2
add 9 1 roll % ボトム: a = t1*a1 + t2*a2

% b値どうしを混ぜ合わせ
7 index 4 index mul % t1*b1
7 index 2 index mul % t2*b2
add 9 1 roll % ボトム: b = t1*b1 + t2*b2

% 2個の濃度値と2×3個の入力カラー値をポップ
pop pop pop pop pop pop pop pop
% 結果: 混ぜ合わされた色のLab値群

96 第 4 章 : 色 と 透過
上記の PostScript 関数 transformFunc2 を用いて、 2 個の Pantone ス ポ ッ ト カ ラ ーに基づい
て DeviceN 色空間を作成す る には、 以下の よ う に し ます :
devicen = p.create_devicen(
"names={{PANTONE 123 U} {PANTONE 289 U}} alternate=lab " +
"transform={{" + transformFunc2 + "}}");

Lab 代替値を持っ た別々の ス ポ ッ ト カ ラ ーに基づいてシ ェーデ ィ ン グが構築 さ れてい る と


き には、 PDFlib は自動的にその よ う な DeviceN 色空間を構築 し ます。

ク ッ ク ブ ッ ク さ ま ざ ま な コ ー ド サン プル と 、 Lab に基づ く も っ と 大き な N 値に対する PostScript 変換関


数が、 ク ッ ク ブ ッ ク の color/devicen_color ト ピ ッ ク にあ り ます。

4.5 DeviceN カ ラ ー 97
4.6 シ ェ ーデ ィ ン グ と シ ェ ーデ ィ ン グパ タ ー ン
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが、 starter_color サン プル と ク ッ ク ブ ッ クの color/color_gradient
ト ピ ッ ク にあ り ます。

ス ムーズシ ェ ーデ ィ ン グは、 カ ラ ーブ レ ン ド ま たはグ ラ デーシ ョ ン と も 呼ばれ、 同 じ 色空


間にあ る 複数の色の間の連続的な遷移を与え ます。 た と えば 2 個の RGB カ ラ ーの間や、 1
個の ス ポ ッ ト カ ラ ーの 2 個の濃度の間な ど です。 シ ンプルなシ ェーデ ィ ン グは、 2 個の色
の間の遷移を定義 し ます。 1 番目の色は、 PDF_shading( ) の startcolor オプシ ョ ンかカ レ ン
ト 塗 り 色か ら 採 ら れます。 2 番目の色は、 endcolor オプシ ョ ンか c1 ・ c2 ・ c3 ・ c4 引数で与
え ら れます。 任意の数の中間色を持つシ ェーデ ィ ン グ を作成す る こ と も で き 、 そのために
は startcolor/endcolor でな く stopcolors オプシ ョ ン を用い ます。
そのシ ェーデ ィ ン グ カ ラ ーは変数 t に よ っ て制御 さ れます。 t は開始色におけ る 0 か ら
終了色におけ る 1 ま で線形的に変化 し ます。 こ の線形的な遷移を指数的な遷移へ変え る こ
と も で き 、 そのためには N オプシ ョ ン を指数 と し て用い ます。 RGB ・ CMYK 色空間は知覚
的に一様ではあ り ませんので、その得 ら れ る ブ レ ン ド は意図どお り 滑 ら かに見え ない場合
があ り ます。 Lab 色空間の開始 ・ 終了色を用いてブ レ ン ド を指定すれば、 よ り 滑 ら かな色
遷移を得 ら れ る 可能性があ り ます。PDFlib ではシ ェ ーデ ィ ン グに 2 種類の形状を使用で き
ます :
> 直線状シ ェ ーデ ィ ン グ (type=axial) : 始点 と 終点の間の直線に沿っ て色が変化 し ます
(図 4.2 参照)。 そのシ ェ ーデ ィ ン グ カ ラ ーは、 始点 (x0, y0) か ら 終点 (x1, y1) ま で線形的
に変化 し ます。 シ ェ ーデ ィ ン グ を、 始点 ・ 終点の向 こ う の境界色を用いて拡張す る こ
と も 可能で、 そのためには extend0 ・ extend1 オプシ ョ ン を用い ます。
> 放射状シ ェーデ ィ ン グ (type=radial) :2 個の円の間で色が変化 し ます (図 4.3 参照)。放
射状シ ェーデ ィ ン グ を利用す る と 、 球の 3 次元風な視覚表現を作れます。 そのシ ェ ー
デ ィ ン グ カ ラ ーは、 中心 (x0, y0) と 半径 r0 を持つ開始円か ら 、 中心 (x1, y1) と 半径 r1 を
持つ終了円ま で変化 し ます。 片方の円を縮めて点にす る こ と も 可能です。

PDF_shading( ) は、 シ ェ ーデ ィ ン グオブジ ェ ク ト へのハン ド ルを返 し ます。 こ のハン ド ル


の使い道は 2 つあ り ます :
> PDF_shfill( ) を用いて領域を直接塗 る 。 塗 り たいオブジ ェ ク ト の形状がシ ェ ーデ ィ ン グ
の形状 と 同 じ であ る 場合には こ の方式が良いで し ょ う 。 こ の メ ソ ッ ド は、 その名前に
反 し て、 オブ ジ ェ ク ト の内側を塗 る だけで な く 、 外側に も 影響 し ま す。 こ の動作は、
PDF_clip( ) を用いて変え る こ と も で き ます。
> も っ と 複雑なオブジ ェ ク ト を塗 る ために、シ ェ ーデ ィ ン グパ タ ーン ( タ イ リ ン グパ タ ー
ン と 混同 し ないで く だ さ い) を定義 し て使用す る 。 具体的には、PDF_shading_pattern( )
を呼び出す こ と に よ っ て シ ェ ーデ ィ ン グに基づいてパ タ ーン を作成 し 、 こ のパ タ ーン
を使用 し て任意のオブジ ェ ク ト を塗っ た り 描線 し た り し ます。

図 4.2
2 色の間の直線状シ ェ ーデ ィ ングの主なパラ メ ー タ ー

開始色=赤 終了色=青

始点 t=0 t=0.5 t=1 終点


(x0, y0) (x1, y1)

98 第 4 章 : 色 と 透過
2 個のプ ロ セ ス カ ラ ーの間のシ ェ ーデ ィ ン グ 以下の コ ー ド は、 RGB 色空間におけ る 赤
か ら 青ま での直線状シ ェ ーデ ィ ン グ を作成 し 、 それを使っ て円を塗 り ます :
sh = p.shading("axial", 100, 100, 500, 500, 0, 0, 0, 0, "startcolor=red endcolor=blue");
shp = p.shading_pattern(sh, "");
p.set_graphics_option("fillcolor={pattern " + shp + "}");

p.circle(300, 300, 200);


p.fill();

複数のスポ ッ ト カ ラ ーの間のシ ェ ーデ ィ ン グ シ ェ ーデ ィ ン グ を 使 っ て 作成 で き る の
は、 同一の色空間に属す る 色の間の遷移だけですので、 開始色 と 終了色 と し て、 任意の ス
ポ ッ ト カ ラ ー群を使っ た り 、 1 個の ス ポ ッ ト カ ラ ー と 1 個のプ ロ セ ス カ ラ ーを使っ た り す
る こ と はで き ません。 ただ し 、 Lab 代替値を持っ た ス ポ ッ ト カ ラ ー群に対 し ては、 96 ペー
ジ 「Lab 代替空間を持っ た ス ポ ッ ト カ ラ ー群に基づ く DeviceN 色空間」 で示 し てい る の と
同様の適切な DeviceN 色空間を用いてシ ェ ーデ ィ ン グ を実現で き ます。特定の条件が満た
さ れていれば (PDFlib API リ フ ァ レ ン ス参照)、 ス ト ッ プカ ラ ー と し ての ス ポ ッ ト カ ラ ー
群に対 し て こ の よ う な DeviceN 色空間を PDFlib は自動生成 し ます。 以下の コ ー ド 断片は、
2 個の ス ポ ッ ト カ ラ ーの間のシ ェーデ ィ ン グ を作成 し ます :
sh = p.shading("axial", 100, 100, 500, 500, 0, 0, 0, 0,
"stopcolors={ 0% {spotname {PANTONE 123 U} 1} 100% {spotname {PANTONE 289 U} 1}}"
shp = p.shading_pattern(sh, "");
p.set_graphics_option("fillcolor={pattern " + shp + "}");

p.circle(300, 300, 200);


p.fill();

図 4.3
2 色の間の放射状シ ェ ーデ ィ ン グの主なパラ メ ー タ ー。
開始円は縮んで点にな っ ています。 2 つの円の中心は同
中心0 (x0, y0) = 一です。
中心1 (x1, y1)
r0=0 r1
開始色=黄色 終了色=赤
t=0 t=0.5 t=1

4.6 シ ェ ーデ ィ ング と シ ェ ーデ ィ ングパ タ ーン 99
4.7 タ イ リ ン グパ タ ー ン
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが、 starter_color サン プル と ク ッ ク ブ ッ クの graphics/fill_
pattern ・ images/tiling_pattern ト ピ ッ ク にあ り ます。

タ イ リ ン グパ タ ーンは、任意の数の塗 り 操作を 1 つの実体に ま と めた も のに よ っ て定義 さ


れます。 こ のグループは任意の他の物の塗 り や描線に用い る こ と がで き 、 塗 り の場合は全
域内に、 描線の場合はパ ス 上に グループが コ ピ ー (縦横に並ぶ) さ れ ま す。 パ タ ーン を
使っ た作業では次の手順を踏みます :
> まず、PDF_begin_pattern_ext( ) と PDF_end_pattern( ) の間で、描画オペレー タ ー群を用
いてパ タ ーン を定義 し なければな り ません。 パ タ ーン の定義にはたいていの画像オペ
レー タ ーが利用で き ます。
> PDF_begin_pattern_ext( ) に よ っ て返 さ れたパ タ ーンハン ド ルは、 PDF_set_graphics_
option( ) ま たは PDF_setcolor( ) でオプシ ョ ン fillcolor/strokecolor を用いて、 パ タ ーン を
カ レ ン ト カ ラ ー と し て設定す る ために用い る こ と がで き ます。

PDF_begin_pattern_ext( ) の painttype オプシ ョ ンに よ っ て、 パ タ ーン定義がそれ自身の色


指定群を含む こ と がで き る か ど う かが決ま り ます。 painttype=colored の場合、 パ タ ーン定
義 は そ れ 自 身 の 色 指 定 を 含 ま な け れ ば な ら ず、 つ ね に 見 た 目 が 同 じ に な り ま す。
painttype=uncolored の場合、 パ タ ーン定義は色指定を一切含んでいてはな り ません。 その
パ タ ーンが塗 り や描線に使われ る と き には、 カ レ ン ト の塗 り や描線の色が適用 さ れます。

図 4.4
タ イ リ ングパ タ ーン を使っ て円 と テキス ト を塗る。 さ ら に強調のためにテキス ト の輪郭を描線 し ています。

Text filled with tiling pattern

100 第 4 章 : 色 と 透過
4.8 透過ブ レ ン ド モー ド
ク ッ ク ブ ッ ク コ ー ド サン プルがク ッ ク ブ ッ ク の color/blendmode ト ピ ッ ク にあ り ます。

ブ レ ン ド モー ド は、 透過 イ メ ージ ン グモデル (各オブジ ェ ク ト がその背後にあ る すべての


オブジ ェ ク ト を完全に覆い隠す不透明 イ メ ージ ン グモデルではな く ) において、 オブジ ェ
ク ト の色を背景 と ど の よ う に混ぜ合わせ る か を制御 し ま す。 背景色は、 複数の他のオブ
ジ ェ ク ト を ブ レ ン ド す る こ と に よ っ て作成 さ れてい る 可能性 も あ り ますので、 こ れをバ ッ
ク ド ロ ッ プ と 呼びます。 描画 さ れ る オブジ ェ ク ト を ソ ース と 呼びます。 ソ ース と バ ッ ク ド
ロ ッ プの色は、 何 ら かのブ レ ン ド 機能を用いて互いに混ぜ合わ さ れます。 表 4.7 に挙げ る
ブ レ ン ド モー ド は、 さ ま ざ ま な芸術的効果を生み出 し 、 ま た、 特殊な用途に利用す る こ と
も で き ます (104 ページ 「4.9.1 ブ レ ン ド モー ド を用いて色を変え る 」 参照)。 利用可能な
ブ レ ン ド モー ド は以下の よ う に分類で き ます :
> デフ ォ ル ト のブ レ ン ド モー ド Normal: ソ ース を完全に不透明に し ます。すなわち、ソ ー
ス オブジ ェ ク ト が完全に背景を置 き 換え ます。ブ レ ン ド モー ド を Normal 以外に設定す
る と 、 いかな る 不透過設定や画像透過に も よ ら ず、 ソ ース オブジ ェ ク ト は暗黙的に透
過にな り ます。
> ブ レ ン ド モー ド Darken ・ Multiply ・ ColorBurn : 暗 く する 効果を生み出 し ます。
> ブ レ ン ド モー ド Lighten ・ Screen ・ ColorDodge : 明る く する 効果を生み出 し ます。
> ブ レ ン ド モー ド Overlay ・ SoftLight ・ HardLight : 明 る い領域 と 暗い領域を加減す る こ と
に よ っ て コ ン ト ラ ス ト を強 く し ます。
> 差分ブ レ ン ド モー ド Difference ・ Exclusion : カ ラ ー値の差を と り ます。 白いオブジ ェ ク
ト を白バ ッ ク ド ロ ッ プの上に描画 し て結果が白にな ら ないのは こ れ ら のモー ド だけで
す。
> ブ レ ン ド モー ド Hue ・ Saturation ・ Color ・ Luminosity : HSL カ ラ ー表現の次元群に対す
る 効果に よ っ て定義 さ れます。 HSL モデルにおいて、 色相 (hue) は知覚 さ れ る 色を記
述 し (赤 と 緑は色相が異な る )、 彩度 (saturation) は色が ど の く ら いカ ラ フルに見え る
か (その色にグ レーが ど の く ら い混ぜ ら れてい る か) を記述 し 、 輝度 (luminosity) は
色が ど の く ら い暗 く 、 ま たは明 る く 見え る か を記述 し ます (白が最大輝度)。

表 4.7 ブ レ ン ド モー ド と 、 ソ ースオブ ジ ェ ク ト を背景オブ ジ ェ ク ト (バ ッ ク ド ロ ッ プ) にブ レ ン ド さ せる際の効果


ブ レ ン ド モー ド ISO 32000-2 に従っ た説明

ブ レ ン ド 効果のないブ レ ン ド モー ド
None PDFlib 独自のブ レ ン ド モー ド 。 ブ レ ン ド モー ド 指定のない gstate を作成 し ます。 外側の gstate
で設定 さ れている ブ レ ン ド モー ド を確実に効かせます。
Normal ソ ース色を採 り 、 バ ッ ク ド ロ ッ プ を無視 し ます。

暗 く する ブ レ ン ド モー ド

Darken1 バ ッ ク ド ロ ッ プ と ソ ースの う ち暗いほ う の色を採 り ます。 ソ ースのほ う が暗い場所ではバ ッ ク


ド ロ ッ プはソ ースへ置き換え られます。 そ う でない場合には変更 さ れません。

Multiply1 バ ッ ク ド ロ ッ プ と ソ ースのカ ラ ー値を乗算 し ます。 結果の色は少な く と も こ の 2 色のど ち らか


と 同 じ 暗 さ にな り ます。 加法的な色を扱 う 場合には、 任意の色を黒 と 乗算する と 結果は黒にな
り 、 白 と 乗算する と 元の色は変更 さ れません。 減法的な色の場合には、 その色空間のすべての
イ ンキに対 し て使用 さ れている濃度の最大値が、 加法空間におけ る黒 と 同 じ 役目を し ます。 い
く つ も のオブ ジ ェ ク ト が連な っ て重な り 合っ ている場合には、 それ らが黒で も白で も なけれ
ば、 だんだん暗い色が描画 さ れます。
ColorBurn ソ ース カ ラ ーを反映 し てバ ッ ク ド ロ ッ プ カ ラ ーを暗 く し ます。 白で描画 し た場合には変化あ り
ません。

4.8 透過ブ レ ン ド モー ド 101


表 4.7 ブ レ ン ド モー ド と 、 ソ ースオブ ジ ェ ク ト を背景オブ ジ ェ ク ト (バ ッ ク ド ロ ッ プ) にブ レ ン ド さ せる際の効果
ブ レ ン ド モー ド ISO 32000-2 に従 っ た説明

明る く する ブ レ ン ド モー ド

Lighten1 バ ッ ク ド ロ ッ プ と ソ ースの う ち明るいほ う の色を採 り ます。 ソ ースのほ う が明るい場所では


バ ッ ク ド ロ ッ プは ソ ースへ置き換え ら れます。 そ う で ない場合には変更 さ れません。

Screen1 バ ッ ク ド ロ ッ プ と ソ ースのカ ラ ー値の補数を乗算 し 、 結果の補数を と り ます。 結果の色は少な


く と も こ の 2 色のど ち ら か と 同 じ 明る さ にな り ます。 加法的な色を扱 う 場合には、 任意の色を
白 と ス ク リ ーンする と 結果は白にな り 、 黒 と ス ク リ ーンする と 元の色は変更 さ れません。 減法
的な色の場合には、 その色空間のすべてのイ ンキに対 し て使用 さ れている濃度の最大値が、 加
法空間における黒 と 同 じ 役目を し ます。 複数のス ラ イ ド 写真を同時に 1 つのス ク リ ーンへ映 し
出 し た よ う な効果にな り ます。
ColorDodge ソ ース カ ラ ーを反映 し てバ ッ ク ド ロ ッ プ カ ラ ーを明る く し ます。 黒で描画 し た場合には変化あ
り ません。

コ ン ト ラ ス ト を強める ブ レ ン ド モー ド
HardLight ソ ース カ ラ ー値が 0.5 よ り 小 さ ければ 2 色を乗算 し 、 0.5 よ り 大き ければス ク リ ーン し ます。
バ ッ ク ド ロ ッ プに き ついスポ ッ ト ラ イ ト をあてた よ う な効果にな り ます。

SoftLight ソ ース カ ラ ー値が 0.5 よ り 小 さ ければ 2 色の う ち暗いほ う の色を採 り 、 0.5 よ り 大き ければ明る


いほ う の色を採 り ます。 バ ッ ク ド ロ ッ プにやわ らかいスポ ッ ト ラ イ ト を あてた よ う な効果にな
り ます。
Overlay バ ッ ク ド ロ ッ プ カ ラ ー値に応 じ て 2 色を乗算かス ク リ ーン し ます。 ソ ース カ ラ ーが、 バ ッ ク ド
ロ ッ プのハイ ラ イ ト と 影を温存 し つつその上にかぶ さ り ます。 バ ッ ク ド ロ ッ プ カ ラ ーは置き換
え ら れるのではな く 、 バ ッ ク ド ロ ッ プの明る さ や暗 さ を反映する よ う に ソ ース カ ラ ー と 混ぜ合
わ さ れます。

差分ブ レ ン ド モー ド

Difference1,2 2 色の う ち明るいほ う の色か ら暗いほ う の色を減算 : 白で描画する と バ ッ ク ド ロ ッ プ カ ラ ーが


反転 さ れます。 黒で描画する と 何も変化 し ません。 減法的な色の場合には、 その色空間のすべ
てのイ ンキに対する濃度の最大値が、 加法空間における黒 と 同 じ 役目を し ます。

Exclusion1,2 Difference モー ド と 似た効果にな り ますが、 コ ン ト ラ ス ト はよ り 弱 く な り ます。 白で描画する


と バ ッ ク ド ロ ッ プ カ ラ ーが反転 さ れます。 黒で描画する と 何も変化 し ません。 減法的な色の場
合には、 その色空間のすべてのイ ンキに対する濃度の最大値が、 加法空間における黒 と 同 じ 役
目を し ます。

HSL ブ レ ン ド モー ド

Hue2 ソ ース カ ラ ーの色相を持ち、 バ ッ ク ド ロ ッ プ カ ラ ーの彩度 と 輝度を持つ色を作成 し ます。

Saturation2 ソ ース カ ラ ーの彩度を持ち、 バ ッ ク ド ロ ッ プ カ ラ ーの色相 と 輝度を持つ色を作成 し ます。 バ ッ


ク ド ロ ッ プの純粋な灰色 (彩度な し ) の部分に こ のモー ド で描画 し て も 何も変化あ り ません。

Color2 ソ ース カ ラ ーの色相 と 彩度を持ち、 バ ッ ク ド ロ ッ プ カ ラ ーの輝度を持つ色を作成 し ます。 こ れ


はバ ッ ク ド ロ ッ プのグ レーレ ベルを温存 し ますので、 白黒の画像に色をつけた り 、 カ ラ ー画像
に濃度をつけた り するのに有用です。

Luminosity2 ソ ース カ ラ ーの輝度を持ち、 バ ッ ク ド ロ ッ プ カ ラ ーの色相 と 彩度を持つ色を作成 し ます。 こ れ


は Color モー ド と 同 じ 効果を生み出 し ますが、 ただ し ソ ース と バ ッ ク ド ロ ッ プが入れ替わっ て
います。

1. こ のモー ド は対称です。 すなわち、 ソ ース カ ラ ー と バ ッ ク ド ロ ッ プ カ ラ ーを入れ替えて も ブ レ ン ド 操作の結果は変わ り ませ


ん。
2. スポ ッ ト カ ラ ーに対 し ては こ のモー ド は何 ら 影響を与えず、 ブ レ ン ド モー ド Normal がかわ り に使われます。

102 第 4 章 : 色 と 透過
ブ レ ン ド 色空間 PDF ビ ュ ーアーは、 すべての透過計算を ブ レ ン ド 色空間において行い
ます。 こ の色空間は重要な役割を果た し ます。 なぜな ら 、 ど の色空間を選択す る かに よ っ
てブ レ ン ド の結果が変わっ て く る か ら です。 こ れは以下の と お り 決定 さ れます :
> transparencygroup ページオプシ ョ ンの colorspace サブオプシ ョ ンがあ る 場合には、そ こ
で指定 さ れてい る 色空間。
> ない場合には、PDF/X ま たは PDF/A 出力 イ ン テ ン ト ICC プ ロ フ ァ イ ルが も し あ る な ら 、
それが使用 さ れます。 PDF/X では出力 イ ン テ ン ト は必ずあ り ます。 PDF/A 文書が出力
イ ン テ ン ト を含んでいない場合には、 それは transparencygroup ページオプシ ョ ン の
colorspace サブオプシ ョ ン を指定す る 必要があ り ます。
> ないな ら 、 出力デバ イ ス ( ソ フ ト プルーフ/出力プ レ ビ ュ ーの場合には、 シ ミ ュ レー
ト さ れた出力デバ イ ス) のネ イ テ ィ ブ色空間が使用 さ れ ます。 ブ レ ン ド 色空間を明示
的に指定す る こ と に よ っ て こ の状況を避け る こ と を推奨 し ます。 なぜな ら 、 そ う でな
い と 透過オブジ ェ ク ト の視覚表現が出力デバ イ ス に依存 し て し ま う か ら です。
以下の コ ー ド 断片は、DeviceRGB をブ レ ン ド 色空間 と し て指定 し 、ブ レ ン ド モー ド Multiply
を指定 し てい ます :
p.begin_page_ext(0, 0, "width=a4.width height=a4.height " +
"transparencygroup={colorspace=DeviceRGB}");

gstate = p.create_gstate("blendmode=Multiply");
p.set_gstate(gstate);

複数のブ レ ン ド モー ド PDF では、 い っ と き に 1 つのブ レ ン ド モー ド し かグ ラ フ ィ ッ ク


ス テー ト 内で有効にす る こ と がで き ません。複数のブ レ ン ド モー ド の効果を適用 し たい場
合には、すでにブ レ ン ド さ れたバ ッ ク ド ロ ッ プ と オブジ ェ ク ト の上に重ねて別のオブジ ェ
ク ト を描画する こ と がで き ます。 た と えば、 何かほかのブ レ ン ド モー ド の結果を色反転 さ
せたい場合には、 まずバ ッ ク ド ロ ッ プ と オブジ ェ ク ト を第一のブ レ ン ド モー ド でブ レ ン ド
し たのち、 ブ レ ン ド モー ド を Difference へ切 り 替え て、 そ し て最初のブ レ ン ド 操作の結果
の上に重ねて白い長方形を描画 し ます。

4.8 透過ブ レ ン ド モー ド 103


4.9 オ ブ ジ ェ ク ト の色を変更
PDFlib では、 オブジ ェ ク ト の色を変更す る 手段を い く つか用意 し てい ます。 こ れに よ っ
て、 ページ上に配置 さ れてい る 取 り 込み PDF ページ、 ラ ス タ ー画像、 SVG グ ラ フ ィ ッ ク 、
任意のテ キ ス ト ・ ベ ク ト ル要素の色を変更する こ と がで き ます :
> ラ ス タ ー画像には着色す る こ と がで き ます。 197 ページ 「8.1.5 画像に ス ポ ッ ト カ ラ ー
か DeviceN カ ラ ーで着色」 参照。
> 任意のオブジ ェ ク ト の色を、 ブ レ ン ド モー ド を用いて変更で き ます。
> 輝度 ソ フ ト マ ス ク を持っ た gstate を用いて、任意のオブジ ェ ク ト の色をつけ る こ と がで
き ます。

4.9.1 ブ レ ン ド モー ド を用いて色を変え る
ク ッ ク ブ ッ ク こ の項で述べるすべての効果のための コ ー ド サン プルがク ッ ク ブ ッ クの color/blendmode_
effects ト ピ ッ ク にあ り ます。

こ の項ではブ レ ン ド モー ド の有用な応用をい く つか紹介 し ます。利用で き る すべてのブ レ


ン ド モー ド の説明は 101 ページ 「4.8 透過ブ レ ン ド モー ド 」 にあ り ます。 すべての例にお
いて、 オブジ ェ ク ト (取 り 込み画像 ・ PDF ページ ・ SVG グ ラ フ ィ ッ ク な ど) の色が、 何
ら かの形で変更 さ れます。
すべての例は、 以下の示す基本的な コ ー ド 断片を用いて実装で き ま す。 こ の コ ー ド 断
片は、ページに対 し て透過グループ色空間を指定する こ と に よ っ てデバ イ ス独自の視覚表
現を防いだ う えで、 何か特定のブ レ ン ド モー ド を設定 し てい ます。 後続する オブジ ェ ク ト
群が、 こ こ で指定 し たブ レ ン ド モー ド に よ っ て影響 さ れ る こ と を防 ぐ ために、 こ のシーケ
ン ス は、 save/restore ペアで囲むべ き です :
p.begin_page_ext(width, height, "transparencygroup={colorspace=DeviceCMYK}");

// ラスター画像か取り込みPDFページかSVGグラフィックを配置
p.fit_image(image, 200, 150, optlist);

// 望む色とブレンドすることにより既存内容を着色または脱色または色反転
p.save();
// 望むブレンドモードを持ったgstateを作成
gs_blendmode = p.create_gstate("blendmode=Color");
p.set_graphics_option("fillcolor=red gstate=" + gs_blendmode);
p.rect(0, 0, width, height);
p.fill();
p.restore();

オ ブ ジ ェ ク ト に任意の色で着色 ブ レ ン ド モー ド Color を使 う と 、オブジ ェ ク ト に何か新


し い色を着色で き ます。 そのオブジ ェ ク ト の、 知覚 さ れ る グ レーレベルが、 追加 さ れ る 色
の濃度値を制御 し 、 かつ、 そのオブジ ェ ク ト の元の色は無視 さ れます。 オブジ ェ ク ト に着
色す る には、 ブ レ ン ド モー ド Color を適用 し 、 色付き の長方形 (ま たは他の形) を、 その
オブジ ェ ク ト の上に重ねて配置 し ます。 透過オブジ ェ ク ト に着色す る には、 配置オブジ ェ
ク ト の下に白い領域を配置す る こ と を推奨 し ます。
逆に ソ ー ス オブ ジ ェ ク ト の白い領域 を 通 し てバ ッ ク ド ロ ッ プ カ ラ ーが見え る よ う に
(暗い領域は変更 さ れない よ う に) し たい場合には、ブ レ ン ド モー ド Multiply を使用 し ます。

オ ブ ジ ェ ク ト を脱色ま たは色反転 場合に よ っ ては、 オブジ ェ ク ト を脱色 (彩度を な く


す。 褪色 さ せ る ) し たい場合 も あ る で し ょ う 。 すなわち、 も と も と 色が付いていた オブ

104 第 4 章 : 色 と 透過
ジ ェ ク ト か ら グ レース ケール出力を作成す る こ と です。 その際に、 その各部分のグ レーレ
ベルは、 そのオブジ ェ ク ト の各部分の も と も と の色の、 知覚 さ れ る 明 る さ (輝度) に対応
す る よ う にす る こ と です。 こ れを実現す る には、 ブ レ ン ド モー ド Color を用いて、 そのオ
ブジ ェ ク ト の上に白い領域を重ねます。
ラ ス タ ー画像の色は invert 画像オプシ ョ ン を用いて反転で き ます。 任意のオブジ ェ ク
ト の色を反転す る こ と も 可能です。 そのためには、 ブ レ ン ド モー ド Difference を用いて、
そのオブジ ェ ク ト の上に白を重ねます。

4.9.2 ソ フ ト マ ス ク を用いて色を変え る
ク ッ ク ブ ッ ク コ ー ド サン プルがク ッ ク ブ ッ ク の color/softmask_effects ト ピ ッ ク にあ り ます。

画像アルフ ァ チ ャ ン ネルは、 一般化 し て任意のオブジ ェ ク ト と 色空間で利用で き ます。 そ


のためには、 グ ラ フ ィ ッ ク ス テー ト (gstate) 内の輝度 ソ フ ト マ ス ク を援用 し ます。 こ の
ソ フ ト マ ス ク は、 取 り 込み PDF ページや SVG グ ラ フ ィ ッ ク な ど任意の内容を持っ たテ ン
プ レー ト をベース と し て構築 さ れます。 こ のテ ンプ レー ト 内容の輝度、 すなわち知覚 さ れ
る グ レーレベルま たは明度に よ っ て、その後に描かれ る オブジ ェ ク ト 群の可視性が決定 さ
れます : テ ンプ レー ト 内の明る い領域は透明にな り (すなわち、 描かれ る オブジ ェ ク ト 群
が見え る ) 、 暗い領域はオブジ ェ ク ト を見え な く し ます。 こ の技法を実現す る には以下の
手順に従い ます :
> テ ンプ レー ト を、transparencygroup オプシ ョ ン と サブオプシ ョ ン colorspace を用いて作
成 し ます。 こ のテ ンプ レー ト の中で、 任意の描画操作を行な っ てい き ます。
> こ のテ ンプ レー ト をベース と し て、 gstate を、 softmask オプシ ョ ン と サブオプシ ョ ン
type=luminosity を用いて作成 し ます。 ソ フ ト マ ス ク を適用 し た時、 ソ フ ト マ ス ク テ ン
プ レー ト の明 る い (白い) 領域はカ レ ン ト 色で着色 さ れ、 一方、 暗い (黒い) 領域に
色がつ き ません。 softmask オプシ ョ ンの invert サブオプシ ョ ン を使 う と 、 暗い色 と 明
る い色の効果を反転 さ せ る こ と がで き ます。 すなわち、 暗い領域 と 明 る い領域が維持
さ れ ます。 デフ ォ ル ト では ソ フ ト マ ス ク の背景は不透明で初期化 さ れ ます。 こ れは黒
ベ タ と 同等です。 こ れは、 サブオプシ ョ ン backdropcolor=transparent を用いて変え る
こ と も で き ます。こ れは白ベ タ と 同等です。なお、invert サブオプシ ョ ンは backdropcolor
の効果について も 反転 さ せます。
> こ の gstate を設定 し ます。 save/restore シーケ ン ス で囲む こ と が多いで し ょ う 。 そ う す
れば、 こ の ソ フ ト マ ス ク の効果を その中だけに と ど め る こ と がで き ます。 こ の gstate
内の ソ フ ト マ ス ク テ ンプ レー ト の幾何情報はカ レ ン ト 座標系に依存 し ます。 た と えば、
ソ フ ト マ ス ク の位置を制御す る には、gstate を設定する 前に平行移動を適用 し ます。以
上が終わっ た ら 、 ページ上でマ ス ク さ れ る 内容を描 き ます。
以下の コ ー ド 断片は、 こ のシーケ ン ス を実装 し 、 それを適用す る こ と に よ っ て、 取 り 込み
SVG グ ラ フ ィ ッ ク フ ァ イ ルに着色 し てい ます :
// ソフトマスクの定義に使うテンプレートを作成
tpl = p.begin_template_ext(595, 842, "transparencygroup={colorspace=devicecmyk}");
// 任意の内容を配置。例:SVGグラフィック
p.fit_graphics(graphics, 0, 0, "boxsize={595 842} position={center} fitmethod=meet");

p.end_template_ext(0, 0);

// このテンプレートをベースにした、反転したソフトマスクを用いたgstateを作成
// 「invert」オプションで黒を透過させています。すなわち暗い領域と明るい領域を維持
gstate_softmask = p.create_gstate(
"softmask={type=luminosity template=" + tpl + " backdropcolor=transparent }");

4.9 オブ ジ ェ ク ト の色を変更 105


// ソフトマスクを用いたgstateを有効にしたうえで、色を適用
// 結果: SVGグラフィックが赤く着色されます
p.save();
p.set_graphics_option("fillcolor=red gstate" + gstate_softmask);
p.rect(0, 0, 595, 842);
p.fill();
p.restore();

複数の ソ フ ト マ ス ク PDF は、1 つの合成操作について 1 つま での ソ フ ト マ ス ク にのみ対


応 し てい ます。 た と えば、 画像が自分のアルフ ァ チ ャ ン ネル (= ソ フ ト マ ス ク ) を持っ て
い る 場合には、グ ラ フ ィ ッ ク ス テー ト で与え ら れた ソ フ ト マ ス ク は何の効力 も 及ぼ し ませ
ん。 こ の PDF の制約を回避す る には、 テ ンプ レー ト 内に内容を生成 し て、 こ のテ ンプ レー
ト をページ上に配置す る 必要があ り ます。 こ れに よ っ て事実上、 PDF ビ ュ ーアーに強制的
に別々の合成操作を適用 さ せ、 ソ フ ト マ ス ク が使用可能にな り ます。

106 第 4 章 : 色 と 透過
4.10 オーバープ リ ン ト 制御
ク ッ ク ブ ッ ク コ ー ド サン プルがク ッ ク ブ ッ ク の color/overprint ト ピ ッ ク にあ り ます。

デフ ォ ル ト では、 あ る 特定のカ ラ ーチ ャ ン ネルに描画を行 う と 、 他のカ ラ ーチ ャ ン ネル群


の対応す る 領域は置き 換わ り ます。 た と えば、 CMYK デバ イ ス上の色 0/0/1/0、 すなわち
イ エ ロ ーは、そのページ上の同 じ 場所にそれま でに描画 さ れていたオブジ ェ ク ト 群の既存
のシ ア ン ・ マゼン タ ・ 黒チ ャ ン ネルを消去 し ます。 こ の動作を変え る にはオーバープ リ ン
ト と い う 処理を用い ます。 こ の処理は、 印刷デバ イ ス上におけ る 色 イ ン キの混合を制御 し
ます。 オーバープ リ ン ト を利用 し て、 黒を他の暗い色の上に重ねて印刷す る こ と に よ り 、
「 リ ッ チブ ラ ッ ク 」 にす る こ と も で き ます。
PDF のオーバープ リ ン ト フ ラ グは CMYK 印刷を対象 と し てい ます。 こ の フ ラ グは、 あ
る 特定のチ ャ ン ネルへの描画が他のチ ャ ン ネル群の既存の内容に影響す る か ど う か を制
御 し ます。 た と えば、 シ ア ン を イ エ ロ ーの上に重ねて印刷す る と 、 その結果は、 オーバー
プ リ ン ト あ り であれば緑にな り ます (シ ア ン と イ エ ロ ーが混合 さ れ る ) 。 逆にオーバープ
リ ン ト な し で同 じ こ と をす る と 、 その結果は、 最後に印刷 し た色で あ る シ ア ン と な り ま
す。 なぜな ら 、 純粋な シ ア ンには イ エ ロ ーの成分が一切ないので、 0% イ エ ロ ーが既存の
イ エ ロ ーの内容を置 き 換え る か ら です。

塗 り ・ 描線操作に対す る オーバープ リ ン ト 設定 オーバープ リ ン ト 動作は、 描線操作 と


それ以外の操作 と で別々に制御で き ま す。 そ の た めには グ ラ フ ィ ッ ク 書式オ プ シ ョ ン
overprintstroke (描線操作に対 し て) ま たは overprintfill (描線以外のすべての操作に対 し
て。 画像の配置に対 し て も ) を用い ます。 ど ち ら のオプシ ョ ン も デフ ォ ル ト は false です :
> overprintfill=false か overprintstroke=false の場合には、 塗 り ま たは描線は、 ど のカ ラ ー
チ ャ ン ネルにおいて も 、 指定 さ れていない イ ン キの、 対応す る 領域を置 き 換え ま す :
前面の色が勝ち ます。
> こ れ ら のオプシ ョ ンがtrueの場合、かつ出力デバ イ ス がオーバープ リ ン ト に対応 し てい
る 場合には、 指定 さ れていない イ ン キにおけ る それ ま でのマーキ ン グ群に対 し て、 変
更は行われません。 オーバープ リ ン ト は通常、 かな り 暗い色に対 し て使用 さ れます。

CMYK カ ラ ーに対す る オーバープ リ ン ト モー ド CMYK オブジ ェ ク ト のオーバープ リ ン


ト 動作は、 さ ら に、 overprintmode グ ラ フ ィ ッ ク 書式オプシ ョ ン を用いて変更す る こ と も
で き ます。 こ のオプシ ョ ンは、 overprintfill/overprintstroke=true の場合のゼ ロ CMYK 成分
の動作を制御 し ます :
> overprintmode=0 (デフ ォ ル ト ) : それぞれの色成分が、 それ ま でに配置 さ れたマー ク
群を置 き 換え ます (「前面の色が勝つ」)。 言い換えれば、 前面のオブジ ェ ク ト の色のす
べてのチ ャ ン ネルが、 下に重な っ てい る オブジ ェ ク ト 群を ヌ キに し ます。
> overprintmode=1 (「Illustrator のオーバープ リ ン ト モー ド 」 と 呼ばれ る こ と も あ り ます):
濃度値 0 は、 それま でに描画 さ れた色の、 対応す る 成分を、 0 に設定す る のではな く 、
変更 し ません (「前面の濃度値 0 は無視 さ れ る 」)。 言い換えれば、 0 以外の値を持っ た
前面チ ャ ン ネルのみが、 下に重な っ てい る オブ ジ ェ ク ト 群を ヌ キ に し ま す。 こ れは、
DeviceN 色空間において、 0 でない値を持っ た CMYK 成分のみで描画す る の と 同 じ こ
と です。

つま り 、CMYK 濃度値がわずか違 う だけで (た と えば 0% か 1% か)、オーバープ リ ン ト モー


ド に よ っ て結果に大き な違いが生 じ る 場合があ り ます: オーバープ リ ン ト モー ド 0 の場合
にはその結果はそれぞれ 0% と 1% にな り ます。 オーバープ リ ン ト モー ド 1 の場合には、 そ
の結果はそれぞれ背景色 (それが何であれ) か 1% にな り ます。 オーバープ リ ン ト モー ド
は、 その定義に よ り 、 CMYK 以外の色空間においては何 も 影響を与え ません。

4.10 オーバープ リ ン ト 制御 107


オ ーバー プ リ ン ト に よ っ て 影響 を 受 け る の は DeviceCMYK 色空間 の色 だ け で す。
DeviceN 色空間で Cyan ・ Magenta ・ Yellow ・ Black 成分のいずれかが使われていて も 、 こ の
CMYK オーバープ リ ン ト 規則は適用 さ れません。

デバ イ ス依存な オーバープ リ ン ト 表現 PDF ビ ュ ーアーは、 出力デバ イ ス がオーバープ


リ ン ト に対応 し ていない場合には、オーバープ リ ン ト 設定を無視 し なければな ら ない こ と
にな っ てい ますので、オーバープ リ ン ト オブジ ェ ク ト を持っ た文書は本質的にポー タ ブル
ではな く 、 意図 し たページ表現を実現す る には、 PDF ビ ュ ーアーや RIP を特別に構成する
必要が生 じ る 場合があ り ます。 Acrobat が画面表示においてオーバープ リ ン ト 設定に従 う
か ど う かは、 「編集」 → 「環境設定」 → 「ページ表示」 → 「オーバープ リ ン ト プ レ ビ ュ ー
を使用」 を通 じ て構成可能です。 オーバープ リ ン ト 設定を使っ て作業 し てい る と き には、
こ の環境設定を 「常時」 に設定す る こ と に よ っ て正 し い画面表示が得 ら れ る よ う にする こ
と を推奨 し ます。 さ ら に、 Acrobat の 「出力プ レ ビ ュ ー」 パネルには項目 「オーバープ リ
ン ト を シ ミ ュ レー ト 」 が設け ら れてい ます。
ページ上で透過かブ レ ン ド モー ド が使用 さ れてい る 場合には、Acrobat のオーバープ リ
ン ト プ レ ビ ュ ーは、カ レ ン ト のブ レ ン ド 色空間が DeviceCMYK 色空間を使用する よ う 設定
さ れてい る 場合のみ、 期待どお り 動作 し ます。 その よ う に設定する には PDF_begin_page_
ext( ) で以下のオプシ ョ ン を用い ます :
transparencygroup={colorspace=devicecmyk}

オーバープ リ ン ト プ レ ビ ュ ー対応のないサー ド パーテ ィ ー PDF ビ ュ ーアーは、 期待 と 違


う 色を表示す る 場合があ り ます。 実際、 シ ンプルな PDF ビ ュ ーアーの多 く はオーバープ
リ ン ト に対応 し てい ません。

デバ イ ス独立な オーバープ リ ン ト 効果 上述の ビ ュ ーアー依存性に よ り 、 オーバープ リ


ン ト の表現は も ろ く な る 場合があ り ます。オーバープ リ ン ト 効果をデバ イ ス独立な方式で
実現す る こ と も で き ます。 そのためにはブ レ ン ド モー ド Darken を以下の よ う に使用 し ま
す:
gstate = p.create_gstate("blendmode=darken");
p.set_gstate(gstate);

オーバープ リ ン ト シ ミ ュ レーシ ョ ンが有用 と な る 状況 と し ては、 一つには、 色分版の再合


成が挙げ ら れます。 画像やページのシ ア ン ・ マゼン タ ・ イ エ ロ ー ・ 黒分版を持っ てい る と
し て、 こ れ ら を 1 個の コ ン ポジ ッ ト な PDF ページへ再合成す る 必要があ る 場合に、Darken
ブ レ ン ド モー ド を用い ます。

ク ッ ク ブ ッ ク CMYK 分版を再合成 し ている コ ー ド サン プルが、 ク ッ ク ブ ッ クの color/recombine_color_


channels ト ピ ッ ク にあ り ます。

108 第 4 章 : 色 と 透過
5 Unicode と レ ガシエ ン コ ーデ ィ ング
こ の章では、 Unicode やその他のエン コ ーデ ィ ン グ方式に関す る 基礎的な情報を提供 し ま
す。 PDFlib におけ る テ キ ス ト 処理は Unicode 規格に大 き く 依存 し てい ますが、 さ ま ざ ま な
レ ガシエン コ ーデ ィ ン グに も 対応 し てい ます。

5.1 Unicode の重要な諸概念


キ ャ ラ ク タ ー と グ リ フ テ キ ス ト を扱 う 際には、 以下の概念を は っ き り 区別す る こ と が
大切です :
> キ ャ ラ ク タ ーは、 言語の中で情報を伝達す る 最小の単位です。 代表的な例は ラ テ ン ア
ルフ ァ ベ ッ ト の文字、 中国語の表意文字、 日本語の音節文字です。 キ ャ ラ ク タ ーは意
味を持ち ます : すなわち キ ャ ラ ク タ ーは意味実体です。
> グ リ フは、 さ ま ざ ま な視覚表現で、 1 個ない し 複数のキ ャ ラ ク タ ーを表 し ます。 グ リ フ
は外見を持ち ます : すなわち グ リ フは表現実体です。

キ ャ ラ ク タ ー と グ リ フ の間に一対一の対応は存在 し ません。た と えば合字は 1 つのグ リ フ


ですが、 2 つ以上のキ ャ ラ ク タ ーを表現 し ます。 か と 思えば、 1 つのグ リ フ が場面に よ っ
て別々のキ ャ ラ ク タ ーを表す こ と も あ り ま す (キ ャ ラ ク タ ーには同 じ 形の も のが あ り ま
す。 図 5.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) は私用のためにすっ か り 予約 さ れて
い ます。

図 5.1
グリ フ とキャ ラ ク
タ ーの関係

5.1 Unicode の重要な諸概念 109


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 ビ ッ ト 値で表 さ れます。

Unicode のエ ン コ ーデ ィ ン グ体系 と バ イ ト 順序マー ク (BOM) コ ン ピ ュ ー タ ー ア ー キ


テ ク チ ャ ーは種類に よ っ て、 バ イ ト の並べ方が違い ます。 すなわちバ イ ト が よ り 大き な値
(16 ビ ッ ト や 32 ビ ッ ト ) を構成す る と き 、 最上位バ イ ト を最初に格納する 方式 (ビ ッ グ
エンデ ィ ア ン) と 、 最下位バ イ ト を最初に格納す る 方式 ( リ ト ルエンデ ィ ア ン) があ り ま
す。 ビ ッ グエンデ ィ ア ン アーキ テ ク チ ャ ーの代表例は PowerPC であ り 、一方 x86/x64 アー
キ テ ク チ ャ ーは リ ト ルエンデ ィ ア ンです。UTF-8 と UTF-16 はシ ン グルバ イ ト よ り 大 き な
値を用いてい ますので、 やは り バ イ ト の並べ方を論 じ る 必要が出て き ます。 エン コ ーデ ィ
ン グ体系は (上述のエン コ ーデ ィ ン グ形式 と は違 う ので注意) 、 エン コ ーデ ィ ン グ形式に
加え てバ イ ト 順序を指定 し ます。 た と えば UTF-16BE は、 UTF-16 でバ イ ト 順序はビ ッ グ
エンデ ィ ア ン と い う 意味です。 バ イ ト 順序があ ら か じ めわか ら ない と き は、 それを指定す
る 手段 と し て コ ー ド 点 U+FEFF があ り ます。 こ れをバ イ ト 順序マー ク (BOM) と いい ま
す。 BOM は UTF-8 では不要ですが、 存在 し ていて も よ く 、 それを利用 し てバ イ ト ス ト
リ ーム を UTF-8 と 同定する こ と も で き ます。 さ ま ざ ま なエン コ ーデ ィ ン グ形式に対する
BOM の表 し 方を表 5.1 に示 し ます。

表 5.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 バイ ト を意味 し ます。

110 第 5 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング
5.2 Unicode 対応言語バ イ ン デ ィ ン グ
PDFlib API の機能のなかには、 使用す る 言語バ イ ンデ ィ ン グが Unicode 対応か ど う かに
よ っ て変化す る も のがあ り ます。 こ の概念を こ の節 と 次の節で解説 し ます。

5.2.1 ネ イ テ ィ ブ Unicode 文字列のあ る言語バ イ ン デ ィ ン グ


プ ロ グ ラ ミ ン グ言語が Unicode 文字列を ネ イ テ ィ ブに用いてい る 場合に、 そのバ イ ンデ ィ
ン グ を Unicode 対応 と 呼ぶ こ と に し ます。以下の PDFlib 言語バ イ ンデ ィ ン グは Unicode 対
応です :
> C++
> .NET
> Java
> Objective-C
> Python
> RPG

こ う し た環境での文字列処理は単純です : 文字列はすべて、 ネ イ テ ィ ブな UTF-16 形式の


Unicode 文字列 と し て PDFlib カーネルに与え ら れます。 こ う し た言語の ラ ッ パーは、 ク ラ
イ ア ン ト か ら 与え ら れ る Unicode 文字列を正 し く 取 り 扱 う こ と がで き 、 ま た、 い く つかの
PDFlib のオプシ ョ ン を自動的に設定 し ます。 その際には以下の結果が生 じ ます :
> ク ラ イ ア ン ト が与え る 文字列はすべて、Unicode エン コ ーデ ィ ン グかつ UTF-16 形式で
PDFlib に も た ら さ れます。
> API 解説内のいろいろ な文字列種別 (内容文字列 ・ ハ イ パーテ キ ス ト 文字列 ・ 名前文字
列) ど う し の違い は意味 を 持 ち ま せ ん。 オ プ シ ョ ン textformat ・ hypertextformat ・
hypertextencoding は不必要であ り 、 かつ許 さ れません。 テ キ ス ト フ ロ ーオプシ ョ ンは
強制的に true にな り ます。
> ページの内容には unicode エン コーデ ィ ン グ を用い る こ と が、 エン コーデ ィ ン グ を
Unicode 対応言語で取 り 扱 う う えで も っ と も 簡単な方法です。ただ し 8 ビ ッ ト エン コ ー
デ ィ ン グや、 記号フ ォ ン ト のシ ン グルバ イ ト テ キ ス ト も 、 使いた ければ使 う こ と がで
き ます。

要す る に基本的には、 ク ラ イ ア ン ト はネ イ テ ィ ブ Unicode 文字列を PDFlib API メ ソ ッ ド に


与え る こ と がで き 、 その際に別途構成は必要ない と い う こ と です。

5.2.2 UTF-8 対応のあ る言語バ イ ン デ ィ ン グ


ネ イ テ ィ ブに Unicode 文字列デー タ 型を持た ないプ ロ グ ラ ミ ン グ言語であ っ て も UTF-8形
式の Unicode 文字列を扱 う こ と はで き ます。 API の文字列、 すなわち名前文字列 ・ 内容文
字列 ・ ハ イ パーテ キ ス ト 文字列 ・ オプシ ョ ン リ ス ト はすべて、 BOM 付 き か BOM な し の
UTF-8 形式を受け付け ます。
Unicode 以外のエン コ ーデ ィ ン グの文字列を扱 う 必要があ る 場合には、 それを PDFlib
へ渡す前に UTF-8 の Unicode へ変換す る 必要があ り ます。こ れは PDF_convert_to_unicode( )
か言語独自の メ ソ ッ ド で実現で き ます。

5.2.3 デ フ ォ ル ト UTF-8 対応のあ る言語バ イ ン デ ィ ン グ


以下の PDFlib 言語バ イ ンデ ィ ン グはデフ ォ ル ト で UTF-8 を通 じ て Unicode 対応です :
> C

5.2 Unicode 対応言語バイ ンデ ィ ング 111


> Perl
> PHP
> Ruby

C バ イ ン デ ィ ン グのオ プ シ ョ ナルな UTF-8 対応 デフ ォ ル ト では PDFlib の C 言語バ イ ン


デ ィ ン グは Unicode 対応ではあ り ませんが (後述)、 UTF-8 文字列 と と も に使用する よ う
構成す る こ と は可能です :
PDF_set_option(p, "stringformat=utf8");

BOM 付き の UTF-8 形式は C のユーザーに利点があ り ます。 それは PDFlib は自動的にそ


の よ う な 文 字 列 を BOM を 通 じ て 認 識 す る か ら で す。 こ れ に よ っ て、 フ ォ ン ト を
encoding=unicode で読み込んだ り 、ハ イ パーテ キ ス ト 文字列を hypertextencoding=unicode
で、 名前文字列を usehypertextencoding=true で扱っ た り す る こ と が可能にな り ますので、
完全な Unicode ワ ー ク フ ロ ーが実現 さ れます。
ただ し C イ ン タ ーフ ェ イ スは、関数の引数 と し て受け渡 さ れた文字列について、length
引数に 0 よ り 大 き な値が与え ら れた場合には、 UTF-16 と し て解釈 し ます。

112 第 5 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング
5.3 非 Unicode 対応言語バ イ ン デ ィ ン グ
5.3.1 ネ イ テ ィ ブ な Unicode 文字列のない言語バ イ ン デ ィ ン グ
レ ガ シー文字列対応のあ る言語バ イ ン デ ィ ン グ 以下の PDFlib の言語バ イ ンデ ィ ン グは
デフ ォ ル ト で UTF-8 を使用 し ますが (上述)、 stringformat=legacy を設定す る こ と に よ っ
て、 レ ガシーな 8 ビ ッ ト エン コ ーデ ィ ン グの文字列 と と も に使用す る よ う 構成す る こ と も
可能です :
> Perl
> PHP
> Ruby

レ ガシーな 8 ビ ッ ト エン コ ーデ ィ ン グの文字列を こ れ ら の言語バ イ ンデ ィ ン グで使用す る


には、 文字列の形式の以下の と お り 設定す る 必要があ り ます :
p.set_option("stringformat=legacy");

C バ イ ン デ ィ ン グの レ ガ シーな文字列へのデ フ ォ ル ト 対応 C バ イ ンデ ィ ン グは、デフ ォ
ル ト 設定 stringformat=legacy を通 じ て 8 ビ ッ ト エン コ ーデ ィ ン グの文字列 と と も に動作
し ます。
ただ し C イ ン タ ーフ ェ イ ス は、関数の引数 と し て受け渡 さ れた文字列について、length
引数に 0 よ り 大 き な値が与え ら れた場合には、 UTF-16 と し て解釈 し ます。

5.3.2 Unicode 処理 と 各種文字列


Unicode 文字列は非 Unicode 対応言語で も 使用で き ますが、 文字列の処理は、 複雑にな
る と と も に、 その文字列を ど う 使 う つ も り かに よ っ て異な っ て き ます。 PDFlib API は、 内
容文字列 ・ ハイパーテキス ト 文字列 ・ 名前文字列 ( こ れ ら の呼称は歴史的な誤称です) と
い う 文字列種別を使用 し ます。 引数 と オプシ ョ ンは、 PDFlib API リ フ ァ レ ン ス内で、 こ れ
ら の種別のいずれか一つ と し て示 さ れてい ま す。 こ れ ら の文字列種別の取 り 扱い を、 表
5.2 に ま と め る と と も に、 以下に詳 し く 解説 し ます。

表 5.2 さ ま ざ ま な文字列種別に対する文字列処理の概要
文字列種別 サン プル引数 ・ オプ シ ョ ン 関連オプ シ ョ ン / 解釈

内容文字列 PDF_fit_textline( ) ・ PDF_add_textflow( ) の text 引数。 textformat


encoding

ハイパーテキス > PDF_add_table_cell( ) の fieldname オプ シ ョ ン hypertextformat


ト 文字列 > PDF_define_layer( ) の name オプ シ ョ ン hypertextencoding
> PDF_create_action( ) の destname オプ シ ョ ン
> PDF_create_bookmark( ) の text 引数
名前文字列 > PDF_begin_document( ) ・ PDF_create_pvf( ) の filename usehypertextencoding,
引数 filenamehandling
> PDF_load_font( ) の fontname 引数
> PDF_load_iccprofile( ) の profilename 引数
オプ シ ョ ン リ ス BOM 付き : UTF-8
ト 内の文字列 BOM な し : 文字列種別に よ る

5.3 非 Unicode 対応言語バイ ンデ ィ ング 113


内容文字列 内容文字列は、 特定の フ ォ ン ト に対 し て選んだエ ン コ ーデ ィ ン グ に従っ て
ページ内容を作成す る ために用い ら れます。 PDFlib API リ フ ァ レ ン ス の中で、 ページ内容
関数におけ る text と い う 名前の メ ソ ッ ド 引数はすべて こ の種類に属 し ます。 内容文字列
は特定フ ォ ン ト 内のグ リ フ に よ っ て表現 さ れますので、使用可能な キ ャ ラ ク タ ーの範囲は
フ ォ ン ト / エン コ ーデ ィ ン グの組み合わせに依存 し ます。
内容文字列の解釈は、 textformat オプシ ョ ン (後述) と 、 選択 し たエ ン コ ーデ ィ ン グ
に よ っ て制御 さ れます。 textformat=auto な ら ば ( こ れがデフ ォ ル ト )、 unicode ・ glyphid
エン コ ーデ ィ ン グに対 し てはutf16形式が用い ら れます。それ以外のすべてのエン コ ーデ ィ
ン グに対 し ては形式は bytes です。
C 言語バ イ ンデ ィ ン グでは、 UTF-16 文字列の長 さ を別途 length 引数で与え る 必要が
あ り ます。

ハ イ パーテキス ト 文字列 ハ イ パーテ キ ス ト 文字列は、 し お り や注釈な ど の イ ン タ ラ ク


テ ィ ブ機能のために用い ら れ る も のであ り 、 PDFlib API リ フ ァ レ ン ス では 「ハイパーテキ
ス ト 文字列」 と し て示 し てい ます。 イ ン タ ラ ク テ ィ ブ機能のための関数の多 く の引数やオ
プシ ョ ンが こ の種類に属 し ます。
ハ イ パーテ キ ス ト 文字列の解釈は hypertextformat ・ hypertextencoding オプシ ョ ン (後
に詳述) に よ っ て制御 さ れ ま す。 hypertextformat=auto な ら ば ( こ れがデ フ ォ ル ト ) 、
hypertextencoding=unicode の場合には utf16 形式が用い ら れ、 それ以外の場合には bytes
が用い ら れます。
C 言語では、 UTF-16 文字列の長 さ を別途 length 引数で与え る 必要があ り ます。

名前文字列 名前文字列は、 外部フ ァ イ ル名 ・ フ ォ ン ト 名 ・ ブ ロ ッ ク 名な ど のために用い


ら れ る も のであ り 、 PDFlib API リ フ ァ レ ン ス では 「名前文字列」 と し て示 し てい ます。 こ
れはハ イ パーテ キ ス ト 文字列 と わずかに違い ます。
フ ァ イ ル名は特殊な場合です : オプシ ョ ン filenamehandling は、 API に与え ら れた フ ァ イ
ル名を ロ ーカルフ ァ イ ルシ ス テ ムで使用で き る 文字列へど の よ う に PDFlib が変換する か
を指定 し ます。
デフ ォ ル ト では名前文字列は host エン コ ーデ ィ ン グで解釈 さ れます。 し か し 、 名前の
先頭に UTF-8 BOM があ る と き は、 それは UTF-8 と し て (先頭に EBCDIC UTF-8 BOM が
あ る と き は EBCDIC UTF-8 と し て) 解釈 さ れ ま す。 usehypertextencoding=true な ら 、
hypertextencoding で指定 さ れたエ ン コ ーデ ィ ン グが名前文字列に も 適用 さ れ ます。 こ れ
は た と え ば、 フ ォ ン ト や フ ァ イ ル の 名 前 を Shift-JIS で 指定す る の に 使 え ま す。
hypertextencoding=unicode の場合は、 PDFlib は UTF-16 文字列を前提 し ますので、 2 個の
null バ イ ト で終了す る 必要があ り ます。
C では、 UTF-8 文字列に対 し ては length 引数は 0 でなければな り ません。 0 以外な ら
文字列は UTF-16 と し て解釈 さ れます。 それ以外の非 Unicode 対応の言語バ イ ンデ ィ ン グ
では名前文字列はかな ら ず UTF-8 形式で与え る 必要があ り ます。

内容文字列 と ハ イ パーテキス ト 文字列に対す る テキス ト 形式 Unicode 文字列は、 UTF-


8 ま たは UTF-16 形式で、 任意のバ イ ト 順序で与え る こ と がで き ま す。 形式の選択は、
textformat オプシ ョ ンでページ記述のテ キ ス ト に対 し て、 hypertextformat オプシ ョ ンで
イ ン タ ラ ク テ ィ ブ要素群に対 し て制御す る こ と がで き ます。 こ れ ら のオプシ ョ ンで対応 し
てい る 値を表 5.3 に示 し ます。[hyper]textformat オプシ ョ ンのデフ ォ ル ト は auto です。名
前文字列群に対 し て同 じ 動作を強制す る には usehypertextencoding オプシ ョ ン を用い ま
す。 hypertextencoding オプシ ョ ンのデフ ォ ル ト は auto です。

114 第 5 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング
表 5.3 textformat ・ hypertextformat オプ シ ョ ンに対する値

[hyper]textformat 説明
bytes 文字列の 1 バイ ト が 1 キ ャ ラ ク タ ーに対応 し ます。 こ れは 8 ビ ッ ト エ ン コ ーデ ィ ング と 記
号フ ォ ン ト で有用です。 文字列の先頭に UTF-8 BOM があ る と きは、 評価 さ れたのち除去 さ
れます。
utf8 文字列は UTF-8 形式である と 期待 さ れます。 不正な UTF-8 列があ っ た と きは、
glyphcheck=error な ら例外が発生 し 、 そ う でなければ削除 さ れます。

ebcdicutf8 文字列は、 EBCDIC コ ー ド さ れた UTF-8 形式である と 期待 さ れます (IBM System i ・ IBM Z


のみ)。
utf16 文字列は UTF-16 形式であ る と 期待 さ れます。 文字列の先頭に Unicode バイ ト 順序マー ク
(BOM) があ る と きは、 評価 さ れたのち除去 さ れます。 BOM がない と きは、 その文字列は
マ シ ンのネ イ テ ィ ブ なバイ ト 順序であ る と 期待 さ れます (た と えば Intel x86/x64 では リ ト
ルエ ンデ ィ ア ン)。
utf16be 文字列は UTF-16 形式で、 バイ ト 順序はビ ッ グエ ンデ ィ ア ン であ る と 期待 さ れます。 バイ
ト 順序マー ク について特別な扱いはあ り ません。
utf16le 文字列は UTF-16 形式で、 バイ ト 順序は リ ト ルエ ンデ ィ ア ン であ る と 期待 さ れます。 バイ
ト 順序マー ク について特別な扱いはあ り ません。
auto 内容文字列 : 8 ビ ッ ト エ ン コ ーデ ィ ングに対 し ては bytes と 等価で、 unicode ・ glyphid エ
ン コ ーデ ィ ングに対 し ては utf16 と 等価です。
ハイパーテキス ト 文字列 : BOM 付きの UTF-8 ・ UTF-16 文字列は検知 さ れます (C では
UTF-16 文字列はダ ブル null で終了する必要があ り ます)。 文字列の先頭に BOM がない と き
は、 8 ビ ッ ト エ ン コ ーデ ィ ングの文字列 と し て、hypertextencoding オプ シ ョ ンに従っ て解
釈 さ れます。
こ の設定に し ておけば、 Unicode を ネ イ テ ィ ブに用いないたいていの環境で、 適切な テキス
ト 解釈がで き る よ う にな り ます。

textformat の設定は あ ら ゆ る エ ン コ ーデ ィ ン グ に対 し て 効果が あ り ま すが、 と り わ け


unicode エン コ ーデ ィ ン グに対 し て有用です。 エン コ ーデ ィ ン グ と textformat の さ ま ざ ま
な組み合わせに対す る テ キ ス ト 文字列の解釈を表 5.4 で説明 し ます。 内容文字列内の コ ー
ド ま たは Unicode 値が、 選ばれた フ ォ ン ト 内の適切な グ リ フ で表現で き ない場合について
は、オプシ ョ ン glyphcheck が PDFlib の動作を制御 し ます(183 ページ 「グ リ フ置換」参照)。

表 5.4 エ ン コ ーデ ィ ング と テキス ト 形式の関係


[hypertext]encoding textformat=bytes textformat=utf8 ・ utf16 ・ utf16be ・ utf16le

すべての文字列種別 :
auto 117 ページ 「自動エ ン コ ーデ ィ ング」 の項を参照
unicode 8 ビ ッ ト コ ー ド は U+0000 ~ 選ばれた テキス ト 形式に従っ て エ ン コ ー ド さ れた任意
U+00FF の Unicode 値 の Unicode 値 1

内容文字列のみ :

8 ビ ッ ト エン コー 8 ビ ッ ト コー ド 選ばれたエ ン コ ーデ ィ ン グに従 っ て Unicode 値を 8


デ ィ ング ビ ッ ト コ ー ド に変換 し ます1。
glyphid 8 ビ ッ ト コ ー ド は 0 ~ 255 のグ リ Unicode 値はグ リ フ ID と し て解釈 さ れます2。
フ ID

1. その Unicode キ ャ ラ ク タ ーが フ ォ ン ト 内で得 ら れない と きは、 PDFlib は glyphcheck オ プ シ ョ ン に従 っ て、 例外を発生 さ せ


るか、 ま たはそれを置き換え ます。

5.3 非 Unicode 対応言語バイ ンデ ィ ング 115


2. そのグ リ フ ID が フ ォ ン ト 内で見つか ら ない と きは、 PDFlib は glyphcheck 設定に従 っ て、 例外を発生 さ せるか、 ま たはそれ
を グ リ フ ID 0 に置き換え ます。

オ プ シ ョ ン リ ス ト オプシ ョ ン リ ス ト 内の文字列については、特別な注意が必要です。 な
ぜな ら 非 Unicode 対応の言語バ イ ンデ ィ ン グでは、 それは UTF-16 形式の Unicode 文字列
と し て 表現 で き ず、 バ イ ト 文字列 と し て し か表現で き な い か ら です。 こ の理由か ら 、
Unicode のオプシ ョ ンに対 し ては UTF-8 が用い ら れます。 PDFlib はオプシ ョ ンの先頭の
BOM を見 る こ と で、 それを ど う 解釈す る か を決定 し ます。 BOM を用いて文字列の形式が
決定 さ れ、 そ し て文字列の種類 (内容文字列 ・ ハ イ パーテ キ ス ト 文字列 ・ 名前文字列) を
用いてエン コ ーデ ィ ン グが決定 さ れます。 具体的には、 文字列オプシ ョ ンの解釈は以下の
よ う に動作 し ます :
> オプシ ョ ンの先頭に UTF-8 BOM (0xEF 0xBB 0xBF) があ る な ら 、 それは UTF-8 と し て
解釈 さ れます。 EBCDIC ベース のシ ス テ ムの場合 : オプシ ョ ンの先頭に EBCDIC UTF-
8 BOM (0x57 0x8B 0xAB) があ る な ら 、 それは EBCDIC UTF-8 と し て解釈 さ れます。
> BOM が見つか ら ない と き は、 文字列の解釈は文字列の種類に依存 し ます :
> 内容文字列は、適用可能な encoding オプシ ョ ンか、その対応する フ ォ ン ト のエン コ ー
デ ィ ン グ (ど ち ら か存在す る ほ う ) に従っ て解釈 さ れます。
> ハ イ パーテ キ ス ト 文字列は、 hypertextencoding オプシ ョ ンに従っ て解釈 さ れます。
> 名前文字列は、 usehypertextencoding=true な ら hypertext の設定に従っ て、 そ う でな
ければ auto エン コーデ ィ ン グで解釈 さ れます。
キ ャ ラ ク タ ー{ } はオプシ ョ ン リ ス ト 内の文字列内では特別な扱い を要 し 、文字列オプシ ョ
ン内で用い る と き はキ ャ ラ ク タ ー \ を前につけ る 必要があ り ます。

5.3.3 シ ン グルバ イ ト (8 ビ ッ ト ) エ ン コ ーデ ィ ン グ
8 ビ ッ ト エン コ ーデ ィ ン グは、 バ イ ト 値を それぞれ、 BMP 内の Unicode 値を持つ 1 つの
キ ャ ラ ク タ ーへマ ッ プ し ます。 そ こ でキ ャ ラ ク タ ーは 255 種類ま でです。 なぜな ら コ ー ド
0 (ゼ ロ ) は .notdef キ ャ ラ ク タ ーのために予約 さ れてい る か ら です。 PDFlib は、 以下のエ
ン コ ーデ ィ ン グ を内蔵 し てい ます :
winansi (cp1252と等しい。iso8859-1のスーパーセット),
cp1252
iso8859-1
macroman (オリジナルのMacintoshの文字集合),
ebcdic (EBCDICコードページ1047),
ebcdic_37 (EBCDICコードページ037),
pdfdoc (PDFDocEncoding)

以下のエン コ ーデ ィ ン グは PDFlib パ ッ ケージ内で別フ ァ イ ル と し て利用可能です :


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,
cp1250, cp1251, cp1253, cp1254, cp1255, cp1256, cp1257, cp1258

こ れ ら のエン コ ーデ ィ ン グのための リ ソ ース フ ァ イ ルへのア ク セ ス については、それがシ


ス テ ムの コ ー ド ページ と し て利用可能でない限 り は、以下の よ う に構成する 必要があ り ま
す (59 ページ 「3.1.4 リ ソ ース構成 と フ ァ イ ル検索」 を参照)
p.set_option("SearchPath={{/usr/pdflib/resource/codepage}}");
p.set_option("Encoding={iso8859-5=iso8859-5.cpg}");

116 第 5 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング
ホ ス ト エ ン コ ーデ ィ ン グ 特殊なエン コ ーデ ィ ン グ host は固定 し た意味を持たず、 環境
のプ ラ ッ ト フ ォームに よ っ て、 以下の 8 ビ ッ ト エン コ ーデ ィ ン グへマ ッ プ さ れます :
> MVS か USS を持つ IBM System Z では ebcdic へマ ッ プ さ れます。
> IBM System i では ebcdic_37 へマ ッ プ さ れます。
> Windows では winansi へマ ッ プ さ れます。
> それ以外のすべてのシ ス テ ム では iso8859-1 へマ ッ プ さ れます。

ホ ス ト エン コ ーデ ィ ン グが有用なのは何 と いっ て も 、プ ラ ッ ト フ ォーム非依存のテ ス ト プ
ロ グ ラ ムや、 その他の単純なプ ロ グ ラ ム を書 く と き です。 製品版でのホ ス ト エン コ ーデ ィ
ン グ の使用は推奨 し ま せんので、 何 ら かの適切なエ ン コ ーデ ィ ン グに置 き 換え る べ き で
す。

自動エ ン コ ーデ ィ ン グ PDFlib は、 特定の環境に対 し て も っ と も 自然なエ ン コ ーデ ィ ン


グ を指定で き る し く みに対応 し てい ます。 エン コ ーデ ィ ン グ名 と し て キーワ ー ド auto を
与え る と 、 プ ラ ッ ト フ ォームや環境に よ っ て、 以下のテ キ ス ト フ ォ ン ト 用 8 ビ ッ ト エ ン
コ ーデ ィ ン グ を選択 し た こ と にな り ます :
> Windows の場合 : カ レ ン ト のシ ス テ ム コ ー ド ページ (詳 し く は後述)
> Unix ・ macOS の場合 : iso8859-1
> IBM System i の場合 : カ レ ン ト ジ ョ ブのエン コ ーデ ィ ン グ (IBMCCSID000000000000)
> IBM System Z の場合 : ebcdic (= コ ー ド ページ 1047)

記号フ ォ ン ト では、 キーワ ー ド auto は builtin エン コ ーデ ィ ン グへマ ッ プ さ れます (137


ページ 「6.3.2 記号フ ォ ン ト に対す る エン コ ーデ ィ ン グ を選ぶ」 参照)。 自動エン コ ーデ ィ
ン グは多 く の場面で便利ですが、 その半面、 こ の方式を用いた PDFlib ク ラ イ ア ン ト プ ロ
グ ラ ムは他の環境では使え な く な り ます。
auto エン コ ーデ ィ ン グは、 非 Unicode 対応の言語バ イ ンデ ィ ン グでは、 名前文字列の
デフ ォ ル ト エン コ ーデ ィ ン グ と し て用い ら れてい ます (113 ページ 「5.3 非 Unicode 対応
言語バ イ ンデ ィ ン グ」 参照)。

シ ス テム コ ー ド ページ を流用 PDFlib は、 コ ー ド ページ定義を シ ス テ ムか ら 取得す る こ


と がで き ます。 こ の機能を利用すれば、 コ ー ド ページの実装作業を し な く てすむので と て
も 便利です。 組み込みエン コ ーデ ィ ン グやユーザー定義エ ン コ ーデ ィ ン グの名前を PDF_
load_font( ) に与え る のではな く 、 ただ、 シ ス テ ムが知っ てい る エ ン コ ーデ ィ ン グ名を利
用すれば よ いのです。 こ の機能が利用で き る のはい く つかの限 ら れたプ ラ ッ ト フ ォーム上
だけであ り 、 そのエン コ ーデ ィ ン グ文字列の文法はプ ラ ッ ト フ ォーム依存です :
> Windows では、エン コ ーデ ィ ン グ名は cp< 番号 > です。こ こ で < 番号 > は、シ ス テ ムに イ ン
ス ト ール さ れてい る 任意のシ ン グルバ イ ト コ ー ド ページの番号です (マルチバ イ ト の
Windows コ ー ド ページについては 175 ページ 「7.6.1 TrueType ・ OpenType 日中韓フ ォ
ン ト を用い る 」 参照) :
font = p.load_font("Helvetica", "cp1250", "");

シ ン グルバ イ ト コ ー ド ページは内部の 8 ビ ッ ト エン コ ーデ ィ ン グに変換 さ れ る のに対


し 、 マルチバ イ ト コ ー ド ページは実行時に Unicode へマ ッ プ さ れます。 テ キ ス ト は、 選
んだ コ ー ド ページ と 互換の形式で与え る 必要があ り ます (た と えば cp932 に対 し ては
SJIS、 119 ページ 「日中韓フ ォ ン ト のための コ ー ド ページ」 参照)。
> Linux では、 iconv 機能が対応 し てい る すべての コ ー ド セ ッ ト 識別子を使え ます。
> IBM System i では、 任意の Coded Character Set Identifier (CCSID) が使え ます。 CCSID
は文字列 と し て与え る 必要があ り 、PDFlib は、与え ら れた コ ー ド ページ番号に IBMCCSID

5.3 非 Unicode 対応言語バイ ンデ ィ ング 117


と い う 接頭辞をつけ ます。 ま た PDFlib は、 コ ー ド ページ番号が 5 文字に満たない と き
には頭に 0 を補い ます。 コ ー ド ページ番号 と し て 0 (ゼ ロ ) を与え る と 、 カ レ ン ト ジ ョ
ブのエン コ ーデ ィ ン グが用い ら れ る こ と にな り ます :
font = p.load_font("Helvetica", "273", "");

> USS か MVS を持つ IBM System Z では、任意の Coded Character Set Identifier (CCSID) が
使え ます。CCSID は文字列 と し て与え る 必要があ り 、PDFlib は、与え ら れた コ ー ド ペー
ジ名に一切変更を加えずその ま ま シ ス テ ムに渡 し ます。
font = p.load_font("Helvetica", "IBM-273", "");

ユーザー定義の 8 ビ ッ ト エ ン コ ーデ ィ ン グ 定義済みエ ン コ ーデ ィ ン グ のほか、 PDFlib


はユーザー定義 8 ビ ッ ト エ ン コ ーデ ィ ン グ に も 対応 し てい ま す。 こ れを使いたいのは、
PDFlib 内で利用可能でない何かの文字集合を扱いたい と き です。PDFlib は、 グ リ フ名で定
義 さ れたエン コ ーデ ィ ン グ テーブルに対応 し てい る ほか、 Unicode 値で定義 さ れたテーブ
ルに も 対応 し てい ます。
ユーザー定義エン コ ーデ ィ ン グ を PDFlib プ ロ グ ラ ム内で利用で き る よ う にする には、
以下 の 作業 を あ ら か じ め 行 う 必要 が あ り ま す (あ る い は エ ン コ ーデ ィ ン グ は、 PDF_
encoding_set_char( )) を使っ て実行時に構築する こ と がで き ます) :
> エン コ ーデ ィ ン グの記述を単純なテ キ ス ト 形式で作成す る 。
> そのエン コ ーデ ィ ン グ を PDFlib リ ソ ース と し て (59 ページ 「3.1.4 リ ソ ース構成 と フ ァ
イ ル検索」 参照) 構成す る 。
> エ ン コ ーデ ィ ン グが使 う すべてのキ ャ ラ ク タ ーのためのグ リ フ を持っ てい る フ ォ ン ト
を与え る 。

エン コ ーデ ィ ン グ フ ァ イ ルは、 グ リ フ名 と コ ー ド を 1 行ずつ列挙 し た も のです。 エン コ ー


デ ィ ン グ定義の冒頭部分は以下の よ う にな り ます :
% PDFlib用エンコーディング定義。グリフ名を使用
% 名前 コード Unicode(オプション)
space 32 0x0020
exclam 33 0x0021
...

Unicode 値が指定 さ れていない と き は、 PDFlib はその内部テーブルの中で適切な Unicode


値を さ が し ます。 グ リ フ名でな く Unicode 値を指定する こ と も で き ます :
% PDFlib用コードページ定義。Unicode値を使用
% Unicode コード
0x0020 32
0x0021 33
...

エン コ ーデ ィ ン グか コ ー ド ページのフ ァ イ ルの中の Unicode 値はすべて U+FFFF よ り も 小


さ く なければな り ません。

5.3.4 日本語 ・ 中国語 ・ 韓国語 CMap (廃止済)


注 こ の節で解説 し ている レ ガシーエ ン コ ーデ ィ ングのための機能はすべて廃止済です。

注 以下の機能は、 CMap を用いて読み込んだ フ ォ ン ト に対 し ては利用で き ません : テキス ト


フ ロー・ グ リ フ 置換・ フ ォ ールバ ッ ク フ ォ ン ト ・ シ ェ ーピ ン グ ・OpenType レ イ アウ ト 機能。

118 第 5 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング
PDFlib は、 表 5.5 に挙げ る CMap を通 じ て日中韓レ ガシーエン コ ーデ ィ ン グに対応 し てい
ます。 レ ガシーエン コ ーデ ィ ン グは、 非 Unicode 対応の言語バ イ ンデ ィ ン グでのみ使用で
き ます。 すなわち C の場合か、 ま たは Perl ・ PHP ・ Ruby で stringformat=legacy の場合に
のみ使用で き ます。

表 5.5 日本語 ・ 中国語 ・ 韓国語テキス ト のための CMap


ロ ケール と 文字 コ CMap 名
レクシ ョ ン
日本語 UniGB-UTF16-H/V1, GB-EUC-H/V, GBpc-EUC-H/V, GBK-EUC-H/V, GBKp-EUC-H/V,
(Adobe-Japan1-7) GBK2K-H/V
中国語簡体字 UniCNS-UTF16-H/V1, B5pc-H/V, HKscs-B5-H/V, ETen-B5-H/V, ETenms-B5-H/V,
(Adobe-GB1-5) CNS-EUC-H/V
中国語繁体字 UniJIS-UTF16-H/V1, 83pv-RKSJ-H, 90ms-RKSJ-H/V, 90msp-RKSJ-H/V, 90pv-RKSJ-
(Adobe-CNS1-7) H, Add-RKSJ-H/V, EUC-H/V, Ext-RKSJ-H/V, H/V
韓国語 (PDF 2.0 では廃止済) UniKS-UTF16-H/V1, KSC-EUC-H/V, KSCms-UHC-H/V,
(Adobe-Korea1-2) KSCms-UHC-HW-H/V, KSCpc-EUC-H/V
韓国語 (PDF 2.0。 非サポー ト ) UniAKR-UTF16-H
(Adobe-KR-9)

1. PDF 1.5 以上が必要です。

CMap の リ ソ ース を構成 CMap を用いて日本語 ・ 中国語 ・ 韓国語 (日中韓) テ キ ス ト を


作成す る には、 PDFlib は、 その対応す る CMap フ ァ イ ルを必要 と し ます。 入っ て く る テ キ
ス ト を処理 し て、 日中韓エン コ ーデ ィ ン グ を Unicode へマ ッ プする ためです。 CMap フ ァ
イ ルは別パ ッ ケージで入手で き ます。 以下の よ う に イ ン ス ト ールする 必要があ り ます :
> Windows では CMap フ ァ イ ルは、 PDFlib の イ ン ス ト レーシ ョ ンデ ィ レ ク ト リ ー内の
resource/cmap デ ィ レ ク ト リ ーに置いておけば、 自動的に見つけ ら れます。
> それ以外のシ ス テ ム では CMap フ ァ イ ルは、任意の好都合なデ ィ レ ク ト リ ーの中に置 く
こ と がで き 、 実行時に SearchPath を設定す る こ と で、 CMap フ ァ イ ルを手動で構成す
る 必要があ り ます :
p.set_option("SearchPath={{/パス/パス/resource/cmap}}");

日中韓 CMap フ ァ イ ルの検索先を構成す る 方式ではな く 、 適切な SearchPath 定義を含む


UPR 構成フ ァ イ ルを指す よ う PDFLIBRESOURCEFILE 環境変数を設定する こ と も で き ます。

ネ イ テ ィ ブ な日中韓 レ ガ シー コ ー ド を維持 埋 め 込 ん で い な い フ ォ ン ト に 対 し て
keepnative フ ォ ン ト オプシ ョ ン を true に設定す る と 、選択 し た CMap に従っ たネ イ テ ィ ブ
な レ ガシーコ ー ド (た と えば Shift-JIS) が PDF 出力へ書 き 込まれます。 そ う でない場合に
はテ キ ス ト は CID 値へ変換 さ れます。 その利点は、 その よ う な フ ォ ン ト を埋め込みな し に
フ ォーム フ ィ ール ド で使用で き る こ と です。
keepnative=false の場合には、 PDF 出力が生成 さ れ る 際に、 レ ガシーな コ ー ド 列は CID
値群へ変換 さ れます。 その利点は、 OpenType 機能 と テ キ ス ト フ ロ ー整形機能を使用で き
る こ と です。

日中韓 フ ォ ン ト のための コ ー ド ページ PDFlib は表 5.6 に挙げ る コ ー ド ページに対応 し


てい ます。 Windows では PDFlib は さ ら に、 シ ス テ ムに イ ン ス ト ール さ れてい る 任意の日
中韓 コ ー ド ページに対応 し てい ます。

5.3 非 Unicode 対応言語バイ ンデ ィ ング 119


表 5.6 日中韓 コ ー ド ページ (textformat=auto か textformat=bytes で用いる必要があ り ます)

ロ ケール コ ー ド ページ 形式 文字集合

日本語 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

120 第 5 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング
5.4 キ ャ ラ ク タ ー を指定
環境に よ っ てはプ ロ グ ラ マーは、 ソ ース コ ー ド を 8 ビ ッ ト エン コ ーデ ィ ン グ (winansi ・
ebcdic な ど) で書 く こ と を要求 さ れます。 こ の場合、 8 ビ ッ ト 符号化 さ れた テ キ ス ト の中
へ、 一部分だけ Unicode キ ャ ラ ク タ ー群を含め る のは厄介な問題です。 こ の状況か ら 開発
者を救 う ため、 PDFlib では、 テ キ ス ト を表す補助手段がい く つか使え ます。

5.4.1 エ ス ケープ シーケ ン ス


PDFlib は、 エスケープ シーケ ン ス ( こ れは実際には誤称です : バ ッ ク ス ラ ッ シ ュ置換 と い
う 用語のほ う が よ いで し ょ う ) を通 じ てテ キ ス ト 文字列内に任意の値を入れ込め る 方式を
サポー ト し てい ます。 た と えば、 テ キ ス ト ブ ロ ッ ク のデフ ォ ル ト テ キ ス ト 内で \t シーケ
ン ス を使えば、直接キーボー ド 入力では無理か も し れない タ ブキ ャ ラ ク タ ーが入れ ら れま
す。 同様にエ ス ケープシーケ ン ス は、 記号 フ ォ ン ト におけ る コ ー ド を表すに も 便利です
し 、エ ス ケープシーケ ン ス を持た ない言語バ イ ンデ ィ ン グにおいては リ テ ラ ル文字列を あ
ら わすに も 便利です。
エ ス ケープシーケ ン スは、 シーケ ン ス を 1 個のバ イ ト 値へ置換す る 命令です。 シーケ
ン ス は、 文字列のカ レ ン ト エ ン コ ーデ ィ ン グ内のバ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ ー 「\」 に
対す る コ ー ド で開始 し ます。バ ッ ク ス ラ ッ シ ュ は多 く のプ ロ グ ラ ミ ン グ言語において特殊
な意味を持ち ますので、 ソ ース コ ー ド 内で リ テ ラ ルに用い る 際には二重にす る 必要があ る
か も し れません。エ ス ケープシーケ ン ス の置換か ら 得 ら れ る バ イ ト 値を表 5.7 に示 し ます。
ASCII と EBCDIC のプ ラ ッ ト フ ォーム では違 う も の も あ り ます。 エ ス ケープシーケ ン ス で
表せ る のは、 0 ~ 255 のバ イ ト 値だけです。
い く つかのプ ロ グ ラ ミ ン グ言語 と 異な り 、 PDFlib のエ ス ケープシーケ ン ス はその種類
に応 じ てつねに固定長 と な り ます。ですのでシーケ ン ス の終了キ ャ ラ ク タ ーは必要あ り ま
せん。

表 5.7 エ スケープ シーケ ン ス と バイ ト 値一覧


シーケ ン ス 長さ macOS ・ Windows ・ EBCDIC プ ラ ッ ト 広 く 知 られる解釈
Unix フ ォ ーム
\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 に設定す る 必要があ り ま
す。 必要な と こ ろで選択的に PDF_fit_textline( ) な ど関数内で こ れを行 う こ と も 可能です。
あ る いはすべての内容文字列 (すなわちすべてのテ キ ス ト 出力操作) に対 し てエ ス ケープ
シーケ ン ス の展開を有効化す る こ と も で き 、 その方法は以下の と お り です :
p.set_text_option("escapesequence=true");

5.4 キ ャ ラ ク タ ーを指定 121


エ ス ケープシーケ ン ス の置換は、 PDF_set_option( ) を用いて グ ロ ーバルに有効化する こ と
も 可能です。 こ のグ ロ ーバルオプシ ョ ンは、 その後に使われ る すべての名前文字列 ・ ハ イ
パーテ キ ス ト 文字列 ・ 内容文字列に効力を及ぼ し ます。 環境変数の値は名前文字列 と し て
扱われますので、 それ も エ ス ケープシーケ ン ス の展開の対象 と な り ます。 こ れはた と えば
バ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ ーを含む Windows パ ス ま たはフ ァ イ ル名な ど について、望ま
ない動作につなが る おそれがあ り ます。 ですので、 PDF_set_option( ) を用いてエ ス ケープ
シーケ ン ス 置換を グ ロ ーバルに有効化す る のではな く 、 必要な と こ ろ だけで選択的に メ
ソ ッ ド を用いて (PDF_fit_textline( ) な ど)、 あ る いは PDF_set_text_option( ) を用いて内容
文字列に対 し てだけ有効化す る こ と を推奨 し ます。
escapesequence オプシ ョ ン を設定す る のではな く 、 PDF_convert_to_unicode( ) を用い、
入力 と 出力のエン コ ーデ ィ ン グ を同 じ にす る こ と に よ っ て、文字列内のエ ス ケープシーケ
ン ス を置き 換え る こ と も で き ます。 例 :
String s_plain = p.convert_to_unicode("utf16",
s.character.getBytes("UTF-16"),
"outputformat=utf16 escapesequence=true");

エ ス ケープシーケ ン ス は BOM 検出の後に、 し か し タ ーゲ ッ ト 形式への変換の前に、 評価


さ れます。 textformat= utf16le か utf16be な ら エ ス ケープシーケ ン ス は、 選ばれた形式に
従っ て 2 バ イ ト 値 と し て表す必要があ り ます。エ ス ケープシーケ ン ス内の各キ ャ ラ ク タ ー
は 2 バ イ ト で表現 さ れ、 その う ち 1 バ イ ト は値 0 にな り ます。 textformat=utf8 な ら 、 生
成 コ ー ド は UTF-8 に変換 さ れません。
エ ス ケープシーケ ン ス が解決で き ない と き には (\x の後の 16 進数が不正な ど)、 例外
が発生 し ます。 内容文字列については こ の動作は、 glyphcheck ・ errorpolicy 設定で制御 さ
れます。

5.4.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; U+00AD ソフトハイフン
&euro; U+00AD ユーログリフ (実体名)
&lt; U+00AD 小なり記号
&gt; U+00AD 大なり記号
&amp; U+00AD アンパサンド記号
&Alpha; U+0391 ギリシャ文字?

122 第 5 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング
数値文字参照 Unicode キ ャ ラ ク タ ーに対す る 数値文字参照 も HTML 4.0 で定義 さ れてい
ます。 こ れはハ ッ シ ュ キ ャ ラ ク タ ー 「#」 と 10 進ま たは 16 進の数値を必要 と し 、 16 進数
値のは小文字か大文字の 「X」 キ ャ ラ ク タ ーを頭につけ ます。 例 :
&#173; U+00AD ソフトハイフン(10進)
&#xAD; U+00AD ソフトハイフン
&#229; U+00AD 文字aの上に小さな丸 (10進)
&#xE5; U+00E5 文字aの上に小さな丸 (16進、小文字x)
&#Xe5; U+00E5 文字aの上に小さな丸 (16進、大文字X)
&#x20AC; U+20AC ユーログリフ (16進)
&#x1F602; U+1F602 FaceにTears of Joyを加えたもの

PDFlib 独自の実体名 PDFlib では、 以下のグループの Unicode 制御キ ャ ラ ク タ ーに対 し


て、 カ ス タ ムの文字実体参照を使 う こ と がで き ます :
> 表 7.6 に挙げ る デフ ォ ル ト シ ェーピ ン グ動作を オーバー ラ イ ド す る ための制御キ ャ ラ
ク タ ー群。
> 表 7.7 に挙げ る デフ ォ ル ト 双方向組版を オーバー ラ イ ド す る ための制御キ ャ ラ ク タ ー
群。
> 表 9.1 に挙げ る テ キ ス ト フ ロ ーの改行 と 組版のための制御キ ャ ラ ク タ ー群。

例:
&linefeed; U+000A ラインフィード制御キャラクター
&hortab; U+0009 水平タブ
&ZWNJ; U+200C ゼロ幅非接合子

グ リ フ 名参照 フ ォ ン ト の中のグ リ フ に対応す る Unicode値があ ら か じ めわか ら ない こ と


が原因でそれに直接ア ク セ ス で き ない場合があ り ます (なぜな ら PDFlib が PUA 値を割 り
当て る のは実行時だか ら です) 。 こ の よ う な グ リ フ を指定す る ための代替策 と し て、 グ リ
フ名を用いた文字参照を使用す る こ と が可能です。 こ れ ら の参照は、 対応す る Unicode 値
で置 き 換え ら れます。 グ リ フ名は以下の ソ ース か ら 導かれます :
> 代表的な グ リ フ名は内蔵 リ ス ト 内で検索 さ れます
> フ ォ ン ト 独自のグ リ フ名はカ レ ン ト フ ォ ン ト 内で検索 さ れ ます。 こ の種類の文字参照
はフ ォ ン ト を必要 と す る ので、 内容文字列でのみ動作 し ます。

グ リ フ名参照を同定す る ために、 実際の名前はア ンパサン ド キ ャ ラ ク タ ー 「&」 の後に ピ


リ オ ド キ ャ ラ ク タ ー 「.」 を必要 と し ます。 例 :
&.three; U+0033 数字3の代表的グリフ名
&.mapleleaf; (PUA Unicode値)Cartaフォントにおけるカスタムグリフ名
&.T.swash; (PUA Unicode値)2番目のピリオドキャラクターはグリフ名の一部です

グ リ フ名に よ る 文字参照は以下のシナ リ オで有用です :


> フ ォ ン ト 独自グ リ フ名に よ る 文字参照は、 内容文字列内で異体字 (ス ワ ッ シ ュ キ ャ ラ
ク タ ーな ど) や、 特定の Unicode セマ ン テ ィ ク ス を持たないグ リ フ (記号 ・ ア イ コ ン ・
装飾) を選ぶのに有用です。 ただ し 、 等幅数字をは じ め と す る 多 く の機能は、 フ ォ ン
ト が対応 し ていれば OpenType 機能で も っ と 簡単に実装で き ま す (163 ページ 「7.4
OpenType レ イ ア ウ ト 機能」 参照)。
> Adobe グ リ フ リ ス ト 内の名前(uniXXXX・uXXXX/uXXXXX/uXXXXXX 形式の も の も 含め)、
お よ び さ ま ざ ま な よ く あ る 「名前誤 り 」 グ リ フ名は、 内容文字列 と ハ イ パーテ キ ス ト
文字列でつねに受け入れ ら れます。

5.4 キ ャ ラ ク タ ーを指定 123


バ イ ト 値参照 数値を文字参照で与え る こ と も で き ます。こ れは記号フ ォ ン ト 内のグ リ フ
を指定す る のに有用で し ょ う 。 こ の方式では、 ハ ッ シ ュ キ ャ ラ ク タ ー 「#」 を加えた 10 進
ま たは 16 進数が必要です。 こ こ で 16 進数は小文字か大文字の 「X」 キ ャ ラ ク タ ーを頭に
付け ます。 例 (Wingdings フ ォ ン ト を前提) :
&.#x9F; Wingdingsフォントのビュレット記号
&.#159; Wingdingsフォントのビュレット記号

文字参照を用い る 文字参照はデフ ォ ル ト では置換 さ れ ま せんので、 内容文字列内で文


字参照を用い る には、 charref オプシ ョ ン を true に設定す る 必要があ り ます :
p.fit_textline("Price: 500&euro;", x, y, "charref=true");

テ キ ス ト オプシ ョ ン と し て charref を与え る と 、 すべての内容文字列に対 し て文字参照が


有効化 さ れます :
p.set_text_option("charref=true font=" + font + " fontsize=24");
p.fit_textline("Price: 500&euro;", x, y, "");

こ の charref オプシ ョ ンは、 PDF_set_option( ) を用いて グ ロ ーバルに設定する こ と も 可能


です。 し か し 、 こ れはすべての名前文字列 ・ ハ イ パーテ キ ス ト 文字列 ・ 内容文字列に影響
し ますので、 望ま ない結果を引 き 起 こ すおそれがあ る こ と か ら 、 推奨 さ れません。
charref オプシ ョ ン を設定す る のではな く 、 PDF_convert_to_unicode( ) を用い、 入力 と
出力のエン コ ーデ ィ ン グ を同 じ にす る こ と に よ っ て、文字列内の文字参照を置き 換え る こ
と も で き ます。 例 :
String s_plain = p.convert_to_unicode("utf16",
s.character.getBytes("UTF-16"),
"outputformat=utf16 charref=true");

文字参照を使 う う えでのその他の注意点を挙げます :
> 文字参照は、 内容文字列 ・ ハ イ パーテ キ ス ト 文字列 ・ 名前文字列のいずれで も 使え ま
す。 例外 と し て、 フ ォ ン ト 独自グ リ フ名参照は上述の よ う に内容文字列でのみ動作 し
ます。
> 文字参照はbuiltin エン コーデ ィ ン グのテ キ ス ト 内では置換 さ れません。し か し 、unicode
エ ン コ ーデ ィ ン グ を用い る こ と に よ っ て記号フ ォ ン ト に対 し て文字参照を使 う こ と は
で き ます。
> 文字参照はオプシ ョ ン リ ス ト 内では置換 さ れません。 ただ し 、 Unichar デー タ 型のオプ
シ ョ ン内では認識 さ れます。 こ の場合、 「&」 ・ 「;」 修飾は外す必要があ り ます。 こ の認
識はつねに有効であ り 、 charref オプシ ョ ンには従い ません。
> 非 Unicode 対応言語バ イ ンデ ィ ン グでは、 textformat=utf16 ・ utf16be ・ utf16le の と き は
文字参照は 2 バ イ ト 値で表す必要があ り ます。encoding=unicode かつ textformat=bytes
の と き は文字参照は ASCII で表す必要があ り ます (EBCDIC ベース のプ ラ ッ ト フ ォー
ムで も )。
> 1 個のア ンパサン ド キ ャ ラ ク タ ーは、 文字参照の開始 と 見な さ れます。 ただ し 、 その後
にセ ミ コ ロ ン 「;」 が見つか り 、 かつ 「&」 と 「;」 の間のキ ャ ラ ク タ ー群が文字参照 と
し て有効であ る 場合に限 り ます。そ う でない場合には、そのア ンパサン ド キ ャ ラ ク タ ー

&」 は変更 さ れない ま ま と な り ま す。 文字参照を開始 さ せずにア ンパサ ン ド キ ャ ラ ク
ター
「&」 を表 し たい場合には、 文字参照 &amp; を使用す る こ と が推奨 さ れます。

124 第 5 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング
> 文字参照の可能性のあ る 文字列が無効の場合(た と えば&# の後に無効な 10進値群が続
いてい る 場合や、 「&」 の後に未知の実体名が続いてい る 場合) には、 その動作はオプ
シ ョ ン glyphcheck に依存 し ます :
glyphcheck=none : その文字列はその ま ま保たれます。
glyphcheck=replace : その文字列は置換キ ャ ラ ク タ ーで置換 さ れます。
glyphcheck=error:エ ラ ーが発生 し 、テ キ ス ト 処理は停止 さ れます。errorpolicy=exception
の場合には例外が発生 し ます。

5.4 キ ャ ラ ク タ ーを指定 125


126 第 5 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング
6 フォン ト
6.1 フ ォ ン ト 形式
6.1.1 TrueType フ ォ ン ト
各種 TrueType フ ォ ン ト 形式 PDFlib は、 以下の フ ァ イ ル形式のベ ク ト ルベー
ス の TrueType フ ォ ン ト に対応 し てい ます :
> Windows と macOS の TrueType フ ォ ン ト (*.ttf)。欧文・記号・日中韓フ ォ ン ト
を含みます。
> TrueType コ レ ク シ ョ ン (*.ttc)。1 つの フ ァ イ ルの中に複数の フ ァ イ ルが入っ
てい ます。TTC フ ァ イ ルは通常、日中韓フ ォ ン ト を グループ化する ために用
い ら れ ますが、 1 つの欧文フ ォ ン ト の複数の メ ンバーを 1 個の フ ァ イ ルに
パ ッ ケージす る のに も 用い ら れてい ます。
> エン ド ユーザー定義キ ャ ラ ク タ ー (EUDC) フ ォ ン ト (*.tte) 。 Microsoft の
eudcedit.exe ツールで作 ら れます。

TrueType フ ォ ン ト 名 フ ォ ン ト フ ァ イ ルを扱 う 際には、 フ ォ ン ト に任意の API 名を割 り


当て る こ と も で き ます (141 ページ 「フ ォ ン ト デー タ の ソ ース」 参照)。 こ の名前は、 フ ォ
ン ト を読み込む際に用い ら れ、その フ ォ ン ト の フ ァ イ ル名やその フ ォ ン ト の内部名 と は異
な っ ていて も か ま い ません。 生成 さ れた PDF では、 TrueType フ ォ ン ト の名前が PDFlib
(や Windows) で用い てい た名前 と 異な る こ と が あ り ま す。 こ れは正常で あ り 、 PDF は
TrueType の PostScript 名を用いてい る と い う 事実に よ る も のです。PostScript 名は TrueType
名 と は異な り ます (例 : TimesNewRomanPSMT に対 し て Times New Roman)。

6.1.2 OpenType フ ォ ン ト
OpenType フ ォ ン ト 形式 (ISO 14496-22 に従っ て Open Font Format と も い う )
は、 PostScript と TrueType 技術を結合 し た も のです。 こ れは TrueType フ ァ イ ル
形式の拡張 と し て実装 さ れてい ます。 OpenType フ ォ ン ト は、 合字やス ワ ッ シ ュ
キ ャ ラ ク タ ーな ど、 テ キ ス ト 出力の改善に利用で き る オプシ ョ ナルなテーブル
(163 ページ 「7.4 OpenType レ イ ア ウ ト 機能」 参照) のほか、 複雑用字系シ ェ ー
ピ ン グのためのテーブルを含む こ と も で き ます(170 ページ「7.5 複雑用字系の出力」参照)。
OpenType フ ォ ン ト は、TrueType と PostScript のいずれをベース と し た グ リ フ記述 も 内
容 と し て持つ こ と がで き ます。 PostScript ベース のほ う は Compact Font Format (CFF) や
Type 2 と も 呼ばれ、 たいてい *.otf 接尾辞をつけて用い ら れます。
> CID (キ ャ ラ ク タ ー ID) アーキ テ ク チ ャ ーが日中韓フ ォ ン ト に対 し て用い ら れてい ま
す。 現代の CID フ ォ ン ト は、 PostScript ア ウ ト ラ イ ン を持つ OpenType *.otf フ ォ ン ト と
し てパ ッ ケージ さ れてい ます。
> OpenType コ レ ク シ ョ ンは、 OpenType 1.7 仕様で導入 さ れま し た。 こ れは、 関連す る
OpenType フ ォ ン ト 群を 1 個の合体フ ァ イ ル内へま と め る と い う 点において、TrueType
コ レ ク シ ョ ン と 似てい ます。 OpenType コ レ ク シ ョ ンは *.ttf ま たは *.otc 接尾辞を用い
ます。
> バ リ アブルフ ォ ン ト は、 OpenType フ ォ ン ト バ リ エーシ ョ ン と い う 機構を用いてお り 、
こ れを用い る と 、 同一の フ ォ ン ト フ ァ ミ リ ーに属す る 複数の フ ォ ン ト フ ェ ー ス ( ラ イ

6.1 フ ォ ン ト 形式 127
ト ・ レ ギ ュ ラ ー ・ ボール ド な ど) を、 ただ 1 つの フ ォ ン ト リ ソ ース の中へパ ッ ケージ
す る こ と がで き ます。 PDF はフ ォ ン ト バ リ エーシ ョ ンに対応 し てい ませんので こ の機
構を利用で き ません。TrueType ア ウ ト ラ イ ン を持っ た OpenType フ ォ ン ト バ リ エーシ ョ
ン を PDFlib で読み込む こ と はで き ますが、 バ リ エーシ ョ ンのないデフ ォ ル ト フ ォ ン ト
イ ン ス タ ン ス のみが利用可能 と な り ます。 CFF2 テーブル内に PostScript ア ウ ト ラ イ ン
を持っ た OpenType フ ォ ン ト バ リ エーシ ョ ンは、 PDF が対応 し てい ませんので、 拒否
さ れます。

6.1.3 SVG ・ COLR ・ sbix 形式の OpenType カ ラ ー フ ォ ン ト


ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の fonts/color_font ト ピ ッ ク にあ り ます。

OpenType カ ラ ーフ ォ ン ト には さ ま ざ ま な種類があ り 、 特に絵文字のために よ く 利用 さ れ


る よ う にな り ま し た。 PDFlib は、 以下に挙げ る 種類の OpenType カ ラ ーフ ォ ン ト (ISO
14496-22:2019 に従っ て) に対応 し てい ます。
PDF は OpenType カ ラ ーフ ォ ン ト に直接は対応 し ていないので、 PDFlib はカ ラ ーグ リ
フ群に対 し て Type 3 フ ォ ン ト を生成 し ます。 PDFlib は、 OTF ・ TTF ・ TTC ・ OTC ・ WOFF ・
WOFF2 形式の OpenType カ ラ ーフ ォ ン ト と 、 ホ ス ト フ ォ ン ト と し て イ ン ス ト ール さ れて
い る カ ラ ーフ ォ ン ト を処理 し ます。 PDF 出力において、 カ ラ ーフ ォ ン ト に よ る テ キ ス ト
は、 カ ラ ーグ リ フ が ラ ス タ ー画像へ変換 さ れていないので、 完全に検索 ・ 選択が可能な ま
ま と な り ます。

OpenType SVG フ ォ ン ト こ の 種 類 の フ ォ ン ト は、 SVG グ リ フ 記述


(Adobe/Mozilla) を使用 し ま す。 SVG グ リ フ は、 SVG 取 り 込みの記述
に従っ て処理 さ れ ま す (199 ページ 「8.2 SVG グ ラ フ ィ ッ ク 」 を参照)。
SVG グ リ フ は、 sRGB 色空間で処理 さ れ、 ま た、 透過を含む こ と がで
き ま す。 オープ ン ソ ー ス の EmojiOne Color フ ォ ン ト がその一例です。

OpenType COLR フ ォ ン ト こ の種類の フ ォ ン ト は、 COLR ・ CPAL テーブル (Microsoft)


を使用 し 、 1 つない し 複数のモ ノ グ リ フ を レ イ ヤーする こ と に よ っ て カ ラ ーグ リ フ を構築
し ます。 こ の各レ イ ヤーは、 sRGB 色空間で着色 さ れ、 ま た、 透過の値を割 り 当て ら れ る
こ と も で き ます。 Windows のシ ス テ ム フ ォ ン ト Segoe UI Emoji がその一例です。
COLR フ ォ ン ト において レ イ ヤー と し てのみ使用 さ れ る 補助グ リ フは、 カ ラ ーグ リ フ
を 生成す る た め に 使用 さ れ ま す が、 そ れ自体 を 使用す る こ と は で き ま せ ん。 た だ し
encoding=glyphid を用いればすべてのグ リ フ を指定で き ますので使用で き ます。 通常の場
合 と 同様に、 こ の よ う な補助グ リ フ が フ ォ ン ト のサブセ ッ ト に含め ら れ る のは、 それが文
書で実際に使われてい る と き のみです。

OpenType sbix フ ォ ン ト こ の種類のフ ォ ン ト は、 sbix テーブル (Apple) 内のグ リ フ ビ ッ


ト マ ッ プ を使用 し ます。 こ の よ う な フ ォ ン ト は、 デザ イ ン単位あ た り の ピ ク セル数が さ ま
ざ ま であ る ビ ッ ト マ ッ プグ リ フ の 1 つない し 複数の集合を内容 と し ます。PDFlib はデフ ォ
ル ト では最大のビ ッ ト マ ッ プ を使用 し ますが、こ れは strikeselect オプシ ョ ン を用いて変更
す る こ と も 可能です。 sbix テーブルに よ る カ ラ ーフ ォ ン ト は、 sRGB 色空間で処理 さ れ、
ま た通常、 透過マ ス ク を持っ てい る グ リ フ ビ ッ ト マ ッ プ を内容 と し て持ち ます。 macOS の
シ ス テ ム フ ォ ン ト Apple Color Emoji がその一例です ( こ れ と 同名の iOS のシ ス テ ム フ ォ ン
ト は使用で き ません。なぜな ら プ ロ プ ラ イ エ タ リ ーな ビ ッ ト マ ッ プ圧縮方式を使用 し てい
る ので)。

128 第 6 章 : フォン ト
さ ま ざ ま な カ ラ ー フ ォ ン ト 処理モー ド カ ラ ーフ ォ ン ト に対 し て意図す る 用途 と その性
質に応 じ て、 colormode フ ォ ン ト オプシ ョ ン を使っ て カ ラ ーフ ォ ン ト の処理モー ド を選択
す る こ と がで き ます。 カ ラ ーフ ォ ン ト モー ド の比較を表 6.1 に示 し ます。 1 つの フ ォ ン ト
のカ ラ ーモー ド を後か ら 変え る こ と はで き ませんので、その フ ォ ン ト を再度読み込んだ場
合には、 その colormode オプシ ョ ンは無視 さ れて、 最初の読み込み操作のカ ラ ーモー ド が
使用 さ れます。

表 6.1 OpenType カ ラ ー フ ォ ン ト のための処理モー ド (フ ォ ン ト オプ シ ョ ン colormode)

colormode=combined (デ フ ォル ト ) colormode=ignoremono colormode=ignorecolor

説明 1 つのフ ォ ン ト にモ ノ グ リ フ と カ ラ ーグ モ ノ グ リ フ は無視 さ れて純 カ ラ ーグ リ フ は無視 さ れて


リ フが共存 粋な カ ラ ー フ ォ ン ト が生成 純粋な モ ノ フ ォ ン ト が生成
さ れます さ れます

利点 モ ノ グ リ フ と カ ラ ーグ リ フ の扱いを一本 モ ノ グ リ フ によ る不要な 望ま ない カ ラ ーグ リ フ ・ 透
化で き ます。 カ ラ ーグ リ フ も モ ノ グ リ フ OpenType フ ォ ン ト がス 過がな く な り ます
も元の OpenType フ ォ ン ト と 同 じ グ リ フ キ ッ プ さ れます
ID を持つ こ と にな り ます。
COLR フ ォ ン ト のレ イ ヤーグ リ フ も
encoding=glyphid を用いて使用で き ま
す。

用途 モ ノ グ リ フ と カ ラ ーグ リ フ を シ ン プルに カ ラ ー フ ォ ン ト を他のフ ォ 白黒のワー ク フ ロー、 透過


使用 ン ト のフ ォ ールバ ッ ク にす 回避

制約 ― モ ノ グ リ フ ・ OpenType 機 カ ラ ーグ リ フ な し
能 ・ 合字 ・ シ ェ ーピ ングな

OpenType カ ラ ー フ ォ ン ト 内のグ リ フ の種類 カ ラ ー フ ォ ン ト は以下の種類の グ リ フ を


持っ てい る 可能性があ り ます :
> カ ラ ーグ リ フ : 色情報を内蔵 し てい る グ リ フ。 透過情報 も 持っ てい る こ と があ り ます。
色の情報がグ リ フ記述に含ま れてい る ので、 個々のグ リ フ の色が固定 さ れてい ますか
ら 、カ レ ン ト の塗 り 色・描線色にかかわ ら ずグ リ フ の色はつねに同 じ にな り ます。COLR
テーブルを持っ てい る OpenType カ ラ ーフ ォ ン ト は、 内蔵の色ではな く 「前面色」 を
割 り 振 ら れ る ためのグ リ フ レ イ ヤーを持っ てい る こ と があ り ます。 こ の色 と 、 それに
対応す る 透過を、 foregroundcolor ・ foregroundtransparency フ ォ ン ト オプシ ョ ン を用い
て与え る こ と がで き 、 こ れ ら の値はその フ ォ ン ト のすべてのグ リ フ に対 し て固定であ
り 、 かつその よ う な グ リ フ を使用す る すべての場合において固定 と な り ます。
カ ラ ーグ リ フ を、 colormode=ignorecolor を用いて ス キ ッ プす る こ と も で き 、 その場合
には、 その フ ォ ン ト は色情報を何 も 持っ ていない フ ォ ン ト の よ う に処理 さ れます。
> 単色 (モ ノ と も い う ) グ リ フ : 形状のみを記述 し てお り 、 色情報 ・ 透過情報を何 も 持っ
てい ません。 モ ノ グ リ フ は、 ページ上に配置す る と 、 カ レ ン ト の塗 り 色で着色で き ま
す。 モ ノ グ リ フは、 colormode=ignoremono を用いて ス キ ッ プする こ と も で き ます。 し
か し 、 あ ら ゆ る カ ラ ーフ ォ ン ト がモ ノ グ リ フ を持っ てい る わけではない こ と に留意 し
て く だ さ い。 多 く の sbix カ ラ ーフ ォ ン ト は、 使用可能なモ ノ グ リ フ を持っ ていないの
で、 colormode=ignorecolor を用いて使用す る には不適当です。

1 つの フ ォ ン ト の中に、1 つのグ リ フ のカ ラ ー版 と モ ノ 版が共存 し てい る こ と も あ り ます。

6.1 フ ォ ン ト 形式 129
カ ラ ー フ ォ ン ト を使用 OpenType カ ラ ーフ ォ ン ト を各種アプ リ ケーシ ョ ンで使用する 際
の注意点です :
> 多 く の絵文字キ ャ ラ ク タ ーが BMP 外に符号化 さ れてい ます。すなわち Unicode コ ー ド 点
が U+FFFF よ り 大 き いです。 お使いの開発環境に よ っ て、 こ の よ う な Unicode 値を表
現す る 方法は さ ま ざ ま です。 さ ら な る 情報 と 例が、 31 ページ 「2 章 PDFlib の言語バ イ
ンデ ィ ン グ」 の言語ご と の各節にあ り ます。
> 絵文字キ ャ ラ ク タ ーは さ ま ざ ま に修飾 ・ 結合で き ます。 161 ページ 「7.3 絵文字シーケ
ン ス」 を参照。
> 絵文字キ ャ ラ ク タ ーを持っ てい る OpenType カ ラ ーフ ォ ン ト はフ ォールバ ッ ク フ ォ ン
ト 機能を利用で き ます。 例は 147 ページ 「カ ラ ー絵文字キ ャ ラ ク タ ーを テ キ ス ト フ ォ
ン ト に追加」 を参照 し て く だ さ い。
> 他の フ ォ ン ト 形式 と 異な り 、 カ ラ ーフ ォ ン ト に対 し てはサブセ ッ ト 化はデフ ォ ル ト で
有効化 さ れます。 サブセ ッ ト 化を無効化する にはオプシ ョ ン subsetting=false を用い ま
す。
> OpenType カ ラ ーフ ォ ン ト のカ ラ ーグ リ フは色 と 透過を内蔵 し てい ますので、そのフ ォ
ン ト を使用す る さ いにそれ ら を変え る こ と はで き ません。 同様に、 テ キ ス ト 書式オプ
シ ョ ン textrendering は カ ラ ー グ リ フ に対 し て は何 ら 効力 を 持 ち ま せん が、 た だ し
textrendering=3 (不可視テ キ ス ト ) と 7 ( ク リ ッ ピ ン グ) の場合にはテ キ ス ト が不可視
にな り ます。
> OpenType カ ラ ーフ ォ ン ト のグ リ フは透明な要素を含んでい る こ と があ り ます。 PDF/
A-1 と PDF/X-3 では透過は許 さ れ ませんので こ の こ と がひっ かか っ て き ます。 サブ
セ ッ ト 化が有効化 さ れてい る 場合には、 透過グ リ フは、 使用 さ れ る 際には検出 さ れず、
PDF_end_document( ) で フ ォ ン ト のサブセ ッ ト が生成 さ れ る 時に初めて検出 さ れます。
ですので、 ページオプシ ョ ン transparencygroup=auto は、 サブセ ッ ト 化が有効化 さ れ
てい る 場合には、 カ ラ ーフ ォ ン ト 内の透過を検出 し ません。
> Unicode 異体字シーケ ン ス を使っ て、キ ャ ラ ク タ ーに対する テ キ ス ト ま たは絵文字ス タ
イ ルグ リ フ を選択で き ます(179 ページ「7.7 Unicode 異体字セ レ ク タ ー(UVS)」を参照)。

カ ラ ー フ ォ ン ト に関す る情報を ク エ リ ー OpenType カ ラ ー フ ォ ン ト の読み込みが成功


し た後には、 以下の色関連の情報を、 PDF_info_font( ) を用いて取得で き ます :
> キーワー ド colortype は OpenType カ ラ ーフ ォ ン ト の種類を取得 し ます。
> キーワー ド colormode は処理モー ド を取得 し ます。
> キーワー ド numcolorglyphs はカ ラ ーグ リ フ の数を取得 し ます。

6.1.4 WOFF ・ WOFF2 フ ォ ン ト


WOFF(Web Open Font Format=Webオープン フ ォ ン ト 形式)は、TrueType
フ ォ ン ト と OpenType フ ォ ン ト のための、 圧縮 さ れた コ ン テナ形式です。
WOFF は、 Web 上での使用のために設計 さ れた も のであ り 、 小 さ な フ ォ
ン ト フ ァ イ ルサ イ ズ を実現す る ために、 圧縮機能 と サブセ ッ ト 化機能を
提供 し てい ます。 WOFF フ ォ ン ト はフ ァ イ ル名拡張子 .woff を使用 し てい ます。
WOFF2 形式は、 WOFF をベース に し てお り 、 圧縮が向上 し てい ます。 WOFF2 は W3C
勧告 と し て 2018 年に発行 さ れてい ます。 WOFF2 フ ォ ン ト はフ ァ イ ル名拡張子 .woff2 を
使用 し てい ます。
PDFlib は、 背後の TrueType ま たは OpenType フ ォ ン ト に対応 し てい る 限 り において、
WOFF ・ WOFF2 フ ォ ン ト に対応 し てい ます。

注 WOFF2 フ ォ ン ト は IBM System i ・ IBM Z では対応 し ていません。

130 第 6 章 : フォン ト
6.1.5 PostScript Type 1 フ ォ ン ト (廃止済)
注 PostScript Type 1 フ ォ ン ト 対応は廃止 さ れま し た。

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 形式のア ウ ト ラ イ ン情報用の形式です。

6.1.6 SING フ ォ ン ト (グ リ フ レ ッ ト )
SING フ ォ ン ト (Smart Independent Glyphlets) は OpenType フ ァ イ ル形式の拡張です。SING
フ ォ ン ト は、 日中韓テ キ ス ト におけ る 外字問題、 すなわち Unicode で符号化 さ れていない
カ ス タ ム な グ リ フ に対す る 解決策 と し て開発 さ れた も のです。
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 サブオプシ ョ ン を用いて フ ォールバ ッ ク フ ォ ン ト と し て利用す る こ と を推奨 し ます。
176 ページ 「7.6.3 EUDC ・ SING フ ォ ン ト に よ る 外字キ ャ ラ ク タ ー」 を参照 し て く だ さ い。

6.1.7 Type 3 フ ォ ン ト
他のすべての フ ォ ン ト 形式 と は異な り 、Type 3 フ ォ ン ト はフ ァ イ ルか ら 取得 さ れ る のでは
な く 、 標準 PDFlib グ ラ フ ィ ッ ク メ ソ ッ ド 群を用いて実行時に定義 さ れます。 Type 3 フ ォ
ン ト は以下の用途で有用です :
> ビ ッ ト マ ッ プフ ォ ン ト 。
> 色ま たは透過を内蔵 し てい る フ ォ ン ト 。
> ロ ゴ な ど のカ ス タ ム グ ラ フ ィ ッ ク を、 シ ンプルなテ キ ス ト 操作命令で簡単に印刷可能。
> いずれの フ ォ ン ト やエ ン コ ーデ ィ ン グで も 入手で き ない日本語の外字 (ユーザー定義
キ ャ ラ ク タ ー)。
> カ ラ ーフ ォ ン ト に対 し ては内部的に Type3 フ ォ ン ト が生成 さ れます (128 ページ 「6.1.3
SVG ・ COLR ・ sbix 形式の OpenType カ ラ ーフ ォ ン ト 」 を参照)。

Type 3 フ ォ ン ト は 2 種類のグ リ フ を持っ てい る 可能性があ り ます :


> デフ ォ ル ト では、 グ リ フは無着色であ り 、 グ リ フ記述はグ リ フ の形状のみを指定 し て
い ます。 色は、 その生成 さ れた フ ォ ン ト でテ キ ス ト が出力 さ れ る 際にカ レ ン ト の塗 り
色が指定 さ れます。 グ リ フ記述内で色 ・ 透過 ・ 画像 (マ ス ク を除 く ) を設定す る メ ソ ッ
ド は許 さ れません。
> グ リ フ オプシ ョ ン colorized を trueに設定す る と 、グ リ フ記述は色 と 透過を指定 し 、ま た、
任意の画像を配置す る こ と も で き ます。 グ リ フ の色は固定 さ れ ますので、 テ キ ス ト が
配置 さ れ る 際に有効にな っ てい る 塗 り 色にかかわ ら ずそのグ リ フ は同 じ 見た目にな り
ます。

6.1 フ ォ ン ト 形式 131
Type 3 フ ォ ン ト の定義の中では、 PDFlib のベ ク ト ルグ ラ フ ィ ッ ク ・ ラ ス タ ー画像の機能
がすべて使え ます し 、 テ キ ス ト 出力の機能で さ えすべて使 う こ と がで き る ので (上述の色
の制約が課 さ れます) 、 Type 3 フ ォ ン ト のグ リ フ の内容に関 し て制約は何 も あ り ません。
Type 3 フ ォ ン ト が最 も 頻繁に利用 さ れ る のはビ ッ ト マ ッ プグ リ フ のためです。 以下の例
は、 単純な Type 3 フ ォ ン ト を定義 し てい ます :
p.begin_font("Fuzzyfont", 0.001, 0.0, 0.0, 0.001, 0.0, 0.0, "");

p.begin_glyph_ext(-1, "glyphname=circle width=1000 boundingbox={0 0 1000 1000}");


p.arc(500, 500, 500, 0, 360);
p.fill();
p.end_glyph();

p.begin_glyph_ext(-1, "glyphname=ring width=400 boundingbox={0 0 400 400}");


p.arc(200, 200, 200, 0, 360);
p.stroke();
p.end_glyph();

p.end_font();

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の type3_fonts/starter_type3font ・ type3_fonts/


type3_bitmaptext ・ type3_fonts/type3_vectorlogo ト ピ ッ ク にあ り ます。

こ う し た フ ォ ン ト は PDFlib の中に登録 さ れ、 その名前は PDF_load_font( ) に与え る こ と が


で き ます。 Type 3 フ ォ ン ト を扱 う 時は以下の こ と に留意 し て く だ さ い :
> .notdef グ リ フ が存在 し て必ずス ロ ッ ト 0 を占めてい る 必要があ り ます。
> 適切な Unicode 値を PDF_begin_glyph_ext( ) に与え る こ と を強 く 推奨 し ます。PDFlib は、
与え ら れた Unicode 値か ら 自動的に AGL (Adobe Glyph List) に従っ て正 し いグ リ フ名
を生成 し ますが、 glyphname オプシ ョ ンで代替名を与え る こ と も 可能です。
> Type 3フ ォ ン ト 内でビ ッ ト マ ッ プに よ る グ リ フ を定義す る 際にはinline画像オプシ ョ ン
を用い る こ と を推奨 し ます (imagetype=jpeg ・ raw の場合にのみ)。 interpolate 画像に
対す る オプシ ョ ンは、 Type 3 ビ ッ ト マ ッ プ フ ォ ン ト の見映え を向上 さ せる ために有用
でし ょ う 。
> ビ ッ ト マ ッ プデー タ を用いて グ リ フ を定義す る 場合、 ビ ッ ト マ ッ プ中の使われていな
い ピ ク セルは、 背景にかかわ ら ず白 く 印刷 さ れ ます。 こ れを避けて背景色が透けて見
え る よ う にす る には、 ビ ッ ト マ ッ プ画像を作成す る 際に mask オプシ ョ ン を用い ます。
> PDF 内の Type 3 フ ォ ン ト は 8 ビ ッ ト ア ド レ ス指定を必要 と し ますので、使用可能な グ リ
フは 255 個に限定 さ れます (.notdef グ リ フ が必須なので)。 し か し PDFlib は、 Type 3
フ ォ ン ト に対 し て任意の数のグ リ フ を受け入れて、 そのグ リ フ集合全体を表現す る た
めに必要な数の補助的な Type 3 フ ォ ン ト を生成 し ます。 unicode エン コ ーデ ィ ン グで
読み込んだ Type 3 フ ォ ン ト にはグ リ フ 255 個の制約は課 さ れません。

132 第 6 章 : フォン ト
6.2 Unicode のキ ャ ラ ク タ ー と グ リ フ
6.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 でグ リ フ を選ぶ こ と も で き ま


す (136 ページ 「グ リ フ ID エン コ ーデ ィ ン グ」 参照)。 直接 GID 指定は、 グ リ フ数を ク エ
ル し て全グ リ フ を なめ る こ と で フ ォ ン ト の概観表を印刷す る な ど、 特殊な応用で有用で
す。

6.2.2 グ リ フ に対す る Unicode マ ッ ピ ン グ


Unicode マ ッ ピ ン グ と 多義グ リ フ PDFlib は、1 つの フ ォ ン ト の中のすべてのグ リ フ に対
し て Unicode 値を割 り 当て ます。 Unicode 値を利用可能でないグ リ フ を フ ォ ン ト が持っ て
い る こ と も あ り ます。 た と えば Unicode 規格外の異体字グ リ フ (ス ウ ォ ッ シ ュ キ ャ ラ ク
タ ーな ど) ・ 拡張合字 ・ 非テ キ ス ト 記号な ど です。 こ の場合には PDFlib は PUA 値を その
よ う な グ リ フ に割 り 当て ます。
フ ォ ン ト に よ っ ては、 あ る 1 つのグ リ フ を用いて複数の Unicode 値が表現 さ れてい る
こ と があ り ます。こ う い う 多義グ リ フ の よ く あ る 例は、空グ リ フ がU+0020の空白 と U+00A0
の ノ ーブ レ ー ク ス ペー ス の両方を表す場合や、 1 つの グ リ フ が U+2126 のオーム記号 と
U+03A9 のギ リ シ ャ 文字 Ω を表す場合です。
複数の Unicode 値が同一のグ リ フ で表 さ れてい る 場合には、 PDFlib は、 そのグ リ フ を
当該 Unicode 値群の う ちの 1 つへマ ッ プす る ToUnicode CMap を生成 し ます。 その他の
Unicode 値は、同 じ グ リ フ ID を用いて出力 さ れますが、その適切な Unicode 値を ActualText
属性で割 り 当て ら れます。 こ れに よ っ て、 正 し いセマ ン テ ィ ク ス が、 生成 さ れた PDF 出
力の中で も 保たれます。

Acrobat のテキス ト 選択の不具合 不幸な こ と に、 Acrobat DC は と き ど き 、 ActualText 属


性を持っ てい る テ キ ス ト のテ キ ス ト 選択で不具合を起 こ し ます。 選択 ・ ハ イ ラ イ ト さ れな
い グ リ フ が生 じ る のです。 見た目上のハ イ ラ イ ト は欠け てい る のに、 ク リ ッ プボー ド へ
は、 ActualText 属性のテ キ ス ト が正 し く コ ピー さ れます。 こ の選択不具合を回避す る には
以下の手があ り ます :
> そ も そ も 多義グ リ フ を避け る 。
> テ キ ス ト フ ィ ル タ ーオプシ ョ ン actualtext=false を用い る こ と に よ っ て ActualText 属性
の生成を無効化す る 。

6.2 Unicode のキ ャ ラ ク タ ー と グ リ フ 133


と はいえ、 こ れ ら の手法は推奨 さ れません。なぜな ら 、異な る キ ャ ラ ク タ ーが同一 Unicode
値を持っ て出力 さ れて し ま う おそれがあ る ので、 内容の再利用を妨げ る か ら です。

マ ッ プ な し グ リ フ と 私用領域 (PUA) 場 合 に よ っ て は、 あ る 特 定 の グ リ フ に 対 す る
Unicode 値を フ ォ ン ト が提供 し ていない こ と があ り ます。 こ の場合には、PDFlib は Unicode
私用領域 (109 ページ 「5.1 Unicode の重要な諸概念」 参照) 内の値を そのグ リ フ に割 り 振
り ます。 こ の よ う な グ リ フ を マ ッ プ な し グ リ フ と いい ます。 フ ォ ン ト 内のマ ッ プな し グ リ
フ の数は、 PDF_info_font( ) の unmappedglyphs キーワ ー ド で ク エ リ ーする こ と がで き ま
す。 マ ッ プな し グ リ フは、 フ ォ ン ト の検索性 と テ キ ス ト 抽出を制御する ToUnicode CMap
内では Unicode 置換キ ャ ラ ク タ ー U+FFFD で表 さ れます。 結果 と し てマ ッ プな し グ リ フ
は、 生成 さ れた PDF か ら テ キ ス ト と し て正 し く 抽出で き な く な り ます。 ただ し 、 こ の動
作は変更す る こ と も で き 、 それは特に日中韓キ ャ ラ ク タ ーに対 し て有用です。 詳 し く は
177 ページ 「外字キ ャ ラ ク タ ーに対す る PUA 値を温存」 を参照 し て く だ さ い。
PDFlib が PUA 値を マ ッ プな し グ リ フ に割 り 振っ てい く 際には、 以下のプール内の若い
値か ら 順に用いてい き ます :
> 基本 と な る のは基本多言語面 (BMP) 内の Unicode PUA 領域、 すなわち範囲 U+E000 ~
U+F8FF です。 必要であれば こ れに加え、 第 15 面 (U+F0000 to U+FFFFD) 内の PUA
値 も 用い ら れます。
> その フ ォ ン ト が内部的にすでに割 り 振っ てい る PUA 値は、新たな PUA 値を作成する 際
には用い ら れません。
> Adobe 領域 U+F600 ~ F8FF 内の PUA 値は用い ら れません。

生成 さ れ る PUA 値は、1 つの フ ォ ン ト 内で一意です。 あ る フ ォ ン ト 内のグ リ フ に対 し て生


成 さ れ る PUA 値の割 り 振 り は、 他の フ ォ ン ト か ら は独立です。

134 第 6 章 : フォン ト
6.3 フ ォ ン ト を読み込む
6.3.1 テキス ト フ ォ ン ト に対す る エ ン コ ーデ ィ ン グ を選ぶ
フ ォ ン ト は、 明示的に PDF_load_font( ) メ ソ ッ ド で読み込む こ と も で き 、 あ る いは暗黙的
に、 PDF_add/create_textflow( ) や PDF_fill_textblock( ) と い っ た メ ソ ッ ド に fontname ・
encoding オプシ ョ ン を与え る こ と で読み込む こ と も で き ま す。 ど の よ う な方式を用いて
フ ォ ン ト を読み込むのかにかかわ ら ず、適切なエン コ ーデ ィ ン グ を指定す る 必要があ り ま
す。 エン コ ーデ ィ ン グは以下を決定 し ます :
> PDFlib が与え ら れ る テ キ ス ト を ど のテ キ ス ト 形式であ る と 見なすか。
> フ ォ ン ト 内の ど のグ リ フ が使え る か。
> ページ上のテ キ ス ト と フ ォ ン ト 内のグ リ フデー タ が PDF 出力内に ど の よ う に格納 さ れ
る か。

PDFlib のテ キ ス ト 処理は Unicode 規格に基づいてい ます。 今ど き のあ ら ゆ る 開発環境が


Unicode に対応 し てい ますので、 Unicode 文字列を使っ てで き る だけ簡単に PDF 出力を作
成で き る よ う にす る こ と が私たちの目標です。 ただ し 、 Unicode を扱わない開発者はその
アプ リ ケーシ ョ ン を Unicode へ切 り 替え る 必要はあ り ません。 レ ガシエン コ ーデ ィ ン グ も
使 う こ と がで き る か ら です。
ど のエ ン コ ーデ ィ ン グ を選ぶかは、 フ ォ ン ト や、 得 ら れ る テ キ ス ト デー タ や、 い く つ
かのプ ロ グ ラ ミ ン グ的側面に よ っ て決ま り ます。 以下 こ の項では、 さ ま ざ ま な分類のエン
コ ーデ ィ ン グの概観を示す こ と で、 適切なエン コ ーデ ィ ン グ を選ぶための助け と し ます。

Unicode エ ン コ ーデ ィ ン グ encoding=unicode と する と 、Unicode 文字列を PDFlib に渡す


こ と がで き ます。 こ のエン コ ーデ ィ ン グはすべての フ ォ ン ト 形式に対 し て使え ます。 利用
す る 言語バ イ ンデ ィ ン グに よ っ て、 そのプ ロ グ ラ ミ ン グ言語 (Java な ど) が提供 し てい る
Unicode 文字列デー タ 型を利用で き る 場合 も あれば、 Unicode を UTF-8 ・ UTF-16 ・ UTF-
32 のいずれかの形式で リ ト ルエ ンデ ィ ア ン ・ ビ ッ グエ ンデ ィ ア ンのいずれかのバ イ ト 順
序で内容 と し て持つバ イ ト 配列を用い る 場合 も あ り ます (C な ど)。
encoding=unicode では、フ ォ ン ト 内のすべてのグ リ フ が指定で き 、複雑用字系のシ ェー
ピ ン グ と OpenType レ イ ア ウ ト 機能を使 う こ と がで き ます。PDFlib は、要求 さ れた Unicode
値に対す る グ リ フ を フ ォ ン ト が含んでい る か ど う かをチ ェ ッ ク し ます。グ リ フ が得 ら れな
い と き は、 代替グ リ フ を他の フ ォ ン ト か ら 持っ て来 る こ と がで き ます (146 ページ 「6.3.6
フ ォールバ ッ ク フ ォ ン ト 」 参照)。
非 Unicode 対応の言語バ イ ンデ ィ ン グでは、PDFlib はデフ ォ ル ト ではテ キ ス ト が UTF-
16 エン コ ー ド さ れてい る と 見な し ます。 し か し 、 textformat=bytes を指定すればシ ン グル
バ イ ト 文字列を与え る こ と がで き ます。 こ の場合、 こ のバ イ ト 値はキ ャ ラ ク タ ー U+0001
~ U+00FF を、 すなわち基本欧文キ ャ ラ ク タ ー群を持つ先頭 Unicode ブ ロ ッ ク (ISO 8859-
1 と 等価) を表 し ます。 文字参照を利用す る と 、 こ の範囲の外の Unicode 値を シ ン グルバ
イ ト テ キ ス ト 内で指定す る こ と が可能です。

シ ン グルバ イ ト エ ン コ ーデ ィ ン グ 8 ビ ッ ト エン コ ーデ ィ ン グは、テ キ ス ト 文字列内の各


バ イ ト を 1 個のキ ャ ラ ク タ ーへマ ッ プ し ますので、同時に扱え る キ ャ ラ ク タ ーは 255 種類
ま でに制限 さ れます (値 0 は利用で き ません)。 こ の種類のエン コ ーデ ィ ン グはすべての
フ ォ ン ト 形式に対 し て使え ます。 PDFlib は、 選ばれたエン コ ーデ ィ ン グに合っ た グ リ フ を
フ ォ ン ト が含んでい る か ど う かをチ ェ ッ ク し ます。使え る グ リ フ の数が最低限の数に届か
ない と き は、 PDFlib は警告 メ ッ セージ を ロ グ記録 し ます。 選ばれたエン コ ーデ ィ ン グに対
し て使え る グ リ フ が フ ォ ン ト 内で ま っ た く 得 ら れない と き は、 フ ォ ン ト 読み込みは 「font

6.3 フ ォ ン ト を読み込む 135


doesn't support encoding」 と い う メ ッ セージ を出 し て失敗 し ます。 PDFlib は、 要求 さ れた
入力値に対する グ リ フ を フ ォ ン ト が含んでい る か ど う か をチ ェ ッ ク し ます。グ リ フ が得 ら
れない と き は、 代替グ リ フ を他の フ ォ ン ト か ら 持っ て来 る こ と がで き ま す (146 ページ
「6.3.6 フ ォールバ ッ ク フ ォ ン ト 」 参照)。
非 Unicode 対応の言語バ イ ンデ ィ ン グでは、 PDFlib はデフ ォ ル ト ではテ キ ス ト がシ ン
グルバ イ ト エン コ ー ド さ れてい る と 見な し ます。 し か し 、 textformat=utf8 か utf16 を指定
すれば UTF-8 か UTF-16 文字列を与え る こ と がで き ます。
8 ビ ッ ト エン コ ーデ ィ ン グについて詳 し く は 116 ページ 「5.3.3 シ ン グルバ イ ト (8 ビ ッ
ト ) エン コ ーデ ィ ン グ」 で解説 し てい ます。 こ れは さ ま ざ ま な ソ ース か ら 持っ て来る こ と
がで き ます :
> 大量の定義済みエ ン コ ーデ ィ ン グ。 こ れは さ ま ざ ま な シ ス テ ム と さ ま ざ ま な ロ ケール
で利用 さ れてい る 最 も 重要なエン コ ーデ ィ ン グ群を網羅 し てい ます。
> ユーザー定義エ ン コ ーデ ィ ン グ。 こ れは、 外部フ ァ イ ルで与え る か、 ま たは実行時に
PDF_encoding_set_char( ) で動的に構築す る こ と がで き ます。こ のエン コ ーデ ィ ン グは、
グ リ フ名か Unicode 値に基づ く こ と がで き ます。
> オペレーテ ィ ン グ シ ス テ ム か ら 持っ て き たエ ン コ ーデ ィ ン グ。 シ ス テムエ ン コ ーデ ィ
ング と も いい ます。 こ の機能は、 Windows と IBM System i ・ IBM Z で利用可能です。

ビル ト イ ン エ ン コ ーデ ィ ン グ encoding=builtin を指定す る と 、 記号フ ォ ン ト 内の非テ キ


ス ト グ リ フ に対す る シ ン グルバ イ ト コ ー ド を使 う こ と がで き ます。フ ォ ン ト の ビル ト イ ン
エン コ ーデ ィ ン グはフ ォ ン ト の種類に よ っ て異な り ます :
> TrueType ア ウ ト ラ イ ン を持つ OpenType フ ォ ン ト : こ のエン コ ーデ ィ ン グは、フ ォ ン ト
のシ ン ボ リ ッ ク cmap に、 すなわち cmap テーブル内の (3, 0) エン ト リ ーに基づいて作
成 さ れます。こ のエン ト リ ーが存在 し ない場合には encoding=bultin を使用で き ません。
> OpenType CFF フ ォ ン ト はエン コ ーデ ィ ン グ を CFF テーブル内に含んでい る こ と があ
り ます。
> Type 3 の場合、ビル ト イ ンエン コ ーデ ィ ン グはフ ォ ン ト の先頭 255 グ リ フ に よ っ て定義
さ れます。

フ ォ ン ト がビル ト イ ンエン コ ーデ ィ ン グ を何 ら 含んでいない と き は、フ ォ ン ト 読み込みは


失敗 し ます (OpenType 日中韓フ ォ ン ト な ど)。 PDF_info_font( ) で symbolfont キーを用い
る こ と も で き ます。 こ れが false を返 し たな ら 、 その フ ォ ン ト はテ キ ス ト フ ォ ン ト であ り 、
広 く 利用 さ れてい る エン コ ーデ ィ ン グのいずれかで読み込む こ と がで き ます。 symbolfont
キーが true を返 し たな ら それはで き ません。 記号フ ォ ン ト 内のグ リ フは、 各グ リ フ に対
応す る コ ー ド がわか っ てい る 場合にのみ利用する こ と が可能です (137 ページ 「6.3.2 記号
フ ォ ン ト に対す る エン コ ーデ ィ ン グ を選ぶ」 参照)。
非 Unicode 対応の言語バ イ ンデ ィ ン グでは、 PDFlib はデフ ォ ル ト ではテ キ ス ト がシ ン
グルバ イ ト であ る と 見な し ます。 こ れは、 い く つかの記号フ ォ ン ト での指定に伝統的に使
われてい る シ ン グルバ イ ト 値を使え る と い う 利点があ り ます。 こ れは他のエン コ ーデ ィ ン
グでは不可能です。 し か し 、 textformat=utf16 な ど を指定すればテ キ ス ト を Unicode 形式
で与え る こ と がで き ます。
encoding=builtin の難点は、 シ ン グルバ イ ト エン コ ー ド さ れたテ キ ス ト 内では文字参照
が使え ない こ と です。

グ リ フ ID エ ン コ ーデ ィ ン グ PDFlib では encoding=glyphid をすべての フ ォ ン ト 形式に対


し て使え ます。 こ のエン コ ーデ ィ ン グでは、 133 ページ 「6.2.1 グ リ フ ID」 で解説する 付
番方式を用いて、 フ ォ ン ト 内のすべてのグ リ フ が指定で き ます。 数値グ リ フ ID は 0 ~

136 第 6 章 : フォン ト
65,565 の値を と れます。 最大グ リ フ ID 値は PDF_info_font( ) で maxcode キーを用いて ク
エ リ ーで き ます。
非 Unicode 対応の言語バ イ ンデ ィ ン グでは、 PDFlib はデフ ォ ル ト (textformat=utf16)
ではテ キ ス ト がダブルバ イ ト バ イ ト エン コ ー ド さ れてい る と 見な し ます。
PDFlib は、 与え ら れた グ リ フ ID が フ ォ ン ト 内で有効であ る か ど う かをチ ェ ッ ク し ま
す。 複雑用字系のシ ェ ーピ ン グ と OpenType レ イ ア ウ ト 機能が使え ます。
グ リ フ ID はフ ォ ン ト 固有であ り 、 場合に よ っ ては PDFlib に よ っ て作成 さ れ る こ と も
あ る ので、 encoding=glyphid は一般に通常のテ キ ス ト 出力には適 し ません。 こ のエン コ ー
デ ィ ン グの主な用途は、アプ リ ケーシ ョ ンがすでにグ リ フ ID を使用 し てい る 場合 と 、フ ォ
ン ト のグ リ フ一覧を印刷 し たい場合です。

6.3.2 記号 フ ォ ン ト に対す る エ ン コ ーデ ィ ン グ を選ぶ


記号フ ォ ン ト は、 記号 ・ ロ ゴ ・ ピ ク ト グ ラ ム な ど の非テ キ ス ト グ リ フ群を内容 と し て持つ
フ ォ ン ト です。 こ れは、 テ キ ス ト フ ォ ン ト にはないい く つかの問題を提起 し ます。 背景に
あ る 問題は、 Unicode 規格は一般に あ え て記号グ リ フ を エ ン コ ー ド し ていない こ と です
(ZapfDingbats フ ォ ン ト 内のグ リ フ な ど、 こ の規則には例外 も あ り ますが)。 記号フ ォ ン ト
を Unicode ワー ク フ ロ ーに適合 し て利用で き る よ う にする ため、TrueType・OpenType フ ォ
ン ト はたいていそのグ リ フ に私用領域(PUA)内の Unicode 値を割 り 当ててい ます。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 値を テ キ ス ト で用い る


必要があ り ます :
> Wingdings ・ Webdings な ど Microsoft の記号フ ォ ン ト は、範囲 U+F020 ~ U+F0FF の PUA
Unicode 値を用いてい ます。
> それ以外の フ ォ ン ト については、フ ォ ン ト 内の個々のグ リ フ に対す る Unicode 値を あ ら
か じ め知っ てお く か、 ま たは実行時に PDF_info_font( ) で決定する 必要があ り ます。

制御キ ャ ラ ク タ ー 表 9.1 に挙げ る 範囲 U+0001 ~ U+001F の Unicode 制御キ ャ ラ ク タ ー


は、 encoding=builtin で も テ キ ス ト フ ロ ー内で使え ます。 0x20 未満の コ ー ド は、 記号フ ォ
ン ト がその コ ー ド に対す る グ リ フ を持たないな ら ば、制御キ ャ ラ ク タ ー と し て解釈 さ れま
す。 こ れは大多数の記号フ ォ ン ト にあ ては ま り ます。
ラ イ ン フ ィ ー ド キ ャ ラ ク タ ーに対す る コ ー ド は ASCII と EBCDIC と で異な っ てい ます
ので、 EBCDIC シ ス テ ム上で リ テ ラ ルな キ ャ ラ ク タ ー 0x0A を使 う こ と は避け、 オプシ ョ

6.3 フ ォ ン ト を読み込む 137


ン escapesequence=true を用いて PDFlib のエ ス ケープシーケ ン ス \n を使 う こ と を推奨 し
ます。 こ の \n は PDFlib API ま で届 く 必要があ る こ と に留意 し て く だ さ い。 た と えば C で
は \\n と 書 く 必要があ り ます。

文字参照 文字参照は記号フ ォ ン ト に対 し て使 う こ と がで き ます。し か し 記号フ ォ ン ト は


一般に、 文字参照を開始す る ア ンパサン ド キ ャ ラ ク タ ー U+0026 「&」 に対する グ リ フ を含
んでい ません。 コ ー ド 0x26 も 、 フ ォ ン ト 内の既存のグ リ フへマ ッ プで き ないので使え ま
せん。 ですので記号フ ォ ン ト は、 文字参照を使 う 必要があ る と き は、 encoding=unicode で
読み込む必要があ り ます。 文字参照は encoding=builtin では動作 し ません。

6.3.3 例 : Wingdings 記号 フ ォ ン ト 内のグ リ フ を選択


記号フ ォ ン ト 内のキ ャ ラ ク タ ーを選択す る には さ ま ざ ま な方法があ り 、なかには望みの出
力が得 ら れない も の も あ り ますので、 例を見てみま し ょ う 。

フ ォ ン ト 内のキ ャ ラ ク タ ー を理解 まず、フ ォ ン ト 内の、 タ ーゲ ッ ト と する キ ャ ラ ク タ ー


についてい く つかの情報を収集 し ま し ょ う 。 こ れには Windows の 「文字コ ー ド 表」 アプ リ
ケーシ ョ ン を利用 し ます (図 6.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 値 ・ グ リ フ名 ・ コ ー ド のいずれか を ク エ リ ーする こ と


も で き ます。 152 ページ 「6.5.2 フ ォ ン ト 依存のエン コ ーデ ィ ン グ ・ Unicode ・ グ リ フ名 ク
エ リ ー」 を参照 し て く だ さ い。

記号キ ャ ラ ク タ ー を PDFlib で指定 タ ーゲ ッ ト と する キ ャ ラ ク タ ーに関 し て得 ら れ る 情


報に応 じ て、 Windings の smileface グ リ フ を選択する 方法はい く つかあ り ます :

138 第 6 章 : フォン ト
図 6.1
Windows の文字 コ ー ド 表
で Wingdings フ ォ ン ト

> その フ ォ ン ト 内のそのキ ャ ラ ク タ ーに割 り 当て ら れてい る PUA Unicode 値がわかっ て


い る な ら 、 数値文字参照を使え ます (123 ページ 「数値文字参照」 参照) :
&#xF04A;

UTF-8 で作業 し てい る 場合には、 その対応す る 3 バ イ ト 列を使え ます :


\xEF\x81\x8A

Unicode 値は、 encoding=builtin と textformat=bytes の組み合わせでは使え ません。


> 文字 コ ー ド がわか っ てい る な ら 、バ イ ト 値参照を使え ます (124 ページ 「バ イ ト 値参照」
参照) :
&.#x4A;

非 Unicode 対応言語バ イ ンデ ィ ン グでは、 encoding=builtin かつ textformat=bytes な ら


ば、 文字 コ ー ド を直接指定で き ます :
J
\x4A

> グ リ フ名がわか っ てい る な ら 、 グ リ フ名参照を使え ます (123 ページ 「グ リ フ名参照」


参照) :
&.smileface;

グ リ フ名は、 encoding=builtin と textformat=bytes の組み合わせでは使え ません。

表 6.2 に、 Java ・ .NET な ど Unicode 対応言語バ イ ンデ ィ ン グの場合の方法を挙げます。


表 6.3 に、 C な ど非 Unicode 対応言語バ イ ンデ ィ ン グの場合の方法を挙げます。

6.3 フ ォ ン ト を読み込む 139


表 6.2 Unicode 対応言語バイ ンデ ィ ング (Java な ど) で Wingdings フ ォ ン ト 内の smileface グ リ フ を指定

エン コー
デ ィ ング 追加オプ シ ョ ン 入力文字列 ページ上の印字結果
1
\uF04A 
charref &#xF04A; 
unicode charref &.#x4A; 
charref &.smileface; 
2
J (スペースか .notdef)

escapesequence \x4A (スペースか .notdef)

builtin (encoding=unicode で上記 と 同 じ )

1. U+F04A に対する、 Java な ど多 く の Unicode 対応言語での文字列文法


2. バイ ト コ ー ド \x4A に対する Winansi キ ャ ラ ク タ ー

表 6.3 C な ど非 Unicode 対応言語バイ ンデ ィ ングで Wingdings フ ォ ン ト 内の smileface グ リ フ を指定

エン コー
デ ィ ング textformat 追加オプ シ ョ ン 入力文字列 ページ上の印字結果
1
utf16 \xF0\x4A 
charref &#xF04A; 
charref &.#x4A; 
charref &.smileface; 
utf8, bytes
unicode
textformat=utf8 な 
ら : ï•ã 2

textformat=bytes (スペースか .notdef)


なら : J3

escapesequence4 textformat=utf8 な 
ら:\xEF\x81\x8A5

escapesequence textformat=bytes (スペースか .notdef)


なら:\x4A

utf16, utf8 (encoding=unicode で上記 と 同 じ )

charref &#xF04A; 


charref &.#x4A; 
builtin
bytes charref &.smileface; 
J 
escapesequence \x4A 
1. バイ ト 順序に応 じ て、\xF0\x4A か \x4A\xF0 のいずれかで表す必要があ り ます。なお、\x は C のエ スケープ文法を示 し ています
2. 3 バイ ト 列 \xEF \x81 \x8A に対する Winansi キ ャ ラ ク タ ー群
3. バイ ト コ ー ド \x4A に対する Winansi キ ャ ラ ク タ ー
4. こ の escapesequence オプ シ ョ ンは、 直接バイ ト 値のための文法が何も ないプ ロ グ ラ ミ ン グ言語でのみ必要です。

140 第 6 章 : フォン ト
5. U+F04A に対する 3 バイ ト UTF-8 列

6.3.4 フ ォ ン ト を検索
フ ォ ン ト デー タ の ソ ース 先述の よ う に、 フ ォ ン ト は明示的に PDF_load_font( ) メ ソ ッ ド
で 読み込む こ と も で き ま す し 、 あ る い は暗黙的 に、 さ ま ざ ま な テ キ ス ト 出力関数 に
fontname オプシ ョ ン を与え て読み込む こ と も で き ます。 フ ォ ン ト のネ イ テ ィ ブな名前を
使 う こ と も で き ます し 、 フ ォ ン ト デー タ の場所を決定す る ために用い ら れ る 任意のカ ス タ
ム名を扱 う こ と も で き ます。 カ ス タ ム フ ォ ン ト 名は文書内で一意であ る 必要があ り ます。
PDF_info_font( ) で、 こ のフ ォ ン ト 名は apiname キーで ク エ リ ーす る こ と がで き ます。
同 じ フ ォ ン ト 名で PDF_load_font( ) を続けて呼び出す と 、すべてのオプシ ョ ンが こ の メ
ソ ッ ド を最初に呼び出 し た際に与え た も の と 等 し ければ、同 じ フ ォ ン ト ハン ド ルが返 さ れ
ます (扱いが異な る オプシ ョ ンが若干あ り ますので、 詳 し く は PDFlib API リ フ ァ レ ン ス を
参照) 。 そ う でなければ、 同 じ フ ォ ン ト 名に対 し て新規の フ ォ ン ト ハン ド ルが作成 さ れま
す。 PDFlib ではフ ォ ン ト デー タ の ソ ース と し て以下に対応 し てい ます :
> デ ィ ス ク ベース ま たは仮想の フ ォ ン ト フ ァ イ ル
> Windows か macOS オペレーテ ィ ン グ シ ス テ ムか ら 持っ て来た フ ォ ン ト (ホ ス ト フ ォ ン
ト)
> PDF 標準フ ォ ン ト : こ れ ら は、 よ く 知 ら れた名前の少数の欧文フ ォ ン ト です
> PDF_begin_font( ) お よ び関連関数群で定義 さ れた Type 3 フ ォ ン ト

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の fonts/font_configuration ト ピ ッ ク にあ り ます。

フ ォ ン ト リ ソ ース リ ス ト を自動生成 enumeratefonts オプシ ョ ン を用い る と 、 検索パ ス


上で得 ら れ る すべての フ ォ ン ト を収集す る よ う PDFlib に命令する こ と がで き ます(61 ペー
ジ 「フ ァ イ ル検索 と SearchPath リ ソ ース カ テ ゴ リ ー」 参照)。 saveresources オプシ ョ ン を
用い る と 、 PDFlib リ ソ ース のカ レ ン ト リ ス ト を フ ァ イ ルへ書き 出す こ と がで き ます :
/* フォントを検索パスに直接追加 */
p.set_option("searchpath={{C:/fonts} {D:/fonts}}");

/* 検索パス上のすべてのフォントをなめてUPRファイルを作成 */
p.set_option("enumeratefonts saveresources={filename=C:/pdflib.upr}");

す る と 、 指定 し たデ ィ レ ク ト リ 群の中にあ る すべての利用可能な フ ォ ン ト が、 生成 さ れ る
UPR フ ァ イ ルの中に リ ス ト さ れますので、 以後使用可能 と な り ます。

フ ォ ン ト 名エ イ リ ア ス設定 フ ォ ン ト はそれぞれ、 任意の数のエ イ リ ア ス 名を持つ こ と


がで き ま す。 こ れは、 物理フ ォ ン ト へマ ッ プす る 必要が あ る 擬似 ま たは仮想名を通 じ て
フ ォ ン ト を要求す る 場面で有用で し ょ う 。 フ ォ ン ト 名エ イ リ ア ス は、 以下の例の よ う に、
FontnameAlias リ ソ ース カ テ ゴ リ ー (60 ページの表 3.1 参照) で作成で き ます :
p.set_option("FontnameAlias={sans Helvetica}");

左のエ イ リ ア ス名は、 任意に選ぶ こ と がで き 、 そ し て こ れを用いて、 その フ ォ ン ト を その


新 し いエ イ リ ア ス 名の も と に読み込む こ と がで き ま す。 右の名前は、 フ ォ ン ト の有効な
API 名、 た と えばホ ス ト フ ォ ン ト や、 フ ォ ン ト リ ソ ース カ テ ゴ リ ー FontOutline な ど の う
ちの一つで フ ォ ン ト リ ソ ースへ紐付け ら れてい る フ ォ ン ト の名前であ る 必要があ り ます。

6.3 フ ォ ン ト を読み込む 141


フ ォ ン ト に対す る検索順序 PDFlib に与え ら れ る フ ォ ン ト 名は名前文字列です。 指定 さ
れた名前がフ ォ ン ト 名エ イ リ ア ス であ る 場合には、それはその対応す る API フ ォ ン ト 名へ
置き 換え ら れます。 PDFlib は API フ ォ ン ト 名を使っ て、 さ ま ざ ま な種類の フ ォ ン ト を後述
の順序で探 し ます。 こ の検索処理は、 使え る フ ォ ン ト が ス テ ッ プの 1 つで見つか る と と も
に終わ り ます :
> フ ォ ン ト 名が、PDF_begin_font( ) を用いて生成 さ れていた Type 3 フ ォ ン ト の名前 と 一致
す る (131 ページ 「6.1.7 Type 3 フ ォ ン ト 」 を参照)。
> フ ォ ン ト 名が、フ ォ ン ト 名を TrueType ま たは OpenType フ ォ ン ト フ ァ イ ルの名前 と 紐づ
け る FontOutline リ ソ ース内の名前 と 一致する 。
> フ ォ ン ト 名が、 フ ォ ン ト 名を シ ス テ ムに イ ン ス ト ール さ れてい る フ ォ ン ト の名前 と 紐
づけ る HostFont リ ソ ース内の名前 と 一致す る 。
> フ ォ ン ト 名が欧文 コ ア フ ォ ン ト の名前 と 一致す る (143 ページ 「標準 Type 1 フ ォ ン ト
(欧文 コ ア フ ォ ン ト )」 参照)。
> フ ォ ン ト 名が、 シ ス テ ム に イ ン ス ト ール さ れてい る ホ ス ト フ ォ ン ト の名前 と 一致す る
(144 ページ 「6.3.5 Windows ・ macOS 上のホ ス ト フ ォ ン ト 」 参照)。
> フ ォ ン ト 名が フ ォ ン ト フ ァ イ ルのベース名 (すなわち フ ァ イ ル名接尾辞を除いた名前)
と 一致す る 。

フ ォ ン ト が見つか ら なか っ た と き は、 フ ォ ン ト 読み込みは Font not found と い う メ ッ セー


ジ を出 し て止ま り ます。
さ ま ざ ま な リ ソ ース カ テ ゴ リ ーについて詳 し く は 59 ページ「3.1.4 リ ソ ース構成 と フ ァ
イ ル検索」 を参照 し て く だ さ い。 以下の各項では、 さ ま ざ ま な分類の フ ォ ン ト に対す る
フ ォ ン ト 読み込みについて さ ら に詳 し く 解説 し てい き ます。

TrueType ・ OpenType ・ WOFF/WOFF2 フ ォ ン ト フ ォ ン ト 名は、 使


いたい フ ォ ン ト フ ァ イ ルの名前に対 し て、 FontOutline リ ソ ース を通
じ て紐づけ る 必要があ り ます :
p.set_option("FontOutline={Arial=/usr/fonts/Arial.ttf}");
font = p.load_font("Arial", "unicode", "");

等号の左側のフ ォ ン ト 名 (フ ォ ン ト の API 名 と いい ます) は任意に


選べます :
p.set_option("FontOutline={f1=/usr/fonts/Arial.ttf}");
font = p.load_font("f1", "unicode", "");

実行時に PDF_set_option( ) で構成する のでな く 、 UPR フ ァ イ ル内で FontOutline リ ソ ース


を構成する こ と も で き ます (59 ページ 「3.1.4 リ ソ ース構成 と フ ァ イ ル検索」 参照)。 絶対
フ ァ イ ル名を避け る ため、 SearchPath リ ソ ース カ テ ゴ リ ーを用い る こ と も で き ます ( こ の
場合 も 、SearchPath リ ソ ース カ テ ゴ リ ーを UPR フ ァ イ ル内で構成する こ と も 可能です)。例:
p.set_option("SearchPath={{/usr/fonts}}");
p.set_option("FontOutline={f1=Arial.ttf}");
font = p.load_font("f1", "unicode", "");

TrueType ・ OpenType コ レ ク シ ョ ン TrueType ま たは OpenType コ レ ク シ ョ ン


(TTC。 175 ページ 「7.6.1 TrueType ・ OpenType 日中韓フ ォ ン ト を用い る 」 参照)
フ ァ イ ル内に含ま れてい る フ ォ ン ト を選ぶには、 その フ ォ ン ト の名前を直接指
定 し ます :

142 第 6 章 : フォン ト
p.set_option("FontOutline={MS-Gothic=msgothic.ttc}");
font = p.load_font("MS-Gothic", "unicode", "");

フ ォ ン ト 名は、 TTC/OTC フ ァ イ ル内のすべてのフ ォ ン ト の名前 と 照合 さ れます。 あ る い


は、 TTC/OTC フ ァ イ ル内の n 番目の フ ォ ン ト を選ぶには、 フ ォ ン ト 名の後に コ ロ ン をつ
けて番号 n を指定する こ と がで き ます。 こ の場合は、 等号の左側の API フ ォ ン ト 名は任意
に選べます :
p.set_option("FontOutline={f1=msgothic.ttc}");
font = p.load_font("f1:0", "unicode", "");

標準 Type 1 フ ォ ン ト (欧文 コ ア フ ォ ン ト ) PDFlib は、 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 はその フ ォ ン ト を標準 Type 1 フ ォ ン ト の リ ス ト の中で探 し ます。

ホ ス ト フ ォ ン ト フ ォ ン ト 名が リ ソ ー ス を通 じ ていかな る フ ァ イ ル名へ も 紐づけ ら れて


いない と き は、 PDFlib はそのフ ォ ン ト を、 Windows か macOS に イ ン ス ト ール さ れてい る
フ ォ ン ト の リ ス ト 内で探 し ま す。 シ ス テ ム に イ ン ス ト ール さ れてい る フ ォ ン ト を ホ ス ト
フ ォ ン ト と いい ます。 ホ ス ト フ ォ ン ト の名前は ASCII でエン コ ー ド さ れてい る 必要があ り
ます。 Windows では Unicode も 使え ます。 ホ ス ト フ ォ ン ト について詳 し く は 144 ページ
「6.3.5 Windows ・ macOS 上のホ ス ト フ ォ ン ト 」 を参照 し て く だ さ い。 例 :
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");

フ ォ ン ト フ ァ イ ルを拡張子に基づいて検索 Type 3 以外のすべての種類の フ ォ ン ト は、


指定 さ れた フ ォ ン ト 名を フ ォ ン ト フ ァ イ ルのベース名 (フ ァ イ ル接尾辞の一切ない名前)
と し て用いて検索する こ と がで き ます。 PDFlib は、 指定 さ れた名前の フ ォ ン ト が見つか ら
ない と き には、SearchPath リ ソ ース カ テ ゴ リ ー内に リ ス ト さ れてい る すべてのデ ィ レ ク ト
リ ーを なめなが ら 、 与え ら れた フ ァ イ ル名に対 し て、 知 ら れてい る すべての フ ァ イ ル名接
尾辞を付加す る こ と に よ っ て、 フ ォ ン ト フ ァ イ ルを見つけ よ う と 試みます。 こ の拡張子に
基づ く 検索は具体的には以下の よ う な アルゴ リ ズ ムです :

6.3 フ ォ ン ト を読み込む 143


> 以下の接尾辞を フ ォ ン ト 名に付加 し てで き る フ ァ イ ル名の フ ォ ン ト フ ァ イ ルがあ る か
ど う か を順番に調べます :
.ttf .otf .woff .ttf.woff .otf.woff .woff2 .ttf.woff2 .otf.woff2 .ttc .otc .tte .gai
.TTF .OTF .WOFF .TTF.WOFF .OTF.WOFF .WOFF2 .TTF.WOFF2 .OTF.WOFF2 .TTC .OTC .TTE .GAI

> 上述の候補フ ァ イ ル名群を 「あ り の ま ま に」 検索 し 、 ついで、 SearchPath リ ソ ース カ テ


ゴ リ ー内で構成 さ れてい る すべてのデ ィ レ ク ト リ ー名を前につけて検索 し ます。

こ れはすなわち、 手作業で一切構成を し な く て も 、 も し も その対応する フ ォ ン ト フ ァ イ ル


名が、フ ォ ン ト の種類に従っ た標準的な フ ァ イ ル名接尾辞を フ ォ ン ト 名に付加 し た名前か
ら 成っ てお り 、 かつ SearchPath デ ィ レ ク ト リ ーのいずれかの中に置かれてい る な ら ば、
PDFlib はその フ ォ ン ト を発見す る と い う こ と を意味 し ます。
以下の ス テー ト メ ン ト 群のグループ群は、 フ ォ ン ト ア ウ ト ラ イ ン フ ァ イ ルを見つけ る
う えで同等の効力を持ち ます :
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", "");

Type 3 フ ォ ン ト Type 3 フ ォ ン ト は、 実行時に、 PDFlib のグ ラ フ ィ ッ ク メ ソ ッ ド 群を用


いて グ リ フ を定義す る こ と に よ っ て定義す る 必要があ り ます (131 ページ 「6.1.7 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", "");

6.3.5 Windows ・ macOS 上のホ ス ト フ ォ ン ト


macOS ・ Windows では PDFlib は、 オペレーテ ィ ン グ シ ス テ ムに イ ン ス ト ール さ れてい る
フ ォ ン ト を利用す る こ と がで き ます。 こ う し た フ ォ ン ト を ホス ト フ ォ ン ト と いい ます。 手
作業で フ ォ ン ト フ ァ イ ルを構成 し な く て も 、その フ ォ ン ト を単純にシ ス テ ムに イ ン ス ト ー
ルすれば、 PDFlib はそれを使用 し ます。
ホ ス ト フ ォ ン ト を扱 う 際には、 その正確な、 大文字 ・ 小文字を区別 し た フ ォ ン ト 名を
用 い る こ と が 重 要 で す。 ホ ス ト フ ォ ン ト 検索 は、 PDF_set_option( ) のオプシ ョ ン
usehostfonts=false を用いて無効にす る こ と も 可能です。

macOS 上のホ ス ト フ ォ ン ト 名 フ ォ ン ト を取得す る には、標準 TrueType/OpenType フ ォ


ン ト 名、 す な わ ち フ ォ ン ト の名称 テ ー ブ ル の中の 「完全 フ ォ ン ト 名」 を 使用 し ま す。
FontBook アプ リ ケーシ ョ ン を使 う こ と に よ っ て、 イ ン ス ト ール さ れてい る フ ォ ン ト 群の
名前を知 る こ と がで き ます。

144 第 6 章 : フォン ト
Windows 上のホ ス ト フ ォ ン ト 名 イ ン ス ト ール さ れてい る フ ォ ン ト の名前は、 その フ ォ
ン ト フ ァ イ ルを ダブル ク リ ッ ク し て、現れ る ウ ィ ン ド ウ の ウ ィ ン ド ウ タ イ ト ルに表示 さ れ
る 完全フ ォ ン ト 名を見れば知 る こ と がで き ます。フ ォ ン ト に よ っ ては、使っ てい る Windows
のバージ ョ ンに従っ てその名前の一部が ロ ーカ ラ イ ズ さ れてい る こ と も あ り ます。た と え
ば、 フ ォ ン ト 名の一部 と し て広 く 使われてい る Bold は、 ド イ ツ語シ ス テ ム上では翻訳 さ
れた単語 Fett と し て表示 さ れ る こ と があ り ます。 Windows シ ス テ ムか ら ホ ス ト フ ォ ン ト
デー タ を取得す る には、 変換 さ れた形の フ ォ ン ト 名 (Arial Fett な ど) を PDFlib で用い る
か、 あ る いは フ ォ ン ト ス タ イ ル名 (後述) を用い る 必要が あ り ま す。 し か し 、 フ ォ ン ト
デー タ を フ ァ イ ルか ら 直接取得す る には、 正規の ( ロ ーカ ラ イ ズ さ れていない) 形の フ ォ
ン ト 名 (Arial Bold な ど) を用い る 必要があ り ます。

注 こ の国際化の問題は、 ロー カ ラ イ ズ さ れた形の フ ォ ン ト 名を用いるのでな く 、 フ ォ ン ト ス


タ イル名 (「,Bold」 な ど、 後述) を付加する こ と によ っ て回避する こ と がで き ます。

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 のス タ イル名は、 フ ォ ン ト ス タ イルのロー カ ラ イ ズ さ れた名


前にかかわら ずそれを選択 し ますので、ロー カ ラ イ ズ さ れた フ ォ ン ト 名を扱 う 必要がある
と き には有用で し ょ う 。

6.3 フ ォ ン ト を読み込む 145


Windows の フ ォ ン ト 代替 Windows は、 特定の レ ジ ス ト リ ーエ ン ト リ ー群に基づいて、
自動的にフ ォ ン ト を代替す る こ と があ り ます。 こ の種の フ ォ ン ト 代替は、 PDFlib のホ ス ト
フ ォ ン ト 機構に も 影響を与え ますが、 Windows オペレーテ ィ ン グ シ ス テ ムの完全制御下に
あ り ます。 以下の レ ジ ス ト リ ーエン ト リ ーに よ っ て、 た と えば、 Helvetica フ ォ ン ト が必要
な と き に Windows がかわ り に Arial を届け る こ と も あ り え ます :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes

Windows の フ ォ ン ト 代替に関す る 詳 し い情報については、Microsoft の文書を参照 し て く だ


さ い。

6.3.6 フ ォ ールバ ッ ク フ ォ ン ト
注 フ ォ ールバ ッ ク フ ォ ン ト は、 encoding=glyphid の場合には使用で き ません。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の fonts/starter_fallback ト ピ ッ ク にあ り ます。

フ ォールバ ッ ク フ ォ ン ト は、フ ォ ン ト と エン コ ーデ ィ ン グの不足な点を扱 う 強力な し く み


を提供 し ます。 複数の用字系のための フ ォ ン ト 群を合成す る のに も 役立ち ます。 た と えば
ア ラ ビ ア語用字系のためのフ ォ ン ト は、欧文キ ャ ラ ク タ ーに対応 し ていない こ と があ り え
ます。 必要な フ ォ ン ト 切替が PDFlib に よ っ て自動的に行われますので、 フ ォールバ ッ ク
フ ォ ン ト は さ ま ざ ま な場面でテ キ ス ト 出力の実現に活用する こ と がで き ます。 こ の し く み
は、 所与の フ ォ ン ト (ベース フ ォ ン ト と いい ます) を、 こ のベース フ ォ ン ト 内のグ リ フ に
加え て他の 1つない し 複数の フ ォ ン ト 内のグ リ フ を使用する こ と に よ っ て強化する も ので
す。 フ ォールバ ッ ク フ ォ ン ト は以下の機能を提供 し ます :
> ベース フ ォ ン ト 内で得 ら れないグ リ フは自動的に、 1 つない し 複数の フ ォールバ ッ ク
フ ォ ン ト 内で検索 さ れ ます。 言い換えれば、 フ ォ ン ト にグ リ フ を追加す る こ と が可能
です。 複数の フ ォ ールバ ッ ク フ ォ ン ト をベース フ ォ ン ト に対 し て紐付け る こ と が可能
ですので、 少な く と も 1 つの フ ォ ン ト が適切な グ リ フ を含んでい る Unicode キ ャ ラ ク
タ ーをすべて有効に使 う こ と がで き ます。
> あ る 特定の フ ォールバ ッ ク フ ォ ン ト 内のグ リ フ を用いて、 ベース フ ォ ン ト 内のグ リ フ
を オーバー ラ イ ド す る こ と がで き ます。 すなわち、 フ ォ ン ト 内のグ リ フ を置 き 換え る
こ と が可能です。1 つない し 複数の個別のグ リ フ を置き 換え る こ と も で き ます し 、 あ る
いは置 き 換えたい Unicode キ ャ ラ ク タ ー群の範囲を 1 つない し 複数指定する こ と も で
き ます。
> フ ォ ールバ ッ ク フ ォ ン ト か ら のグ リ フ の寸法 と 縦位置は、 ベース フ ォ ン ト に合 う よ う
調整で き ます。

驚 く か も し れませんが、ベース フ ォ ン ト 自身を フ ォールバ ッ ク フ ォ ン ト と し て使 う こ と も


可能です。 こ れを利用す る と 以下の ト リ ッ ク が実装で き ます :
> その フ ォ ン ト の一部ない し 全部のグ リ フ の寸法か位置を調節。
> ベース フ ォ ン ト の実際のエン コ ーデ ィ ン グの外にキ ャ ラ ク タ ーを追加。

フ ォールバ ッ ク フ ォ ン ト 機構は、 fallbackfonts フ ォ ン ト オプシ ョ ンに よ っ て制御 さ れ、 す


べてのテ キ ス ト 出力関数に対 し て効力を持ち ま す。 あ ら ゆ る フ ォ ン ト オプシ ョ ン と 同様
に、 fallbackfonts オプシ ョ ンは PDF_load_font( ) への明示的な呼び出 し で与え る こ と も で
き ます し 、あ る いは暗黙的フ ォ ン ト 読み込みのためのオプシ ョ ン リ ス ト 内で与え る こ と も
で き ます。 1 つのベース フ ォ ン ト に対 し ては複数の フ ォールバ ッ ク フ ォ ン ト を指定する こ
と も 可能な こ と か ら 、 fallbackfonts オプシ ョ ンは値 と し てオプシ ョ ン リ ス ト の リ ス ト を と
り ます。 すなわち、 中括弧がそのぶん必要です。

146 第 6 章 : フォン ト
PDF_info_font( ) を利用す る と 、 フ ォールバ ッ ク フ ォ ン ト 機構の結果を ク エ リ ーす る こ
と がで き ます (153 ページ 「6.5.3 コ ー ド ページ網羅性 と フ ォ ールバ ッ ク フ ォ ン ト を ク エ
リ ー」 参照)。

注意 フ ォールバ ッ ク フ ォ ン ト を扱 う 際には以下に留意 し て く だ さ い :
> フ ォ ン ト の組み合わせは必ず し も 、 タ イ ポ グ ラ フ ィ ー的に美 し い結果を生み出すわけ
ではあ り ません。 ベー ス フ ォ ン ト のグ リ フデザ イ ン に整合す る グ リ フデザ イ ン を持つ
フ ォールバ ッ ク フ ォ ン ト だけ を使 う よ う 注意を払 う 必要があ り ます。
> フ ォールバ ッ ク フ ォ ン ト に対す る フ ォ ン ト オプシ ョ ンは、fallbackfonts オプシ ョ ン リ ス
ト 内で別途指定す る 必要があ り ます。
> 用字系固有のシ ェーピ ン グ (オプシ ョ ン shaping ・ script ・ locale) と OpenType 機能 (オ
プシ ョ ン features ・ script ・ language) は、 同一フ ォ ン ト 内のグ リ フ群に対 し てのみ適
用 さ れ、 ベース フ ォ ン ト と フ ォ ールバ ッ ク フ ォ ン ト と にわた る グ リ フ群に対 し ては適
用 さ れません。
> 下線 / 上線 / 取 り 消 し 線機能は、フ ォールバ ッ ク フ ォ ン ト を扱 う 際には注意 し て使 う 必
要があ り ます。アセ ン ダーな ど の タ イ ポグ ラ フ ィ ー値について も 同様です。ベース フ ォ
ン ト 内で決定 さ れ る 下線の太 さ ・ 位置は、 フ ォ ールバ ッ ク フ ォ ン ト 内の値 と は一致 し
ない可能性があ り ます。 その場合、 下線の位置 ま たは太 さ が見苦 し く ガ タ つ く こ と に
な り ます。 こ の問題に対す る 単純な回避策は、 統一的な値を、 PDF_fit_textline( ) ・ PDF_
add/create_textflow( ) の underlineposition ・ underlinewidth オプシ ョ ンで指定す る こ と
です。 こ の値は、 ベー ス フ ォ ン ト と すべての フ ォ ールバ ッ ク フ ォ ン ト において う ま く
い く よ う に選ぶ必要があ り ます。

以下の各項で、 フ ォールバ ッ ク フ ォ ン ト の重要な用途をい く つか解説 し 、 その対応す る オ


プシ ョ ン リ ス ト を演示 し ます。

カ ラ ー絵文字キ ャ ラ ク タ ー を テキス ト フ ォ ン ト に追加 絵文字キ ャ ラ ク タ ーはたいてい


は独立 し た カ ラ ーフ ォ ン ト で利用可能です (128 ページ 「6.1.3 SVG ・ COLR ・ sbix 形式の
OpenType カ ラ ーフ ォ ン ト 」 を参照) ので、 テ キ ス ト フ ォ ン ト と 絵文字フ ォ ン ト を切 り 替
え る 必要があ り ます。絵文字フ ォ ン ト を フ ォールバ ッ ク フ ォ ン ト と し てテ キ ス ト フ ォ ン ト
に く っつけ る と こ れを シ ンプルにで き ます。カ ラ ーフ ォ ン ト には絵文字キ ャ ラ ク タ ーのモ
ノ 版 と カ ラ ー版 が 入 っ て い る 可能性 が あ り ま す の で、 カ ラ ー グ リ フ が 採 ら れ る よ う
colormode=ignoremono を用い ま し ょ う :
fallbackfonts={
{fontname={Segoe UI Emoji} colormode=ignoremono}
}

複数の用字系で使え る よ う フ ォ ン ト を合体 場合に よ っ ては、 入力テ キ ス ト デー タ の用


字系が事前にわか ら ない こ と が あ り ま す。 た と えば、 デー タ ベー ス が欧文 ・ ギ リ シ ャ 文
字 ・ キ リ ル文字のテ キ ス ト を含んでい る のに、 得 ら れ る フ ォ ン ト は こ れ ら の用字系の う ち
の 1 つ し か同時に網羅 し ていない と い う 場合があ る か も し れません。用字系を決定 し て適
切な フ ォ ン ト を選ぶのではな く 、 い く つかの フ ォ ン ト を結びつけた フ ォ ン ト を構築 し て、
実質的にすべての用字系の スーパーセ ッ ト を網羅する こ と が可能です。 fallbackfonts オプ
シ ョ ンに対 し て以下の フ ォ ン ト オプシ ョ ン を用いて、ギ リ シ ャ 文字フ ォ ン ト と キ リ ル文字
フ ォ ン ト を欧文フ ォ ン ト に追加す る こ と がで き ます :
fallbackfonts={
{fontname=Times-Greek forcechars={U+0391-U+03F5}}

6.3 フ ォ ン ト を読み込む 147


{fontname=Times-Cyrillic forcechars={U+0401-U+0490}}
}

フ ォ ン ト 内の一部ない し 全部のグ リ フ を大き く す る フ ォ ール バ ッ ク フ ォ ン ト を 使 う


と 、 フ ォ ン ト 内の一部ない し すべてのグ リ フ を、 文字サ イ ズ を変えずに大き く する こ と が
で き ます。 こ の場合 も 、 ベース フ ォ ン ト それ自身を フ ォールバ ッ ク フ ォ ン ト と し て用い ま
す。 こ の機能は、 さ ま ざ ま な フ ォ ン ト のデザ イ ン を、 コ ー ド 内で文字サ イ ズ を調整せずに
見た目上協調 さ せ る のに有用です。 fallbackfonts オプシ ョ ンに対 し て以下の フ ォ ン ト オプ
シ ョ ン を用いて、指定 し た範囲内のすべてのグ リ フ を 120% へ大 き く す る こ と がで き ます:
fallbackfonts={
{fontname=Times-Italic forcechars={U+0020-U+00FF} fontsize=120%}
}

拡大 し た ピ ク ト グ ラ ム を追加 fallbackfonts オ プ シ ョ ン に 対 し て 以下 の フ ォ ン ト オ プ
シ ョ ン を用いて、 ZapfDingbats フ ォ ン ト か ら 記号を持っ て来 る こ と がで き ます :
fallbackfonts={
{fontname=ZapfDingbats forcechars=.a12 fontsize=150% textrise=-15%}
}

こ の場合 も 、 fontsize ・ textrise サブオプ シ ョ ン を用い て、 記号のサ イ ズ と 位置をベー ス


フ ォ ン ト に合わせてい ます。

日中韓 フ ォ ン ト 内のグ リ フ を置き 換え fallbackfonts オプシ ョ ン に対 し て以下の フ ォ ン


ト オプシ ョ ン を用いて、 ASCII 範囲内の欧文キ ャ ラ ク タ ーを別フ ォ ン ト か ら の も のに置 き
換え る こ と がで き ます :
fallbackfonts={
{fontname=Courier-Bold forcechars={U+0020-U+007E}}
}

ア ラ ビ ア語 フ ォ ン ト に欧文キ ャ ラ ク タ ー を追加 こ の用途は 173 ページ 「7.5.4 ア ラ ビ ア


語テ キ ス ト 組版」 で解説 し てい ます。

足 り ないグ リ フ を つ き と める 無償提供 さ れてい る フ ォ ン ト Unicode BMP Fallback SIL は、


実際のグ リ フ でな く 各 Unicode キ ャ ラ ク タ ーの 16 進値を表示 し ます。 こ の フ ォ ン ト は、
ワ ー ク フ ロ ー に お け る フ ォ ン ト 関連 の 問題 を 診断す る の に 有用 な と き が あ り ま す。
fallbackfonts オプシ ョ ンに対 し て以下の フ ォ ン ト オプシ ョ ン を用いて、任意の フ ォ ン ト を、
足 り ない キ ャ ラ ク タ ーが視覚化 さ れ る よ う こ の特殊な フ ォ ールバ ッ ク フ ォ ン ト で強化す
る こ と がで き ます :
fallbackfonts={{fontname={Unicode BMP Fallback SIL}}}

フ ォ ン ト に外字キ ャ ラ ク タ ー を追加 こ の用途は 176 ページ 「7.6.3 EUDC ・ SING フ ォ ン


ト に よ る 外字キ ャ ラ ク タ ー」 で解説 し てい ます。

148 第 6 章 : フォン ト
6.4 フ ォ ン ト の埋め込み と サブ セ ッ ト 化
6.4.1 埋め込み
Acrobat におけ る PDF の フ ォ ン ト 埋め込み と フ ォ ン ト 置換 PDF 文書は、 正 し いテ キ ス
ト 表現を確保す る ために、 フ ォ ン ト デー タ を さ ま ざ ま な形式で含む こ と がで き ます。 あ る
いは、 グ リ フ の メ ト リ ッ ク と い く つかの一般的な フ ォ ン ト 情報だけ を含む (グ リ フ のア ウ
ト ラ イ ン本体を含ま ない) フ ォ ン ト 記述子を埋め込む こ と も で き ま す。 フ ォ ン ト が PDF
文書に埋め込まれていない場合、 PDF ビ ュ ーアはそれが タ ーゲ ッ ト シ ス テ ムで得 ら れ、 か
つ構成 さ れていればそれを取 り (Acrobat では 「ロー カルフ ォ ン ト を用いる」)、 あ る いは
フ ォ ン ト 記述子に従っ て代替フ ォ ン ト を組み立て よ う と 試みます。代替フ ォ ン ト が使われ
る こ と に よ っ てテ キ ス ト は読め る よ う にな り ますが、そのグ リ フは元の フ ォ ン ト と は異な
る 可能性があ り ます。 同様に、 代替フ ォ ン ト は、 複雑用字系のシ ェ ーピ ン グか OpenType
レ イ ア ウ ト 機能が使われてい る と き には働 き ません。 こ う し た理由か ら 、 一般にはフ ォ ン
ト の埋め込みを推奨 し ます。 ただ し 、 文書が フ ォ ン ト を埋め込んでいな く て も タ ーゲ ッ ト
シ ス テ ム上での表示が許容範囲内にな る と わかっ てい る 場合は例外です。その よ う な PDF
フ ァ イ ルは本質的に非可搬ですが、すべての ワー ク ス テーシ ョ ン上で必要フ ォ ン ト が得 ら
れ る と わか っ てい る 企業ネ ッ ト ワ ー ク な ど の制御 さ れた環境においては役に立つか も し
れません。 一般に、 フ ォ ン ト の埋め込みは、 推奨 さ れ、 PDFlib ではデフ ォ ル ト の動作です。

フ ォ ン ト を PDFlib で埋め込む フ ォ ン ト の 埋 め 込 み は、 デ フ ォ ル ト で 有 効 で す が、
embedding フ ォ ン ト オプシ ョ ン を用いて制御す る こ と も で き ます :
font = p.load_font("WarnockPro", "winansi", "noembedding");

不可視テ キ ス ト (主に OCR 出力に有用) にのみ使われ る フ ォ ン ト に対す る フ ォ ン ト 埋め


込みは、 optimizeinvisible フ ォ ン ト オプシ ョ ンで制御する こ と がで き ます。

6.4.2 サブ セ ッ ト 化
PDF 出力のサ イ ズ を減 ら すために、PDFlib は、 あ る フ ォ ン ト の中で実際にその文書の中で
使われてい る グ リ フ だけ を埋め込む こ と がで き ます。 こ の処理を フ ォ ン ト のサブセ ッ ト 化
と いい ます。 サブセ ッ ト 化を行 う と 新 し い フ ォ ン ト が作成 さ れ、 その中ではグ リ フ の数が
元の フ ォ ン ト よ り も 少な く 、 PDF の表示に必要ない フ ォ ン ト 情報 も 省略 さ れてい ま す。
Type 3 フ ォ ン ト はサブセ ッ ト 化について特別な処理を要 し ます (150 ページ 「Type 3 フ ォ
ン ト のサブセ ッ ト 化」 を参照)。
サブセ ッ ト 化を要求 さ れてい る フ ォ ン ト が文書内で使われてい る 場合、 PDFlib は実際
にテ キ ス ト 出力に使われてい る グ リ フ を調べます。サブセ ッ ト 化の動作を制御す る にはい
く つかの方法があ り ます :
> デフ ォ ル ト のサブセ ッ ト 化の動作は autosubsetting オプシ ョ ンで制御 さ れます。それが
true な ら サブセ ッ ト 化が有効にな り ます。 デフ ォ ル ト 値は true です。
> autosubsetting=true の場合:subsetlimit オプシ ョ ンはパーセ ン ト 値を持ち ます。文書内
で用い ら れてい る 、 あ る フ ォ ン ト 内のグ リ フ の数が こ の割合を超え る 場合には、 サブ
セ ッ ト 化は無効 と な り 、 フ ォ ン ト 全体が埋め込 ま れ ます。 こ れに よ っ て処理時間があ
る 程度短縮で き ますが、 そのかわ り に出力フ ァ イ ルの容量は大 き く な り ます。 以下の
フ ォ ン ト オプシ ョ ンはサブセ ッ ト 限界を 75% に設定 し ます :
subsetlimit=75%

6.4 フ ォ ン ト の埋め込み と サブ セ ッ ト 化 149


subsetlimit のデフ ォ ル ト 値は 100 パーセ ン ト です。 言い換えれば、 ク ラ イ ア ン ト が明
示的に 100 パーセ ン ト 未満の限界値を要求 し ない限 り 、 PDF_load_font( ) で要求 さ れ る
サブセ ッ ト 化オプシ ョ ンは効力を持ち ます。

初期 フ ォ ン ト サブ セ ッ ト フ ォ ン ト サブセ ッ ト は、 文書内で使われてい る すべての グ リ


フ のア ウ ト ラ イ ン記述を含んでい ます。 こ れはすなわち、 生成 さ れ る 文書サブセ ッ ト は文
書ご と に変化す る こ と を意味 し ます。 なぜな ら 一般に、 各文書内ではそれぞれ異な る グ リ
フ の集合が用い ら れてい る か ら です。フ ォ ン ト サブセ ッ ト を埋め込んだた く さ んの小 さ な
文書を大 き な文書へ連結す る 際には、フ ォ ン ト サブセ ッ ト がそれぞれま ち ま ちであ る こ と
は厄介です:埋め込まれてい る サブセ ッ ト は全部互いに異な る ため、除去で き ないのです。
こ う し た場合のために、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 回に分けて フ ォ ン ト を定義する 必要
があ り ます。 詳 し く は PDFlib API リ フ ァ レ ン ス を参照 し て く だ さ い。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の type3_fonts/type3_subsetting ト ピ ッ ク にあ り ま


す。

150 第 6 章 : フォン ト
6.5 フ ォ ン ト 情報を ク エ リ ー
PDF_info_font( ) を利用す る と 、 フ ォ ン ト ・ エン コ ーデ ィ ン グ ・ Unicode ・ グ リ フ に関 し て
有用な情報を ク エ リ ーす る こ と がで き ます。 ク エ リ ーの種類に よ っ ては、 有効な フ ォ ン ト
ハン ド ルが こ の メ ソ ッ ド の引数 と し て必要な場合 も あ り ます。 以下すべての例で、 表 6.4
に挙げ る 変数を用い る こ と に し ます。

表 6.4 PDF_info_font( ) の利用例で用いる変数


変数 注釈
int uv; Unicode の数値。 あるいは、 グ リ フ名参照か ら 「&」 ・ 「;」 修飾を除いた ものを オプ シ ョ ン リ
ス ト 内で用いる こ と も で き ます (unicode=euro な ど)。 詳 し く は、 PDFlib API リ フ ァ レ ン ス
の 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 (PHP では 0) を返 し ます。 こ れは、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン側でチ ェ ッ
ク す る 必要があ り 、 ま た こ れを用いて、 求め る グ リ フ が フ ォ ン ト 内にあ る か ど う かを知 る
こ と がで き ます。
以下のサ ン プル コ ー ド 行は、 互いに依存 し てい ませんので、 独立に抜 き 出 し て利用す
る こ と がで き ます。

6.5.1 フ ォ ン ト 非依存のエ ン コ ーデ ィ ン グ ・ Unicode ・ グ リ フ 名 ク エ


リー
エ ン コ ーデ ィ ン グ ク エ リ ー エ ン コ ーデ ィ ン グ ク エ リ ーには、 有効な フ ォ ン ト ハン ド ル
は必要ではあ り ません。 すなわち、 PDF_info_font( ) の font 引数に値 -1 (PHP の場合 : 0)
を与え る こ と がで き ます。 gn には、 PDFlib が内部的に知っ てい る グ リ フ名だけ を与え る
こ と がで き 、 フ ォ ン ト 独自のグ リ フ名を与え る こ と はで き ません。
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);

Unicode ・ グ リ フ 名 ク エ リ ー PDF_info_font( ) を利用する と 、 特定の 8 ビ ッ ト エン コ ー


デ ィ ン グに依存せず、Unicode 値 と PDFlib が内部的に知っ てい る 名前 と の関係にかかわ る
ク エ リ ーを行 う こ と も 可能です。 こ れ ら の ク エ リ ーはいかな る フ ォ ン ト に も 依存 し ません
ので、 有効な フ ォ ン ト ハン ド ルは必要ではあ り ません。

6.5 フ ォ ン ト 情報を ク エ リ ー 151


内部的に知 ら れてい る グ リ フ名の 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, "");

6.5.2 フ ォ ン ト 依存のエ ン コ ーデ ィ ン グ ・ Unicode ・ グ リ フ 名 ク エ リ ー


以下の ク エ リ ーは、 特定の フ ォ ン ト にかかわ る も のですので、 有効な フ ォ ン ト ハン ド ルで
フ ォ ン ト を指定す る 必要があ り ます。 gn 変数を用いて、 内部的に知 ら れてい る グ リ フ だ
けでな く 、 フ ォ ン ト 独自のグ リ フ名を与え る こ と も で き ます。 以下すべての例において、
戻 り 値 -1 は、 求めた グ リ フ を その フ ォ ン ト が含んでいない こ と を意味 し ます。
フ ォ ン ト 内の コ ー ド 、グ リ フ ID、指名 し た グ リ フ、CID に対す る Unicode 値を ク エ リ ー:
uv = (int) p.info_font(font, "unicode", "code=" + c);
uv = (int) p.info_font(font, "unicode", "glyphid=" + gid);
uv = (int) p.info_font(font, "unicode", "glyphname=" + gn);
uv = (int) p.info_font(font, "unicode", "cid=" + cid);

フ ォ ン ト 内の コ ー ド 、 Unicode 値、 指名 し た グ リ フ、 CID に対す る グ リ フ ID を ク エ リ ー :


gid = (int) p.info_font(font, "glyphid", "code=" + c);
gid = (int) p.info_font(font, "glyphid", "unicode=" + uv);
gid = (int) p.info_font(font, "glyphid", "glyphname=" + gn);
gid = (int) p.info_font(font, "glyphid", "cid=" + cid);

コ ー ド ・ Unicode 値 ・ CID で指定 し た グ リ フ の フ ォ ン ト 固有の名前を ク エ リ ー :


gn_idx = (int) p.info_font(font, "glyphname", "code=" + c);
gn_idx = (int) p.info_font(font, "glyphname", "unicode=" + uv);
gn_idx = (int) p.info_font(font, "glyphname", "glyphid=" + gid);
gn_idx = (int) p.info_font(font, "glyphname", "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( ) を使っ て、 所与のテ キ ス ト 文字列におけ る マ ッ プな し キ ャ ラ


ク タ ーの数を、 すなわち文字列内の、 フ ォ ン ト 内で適当な グ リ フ が得 ら れない キ ャ ラ ク

152 第 6 章 : フォン ト
タ ーの数をチ ェ ッ ク す る こ と も で き ます。 以下の コ ー ド 断片は、 ユー ロ キ ャ ラ ク タ ー (グ
リ フ名参照で表現) 1 個だけ を内容 と す る 文字列についての結果を ク エ リ ー し ます。 も し
も マ ッ プな し キ ャ ラ ク タ ーが 1 個見つかれば、 こ れはすなわちその フ ォ ン ト がユー ロ 記号
に対す る グ リ フ を一切含んでいない こ と を意味 し ます :
String optlist = "font=" + font + " charref";

if (p.info_textline("&euro;", "unmappedchars", optlist) == 1)


{
/* ユーロ記号に対するグリフはフォント内で得られない */
}

6.5.3 コ ー ド ページ網羅性 と フ ォ ールバ ッ ク フ ォ ン ト を ク エ リ ー


PDF_info_font( ) を利用す る と 、あ る 特定の言語ない し 用字系のテ キ ス ト 出力を作成す る の
に フ ォ ン ト が適 し てい る か ど う かをチ ェ ッ ク す る こ と も で き ます。 そのためには、 そのテ
キ ス ト で ど の コ ー ド ページが必要かがわかっ てい る 必要があ り ます。 コ ー ド ページ網羅性
は、 フ ォ ン ト の OS/2 テーブル内にエン コ ー ド さ れてい ます。 ただ し 、 フ ォ ン ト があ る 特
定の コ ー ド ページに対応 し てい る と は正確には何を意味する のかは、フ ォ ン ト デザ イ ナー
の考え方一つで決ま り ます。 フ ォ ン ト があ る 特定の コ ー ド ページに対応 し てい る と 言っ て
い る か ら と いっ て、必ず し も それがその コ ー ド ページ内のすべてのキ ャ ラ ク タ ーに対す る
グ リ フ を含んでい る と は限 り ません。 よ り 正確な網羅性情報が必要な場合は、 152 ページ
「6.5.2 フ ォ ン ト 依存のエ ン コ ーデ ィ ン グ ・ Unicode ・ グ リ フ名 ク エ リ ー」 で示 し た よ う に
し てすべての必要な キ ャ ラ ク タ ーの入手可能性を ク エ リ ーする こ と がで き ます。

フ ォ ン ト が コ ー ド ページ に対応 し てい るかど う かを チ ェ ッ ク 以 下 の コ ー ド 断 片 は、


フ ォ ン ト があ る 特定の コ ー ド ページに対応 し てい る か ど う か をチ ェ ッ ク し ます :
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 フ ォ ン ト に対 し ては以下の リ ス ト を作成 し ます :

6.5 フ ォ ン ト 情報を ク エ リ ー 153


cp1252 cp1250 cp1251 cp1253 cp1254 cp1255 cp1256 cp1257 cp1258 cp874 cp932 cp936 cp949
cp950 cp1361

予備グ リ フ を ク エ リ ー PDF_info_font( ) を利用す る と 、 フ ォールバ ッ ク フ ォ ン ト 機構の


結果を ク エ リ ーす る こ と がで き ます (フ ォールバ ッ ク フ ォ ン ト について詳 し く は 146 ペー
ジ 「6.3.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, "");
}

154 第 6 章 : フォン ト
7 テキス ト 出力
7.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 fontsize=12");

詳 し く は 229 ページ 「9.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);

詳 し く は 238 ページ 「9.2 複数行のテ キ ス ト フ ロ ー」 を参照 し て く だ さ い。

7.1 テキス ト 出力方式 155


表内のテキス ト テ キ ス ト 行 と テ キ ス ト フ ロ ーを使っ て、表セル内にテ キ ス ト を配置する
こ と も で き ます。 詳 し く は 259 ページ 「9.3 表の組版」 を参照 し て く だ さ い。

156 第 7 章 : テキス ト 出力
7.2 フ ォ ン ト メ ト リ ッ ク と テ キス ト ス タ イ ル
7.2.1 フ ォ ン ト と グ リ フ の メ ト リ ッ ク
テキス ト 位置 PDFlib はテ キ ス ト 位置を、 グ ラ フ ィ ッ ク 描画のカ レ ン ト 点 と は独立に保
持 し ます。 前者は textx/texty オプシ ョ ン で ク エ リ ーで き 、 後者は currentx/currenty で ク
エ リ ーで き ます。

グ リ フ の メ ト リ ッ ク PDFlib では、 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 で ク エ リ ーす る には以下の よ う に記述 し ます :
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 ト ピ ッ ク にあ り ます。

7.2.2 カ ーニ ン グ
さ ま ざ ま な文字の組み合わせのなかには、望ま し く ない見ばえにな っ て し ま う も のがあ り
ます。 た と えば、 2 つの V が隣 り 合 う と W の よ う に見え て し ま い ます し 、 T と e の間の間
隔は縮めない と 広 く あ き すぎ て不恰好にな っ て し ま い ます。 こ の よ う な補正の こ と を カー
ニ ン グ と いい ます。 多 く の フ ォ ン ト が、 問題 と な る 文字の組み合わせそれぞれに対す る 間

7.2 フ ォ ン ト メ ト リ ッ ク と テキス ト ス タ イル 157


隔調整を指定 し た包括的な カーニ ン グ情報を持っ てい ます。 PDFlib には、 カーニ ン グの動
作を制御す る 方式が 2 種類あ り ます :
> デフ ォ ル ト では、 フ ォ ン ト 内のカーニ ン グ情報はその フ ォ ン ト を読み込む際に読み取
ら れます。 カーニ ン グが必要でない場合は、 PDF_load_font( ) で readkerning オプシ ョ
ン を false に設定 し ます。
> テ キ ス ト 出力に対す る カーニ ン グは、テ キ ス ト 出力関数群が対応 し てい る kerning テ キ
ス ト 書式オプシ ョ ンで有効にす る 必要があ り ます。

一時的にカーニ ン グ を無効にする こ と がた と えばど んな と き に有用か と い う と 、数表を組


みたい と き に、カーニ ン グデー タ が数字ど う し のペア を含んでい る 場合 と い う のが挙げ ら
れ ま す。 カ ー ニ ン グ さ れ た 数字は表内で き れい に並ばな い か ら です。 な お、 今 ど き の
TrueType ・ OpenType フ ォ ン ト は こ の目的のための特殊な数字を含んでお り 、 こ れは等幅
数字レ イ ア ウ ト 機能 と オプシ ョ ン features={tnum} で利用で き ます。
カーニ ン グは、 ど の よ う な字間 ・ 単語間隔 ・ 横伸縮が指定 さ れていた と し て も 、 それ
に加え て適用す る こ と がで き ます。 PDFlib では、 1 つの フ ォ ン ト 内のカーニ ン グペアの数
については ま っ た く 無制限です。
カーニ ン グは、 フ ォ ン ト オプシ ョ ン readkerning と テ キ ス ト オプシ ョ ン kerning に よ っ
て制御 さ れます。 デフ ォ ル ト ではカーニ ン グは有効にな っ てい ます。

7.2.3 テキス ト ス タ イ ル
擬似ボール ド フ ォ ン ト PDFlib は、 個別のテ キ ス ト 文字列について、 fakebold オプシ ョ
ン を通 じ て擬似的な ボール ド テ キ ス ト を作成す る 機構を サポー ト し てい ま す。 こ の方式
は、 グ リ フ の輪郭 を 描線す る こ と に よ っ て ボール ド フ ォ ン ト を 擬似表現 し て い ま す :
Type 3 フ ォ ン ト の場合には、 テ キ ス ト が さ ま ざ ま な変位で複数回配置 さ れます。 強調のた
めには本当のボール ド フ ォ ン ト を使用す る こ と を強 く 推奨 し ます。fakeboldオプシ ョ ンは、
本当のボール ド テ キ ス ト よ り も 劣 る テ キ ス ト 出力を作成 し ます し 、 ま た、 テ キ ス ト 抽出を
阻害す る おそれ も あ り ます。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の fonts/simulated_fontstyles ト ピ ッ ク にあ り ま


す。

図 7.1 カ ーニ ング

ࠞ࡯࠾ࡦࠣߥߒ

ࠞ࡯࠾ࡦࠣㆡ↪

ࠞ࡯࠾ࡦࠣߦࠃࠆᢥሼ⒖േ

158 第 7 章 : テキス ト 出力
擬似斜体 フ ォ ン ト italicangle オプシ ョ ン を使っ て、 レ ギ ュ ラ ーフ ォ ン ト し か利用で き な
い と き に イ タ リ ッ ク フ ォ ン ト の よ う な効果を出す こ と も で き ま す。 こ の方式は、 偽 イ タ
リ ッ ク フ ォ ン ト を作成す る ために、 レ ギ ュ ラ ーフ ォ ン ト を ユーザーか ら 与え ら れた角度だ
け傾け る も のです。 負の値でテ キ ス ト は右に傾 き ます。 も ち ろん、 本物の イ タ リ ッ ク や斜
体フ ォ ン ト を使っ たほ う がは る かに き れいな出力が得 ら れ る こ と を忘れてはいけ ません。
し か し イ タ リ ッ ク フ ォ ン ト が入手で き ない と き に italicangle オプシ ョ ン を使えば、簡単に
そ れ に似 た 効果 を 出す こ と が で き ま す。 こ の機能は特に日中韓 フ ォ ン ト で便利です。
italicangle オプシ ョ ンの値は普通 -12 か ら -15 度の範囲です。

注 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
API リ フ ァ レ ン スに挙げて あ り ます。 表現モー ド は、 textrendering テ キ ス ト オプシ ョ ンで
設定す る こ と がで き ます。
テ キ ス ト を描線す る と 、 strokewidth ・ strokecolor と い っ た テ キ ス ト ス テー タ ス のオプ
シ ョ ン群がグ リ フ の輪郭に適用 さ れます。 表現モー ド は、 Type 3 フ ォ ン ト を用いて印字 さ
れ る テ キ ス ト には何の効果 も 持ち ません。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の text_output/text_as_clipping_path ・ text_
output/invisible_text ト ピ ッ ク にあ り ます。

7.2 フ ォ ン ト メ ト リ ッ ク と テキス ト ス タ イル 159


テキス ト の色 テ キ ス ト は通常、 fillcolor オプシ ョ ンで指定 さ れた色で印字 さ れます。 塗
り 色は PDF_setcolor( ) を用いて設定で き ます。 ただ し 、 表現モー ド で 0 以外が選択 さ れて
い る 時は、 その選択 さ れてい る 表現モー ド に よ っ て、 strokecolor と fillcolor はど ち ら も テ
キ ス ト に対 し て効力を持ち ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の text_output/starter_textline ト ピ ッ ク にあ り ま
す。

160 第 7 章 : テキス ト 出力
7.3 絵文字シーケ ン ス
ク ッ ク ブ ッ ク 絵文字シーケ ン スの例がク ッ ク ブ ッ ク の text_output/emoji_sequences ト ピ ッ ク にあ り ま
す。

絵文字キ ャ ラ ク タ ーの見た目は さ ま ざ ま なシーケ ン ス を用いて修飾で き ます。た と えば絵


文字キ ャ ラ ク タ ーの肌の色を変え た り す る こ と が可能です。その基礎 と な っ てい る コ ン セ
プ ト は Unicode Technical Standard #51 『Unicode Emoji』 で解説 さ れてお り 、 網羅的なテー
ブルが以下にあ り ます :
unicode.org/Public/emoji/14.0/emoji-zwj-sequences.txt
unicode.org/Public/emoji/14.0/emoji-sequences.txt

その実装は OpenType 機能定義に基づいてい ますので、 絵文字シーケ ン ス に対応 し てい る


か ど う かは フ ォ ン ト に よ っ て異な り ます。 無料で利用可能な EmojiOneColor フ ォ ン ト や
Windows フ ォ ン ト Segoe UI Emoji な ど今ど き のカ ラ ーフ ォ ン ト は多様な絵文字の組み合わ
せに対応 し てい ます。 絵文字シーケ ン ス は単色フ ォ ン ト で も 使用で き ますが、 最良の効果
はカ ラ ーフ ォ ン ト に よ っ て実現で き ます。
あ る フ ォ ン ト があ る 特定のシーケ ン ス に対応 し てい る 場合には、 PDFlib のテ キ ス ト 出
力 メ ソ ッ ド 群は、 それに対応する 効果を、 オプシ ョ ンが特に指定 さ れていな く て も デフ ォ
ル ト で レ ン ダー し ます (シーケ ン ス は ccmp OpenType 機能を用いて実現 さ れてお り 、 そ
れはデフ ォ ル ト で有効にな っ てい ます) :
> 絵文字のゼ ロ 幅接合子シーケ ン ス : 複数人のグループ化、 役割、 性別、 髪な ど修飾を
行い ます。 U+200D ZERO WIDTH JOINER (ZWJ) を使用 し ます。 こ のキ ャ ラ ク タ ーは
PDFlib ではテ キ ス ト オプシ ョ ン charref=true を設定 し てい る 場合には文字参照 &zwj;
と し て指定で き ます。
> 肌色修飾子 : 絵文字の肌の色を調節 し ます。 U+1F3FB EMOJI MODIFIER FITZPATRICK
TYPE 1-2 ~ U+1F3FF EMOJI MODIFIER FITZPATRICK TYPE 6 を使用 し ます。 こ れ ら
は肌色シーケ ン ス外で使用 さ れた場合にはたいていカ ラ ーパ ッ チ と し て レ ン ダー さ れ
ます。
> 絵文字の旗シーケ ン ス : 地域標識キ ャ ラ ク タ ー U+1F1E6 REGIONAL INDICATOR
SYMBOL LETTER A な ど か ら 旗を生成 し ます。
> 絵文字のキーキ ャ ッ プシーケ ン ス :数字 と U+FE0F EMOJI PRESENTATION SELECTOR
(VS16) と U+20E3 COMBINING ENCLOSING KEYCAP を使用 し ます。

絵文字シーケ ン ス の例を表 7.1 にい く つか示 し ます。

7.3 絵文字シーケ ン ス 161


表 7.1 絵文字修飾シーケ ン ス

シーケ ン スの種類
sequence type 絵文字シーケ ンス
emoji sequence 単離状態のキ ャ ラ ク タ ー 合体されたキャ
isolated characters ラ ク ター
combined characters

ZWJ
ZWJ grouping
のグループ化 &#x1F468;&zwj;&#x1F469;&zwj;&#x1F467; ‍ ‍
skin
肌の色 tone &#x1F466;&#x1F3FB; &#x1F466;&#x1F3FD;
&#x1F466;&#x1F3FF;

emoji flag
絵文字の旗 &#x1F1F2;&#x1F1F9; &#x1F1EC;&#x1F1E7;

emoji keycap ッ プ
絵文字のキーキャ 0&#xFE0F;&#x20E3; 9&#xFE0F;&#x20E3; ⃣ ⃣
&#x1F9DC;&zwj;&#x2642; &#x1F9DC;&zwj;
ZWJ gender
絵文字の性別
&#x2640; 7.
6
5
4
3
2
1
0 /0
7,
6
5
4
3
2
1 - G8
F
E
D
C
B
A
@ ?
>
=
<
;
:
9
skin肌の色
tone and gender &#x1F9DC;&#x1F3FF;&zwj;&#x2642; &#x1F9DC;
と 性別 7
6
5
4
3
2
1
0 .
/0
7
6
5
4
3
2
1 ,
- G8
F
E
D
C
B
A
@ ?
>
=
<
;
:
9
&#x1F3FF;&zwj;&#x2640;
&#x1F468;&zwj;&#x1F9B0; &#x1F468;&zwj;
ZWJ hair components
絵文字の髪構成要素
&#x1F9B3;
H



 L
K
J
I
M


 Q
P
O
N VW
U
T
S
R [
Z
Y
X
ZWJの役割
ZWJ role: male
: 男性 &#x1F468;&zwj;&#x1F33E;




 
 +
*
)
(
'
&
%
$
#
"
!
ZWJの役割
ZWJ role: female
: 女性 &#x1F469;&zwj;&#x1F33E; 





 












162 第 7 章 : テキス ト 出力
7.4 OpenType レ イ ア ウ ト 機能
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の fonts/starter_opentype ・ fonts/opentype_feature
_tester ト ピ ッ ク にあ り ます。

7.4.1 対応 し てい る OpenType レ イ アウ ト 機能
PDFlib は、い く つかの フ ォ ン ト 内の追加情報に従っ た高度なテ キ ス ト 出力に対応 し てい ま
す。 こ れ ら の フ ォ ン ト 拡張を OpenType レ イ ア ウ ト 機能 と いい ます。 た と えば、 フ ォ ン ト
が liga 機能を含んでい る か も し れません。 こ の機能は、 f ・ f ・ i グ リ フは結合 し て合字を
形作れ る と い う 情報を含んでい ます。 他に よ く 利用 さ れ る 例 と し ては、 smcp 機能に よ る
ス モールキ ャ ッ プ ス、 すなわち通常の大文字キ ャ ラ ク タ ー よ り も 小 さ な大文字キ ャ ラ ク
タ ーや、 onum 機能に よ る オール ド ス タ イ ル数字、 すなわち アセ ン ダー と デ ィ セ ン ダーを
持つ数字 (ベース ラ イ ン上にすべて配置 さ れ る 横並びの数字 と は異な る ) な ど が挙げ ら れ
ます。 合字は非常に広 く 利用 さ れ る OpenType 機能ではあ り ますが、 多数の機能の う ちの
1 つにすぎ ません。 PDFlib は以下のグループの OpenType 機能に対応 し てい ます :
> 欧文 タ イ ポグ ラ フ ィ ーのためのOpenType機能群を表7.2に挙げます。こ れ ら はfeatures・
script ・ language オプシ ョ ンで制御 さ れます。
> 複雑用字系のための OpenType 機能群。 こ れ ら は shaping・script オプシ ョ ンで制御 さ れ
ます (170 ページ 「7.5 複雑用字系の出力」 を参照)。
> カーニ ン グのためのOpenType機能テーブル群。PDFlibはkerningをOpenType機能 と し て
は扱い ません。 なぜな ら カーニ ン グデー タ は OpenType 機能テーブル以外の手段で も
表現す る こ と がで き る か ら です。 カーニ ン グ を制御する には、 readkerning フ ォ ン ト オ
プシ ョ ン と kerning テ キ ス ト オプシ ョ ン を用いて く だ さ い (157 ページ 「7.2.2 カーニ
ン グ」 を参照)。
> 以上に加え、 日中韓テ キ ス ト のための OpenType 機能については 177 ページ 「7.6.4
OpenType レ イ ア ウ ト 機能 と 日中韓テ キ ス ト 出力」 で解説 し ます。

以下の Web サ イ ト を使っ て、 フ ォ ン ト の持つ OpenType 機能を調べ る こ と も で き ます :


wakamaifondue.com/

注 カ ーニ ング以外、 PDFlib は GPOS テーブルに基づ く OpenType 機能に対応 し ていません。


OpenType レ イ アウ ト 機能は 8 ビ ッ ト エ ン コ ーデ ィ ングに対 し ては使え ません。

7.4 OpenType レ イ アウ ト 機能 163


表 7.2 対応 し ている、 欧文 タ イ ポグ ラ フ ィ ー と 絵文字のための OpenType 機能 (日中韓テキス ト 用の OpenType 機
能は表 7.9 に挙げます)
タグ 名前 説明

合字 ・ 字体
aalt すべての字体にア 選択 し た 1 つのキ ャ ラ ク タ ーのすべての異体字を ア ク セス可能に し ます。 た と え
ク セス ば、 通常の置き換えによ っ てサポー ト さ れる コ ン テキス ト の外にあ るグ リ フ をユー
ザーが必要 と するか も し れず、 あ るいは、 ほ し いグ リ フ を印字 さ せるのは何の機能
かをユーザーが知ら ないか も し れません。
calt1 コ ン テキス ト 字体 デ フ ォ ル ト グ リ フ を、 よ り 良い連結動作を与え る字体へ置き換え。 一部ない し 全部
のグ リ フ を連結 さ せる よ う デザイ ン さ れた用字系書体で使用 さ れます。
clig1 コ ン テキス ト 合字 グ リ フ 列を、 タ イ ポグ ラ フ ィ ー的観点か ら よ り 好ま し い 1 個のグ リ フへ置き換え。
他の合字機能群 と 異な り 、 clig は、 その合字が推奨 さ れる コ ン テキス ト を指定 し
ます。 こ の能力は、 い く つかの用字系デザイ ン において、 またスワ ッ シ ュ合字に対
し て重要です。
cswh コ ン テキス ト デ フ ォ ル ト グ リ フ を、 指定 さ れた コ ン テキス ト において、 スワ ッ シ ュへ置き換え。
スワ ッ シ ュ
cv01 キ ャ ラ ク タ ーの異 フ ォ ン ト の中で、 1 つない し 複数のキ ャ ラ ク タ ーに対 し て様式的異体字群がある
~ 体字 01-99 が、 1 つのキ ャ ラ ク タ ーに対する異体字群が他のキ ャ ラ ク タ ー群に対する異体字群
cv99 と シ ス テ マチ ッ ク に関連 し ていない こ と があ り ます。 あるいは、 1 つの大文字キ ャ
ラ ク タ ー と その小文字 (または、 1 つのキ ャ ラ ク タ ー と それにダ イ ア ク リ テ ィ カル
マー ク を あ ら か じ めつけたキ ャ ラ ク タ ー) に対 し て 1 つの異体が存在するが、 それ
は他の無関係なキ ャ ラ ク タ ー群には該当 し ない こ と があ り ます。
dlig 随意合字 グ リ フ 列を、 タ イ ポグ ラ フ ィ ー的観点か ら よ り 好ま し い 1 個のグ リ フへ置き換え。
dlig は、 ユーザーの好みに よ っ て、 特殊効果のために用いる こ と がで き る合字を
カバー し ます。
hist 歴史的字体 デ フ ォ ル ト の字体を歴史的字体へ置き換え。 い く つかの字の字体は過去には広 く 用
い られていま し たが、 現在では時代遅れに見え ます。
hlig 歴史的合字 デ フ ォ ル ト の合字を歴史的合字へ置き換え。
liga1 標準合字 グ リ フ 列を、 タ イ ポグ ラ フ ィ ー的観点か ら よ り 好ま し い 1 個のグ リ フへ置き換え。
liga は、 通常の条件において用い られるべき合字を カバー し ます。

locl1 ロー カ ラ イ ズ字体 グ リ フ のデ フ ォ ル ト 字体から ロー カ ラ イ ズ字体への置換を有効に し ます。 こ の機能


は script ・ language オプ シ ョ ン を必要 と し ます。

salt ス タ イ リ ステ ィ ッ デ フ ォ ル ト 字体を ス タ イ リ ス テ ィ ッ ク字体へ置き換え。 これ らの異体字は、 スワ ッ


ク字体 シ ュや歴史的 と い っ た決ま っ た分類には必ず し も あてはま り ません。
ss01 ス タ イ リ ステ ィ ッ 個々のグ リ フ のス タ イ リ ス テ ィ ッ ク字体 (salt 機能を参照) に加え て、 あ るいは
~ ク集合 01 ~ 20 それに替えて、 フ ォ ン ト に よ っ ては、 その文字集合の 1 個ない し 複数の一部分に対
ss20 応する ス タ イ リ ス テ ィ ッ ク 異体字グ リ フ 群の集合を含んでいる ものがあ り ます。
例 : 欧文 フ ォ ン ト 内の小文字に対 し て複数の異体字。
subs 下付き デ フ ォ ル ト グ リ フ を下付き グ リ フ へ置き換え。
sups 上付き 横並びまたはオール ド ス タ イル数字を上付き数字へ置き換え (主に脚注表示用)、
小文字を上付き文字へ置き換え (主に フ ラ ン ス語敬称の省略形用)。
swsh スワ ッ シ ュ デ フ ォ ル ト グ リ フ を スワ ッ シ ュ グ リ フへ置き換え。
titl 見出 し 化 デ フ ォ ル ト グ リ フ を、 見出 し 用にデザイ ン さ れた字体へ置き換え。

数字 ・ 数学
afrc 別形式分数 ス ラ ッ シ ュ で区切ら れた数字群を別形式へ置き換え。

164 第 7 章 : テキス ト 出力
表 7.2 対応 し ている、 欧文 タ イ ポグ ラ フ ィ ー と 絵文字のための OpenType 機能 (日中韓テキス ト 用の OpenType 機
能は表 7.9 に挙げます)
タグ 名前 説明
dnom 分母 ス ラ ッ シ ュの直後の数字を分母数字へ置き換え
frac 分数 ス ラ ッ シ ュ で区切 られた数字群を、 通用の、 斜め線に よ る分数へ置き換え
lnum 横並び数字 数字を オール ド ス タ イルから デ フ ォ ル ト の横並び字体へ変え ます。
mgrk 数学ギ リ シ ャ 文字 ギ リ シ ャ 文字グ リ フの標準 タ イ ポグ ラ フ ィ ー字体を、 数学的表記で広 く 用い られて
いる字体へ置き換え。
numr 分子 ス ラ ッ シ ュの直前の数字を分子数字へ置き換え、 タ イ ポグ ラ フ ィ ース ラ ッ シ ュ を分
数ス ラ ッ シ ュへ置き換え。
onum オール ド ス タ イル 数字を、 デ フ ォ ル ト の横並び形式から オール ド ス タ イル字体に変え ます。
数字
pnum プ ロポーシ ョ ナル 等幅 (表形式) 数字を、 プ ロポーシ ョ ナル幅を持つ数字へ置き換え。
数字
sinf 科学的下付き 横並びまたはオール ド ス タ イル数字を、 主に化学や数学表記用の下付き数字 (よ り
小 さ なグ リ フ) へ置き換え。
tnum 等幅数字 プ ロポーシ ョ ナル数字を等幅 (表形式) 数字へ置き換え。
zero ス ラ ッ シ ュ付きゼ 数字ゼロ に対するグ リ フ を、 中空部に斜め線を引いた字体へ置き換え。

大文字 / 小文字 ・ 序数
c2pc 大文字からのプ 大文字キ ャ ラ ク タ ーを プ テ ィ ッ ト キ ャ ピ タ ルに変え ます。
テ ィ ッ ト キャ ピ タ

c2sc 大文字からのス 大文字キ ャ ラ ク タ ーを ス モールキ ャ ッ プ スに変え ます。
モールキ ャ ッ プ ス
case ケースセ ン シ テ ィ さ ま ざ ま な ア ク セ ン ト 記号を上へず ら し て、 全大文字シーケ ン スや横並び数字 と の
ブ字体 調和を高めます。 ま た、 オール ド ス タ イル数字を横並び数字に変え ます。
ordn 序数 デ フ ォル ト のアルフ ァ ベ ッ ト グ リ フ を、 数字の後に用いる ための序数字体へ置き換
え。 通常、 Numero キ ャ ラ ク タ ー U+2116 も 作成 し ます。
pcap プテ ィ ッ ト キャ ピ 小文字キ ャ ラ ク タ ーを プ テ ィ ッ ト キ ャ ピ タ ルに、 すなわち通常のスモールキ ャ ッ プ
タル よ り 背の低い大文字に変え ます。
smcp ス モールキ ャ ッ プ 小文字キ ャ ラ ク タ ーを ス モールキ ャ ッ プ スに変え ます。

unic ユニケース 大文字 と 小文字を、 小文字 と ス モールキ ャ ッ プ ス字体の混在する集合へマ ッ プ し
て、 高 さ 一定のアルフ ァ ベ ッ ト に し ます。

位置によ る字体
falt 改行箇所語尾グ リ 行末グ リ フ を代替字体 (必要に応 じ て前幅が短か っ た り 長かっ た り する もの) へ置
フ き換え る こ と に よ っ て、 テキス ト の均等割 り 付けを助けます。
isol2 独立形 ・ 語頭形 ・ 続け書きされる用字系、とりわけアラビア語に対して、単語の外(独立して)・先
init 語中形 ・ 語末形 頭・途中・末尾に出現するグリフを、各字体へ置き換え。
medi
fina

その他
_none 全機能無効化 すべての OpenType 機能を無効化。

7.4 OpenType レ イ アウ ト 機能 165


表 7.2 対応 し ている、 欧文 タ イ ポグ ラ フ ィ ー と 絵文字のための OpenType 機能 (日中韓テキス ト 用の OpenType 機
能は表 7.9 に挙げます)
タグ 名前 説明
1
ccmp グ リ フ合成 / 分解 グ リ フ 字体の数を最小化する ために、 1 個のキ ャ ラ ク タ ーを 2 個のグ リ フへ分解 し
た り 、 あ るいはよ り 良いグ リ フ処理のために 2 個のキ ャ ラ ク タ ーを 1 個のグ リ フ に
合成 し た り する こ と が望ま し い場合があ り ます。 この機能は絵文字シーケ ン スのた
めによ く 使われます。
ornm 飾 り 文字 ビ ュ レ ッ ト キ ャ ラ ク タ ーか ASCII キ ャ ラ ク タ ー群、 または両方を飾 り 文字へ置き換
え。

1. こ の機能はデ フ ォル ト で有効です。
2. こ れ ら の機能は、 shaping=true の場合には自動的に有効化 さ れます。

OpenType 機能を ク エ リ ー PDF_info_font( ) を用いて、 フ ォ ン ト 内の OpenType 機能をプ


ロ グ ラ ム で ク エ リ ーす る こ と がで き ま す。 以下の命令は、 その フ ォ ン ト で利用可能かつ
PDFlib が対応 し てい る すべての OpenType 機能を スペース区切 り 列挙 し た も の を取得 し ま
す:
result = (int) p.info_font(font, "featurelist", "");
if (result != -1)
{
/* 機能をスペース区切り列挙した文字列を取得 */
featurelist = p.get_string(result, "");
}
else
{
/* 対応機能全然見つからず */
}

た と えば合字 (liga) な ど特定の機能に PDFlib と 対象フ ォ ン ト が対応 し てい る か を調べる


には以下の断片を使用 し ます :
result = (int) p.info_font(font, "feature", "name=liga");
if (result == 1)
{
/* 機能はフォントとPDFlibが対応している */
}

7.4.2 テキス ト 行 ・ テキス ト フ ロ ーで OpenType レ イ ア ウ ト 機能


PDFlib は、 テ キ ス ト 行 ・ テ キ ス ト フ ロ ー関数群では OpenType レ イ ア ウ ト 機能に対応 し て
い ますが、 PDF_show( ) な ど単純テ キ ス ト 出力関数群では対応 し てい ません。

OpenType レ イ アウ ト 機能のための要件 レ イ ア ウ ト 機能群 を 用い て使用 さ れ る た めの


OpenType フ ォ ン ト は、 使われ る OpenType 機能 (群) を持つ GSUB テーブルを持っ てい
る 必要があ り 、 かつ、 encoding=unicode か glyphid を用いて読み込む必要があ り ます。
OpenType 機能を扱 う 際には以下に留意 し て く だ さ い :
> OpenType 機能 (オプシ ョ ン features ・ script ・ language) は、 同一フ ォ ン ト 内のグ リ フ
群に対 し てのみ適用 さ れますので、フ ォールバ ッ ク フ ォ ン ト を指定 し てい る 場合は、マ
ス タ ーフ ォ ン ト と 1 個ない し 複数の フ ォールバ ッ ク フ ォ ン ト と にわた る グ リ フ群には
適用 さ れません。

166 第 7 章 : テキス ト 出力
> 必ず、 必要な場面でそのつど各機能を有効 ・ 無効を切 り 替え て く だ さ い。 OpenType 機
能を う っ か り 全テ キ ス ト に対 し て有効な ま ま に し てお く と 、 予期 し ない結果が生 じ る
こ と があ り ます。
> 以下の機能はデフ ォ ル ト で有効化 さ れます : calt ・ ccmp ・ clig ・ liga ・ locl。

OpenType 機能を制御 テ キ ス ト の部分ご と に、 必要に応 じ て OpenType 機能の有効 と 無


効を切 り 替え る こ と がで き ます。 features テ キ ス ト オプシ ョ ン を使っ て機能を名前で有効
化 し 、 機能名の頭に no をつけてそれを無効化 し ます。 た と えば、 ス モールキ ャ ッ プ ス機
能を テ キ ス ト フ ロ ーに対す る イ ン ラ イ ン オプシ ョ ン リ ス ト で有効化す る には以下を使用
し ます :
<features={smcp}>PDF<features={nosmcp}

テ キ ス ト 行に対 し ては以下の よ う に OpenType 機能を有効にで き ます :


p.fit_textline("PDF", x, y, "features={smcp}");

すべて の機能 を 無効化す る には、 キー ワ ー ド _none を 用い る か、 フ ォ ン ト オプ シ ョ ン


readfeatures=false を用いて関連の OpenType テーブルを無視 し ます。 OpenType 機能は、
PDFlib Personalization Server (PPS) で利用す る ためのブ ロ ッ ク プ ロ パテ ィ と し て有効にす
る こ と も 可能です。

制御キ ャ ラ ク タ ーで合字を無効に 言語に よ っ ては、 あ る 特定の状況では合字を使っ て


はいけない も のがあ り ます。 ド イ ツ語な ど の言語におけ る タ イ ポグ ラ フ ィ ー規則では、 複
合語の境界 を ま た ぐ 合字の使用 を 禁 じ て い ま す。 た と え ば f+i の組み合わせは、 単語
Schilfinsel 内では合字へ置 き 換え てはいけ ません。 合成 さ れた 2 つの単語の境界を ま たい
でい る か ら です。
先述の よ う に、 合字な ど の OpenType 機能の処理は、 features オプシ ョ ン で有効 ・ 無効
を切 り 替え る こ と がで き ます。上記の よ う な場合のたびに合字を オプシ ョ ンで無効に し て
い く のは面倒です。 シ ン プルな合字制御を提供す る ために、 テ キ ス ト 内の制御キ ャ ラ ク
タ ーで合字を無効にす る 機能があ り ますので、 こ れを利用すれば、 機能の有効 ・ 無効を た
く さ んのオプシ ョ ンで切 り 替え る 必要はな く な り ます。連続す る キ ャ ラ ク タ ーの間にゼロ
幅非接合子 (U+200C、 &zwnj;、 表 7.6 も 参照) キ ャ ラ ク タ ーを挿入すれば、 合字が有効
に し て あ っ て も 、 その箇所は合字へ置 き 換わ ら な く な り ます。 た と えば、 以下の コ ー ド は
f+i 合字を作成 し ません :
<features={liga charref=true}>Schilf&zwnj;insel

7.4.3 用字系 ・ 言語固有の OpenType レ イ アウ ト 機能


OpenType 機能は、 あ ら ゆ る 場面で適用 さ れ る も の も あ り ます し 、 あ る 特定の用字系に対
し て実装 さ れてい る も の も あ り ます。あ る 特定の用字系 と 言語 と の組み合わせに対 し て実
装 さ れてい る も の も あ り ます。 こ のため、 features オプシ ョ ン と と も に script ・ language
テ キ ス ト オプシ ョ ン を与え る こ と が可能です。 こ れ ら が効力を持つのは、 その機能が フ ォ
ン ト 内で用字系ま たは言語に固有な形で実装 さ れてい る 場合のみです。
た と えば、 f ・ i グ リ フ に対す る 合字は、 い く つかの フ ォ ン ト においては、 ト ル コ 語が
選ばれてい る と き には有効化 さ れません (なぜな ら ト ル コ 語では点のない i が使用 さ れ る
ので、 i の合字形はそれ と 混同 し やすいか ら です)。 その よ う な フ ォ ン ト を用いてい る 場合
に、 以下のテ キ ス ト フ ロ ーオプシ ョ ン リ ス ト は、 用字系 / 言語を一切指定 し ていないの
で、 望ま ない合字を生成 し ます :

7.4 OpenType レ イ アウ ト 機能 167


<features={liga}>fi

し か し 、 以下のテ キ ス ト フ ロ ーオプシ ョ ン リ ス ト は、 ト ル コ 語オプシ ョ ンがあ る ので合字


を作成 し ません :
<script=latn language=TRK features={liga}>fi

locl 機能は、 言語固有のキ ャ ラ ク タ ー字体を選択 し ます。 例 :

セルビア語用キャラクター字体:
<features={locl} script=cyrl language=SRB charref>&#x0431;

ウルドゥー語用数字字体:
<features={locl} script=arab language=URD charref>&#x0662;&#x0663;&#x0664;&#x0665;

script ・ language オプシ ョ ンは、 OpenType 仕様で定義 さ れてい る キーワ ー ド に対応 し てい


ます。 世界の さ ま ざ ま な地域に対す る 例を表 7.3 と 表 7.4 に挙げます。 用字系キーワ ー ド
は必ず 4 字です。それ よ り キーワ ー ド が短い場合には スペース キ ャ ラ ク タ ーが末尾につい
てい ますので、 script オプシ ョ ンの値に も それを含め る 必要があ り ます。

表 7.3 features オプ シ ョ ン と と も に使用で き る、 対応 し ている用字系。 対応 し ているすべての用字系を挙


げているわけではあ り ません。
用字系の名前 キーワー ド 用字系の名前 キーワー ド

特殊 南 ・ 中央ア ジ アⅠ : イ ン ド 公用用字系

用字系無指定 _none デーヴ ァ ナーガ リ ー deva

自動用字系検出 _auto グジ ャ ラ ー ト gujr

欧州 テルグ telu

欧文 latn ベン ガル beng

キリル cyrl オデ ィ ア (以前はオ リ ヤー) orya

ギリシャ grek カ ンナダ knda

中東 グルムキー guru

ヘブ ラ イ hebr タ ミル taml

アラ ビア arab マ ラ ヤー ラ ム mlym

東ア ジ ア 南 ・ 中央ア ジ アⅡ : その他現代用字系

日中韓表意文字 hani チベ ッ ト tibt

ハングル hang モ ン ゴル mong

ハングル字母 jamo 東南ア ジ ア

注音符号 bopo タイ thai

彝 yi ラ ーオ lao

西夏 tang タイ ヴィエト tavt

ひ らがな hira 表記法

カ タ カナ kana 点字 brai

168 第 7 章 : テキス ト 出力
表 7.4 language オプ シ ョ ンに対するキーワー ド 。 対応 し ているすべての言語を挙げているわけではあ り ま
せん。
キー キー キー
ワー ワー ワー
ド 言語 ド 言語 ド 言語
_none 言語指定な し ELL ギ リ シ ャ語 PLK ポー ラ ン ド 語
ARA ア ラ ビ ア語 GUJ グジ ャ ラ ー ト 語 ROM ルーマニア語
BEN ベン ガル語 IWR ヘブ ラ イ語 RUS ロ シ ア語
BGR ブルガ リ ア語 HIN ヒ ンデ ィ ー SRB セルビ ア語
CAT カ タ ルーニ ャ 語 HUN ハン ガ リ ー語 SND シン ド語
ZHP 中国語注音符号 IND イ ン ド ネシ ア語 SNH シ ンハ ラ語
ZHS 中国語簡体字 JAN 日本語 ESP スペ イ ン語
ZHT 中国語繁体字 KAN カ ンナダ語 TAM タ ミ ル語
NLD オ ラ ン ダ語 KSH カ シ ミ ール語 TEL テルグ語
ENG 英語 KHM ク メ ール語 THA タ イ語
FAR ペルシ ア語 KOR 韓国語 TIB チベ ッ ト 語
FRA フ ラ ン ス語 ORI オ リ ヤー語 TRK ト ル コ 語1
DEU ド イ ツ語 PAS パシ ュ ト ー語 URD ウル ド ゥ ー語

1. い く つかのフ ォ ン ト は ト ル コ 語に対 し て誤 っ て TUR を用いていますので、 PDFlib は こ の タ グ を TRK と 等価 と し て


扱います。

7.4 OpenType レ イ アウ ト 機能 169


7.5 複雑用字系の出力
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク のcomplex_scripts/starter_shaping ト ピ ッ ク にあ り
ます。

7.5.1 複雑用字系
欧文用字系では左か ら 右へ、 1 つのキ ャ ラ ク タ ーの後に次のキ ャ ラ ク タ ーを配 し てい き ま
す。 他の用字系 (書記系) では他に も テ キ ス ト 出力のための必要事項があ り ます。 こ の よ
う な書記系を複雑用字系 と 呼ぶ こ と に し ます。 PDFlib は、 さ ま ざ ま な現代 と 昔の用字系の
ためのテ キ ス ト 処理を実行 し ます。 こ の項では こ の処理を さ ら に詳 し く 解説 し ます。 用字
系に よ っ ては他に も 処理が必要な も のがあ り ます :
> ア ラ ビ ア語 と ヘブ ラ イ 語では、 テ キ ス ト を右か ら 左へ置いてい き ま す。 混合テ キ ス ト
(ア ラ ビ ア文の中に欧文がは さ ま っ た) は、 右書き の部分 と 左書き の部分の両方を含み
ます。 こ れ ら の部分は並べ替えの必要があ り 、 こ れを双方向 (Bidi) 問題 と いい ます。
> い く つかの用字系、 と り わけア ラ ビ ア語では、 キ ャ ラ ク タ ーの位置 (単独、 語頭 / 語中
/ 語尾) に よ っ て異な る キ ャ ラ ク タ ー形状を用い ます。
> キ ャ ラ ク タ ー列を必須合字へ置 き 換え ます。
> グ リ フ の位置を縦 ・ 横へ調整す る 必要があ り ます。
> イ ン ド 系用字系では、 い く つかのキ ャ ラ ク タ ーの並べ替えが必要です。すなわち、 キ ャ
ラ ク タ ーはテ キ ス ト 内での位置が変わ る こ と があ り ます。

シ ェ ー ピ ン グ こ れ ら の処理ス テ ッ プを1つない し 複数必要 と する 用字系を複雑用字系 と


呼びます。入力 さ れた論理テ キ ス ト か ら 正 し い表記を作 り 上げ る 処理を シ ェ ーピ ン グ と い
い ます。 シ ェーピ ン グは、 キ ャ ラ ク タ ーが単語の先頭 ・ 途中 ・ 末尾、 独立 し た位置のいず
れに あ る か に応 じ て、 適切 な グ リ フ を 選択 し ま す。 シ ェ ー ピ ン グ は ア ラ ビ ア 語 と ヒ ン
デ ィ ーのテ キ ス ト 組版の不可欠な要素です。 シ ェーピ ン グは、 2 つ以上のキ ャ ラ ク タ ーの
列 を 然 る べ き 合字へ置 き 換え た り 、 キ ャ ラ ク タ ー を 並べか え た り す る こ と も あ り ま す。
シ ェ ー ピ ン グ 処理が キ ャ ラ ク タ ーの字体 を 自動的に決定 し ま すの で、 明示的な合字 と
Unicode 表示形 (U+FB50 以降の Arabic Presentation Forms A な ど) を入力キ ャ ラ ク タ ー と
し て使用 し てはいけ ません。

注意 複雑用字系のシ ェ ーピ ン グ を扱 う 際には以下に留意 し て く だ さ い :
> PDFlib は shaping・script オプシ ョ ン を自動的には設定せず、ユーザーがそれ ら を与え る
と 前提 し てい ます。
> 用字系固有のシ ェーピ ン グ (オプシ ョ ン shaping ・ script ・ language) は、 同一フ ォ ン ト
か ら のグ リ フ群に対 し てのみ適用 さ れ、 複数の フ ォ ン ト にわた る グ リ フ群には適用 さ
れ ません。 フ ォ ールバ ッ ク フ ォ ン ト を使っ てい る 場合は、 シ ェ ーピ ン グは同一 (ベー
ス ま たは予備) フ ォ ン ト のテ キ ス ト 区間内でのみ適用 さ れます。
> シ ェ ーピ ン グはテ キ ス ト 内のキ ャ ラ ク タ ーの順番を変え る こ と があ り ますので、 単語
内の属性変更については注意を払 う 必要があ り ます。 た と えば、 テ キ ス ト フ ロ ー内で
イ ン ラ イ ンオプシ ョ ン を用いて単語内の 2 番目のキ ャ ラ ク タ ーに色をつけ よ う と し て
い る 場合に、 シ ェーピ ン グが 1 番目 と 2 番目のキ ャ ラ ク タ ーを入れ替え た ら ど う な る
ので し ょ う か。 こ の理由か ら 、 シ ェーピ ン グ さ れた テ キ ス ト の中での書式の変更は、単
語の途中では行わずに、 単語の境界でのみ行 う 必要があ り ます。

シ ェ ー ピ ン グのための要件 複雑用字系のシ ェ ーピ ン グ と と も に用い る ための フ ォ ン ト


は、 以下の要件を満た し てい る 必要があ り ます :

170 第 7 章 : テキス ト 出力
> 選択 し た用字系に対 し て必要な OpenType 機能テーブルを フ ォ ン ト が持っ てい る 必要
があ り ます。
> フ ォ ン ト を encoding=unicode か glyphid で読み込む必要があ り ます。
> PDF_load_font( ) の vertical オプシ ョ ンは用いてはいけ ません。 ま た、 readshaping オプ
シ ョ ン を false に設定 し てはいけ ません。

7.5.2 シ ェ ー ピ ン グ処理を制御
用字系の選択 複雑用字系の処理 (shaping オプシ ョ ン) には script オプシ ョ ンが必須で
す。 さ ら に language オプシ ョ ン を与え る こ と も で き ます。 こ れはシ ェーピ ン グの言語独
自の側面を制御 し ます。 た と えばア ラ ビ ア語 と ウ ル ド ゥ ー語で数字を変え る な ど です。 し
か し 、 言語独自のシ ェーピ ン グ テーブルを持っ てい る フ ォ ン ト はかな り 少ないので、 多 く
の場合には script オプシ ョ ン を与えれば充分であ り 、language オプシ ョ ン を用いてシ ェー
ピ ン グ を向上 さ せる こ と はで き ません。 こ のシ ェ ーピ ン グ処理は、 表 7.5 に挙げ る 用字系
に対応 し てい ます。 以下のオプシ ョ ン リ ス ト は、 ア ラ ビ ア語テ キ ス ト に対 し てシ ェーピ ン
グ ( と 双方向処理) を有効化 し ます :
shaping script=arab

表 7.5 shaping オプ シ ョ ンが対応 し ている用字系

地域 対応 し ている用字系 と そのキーワー ド

中東 ア ラ ビ ア (arab) ・ ヘブ ラ イ (hebr)

中央ア ジ ア シ ンハラ (sinh) ・ チベ ッ ト (tibt)

東南ア ジ ア ク メ ール (khmr) ・ タ イ (thai)

東ア ジ ア ハングル (hang) ・ 日中韓表意文字 (hani)

イン ド ベン ガル (beng) ・ デーヴ ァ ナーガ リ ー (deva) ・ グジ ャ ラ ー ト (gujr) ・ カ ン


ナダ (knda) ・ マ ラ ヤー ラ ム (mlym) ・ オデ ィ ア [以前はオ リ ヤー] (orya) ・
グルムキー (guru) ・ タ ミ ル (taml) ・ テルグ (telu)

script=_auto にす る と 、 PDFlib は、 テ キ ス ト 内のキ ャ ラ ク タ ーの多数が属す る 用字系を自


動的に割 り 当て ます。 欧文テ キ ス ト はシ ェーピ ン グ を必要 と し ませんので、 用字系を自動
的に決定す る 際には無視 さ れます。 PDF_info_textline( ) の scriptlist キーワー ド を使 う と 、
テ キ ス ト に対 し て用い ら れてい る 用字系を ク エ リ ーする こ と がで き ます。

言語の選択 language オプシ ョ ンは、テ キ ス ト が書かれてい る 自然言語を指定 し ます。表


7.3 に挙げ る キーワ ー ド が使え ます。 例 :
language=ARA
language=URD

注 テキス ト フ ローにおける高度な改行 (254 ページ 「9.2.10 高度な用字系固有の改行」 を参


照) で も、 言語固有の処理が行われますが、 こ れは language オプ シ ョ ンによ っ て制御 さ
れるのではな く 、 locale オプ シ ョ ンによ っ て制御 さ れます。 locale オプ シ ョ ンは言語だけ
でな く 、 国 と 地域を も 特定する も のです。

シ ェ ー ピ ン グ動作を オーバー ラ イ ド 場合に よ っ て、 シ ェ ー ピ ン グ動作を オーバー ラ イ


ド し たい こ と も あ り ます。 PDFlib は こ の目的のためにい く つかの Unicode 組版キ ャ ラ ク

7.5 複雑用字系の出力 171


タ ーをサポー ト し てい ます。 簡便のために、 こ れ ら の組版キ ャ ラ ク タ ーは、 実体名を用い
て指定す る こ と も 可能です (参照)。

表 7.6 デ フ ォ ル ト のシ ェ ーピ ン グ動作を オーバー ラ イ ド する Unicode 制御キ ャ ラ ク タ ー


組版キ ャ ラ
ク ター 実体名 Unicode 名 機能

U+200C ZWNJ ZERO WIDTH NON-JOINER 隣 り 合 う 2 つのキ ャ ラ ク タ ーど う し がつながる こ と を


防ぐ

U+200D ZWJ ZERO WIDTH JOINER 隣 り 合 う 2 つのキ ャ ラ ク タ ーど う し を強制的につなげ


7.5.3 双方向組版
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク のcomplex_scripts/bidi_formatting ト ピ ッ ク にあ り
ます。

右書 き のテ キ ス ト (ア ラ ビ ア語 ・ ヘブ ラ イ 語をは じ め と す る さ ま ざ ま な用字系) において


は、 ア ド レ スや別言語に よ る 引用な ど で、 左書き の欧文テ キ ス ト 列がネ ス ト さ れ る こ と が
非常に頻繁にあ り ます。 こ の よ う な混在テ キ ス ト 列では双方向 (Bidi) 組版が必要にな り
ます。 数字はつねに左書 き さ れますので、 双方向問題は、 全 く ア ラ ビ ア語 ・ ヘブ ラ イ 語だ
けで書かれた テ キ ス ト に も 生 じ ま す。 双方向処理は、 オプ シ ョ ン で有効にす る 必要はな
く 、 右書 き のテ キ ス ト が適切な script オプシ ョ ン と と も に現れた際には、 シ ェ ーピ ン グ処
理の一環 と し て自動的に適用 さ れます。

注 双方向処理は、 複数行テキス ト フ ローでは対応 し てお ら ず、 テキス ト 行 (すなわち一行テ


キス ト 出力) でのみ対応 し ています。

双方向アルゴ リ ズム を オーバー ラ イ ド 自動双方向処理は多 く の場合において適切な結


果を与え ますが、 場合に よ っ ては明示的なユーザー制御が必要な こ と も あ り ます。 PDFlib
では こ の目的のためにい く つかの方向組版 コ ー ド に対応 し てい ます。 利用の便宜のため、
こ れ ら の組版キ ャ ラ ク タ ーは実体で指定する こ と も 可能です (表 7.7 参照)。 こ れ ら の双
方向組版 コ ー ド は、以下の よ う な場合にデフ ォ ル ト の双方向アルゴ リ ズ ム をオーバー ラ イ
ド する のに有用です :
> 右書 き の段落が左書 き のキ ャ ラ ク タ ー群で始ま る 場合。
> 混在テ キ ス ト 列がネ ス ト さ れてい る 場合。
> 左書 き テ キ ス ト と 右書 き テ キ ス ト と の間の境界に、 句読点な ど弱いキ ャ ラ ク タ ー群が
あ る 場合。
> 混在テ キ ス ト を含む製品番号な ど の場合。

右書き 文書処理の向上のためのオ プ シ ョ ン さ ま ざ ま な組版オプシ ョ ンや Acrobat の動


作のデフ ォ ル ト 設定は、 左書 き テ キ ス ト 出力に合わせて設定 さ れてい ます。 右書き のテ キ
ス ト 組版 と 文書表示のためには、 以下のオプシ ョ ン を用い ます :
> テ キ ス ト 行を、 以下のはめ込みオプシ ョ ンで右揃えで配置 し ます :
position={right center}

> リ ーダーを、 テ キ ス ト と 左枠の間に作成 し ます :


leader={alignment=left text=.}

172 第 7 章 : テキス ト 出力
表 7.7 双方向アルゴ リ ズムを オーバー ラ イ ド する ための方向組版 コ ー ド
組版 コ ー ド 実体名 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 の前の双
方向ス テー タ スへ復帰

> PDF_begin/end_document( ) の以下のオプシ ョ ン を用いて、 Acrobat での右書き 文書 ・


ページ表示を改善 し ます :
viewerpreferences={direction=r2l}

コ ー ド 内で双方向テキス ト を扱 う 双方向テ キ ス ト を扱 う 際には以下 も 有用で し ょ う :


> PDF_info_textline( ) の startx/starty・endx/endy キーワ ー ド を用い る と 、それぞれ論理的
開始 ・ 終了キ ャ ラ ク タ ーの座標を知 る こ と がで き ます。
> PDF_info_textline( ) の writingdirx キー ワー ド を用い る と 、テ キ ス ト の主流な書記方向を
知 る こ と がで き ます。 こ の方向は、 テ キ ス ト の先頭キ ャ ラ ク タ ー群か ら 、 ま たは表 7.7
に従っ た方向組版 コ ー ド (テ キ ス ト 内にあれば) か ら 推定 さ れます。
> PDF_info_textline( ) の position オプシ ョ ンで auto キーワー ド を用い る と 、自動的にア ラ
ビ ア語ま たはヘブ ラ イ 語のテ キ ス ト は右枠へ、欧文テ キ ス ト は左枠へ寄せ ら れます。た
と えば以下のテ キ ス ト 行オプシ ョ ンは、 テ キ ス ト をベース ラ イ ン上に右寄せま たは左
寄せ し ます :
boxsize={width 0} position={auto bottom}

7.5.4 ア ラ ビ ア語テキス ト 組版
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の complex_scripts/arabic_formatting ト ピ ッ ク にあ
り ます。

上述の双方向組版 と テ キ ス ト のシ ェ ーピ ン グに加え、ア ラ ビ ア用字系のテ キ ス ト 出力の生


成に関 し ては、 ほかに も 組版上の側面がい く つかあ り ます。

ア ラ ビ ア合字 ア ラ ビ ア用字系は合字を多用 し ます。多 く のア ラ ビ ア語フ ォ ン ト は 2 種類


の合字を含んでお り 、 それぞれ PDFlib では異な る 扱いを受け ます :
> 必須合字 (rlig 機能) はつねに適用す る 必要があ り ます。 ラ ーム - ア リ フお よ びその派
生形な ど が こ れにあ た り ます。 必須合字は、 script=arab で shaping オプシ ョ ン を有効
に し てい る 場合に自動的に使用 さ れます。
> 任意ア ラ ビ ア合字 (liga ・ dlig 機能) は自動的には使用 さ れず、 他のユーザー制御の
OpenType 機能 と 同様に、 すなわち features={dlig} で有効にする こ と がで き ます。 任意
ア ラ ビ ア合字は、 複雑用字系処理 と シ ェーピ ン グの後に適用 さ れます。

7.5 複雑用字系の出力 173


合字を さ せない あ る 種の略称な ど、場合に よ っ ては、隣 り 合 う キ ャ ラ ク タ ーを合字に さ
せた く ない こ と があ り ます。 こ の場合には、 表 7.6 に挙げた組版キ ャ ラ ク タ ーを用いて、
合字を強制 し た り 禁止 し た り す る こ と がで き ます。 た と えば、 以下の例のゼ ロ 幅非結合子
は、 キ ャ ラ ク タ ーが合字を形成す る こ と を禁止 し て、 正 し い略称表記を生成 し てい ます :
&#x0623;&#x064A;&ZWNJ;&#x0628;&#x064A;&ZWNJ;&#x0625;&#x0645;

ア ラ ビ ア語テキス ト におけ る タ ト ウ ィ ール タ ト ウ ィ ールキ ャ ラ ク タ ー U+0640 (カ シー


ダ と も い う ) を 1 個ない し 複数挿入す る こ と に よ っ て、 ア ラ ビ ア単語を引き 伸ばす こ と が
で き ます。PDFlib は自動的に タ ト ウ ィ ールキ ャ ラ ク タ ーを挿入する こ と に よ る テ キ ス ト の
均等揃えは行い ませんが、 こ のキ ャ ラ ク タ ーを自分で入力テ キ ス ト 内に挿入 し て単語を引
き 伸ばす こ と はで き ます。

ア ラ ビ ア語 フ ォ ン ト に欧文キ ャ ラ ク タ ー を追加 Google の Noto fontsmacOS な ど い く つ


かのア ラ ビ ア語フ ォ ン ト は、 欧文キ ャ ラ ク タ ーに対す る グ リ フ を一切含んでい ません。 こ
の場合は fallbackfonts オプシ ョ ン を使っ て、欧文キ ャ ラ ク タ ーを ア ラ ビ ア語フ ォ ン ト に連
結す る こ と がで き ます。 PDFlib は、 欧文ま たはア ラ ビ ア語のテ キ ス ト 入力に従っ て自動的
に両フ ォ ン ト を切 り 替え ます。 すなわち、 アプ リ ケーシ ョ ン側で フ ォ ン ト を切 り 替え る 必
要はな く 、欧文 と ア ラ ビ ア語が混在す る テ キ ス ト を 1 個の フ ォ ン ト 指定で与え る こ と がで
き ます。
fallbackfonts オプシ ョ ン に対 し て以下の フ ォ ン ト 読み込みオプシ ョ ン リ ス ト を用い る
と 、NotoNaskhArabic-Regular フ ォ ン ト へ NotoSerif-Regular フ ォ ン ト の欧文キ ャ ラ ク タ ー群
を追加す る こ と がで き ます :
fontname=NotoNaskhArabic-Regular
fallbackfonts={ {fontname=NotoSerif-Regular} }

174 第 7 章 : テキス ト 出力
7.6 日本語 ・ 中国語 ・ 韓国語テ キス ト 出力
7.6.1 TrueType ・ OpenType 日中韓 フ ォ ン ト を用い る
PDFlib は、 TrueType ・ TrueType/OpenType Collections (TTC/OTC) ・ OpenType 形式の日
中韓フ ォ ン ト に対応 し てい ます。 日中韓フ ォ ン ト は以下の よ う に処理 さ れます :
> embedding オプシ ョ ンが true な ら ば、フ ォ ン ト は CID フ ォ ン ト に変換 さ れて、PDF 出力
に埋め込まれます。
> Windows 上の日中韓ホ ス ト フ ォ ン ト 名は、BOM 付 き UTF-8 形式か UTF-16 形式で PDF_
load_font( ) に与え る こ と がで き ます。 macOS では非欧文ホ ス ト フ ォ ン ト 名に対応 し て
い ません。

以下の例では、 中国語テ キ ス ト を ArialUnicodeMS フ ォ ン ト で印字 し てい ます。 フ ォ ン ト


は、 シ ス テ ムに イ ン ス ト ール さ れてい る か、 あ る いは 141 ページ 「6.3.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/OTC フ ァ イ ルは、複


数の別々の フ ォ ン ト を持っ てい ます。 各フ ォ ン ト を利用す る にはその適切な名
前を与え ます。 ただ し 、 TTC/OTC フ ァ イ ル内が ど の フ ォ ン ト を持っ てい る か
を知 ら ない場合には、 各フ ォ ン ト を番号で指定す る こ と も 可能です。 具体的に
は、 コ ロ ン と フ ォ ン ト 番号 (0 か ら 始ま る ) を追加す る こ と に よ り 指定 し ます。
番号が 0 の場合には省略可能です。 た と えば、 TTC/OTC フ ァ イ ル msgothic.ttc は複数の
フ ォ ン ト を持っ てお り 、 PDF_load_font( ) で以下の よ う に指定す る こ と がで き ます (各行
内の フ ォ ン ト 名は等価) :
msgothic:0 MS Gothic msgothic:
msgothic:1 MS PGothic
msgothic:2 MS UI Gothic

ただ し 、 msgothic (接尾辞をつけない) はフ ォ ン ト 名 と し ては扱われません。 なぜな ら そ


れでは フ ォ ン ト を一意に特定で き ないか ら です。 フ ォ ン ト 名のエ イ リ ア ス (141 ページ
「フ ォ ン ト デー タ の ソ ース」 参照) を TTC/OTC 番号 と 組み合わせて用い る こ と も 可能で
す。指定 さ れた番号の フ ォ ン ト が見つか ら ない と き には、メ ソ ッ ド 呼び出 し は失敗 し ます。
TTC/OTC フ ォ ン ト フ ァ イ ルは 1 回のみ構成 し なければな り ません。TTC/OTC フ ァ イ
ル内のすべての番号づけ ら れた フ ォ ン ト は自動的に発見 さ れ ま す。 以下に、 msgothic.ttc
内のすべて の番号づけ ら れた フ ォ ン ト を 構成す る た めに充分な コ ー ド を 示 し ま す (141
ページ 「6.3.4 フ ォ ン ト を検索」 参照) :
p.set_parameter("FontOutline", "msgothic=msgothic.ttc");

7.6.2 横書き と 縦書き


PDFlib は横書 き と 縦書 き に対応 し てい ます。 縦書 き は さ ま ざ ま な方法で要求で き ます :
> TrueType・OpenType フ ォ ン ト の場合は、vertical オプシ ョ ン を与えれば縦書 き で利用で
き ます。
> 「@」 キ ャ ラ ク タ ーで始ま る フ ォ ン ト 名はつねに縦書 き で処理 さ れます。

7.6 日本語 ・ 中国語 ・ 韓国語テキス ト 出力 175


デ フ ォ ル ト では縦書 き ではすべて の グ リ フ が同 じ 高 さ を 持ち ま す。 た だ し TrueType ・
OpenType フ ォ ン ト は、 縦書 き についてプ ロ ポーシ ョ ナルな メ ト リ ッ ク を内容 と する こ と
も で き ます。 PDFlib では、 フ ォ ン ト オプシ ョ ン readverticalmetrics (デフ ォ ル ト は false)
を設定す る こ と に よ っ て、その よ う なプ ロ ポーシ ョ ナルな縦書き メ ト リ ッ ク を使用 さ せる
こ と も 可能です。

注 縦書き で文字の間をあけるには字間を負にする必要があ り ます。

OpenType フ ォ ン ト は、表 7.8 に挙げ る OpenType レ イ ア ウ ト 機能を持っ てい る 場合があ り


ます。 こ れ ら の機能は、 デフ ォ ル ト の字形を、 縦書き 用に調整 さ れた異体字へ置き 換え る
も のです。 う ち vkna 機能については、 features テ キ ス ト オプシ ョ ン を用いて制御する こ
と が可能であ り 、 ま た vrt2/vert は、 縦書 き では自動的に有効にな り ます。

表 7.8 縦書き テキス ト のための OpenType レ イ アウ ト 機能


キー
ワー ド 名称 説明
1
vert 縦組み デ フ ォル ト の字形を、 縦書き用に調整 さ れた異体字へ置き換え。
vkna 縦組みかな切替 標準のかな を、 縦書きのためにデザイ ン さ れた字形へ置き換え。
1
vrt2 縦組み切替 ・ 回転 い く つかの等幅のグ リ フ (半角 ・ 三分の一幅 ・ 四分の一幅) と プ ロポーシ ョ ナル幅
のグ リ フ (主に欧文 と カ タ カ ナ) を、 縦書き に適 し た字形へ、 すなわち 90°
時計回
り さ せた形へ置き換え。 この機能が存在 し ている と き には、 vrt2 の部分集合であ る
vert 機能は無効化 さ れます。

1. 縦書き における フ ォ ン ト に対 し ては自動的に有効化 さ れます

7.6.3 EUDC ・ SING フ ォ ン ト に よ る外字キ ャ ラ ク タ ー


PDFlib は、 日中韓テ キ ス ト の た めの カ ス タ ム 外字 キ ャ ラ ク タ ー を 利用で き る Windows
EUDC (エ ン ド ユーザー定義キ ャ ラ ク タ ー、 *.tte) ・ SING フ ォ ン ト (*.gai) に対応 し てい
ます。 最 も 便利なのは、 カ ス タ ム キ ャ ラ ク タ ーを持っ た フ ォ ン ト を フ ォールバ ッ ク フ ォ ン
ト 機構で他のフ ォ ン ト へ統合す る こ と で し ょ う 。

外字キ ャ ラ ク タ ーに対 し て フ ォ ールバ ッ ク フ ォ ン ト を用い る 通常、 外字キ ャ ラ ク タ ー


は Windows EUDC ま たは SING グ リ フ レ ッ ト か ら 持っ て来ますが、 fallbackfonts オプシ ョ
ンはあ ら ゆ る 種類のフ ォ ン ト を受け付け ます。ですので こ の方法は外字キ ャ ラ ク タ ーに限
ら ず、 あ ら ゆ る 種類の記号に対 し て利用す る こ と がで き ます (例 : 企業 ロ ゴが別フ ォ ン ト
内にあ る 場合)。 fallbackfonts オプシ ョ ンに対 し て以下の フ ォ ン ト オプシ ョ ン を用いれば、
読み込んだフ ォ ン ト に対 し て、 EUDC フ ォ ン ト か ら のユーザー定義 (外字) キ ャ ラ ク タ ー
を追加す る こ と がで き ます :
fallbackfonts={
{fontname=EUDC forcechars=U+E000 fontsize=140% textrise=-20%}
}

ベース フ ォ ン ト をひ と たび こ のフ ォールバ ッ ク フ ォ ン ト 構成で読み込めば、テ キ ス ト 内の


EUDC キ ャ ラ ク タ ーは、 フ ォ ン ト を変え る 必要な く 使 う こ と がで き ます。
SING フ ォ ン ト の場合、 Unicode 値は PDFlib に よ っ て自動的に決定 さ れますので、 与え
る 必要はあ り ません :

176 第 7 章 : テキス ト 出力
fallbackfonts={
{fontname=PDFlibWing encoding=unicode forcechars=gaiji}
}

外字キ ャ ラ ク タ ーに対す る PUA 値を温存 場合 に よ っ て は、 た と え ば Windows EUDC


フ ォ ン ト では、 その フ ォ ン ト に よ っ て外字キ ャ ラ ク タ ーが私用領域 (PUA) 内の Unicode
値へマ ッ プ さ れてい ます。 デフ ォ ル ト では、 PDFlib は、 生成する PDF (ToUnicode CMap)
内では PUA 値を U+FFFD (Unicode 置換キ ャ ラ ク タ ー) へ置 き 換え ます。 結果 と し て、 そ
の よ う な キ ャ ラ ク タ ーは、 生成 さ れ る PDF か ら 正 し く 抽出で き ません。
こ の動作は、 preservepua フ ォ ン ト オプシ ョ ン を用いて変え る こ と も で き ます。 こ れが
true に設定 さ れてい る 場合には、PUA 値を持つ外字キ ャ ラ ク タ ーはその Unicode 値を温存
し ます。

7.6.4 OpenType レ イ ア ウ ト 機能 と 日中韓テキス ト 出力


163 ページ 「7.4 OpenType レ イ ア ウ ト 機能」 で解説 し た よ う に、 PDFlib は OpenType ・
TrueType フ ォ ン ト 内の高度な タ イ ポグ ラ フ ィ ーレ イ ア ウ ト テーブルに対応 し てい ます。た
と えば、 OpenType 機能を用いて、 欧文グ リ フ のプ ロ ポーシ ョ ナル幅か半角かいずれかの
字体を選択 し た り 、 異体字を選択 し た り す る こ と が可能です。 表 7.9 に、 日中韓テ キ ス ト
のための OpenType 機能を挙げます (他に、 一般的用途のための OpenType レ イ ア ウ ト 機
能を表 7.2 に、 縦書 き のための機能を表 7.8 に挙げてい ます)。

表 7.9 日本語 ・ 中国語 ・ 韓国語テキス ト 用の対応 OpenType レ イ アウ ト 機能


キー
ワー ド 名前 説明
expt エキスパー ト 字形 JIS78 字 と 同様、 この機能は、 標準の和文字形を、 対応する、 タ イ ポグ ラ フ ァ ーが
望む字形へ置き換え ます。
fwid 全角 他の幅に設定 さ れたグ リ フ を、 全角 (たいていは em) に設定 さ れたグ リ フへ置き
換え。 こ れは欧文キ ャ ラ ク タ ーや さ ま ざ ま な記号を含む可能性があ り ます。
hkna 横組み用仮名 標準の仮名を、 横書き専用にデザイ ン さ れた字形へ置き換え。
hngl ハン グル (ISO 14496-22:2015/Amd.2:2017 によ り 廃止) 韓文漢字キ ャ ラ ク タ ーを、 その対応す
るハングル (音素) キ ャ ラ ク タ ーへ置き換え。
hojo 補助漢字字形 (JIS JIS X 0213:2004 字形がデ フ ォ ル ト と し てエ ン コ ー ド さ れている場合に、 JIS X 0212-
X 0212-1990) 1990 字形 (「補助漢字」 と も いいます) を利用。
hwid 半角 プ ロポーシ ョ ナル幅の、 ま たは em の半分以外の等幅のグ リ フ を、 em の半分の幅
のグ リ フ へ置き換え。
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) の字
形へ置き換え。
locl1 ロー カ ラ イ ズ字形 グ リ フのロー カ ラ イ ズ さ れた字形で、 デ フ ォ ル ト 字形を置き換え る こ と を可能に し
ます。 こ の機能は script ・ language オプ シ ョ ン を必要 と し ます。

7.6 日本語 ・ 中国語 ・ 韓国語テキス ト 出力 177


表 7.9 日本語 ・ 中国語 ・ 韓国語テキス ト 用の対応 OpenType レ イ アウ ト 機能
キー
ワー ド 名前 説明
nalt 修飾字形 デ フ ォ ル ト のグ リ フ を、 さ ま ざ ま な表記字形へ置き換え (白丸囲み ・ 黒丸囲み ・ 四
角囲み ・ 括弧付き ・ 菱形囲み ・ 角丸四角囲みな ど)。
nlck 国語審議会漢字字 日本の国語審議会 (NLC) が多 く の JIS キ ャ ラ ク タ ーに対 し て 2000 年に制定 し た
形 新たなグ リ フ 形状を利用。
pkna プ ロポーシ ョ ナル 等幅 (半角ま たは全角) に設定 さ れた仮名および仮名関連のグ リ フ を、 プ ロポー
仮名 シ ョ ナルなグ リ フへ置き換え。
pwid プ ロポーシ ョ ナル 等幅 (通常、 全角または em の半分) に設定 さ れたグ リ フ を、 プ ロポーシ ョ ナルな
グリ フ 字送 り のグ リ フへ置き換え。
qwid 四分の一幅 他の幅のグ リ フ を、 em の 4 分の 1 の幅に設定 さ れたグ リ フ へ置き換え。
ruby ルビ表記字形 デ フ ォ ル ト の仮名グ リ フ を、 (通常、 上付き に さ れた) ルビ用にデザイ ン さ れた、
よ り 小 さ いグ リ フへ置き換え。
smpl 簡体字 和文漢字または中文繁体字を、 その対応する簡体字へ置き換え。
tnam 名前旧字体 和文新字体を、 その対応する旧字体へ置き換え。 これは trad 機能 と 等価ですが、
ただ し 個人の名前における使用が適切である と 認め ら れる旧字体に限られます。
trad 旧字体 和文漢字または中文簡体字を、 その対応する旧字体 / 繁体字へ置き換え。
twid 三分の一幅 他の幅のグ リ フ を、 em の 3 分の 1 の幅に設定 さ れたグ リ フ へ置き換え。

1. こ の機能はデ フ ォル ト で有効化 さ れます。

178 第 7 章 : テキス ト 出力
7.7 Unicode 異体字セ レ ク タ ー (UVS)
1 つの Unicode キ ャ ラ ク タ ーを表現す る グ リ フ が何種類 も 存在す る こ と も あ り ます。通常、
そ う し た視覚的差異は、 適切な フ ォ ン ト (レ ギ ュ ラ ーか イ タ リ ッ ク かな ど) か、 OpenType
機能で選択 さ れ る フ ォ ン ト 内の代替グ リ フ (ス ウ ォ ッ シ ュ キ ャ ラ ク タ ーな ど) を使っ て実
現 さ れます。 場面に よ っ ては、 グ リ フ の選択がセマ ン テ ィ ッ ク に意味を持ち、 フ ォ ン ト 関
連の組版情報一切 な し で プ レ ー ン テ キ ス ト 内で も そ れ を 明確にす る 必要が あ り ま す。
Unicode は こ の目的のために異体字セ レ ク タ ーを提供 し てい ます。

7.7.1 各種の異体字シーケ ン ス
1 つの Unicode 異体字シーケ ン ス (UVS) は、 1 つのベース Unicode キ ャ ラ ク タ ー と 、 その
後の 1 つの異体字セ レ ク タ ーか ら 成っ てい ます。 こ のシーケ ン ス は こ のベース キ ャ ラ ク
タ ーの異体字を選択 し ます。Unicode規格は各種のシーケ ン ス を定義 し てい ます。OpenType
フ ォ ン ト は、 異体字グ リ フ と その異体字セ レ ク タ ーを指定する UVS テーブルを持つ こ と
がで き ます。 こ の UVS テーブルは、 その フ ォ ン ト 内でデフ ォ ル ト ではど のグ リ フ異体字
が使用 さ れ、 ど の代替グ リ フ群が利用可能かを指定 し ます。

標準化異体字シーケ ン ス こ れ ら はUnicodeキ ャ ラ ク タ ーデー タ ベース内で定義 さ れてい


ます。 こ れ ら は U+FE00 VS1 ~ U+FE0D VS14 の異体字セ レ ク タ ーの う ちの一つを使用 し ま
す (目下 VS1 のみが標準化 さ れてい ます)。 それをベース キ ャ ラ ク タ ーの後に配す る 必要
があ り ます。 標準化異体字シーケ ン ス は、 数学グ リ フ の字体 と 、 モン ゴル語のテ キ ス ト の
ために使用 さ れます。

絵文字異体字シーケ ン ス 絵文字異体字シーケ ン ス と い う リ ス ト の中に、 数百個の絵文


字キ ャ ラ ク タ ーが含まれてい ます。 こ れ ら はテ キ ス ト ス タ イ ル (たいていは単色) と 絵文
字ス タ イ ル (たいていはカ ラ ー) で利用可能です。 こ の選択は、 Unicode キ ャ ラ ク タ ーの
後に 1 つか 2 つの異体字セ レ ク タ ーを配す る こ と に よ っ てオーバー ラ イ ド す る こ と も 可能
です :
> U+FE0E VS15 テ キ ス ト 表示セ レ ク タ ーはテ キ ス ト ス タ イ ル (単色) のグ リ フ を選択 し
ます。 テ キ ス ト ス タ イ ルのほ う が望ま し い場面 と し てはた と えば、 グ リ フ に内蔵 さ れ
てい る 色に依存せずにカ ス タ ムの色を グ リ フ に適用 し たい場合な ど です。
> U+FE0F VS16 絵文字表示セ レ ク タ ーは絵文字ス タ イ ル (カ ラ ー) のグ リ フ を選択 し ま
す。

Unicode 規格では各絵文字キ ャ ラ ク タ ーのデ フ ォ ル ト の ス タ イ ル を 指定 し て い ま すが、


フ ォ ン ト 内の UVS テーブルは個別のキ ャ ラ ク タ ーについてデフ ォ ル ト を変え る こ と も で
き ます。 よ り 重要なのは、 こ れ ら の異体字を利用可能か ど う かはフ ォ ン ト デザ イ ナーに依
存す る 点です。

表意文字異体字シーケ ン ス (IVS) こ れ ら は、 Unicode Technical Standard #37 に従っ た登


録プ ロ セ ス に よ っ て定義 さ れてお り 、表意文字異体字デー タ ベース内に リ ス ト さ れてい ま
す。 た と えば、 日中韓互換表意文字のための異体字グ リ フ が利用可能です。 IVS は、 ベー
ス キ ャ ラ ク タ ー と し ての統一表意文字キ ャ ラ ク タ ー1 個 と 、U+E0100 VS17 ~ U+E01EF VS256
の 240 種の異体字セ レ ク タ ーの う ちの一つか ら 成 り ます。

7.7 Unicode 異体字セ レ ク タ ー (UVS) 179


図 7.2 デ フ ォル ト グ リ フ (左) と 異体字グ リ フ (右)

7.7.2 PDFlib で異体字シーケ ン ス


異体字グ リ フ を選択 PDFlib は、 OpenType フ ォ ン ト 内の UVS テーブルを、 それがフ ォ
ン ト オプシ ョ ン readselectors=false を用いて無効化 さ れていない限 り 、 解釈 し ます。
フ ォ ン ト が、 必要な グ リ フ を含んでい る こ と がわか っ てい る 場合には、 異体字シーケ
ン ス に対する 作業は、 単に PDFlib のテ キ ス ト 出力関数にそのシーケ ン ス を与えればすみ
ます。 以下の コ ー ド 断片は、 Unicode ベース キ ャ ラ ク タ ーのデフ ォ ル ト グ リ フ と 、 セ レ ク
タ ーに よ っ て選択 さ れた異体字を印字 し ます。 結果を図 7.2 に示 し ます。 それぞれのグ リ
フ のペアが違 う こ と がわか り ます :
p.fit_textline("&#x2268; &#x2268;&#xFE00;", 50, 700,
"fontname={Cambria Math} fontsize=24 charref=true");

p.fit_textline("&#x3402;&#xE0100; &#x3402;&#xE0101;", 50, 650,


"fontname={KozMinPr6N-Regular} fontsize=24 charref=true");

必要な グ リ フ がフ ォ ン ト にないな ど の原因に よ っ て、ベース キ ャ ラ ク タ ーに対する 異体字


セ レ ク タ ーに従え ない場合には、 それは無視 さ れます。

フ ォ ン ト 内の異体字セ レ ク タ ー を ク エ リ ー PDF_info_font( ) を使っ て、 フ ォ ン ト がそ も


そ も 異体字セ レ ク タ ーを含んでい る のか ど う か を チ ェ ッ ク す る こ と も で き ま す。 selector
キーワ ー ド を index オプシ ョ ン と と も に用いれば、 その フ ォ ン ト 内で得 ら れ る すべての異
体字セ レ ク タ ーの一覧を取得す る こ と がで き ます :
for (i = 0; i < 256; i++)
{
selectors[i] = (int) p.info_font(font, "selector", "index=" + i);
if (selectors[i] == -1)
{
selectorcount = i;
break;
}
}

以下の コ ー ド 断片を使 う と 、 フ ォ ン ト が、 Unicode 値 uv の後にセ レ ク タ ー s を配 し た特定


のシーケ ン ス に対す る 異体字グ リ フ を含んでい る か ど う か をチ ェ ッ ク で き ます :
if (p.info_font(font, "unicode", "unicode=" + uv + "selector=" + s) != -1)
{
/* このフォント内でこのシーケンスに対して異体字グリフが利用可能 */
}

180 第 7 章 : テキス ト 出力
こ の ク エ リ ーは、 異体字が得 ら れ る か ど う か をチ ェ ッ ク す る こ と だけ を意図 し てい ます。
得 ら れ る Unicode 自体は、 PDFlib は異体字に PUA Unicode 値を割 り 当て ますので、 おそ ら
く 有用ではないで し ょ う 。

7.7 Unicode 異体字セ レ ク タ ー (UVS) 181


7.8 テキス ト 処理パ イ プ ラ イ ン
ク ラ イ ア ン ト アプ リ ケーシ ョ ンは、 ページ出力 し たいテ キ ス ト を PDFlib に与え ます。 こ
の テ キ ス ト は何 ら かのエ ン コ ーデ ィ ン グ と 形式に従 っ て符号化 さ れて い ま す。 し か し 、
PDFlib の内部処理は Unicode 規格に基づいてお り 、 ま た最終テ キ ス ト 出力はフ ォ ン ト 固有
のグ リ フ ID を必要 と し ます。 ですので PDFlib は、 ページ内容のために与え ら れ る 文字列
を テ キ ス ト 処理パ イ プ ラ イ ンの中で 3 つの過程を経て処理 し ます :
> 入力 コ ー ド を、 選択 さ れてい る エン コ ーデ ィ ン グに従っ て Unicode 値へ正規化。
> Unicode 値を、その フ ォ ン ト 内で利用可能な グ リ フ に従っ て フ ォ ン ト 固有のグ リ フ ID へ
変換。
> グ リ フ ID を、 出力エン コ ーデ ィ ン グに従っ て転換。

テ キ ス ト 処理パ イ プ ラ イ ンのい く つかの側面はオプシ ョ ンで制御で き ます。

7.8.1 入力文字列を Unicode へ正規化


以下の ス テ ッ プが、 glyphid 以外のすべてのエン コ ーデ ィ ン グに対 し て実行 さ れます :
> Unicode 対応言語バ イ ンデ ィ ン グ : シ ン グルバ イ ト エン コ ーデ ィ ン グが指定 さ れてい る
と き は、UTF-16 テ キ ス ト は高次バ イ ト を捨て る こ と でシ ン グルバ イ ト テ キ ス ト へ変換
さ れます。
> エ ス ケープシーケ ン ス (121 ページ 「5.4.1 エ ス ケープシーケ ン ス」 参照) を、 その対
応す る 数値へ置 き 換え ます。
> 文字参照を解決 し 、 それを その対応す る Unicode 値へ置き 換え ます (122 ページ 「5.4.2
文字参照」 お よ び次項参照)。
> シ ン グルバ イ ト エ ン コ ーデ ィ ン グ : シ ン グルバ イ ト テ キ ス ト を、 指定 さ れたエ ン コ ー
デ ィ ン グに従っ て Unicode へ変換 し ます。
> normalize オプシ ョ ンに応 じ て、 テ キ ス ト を、Unicode 正規化形 (NFC な ど) の う ちの一
つへ正規化。

グ リ フ 名に よ る文字参照 グ リ フ名参照 (122 ページ 「5.4.2 文字参照」 を参照) が使用


さ れてい る 場合には、PDFlib はその指定 さ れた名前を持つグ リ フ の位置を フ ォ ン ト 内で見
つけ よ う と 試み、 そ し てその参照を そのグ リ フ の Unicode 値へ置 き 換え ます。 指定 さ れた
グ リ フ がフ ォ ン ト 内で見つか ら ない と き は、PDFlib は Unicode 値を決定する ためにその内
蔵グ リ フ名テーブルを検索 し ます。 こ の Unicode 値は さ ら に、 適切な グ リ フ が フ ォ ン ト 内
に存在 し てい る か ど う か をチ ェ ッ ク す る ために使われます。その よ う な グ リ フ が見つか ら
ない と き は、 動作は glyphcheck ・ errorpolicy 設定で制御 さ れます。 文字参照は、 glyphid ・
builtin エン コ ーデ ィ ン グでは使 う こ と がで き ません。

Unicode 制御キ ャ ラ ク タ ー 制御キ ャ ラ ク タ ーは、 何のグ リ フ を も 表現せず、 組版情報を


伝達する ために使用 さ れ る Unicode 値です。 PDFlib は、 以下のグループの Unicode 制御
キ ャ ラ ク タ ーを処理 し ます :
> デフ ォ ル ト のシ ェ ーピ ン グ動作を オーバー ラ イ ド す る ための制御キ ャ ラ ク タ ー群 (表
7.6 に挙げてい ま す) と 、 デフ ォ ル ト の双方向組版を オーバー ラ イ ド す る ための制御
キ ャ ラ ク タ ー群 (表 7.7 に挙げてい ます) は、 テ キ ス ト 行 と テ キ ス ト フ ロ ーの中にお
いて、複雑用字系のシ ェ ーピ ン グ と OpenType レ イ ア ウ ト 機能の処理を制御 し ます。 こ
れ ら の制御キ ャ ラ ク タ ーは評価 さ れた後に除去 さ れます。
> 表 9.1 に挙げ る 、改行 と テ キ ス ト フ ロ ー組版のための組版制御キ ャ ラ ク タ ー群。 こ れ ら
の制御キ ャ ラ ク タ ーは評価 さ れた後に除去 さ れます。

182 第 7 章 : テキス ト 出力
> その他、 範囲 U+0001 ~ U+0019 と U+007F ~ U+009F の Unicode 制御キ ャ ラ ク タ ーは
replacementchar キ ャ ラ ク タ ーで置 き 換え ら れます。

フ ォ ン ト が制御キ ャ ラ ク タ ーのためのグ リ フ を持っ てい る 場合であ っ て も 、そのグ リ フは


通常は見え な く な り ます。 なぜな ら PDFlib が制御キ ャ ラ ク タ ーを除去す る か ら です ( こ
の規則の例外 と し て、 &NBSP; と &SHY; は除去 さ れません)。 し か し encoding=glyphid を
用い る と 、制御キ ャ ラ ク タ ーはテ キ ス ト 内に残 さ れ る ので、出力で見せ る こ と がで き ます。

7.8.2 Unicode 値を グ リ フ ID へ変換


前項で決定 さ れた Unicode 値は、 い く つかの理由に よ り 変更が必要な場合があ り ます。 以
下の ス テ ッ プはすべてのエン コ ーデ ィ ン グに対 し て実行 さ れますが、ただ し 以下の例外が
あ り ま す : encoding=glyphid の 場 合、 無 効 な グ リ フ ID は グ リ フ ID 0 へ置換 さ れ、
glyphcheck=error の と き は例外が発生 し ます。

フ ォ ールバ ッ ク フ ォ ン ト か ら のキ ャ ラ ク タ ー を強制 Unicode 値 を、 fallbackfonts オ プ


シ ョ ン の forcechars サブオプシ ョ ン に従っ て置 き 換え て、 その対応す る フ ォ ールバ ッ ク
フ ォ ン ト のグ リ フ ID を決定 し ます。詳 し く は 146 ページ 「6.3.6 フ ォールバ ッ ク フ ォ ン ト 」
を参照 し て く だ さ い。

異体字シーケ ン ス を解決 フ ォ ン ト に よ っ ては、 Unicode キ ャ ラ ク タ ーの後に、 そのキ ャ


ラ ク タ ーの特定の グ リ フ異体字を選択す る 異体字セ レ ク タ ーが続 き う る も のがあ り ま す
(179 ページ 「7.7 Unicode 異体字セ レ ク タ ー (UVS)」 参照)。 その フ ォ ン ト がその異体字
シーケ ン ス のための異体字グ リ フ を内容 と し て持っ てい る 場合には、 元のグ リ フ ID では
な く その異体字グ リ フ のグ リ フ ID が用い ら れます。

グ リ フ ID へ変換 Unicode 値を、 133 ページ 「6.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 つでグ リ フ が見つかっ た と き はそれが
使われます。

7.8 テキス ト 処理パイ プ ラ イ ン 183


> タ イ ポグ ラ フ ィ ー的に類似のグ リ フ を、 PDFlib の内蔵置換テーブル内の Unicode 値に
従っ て選びます。こ の内蔵 リ ス ト か ら こ れ ら の置換のい く つかを以下に抜粋 し ます。 リ
ス ト 内の 1 番目のキ ャ ラ ク タ ーが フ ォ ン ト 内で見つか ら ない と き 、それは 2 番目のキ ャ
ラ ク タ ーへ置 き 換え ら れます :
U+00A0 (ノーブレークスペース) U+0020 (空白)
U+00AD (ソフトハイフン) U+002D (ハイフン-マイナス)
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 (空白) が試 さ れます。 こ れ ら さ え も 得 ら れない
と き は、 「 ミ ッ シ ン グ グ リ フ」 記号が使われます (PDF/A ・ PDF/UA ・ PDF/X-4/5 では
不可)。
> Unicode キ ャ ラ ク タ ーが replacementchar と し て指定 さ れてい る 場合には、 それが元の
キ ャ ラ ク タ ーのかわ り に用い ら れます。
> replacementchar=drop の場合には、 そのキ ャ ラ ク タ ーは入力ス ト リ ームか ら 除去 さ れ、
出力は作成 さ れません。
> replacementchar=error の場合には、 例外が発生 し ます。 こ れを利用する と 、 読めない
テ キ ス ト 出力を避け る こ と がで き る で し ょ う 。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の fonts/glyph_replacement ト ピ ッ ク にあ り ます。

7.8.3 グ リ フ ID を転換
決定 さ れた グ リ フ ID は ま だ最終的な も のではあ り ません。 なぜな ら 最終出力を作成す る
前に、 い く つかの転換を行わなければな ら ない可能性があ る か ら です。 具体的に ど の よ う
な転換が必要かは、 フ ォ ン ト やい く つかのオプシ ョ ンに よ っ て異な り ます。

縦書き グ リ フ 縦書 き モー ド の フ ォ ン ト では、い く つかのグ リ フは縦書き 字体へ置き 換わ


る 可能性があ り ます。 こ の置換は、 フ ォ ン ト 内に vert ま たは vrt2 OpenType レ イ ア ウ ト 機
能テーブルが必要です。

OpenType レ イ アウ ト 機能 OpenType 機能は、 合字 ・ ス ワ ッ シ ュ キ ャ ラ ク タ ー ・ ス モー


ルキ ャ ッ プ ス をは じ め と す る さ ま ざ ま な タ イ ポグ ラ フ ィ ーバ リ エーシ ョ ン を、 1 個ない し
複数のグ リ フ ID を他の値へ置 き 換え る こ と に よ っ て作成す る こ と がで き ます。 こ の件は

184 第 7 章 : テキス ト 出力
163 ページ 「7.4 OpenType レ イ ア ウ ト 機能」 で解説 し てい ます。 OpenType レ イ ア ウ ト 機
能は、 適切な フ ォ ン ト に対 し てのみ有効であ り (166 ページ 「OpenType レ イ ア ウ ト 機能
のための要件」 参照)、 かつ features オプシ ョ ンに従っ て適用 さ れます。 デフ ォ ル ト で有
効化 さ れ る レ イ ア ウ ト 機能 も あ り ます。

複雑用字系のシ ェ ー ピ ン グ シ ェ ー ピ ン グは、 テ キ ス ト の順序を替え、 ま た、 キ ャ ラ ク


タ ーの位置に よ っ て適切な字体のグ リ フ を決定 し ます (例 : ア ラ ビ ア語キ ャ ラ ク タ ーの語
頭 ・ 語中 ・ 語末 ・ 独立形) 。 こ れは適切な フ ォ ン ト に対 し てのみ有効であ り (170 ページ
「シ ェ ーピ ン グのための要件」 参照)、 かつ shaping オプシ ョ ンに従っ て適用 さ れます。

7.8 テキス ト 処理パイ プ ラ イ ン 185


186 第 7 章 : テキス ト 出力
8 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF
ページ を取 り 込む
8.1 ラ ス タ ー画像
8.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( ) メ ソ ッ ド の最後の引数は、 画像の位置付け ・ 拡縮 ・ 回転を指定で き る さ


ま ざ ま なオプシ ョ ン を持たせ る こ と ので き る オプシ ョ ン リ ス ト です。 こ のオプシ ョ ン群に
ついては 221 ページ 「8.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置」 で詳 し く 説
明 し ます。
画像フ ァ イ ルの取 り 込みが失敗 し た場合には、 PDF_load_image( ) はエ ラ ー コ ー ド を返
し ま す。 こ の 画像 の 失敗 に つ い て も っ と 詳 し く 知 る 必要 が あ る 場合 に は、 PDF_get_
errmsg( ) を呼び出す と 、 詳細なエ ラ ー メ ッ セージが得 ら れます。

ク ッ ク ブ ッ ク 画像処理のための コ ー ド サン プルが PDFlib ク ッ ク ブ ッ ク の images カ テ ゴ リ ーにあ り ます。

画像デー タ を再利用 ラ ス タ ー画像の反復利用のための重要な PDF 最適化技法に PDFlib


は対応 し てい ま す。 複数のページに同 じ ロ ゴや背景を使 う レ イ ア ウ ト を考え てみ ま し ょ
う 。 その よ う な場合には画像デー タ 本体は一度 し か PDF 内に取 り 込まずに、 その画像を
使 う 各ページか ら そ こ への参照だけ を生成す る こ と が可能です。画像フ ァ イ ルを一度読み
込んでおいて、 各ページに ロ ゴや背景を配置す る たびに PDF_fit_image( ) を呼び出せば よ
いのです。 複数のページにその画像を配置 し た り 、 同 じ 画像で も 貼 り 付け る たびに拡縮倍
率を変え た り す る こ と も で き ます (画像を閉 じ ていない限 り ) 。 画像の容量や使用回数に
よ っ ては こ の技法は顕著な容量節減を も た ら すで し ょ う 。

拡縮 と dpi 計算 取 り 込んだ画像の ピ ク セル数を PDFlib が変え る こ と はあ り ません。 拡


縮す る と 画像の ピ ク セルは膨 ら んだ り 縮んだ り し ますが、ダ ウ ンサンプ リ ン グが行われ る
こ と はあ り ません。拡縮倍率が 1 な ら ば 1 ピ ク セルの大 き さ はユーザー座標の 1 単位 と 同
じ にな り ます。 いいかえれば、 ユーザー座標系が拡縮 さ れていなければ画像はその元の解
像度で (その画像が解像度情報を持っ ていなければ 72 dpi で) 取 り 込まれます (デフ ォ ル
ト では 1 イ ンチが 72 単位なので)。

8.1 ラ ス タ ー画像 187


ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の images/image_dimensions ト ピ ッ ク にあ り ます。そ
こ に、 画像の寸法を得る方法や、 それを さ ま ざ ま な大き さ で貼る方法を示 し てあ り ます。

取 り 込み画像の色空間 PDF_load_image( ) で与え ら れたオプシ ョ ン に従っ て ICC プ ロ


フ ァ イ ルの追加 ・ 削除を し た り ス ポ ッ ト カ ラ ーか DeviceN カ ラ ーを適用 し た り する 場合を
除いて、 PDFlib は一般に、 取 り 込んだ画像の元の色空間を保持 し ます。 し か し 、 まれに こ
れが不可能な組み合わせがあ り ます。
PDFlib は、 RGB と CMYK と の間の変換は一切行い ません。 その よ う な変換が必要な と
き は、 画像を PDFlib に取 り 込む前にその画像デー タ に適用 し てお く 必要があ り ます。
埋め込み ICC プ ロ フ ァ イ ルを持っ ていない BMP ・ JPG ・ JPX ・ PNG ・ TIFF 形式のすべ
ての RGB 画像に対 し てはデフ ォ ル ト で sRGB ICC プ ロ フ ァ イ ルが割 り 当て ら れます。

複数ページ画像 PDFlib は、 複数の画像を持つ 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=jpeg ・ raw でのみ対応 し てい ます。 他の種類の画像では、


inline オプシ ョ ンは静かに無視 さ れます。

画像内の XMP メ タ デー タ 画像フ ァ イ ルは XMP メ タ デー タ を含んでい る こ と があ り ま


す。 デ フ ォ ル ト で は PDFlib は、 出力 フ ァ イ ル サ イ ズ を 削減す る た め、 TIFF ・ JPEG ・
JPEG 2000 画像形式内の XMP メ タ デー タ を無視 し ます。 ただ し 、 その画像 メ タ デー タ は
(有効な XMP を それが持っ てい る な ら )、 PDF_load_image( ) の以下のオプシ ョ ンで、 出力
PDF 文書内の生成画像 XObject に添付す る こ と がで き ます :
metadata={keepxmp=true}

188 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む


8.1.2 対応画像 フ ァ イ ル形式
PNG 画像 あ ら ゆ る 種類の PNG 画像 (ISO 15948) に PDFlib は対応 し てい ます。 PNG 画
像が透過情報を持っ てい る 場合、 その透過は生成 PDF 内で保たれます (193 ページ 「8.1.4
画像透過」 参照)。
PNG 画像が sRGB チ ャ ン ク を含んでい る 場合には、 その sRGB ICC プ ロ フ ァ イ ルが画
像に添付 さ れ ま す。 た だ し 、 honoriccprofile オ プ シ ョ ン が false で あ る 場合、 ま た は、
iccprofile オプシ ョ ンで他の ICC プ ロ フ ァ イ ルがその画像に割 り 当て ら れてい る 場合を除
き ま す。 こ の sRGB チ ャ ン ク 内 の レ ン ダ リ ン グ イ ン テ ン ト が 使用 さ れ ま す。 た だ し
renderingintent オプシ ョ ンが与え ら れてい る と き を除 き ます。

JPEG 画像 PDFlib は、 以下の種類の JPEG 画像 (ISO 10918-1) に対応 し てい ます :


> グ レース ケール ・ RGB (通常は YCbCr 符号化 さ れてい ますが、 直接 RGB に も 対応) ・
CMYK カ ラ ー。
> ベース ラ イ ンお よ びプ ロ グ レ ッ シブ JPEG 圧縮。

こ れ ら の条件は、 実用 さ れてい る すべての JPEG 画像を網羅 し ます。 上記の制約は、 広 く


用い ら れていない JPEG の機能を使用 し てい る 画像を取 り 込む こ と はで き ない こ と を意味
し ます。 と り わけ算術符号、 ロ ス レ ス圧縮、 構成要素あ た り 8 ビ ッ ト 以外の ビ ッ ト 深度、
お よ び SmartScale ・ 可逆 RGB 色変換な ど非標準的機能が こ れにあ た り ます。 なお、 類似
形式 JPEG-LS (ISO 14495、 「 ロ ス レ ス JPEG」 と 呼ばれ る 時 も あ る ) ・ JPEG-XR (ISO 29199-
2、 以前 HD Photo と 呼ばれていた) には対応 し てい ません。
JPEG 画像は何種類かの フ ァ イ ル形式に納め る こ と がで き ます。 よ く 利用 さ れ る あ ら ゆ
る JPEG フ ァ イ ル形式 と 機能に PDFlib は対応 し てい ます :
> JFIF 1。 さ ま ざ ま な画像処理アプ リ ケーシ ョ ンに よ っ て生成 さ れます。
> Adobe Photoshop な ど の Adobe アプ リ ケーシ ョ ンに よ っ て出力 さ れ る JPEG フ ァ イ ル。
> PDFlib は、Adobe Photoshop で作成 さ れた JPEG 画像か ら ク リ ッ ピ ン グパ ス を読み取 り ま
す。
> PDFlib は、honoriccprofile オプシ ョ ンが false に設定 さ れていない限 り 、JPEG 画像内の埋
め込み ICC プ ロ フ ァ イ ルに従い ます。
> JPEG画像が Exif マーカーを含んでい る 場合には、そのExif マーカー内の色空間情報は解
釈 さ れます。 それが sRGB 色空間を示 し てい る 場合には、 その sRGB ICC プ ロ フ ァ イ ル
がその画像に添付 さ れます (ただ し 、 その画像が明示的に埋め込まれた ICC プ ロ フ ァ
イ ルを含んでい る 場合、 ま たは honoriccprofile オプシ ョ ンが false であ る 場合、 ま たは
その画像にiccprofile オプシ ョ ンで他のICCプ ロ フ ァ イ ルが割 り 当て ら れてい る 場合は、
こ の限 り ではあ り ません)。
> 画像の望ま し い向 き を指定 し た、Exif マーカー内の Orientation エン ト リ ーに従い ます。
こ れを無視す る (多 く のアプ リ ケーシ ョ ン同様) には ignoreorientation オプシ ョ ン を
用い ます。

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 画像フ ァ イ ル
内の元の色空間に変更を加え ません。

8.1 ラ ス タ ー画像 189


> (非サポー ト ) 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 デバ イ ス であ る 場合、ま たは defaultcmyk オプシ ョ ン
が与え ら れてい る 場合にのみ使用で き ます。

PDF/A-2 に対す る 追加の JPEG 2000 の制約 (JPEG 2000 は、 PDF 1.4 に基づいた PDF/A-
1 では許 さ れません) :
> カ ラ ーチ ャ ン ネルの数は 1 ・ 3 ・ 4 の う ちのいずれかであ る 必要があ り ます。
> すべてのカ ラ ーチ ャ ン ネルが同一の ビ ッ ト 深度を持っ てい る 必要があ り ます。
> そのJPEG 2000画像内の色空間指定の数が1 よ り 大き い場合には、APPROX フ ィ ール ド 内
に値 0x01 を持つ色空間指定がち ょ う ど 1 個存在す る 必要があ り ます。

JBIG2 画像 PDFlib は、 単ページ ・ 複数ページの JBIG2 画像 (ISO 14492) に対応 し てい


ます。 JBIG2 画像はつねに単色ピ ク セルデー タ を内容 と し て持ち ます。
JBIG2 圧縮の性質か ら 、複数ページ JBIG2 ス ト リ ーム内のい く つかのページが同一のグ
ロ ーバルセグ メ ン ト を参照 し てい る 場合があ り ます。複数ページ JBIG2 ス ト リ ームの 1 つ
ない し 複数のページが変換 さ れ る 際、 グ ロ ーバルセグ メ ン ト は、 生成 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 は自動的にカ レ ン ト ページに対す
る 必要デー タ をすべて コ ピー し ます。

TIFF 画像 PDFlib は、 すべての関連する 種類の TIFF 画像を処理 し ます :

190 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む


> 圧縮方式 : 非圧縮 ・ 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 フ ァ イ ル (188 ページ 「 複数ページ画像」 参照)。TIFF フ ァ イ
ル内の特定の画像を選ぶには page オプシ ョ ン を用い ます。
> アルフ ァ チ ャ ン ネルま たはマ ス ク (193 ページ 「8.1.4 画像透過」 参照) に、 ignoremask
オプシ ョ ンが設定 さ れていない限 り 従い ます。 alphachannelname オプシ ョ ンで明示的
にアルフ ァ チ ャ ン ネルを選ぶ こ と も で き ます。
> PDFlib は、Adobe Photoshop や互換プ ロ グ ラ ムで作成 さ れた TIFF 画像内の ク リ ッ ピ ン グ
パ ス に、 ignoreclippingpath オプシ ョ ンが設定 さ れていない限 り 従い ます。
> PDFlibは、TIFF画像内の埋め込みICCプ ロ フ ァ イ ルに、honoriccprofileオプシ ョ ンがfalse
に設定 さ れていない限 り 従い ます。
> JPEG画像が Exif マーカーを含んでい る 場合には、そのExif マーカー内の色空間情報は解
釈 さ れます。 それが sRGB 色空間を示 し てい る 場合には、 その sRGB ICC プ ロ フ ァ イ ル
がその画像に添付 さ れます (ただ し 、 その画像が明示的に埋め込まれた ICC プ ロ フ ァ
イ ルを含んでい る 場合、 ま たは honoriccprofile オプシ ョ ンが false であ る 場合、 ま たは
その画像にiccprofile オプシ ョ ンで他のICCプ ロ フ ァ イ ルが割 り 当て ら れてい る 場合は、
こ の限 り ではあ り ません)。
> 画像の望ま し い向 き を指定 し た Orientation タ グに従い ます。こ れを無視す る (多 く のア
プ リ ケーシ ョ ン同様) には ignoreorientation オプシ ョ ン を用い ます。

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 の機能はめっ たに使われず、 アプ リ ケーシ ョ ンに よ っ て異な っ た解釈を さ れま
す)。

RAW 画像 非圧縮処理 さ れた RAW 画像デー タ は、 さ ま ざ ま な特殊な用途に有用で し ょ


う 。 なお、 こ の形式は、 Adobe アプ リ ケーシ ョ ン群が生成する Camera Raw フ ァ イ ル と は
関係あ り ません。
RAW 画像デー タ を与え る には、 width ・ height ・ bpc オプシ ョ ン を与え る 必要があ り ま
す。 なぜな ら PDFlib は画像デー タ か ら その画像の寸法を導出で き ないか ら です。 その色
空間は components オプシ ョ ンか ら 導出で き ます : 1 成分な ら グ レース ケール画像を暗示
し 、 3 成分な ら RGB 画像を、 4 成分な ら CMYK 画像を暗示 し ます。 あ る いは、 colorize オ

8.1 ラ ス タ ー画像 191


プシ ョ ン を通 じ て、 ス ポ ッ ト カ ラ ーか DeviceN カ ラ ーを画像に適用する こ と も で き ます。
こ の場合には、 その色空間 と 、 色成分の数は、 その色空間ハン ド ルか ら 導出 さ れます。
与え る 画像デー タ 長は
[width x components x bpc / 8] x height

バ イ ト に等 し い必要があ り ます。 こ こ で、 カ ッ コ 内の小数は切 り 上げです。 画像サンプル


は、 上か ら 下へ、 かつ左か ら 右への順序 と 見な さ れます (座標変換は行われていない と 前
提 さ れます)。 16 ビ ッ ト サンプルは、 最上位バ イ ト を最初に与え る 必要があ り ます (ビ ッ
グエンデ ィ ア ンバ イ ト 順序)。 bpc が 8 よ り 小 さ い場合には、 各ピ ク セル行はバ イ ト 境界
で開始 し 、 カ ラ ー値はバ イ ト 内で左か ら 右へ詰め込まれ る 必要があ り ます。 カ ラ ーチ ャ ン
ネル群はつねに交互配置 さ れます。 すなわち、 最初の ピ ク セルに対する すべてのカ ラ ー値
を最初に与え る 必要があ り 、 その後に 2 番目の ピ ク セルに対す る カ ラ ー値群を与え、 以下
同様 と す る 必要があ り ます。画像に合致す る オプシ ョ ン値群を与え る のはユーザー側の役
割です。 そ う し ない場合には、 壊れた PDF 出力が生成 さ れ る 場合があ り 、 Acrobat が メ ッ
セージ 「Insufficient data for an Image」 を発す る おそれがあ り ます。
カ ラ ー値群の極性は、 色関連オプシ ョ ン群に対す る 場合 と 同 じ です (83 ページ 「4 章
色 と 透過」 参照)。 なお、 Adobe Photoshop は、 期待 さ れ る PDF 極性を、 グ レース ケール
画像 と RGB 画像に対 し てのみ用いてお り 、 RAW CMYK 画像 と 追加カ ラ ーチ ャ ン ネルに対
し ては反転極性を用いてい ま す : PDF と PDFlib は 0 =強度な し と 期待す る のに対 し 、
Photoshop は 0 =最大強度 と 見な し ます。 こ の極性を調整する には、 その画像を読み込む
際に invert オプシ ョ ン を適用 し ます。

8.1.3 ク リ ッ ピ ン グパス
PDFlib は、 Adobe Photoshop や互換 ソ フ ト で作成 さ れた TIFF ・ JPEG 画像の中の ク リ ッ ピ
ン グパ ス に対応 し てい ます。 1 つの画像フ ァ イ ルには、 複数の名前付き パ ス を含む場合が
あ り ます。 PDF_load_image( ) の clippingpathname オプシ ョ ン を使えば、 名前付き パ ス の
う ちの 1 つを選ぶ こ と がで き 、 それが ク リ ッ ピ ン グパ ス と し て使われ ます : 画像は、 ク
リ ッ ピ ン グパ ス の内部だけが可視 と な り 、 それ以外の部分は不可視にな り ます。 こ れは背
景 と 前景を分離 し た り 、 画像の不要部分を除去 し た り する のに有用です。
あ る いは、画像フ ァ イ ルはデフ ォ ル ト ク リ ッ ピ ン グパ ス を含む場合があ り ます。PDFlib
は、 画像フ ァ イ ル内に ク リ ッ ピ ン グパ ス を見つけた場合、 それを自動的にその画像に適用
し ます (図 8.1 参照)。デフ ォ ル ト ク リ ッ ピ ン グパ ス が適用 さ れない よ う にす る には、PDF_
load_image( ) で honorclippingpath オプシ ョ ン を false に設定 し ます。同 じ 画像の イ ン ス タ

図 8.1
ク リ ッ ピ ン グパス を利用 し て
前景 と 背景を分離

192 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む


ン ス が複数あ っ て、 し か も その う ち一部の イ ン ス タ ン ス に し か ク リ ッ ピ ン グパ ス を適用 し
た く ない と き は、 PDF_fit_image( ) に ignoreclippingpath オプシ ョ ン を与え る こ と に よ っ て
ク リ ッ ピ ン グパ ス を無効にする こ と がで き ます。 ク リ ッ ピ ン グパ ス が適用 さ れ る と 、 画像
の配置やはめ込みに関す る すべての計算は、切 り 抜かれた画像の外接枠を も と に行われま
す。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク のimages/integrated_clipping_path ト ピ ッ ク にあ り


ます。 ク ッ ク ブ ッ ク ト ピ ッ ク path_objects/import_path_from_image は、 ク リ ッ ピ ングパス
を視覚化する方法を示 し ています。

ク リ ッ ピ ン グパ ス を記述す る ためのベ ク ト ル演算は、 PDF_fit_image( ) が呼び出 さ れ る た


びに、 PDF 出力へ書き 出 さ れます。 ク リ ッ ピ ン グパ ス を持っ た画像 1 個を、 その文書内に
複数回配置す る 場合には、 出力フ ァ イ ルサ イ ズ を削減す る ために、 その画像を テ ンプ レー
ト 内に ラ ッ プす る こ と を強 く 推奨 し ます。 こ れは PDF_load_image( ) の templateoptions オ
プシ ョ ンで実現で き ます。

8.1.4 画像透過
画像透過は、 さ ま ざ ま な芸術的効果な ど に有用です。 た と えば、 画像の中の不要な部分を
無視 し て、 関心の対象であ る 人物や物だけ を見せ る こ と がで き ます。 PDFlib は、 画像透過
のためのい く つかの手法に対応 し てい ます :
> アルフ ァ チ ャ ン ネル ( ソ フ ト マ ス ク と も 呼ばれ る ) は、 各画像ピ ク セルに対 し て透過
値を指定す る も のです。 こ のアルフ ァ チ ャ ン ネルは、 取 り 込む画像フ ァ イ ルに含ま れ
てい る こ と も あ り ます し 、別のグ レース ケール画像 と し て指定す る こ と も で き ます。ピ
ク セルあ た り 1 ビ ッ ト よ り 多い ソ フ ト マ ス ク は PDF/A-1 ・ PDF/X-3 では許 さ れてい ま
せん。
> ク ロ マキーマ ス ク 処理は、 単色値ま たはカ ラ ー値範囲を透過 と 指定 し ます。 こ の透過
カ ラ ー値 (1 つない し 複数) は、 取 り 込む画像か ら 来 る こ と も あ り ます し 、 chromakey
オプシ ョ ン を通 じ て指定す る こ と も で き ます。
> ス テ ン シルマ ス ク 処理は、 透過領域を指定す る 別のビ ッ ト マ ッ プ画像を用い ます。

表 8.1 に、 アルフ ァ チ ャ ン ネル ・ ク ロ マキーチ ャ ン ネル ・ ス テ ン シルマ ス ク を用いて画像


を マ ス ク す る 場合に利用可能な手法を ま と め ま し た。 こ のマ ス ク の極性は、 アルフ ァ 方式
と ス テ ン シル方式 と で異な り ます: アルフ ァ マ ス ク では黒い領域を通 じ て背景が見え ます
が、 ス テ ン シルマ ス ク では白い領域を通 じ て背景が見え ます。
こ れ以外に も 、colorize オプシ ョ ン (197 ページ 「8.1.5 画像に ス ポ ッ ト カ ラ ーか DeviceN
カ ラ ーで着色」 参照) ・ ブ レ ン ド モー ド ・ gstate ソ フ ト マ ス ク (104 ページ 「4.9 オブジ ェ
ク ト の色を変更」 参照) を用いて、 画像の色の さ ま ざ ま な効果を実現で き ます。 比較のた
め、 画像に ス ポ ッ ト カ ラ ーか DeviceN カ ラ ーで着色する 効果 も 表 8.1 に挙げてい ます。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の images/image_mask ト ピ ッ ク にあ り ます。

内蔵アル フ ァ チ ャ ン ネルを持 っ た画像 PDFlib は、 以下の画像形式か ら 内蔵 ア ル フ ァ


チ ャ ン ネルを読み取 り ます (ignoremask=true の場合を除 き ます) :
> TIFF 画像:1 個のアルフ ァ チ ャ ン ネルを内容 と し て持っ てい る こ と があ り 、PDFlib はそ
れを使用 し ます。 あ る いは TIFF 画像は、 名前で識別 さ れ る 複数のアルフ ァ チ ャ ン ネル
を含む こ と も で き ます。 複数のチ ャ ン ネルが TIFF 画像内に存在す る 場合には、 PDFlib
はデフ ォ ル ト では、 その先頭のアルフ ァ チ ャ ン ネルを使用 し ます。 他のチ ャ ン ネルを
明示的に選択す る こ と も 可能です。 そのためには、 alphachannelname オプシ ョ ン を用
いてその名前を与え ます :

8.1 ラ ス タ ー画像 193


表 8.1 画像透過 と 画像着色で使え る方式
マス ク またはベース画像内のピ ク
マ ス ク/着色手法 ベース画像 補助マ ス ク 画像 セル群の効果

画像ま たは masked オプ シ ョ ンか らのアルフ ァ チ ャ ン ネル ( ソ フ ト マ ス ク )

内蔵アル フ ァ チ ャ ン ネル 内蔵アルフ ァ チ ャ ン ネルを (画像フ ァ イルか ら) (TIFF/PNG/JPEG 2000 画像形式


に よ る透過画像 持つ TIFF・PNG・JPEG 2000 に従っ た透過)
画像

画像および別のアルフ ァ 任意の画像。 オプ シ ョ ン ビ ッ ト マ ッ プ または 黒マス ク=背景


チ ャ ン ネル画像 masked で補助画像内のソ グ レースケール画像 グ レーマス ク =透け
フ ト マ ス ク を参照 白マス ク=ベース画像1

画像ま たは chromakey オプ シ ョ ンから のク ロ マキーマス ク 処理

内蔵ク ロ マキー値を持 っ 内蔵 ク ロ マキーエ ン ト リ ー ― ク ロ マキー色=透過


た画像 を持 っ た PNG 画像 画像のその他の色=ベース画像
画像および別の ク ロ マ JPEG ・ JPEG 2000 以外の ― ク ロ マキー色 (1 つない し 複数)
キー値または範囲 任意の画像。 オプ シ ョ ン =透過
chromakey で透過カ ラ ー値 画像のその他の色=ベース画像
(1 つない し 複数) を指定

mask オプ シ ョ ン を用いたス テ ン シルマス ク処理


ス テ ン シル と し てのマ ス ― オプ シ ョ ン mask を 黒マス ク=塗 り 色
1
ク 画像を通 し て描画 用いて読み込まれた 白マス ク=背景
ビ ッ ト マ ッ プ画像

ス テ ン シル画像を用いて 任意の画像。 オプ シ ョ ン オプ シ ョ ン mask を 黒マス ク=ベース画像


1
ベース画像を マ ス ク masked で補助画像内のス 用いて読み込まれた 白マス ク=背景
テ ン シルマス ク を参照 ビ ッ ト マ ッ プ画像
一定値の不透明度を用いた、 全体的に透明な画像

画像全体に一定値の不透 任意の画像 ― 全ピ ク セルが同一の透過度で表示


明度を適用 さ れます

colorize オプ シ ョ ン を用いた画像着色

スポ ッ ト カ ラ ーを用いて グ レースケール画像 (ピ ク ― 黒画像=ベ タ スポ ッ ト カ ラ ー


画像に着色 セルあた り 1 ビ ッ ト 以上)。 グ レー画像=薄めたスポ ッ ト カ
オプ シ ョ ン colorize でス ラー
ポ ッ ト カ ラ ーを参照 白画像=白

DeviceN カ ラ ーを用いて n 色画像。 オプ シ ョ ン ― 画像内の 0 =白


画像に着色 colorize で DeviceN カ 中間=薄めた DeviceN
ラ ーを参照 画像内の 1 =ベ タ DeviceN カ ラ ー

1. ス テ ン シルまたはアル フ ァ 画像に invert オプ シ ョ ン を適用する こ と に よ っ てマ ス ク の効果を反転 さ せる こ と も で き ます。

image = p.load_image("tiff", filename, "alphachannelname={apple}");

> PNG 画像:1 個のアルフ ァ チ ャ ン ネルを内容 と し て持っ てい る こ と があ り 、PDFlib はそ


れを使用 し ます。
> JPEG 2000 画像:1 個のアルフ ァ チ ャ ン ネルを内容 と し て持っ てい る こ と があ り 、PDFlib
はそれを使用 し ます。

注 Photoshop は、 完全な アル フ ァ チ ャ ン ネルのかわ り に、 TIFF 画像内に透過背景を作成する


こ と も で き ます。 こ れに使用 さ れる独自形式に PDFlib は対応 し ていません。 こ のよ う な

194 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む


透過画像を PDFlib で使 う には、 Photoshop で こ れを TIFF フ ァ イル形式で保存 し 、 その際
に「TIFF オプ シ ョ ン」ダ イ ア ログボ ッ ク スで「透明部分を保持」 を選択する必要があ り ます。

別のグ レ ース ケール画像を アル フ ァ チ ャ ン ネル と し て使用 画像フ ァ イ ル内の内蔵アル


フ ァ チ ャ ン ネルのかわ り に、第二の画像を アルフ ァ チ ャ ン ネルの ソ ース と し て使 う こ と も
で き ます。 グ レース ケール画像は、 すべての種類が、 アルフ ァ チ ャ ン ネル と し て使用す る
のに適 し てい ます。こ のマ ス ク が埋め込み ICC プ ロ フ ァ イ ルを内容 と し て持っ てい る 場合
には、 honoriccprofile=false を用いて こ れを無視す る 必要があ り ます。 TIFF 画像に対 し て
は、PDF_load_image( ) に nopassthrough オプシ ョ ン を与え る こ と に よ っ てマルチ ス ト リ ッ
プ画像を避け る こ と を推奨 し ます。 BMP 画像は他の画像種別 と は向 き が異な っ てい ます。
ですので BMP 画像を マ ス ク と し て使用で き る よ う にす る には、 まず x 軸を軸 と し て鏡映
さ せ る 必要があ り ます。
アルフ ァ 画像内の白い ピ ク セルの部分においては、 ベース画像の対応す る 領域が描画
さ れ、 黒いマ ス ク ピ ク セルの部分においては背景を見通せます。 マ ス ク が ピ ク セルあ た り
1 ビ ッ ト よ り も 多 く を使用 し てい る 場合には、 中間値は、 前景画像を背景に対 し てブ レ ン
ド さ せ る こ と に よ っ て、 透け効果を生みます。
マ ス ク を読み込んだ後、 それをベース画像に適用す る には、 masked オプシ ョ ン を用い
ます :
// アルファチャンネルとして使いたいマスク画像を読み込む
mask = p.load_image("png", maskfilename, "");
if (mask == -1)
throw new Exception("エラー:" + p.get_errmsg());

// ベース画像を読み込んでそれをマスク
image = p.load_image(type, filename, "masked=" + mask)
if (image == -1)
throw new Exception("エラー:" + p.get_errmsg());

p.fit_image(image, x, y, "");

画像アル フ ァ チ ャ ン ネルを視覚化 と き には画像アル フ ァ チ ャ ン ネルを グ レ ー ス ケール


画像 と し て見せたい こ と も あ る で し ょ う 。 こ れはデバ ッ グや、 アルフ ァ チ ャ ン ネルの再利
用に役立つで し ょ う 。 こ れを実現す る には、 マ ス ク への画像ハン ド ルを メ イ ン画像か ら 取
得 し ます。 それには PDF_info_image( ) と キーワ ー ド imagemask を用い ます :
image = p.load_image("auto", "image.tif", "errorpolicy");

alpha = (int) p.info_image(image, "imagemask", "");


if (alpha != -1)
p.fit_image(alpha, 0.0, 0.0, "");

こ こ でアルフ ァ チ ャ ン ネルはグ レース ケール画像 と し て扱われます:透過領域が黒 く 見え


ます。

ク ロ マキーマ ス ク 処理 画像は、 マ ス ク さ れ る べ き 単色 ま たは色範囲を指定す る こ と が


で き ます。 指定 さ れた範囲の色を持つピ ク セルは描画 さ れず、 し たがっ て背景が透けて見
え ます。映像技術方面では こ の技法は ク ロ マキーま たはブルース ク リ ーン マ ス ク 処理 と 呼
ばれてい ます。 こ れは chromakey 画像オプシ ョ ンで使え ます。 こ のオプシ ョ ンは、 画像の
色空間の色要素の数を n と し た と き 、 範囲 0 ~ 2 色要素あ た り ビ ッ ト 数の n 個ま たは 2×n 個
の整数を受け付け ます。

8.1 ラ ス タ ー画像 195


こ の リ ス ト の中の各ペアは、色要素範囲の、境界を含む下限 と 上限を内容 と し ます。す
べての色要素 (decode 値群 も invert オプシ ョ ン を用いた色反転 も ま だ適用 し ていない段
階の) が こ の指定範囲群に収ま っ てい る と こ ろの ピ ク セルは透過 と し て扱われ、 すなわち
描画 さ れずに背景が透けて見え ます。
n 個のペアでな く n 個の値を与え た場合には、各要素範囲は 1 個の単色値のみが内容 と
な り ます。 すなわち、 各 リ ス ト 値は色要素に対する 下限 と 上限の両方を記述 し てい る こ と
にな り ます。
chromakey オプシ ョ ンの さ ま ざ ま な例を表 8.2 に挙げます。

表 8.2 chromakey 画像オプ シ ョ ンの使用例

ク ロ マキーオプ シ ョ ン 画像の色空間 効果
chromakey={255 255 255} RGB 白ピ ク セルを透過 と し て扱 う
chromakey={0 255 128 255 0 255} RGB 50% を超え るグ リ ーン を持つすべてのピ ク セルを透過
と し て扱 う
chromakey={242 255 242 255 242 255} RGB 95% よ り 明るいすべての色を透過 と し て扱 う
chromakey={242 255 242 255 242 255} RGB 95% よ り 明るいすべての色を透過 と し て扱い、 かつ、
decode={0 0.95 0 0.95 0 0.95} 95% で急に切 り 落 と さ れるのを防ぐ ために残 り の色を
拡散 さ せる

ク ロ マキーマ ス ク 処理は、 ただ 1 つの透過カ ラ ー値を持っ てい る PNG 画像に対 し ては自


動的に適用 さ れます (ignoremask=true でない限 り ) 。 複数のカ ラ ー値が、 対応する アル
フ ァ 値 と と も に存在 し てい る 場合には、 50% 未満のアルフ ァ 値を持つ最初の も ののみが用
い ら れます。

ス テ ン シルマ ス ク ス テ ン シルマ ス ク は、 白い ピ ク セルが透過 と し て扱われ る 、 ビ ッ ト


深度 1 の ビ ッ ト マ ッ プ画像です : ページの既存内容が画像内の透過部分を通 し て見え ま
す。 0 ピ ク セル値を持つ領域は、 カ レ ン ト 塗 り 色で描 く こ と も で き ます し 、 それを用いて
別の画像の一部を見せ る こ と も で き ます。
ス テ ン シルマ ス ク を カ レ ン ト の塗 り 色で着色す る には、その画像を mask オプシ ョ ン を
用いて読み込み、そ し てその画像を配置す る 前にカ レ ン ト 塗 り 色を設定する 必要があ り ま
す : 黒い ピ ク セルがカ レ ン ト 塗 り 色で着色 さ れ、 白い領域は変更 さ れません :
mask = p.load_image("tiff", maskfilename, "mask");
if (mask == -1)
throw new Exception("エラー : " + p.get_errmsg());

p.set_graphics_option("fillcolor=red);
p.fit_image(mask, x, y, "");

も し も こ の ス テ ン シル画像を使っ て他の画像を masked オプシ ョ ン でマ ス ク し た場合に


は、 ス テ ン シルマ ス ク の黒い領域においてはそのベース画像の ピ ク セルが見え、 白い領域
においては背景が見え ます。

一定値の不透明度を適用す る こ と に よ っ て画像を全体的に透明にす る 画像を配置す る


際に、 全ピ ク セルに対 し て一定値の不透明度を適用す る と 、 その画像全体を透明にする こ
と がで き ます (背景画像 と し て使 う な ど のために)。 こ れを実現する には gstate オプシ ョ
ン と opacityfill サブオプシ ョ ン を用い ます。 例 :

196 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む


p.fit_image(mask, x, y, "gstate={opacityfill=0.5}");

8.1.5 画像にスポ ッ ト カ ラ ーか DeviceN カ ラ ーで着色


ス テ ン シルマ ス ク では、 ビ ッ ト マ ッ プ画像の不透過部分に色が適用 さ れま し たが、 こ れ と
同様に、PDFlib では、画像に ス ポ ッ ト カ ラ ーか DeviceN カ ラ ーで着色す る こ と も で き ます。

グ レ ース ケール画像にスポ ッ ト カ ラ ーで着色 白黒ま たはグ レ ー ス ケール画像に ス ポ ッ


ト カ ラ ーで着色す る こ と がで き ます。 画像に ス ポ ッ ト カ ラ ーで着色す る には、 その画像を
読み込む際に colorize オ プ シ ョ ン を 与 え る 必要が あ り ま す。 こ のオ プ シ ョ ン は、 PDF_
makespotcolor( ) を用いて作成 さ れた ス ポ ッ ト カ ラ ーハン ド ルを内容 と し ます :
spot = p.makespotcolor("PANTONE Reflex Blue CV");

String optlist = "colorize=" + spot;


image = p.load_image("tiff", "image.tif", optlist);

91 ページ 「4.4 Pantone ・ HKS ・ カ ス タ ム ス ポ ッ ト カ ラ ー」 で説明 し てい る よ う に、 ス ポ ッ


ト 色空間は通常、 0 =色な し =白 と 期待 し ます。 こ れに対 し 、 グ レース ケール色空間では
0 =黒です。 白を白の ま ま にす る ために、 PDFlib は、 画像に ス ポ ッ ト カ ラ ーで着色す る 際
には、 画像の極性を反転 さ せます。 すなわち、 画像の暗い領域が最大の ス ポ ッ ト カ ラ ー強
度にな り ます。 こ の色極性を反転 さ せ る には invert 画像オプシ ョ ン を用い ます。

n チ ャ ン ネル画像を DeviceN カ ラ ーで着色 PDF_create_devicen( ) を 用い て 作成 さ れ た


DeviceN カ ラ ーハン ド ルを、 colorize 画像オプシ ョ ンで与え る と 、 DeviceN カ ラ ーを n 色画
像に適用する こ と がで き ます。 画像を DeviceN カ ラ ーで着色する ためには、 その画像デー
タ が、 ち ゃん と N 個のカ ラ ーチ ャ ン ネルを内容 と し て持っ てい る 必要があ り ます。
94 ページ 「4.5 DeviceN カ ラ ー」 で説明 し てい る よ う に、 DeviceN 色空間は 0 =色な し
=白 と 期待 し ます。 こ れに対 し 、 グ レース ケール色空間では 0 =黒です。 画像を ス ポ ッ ト
カ ラ ーで着色 し た場合 と 異な り 、 PDFlib は、 画像を DeviceN カ ラ ーで着色す る 際には、 画
像の極性を反転 さ せません。ですので、 ス ポ ッ ト カ ラ ーで着色す る 場合 と 、N=1 の DeviceN
カ ラ ーで着色す る 場合 と では、 期待 さ れ る 色極性が異な り ます。 こ の色極性を反転 さ せ る
には invert 画像オプシ ョ ン を用い ます。
画像に DeviceN 色空間で着色す る コ ー ド 断片が 95 ページ 「 CMYK プ ロ セ ス カ ラ ーに
基づ く DeviceN 色空間」 にあ り ます。

注 DeviceN カ ラ ーで着色で き るのは RAW 画像だけです。

ク ッ ク ブ ッ ク コ ー ド サン プルがク ッ ク ブ ッ ク の color/colorize_image_with_DeviceN_color ト ピ ッ ク にあ
り ます。

8.1.6 復号配列を用いて カ ラ ー値を変え る


画像のカ ラ ー値は、 線形の復号関数を用いて さ ら に変え る こ と も で き ます。 こ の方式は、
decode 画像オプシ ョ ン を用いて使え ます。 こ れは、 画像の色空間の要素数を n と し た と
き に、 2×n 個の float ま たはパーセ ン ト 値を受け付け ます。 ですので、 復号配列を適用す
る には、 画像の色空間に関する 情報が必要です。 復号配列内の数値の各ペアは、 色要素値
の下限 と 上限であ る 0 と 2 色要素あ た り ビ ッ ト 数がマ ッ プ さ れ る タ ーゲ ッ ト カ ラ ー値を記述 し
ます : 中間の値は線形に内挿 さ れます。 デフ ォ ル ト では、 たいていの色空間の場合、 画像
の色要素値は範囲 0 ~ 1 へマ ッ プ さ れます。 復号配列を利用する と 、 カ ラ ー値の範囲を縮
めた り 拡げた り 限っ た り す る こ と に よ っ て、 特定の カ ラ ー効果を適用す る こ と が可能で

8.1 ラ ス タ ー画像 197


す。 こ の技法は、 画像が着色 さ れてい る 場合や、 マ ス ク と し て用い ら れてい る 場合に も 役
立つで し ょ う 。
復号値は、 加法混色の色空間の場合 と 、 減法混色の色空間の場合 と で、 効果が異な り
ます。 た と えば、 値を大 き く す る ほ ど、 RGB カ ラ ーでは明る く な り 、 CMYK カ ラ ーでは
暗 く な り ます。 たいていの色空間では (Lab ・ イ ンデ ッ ク ス を除 き )、 典型的な値は範囲 0
~ 1 の中にあ り ます。 こ の範囲の外の値 も 許 さ れ ますが、 ビ ュ ーアーは結果のカ ラ ー値
を、 その色空間で適切な範囲へ切 り 捨て ま す。 こ れ を利用す る と 特定の効果が得 ら れ ま
す。 た と えば、 あ る 範囲の明 る さ の色を強制的に白にする な ど です。
別の画像への ソ フ ト マ ス ク と し て用い ら れてい る 画像に decode オプシ ョ ン を適用する
と 、 そのマ ス ク の効果を変え る こ と がで き ます。 た と えばそのマ ス ク を和 ら げた り する こ
と がで き ます。
以下の画像オプシ ョ ンは、 ブ ラ ッ ク の タ ーゲ ッ ト 値を、デフ ォ ル ト 範囲 0 ~ 1 か ら 、新
し い範囲 0.2 ~ 1.2 へず ら さ せてい ます。 すなわち、 CMYK 画像のブ ラ ッ ク チ ャ ン ネルを
20% 増加 さ せ、 画像を強めてい ます :
decode={0 1 0 1 0 1 0.2 1.2}

decode オプシ ョ ンの さ ま ざ ま な例を表 8.3 に挙げます。

表 8.3 decode 画像オプ シ ョ ンの使用例

復号オプ シ ョ ン 画像の色空間 効果
decode={1 0 1 0 1 0} RGB 画像の色を反転。 invert と 同 じ

decode={-0.5 1.5 -0.5 1.5 -0.5 1.5} RGB コ ン ト ラ ス ト を強める


decode={0.5 1.5 0.5 1.5 0.5 1.5} RGB すべての色を 50% 明る く する
decode={-0.2 0.8 -0.2 0.8 -0.2 0.8} RGB すべての色を 20% 暗 く する (100% =白な
ので)
decode={-0.2 0.8 -0.2 0.8 -0.2 0.8 -0.2 0.8} CMYK すべての色を 20% 明る く する (100% =暗
なので)
decode={0 1 0 1 0 1 0 0} CMYK ブ ラ ッ ク チ ャ ン ネルを除去。 鈍い画像に
な り ます
decode={0 1 0 1 0 1 0.2 1.2} CMYK ブ ラ ッ ク チ ャ ン ネルを 20% 大き く する。
強い画像にな り ます
decode={1 0 0 1 0 1 0 1} CMYK シ ア ン チ ャ ン ネルを反転 さ せ、 他のチ ャ
ン ネルは変更 し ない。 芸術向け以外に有
用性はな さ そ う

198 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む


8.2 SVG グ ラ フ ィ ッ ク
8.2.1 対応 SVG 種別
PDFlib は、W3C の述語に よ れば 「規格準拠 し た高品位な静的 SVG ビ ュ ー
アー」 です。PDFlib は、SVG グ ラ フ ィ ッ ク を以下の よ う に受け付け ます :
> PDFlibは、W3Cが発行 し たSVG 1.1(Second Edition)を実装 し てい ます。
> 以下の Unicode 形式 と エン コ ーデ ィ ン グに対応 し てい ます :
UTF-8 ・ UTF-16 ・ ISO 8859-1 ~ ISO 8859-15 ・ ASCII
> CSS ス タ イ ル付けが可能ですが、ただ し 対応 し ていない CSS 要素 も あ
り ます。
> プ レーン テ キ ス ト 形式の SVG フ ァ イ ルのほかに、Flate 圧縮 さ れた SVG フ ァ イ ル(*.svgz)
に も 対応 し てい ます。
> 色は、SVG Color 1.2 ド ラ フ ト に従っ た追加の色空間を用いて指定す る こ と も 可能です。
ス ポ ッ ト カ ラ ーの濃度値のための PDFlib 独自拡張の色空間 も 利用可能です (205 ペー
ジ 「8.2.6 SVG カ ラ ー拡張」 参照)。

制約について 209 ページ 「8.2.8 対応 し ていない SVG 機能」 を参照 し て く だ さ い。

8.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( ) の最後の引数は、 位置付け ・ 拡縮 ・ 回転のための さ ま ざ ま なオプシ ョ


ン を サポー ト し てい る オプシ ョ ン リ ス ト です。 こ れ ら のオプシ ョ ン に関す る 詳細は、 221
ページ 「8.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置」 で説明 し ます。

ク ッ ク ブ ッ ク SVG の取 り 扱いのための コ ー ド サン プルが、 PDFlib ク ッ ク ブ ッ ク の starter_svg ミ ニサン


プル と graphics カ テ ゴ リ ーにあ り ます。

SVG 内容を イ ン ラ イ ン グ ラ フ ィ ッ ク と す るかテ ン プ レ ー ト ( フ ォ ーム XObject) と す る


か PDFlib は、 取 り 込んだ SVG ベ ク ト ルグ ラ フ ィ ッ ク について、 2 種類の PDF 出力を生
成で き ます :

8.2 SVG グ ラ フ ィ ッ ク 199


> デフ ォ ル ト ではPDFlibは、取 り 込んだSVGグ ラ フ ィ ッ ク それぞれに対 し てテ ンプ レー ト
(フ ォーム XObject) を 1 つずつ生成 し ます。 その中には必要な グ ラ フ ィ ッ ク 操作がす
べて入っ てい ます。 こ のテ ン プ レー ト はデフ ォ ル ト のオプシ ョ ン群を用いて生成 さ れ
ま す の で、 カ ス タ ム の オ プ シ ョ ン 群 が 必要 な 場合 に は、 PDF_load_graphics( ) の
templateoptions オプシ ョ ン を用いて与え る こ と も で き ます。 テ ンプ レー ト は透過の動
作を明確に定義 し てい ます。 こ れは、 SVG グ ラ フ ィ ッ ク の透過の要素がその同 じ SVG
の中の他の要素 と 相互作用す る 場合、 ま たは こ の配置 し た グ ラ フ ィ ッ ク に不透明を適
用す る こ と に よ っ てその SVG を通 じ て既存のページ内容が部分的に見え る よ う に し た
い場合に重要です。 ま た、 グ ラ フ ィ ッ ク が複数回配置 さ れ る 場合には、 テ ン プ レー ト
に よ っ て PDF 出力は小 さ く 済みます。 テ ンプ レー ト 方式の難点 と し ては、 SVG グ ラ
フ ィ ッ ク 内の リ ン ク は PDF の注釈へ変換 さ れません。
テ ンプ レー ト が生成 さ れ る と はいえ、 返 さ れ る SVG ハン ド ルを テ ンプ レー ト ハン ド ル
と し て使用す る こ と はで き ないので注意 し て く だ さ い。
> PDF_load_graphics( )のinlineオプシ ョ ン を trueにする と 、そのグ ラ フ ィ ッ ク のデー タ は、
ページ ・ パ タ ーン ・ テ ン プ レー ト ・ グ リ フ記述の内容 ス ト リ ーム の中に イ ン ラ イ ン で
書 き 込まれます。 こ の イ ン ラ イ ン方式が推奨 さ れ る 場合 と し ては、 SVG グ ラ フ ィ ッ ク
内の リ ン ク を PDF の注釈へ変換 し たい場合です (PDF_fit_graphics( ) の convertlinks オ
プシ ョ ン を参照)。 し か し 、 こ れにはい く つか難点 も あ り ます。 グ ラ フ ィ ッ ク の中で透
過なオブジ ェ ク ト が重な り 合っ てい る 場合には、 出力の見た目がおか し く な る こ と が
あ り ます。 ま た、 配置 し た グ ラ フ ィ ッ ク の不透過度を正 し く 変更で き ません。 PDF_fit_
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 チ ェ ッ ク 中にエ ラ ーが発生すれば、 errorpolicy にかかわ ら ず、 PDF_info_
graphics( ) は 0 を返 し ます。 ま と め る と :

200 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む


> こ の fittingpossible チ ェ ッ ク は、後の PDF_fit_graphics( )・PDF_close_graphics( )・PDF_end_
document( ) での例外を回避 し ます。PDF 出力は例外の後では使用不能にな り ますので、
こ れは推奨 さ れ る アプ ロ ーチです。
> こ の fittingpossible チ ェ ッ ク を省 く と 、SVG の読み込みは速 く な り ますが、その SVGデー
タ が引 き 起 こ す例外が後で発生す る おそれがあ り ます。 こ の設定は、PDF_fit_graphics( )
での例外が許容で き る 場合に、 SVG の読み込みを速め る ために使用で き ます。 た と え
ば、 アプ リ ケーシ ョ ンが 1 個の SVG グ ラ フ ィ ッ ク フ ァ イ ルを 1 個の PDF 文書へ変換
し 、 それ以外のページ内容を追加 し ない場合には、 こ れは許容で き る アプ ロ ーチです。

こ の fittingpossible チ ェ ッ ク は、 カ レ ン ト でア ク テ ィ ブな グ ロ ーバル ・ 文書 ・ ページオプ


シ ョ ン群 と 、 カ レ ン ト 出力 イ ン テ ン ト を使用 し ます。 ですので こ のチ ェ ッ ク は、 PDF_fit_
graphics( ) への実際の呼び出 し の直前にのみ走 ら せ る こ と を推奨 し ます。

ネ ッ ト ワー ク リ ソ ース SVG グ ラ フ ィ ッ ク は、 そのグ ラ フ ィ ッ ク フ ァ イ ルの中の URL を


通 じ て、 外部のフ ォ ン ト や画像な ど リ ソ ース を参照する こ と がで き ます。 すなわち、 その
フ ォ ン ト や画像が ロ ーカルのマ シ ンへダ ウ ン ロ ー ド さ れ ま す。 ネ ッ ト ワ ー ク 動作の詳細
は、 PDF_set_option( ) の network オプシ ョ ン を用いて制御で き ます。 以下のプ ロ ト コ ルに
対応 し てい ます:file・http・https・ftp。すべてのネ ッ ト ワー ク 動作を抑止す る には network
オプシ ョ ンの disable サブオプシ ョ ン を使用 し ます。
複数の SVG グ ラ フ ィ ッ ク が同一のネ ッ ト ワー ク リ ソ ース を利用 し てい る こ と がわかっ
てい る 場合には、PDF_load_graphics( ) の downloadlifetime オプシ ョ ン を用いて キ ャ ッ シ ン
グ を活用で き ます。

注 ネ ッ ト ワー ク リ ソ ースは、 IBM シ ス テム i では対応 し ていません。

8.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 グ ラ フ ィ ッ ク 内で指定 さ れてい る 寸法値を、 forcedwidth ・ forcedheight オプシ ョ
ン を用いてオーバー ラ イ ド す る こ と も で き ます。 matchbox オプシ ョ ンのサブオプシ ョ ン
clipping を用い る と 、 グ ラ フ ィ ッ ク をオブジ ェ ク ト 枠の一部へ切 り 出す こ と も で き ます。

絶対寸法値のない SVG グ ラ フ ィ ッ ク SVG グ ラ フ ィ ッ ク のなかには、 width ・ height を


欠いてい る か、 あ る いは以下の例の よ う に相対値のみを内容 と し てい る ために、 絶対寸法
情報を内容 と し て持たない も の も あ り ます :
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">

8.2 SVG グ ラ フ ィ ッ ク 201


こ れは ス タ ン ド ア ロ ン用途を想定 さ れていない SVG グ ラ フ ィ ッ ク で用い ら れてい ま す。
PDFlib は こ の 場 合 に も 対 応 し ま す。 そ れ に は ユ ー ザ ー が オ プ シ ョ ン boxsize と
fitmethod=nofit を用いてはめ込み枠を指定 し てお く 必要があ り ます。 こ のはめ込み枠は
オブジ ェ ク ト 枠 と し て用い ら れます。 その SVG グ ラ フ ィ ッ ク は こ のはめ込み枠の辺で切
り 抜かれます。 はめ込み枠を指定 さ れていない場合には PDFlib は、 viewBox 属性 (あれ
ば) を オブジ ェ ク ト 枠 と し て用い ます。 SVG グ ラ フ ィ ッ ク 内で絶対寸法情報が得 ら れない
と き は、 PDF_load_graphics( ) の fallbackwidth ・ fallbackheight オプシ ョ ン を与え る こ と が
で き ま す。 こ れ ら のオプシ ョ ン が与え ら れていない と き は、 PDFlib は、 その SVG グ ラ
フ ィ ッ ク の外接枠を、 PDF_fit_graphics( ) か PDF_info_graphics( ) への最初の呼び出 し の際
に算出 し ます。 算出 さ れ る 外接枠は、 線幅 と 過大な グ リ フ が考慮 さ れていないので、 小 さ
すぎ る 場合があ り ます。 こ の場合には、 こ の算出 さ れた枠を、 bboxexpand オプシ ョ ン を
用いて拡げ る こ と も で き ます。デフ ォ ル ト では、こ の算出 さ れた外接枠は、そのグ ラ フ ィ ッ
ク が座標系の中の元の場所に位置付け ら れ る よ う 移動 さ れます (すなわち、 こ の枠は必ず
し も 原点を隅 と し て用い る わけではあ り ません)。

8.2.4 フ ォ ン ト 選択
フ ォ ン ト 選択アルゴ リ ズム SVG におけ る フ ォ ン ト 選択は、 以下のプ ロ パテ ィ に よ っ て
制御 さ れます :
font-family
font-style
font-weight

font-stretch
font-variant
font-size
font-size-adjust

こ れ ら のプ ロ パテ ィ の う ち、 最初の 3 つだけが、 外部フ ォ ン ト の選択に関連 し ます。


適切な フ ォ ン ト を選択す る ため、 PDFlib は以下の フ ォ ン ト 名を構築 し ます :
<font-family>,<font-weight>,<font-style>
<font-family>-<font-weight><font-style>
<font-family>,<font-normweight>,<font-style>
<font-family>,<font-weight>,<font-normstyle>
<font-family>,<font-normweight>,<font-normstyle>

こ こ で <font-normweight> は
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
を検索 し ます。

202 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む


PDFlib はその後、 処理が成功 し て フ ォ ン ト が読み込め る ま で、 上に挙げた フ ォ ン ト 名
を順次読み込み試行 し ます。 こ の リ ス ト 内の フ ォ ン ト 名は、 フ ォ ン ト リ ソ ース指定で も 用
い る こ と がで き ます。 例 :
p.set_option("FontOutline={<fontname>=<filename>}")
p.set_option("FontNameAlias={<fontname>=ArialMT}")

すべての試みが失敗 し た場合には、 PDFlib は、 名前 <font-family> を持つフ ォ ン ト を読み


込み試行 し て、 必要に応 じ て Bold ・ Italic プ ロ パテ ィ を擬似表現 し ます。
ブ ラ ウ ザーに よ っ ては、指定 さ れた フ ォ ン ト フ ァ ミ リ ーが見つか ら ない場合には、フ ォ
ン ト 選択プ ロ パテ ィ 群を無視す る も のがあ り ます。 PDFlib はそ う い う こ と を し ませんの
で、PDFlib の フ ォ ン ト 構成機構を通 じ て適切な フ ォ ン ト が得 ら れ る よ う に配慮す る 必要が
あ り ます (135 ページ 「6.3 フ ォ ン ト を読み込む」 参照)。
こ の font-family プ ロ パテ ィ は、 複数の フ ォ ン ト フ ァ ミ リ ー名を内容 と す る 場合 も あ り
ます。 例 :
font-family="Georgia, 'Minion Web', 'Times New Roman', Times, 'MS PMincho', serif"

こ の場合、 PDFlib は、 こ の リ ス ト 内の特定の フ ォ ン ト が読み込めなか っ た と き には、 その


次の フ ォ ン ト を読み込み試行 し ます。1 つの font-family リ ス ト に対 し て何 ら かの フ ォ ン ト
が読み込めた場合には、 PDFlib は、 こ の リ ス ト 内の残 り の font-family 群を、 最初に読み
込んだ フ ォ ン ト (マ ス タ ーフ ォ ン ト ) に対す る フ ォールバ ッ ク フ ォ ン ト (146 ページ 「6.3.6
フ ォールバ ッ ク フ ォ ン ト 」 参照) と し て読み込 も う と 試みます。 も し こ のマ ス タ ーフ ォ ン
ト が、 も っ と 前に読み込ま れていたためにすでに フ ォールバ ッ ク フ ォ ン ト 群を持っ てい る
と き には、 新 し い フ ォールバ ッ ク フ ォ ン ト 群は、 既存の フ ォールバ ッ ク フ ォ ン ト の リ ス ト
の末尾に追加 さ れます。
PDFlib が SVG グ ラ フ ィ ッ ク のための フ ォ ン ト を読み込む と 試み る 際には、 以下のオプ
シ ョ ンでデフ ォ ル ト で用い ら れます :
embedding subsetting skipembedding={fstype latincore}

こ れ ら の オ プ シ ョ ン を オ ー バー ラ イ ド す る に は、 PDF_load_graphics( ) の オ プ シ ョ ン
defaultfontoptions を用い ます。

フ ォ ン ト 構成 Windows シ ス テ ムでは、 PDFlib は、 シ ス テ ムに イ ン ス ト ール さ れてい る す


べての フ ォ ン ト にア ク セ ス で き ます (144 ページ 「6.3.5 Windows ・ macOS 上のホ ス ト フ ォ
ン ト 」 参照)。 た と えば、 SVG フ ォ ン ト 指定
font-family="Verdana" font-weight="bold"

は、 PDFlib フ ォ ン ト 名 Verdana,Bold と な り ます。 他のオペレーテ ィ ン グ シ ス テ ム では、


PDFlib は、FontOutline リ ソ ース が以下の方式で指定 さ れていればフ ォ ン ト を発見 し ます:
<fontnamepattern>=<filename.xxx>

こ こ で、 <fontnamepattern> は、 上述の フ ォ ン ト 名パ タ ーン群の う ちの一つであ り 、 ま た


xxx は、 その対応す る 、 その フ ォ ン ト ア ウ ト ラ イ ン フ ァ イ ルのフ ォ ン ト 名拡張子です。
上述の フ ォ ン ト 名パ タ ーン群の う ちの一つない し 複数に整合す る フ ォ ン ト 名を持つ適
切な FontOutline リ ソ ース は、 PDF_set_option( ) の enumeratefonts オプシ ョ ンで自動的に
作成す る こ と も で き ます。 フ ォ ン ト 構成に関 し て詳 し く は 141 ページ 「6.3.4 フ ォ ン ト を
検索」 を参照 し て く だ さ い。

8.2 SVG グ ラ フ ィ ッ ク 203


総称 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 Courier
monospace,Bold Courier-Bold
monospace,Italic Courier-Oblique
monospace,Bold,Italic Courier-BoldOblique

sans Helvetica
sans,Bold Helvetica-Bold
sans,Italic Helvetica-Oblique
sans,Bold,Italic Helvetica-BoldOblique

sans-serif Helvetica
sans-serif,Bold Helvetica-Bold
sans-serif,Italic Helvetica-Oblique
sans-serif,Bold,Italic Helvetica-BoldOblique

serif Times-Roman
serif,Bold Times-Bold
serif,Italic Times-Italic
serif,Bold,Italic Times-BoldItalic

こ れ ら のマ ッ ピ ン グは、以前にユーザーに よ っ て他の適切な リ ソ ース が一切指定 さ れてい


ない場合にのみ実行 さ れます。

8.2.5 見つか ら ない フ ォ ン ト 、 見つか ら ないグ リ フ を扱 う


見つか ら ない フ ォ ン ト と デ フ ォ ル ト フ ォ ン ト すべての フ ォ ン ト 読み込み試行が失敗 し
た場合、PDFlib は、PDF_load_graphics( ) の defaultfontfamily オプシ ョ ンで定義 さ れた font-
family 名 を 持つデ フ ォ ル ト フ ォ ン ト を 読み込 も う と 試み ま す。 デ フ ォ ル ト では、 Arial
Unicode MS フ ォ ン ト が も し 得 ら れ る な ら それが、 そ う でないな ら Helvetica が用い ら れま
す。 PDF の フ ォ ン ト 構成の中で Arial Unicode MS フ ォ ン ト が得 ら れ る よ う に し てお く か、
あ る いは、大 き な グ リ フ集合を持つ別の フ ォ ン ト を defaultfontfamily で指定 し てお く こ と
を強 く 推奨 し ます。 た と えば、 NotoSans-Regular フ ォ ン ト を最終手段フ ォ ン ト と し て構成
す る には、 以下のオプシ ョ ン を用い ます :
defaultfontfamily={NotoSans-Regular}

個別の フ ォ ン ト を置換 入手で き ない、 あ る いは望 ま し く ない (た と えば、 充分な グ リ


フ を含んでいない と い う 理由で。 後述) 特定の フ ォ ン ト を避け る ために、 よ り 適切な別の
フ ォ ン ト へそれ を マ ッ プす る こ と がで き ま す。 フ ォ ン ト 名エ イ リ ア ス 機能 と PDF_set_
option( ) を こ の目的に使い ます (詳 し く は 141 ページ 「フ ォ ン ト 名エ イ リ ア ス設定」 を参
照) 。 た と え ば、 中国語の テ キ ス ト が不適切に、 中国語の グ リ フ を 一切含ん で い な い

204 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む


Trebuchet MS フ ォ ン ト で設定 さ れてい る 場合に、こ れを以下の よ う に し て Arial Unicode MS
へマ ッ プす る こ と がで き ます :
p.set_option("FontnameAlias={ {Trebuchet MS}={Arial Unicode MS} }");

フ ォ ン ト 属性は自動的に追加 さ れ な い こ と に留意 し て く だ さ い。 た と え ば、 も し こ の
Trebuchet MS フ ォ ン ト が属性 font-weight="bold" で使われてい る な ら ば、 こ の フ ォ ン ト の
ボール ド 版へのエ イ リ ア ス を作成す る 必要があ り ます :
p.set_option("FontnameAlias={ {Trebuchet MS,Bold}={Arial Unicode MS} }");

見つか ら ないグ リ フ を視覚化 選択 さ れた フ ォ ン ト が、 必要な グ リ フ を含んでいない場


合には、 デフ ォ ル ト 置換グ リ フ がかわ り に用い ら れますので、 テ キ ス ト は全 く 見え な く な
り ます。 見つか ら ないグ リ フ を視覚化す る には、 defaultfontoptions オプシ ョ ン を用いて、
見え る 置換グ リ フ を指定す る こ と がで き ます。 た と えば、 PDF_load_graphics( ) に対す る 以
下のオプシ ョ ンは、 すべての見つか ら ないグ リ フ に対 し て疑問符を表示 し ます :
defaultfontoptions={replacementchar=?}

見つか ら ないグ リ フ に対 し て特定の フ ォ ールバ ッ ク フ ォ ン ト を指定 SVG 内で指定 さ れ


てい る フ ォ ン ト が、 そのテ キ ス ト のための適切な グ リ フ を含んでいない場合には、 テ キ ス
ト が全 く 見え な く な り ます。 よ く あ る 例 と し て、 中国語のテ キ ス ト を、 中国語のグ リ フ を
一切含んでいない欧文フ ォ ン ト で見せ よ う と し てい る 例を考え てみま し ょ う 。 も ち ろん最
善の解決策は、 SVG 内でそ も そ も 適切な フ ォ ン ト を用い る こ と で し ょ う 。 し か し 、 SVG 内
の不適切な フ ォ ン ト を扱わねばな ら ない場合には、PDFlib で フ ォールバ ッ ク フ ォ ン ト を指
定す る こ と がで き ます。 こ の フ ォールバ ッ ク フ ォ ン ト は、 元の フ ォ ン ト が特定のグ リ フ を
与え ない と き に用い ら れます。
PDF_load_graphics( ) に対す る 以下のオプシ ョ ンは、Arial Unicode MS を フ ォールバ ッ ク
フ ォ ン ト と し て指定 し てい ます :
defaultfontoptions={fallbackfonts={{fontname={Arial Unicode MS} encoding=unicode}}}

なお、 さ き に説明 し た defaultfontfamily オプシ ョ ン で指定 さ れた フ ォ ン ト は、 フ ォ ン ト が


見つか ら ない と き に使用 さ れ る のに対 し て、 こ の予備技法は、 フ ォ ン ト は得 ら れ る が必要
な グ リ フ を全部は含んでいない場合にあ ては ま り ます。

グ ロ ーバルな フ ォ ールバ ッ ク フ ォ ン ト フ ァ ミ リ ー を指定 f a l l b a c k f o n t f a m i l y ・


fallbackfontoptions オプシ ョ ン を用い る と 、 フ ォ ールバ ッ ク フ ォ ン ト 群の フ ァ ミ リ ー と 、
対応す る オプシ ョ ン群を指定す る こ と がで き ます。
defaultfontoptions 内の fallbackfonts オプシ ョ ンは、ただ 1 つの フ ォ ン ト を フ ォールバ ッ
ク フ ォ ン ト と し て 使用す る よ う 選択す る の に対 し て、 fallbackfontfamily を 用い る と 、
フ ォールバ ッ ク フ ォ ン ト 群の フ ァ ミ リ ーを指定す る こ と がで き ます。 すなわち、 ス タ イ ル
属性群が こ の フ ォ ン ト フ ァ ミ リ ー名に適用 さ れます。 ただ し 、 指定 さ れた フ ォ ン ト の ス タ
イ ル変種が実際に得 ら れ る こ と を前提 と し てい ます。 例 :
fallbackfontfamily={Arial}

8.2.6 SVG カ ラ ー拡張


ク ッ ク ブ ッ ク 非sRGB カ ラ ーのための コ ー ド サン プルがPDFlib ク ッ ク ブ ッ クの ト ピ ッ ク color/svg_color_
extension にあ り ます。

8.2 SVG グ ラ フ ィ ッ ク 205


SVG 1.1 はデフ ォ ル ト では、 テ キ ス ト と ベ ク ト ルグ ラ フ ィ ッ ク に対 し て sRGB 色空間を使
用 し てい ます。 ですので PDFlib は、 PDF/X と PDF/A に対 し ては、 SVG グ ラ フ ィ ッ ク を
デバ イ ス依存カ ラ ー と し て扱い ます。 し か し 、 SVG 内に埋め込まれてい る 画像は他の色空
間を使用 し てい る 場合 も あ り ます。 た と えば、 埋め込まれてい る か参照 さ れてい る JPEG
画像が CMYK 色空間を使用 し てい る か も し れず、 それは ICC プ ロ フ ァ イ ルを有 し てい る
か も し れない し 、 有 し ていないか も し れません。 RGB カ ラ ーに対す る デフ ォ ル ト sRGB プ
ロ フ ァ イ ルは、 PDF_load_graphics( ) の iccprofilergb オプシ ョ ン を用いてオーバー ラ イ ド す
る こ と も で き ます。
sRGB に加え て、 PDflib は、 SVG Color 1.2 ド ラ フ ト 仕様に従っ た文法拡張を使用 し た追
加の色空間に対応 し てい ます。 表 8.4 に、 使え る SVG 色空間を、 文法例 と と も に挙げま
す。 こ れ ら の色空間に関する 一般的な情報 と 、 PDFlib におけ る それ ら の扱いについては、
83 ページ 「4 章 色 と 透過」 を参照 し て く だ さ い。
SVG 文法は、 すべての種類に対 し て、 sRGB フ ォールバ ッ ク カ ラ ーを必須 と し てい ま
す。 PDFlib は、 文法エ ラ ーの と き と 、 ス ポ ッ ト カ ラ ー定義が見つか ら ない と き と 、 ICC プ
ロ フ ァ イ ルが見つか ら ない と き 、ま たはオプシ ョ ン forcesrgb が与え ら れてい る と き に、 こ
のフ ォールバ ッ ク カ ラ ーを使用 し ます。
ブ レ ン ド モー ド を援用す る と SVG 画像を着色ま たは脱色す る こ と も で き ます(104 ペー
ジ 「4.9.1 ブ レ ン ド モー ド を用いて色を変え る 」 参照)。

ICC ベースの カ ラ ー icc-based 色指定は、指定 さ れた ICC プ ロ フ ァ イ ルを適用 し ます。 こ


れは ロ ーカルフ ァ イ ル と し て参照 さ れていない場合には、 ICCprofile リ ソ ース カ テ ゴ リ ー
に従っ て検索 さ れます。 honoriccprofile=false が与え ら れてい る 場合には ICC プ ロ フ ァ イ
ルは無視 さ れます。SVG グ ラ フ ィ ッ ク 内で指定 さ れてい る プ ロ フ ァ イ ルを他のプ ロ フ ァ イ
ルでオーバー ラ イ ド す る にはオプシ ョ ン iccprofilegray/iccprofilergb/iccprofilecmyk を使用
し ます。

グ レ ー ・ RGB ・ CMYK デバ イ ス色空間 デ バ イ ス 独自色空間 device-gray ・ device-rgb ・


device-cmyk は、 一般的用途においては推奨 さ れ ま せん。 なぜな ら それ ら の視覚表現は、
PDF/A ま たは PDF/A 出力 イ ン テ ン ト ICC プ ロ フ ァ イ ルか然 る べ き デフ ォ ル ト 色空間に
よ っ て制御 さ れ る のでない限 り 、 特定の出力デバ イ ス に依存 し て し ま う か ら です。 かわ り
に ICC ベース の色空間を用いて作業す る こ と を強 く 推奨 し ます。例外 と し て挙げ ら れ る の
は、 CMYK コ ン ト ロ ール ス ト リ ッ プ を使っ て印刷機におけ る 濃度値を直接制御す る 場合
や、 ト ン ボ を印刷す る 場合です。
device-gray/rgb/cmyk属性か参照画像に よ っ て生成 さ れたデバ イ ス独自カ ラ ーについて
は、defaultimageoptions の iccprofile サブオプシ ョ ンか templateoptions の defaultgray/rgb/
cmyk サブオプシ ョ ン を通 じ て、 ICC ベース のカ ラ ーへマ ッ プす る こ と がで き ます。

スポ ッ ト カ ラ ー ・ DeviceN カ ラ ー icc-named-color 構文を使 う と 、 ス ポ ッ ト カ ラ ーを指


定で き ます。 ただ し 、 名前付 き カ ラ ーの ICC プ ロ フ ァ イ ルには対応 し ていないので、 その
ス ポ ッ ト カ ラ ーは PDFlib が知っ てい る も のであ る 必要があ り ます。 そ う でない と 、 sRGB
フ ォールバ ッ ク カ ラ ーが代替色 と し て使用 さ れます。 し たがっ て、 カ ス タ ムの ス ポ ッ ト カ
ラ ーについては、PDF_load_graphics( ) を呼び出す前に自分の コ ー ド の中で定義 し てお く 必
要があ り ます (93 ページ 「カ ス タ ム ス ポ ッ ト カ ラ ー」 参照)。 例 :
// スポットカラー「CompanyRed」をLab代替値とともに定義
p.set_graphics_option("fillcolor={spotname {CompanyRed} 1.0 {lab 60 65 65}}");

206 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む


device-nchannel 構文を使 う と 、 DeviceN カ ラ ーを選択で き ます。 こ の DeviceN カ ラ ーは、
PDF_create_devicen( ) を用いて作成 さ れた う えで (94 ページ 「4.5 DeviceN カ ラ ー」 参照)、
PDF_load_graphics( ) に devicencolors オプシ ョ ン を通 じ て与え ら れてい る 必要があ り ます。
すなわち、 使え る DeviceN 色空間は N の値ご と に 1 個だけであ る こ と にな り ます。

シ ェ ーデ ィ ン グ 表 8.4 に挙げ る 色空間は、SVG のグ ラ デーシ ョ ンの中で使用 さ れてい る


こ と も あ り え ます。 ただ し 、 PDF は、 1 つのグ ラ デーシ ョ ンの中ではすべての ス ト ッ プカ
ラ ーが同一の色空間か ら 採 ら れてい る こ と を要請 し てい ます。 1 つのグ ラ デーシ ョ ンの中
で複数の色空間か ら の ス ト ッ プ カ ラ ーを使っ てい る 場合には、 すべての色に対 し て その
sRGB フ ォールバ ッ ク カ ラ ーが用い ら れます。
ス ポ ッ ト カ ラ ーか ら 作 ら れ る シ ェーデ ィ ン グは、 ス ポ ッ ト カ ラ ーが Lab 代替値 と と も
に作成 さ れていれば (PDFlib 内部で既知の ス ポ ッ ト カ ラ ーはすべて こ れに該当)、 ス ポ ッ
ト カ ラ ーを温存 し ます。 CMYK な ど他の色空間で作成 さ れた ス ポ ッ ト カ ラ ーは温存 さ れ
ず、 PDF 出力内で sRGB シ ェーデ ィ ン グ と な り ます。

注 SVG における非 sRGB カ ラ ーは、 まだ完全には標準化が済んでいませんので、 その文法は


将来変わる可能性も あ り ます。

表 8.4 SVG 内の拡張色空間 (forcesrgb を用いて無効化 さ せる こ と も で き ます)

色空間 SVG 構文例 注

デバイ ス独立色空間

sRGB #FF0000 SVG 1.1 のデ フ ォル ト の色空間

ICC ベース #7F7F7F icc-color(gray.icc, 0.5) グ レースケール ・ RGB ・ CMYK のプ ロ


カ ラー #CC6633 icc-color(rgb.icc, 0.8, 0.4, 0.2) フ ァ イルに対 し て、 それぞれ 1 個 ・ 3
#2B7FAB icc-color(cmyk.icc, 0.8, 0.4, 0.2, 0.0) 個 ・ 4 個のカ ラ ー値を与え る必要があ り
ます。

CIELab #598237 cielab(50, -25, 35)

CIELch #FF007E cielch(50, 127, 0) 明度 ・ 彩度 ・ 色相 (度単位で)


#FF007E cielchab(50, 127, 0) CIELab へ変換 さ れます。

周知の #FFB12D icc-named-color(nmcl.icc, 'PANTONE 123 U') プ ロ フ ァ イル名は無視 さ れます。 SVG 文


スポ ッ ト #FFCE4C icc-named-color(nmcl.icc, 'PANTONE 123 U', 0.5) 法への拡張 と し て、 PDFlib では、 オプ
カ ラー #994F5B icc-named-color(nmcl.icc, 'HKS 18 Z') シ ョ ナルな濃度値を使え ます。 濃度値が
ない場合は 1.0 と 見な さ れます。

カスタム #FFE560 icc-named-color(nmcl.icc, 'CompanyColor') そのスポ ッ ト カ ラ ーがそれま でにすでに


スポ ッ ト #FFF36D icc-named-color(nmcl.icc, 'CompanyColor', 0.5) 定義 さ れていない限 り 、 sRGB フ ォ ール
カ ラー バ ッ ク カ ラ ーが代替色 と し て使用 さ れま
す。 プ ロ フ ァ イル名は無視 さ れます。 濃
度値がない場合は 1.0 と 見な さ れます。

n色 #FFE560 device-nchannel(0, 0.7, 0.2) DeviceN 色空間ハン ド ルを


#FFF36D device-nchannel(1 0 0 0 0.5 0.2 0) devicencolors オプ シ ョ ン で与え る必要
があ り ます。 n に対する DeviceN 色空間
ハン ド ルが与え られていない場合には、
sRGB フ ォ ールバ ッ ク カ ラ ーが使用 さ れ
ます。

デバイ ス依存色空間

DeviceGray #7F7F7F device-gray(0.5) PDF/A と PDF/X のデバイ ス色空間に対


する要件に従 う 必要があ り ます。

8.2 SVG グ ラ フ ィ ッ ク 207


表 8.4 SVG 内の拡張色空間 (forcesrgb を用いて無効化 さ せる こ と も で き ます)

色空間 SVG 構文例 注

DeviceRGB #0000FF device-rgb(0, 0, 255) PDF/A と PDF/X のデバイ ス色空間に対


する要件に従 う 必要があ り ます。

DeviceCMYK #00AEEF device-cmyk(1, 0, 0, 0) PDF/A と PDF/X のデバイ ス色空間に対


する要件に従 う 必要があ り ます。

8.2.7 ベ ク ト ルグ ラ フ ィ ッ ク ・ テキス ト 以外の SVG 内容


SVG 内に埋め込まれた画像 PDFlib は、SVG 内の image エ レ メ ン ト を処理 し て、187 ペー
ジ 「8.1 ラ ス タ ー画像」 で解説 し たすべての画像形式 と 、 ネ ス ト さ れた SVG グ ラ フ ィ ッ ク
を受け付け ます。 画像デー タ は、 SVG フ ァ イ ル内に埋め込まれていて も 、 外部フ ァ イ ル内
に存在 し ていて も 、 ネ ッ ト ワ ー ク ご し に リ モー ト の場所か ら 取得 し て も か ま い ません。
SVG グ ラ フ ィ ッ ク 内の画像は、 自動的に処理 さ れます。 ただ し 、 場合に よ っ ては、 特
定 の 画像処理 オ プ シ ョ ン 群 を 与 え る ほ う が よ い 場合 も あ り ま す。 こ れ は PDF_load_
graphics( ) の defaultimageoptions オプシ ョ ンで実現で き ます。 た と えば、 以下のオプシ ョ
ン を用い る と 、 低解像度画像の見栄え を向上 さ せ る ア ンチエ イ リ ア ス を適用で き ます ( こ
れは、 画像にア ンチエ イ リ ア ス を適用す る 多 く のブ ラ ウ ザーの SVG 表示 と 整合 し ます) :
defaultimageoptions={interpolate}

画像が入手で き ない場合 (参照 さ れた外部画像フ ァ イ ルが見つか ら ないな ど の原因で) 、


かつ、 オプシ ョ ン fallbackimage={ } (すなわち空のオプシ ョ ン リ ス ト ) が与え ら れてい る
場合には、 PDFlib は透明な灰色の市松模様を作成 し ます。 オプシ ョ ン fallbackimage の各
種サブオプシ ョ ン を用い る と 、 こ のパ タ ーン を カ ス タ マ イ ズ し た り 、 カ ス タ ムの画像かテ
ンプ レー ト を フ ォールバ ッ ク 視覚効果 と し て与え た り する こ と がで き ます。見つか ら ない
画像が自動的に置換 さ れ る こ と を避けたい場合には以下のオプシ ョ ン を用い ます :
errorconditions={references={image}}

SVG の リ ン ク inline オプシ ョ ン を用いて取 り 込まれた SVG グ ラ フ ィ ッ ク 内の リ ン ク は、


生成 さ れ る PDF 出力内の イ ン タ ラ ク テ ィ ブな リ ン ク 注釈へ変換 さ れます。 ただ し 、 リ ン
ク の作成を無効化する 条件がい く つかあ り ます (PDFlib API リ フ ァ レ ン ス参照)。 PDF 注
釈の contents オプシ ョ ンに、 SVG リ ン ク の xlink:title 属性が も し あればそれが、 なければ
タ ーゲ ッ ト URI が記入 さ れます。 タ グ付 き PDF モー ド では、 生成 さ れた リ ン ク に対 し て、
Link エ レ メ ン ト 1 個 と 、 関連す る OBJR エ レ メ ン ト 1 個が作成 さ れます。 ただ し 、 カ レ ン
ト でア ク テ ィ ブな ア イ テ ムが直接ページ装飾か擬似エ レ メ ン ト であ る 場合を除き ます。
SVG リ ン ク の PDF リ ン ク への変換は、 PDF_fit_graphics( ) の convertlinks オプシ ョ ンで
無効にす る こ と も で き ます。

SVG 内の メ タ デー タ SVG グ ラ フ ィ ッ ク は、 XMP メ タ デー タ を含んでい る こ と も あ り ま


す。 デフ ォ ル ト では PDFlib は、 出力フ ァ イ ルサ イ ズ を削減す る ために、 SVG グ ラ フ ィ ッ
ク 内の XMP メ タ デー タ を無視 し ます。 SVG か ら テ ンプ レー ト が作成 さ れ る 場合には ( こ
れがデフ ォ ル ト の動作)、 PDF_load_graphics( ) の以下のオプシ ョ ンで、 その XMP メ タ デー
タ を、 生成 さ れ る フ ォーム XObject に添付す る こ と も で き ます :
templateoptions={metadata={keepxmp=true}}

208 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む


SVG グ ラ フ ィ ッ ク の metadata ・ desc ・ title エ レ メ ン ト の内容は、 PDF_info_graphics( ) で、
以下のパ タ ーンに従っ て取得で き ます :
idx = (int) p.info_graphics(svg, "description", "");
if (idx != -1)
description = p.get_string(idx, "");

8.2.8 対応 し ていない SVG 機能


対応 し ていない機能の扱い デフ ォ ル ト では、対応 し ていない SVG 機能は無視 さ れます。
結果 と し て、 出力は作成 さ れますが、 そのグ ラ フ ィ ッ ク のい く つかの側面は失われてい る
か、 あ る いは誤っ た状態 と な り ます。 こ の動作は、 PDF_load_graphics( ) の errorconditions
オプシ ョ ンで変更で き ます。 そのサブオプシ ョ ン群は、 無視 さ れ る のでな く エ ラ ーを発生
さ せ る 条件 を 指定 し ま す。 た と えば、 以下のオプ シ ョ ン リ ス ト を 用い る と 、 PDF_load_
graphics( ) は、 SVG グ ラ フ ィ ッ ク がアニ メ ーシ ョ ンエ レ メ ン ト ま たは ス ク リ プテ ィ ン グエ
レ メ ン ト を含む場合には失敗 し ます。 例 :
errorconditions = {elements={animate script}}

対応 し ていない SVG エ レ メ ン ト 以下の SVG エ レ メ ン ト は、 対応 さ れてお ら ず、 無視 さ


れます :
> ア ニ メ ーシ ョ ン と ス ク リ プテ ィ ン グのためのエ レ メ ン ト 群 :
animate, animateColor, animateMotion, animateTransform, script, mpath, set

> フ ィ ル タ ーのためのエ レ メ ン ト 群 :
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

> その他のエ レ メ ン ト 群 :
cursor, foreignObject, vkern

制約のあ る SVG エ レ メ ン ト ・ 属性 ・ プ ロパテ ィ 以下の属性 と プ ロ パ テ ィ に は制約が


あ り ます :
> い く つかの CSS デ ィ レ ク テ ィ ブに対応 し てい ません。
> フ ォ ン ト 選択プ ロ パテ ィ font-variant には、キーワー ド small-caps でのみ、かつOpenType
機能 smcp を含むフ ォ ン ト に対 し てのみ対応 し てい ます。
> テ キ ス ト 体裁プ ロ パテ ィ text-decoration の複数の値の組み合わせには対応 し てい ませ
ん。 PDFlib は文字飾 り 要素を、 別個の塗 り ・ 描線色を持つ領域 と し て描 く のではな く 、
文字飾 り 要素を直線 と し て描 き ま す。 こ の直線は、 塗 り 色があればそれで、 なければ
描線色で描かれます。
> textPath エ レ メ ン ト に対す る rotate 属性には対応 し てい ません。
> プ ロ パテ ィ unicode-bidi には、双方向テ キ ス ト レ イ ア ウ ト のために必要なテーブルを含
む TrueType/OpenType フ ォ ン ト についてのみ従い ます。 PDFlib は、 PDF_fit_textline( )
のオプシ ョ ン リ ス ト 内で、 オプシ ョ ン shaping と script=_auto を設定 し ます。
> プ ロ パテ ィ glyph-orientation-vertical は SVG 1.1 に従っ て対応 し てい ますが、ただ し 角度
180˚ ・ 270˚ には対応 し てい ません。

8.2 SVG グ ラ フ ィ ッ ク 209


> view エ レ メ ン ト に対す る 属性 preserveAspectRatio は無視 さ れます。
> フ ォーム XObject (テ ンプ レー ト ) が生成 さ れてい る 場合、 すなわちはみ出 し た内容が
切 り 落 と さ れてい る 場合には、 svg エ レ メ ン ト のプ ロ パテ ィ overflow は値 visible に対
応 し ません。 こ れは inline オプシ ョ ン を用いて回避する こ と も で き ます。

対応 し ていない SVG プ ロパテ ィ 以下の SVG プ ロ パテ ィ は、 対応 さ れてお ら ず、 無視 さ


れます :
alignment-baseline, color-interpolation, color-interpolation-filters,
color-rendering, cursor, dominant-baseline, enable-background, filter, flood-color,
flood-opacity, glyph-orientation-horizontal,
image-rendering, lighting-color, pointer-events, shape-rendering, text-rendering

対応 し てい る SVG エ レ メ ン ト の対応 し ていない属性 対応 し てい る SVG エ レ メ ン ト の、


以下の属性は、 対応 さ れてお ら ず、 無視 さ れます :
baseProfile (svg)
contentScriptType (svg)
contentStyleType (svg)
externalResourcesRequired (すべてのエレメント)
method (textPath)
on* (すべてのエレメント)
spacing (textPath)
縦書きテキストに対するtextLength・lengthAdjust (text・textpath・tref・tspan)
version (svg)
zoomAndPan (svg)
xlink:role (すべてのエレメント)
xlink:show (すべてのエレメント)
xlink:type (すべてのエレメント)

210 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む


8.3 PDF ページ を PDI で取 り 込む
注 こ の節で解説するすべての関数は、PDFlib+PDI か、または PDFlib Personalization Server PPS
( こ れは PDI を含んでいます) を必要 と し ます。PDF 取 り 込みラ イ ブ ラ リ ー (PDI) は PDFlib
基本製品には含まれていません。PDI は PDFlib のすべてのバイ ナ リ ー版に含まれています
が、 それを利用するには PDFlib+PDI か PPS のためのラ イ セ ン スキーが必要です。

8.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 ブ ロ ッ ク と あわせて利用 さ れ る こ と をおすすめ し ます (375 ページ 「13 章 PPS と
PDFlib Block Plugin」 参照)。

8.3.2 PDFlib+PDI を使用


ク ッ ク ブ ッ ク PDF 取 り 込みの諸側面に関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ ク の pdf_import カ テ ゴ
リ ーにあ り ます。

一般的に考慮す る こ と PDF 文書か ら はページ内容だけでな く 以下のア イ テ ム も 取 り 込


め ます :
> 注釈 (213 ページ 「注釈を取 り 込む」 を参照)
> フ ォーム フ ィ ール ド (214 ページ 「フ ォーム フ ィ ール ド を取 り 込む」 を参照)
> ア ク シ ョ ン (214 ページ 「ア ク シ ョ ン と JavaScript を取 り 込む」 を参照)

8.3 PDF ページ を PDI で取 り 込む 211


> 構造エ レ メ ン ト タ グ (詳 し く は 215 ページ 「 タ グ付 き PDF 文書の構造情報を取 り 込む」
を参照)
> レ イ ヤー定義 (215 ページ 「レ イ ヤーを持つページ を取 り 込む」 を参照)
> (PPS のみ)PDFlib ブ ロ ッ ク を、PDF_process_pdi( ) と オプシ ョ ン action=copyallblocks ま た
は copyblock で取 り 込め ます (418 ページ 「13.9.2 PDFlib ブ ロ ッ ク を取 り 込む」 参照)。

取 り 込んだページ内の個々の リ ソ ース を他の PDFlib 関数で再利用する こ と はで き ません。


た と えば、取 り 込んだ文書内の フ ォ ン ト を他の何 ら かの内容のために再利用する こ と は不
可能です。 必要な フ ォ ン ト はすべて PDFlib 内で構成する 必要があ り ます。 取 り 込んだ複
数の文書が同 じ フ ォ ン ト の埋め込みフ ォ ン ト デー タ を それぞれ持っ ていた と し て も 、フ ォ
ン ト デー タ の重複を PDI はデフ ォ ル ト では解消 さ せませんが、 こ れは optimize 文書オプ
シ ョ ン を用いて実現す る こ と も で き ます。 他方、 取 り 込んだ PDF 内で欠けてい る フ ォ ン
ト があれば、 生成 さ れ る PDF 出力フ ァ イ ル内で も その フ ォ ン ト は欠けた ま ま です。 最適
な方法 と し ては、 取 り 込む文書はな る べ く 開いた ま ま に し ておいたほ う が、 同 じ フ ォ ン ト
が何度 も 出力文書内に埋め込まれずにすみます。
取 り 込んだ PDF のページ を出力ページ上に配置する ために PDFlib+PDI はテ ンプ レー ト
機能 (フ ォーム XObject) を利用 し ます。

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( ) の最後の引数は、 取 り 込むページの位置付け ・ 拡縮 ・ 回転を指示する


さ ま ざ ま なオプシ ョ ン を持ち う る オプシ ョ ン リ ス ト です。 こ のオプシ ョ ンについては詳 し
く は 221 ページ 「8.4 画像・グ ラ フ ィ ッ ク ・取 り 込み PDF ページ を配置」で解説 し てい ます。

212 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む


8.3.3 文書 ・ ページ関連のチ ェ ッ ク
文書関連のチ ェ ッ ク PDFlib+PDI は、 すべての種類の 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 と PDF 1.7ext8 の文書は、 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 ス テー タ ス と 非互換の場合には、 拒否 さ れます。
詳 し く は以下の項を参照 し て く だ さ い :
> 354 ページ 「12.2.7 PDF/A 文書を PDI で取 り 込み」。
> 365 ページ 「12.3.6 PDF/X 文書を PDI で取 り 込む」。
> 374 ページ 「12.4.7 PDF/X ・ PDF/VT 文書を PDI で取 り 込む」。
> 340 ページ 「11.4.4 PDF/UA 文書のページ を PDI で取 り 込む」。
> 文書が、矛盾 し た PDF/A ま たは PDF/X 出力 イ ン テ ン ト を含んでい る 場合には、ページ
は一切取 り 込まれません。

8.3.4 注釈 ・ フ ォ ーム フ ィ ール ド ・ ア ク シ ョ ン を取 り 込む
注釈を取 り 込む デフ ォ ル ト では PDI は、 取 り 込まれ る ページに存在 し てい る ページ内
容 と すべての注釈を取 り 込みます。 PDF_fit_pdi_page( ) の useannots オプシ ョ ン を与え る
と 、 リ ン ク 注釈な ど 選択 し た種類の注釈だけ を取 り 込め ま す。 注釈に紐付いてい る ア ク
シ ョ ン も 取 り 込まれます。 文書内の リ ン ク の移動先は、 ページの新 し い配置に合わせた も
のにな り ます。 た と えば、 取 り 込んだページの順序を変え て も 文書内の リ ン ク はなお動作
し ます。 リ ン ク の移動先は、 その タ ーゲ ッ ト ページが拡縮か回転 さ れてい る 場合な ど には
再計算 さ れます。 し か し 、 生成す る 出力文書の内容 と 構造に よ っ ては、 イ ン タ ラ ク テ ィ ブ
要素を再現で き ない こ と も あ り ます。 た と えば、 取 り 込んだページに次ページへの リ ン ク
があ っ た と し て、 なのにその タ ーゲ ッ ト ページ を取 り 込ま なか っ た ら 、 その リ ン ク はど こ
を指せば よ いで し ょ う か? 一般に PDFlib は、 で き る だけ多 く の イ ン タ ラ ク テ ィ ブ要素が

8.3 PDF ページ を PDI で取 り 込む 213


新たな文書で も 機能す る よ う に試みますが、あ ら ゆ る 場合にそれを保証で き る も のではな
いわけです。
注釈の取 り 込みはページ ス コ ープでのみ動作 し (た と えば PDF ページがテ ンプ レー ト
に配置 さ れ る 際には動作 し ない)、 以下の制約が課 さ れます :
> リ ン ク の タ ーゲ ッ ト が得 ら れない場合 (た と えば タ ーゲ ッ ト ページが取 り 込ま れてい
ないせいで) には、 何のア ク シ ョ ン も ない リ ン ク が生成 さ れます。
> 名前付 き 移動先は解決 さ れ ますが、 名前は温存 さ れ ません。 ですので、 リ ン ク は タ ー
ゲ ッ ト ページへ飛びますが、 移動先のシ ン ボ リ ッ ク 名は失われます。
> PrinterMark ・ Watermark 注釈の取 り 込みには対応 し てい ません。
> 注釈辞書内の、 動画起動キー Start ・ Duration ・ Rate ・ Synchronous な ど い く つかのプ ロ
パテ ィ は取 り 込まれません。
> PDF 2.0 の構造移動先の取 り 込みには対応 し てい ません。

注釈種別 Caret ・ FreeText ・ Line ・ Stamp のいずれかを内容 と し て持っ てい る ページ を取 り


込む場合には、 その注釈が体裁ス ト リ ーム を持っ ていないな ら ば、 Noto フ ォ ン ト 群への
ア ク セ ス を構成す る 必要があ り ます。 フ ォ ン ト は 2 つ と も PDFlib デ ィ ス ト リ ビ ュ ーシ ョ
ンに含まれてい ます (19 ページ 「1.3 構成の必要事項」 を参照)。

フ ォ ーム フ ィ ール ド を取 り 込む デ フ ォ ル ト で は PDI はペー ジ 内容のみ を 取 り 込み、


フ ォーム フ ィ ール ド を無視 し ます。PDF_fit_pdi_page( ) の usefields オプシ ョ ン を与え る と 、
すべてのフ ィ ール ド を取 り 込んだ り 、テ キ ス ト フ ィ ール ド な ど選択 し た種類のみを取 り 込
んだ り する こ と がで き ます。 フ ォーム フ ィ ール ド は、 ただ 1 つの PDF 入力文書か ら のみ
取 り 込む こ と がで き 、 複数の文書か ら は取 り 込め ま せん。 取 り 込んだページ を フ ォ ーム
フ ィ ール ド と と も に配置で き る のは 1 回だけです。 ま た、 フ ォーム フ ィ ール ド の作成は、
ただ 1 つの PDF 文書か ら 取 り 込むか、 それ と も PDF_create_field( ) を用い る か、 そのど ち
ら かのみで行え ます。 両方の方式を組み合わせ る こ と はで き ません。 し か し 、 取 り 込んだ
フ ォーム フ ィ ール ド に PDF_create_field( ) で流 し 込みを行 う こ と は可能です。
フ ォーム フ ィ ール ド の取 り 込みはページ ス コ ープでのみ動作 し (た と えば PDF ページ
がテ ンプ レー ト に配置 さ れ る 際には動作 し ない)、 以下の制約が課 さ れます :
> フ ォ ーム フ ィ ール ド の長方形の位置 と 寸法は、 ページ上の配置に合わせて拡縮な ど し
た も のにな り ます。
> 署名フ ィ ール ド の暗号署名デー タ は消去 さ れ ますので、 こ の場合には、 視覚表現 も 再
生成 さ れます。 不可視の署名は無視 さ れます。

ア ク シ ョ ン と JavaScript を取 り 込む PDF 文書は、 さ ま ざ ま な ト リ ガー イ ベン ト に よ っ


て起動 さ れ る ア ク シ ョ ン を内容 と し て持っ てい る こ と があ り ます。ア ク シ ョ ンの取 り 込み
について ま と め る と 以下の と お り です :
> 注釈 と フ ォ ーム フ ィ ール ド に位置 し てい る ア ク シ ョ ンは、 自動的にその注釈か フ ォ ー
ム フ ィ ール ド と 一緒に取 り 込まれます。
> 以下の種類のア ク シ ョ ンの取 り 込みには対応 し てい ません :
GoToE ・ GoToDp ・ Thread ・ Sound ・ Trans。
> 文書ア ク シ ョ ンは、PDF_open_pdi_document( ) の useactions オプシ ョ ン を用い る と 取 り
込め ます。
> ページ ア ク シ ョ ンは、PDF_fit_pdi_page( ) の useactions オプシ ョ ン を用い る と 取 り 込め
ます。
> 注釈 ・ フ ォーム フ ィ ール ド ・ ページ ・ 文書のための JavaScript ア ク シ ョ ンは、 文書レベ
ルに格納 さ れてい る JavaScript ルーチンに依存 し てい る こ と があ り ます。こ れ ら の ス ク

214 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む


リ プ ト は、 PDF_open_pdi_document( ) の usejavascript オプシ ョ ン を用いて取 り 込め ま
す。 文書レベルの JavaScript に依存 し てい る フ ィ ール ド を取 り 込む場合には こ のオプ
シ ョ ン を true に設定す る こ と を推奨 し ます。 文書レベルの JavaScript は、 PDF_create_
action( ) の script ・ scriptname オプシ ョ ン を用いて作成する こ と も 可能です。

8.3.5 取 り 込んだ PDF 文書の さ ら な る特徴


取 り 込んだ PDF ページの寸法 取 り 込んだ PDF ページは取 り 込んだ ラ ス タ ー画像 と 同様
に扱われ、 PDF_fit_pdi_page( ) を用いて出力ページ上に配置す る こ と がで き ます。 デフ ォ
ル ト では、 Acrobat での表示 と ま っ た く 同 じ 形で PDI はページ を取 り 込みます。 と り わけ
次の よ う な動作を し ます :
> ク ロ ッ ピ ン グは保持 さ れます (技術的にいえば : CropBox が存在す る 場合には、 PDI は
MediaBox よ り も CropBox を優先採用 し ます。 70 ページ 「3.2.2 ページ寸法」 参照)。
> ページに適用 さ れてい る 回転は保持 さ れます。

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/A ・ PDF/X ・ PDF/VT のあ ては ま る 要
請がすべて考慮 さ れます。

タ グ付き PDF 文書の構造情報を取 り 込む デフ ォ ル ト では、 タ グは、 入力文書 と 出力文


書の両方が タ グ付け さ れていれば取 り 込まれます。 ただ し 、 タ グ取 り 込みは、 PDF_open_
pdi_document( ) と PDF_open_pdi_page( ) の usetags オプシ ョ ンで無効にす る こ と も で き ま
す。詳 し く は 330 ページ「11.3 タ グ付 き PDF ページ を PDI で取 り 込む」を参照 し て く だ さ い。

レ イ ヤー を持つページ を取 り 込む PDFlib はつねに、 ページ上のすべての レ イ ヤー (技


術的には 「オプ シ ョ ナル内容」 と いい ま す) の内容を取 り 込み ま す。 レ イ ヤーの可視 ス
テー ト を含むレ イ ヤー定義 も 、 その レ イ ヤーが、 取 り 込んだページ群の う ちのいずれかで
使用 さ れていれば、 取 り 込まれます。 ただ し 、 レ イ ヤー定義の取 り 込みは、 PDF_open_pdi_
document( ) の uselayers オプシ ョ ン で無効にす る こ と も で き ます。 uselayers=false で作業
をす る ためには、 生成 さ れ る 文書は レ イ ヤーを一切含んでいてはいけ ません。 すなわち、
レ イ ヤーを持っ た PDF 文書はすべて uselayers= false を用いて開 く 必要があ り 、かつ、PDF_
define_layer( ) を呼び出 し てはいけ ません。
取 り 込んだ レ イ ヤー群の整頓を さ ら に制御す る には、 取 り 込んだ レ イ ヤー群に付加 さ
れ る レ イ ヤー リ ス ト の中に階層構造的 な タ イ ト ル レ イ ヤー を 作成す る PDF_open_pdi_

8.3 PDF ページ を PDI で取 り 込む 215


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 オプシ ョ ン を使 う こ と がで き ます。 こ れは取 り 込んだ フ ァ イ ル内の冗長なオ
ブジ ェ ク ト を検知 し て、生成す る 出力の体裁や品質を そ こ な う こ と な く そ う し たオブジ ェ
ク ト を削除 し ます。

暗号化 さ れた 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 に設定 さ れ る 。

216 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む


> pCOS が完全モー ド で動作す る (限定モー ド ではな く )。すなわち、pcosmodename 擬似
オブジ ェ ク ト が値 full に設定 さ れ る 。

8.3.6 文書関連のプ ロパテ ィ を転写


PDF 文書は多様なプ ロ パテ ィ を持っ てお り 、ページ内容以外に も 多 く の機能を含んでい る
こ と があ り ます。 PDFlib+PDI を用いて PDF 文書を取 り 込む際には、 取 り 込んだ文書の ど
の特徴を、 生成す る 出力文書において再現す る か を、 詳細に制御で き ます。 あ る 特徴を転
写す る よ う シ ンプルなオプシ ョ ンで PDFlib+PDI に命令で き る 場合 も あ り ます し 、 そ う で
ない場合には、 pCOS イ ン タ ーフ ェース を使っ て入力文書か ら 何 ら かのデー タ を取得 し た
のちに こ のデー タ を、 対応す る PDFlib の API メ ソ ッ ド と オプシ ョ ンに与え る こ と がで き
ます。

表 8.5 取 り 込んだ PDF 文書の文書関連の特徴を転写


PDF のア イ テム pCOS パス PDFlib を用いて転写または作成

以下のプ ロパテ ィ は、 オプ シ ョ ン を用いて転写で き ます :

文書の出力イ ン テ ン ト /Root/OutputIntents PDF_process_pdi( ) :


オプ シ ョ ン action=copyoutputintent

文書レ ベルのア ク シ ョ ン destpage ・ /Root/OpenAction ・ PDF_open_pdi_document( ) :


/Root/AA useactions オプ シ ョ ン

JavaScript 名称ツ リ ー names/JavaScript PDF_open_pdi_document( ) :


usejavascript オプ シ ョ ン

名前付き移動先 names/Dests 注釈かフ ィ ール ド のア ク シ ョ ンによ っ て使用 さ


れている名前付き移動先は解決 さ れますが、 そ
の名前は取 り 込まれません。
PDF_add_nameddest( )

ベース URI /Root/URI ベース URL は、 取 り 込まれた リ ン ク ア ク シ ョ ン


に自動的に適用 さ れます。
PDF_begin/end_document( ) : uri オプ シ ョ ン

以下のプ ロパテ ィ は、 pCOS を用いてオブ ジ ェ ク ト を取得 し てそれを PDFlib に与え る こ と に よ っ て転写で き ま


す:

文書の添付 names/EmbeddedFiles PDF_begin/end_document( ) :


attachments オプ シ ョ ン

タ グ付き PDF のス テー タ tagged PDF_begin_document( ) : tagged オプ シ ョ ン


文書が開かれた際のページ /Root/PageLayout PDF_begin/end_document( ) :


レ イ アウ ト pagelayout オプ シ ョ ン

文書を開 く モー ド /Root/PageMode PDF_begin/end_document( ) :


openmode オプ シ ョ ン

ビ ュ ーアの環境設定 /Root/ViewerPreferences PDF_begin/end_document( ) :


viewerpreferences オプ シ ョ ン

文書の言語 /Root/Lang PDF_end_document( ) :


lang オプ シ ョ ンか lang タ グ付けオプ シ ョ ン

8.3 PDF ページ を PDI で取 り 込む 217


表 8.5 取 り 込んだ PDF 文書の文書関連の特徴を転写
PDF のア イ テム pCOS パス PDFlib を用いて転写または作成

暗号化 encrypt/algorithm PDF_begin_document( ) :


encrypt/master attachmentpassword ・ masterpassword ・
encrypt/user permissions ・ userpassword オプ シ ョ ン
encrypt/attachment
encrypt/plainmetadata
encrypt/noaccessible な ど

文書レ ベル XMP /Root/Metadata PDF_begin/end_document( ) :


metadata オプ シ ョ ン

文書情報 フ ィ ール ド /Info PDF_set_info( )

線形化 linearized PDF_begin_document( ) : linearize オプ シ ョ ン

PDF/A ・ PDF/UA ・ PDF/ pdfa ・ pdfua ・ pdfx ・ pdfvt PDF_begin_document( ) :


X ・ PDF/VT 規格のス テー pdfa ・ pdfua ・ pdfx ・ pdfvt オプ シ ョ ン
タス
PDF のバージ ョ ン pdfversionstring PDF_begin_document( ) :
compatibility オプ シ ョ ン

文書レ ベルの連携フ ァ イル /Root/AF PDF_end_document( ) :


associatedfiles オプ シ ョ ン

構造 ヒ エ ラルキー上の連携 /Root/StructTreeRoot/AF PDF_end_document( ) :


フ ァ イル structureassociatedfiles オプ シ ョ ン

以下のプ ロパテ ィ は簡単に転写で き ません :

しおり bookmarks[...] PDF_create_bookmark( )

DPart と 文書部分 メ タ デー /Root/DPartRoot PDF_begin/end_dpart( ) : dpm オプ シ ョ ン


タ (DPM)

ポー ト フ ォ リ オ /Root/Collection PDF_begin/end_document( ) :
portfolio オプ シ ョ ン、
PDF_add_portfolio_file( )、
PDF_add_portfolio_folder( )

電子署名 と タ イ ムス タ ン プ signaturefields[...] 署名を転写 し て も無効にな るので意味があ り ま


せん。 新たな署名 と タ イ ムス タ ン プは、 PDFlib
PLOP DS を用いて作成で き ます。

Reader で編集ツールを有 usagerights 使用権限は、 会社独自の電子署名があるので、


効化する ための使用権限 Adobe ツールを用いてのみ生成で き ます。

タ グ付き PDF に対する ク /Root/StructTreeRoot/ClassMap 非対応


ラ スマ ッ プ

アーテ ィ クルのス レ ッ ド と articles 非対応


ビー ド

文書レ ベルの PieceInfo /Root/PieceInfo 非対応

218 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む


8.3.7 ページ関連のプ ロパテ ィ を転写
表 8.6 取 り 込んだ PDF 文書のページ関連の特徴を転写
PDF のア イ テム pCOS パス PDFlib を用いて転写または作成

以下のプ ロパテ ィ は、 オプ シ ョ ン を用いて転写で き ます :

ページ内容 pages[...] PDF_fit_pdi_page( )

ページ寸法 pages[...]/MediaBox と PDF_fit_pdi_page( ) : adjustpage オプ シ ョ ン


pages[...]/CropBox

ページの幾何情報 (枠 と 回 pages[...]/MediaBox な ど PDF_open_pdi_page( ) ・ PDF_fit_pdi_page( ) :


転) pages[...]/Rotate cloneboxes オプ シ ョ ン

注釈 pages[...]/annots PDF_fit_pdi_page( ) : useannots オプ シ ョ ン

フ ォ ーム フ ィ ール ド pages[...]/fields PDF_fit_pdi_page( ) : usefields オプ シ ョ ン

ページ を開 く ア ク シ ョ ン、 pages[...]/AA/O と PDF_fit_pdi_page( ) : useactions オプ シ ョ ン


閉じ るアクシ ョ ン pages[...]/AA/C

PDFlib Personalization pages[...]/blocks PDF_process_pdi( ) : オプ シ ョ ン


Server (PPS) のためのブ action=copyblock ・ action=copyallblocks
ロック

レ イ ヤー /Root/OCProperties/OCGs PDF_open_pdi_document( ) :
uselayers オプ シ ョ ン

ページ内容に対数る構造エ PDF_info_pdi_page( ) : キーワー ド PDF_open_pdi_document( ) ・ PDF_open_pdi_page( ) :


レ メ ン ト タグ topleveltag usetags オプ シ ョ ン

ページの出力イ ン テ ン ト pages[...]/OutputIntents PDF_process_pdi( ) :


オプ シ ョ ン action=copypageoutputintent

以下のプ ロパテ ィ は、 pCOS を用いてオブ ジ ェ ク ト を取得 し てそれを PDFlib に与え る こ と に よ っ て転写で き ま


す:

ページ レ ベル XMP pages[...]/Metadata PDF_begin/end_page_ext( ) : metadata オプ シ ョ ン

注釈 と フ ィ ー無 フ ィ ール ド pages[...]/Tabs PDF_begin/end_page_ext( ) : taborder オプ シ ョ ン


の タ ブ順序

ユーザー単位 pages[...]/UserUnit PDF_begin/end_page_ext( ) : userunit オプ シ ョ ン

ビ ュ ーポー ト pages[...]/VP PDF_begin/end_page_ext( ) :


viewports オプ シ ョ ン

ページ遷移 pages[...]/Trans PDF_begin/end_page_ext( ) :


duration ・ transition オプ シ ョ ン

ページ レ ベルの連携フ ァ イ pages[...]/AF PDF_begin/end_page_ext( ) :


ル associatedfiles オプ シ ョ ン

画像レ ベルの連携フ ァ イル pages[...]/images[...]/AF PDF_load_image( ) : associatedfiles オプ シ ョ ン

フ ォ ーム XObject レ ベルの pages[...]/templates[...]/AF PDF_load_graphics( ) ・ PDF_open_pdi_page( ) ・


連携 フ ァ イル PDF_begin_template_ext( ) :
associatedfiles オプ シ ョ ン

注釈 XObject レ ベルの連携 pages[...]/annots[...]/AF PDF_create_annotation( ) :


フ ァ イル associatedfiles オプ シ ョ ン

ページ ラ ベル pages[...]/label PDF_begin_page_ext( ) : label オプ シ ョ ン

8.3 PDF ページ を PDI で取 り 込む 219


表 8.6 取 り 込んだ PDF 文書のページ関連の特徴を転写
PDF のア イ テム pCOS パス PDFlib を用いて転写または作成

以下のプ ロパテ ィ は転写で き ません :

ページ レ ベルの PieceInfo pages[...]/PieceInfo 非対応

プ レゼン テーシ ョ ン ス テ ッ pages[...]/PresSteps 非対応


220 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む


8.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配

ラ ス タ ー画像 と テ ンプ レー ト を配置す る ための関数 PDF_fit_image( ) と 、 グ ラ フ ィ ッ ク を
配置す る ための関数 PDF_fit_graphics( ) と 、 取 り 込み PDF ページ を配置す る ための関数
PDF_fit_pdi_page( ) は、 ページ上への配置を制御す る ための さ ま ざ ま なオプシ ョ ン を提供
し てい ます。 こ の節では、 い く つかの代表的な応用作業を見てみ る こ と に よ っ て、 も っ と
も 重要ない く つかのオプシ ョ ンの動作を示 し ます。すべてのオプシ ョ ンの完全な一覧 と 説
明については、 PDFlib API リ フ ァ レ ン ス を参照 し て く だ さ い。
こ の節に載せ る 作成例はすべて、 ラ ス タ ー画像で も テ ン プ レー ト で も グ ラ フ ィ ッ ク で
も 取 り 込み PDF ページで も 、 同 じ く 動作 し ます。 コ ー ド の作成例は ラ ス タ ー画像のため
の も の し か載せませんが、 オブジ ェ ク ト 一般の配置方法を そ こ では語っ てい る のです。 あ
ら ゆ る fit 関数はすべて、それを呼び出す前にはかな ら ず、PDF_load_image( ) か PDF_load_
graphics( ) か PDF_open_pdi_document( ) と PDF_open_pdi_page( ) への呼び出 し を行 う 必要
があ り ます。 簡潔のため、 こ れ ら の呼び出 し は こ こ では繰 り 返 し ません。

ク ッ ク ブ ッ ク 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページに関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ


ク の images ・ graphics ・ pdf_import カ テ ゴ リ ーにあ り ます。

8.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 ト ピ ッ ク にあ り ます。

8.4.2 オ ブ ジ ェ ク ト を点上か線上か枠内に配置
オブジ ェ ク ト を位置付け る ために、あ ら か じ め定義 し た幅 と 高 さ の枠を あわせて使 う こ と
も で き ます。 以下の図内の灰色の枠 と 線は、 枠の大 き さ を視覚化す る ために描 き 足 し て あ
る だけで、 実際の出力にはあ り ません。
オブジ ェ ク ト を枠内に配置す る こ と は、fitmethod=nofit の場合には意味があ り ません。
なぜな ら こ の場合、 そのオブジ ェ ク ト は位置付け ら れ る だけであ り 、 拡縮は行われないか
ら です。 boxsize オプシ ョ ン を用いて、 オブジ ェ ク ト 配置のための横線か縦線、 あ る いは
実際の枠を指定す る こ と がで き ます :

8.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置 221


boxsize={100 0} 横線
boxsize={0 100} 縦線
boxsize={100 200} 枠

以下の さ ま ざ ま な例では、 オブジ ェ ク ト を枠内に、 さ ま ざ ま なはめ込み方式ではめ込んで


いき ま し ょ う 。

枠内へ自動はめ込み fitmethod=auto を用い る と 、 PDFlib は画像を、 枠内にはめ込め る


よ う に、 ただ し それ をつぶ さ ずに拡縮 し ま す : も し それがその枠内にはめ込めた場合に
は、 拡縮は一切行われません。 そ う でない場合には、 幅 と 高 さ の縦横比を保ちなが ら 、 寸
法が縮小 さ れます。
図 8.2a・図 8.2b・図 8.2c では、はめ込み枠の寸法が最初 boxsize={70 45}、次に boxsize={70
30}、 さ ら に boxsize={30 30} と 減少 し てい く につれて、 PDFlib が画像寸法を縮小 し てい く
さ ま を演示 し てい ます。

図 8.2 さ ま ざ ま なはめ込み方式に従っ て画像を枠内にはめ込む


生成 さ れる出力 PDF_fit_image に与え るオプ シ ョ ン リ ス ト

boxsize={70 45} position=center fitmethod=auto


a)
(拡縮は必要でない)

boxsize={70 30} position=center fitmethod=auto


b)
(枠の高さが小さくなったのに合わせて縮小される)

boxsize={30 30} position=center fitmethod=auto


c)
(枠の高さと幅が小さくなったのに合わせて縮小される)

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

h) boxsize={30 30} position={right top} fitmethod=clip

222 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む


画像を枠の中央へはめ込み あ ら か じ め定義 し た 長方形の中央に画像 を 置 き た い と き
は、 自 分 で 計 算 を す る 必 要 は 全 く な く 、 適 切 な オ プ シ ョ ン を 使 え ば 実 現 で き ま す。
position=center を使っ て、 幅 70 ・ 高 さ 45 単位の枠 (boxsize={70 45}) の中央に画像を配
置 し ま し ょ う 。 fitmethod=meet を使 う と 、 画像は縦横比を保ちつつ、 その上下が枠に収
ま り き る ま で拡大縮小 さ れます (図 8.2d 参照)。
枠の幅を 70 か ら 35 単位に縮め る と 、 画像はその左右が枠に収ま り き る ま で縮小 さ れ
ます (図 8.2e 参照)。
fitmethod=meet では、 画像がつぶ さ れない こ と が保証 さ れ る と と も に、 枠内に、 で き
る だけ大 き く 配置 さ れます。

画像を枠全体へはめ込み 画像を も っ と 枠に合わせて、 枠全体を画像が埋め る よ う にす


る こ と も で き ます。 こ れは fitmethod=entire で実現で き ます。 し か し 、 こ の組み合わせは
画像をつぶすおそれがあ る ので、 有用な場合は まれで し ょ う (図 8.2f 参照)。

画像を枠へはめ込む際に切 り 抜 き 別のはめ込み方式 (fitmethod=clip) を使 う と 、 オブ


ジ ェ ク ト がはめ込んだ枠か ら はみ出 し た と き に、そのオブジ ェ ク ト を切 り 抜 く こ と がで き
ます。 枠の大き さ を縦横 と も 30 単位に縮めて、 画像を その枠の中央に元の大 き さ の ま ま
位置付けてみま し ょ う (図 8.2g 参照)。
画像を枠の中央に位置付け る こ と に よ っ て、 画像はすべての端が均等に切 り 落 と さ れ
ます。 同様に、 画像の右上部分をすべて見せたいな ら ば、 position={right top} で位置付け
れば よ いで し ょ う (図 8.2h 参照)。

8.4.3 オ ブ ジ ェ ク ト の向 き を変え る
画像の向 き を変え て配置 今度の例 と し ては、 画像の向 き を西向 き に変え てみ ま し ょ う
(orientate=west)。 こ れはすなわち、 画像が 90° 反時計回 り に回転 さ れ、 その回転後のオ
ブジ ェ ク ト の左下隅が参照点 (0, 0) へ並行移動 さ れ る こ と を意味 し ます。 画像はその場で
回転 し ます (図 8.5a 参照)。 はめ込み方式を指定 し ていないので、 画像は元の大 き さ の ま
ま出力 さ れて、 枠か ら はみ出 し ます。

画像の向 き を変え て縦横比を保ち つつ枠ち ょ う どへはめ込み 今度は、 画像を西に向け


た う えで、 あ ら か じ め定義 し た大 き さ にす る こ と に挑戦 し てみま し ょ う 。 求め る 大 き さ の
枠を定義 し て、 画像の縦横比を変えずにその枠にはめ込みます (fitmethod=meet) 。 向 き
は orientate=west と 指定 し ます。 デフ ォ ル ト では、 画像は枠の左下隅に配置 さ れます (図
8.5b 参照)。 東に向けた画像を図 8.5c に、 南向 き を図 8.5d に示 し ます。
orientate オプシ ョ ンは、 図 8.4 に示す と お り 、 向 き のキーワ ー ド と し て north ・ east ・
west ・ south に対応 し てい ます。
なお、 orientate オプシ ョ ンは、 座標系全体には一切影響せずに、 配置す る オブジ ェ ク
ト にだけ影響を及ぼ し ます。

図 8.5 画像の向き を変え る


生成 さ れる出力 PDF_fit_image に与え るオプ シ ョ ン リ ス ト

a) boxsize={70 45} orientate=west1

8.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置 223


図 8.4
図 8.3 orientate オプ シ ョ ン
rotate オプ シ ョ ン

生成 さ れる出力 PDF_fit_image に与え るオプ シ ョ ン リ ス ト

b) boxsize={70 45} orientate=west fitmethod=meet

c) boxsize={70 45} orientate=east fitmethod=meet

d) boxsize={70 45} orientate=south fitmethod=meet

boxsize={70 45} position={center bottom} orientate=east


e) fitmethod=clip

1. デ フ ォル ト fitmethod=nofit ですので、 この boxsize オ プ シ ョ ンは実際には必要あ り ません。

向き を変え た画像を枠へはめ込んで切 り 抜き 画像を東に向けて (orientate=east)、枠の


下端中央に位置付け ま し ょ う (position={center bottom}) 。 さ ら に、 画像を元の大き さ の
ま ま配置 し 、 も し 画像が枠か ら はみ出 し た ら 切 り 落 と し ます (fitmethod=clip) (図 8.5e 参
照)。

8.4.4 オ ブ ジ ェ ク ト を回転
rotate オプシ ョ ンは、 参照点を中心に座標系を回転 さ せ る こ と に よ っ て、 オブジ ェ ク ト を
回転 さ せます。 結果 と し て、 はめ込み枠 も 回転 さ れます。 図 8.3 に、 rotate オプシ ョ ンの
一般的な動作を図示 し ます。

画像を回転 さ せて配置 まずは じ めに、 画像を 90° 反時計回 り に回転 さ せる こ と に挑戦


し てみま し ょ う 。 オブジ ェ ク ト を配置す る 前に、 座標系は参照点で 90° 反時計回 り に回
転 さ れます。 回転後のオブジ ェ ク ト の右下隅 (回転前のオブジ ェ ク ト の左下隅だ っ た所)
が、 最終的に参照点の位置にな り ます。 こ の場合を示 し たのが図 8.6a です。

224 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む


回転は座標系全体に影響す る ので、 枠の回転 さ れます。 同様に、 画像を 30° 反時計回
り に回転する こ と がで き ます (図 8.6b 参照)。

画像を回転 し てはめ込み 今度は、 画像を 90° 反時計回 り に回転 さ せて、 縦横比を保ち


つつ枠にはめ込む こ と に挑戦 し てみま し ょ う 。 こ れは fitmethod=meet を使えば実現で き
ます (図 8.6c 参照)。 同様に、 画像を 30° 反時計回 り に回転 さ せて、 その画像を縦横比
を保ちつつ枠にはめ込む こ と がで き ます (図 8.6d 参照)。

図 8.6 画像を回転
生成 さ れる出力 PDF_fit_image に与え るオプ シ ョ ン リ ス ト

a) boxsize={70 45} rotate=901

(x, y)

b) boxsize={70 45} rotate=301

(x, y)

c) boxsize={70 45} rotate=90 fitmethod=meet

(x, y)

d) boxsize={70 45} rotate=30 fitmethod=meet

(x, y)

1. デ フ ォ ル ト fitmethod=nofit ですので、 こ の boxsize オプ シ ョ ンは実際には必要あ り ません。

8.4.5 ページ寸法の調整
ページ寸法を画像に合わせる 今度の例 と し ては、 ページの大 き さ を オブジ ェ ク ト の大
き さ に自動的に合わせま し ょ う 。 こ れはた と えば、 さ ま ざ ま な画像を PDF 形式でアーカ
イ ブ し てお き たい と き な ど に有用です。 参照点 (x, y) を使えば、 ページ を オブジ ェ ク ト の
寸法 と ち ょ う ど同 じ にす る か、 それ と も 多少大 き めや小 さ めにす る か を、 指定す る こ と が
で き ます。 ページ寸法を大 き めにす る と (図 8.7 参照)、 画像の ま わ り にふちが残 り ます。
ページ寸法を画像 よ り 小 さ く す る と 、 画像の一部は切 り 落 と さ れます。 まずは、 ページ寸
法を オブジ ェ ク ト の大き さ と ち ょ う ど同 じ に し ま し ょ う :
p.fit_image(image, 0, 0, "adjustpage");

次の コ ー ド 断片は、 ページ寸法を x ・ y 方向に 40 単位ずつ増や し てい ますので、 オブジ ェ


ク ト の ま わ り に白ふちが作成 さ れます :

8.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置 225


図 8.7
ページ寸法の調
整。 左か ら、 ち ょ
う ど ・ 大きめ ・ 小
さめ

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 のページ寸法や裁ち落 と し な ど が必ず入力文書のペー


ジ と 同 じ にな る よ う にす る こ と がで き ま す。 こ れは特にプ リ プ レ ス 分野において重要で
す。

8.4.6 配置 さ れた画像 と PDF ページ に関す る情報を ク エ リ ー


配置 さ れた画像 と テ ン プ レ ー ト に関す る情報 PDF_info_image( ) メ ソ ッ ド を用いて、 画
像 ・ テ ンプ レー ト 情報を ク エ リ ーす る こ と がで き ます。 こ の メ ソ ッ ド で使え る キーワ ー ド
は、 一般的な画像情報 (例 : 幅 ・ 高 さ を ピ ク セル単位で) のみな ら ず、 その画像の出力
ページ上への配置に関す る 情報 も 網羅 し てい ます (例 : はめ込み計算実行後の幅 ・ 高 さ を
絶対値で)。

226 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む


以下の コ ー ド 断片は、 ピ ク セル寸法 と 、 あ る 特定のはめ込みオプシ ョ ン に よ り 画像を
配置 し た後の絶対寸法の両方を取得 し ます :
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);

8.4 画像 ・ グ ラ フ ィ ッ ク ・ 取 り 込み PDF ページ を配置 227


228 第 8 章 : 画像 ・ SVG グ ラ フ ィ ッ ク ・ PDF ページ を取 り 込む
9 テキス ト と 表の組版
9.1 テキス ト 行を配置 ・ はめ込む
一行のテ キ ス ト をページ上に配置す る ための メ ソ ッ ド PDF_fit_textline( )には さ ま ざ ま な組
版オプシ ョ ンがあ り ます。 こ の節では も っ と も 重要なオプシ ョ ン をい く つか よ く 使われ る
応用例を用いて解説 し ます。 こ う し たオプシ ョ ンの完全な説明は PDFlib API リ フ ァ レ ン ス
にあ り ます。 PDF_fit_textline( ) のオプシ ョ ンの多 く は PDF_fit_image( ) のオプシ ョ ン と 同
じ です。 ですので こ こ ではテ キ ス ト 関連の利用例のみを示 し ま す。 画像の組版について
は、 221 ページ 「8.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 カ テ
ゴ リ ーにあ り ます。

9.1.1 単純な テキス ト 行配置


テキス ト を参照点に位置付け デ フ ォ ル ト では、 テ キ ス ト は左下隅を参照点に合わせて
配置 さ れます。 し か し こ の例では、 テ キ ス ト の下端中央を参照点に合わせて配置 し たいの
です。以下の コ ー ド 断片は、テ キ ス ト 枠の下端中央を参照点(30, 20)に合わせて配置 し ます。
p.fit_textline(text, 30, 20, "position={center bottom}");

図 9.1 に、 中央揃えのテ キ ス ト 配置の様子を図示 し ます。 同様に、 キーワー ド left ・ right ・


center ・ top ・ bottom の組み合わせを変え た position オプシ ョ ン を使っ て、 参照点にテ キ
ス ト を配置す る こ と がで き ます。

図 9.1 図 9.2
Kraxi

テキス ト の 西向きの
中央揃え 単純な テキス ト
y Kraxi y

x x

9.1 テキス ト 行を配置 ・ はめ込む 229


ᨒߩฝ਄ߦ࠹ࠠࠬ࠻

Kraxi ᨒߩ᏷50࡮㜞ߐ22
Kraxi
ᨒߩਅ┵ਛᄩߦ࠹ࠠࠬ࠻
20 20 ᨒߩ᏷50࡮㜞ߐ0

30 20

図 9.3 テキス ト を枠内に位置付け

テキス ト の向き を変え て配置 次は、 テ キ ス ト を回転 さ せて、 その左下隅 (回転後の) を


参照点に合わせて配置 し てみま し ょ う 。 以下の コ ー ド 断片は、 テ キ ス ト を西 (90˚ 反時計
回 り ) に向けた後、 その回転 し たテ キ ス ト の左下隅を参照点 (0, 0) へ並行移動 さ せます。
p.fit_textline(text, 0, 0, "orientate=west");

図 9.2 に、 単純なテ キ ス ト の向 き を変え て配置 し た様子を図示 し ます。

9.1.2 テキス ト を枠内に位置付け


テ キ ス ト を位置付け る には、 幅 と 高 さ を あ ら か じ め定義 し た枠を あわせて使 う こ と も で
き 、 テ キ ス ト はその場合、 こ の枠に対 し て相対的に位置付け る こ と が可能です。 図 9.3 に、
その一般的なはた ら き を図示 し ます。

テキス ト を枠内に位置付け 長方形の枠を定義 し て、 こ の枠内の右上にテ キ ス ト を配置


し ま し ょ う 。 以下の コ ー ド 断片は、 幅 50 単位 ・ 高 さ 22 単位の枠を、 参照点 (30, 20) に定
義 し ます。 図 9.4a の よ う に、 テ キ ス ト は枠の右上に配置 さ れます。
同様に、 下端中央にテ キ ス ト を配置す る こ と も で き ます。 こ の場合を図示 し たのが図
9.4b です。
枠 と テ キ ス ト の間に間隔を あ け る には、 margin オプシ ョ ン を付け加え ます (図 9.4c 参
照)。
なお、 図中の枠や線は、 枠の寸法を視覚化す る ために描いた も のであ り 、 実際の出力
には現れません。

図 9.4 さ ま ざ ま な位置付けオプ シ ョ ンに従っ て テキス ト を枠内に配置


生成 さ れる出力 PDF_fit_textline( ) に与え る オプ シ ョ ン リ ス ト

Kraxi boxsize={50 22} position={right top}


a)

b) boxsize={50 22} position={center bottom}


Kraxi

c) boxsize={50 22} position={center bottom} margin={0 3}


Kraxi

d) boxsize={50 0} position={center bottom}


Kraxi

230 第 9 章 : テキス ト と 表の組版


生成 さ れる出力 PDF_fit_textline( ) に与え る オプ シ ョ ン リ ス ト

e) Kraxi boxsize={0 35} position={left center} orientate=west

テキス ト を横線や縦線で整列 さ せる テ キ ス ト の位置付け を、 横線や縦線 (すなわち高


さ や幅がゼ ロ の枠) に沿っ て行 う と い う のは、 若干極端な ケース ではあ り ますが、 有用な
場合 も あ り ます。 図 9.4d は、 テ キ ス ト を枠に対 し て下端中央揃えで配置 し た も のです。 幅
を 50、 高 さ を 0 と し た こ と で、 枠は ま る で横線の よ う にな っ てい ます。
テ キ ス ト を縦線に沿っ て中央揃えす る ためには、 西向 き に し て、 枠に対 し て左端中央
に位置付け ま し ょ う 。 こ の場合を図 9.4e に示 し ます。

9.1.3 テキス ト を枠へはめ込み


こ の項では、 さ ま ざ ま なはめ込み方式を用いて、 テ キ ス ト を枠へはめ込みま し ょ う 。 カ レ
ン ト の フ ォ ン ト と 文字サ イ ズはど の例で も 同 じ と し ておき 、 さ ま ざ ま なはめ込み方式に と
も な っ て文字サ イ ズな ど のプ ロ パテ ィ が変わ る 様子がわか る よ う に し ます。
デフ ォ ル ト の場合か ら 始め ま し ょ う : 何のはめ込み方式 も 用いないで、 切 り 落 と し も
拡縮 も 一切 さ れない よ う にす る 場合です。 テ キ ス ト は、 幅 100 単位 ・ 高 さ 35 単位の枠の
中央に配置 さ れます (図 9.5a 参照)。
枠の幅を 100 か ら 50 単位に縮めて も 、 出力には全 く 影響を与え ません。 テ キ ス ト は元
の文字サ イ ズ を保ち、 枠か ら はみ出 し ます (図 9.5b 参照)。

テキス ト を小 さ な枠内へ縦横比を保 っ てはめ込み それでは、テ キ ス ト 全体を枠の中へ、


縦横比を保っ てはめ込んでみま し ょ う 。 こ れはオプシ ョ ン fitmethod=auto で実現で き ま
す。 図 9.5c では、 枠の幅が充分広いので、 テ キ ス ト は ま っ た く 元の大 き さ の ま ま、 変わ
ら ずに枠内に配置 さ れてい ます。
枠の幅を 100 か ら 58 に縮小す る と 、 テ キ ス ト は長すぎ て収ま り き ら な く な り ます。 は
め込み方式 auto はテ キ ス ト に長体を、 shrinklimit オプシ ョ ン (デフ ォ ル ト : 0.75) を限度
と し てかけ よ う と し ます。 図 9.5d は、 テ キ ス ト が元の長 さ の 75 パーセ ン ト に縮んだ様子
を示 し ます。
枠の幅を さ ら に 30 単位ま で縮め る と 、 テ キ ス ト は長体を かけて も 収ま り き ら な く な り
ます。 す る と 、 meet 方式が適用 さ れます。 こ れは、 テ キ ス ト 全体が枠に収ま る ま で文字
サ イ ズ を下げます。 こ の場合を示 し たのが図 9.5e です。

テキス ト の文字サ イ ズ を上げて枠へはめ込み テ キ ス ト を枠の幅 (ま たは高 さ ) い っぱ


いに拡げて、 ただ し 縦横比は保っ た ま ま、 はめ込みたい時があ る か も し れません。 テ キ ス
ト よ り 大 き い枠に対 し て fitmethod=meet を用い る と 、 テ キ ス ト の幅が枠の幅 と 一致す る
ま でテ キ ス ト が大き く な り ます。 こ の場合を図示 し たのが図 9.5f です。

テキス ト を枠い っ ぱいにはめ込み さ ら に、 テ キ ス ト が枠の中を埋めつ く す よ う にはめ


込む こ と も 可能です。 こ の場合は、 fitmethod=entire を使い ます。 し か し こ の設定は、 テ
キ ス ト を ほぼ確実にゆがめて し ま う ので、 使 う こ と はめ っ たにないで し ょ う (図 9.5g 参
照)。

テキス ト を枠で切 り 落 と し てはめ込み こ れ も レ ア な ケー ス ですが、 テ キ ス ト を元のサ


イ ズの ま ま はめ込んで、 も し も 枠か ら はみ出た部分は切 り 落 と し たい時 も あ る か も し れま

9.1 テキス ト 行を配置 ・ はめ込む 231


せん。 その場合は fitmethod=clip が使え ます。 図 9.5h では、 テ キ ス ト を枠の左端に配置 し
てい ますが、 枠の幅が足 り ません。 テ キ ス ト は右側が切 り 落 と さ れます。

図 9.5 さ ま ざ ま なオプ シ ョ ンに従っ て テキス ト をページ上の枠へはめ込む


生成 さ れる出力 PDF_fit_textline( ) に与え るオプ シ ョ ン リ ス ト

a) Kraxi Systems boxsize={100 35} position=center fontsize=12

b) Kraxi Systems boxsize={50 35} position=center fontsize=12

boxsize={100 35} position=center fontsize=12


c) Kraxi Systems fitmethod=auto

boxsize={58 35} position=center fontsize=12


d) Kraxi Systems fitmethod=auto

boxsize={30 35} position=center fontsize=12


e) Kraxi Systems
fitmethod=auto

boxsize={100 35} position=center fontsize=12


f) Kraxi Systems fitmethod=meet

g)
Kraxi Systems boxsize={100 35} position=center fontsize=12
fitmethod=entire

boxsize={50 35} position={left center}


h) Kraxi Sys fontsize=12 fitmethod=clip

テキス ト の縦中央揃え PDF_fit_textline( ) におけ る テ キ ス ト の高 さ は、 デフ ォ ル ト では


キ ャ ッ プハ イ ト 、 すなわち大文字の H の高 さ です。 テ キ ス ト を枠の中央に位置付け る と 、
縦方向にはそのキ ャ ッ プハ イ ト に も と づいて中央揃え さ れます (図 9.6a 参照)。
それ以外の高 さ を テ キ ス ト 枠に対 し て指定す る には、範囲枠機能を使い ます (275 ペー
ジ 「9.4 範囲枠」 も 参照)。 PDF_fit_textline( ) の matchbox オプシ ョ ンは、 テ キ ス ト 行の高
さ を定義 し てお り 、与え ら れた文字サ イ ズのキ ャ ッ プハ イ ト がそのデフ ォ ル ト にな っ てい
ます。 こ の範囲枠の高 さ は、 その boxheight サブオプシ ョ ンに も と づいて算出 さ れます。
boxheight サブオプシ ョ ンは、 ベース ラ イ ンか ら テ キ ス ト 上端 ・ 下端ま での距離を決定 し
ます。 デフ ォ ル ト の設定は matchbox={boxheight={capheight none}}、 すなわち範囲枠の上

232 第 9 章 : テキス ト と 表の組版


端はベース ラ イ ン よ り 上にあ っ て キ ャ ッ プハ イ ト に一致 し 、範囲枠の下端はベース ラ イ ン
を下へ越え ません。
範囲枠の大 き さ を図示す る ため、 こ こ では赤 く 色を塗 り ま し ょ う (図 9.6b 参照)。 図
9.6c では、 テ キ ス ト が xheight に基づいて縦中央揃え さ れ る よ う に、 その対応す る 高 さ の
範囲枠を定義 し てい ます。
図 9.6d ~ f に、 有用な さ ま ざ ま な boxheight 設定の範囲枠 (赤) と 、 それの決め る 高
さ に も と づいて枠の中で中央揃え さ れたテ キ ス ト を示 し ます。

図 9.6 さ ま ざ ま な範囲枠高 さ に従っ て テキス ト を枠へはめ込む


生成 さ れる出力 PDF_fit_textline( ) に与え る オプ シ ョ ン リ ス ト

a) Kraxi Systems boxsize={80 20} position=center fitmethod=auto

boxsize={80 20} position=center fitmethod=auto


b) Kraxi Systems matchbox={boxheight={capheight none} fillcolor=mistyrose}

boxsize={80 20} position=center fitmethod=auto


c) Kraxi Systems matchbox={boxheight={xheight none} fillcolor=mistyrose}

boxsize={80 20} position=center fitmethod=auto


d) Kraxi Systems matchbox={boxheight={ascender none} fillcolor=mistyrose}

boxsize={80 20} position=center fitmethod=auto


e) Kraxi Systems matchbox={boxheight={ascender descender} fillcolor=mistyrose}

boxsize={80 20} position=center fitmethod=auto


f) Kraxi Systems matchbox={boxheight={fontsize none} fillcolor=mistyrose}

9.1.4 テキス ト を文字で揃え る


テキス ト を文字で揃え る テ キ ス ト を、 あ る 特定の文字で揃え たい場合が あ る か も し れ
ません。 た と えば数値の小数点揃え な ど です。 図 9.7a に示す よ う に、 テ キ ス ト ははめ込
み枠の中央に位置付け ら れます。 PDF_fit_textline( ) で alignchar=. オプシ ョ ン を用い る こ
と で、 数値が点で揃い ます。
点を枠の中央に配置 し てい る position オプシ ョ ン を省 く こ と も で き ます。 そ う すれば、
デフ ォ ル ト の position={left bottom} が用い ら れ る ので、 点は参照点に配置 さ れ ます (図
9.7b 参照)。 一般に、 揃え文字はその右下隅が参照点に配置 さ れます。

図 9.7 テキス ト 行を点で揃え る


生成 さ れる出力 PDF_fit_textline( ) に与え る オプ シ ョ ン リ ス ト

127.123
12.01 boxsize={70 8} position={center bottom} alignchar=.
a)
123.0
4025.20

127.123
12.01 boxsize={70 8} position={left bottom} alignchar=.
b)
123.0
4025.20

9.1 テキス ト 行を配置 ・ はめ込む 233


9.1.5 ス タ ン プ を配置
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の text_output/simple_stamp ト ピ ッ ク にあ り ます。

テ キ ス ト の回転を指定 し な く て も 、 ス タ ンプ と い う 便利な機能を使えば、 テ キ ス ト を枠内


に対角線に沿っ て配置す る こ と がで き ます。 こ の ス タ ンプ機能は洗練 さ れた自動計算を行
い、 テ キ ス ト が枠内いっぱいに拡が る よ う 文字サ イ ズ と 回転角を決定 し ます。 対角線ス タ
ンプ を、 た と えばページの背景な ど に配置す る には、 PDF_fit_textline( ) で stamp オプシ ョ
ン を指定 し ます。 stamp=ll2ur を指定す る と 、 テ キ ス ト ははめ込み枠の左下隅か ら 右上隅
へ配置 さ れます。 こ れに対 し 、 stamp=ul2lr を指定する と 、 テ キ ス ト ははめ込み枠の左上
隅 か ら 右 下 隅 へ 配 置 さ れ ま す。 fitbox オ プ シ ョ ン は 無視 さ れ ま す。 図 9.8 で は、
showborder=true を用いてはめ込み枠 と ス タ ンプの外接枠を図示 し てい ます。

図 9.8 左下から 右上へのス タ ン プのよ う にテキス ト 行をはめ込む


生成 さ れる出力 PDF_fit_textline( ) に与え る オプ シ ョ ン リ ス ト

ng
Giant Wi
fontsize=8 boxsize={160 50} stamp=ll2ur showborder=true

9.1.6 リ ーダー を用い る


リ ーダーを使 う と 、 はめ込み枠の端 と テ キ ス ト と の間の余白を埋め る こ と がで き ます。 た
と えば点 リ ーダーは、目次の各エン ト リ ー と その対応する ページ番号をつないで見やすい
よ う に よ く 利用 さ れます。

目次の リ ーダー PDF_fit_textline( ) で leader オプシ ョ ン と alignment={none right} サブオ


プシ ョ ン を用い る と 、 テ キ ス ト 行の右に リ ーダーが付加 さ れて、 テ キ ス ト 枠の右端ま で繰
り 返 さ れます。 リ ーダー右端 と 右枠 と の間隔は一定ですが、 テ キ ス ト と リ ーダー左端 と の
間隔は変動の可能性があ り ます (図 9.9a 参照)。

ク ッ ク ブ ッ ク テキス ト 行の中での点 リ ーダーの使用例を示す完全な コ ー ド サン プルが ク ッ ク ブ ッ ク の


textoutput/leaders_in_textline ト ピ ッ ク にあ り ます。

ク ッ ク ブ ッ ク テキス ト フ ロ ーの中での点 リ ーダーの使用例を示す完全な コ ー ド サン プルが ク ッ ク ブ ッ


ク の textflow/dot_leaders_with_tabs ト ピ ッ ク にあ り ます。

ニ ュ ース電光掲示板の リ ーダー 別の用例 と し ては、 ニ ュ ー ス 電光掲示板効果を作成 し


たい場合 も あ る か も し れ ま せん。 こ こ ではプ ラ ス と ス ペー ス 「+ 」 を リ ーダーに使い ま
し ょ う 。 テ キ ス ト 行は中央に配置 し 、 リ ーダーはそのテ キ ス ト 行の前 と 後に印字 さ せます
(alignment={left right}) 。 リ ーダーの左右端は左右の枠に揃い、 テ キ ス ト と の間隔は変動
の可能性があ り ます (図 9.96b 参照)。

234 第 9 章 : テキス ト と 表の組版


図 9.9 リ ーダーを用いたテキス ト 行をはめ込む
生成 さ れる出力 PDF_fit_textline( ) に与え る オプ シ ョ ン リ
スト

Features of Giant Wing ....................................................


boxsize={200 10}
a) Description of Long Distance Glider.................................
leader={alignment={none right}}
Benefits of Cone Head Rocket .........................................

+ + + + + + + + + Giant Wing in purple! + + + + + + + + + boxsize={200 10}


position={center bottom}
b) ++ Long Distance Glider with sensational range! + +
leader={alignment={left right}
+ + + + + Cone Head Rocket incredibly fast! + + + + + text={+ }}

9.1.7 パス上テキス ト
テ キ ス ト を 直線上に配置す る の で は な く 、 任意のパ ス 上に配置す る こ と も で き ま す。
PDFlib は個々のキ ャ ラ ク タ ーをパス上に、テ キ ス ト がそのパ ス の曲線に沿 う よ う に配置 し
ます。 パ ス上テ キ ス ト を作成す る には PDF_fit_textline( ) の textpath オプシ ョ ン を用い ま
す。 パ ス はそれ以前に作成済みであ る 必要があ り 、 パ スハン ド ルで表 し ます。 パ スハン ド
ルは、PDF_add_path_point( ) お よ び関連す る パ ス オブジ ェ ク ト 関数群で明示的にパ ス を構
築す る か、あ る いは既存の ラ ス タ ー画像内の ク リ ッ ピ ン グパ ス のハン ド ルを取得す る こ と
に よ っ て作成で き ます。 以下の コ ー ド 断片は、 1 個のパ ス を作成 し 、 テ キ ス ト を そのパ ス
上に配置 し ます (図 9.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");

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の text_output/text_on_a_path ト ピ ッ ク にあ り ま


す。

er with sen
Glid
図 9.10

e sa パス上テキス ト

nc tio
a

na
t
Dis

l ra
Long

nge !

9.1 テキス ト 行を配置 ・ はめ込む 235


画像の ク リ ッ ピ ン グパス を用いて テキス ト を配置 パ ス 関数群でパ ス オブジ ェ ク ト を手
作業で構築す る のではな く 、 画像か ら ク リ ッ ピ ン グパ ス を抽出 し て、 そのパ ス上にテ キ ス
ト を配置す る こ と も で き ます。 こ の画像は 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 サブオプシ ョ ンでキ ャ ラ ク タ ー枠の縦延長を指定
す る こ と で実現で き ま す。 以下のオプシ ョ ン リ ス ト はア セ ン ダーを考慮に入れてい ま す
(図 9.11 参照) :
p.fit_textline("Long Distance Glider with sensational range!", x, y,
"textpath={path=" + path + "} position={center bottom} " +
"matchbox={boxheight={capheight descender}}");

9.1.8 影付き テキス ト


shadow オプシ ョ ン を用い る と 、 テ キ ス ト の影付き 効果を生み出す こ と がで き ます。 影の
色 と 、 メ イ ン テ キ ス ト か ら の横 ・ 縦距離を、 サブオプシ ョ ン内で指定で き ます :
p.fit_textline("Long Distance Glider", x, y,
"fillcolor=rosybrown shadow={offset={3, -3}}");

9.1.9 Acrobat で編集で き る透か し


テ キ ス ト 行機能を使 う と 、テ キ ス ト に対 し て さ ま ざ ま な組版オプシ ョ ン を適用する こ と が
で き ます。 こ のテ キ ス ト は、 ページに組み込まれた一部分 と な り 、 最終 PDF 文書内で簡
単に編集す る こ と はで き ま せん。 し か し 、 Acrobat は 「透か し 」 機能を提供 し てい ま す。

li d e r w it h s e n 図 9.11
e G sa パス上テキス ト で、 パス と テキ
nc ti o ス ト の間を あけた
ta

na
Di s

l ra
Long

nge!

236 第 9 章 : テキス ト と 表の組版


こ の機能を利用する と 、 Adobe Acrobat で後で変更や削除で き る ページ内容を作成で き ま
す (無料の Reader では不可)。 ただ し 、 こ の機能は PDF 標準 ISO 32000 に含まれてい る も
のではな く 、 Acrobat に実装 さ れてい る 独自拡張です。 ですので こ の機能は、 すべての標
準準拠 PDF ビ ュ ーアーで動作す る こ と が保証 さ れてい る も のではあ り ません。
Acrobat の透か し は、 1 行ない し 複数のテ キ ス ト 行か、 1 つの画像か、 1 つの PDF ペー
ジ を、 1 つのテ ンプ レー ト (フ ォーム XObject) 内に ラ ッ プ し て、 その透か し の組版特性
群の XML 記述を加え る こ と に よ っ て動作 し ます。既存の透か し を Acrobat DC で編集す る
操作は以下の と お り です : 「ツール」 → 「PDF を編集」 → 「透か し 」 → 「更新 ...」 ま たは
「削除 ...」。 す る と 「透か し を更新」 ダ イ ア ロ グが開 き ますので、 そ こ で透か し のテ キ ス ト
や、 その配置 ・ 体裁や、 対象 と す る ページ範囲を指定で き ます。 こ のテ キ ス ト の体裁は、
こ のダ イ ア ロ グ を用いた後に変わ る 可能性 も あ り ます。 なぜな ら 、 こ のダ イ ア ロ グは、 文
字間隔や下線、 テ キ ス ト 表現モー ド な ど、 あ ら ゆ る テ キ ス ト 組版オプシ ョ ンに対応 し てい
る わけではないか ら です。
こ の透か し は、 画面表示上で、 ま たは印刷ページ上で、 あ る いは両方で印字 さ れ る よ
う 指定す る こ と が可能です ( こ の Acrobat のダ イ ア ロ グの中の 「表示方法オプ シ ョ ン ...」)。
こ れは、 適切な画面 ・ 印刷設定を施 さ れた 「透か し 」 と い う レ イ ヤーを通 じ て実現 さ れま
す。 ただ し PDF/A ・ PDF/X ・ PDF/UA においては、 レ イ ヤー と レ イ ヤーオプシ ョ ンには
さ ま ざ ま な制約が課せ ら れてい ます。
PDFlib は、 そのテ ンプ レー ト 機能を拡張す る こ と に よ っ て こ の透か し 機能に対応 し て
い ます。PDF_begin_template_ext( ) を用いてテ ンプ レー ト を作成す る 際に、その watermark
オプシ ョ ン を用いて こ れに標識す る こ と が可能です。 その場合、 こ のテ ンプ レー ト は、 以
下のア イ テ ムの う ち 1 つを内容 と し て持っ てい る 必要があ り ます :
> PDF_fit_textline( ) を用いて配置 さ れたただ 1 行のテ キ ス ト 。
> PDF_fit_textflow( ) を用いて配置 さ れた複数行のテ キ ス ト 。
> PDF_fit_image( ) を用いて配置 さ れた画像。
> PDF_fit_pdi_page( ) を用いて配置 さ れた PDF ページ。

そ う し て生成 さ れた透か し は、 自動的にすべてのページに加え ら れ (あ る いは一部のペー


ジに も 可)、 後で Acrobat を用いて変更ま たは削除す る こ と が可能です。
以下の コ ー ド 断片は、 編集可能な透か し の定義を演示 し てい ます。 こ の透か し は、 こ
の透か し を定義 し た後に作成 さ れ る すべてのページに自動的に追加 さ れます。 なお、 指定
し てい る 文字サ イ ズは意味を持ち ません。 なぜな ら 、 こ う し てで き た テ ンプ レー ト はいず
れにせ よ そのページ内に収め ら れ る か ら です :
p.begin_template_ext(0, 0, "watermark={location=ontop opacity=60%}");

p.fit_textline("Preliminary", 0, 0,
"fontsize=12 fontname=Helvetica-Bold fillcolor=red " +
"boxsize={595 842} stamp=ll2ur");

p.end_template_ext(0, 0);

9.1 テキス ト 行を配置 ・ はめ込む 237


9.2 複数行のテキス ト フ ロ ー
1 行のテ キ ス ト をページ上に配置す る 機能だけでな く 、 PDFlib は、 任意の長 さ のテ キ ス ト
を組版で き る テ キ ス ト フ ロ ー と い う 強力な機能をサポー ト し てい ます。テ キ ス ト は何行に
も 、 何段に も 、 あ る いは何ページに も わた る こ と がで き 、 ま たその見ばえは さ ま ざ ま なオ
プシ ョ ンで制御す る こ と がで き ます。 フ ォ ン ト ・ サ イ ズ ・ 色 と いっ た文字属性を、 テ キ ス
ト のど の部分にで も 適用す る こ と がで き ます。 テ キ ス ト の両端揃え ・ 片端揃えや、 段落の
イ ンデン ト や、 タ ブ位置 と いっ た テ キ ス ト フ ロ ー属性を指定で き ます。 テ キ ス ト の中に ソ
フ ト ハ イ フ ンで示 し た改行機会が考慮 さ れます。構造情報を持っ た タ グ を与え る こ と も 可
能です。 図 9.12 ・ 図 9.13 は、 請求書の さ ま ざ ま な部分がページ上にテ キ ス ト フ ロ ー機能
を用いて配置で き てい る さ ま を例示 し た も のです。 こ う し た出力を制御す る ためのオプ
シ ョ ンについて、 以下の項で詳 し く 説明 し ます。

図 9.12
テキス ト フ ロー
Kraxi Systems, Inc.
の組版
Paper Planes
17, Aviation Road
Paperfield
Phone 7079-4301
Fax 7079-4302
info@kraxi.com
Kraxi Systems, Inc. 17, Aviation Road Paperfield www.kraxi.com
John Q. Doe
255 Customer Lane
Suite B
12345 User Town
Everland
INVOICE 14.03.2004
hortabmethod ruler
tabalignment right left right right right
ruler 30 45 275 375 475
ITEM DESCRIPTION QUANTITY PRICE AMOUNT
1 Super Kite 2 20,00 40,00
2 Turbo Flyer 5 40,00 200,00
3 Giga Trash 1 180,00 180,00
4 Bare Bone Kit 3 50,00 150,00
5 Nitty Gritty 10 20,00 200,00
6 Pretty Dark Flyer 1 75,00 75,00
7 Free Gift 1 0,00 0,00
845,00

leftindent 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 alignment
= 55 replaces the product under warranty. This warranty is not transferable. Returns or = left
exchanges are not possible for wet products.

Have a look at our new paper plane models!


parindent
Our paper planes are the ideal way of passing the time. We offer revolutionary
= 7%
new developments of the traditional common paper planes. If your lesson,
alignment
conference, or lecture turn out to be deadly boring, you can have a wonderful time
= justify
with our planes. All our models are folded from one paper sheet.
They are exclusively folded without using any adhesive. Several models are
leading equipped with a folded landing gear enabling a safe landing on the intended location
= 140 % 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.
leftindent = 75 rightindent
1. Long Distance Glider
= 60
With this paper rocket you can send all your messages even when
leftindent = 105 sitting in a hall or in the cinema pretty near the back.

2. Giant Wing minlinecount


An unbelievable sailplane! It is amazingly robust and can even do =2

238 第 9 章 : テキス ト と 表の組版


複数行のテ キ ス ト フ ロ ーは、 1 つの長方形 (はめ込み枠 と い う ) 内に も 複数の長方形内
に も 配置す る こ と がで き ます。 こ のはめ込み枠は 1 ページ上にあ っ て も 複数ページ上に
あ っ て も か ま い ません。テ キ ス ト フ ロ ーをページ上に配置す る には以下の手順を踏む必要
があ り ます :
> メ ソ ッ ド PDF_add_textflow( ) が、テ キ ス ト を一部分ずつ、その対応す る 組版オプシ ョ ン
と と も に受け入れて ( こ こ でオプシ ョ ンは別個の文字列 と し て与え る こ と も で き ます
し 、 テ キ ス ト 内に イ ン ラ イ ンで与え る こ と も で き ます)、 そ し て 1 つのテ キ ス ト フ ロ ー
オブジ ェ ク ト を作成 し てハン ド ルを返 し ます。 ま たは メ ソ ッ ド PDF_create_textflow( )
が、組版制御のための イ ン ラ イ ンオプシ ョ ン を含む こ と ので き る テ キ ス ト の全体を、一
度の呼び出 し で分析 し ます。 こ れ ら の関数ではページ上にテ キ ス ト は配置 さ れません。
> メ ソ ッ ド PDF_fit_textflow( ) が、 こ のテ キ ス ト フ ロ ーの全部ない し 一部を、 与え ら れた
はめ込み枠内に配置 し ます。 すべてのテ キ ス ト を配置す る には、 こ の段階を繰 り 返す
必要があ り ます。 その際、 こ の メ ソ ッ ド を呼び出すたびに、 新 し いはめ込み枠を与え
ます。こ のはめ込み枠は、同 じ ページにあ っ て も 、別のページにあ っ て も か ま い ません。
> メ ソ ッ ド PDF_delete_textflow( ) が、テ キ ス ト フ ロ ーを文書内に配置 し た後に、こ のテ キ
ス ト フ ロ ーオブジ ェ ク ト を削除 し ます。

テ キ ス ト フ ロ ーを作成す る ための関数 PDF_add/create_textflow( ) は、組版処理を制御す る


ための さ ま ざ ま なオプシ ョ ンに対応 し てい ます。 こ のオプシ ョ ンは メ ソ ッ ド のオプシ ョ ン
リ ス ト で与え る こ と も で き ます し 、あ る いはテ キ ス ト 内に イ ン ラ イ ンオプシ ョ ン と し て入
れ込む こ と も で き ます。 PDF_info_textflow( ) を使 う と 、 組版の結果や、 その他テ キ ス ト フ
ロ ーに関す る た く さ んの詳細を ク エ リ ーす る こ と がで き ます。 以下、 テ キ ス ト フ ロ ーの配
置について、 い く つかの よ く あ る 応用を例に し て説明 し ます。 テ キ ス ト フ ロ ーオプシ ョ ン
の完全な一覧は PDFlib API リ フ ァ レ ン スにあ り ます。
PDF_add/create_textflow( ) で対応 し てい る オプシ ョ ンの中には PDF_fit_textline( ) と 同
様の も のがた く さ んあ り ます。 ですか ら 229 ページ 「9.1 テ キ ス ト 行を配置 ・ はめ込む」
の例を あわせて よ く 把握 し てお く と よ いで し ょ う 。 以下の項では、 複数行テ キ ス ト に関係
のあ る オプシ ョ ンだけ を解説 し ます。

ク ッ ク ブ ッ ク テキス ト 出力の諸側面に関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ クの text_output カ テ


ゴ リ ーにあ り ます。

fillcolor, charspacing,
fontsize, fontname
aerobatics. But it is best suited to gliding.

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 図 9.13
aviation you can show your interest by letting it land on your teacher's テキス ト フ ロー
desk. の組版

9.2 複数行のテキス ト フ ロー 239


9.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");
if (tf == -1)
throw new Exception("エラー:" + p.get_errmsg());

/* テキストを標準フォントで追加 */
tf = p.add_textflow(tf, text2, "fontname=Helvetica fontsize=9");
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 つのテ キ ス ト フ ロ ーを、 テ キ ス ト をすべて配置 し お
わ る ま で配置す る 方法を演示 し てい ます (図 9.14 参照)。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の textflow/starter_textflow ト ピ ッ ク にあ り ます。

/* テキスト全部が配置されるまで回る。配置するべきテキストがまだあるなら新規ページを作成。
* 全ページに2段組を作成。
*/
do
{
String optlist = "verticalalign=justify linespreadlimit=120%";

p.begin_page_ext(0, 0, "width=a4.width height=a4.height");

/* 1段目に流し込み */
result = p.fit_textflow(tf, llx1, lly1, urx1, ury1, optlist);

/* まだテキストがあるなら2段目に流し込み */

240 第 9 章 : テキス ト と 表の組版


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);

9.2.2 段落の組版のオ プ シ ョ ン
上の例では段落に、 デフ ォ ル ト の設定を用い ま し た。 デフ ォ ル ト は左揃え、 行送 り 100%
(文字サ イ ズその ま ま)、 な ど と な っ てい ます。
段落の組版を調整 し たいな ら 、 PDF_add_textflow( ) にオプシ ョ ン を追加で き ます。 た
と えばテ キ ス ト を左余白か ら 15 単位、 右余白か ら 10 単位、 イ ンデン ト し たい と し ます。
各段落の先頭行は さ ら に 20 単位 イ ンデン ト し ま し ょ う 。 テ キ ス ト を両端揃え と し 、 行送
り は 140% に拡げま し ょ う 。 そ し て文字サ イ ズ を 8 ポ イ ン ト に下げます。 こ れを実現す る
には、PDF_add_textflow( ) のオプシ ョ ン リ ス ト を以下の よ う に拡張 し ます (図 9.15 参照):

はめ込み枠 1 はめ込み枠 2 はめ込み枠 3 はめ込み枠 4


ページ 1 dolor in reprehenderit in voluptate velit esse eiusmod tempor incididunt ut labore et nulla pariatur. Excepteur sint occaecat
ページ 2
1 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor cillum dolore eu fugiat nulla pariatur. Excep- dolore magna aliqua. Ut enim ad minim cupidatat non proident, sunt in culpa qui
incididunt ut labore et dolore magna aliqua. teur sint occaecat cupidatat non proident, veniam, quis nostrud exercitation ullamco officia deserunt mollit anim id est laborum.
Ut enim ad minim veniam, quis nostrud sunt in culpa qui officia deserunt mollit anim laboris nisi ut aliquip ex ea commodo con- 21 Lorem ipsum dolor sit amet, consectetur
exercitation ullamco laboris nisi ut aliquip ex id est laborum. 8 Lorem ipsum dolor sit sequat. Duis aute irure dolor in reprehenderit adipisicing elit, sed do eiusmod tempor
ea commodo consequat. Duis aute irure amet, consectetur adipisicing elit, sed do in voluptate velit esse cillum dolore eu fugiat incididunt ut labore et dolore magna aliqua.
dolor in reprehenderit in voluptate velit esse eiusmod tempor incididunt ut labore et nulla pariatur. Excepteur sint occaecat Ut enim ad minim veniam, quis nostrud
cillum dolore eu fugiat nulla pariatur. Excep- dolore magna aliqua. Ut enim ad minim cupidatat non proident, sunt in culpa qui exercitation ullamco laboris nisi ut aliquip ex
teur sint occaecat cupidatat non proident, veniam, quis nostrud exercitation ullamco officia deserunt mollit anim id est laborum. ea commodo consequat. Duis aute irure
sunt in culpa qui officia deserunt mollit anim laboris nisi ut aliquip ex ea commodo con- 15 Lorem ipsum dolor sit amet, consectetur dolor in reprehenderit in voluptate velit esse
id est laborum. 2 Lorem ipsum dolor sit sequat. Duis aute irure dolor in reprehenderit adipisicing elit, sed do eiusmod tempor cillum dolore eu fugiat nulla pariatur. Excep-
amet, consectetur adipisicing elit, sed do in voluptate velit esse cillum dolore eu fugiat incididunt ut labore et dolore magna aliqua. teur sint occaecat cupidatat non proident,
eiusmod tempor incididunt ut labore et nulla pariatur. Excepteur sint occaecat Ut enim ad minim veniam, quis nostrud sunt in culpa qui officia deserunt mollit anim
dolore magna aliqua. Ut enim ad minim cupidatat non proident, sunt in culpa qui exercitation ullamco laboris nisi ut aliquip ex id est laborum. 22 Lorem ipsum dolor sit
veniam, quis nostrud exercitation ullamco officia deserunt mollit anim id est laborum. ea commodo consequat. Duis aute irure amet, consectetur adipisicing elit, sed do
laboris nisi ut aliquip ex ea commodo con- 9 Lorem ipsum dolor sit amet, consectetur dolor in reprehenderit in voluptate velit esse eiusmod tempor incididunt ut labore et
sequat. Duis aute irure dolor in reprehenderit adipisicing elit, sed do eiusmod tempor cillum dolore eu fugiat nulla pariatur. Excep- dolore magna aliqua. Ut enim ad minim
in voluptate velit esse cillum dolore eu fugiat incididunt ut labore et dolore magna aliqua. teur sint occaecat cupidatat non proident, veniam, quis nostrud exercitation ullamco
nulla pariatur. Excepteur sint occaecat Ut enim ad minim veniam, quis nostrud sunt in culpa qui officia deserunt mollit anim laboris nisi ut aliquip ex ea commodo con-
cupidatat non proident, sunt in culpa qui exercitation ullamco laboris nisi ut aliquip ex id est laborum. 16 Lorem ipsum dolor sit sequat. Duis aute irure dolor in reprehenderit
officia deserunt mollit anim id est laborum. ea commodo consequat. Duis aute irure amet, consectetur adipisicing elit, sed do in voluptate velit esse cillum dolore eu fugiat
3 Lorem ipsum dolor sit amet, consectetur dolor in reprehenderit in voluptate velit esse eiusmod tempor incididunt ut labore et nulla pariatur. Excepteur sint occaecat
adipisicing elit, sed do eiusmod tempor cillum dolore eu fugiat nulla pariatur. Excep- dolore magna aliqua. Ut enim ad minim cupidatat non proident, sunt in culpa qui
incididunt ut labore et dolore magna aliqua. teur sint occaecat cupidatat non proident, veniam, quis nostrud exercitation ullamco officia deserunt mollit anim id est laborum.
Ut enim ad minim veniam, quis nostrud sunt in culpa qui officia deserunt mollit anim laboris nisi ut aliquip ex ea commodo con- 23 Lorem ipsum dolor sit amet, consectetur
exercitation ullamco laboris nisi ut aliquip ex id est laborum. 10 Lorem ipsum dolor sit sequat. Duis aute irure dolor in reprehenderit adipisicing elit, sed do eiusmod tempor
ea commodo consequat. Duis aute irure amet, consectetur adipisicing elit, sed do in voluptate velit esse cillum dolore eu fugiat incididunt ut labore et dolore magna aliqua.
dolor in reprehenderit in voluptate velit esse eiusmod tempor incididunt ut labore et nulla pariatur. Excepteur sint occaecat Ut enim ad minim veniam, quis nostrud
cillum dolore eu fugiat nulla pariatur. Excep- dolore magna aliqua. Ut enim ad minim cupidatat non proident, sunt in culpa qui exercitation ullamco laboris nisi ut aliquip ex
teur sint occaecat cupidatat non proident, veniam, quis nostrud exercitation ullamco officia deserunt mollit anim id est laborum. ea commodo consequat. Duis aute irure
sunt in culpa qui officia deserunt mollit anim laboris nisi ut aliquip ex ea commodo con- 17 Lorem ipsum dolor sit amet, consectetur dolor in reprehenderit in voluptate velit esse
id est laborum. 4 Lorem ipsum dolor sit sequat. Duis aute irure dolor in reprehenderit adipisicing elit, sed do eiusmod tempor cillum dolore eu fugiat nulla pariatur. Excep-
amet, consectetur adipisicing elit, sed do in voluptate velit esse cillum dolore eu fugiat incididunt ut labore et dolore magna aliqua. teur sint occaecat cupidatat non proident,
eiusmod tempor incididunt ut labore et nulla pariatur. Excepteur sint occaecat Ut enim ad minim veniam, quis nostrud sunt in culpa qui officia deserunt mollit anim
dolore magna aliqua. Ut enim ad minim cupidatat non proident, sunt in culpa qui exercitation ullamco laboris nisi ut aliquip ex id est laborum. 24 Lorem ipsum dolor sit
veniam, quis nostrud exercitation ullamco officia deserunt mollit anim id est laborum. ea commodo consequat. Duis aute irure amet, consectetur adipisicing elit, sed do
laboris nisi ut aliquip ex ea commodo con- 11 Lorem ipsum dolor sit amet, consectetur dolor in reprehenderit in voluptate velit esse eiusmod tempor incididunt ut labore et
sequat. Duis aute irure dolor in reprehenderit adipisicing elit, sed do eiusmod tempor cillum dolore eu fugiat nulla pariatur. Excep- dolore magna aliqua. Ut enim ad minim
in voluptate velit esse cillum dolore eu fugiat incididunt ut labore et dolore magna aliqua. teur sint occaecat cupidatat non proident, veniam, quis nostrud exercitation ullamco
nulla pariatur. Excepteur sint occaecat Ut enim ad minim veniam, quis nostrud sunt in culpa qui officia deserunt mollit anim laboris nisi ut aliquip ex ea commodo con-
cupidatat non proident, sunt in culpa qui exercitation ullamco laboris nisi ut aliquip ex id est laborum. 18 Lorem ipsum dolor sit sequat. Duis aute irure dolor in reprehenderit
officia deserunt mollit anim id est laborum. ea commodo consequat. Duis aute irure amet, consectetur adipisicing elit, sed do in voluptate velit esse cillum dolore eu fugiat
5 Lorem ipsum dolor sit amet, consectetur dolor in reprehenderit in voluptate velit esse eiusmod tempor incididunt ut labore et nulla pariatur. Excepteur sint occaecat
adipisicing elit, sed do eiusmod tempor cillum dolore eu fugiat nulla pariatur. Excep- dolore magna aliqua. Ut enim ad minim cupidatat non proident, sunt in culpa qui
incididunt ut labore et dolore magna aliqua. teur sint occaecat cupidatat non proident, veniam, quis nostrud exercitation ullamco officia deserunt mollit anim id est laborum.
Ut enim ad minim veniam, quis nostrud sunt in culpa qui officia deserunt mollit anim laboris nisi ut aliquip ex ea commodo con- 25 Lorem ipsum dolor sit amet, consectetur
exercitation ullamco laboris nisi ut aliquip ex id est laborum. 12 Lorem ipsum dolor sit sequat. Duis aute irure dolor in reprehenderit adipisicing elit, sed do eiusmod tempor
ea commodo consequat. Duis aute irure amet, consectetur adipisicing elit, sed do in voluptate velit esse cillum dolore eu fugiat incididunt ut labore et dolore magna aliqua.
dolor in reprehenderit in voluptate velit esse eiusmod tempor incididunt ut labore et nulla pariatur. Excepteur sint occaecat Ut enim ad minim veniam, quis nostrud
cillum dolore eu fugiat nulla pariatur. Excep- dolore magna aliqua. Ut enim ad minim cupidatat non proident, sunt in culpa qui exercitation ullamco laboris nisi ut aliquip ex
teur sint occaecat cupidatat non proident, veniam, quis nostrud exercitation ullamco officia deserunt mollit anim id est laborum. ea commodo consequat. Duis aute irure
sunt in culpa qui officia deserunt mollit anim laboris nisi ut aliquip ex ea commodo con- 19 Lorem ipsum dolor sit amet, consectetur dolor in reprehenderit in voluptate velit esse
id est laborum. 6 Lorem ipsum dolor sit sequat. Duis aute irure dolor in reprehenderit adipisicing elit, sed do eiusmod tempor cillum dolore eu fugiat nulla pariatur. Excep-
amet, consectetur adipisicing elit, sed do in voluptate velit esse cillum dolore eu fugiat incididunt ut labore et dolore magna aliqua. teur sint occaecat cupidatat non proident,

図 9.14
eiusmod tempor incididunt ut labore et nulla pariatur. Excepteur sint occaecat Ut enim ad minim veniam, quis nostrud sunt in culpa qui officia deserunt mollit anim
dolore magna aliqua. Ut enim ad minim cupidatat non proident, sunt in culpa qui exercitation ullamco laboris nisi ut aliquip ex id est laborum. 26 Lorem ipsum dolor sit
veniam, quis nostrud exercitation ullamco officia deserunt mollit anim id est laborum. ea commodo consequat. Duis aute irure amet, consectetur adipisicing elit, sed do
laboris nisi ut aliquip ex ea commodo con- 13 Lorem ipsum dolor sit amet, consectetur dolor in reprehenderit in voluptate velit esse eiusmod tempor incididunt ut labore et

テキス ト フ ローを
sequat. Duis aute irure dolor in reprehenderit adipisicing elit, sed do eiusmod tempor cillum dolore eu fugiat nulla pariatur. Excep- dolore magna aliqua. Ut enim ad minim
in voluptate velit esse cillum dolore eu fugiat incididunt ut labore et dolore magna aliqua. teur sint occaecat cupidatat non proident, veniam, quis nostrud exercitation ullamco
nulla pariatur. Excepteur sint occaecat Ut enim ad minim veniam, quis nostrud sunt in culpa qui officia deserunt mollit anim laboris nisi ut aliquip ex ea commodo con-
cupidatat non proident, sunt in culpa qui exercitation ullamco laboris nisi ut aliquip ex id est laborum. 20 Lorem ipsum dolor sit sequat. Duis aute irure dolor in reprehenderit

2 つのはめ込み枠
officia deserunt mollit anim id est laborum. ea commodo consequat. Duis aute irure amet, consectetur adipisicing elit, sed do in voluptate velit esse cillum dolore eu fugiat
7 Lorem ipsum dolor sit amet, consectetur dolor in reprehenderit in voluptate velit esse eiusmod tempor incididunt ut labore et nulla pariatur. Excepteur sint occaecat
adipisicing elit, sed do eiusmod tempor cillum dolore eu fugiat nulla pariatur. Excep- dolore magna aliqua. Ut enim ad minim cupidatat non proident, sunt in culpa qui
incididunt ut labore et dolore magna aliqua. teur sint occaecat cupidatat non proident, veniam, quis nostrud exercitation ullamco officia deserunt mollit anim id est laborum.
sunt in culpa qui officia deserunt mollit anim

に配置
Ut enim ad minim veniam, quis nostrud laboris nisi ut aliquip ex ea commodo con- 27 Lorem ipsum dolor sit amet, consectetur
exercitation ullamco laboris nisi ut aliquip ex id est laborum. 14 Lorem ipsum dolor sit sequat. Duis aute irure dolor in reprehenderit adipisicing elit, sed do eiusmod tempor
ea commodo consequat. Duis aute irure amet, consectetur adipisicing elit, sed do in voluptate velit esse cillum dolore eu fugiat incididunt ut labore et dolore magna aliqua.

9.2 複数行のテキス ト フ ロー 241


Have a look at our new paper plane models! Our paper planes rightindent = 1 0
leftindent = 15 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 alignment =
models are equipped with a folded landing gear enabling a safe landing justify
leading = 140% on the intended location provided that you have aimed well. Other
models are able to fly loops or cover long distances. Let them start
図 9.15
from a vista point in the mountains and see where they touch the
オプ シ ョ ン を用いて
テキス ト フ ローを配置 ground.

String optlist =
"leftindent=15 rightindent=10 parindent=20 alignment=justify " +
"leading=140% fontname=Helvetica fontsize=8";

9.2.3 イ ン ラ イ ン オ プ シ ョ ン リ ス ト と マ ク ロ
図 9.15 のテ キ ス ト は ま だ完璧ではあ り ません。 見出 し 「Have a look at our new paper plane
models!」 を独立 し た行に し て、 フ ォ ン ト も も っ と 大き く し て、 そ し て中央揃えに し ま し ょ
う 。 こ れを実現す る にはい く つかの方法があ り ます。

イ ン ラ イ ン オ プ シ ョ ン リ ス ト こ こ ま では組版オプシ ョ ン は、 メ ソ ッ ド に直接与え る オ
プシ ョ ン リ ス ト 内で指定 し て き ま し た。 今回 も こ れ と 同 じ や り 方を続け る な ら ば、 テ キ ス
ト を分割 し て二度の呼び出 し に分け る 必要があ り ます。 一度目で見出 し を、 二度目で残 り
のテ キ ス ト を配置す る わけです。 ですが、 場合に よ っ ては、 た と えば書式変更箇所が多い
と き な どは、 こ の方法は面倒か も し れません。
オプ シ ョ ン の取 り 扱い を 楽にす る た めに、 テ キ ス ト フ ロ ーに対 し て イ ン ラ イ ン オプ
シ ョ ン を与え る こ と も で き ます。 すなわち、 テ キ ス ト 内容 と 組版オプシ ョ ン を必要に応 じ
て混在 さ せ る のです。 PDF_create_textflow( ) と PDF_add_texflow( ) で inlineoptions オプ
シ ョ ン を用い る と 、 テ キ ス ト と 、 そのテ キ ス ト の中に直接入れ込 ま れた イ ン ラ イ ン オプ
シ ョ ン が解釈 さ れ ま す。 こ れは単純にオプシ ョ ン を テ キ ス ト 内に入れ込む と い う こ と で
す。 イ ン ラ イ ン オプシ ョ ン リ ス ト はテ キ ス ト 本体の一部 と し て与え ら れます。 デフ ォ ル ト
では、 イ ン ラ イ ンオプシ ョ ンはキ ャ ラ ク タ ー 「<」 と 「>」 では さ みます。 それでは次の よ
う に、見出 し と 残 り の段落に対す る オプシ ョ ン を テ キ ス ト 本体の中に入れ込んでみま し ょ
う。

注 以下作成例ではすべて、 イ ン ラ イ ン オプ シ ョ ン リ ス ト に色をつけて示 し ます。 改段落キ ャ


ラ ク タ ーを矢印で視覚化 し ます。
<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>
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
landing on the intended location provided that you have aimed well.

242 第 9 章 : テキス ト と 表の組版


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.

デフ ォ ル ト では PDF_add_textflow( ) は イ ン ラ イ ンオプシ ョ ン リ ス ト を探 し ます。そ こ でオ


プシ ョ ン リ ス ト をは さ むキ ャ ラ ク タ ーは、 begoptlistchar ・ endoptlistchar オプシ ョ ンで定
義 し なおす こ と も で き ます。begoptlistchar オプシ ョ ンにキーワ ー ド none を与え る と オプ
シ ョ ン リ ス ト の検出は完全に無効にな り ます。 こ れは、 テ キ ス ト が イ ン ラ イ ンオプシ ョ ン
リ ス ト を ま っ た く 含ま ない場合に、 「<」 ・ 「>」 を確実に通常のキ ャ ラ ク タ ー と し て処理 さ
せたい と き に有用です。
PDF_add_textflow( ) は、 inlineoptions オプシ ョ ン を与え た場合にのみ イ ン ラ イ ンオプ
シ ョ ン リ ス ト を探 し ます。

記号キ ャ ラ ク タ ー と イ ン ラ イ ン オ プ シ ョ ン リ ス ト 記号キ ャ ラ ク タ ーはテ キ ス ト フ ロ ー


において、 イ ン ラ イ ンオプシ ョ ン リ ス ト と 組み合わせ も 使 う こ と がで き ます。 イ ン ラ イ ン
オプシ ョ ン リ ス ト を開始す る キ ャ ラ ク タ ーに対す る コ ー ド (デフ ォ ル ト では:「<」U+003C)
は、 encoding=builtin に よ る フ ォ ン ト に対す る テ キ ス ト 内では記号 コ ー ド と し て解釈 さ れ
ません。 こ れ と 同 じ コ ー ド の記号グ リ フ を選択す る には、 テ キ ス ト フ ォ ン ト に対 し て利用
可能な回避策がその ま ま使え ます。すなわち、開始キ ャ ラ ク タ ーを begoptlistchar オプシ ョ
ン で再定義す る か、 あ る いは textlen オプシ ョ ン を用いて記号グ リ フ の数を指定 し ます。
なお、 文字参照 (&lt; な ど) を回避策 と し て用い る こ と はで き ません。 ま た、 PDF_add_
textflow( ) で inlineoptions オプシ ョ ン を用いてい る 場合には textlen オプシ ョ ンは利用で
き ない こ と に も 留意 し て く だ さ い。

マ ク ロ 上記のテ キ ス ト はい く つかの種類の段落でで き てい ます。すなわち見出 し と 本文


であ り 、 本文には さ ら に イ ンデン ト のあ る も の と ない も の と があ り ます。 こ う し た各種の
段落を それぞれの形に組版 し てい く わけですが、 し か し テ キ ス ト フ ロ ーが も っ と 長ければ
同 じ 指定を何度 も し な ければな り ま せん。 段落替えのたびに、 対応す る イ ン ラ イ ン オプ
シ ョ ン群を書かな く て済む よ う にす る には、 イ ン ラ イ ンオプシ ョ ン群を マ ク ロ に ま と めれ
ば、 テ キ ス ト 内か ら そのマ ク ロ を名前で参照す る こ と がで き ます。 図 9.16 に示す よ う な 3
つのマ ク ロ を定義 し ま し ょ う 。 H1 は見出 し 用、 Body は本文段落用、 Body_indented は イ
ンデン ト す る 段落用です。 マ ク ロ を利用す る には、 キ ャ ラ ク タ ー & を マ ク ロ 名の前につ
けた も のを オプシ ョ ン リ ス ト に書 き ます。 以下の コ ー ド 断片は、 上で用いた イ ン ラ イ ンオ
プシ ョ ン群に従っ て 3 つのマ ク ロ を定義 し 、 それを テ キ ス ト 内で利用 し ます :

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
図 9.16 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.

9.2 複数行のテキス ト フ ロー 243


<macro {
H1 {leftindent=15 rightindent=10 alignment=center
fontname=Helvetica fontsize=12}

Body {leftindent=15 rightindent=10 alignment=justify leading=140%


fontname=Helvetica fontsize=8}

Body_indented {parindent=20 leftindent=15 rightindent=10 alignment=justify


leading=140% fontname=Helvetica fontsize=8}
}>
<&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 通 り の状況が考え ら れます :
> テ キ ス ト 内容が外部 ソ ース か ら 来て、 組版オプシ ョ ンはプ ロ グ ラ ム内にあ る 場合 : 実
行時に、 外部 ソ ー ス か ら 来 る 短いテ キ ス ト 群を プ ロ グ ラ ム内で合成 し 、 それを組版オ
プシ ョ ン群 と ( メ ソ ッ ド 呼び出 し の所で) 組み合わせます。
> テ キ ス ト 内容 も 組版オプシ ョ ン も 外部 ソ ース か ら 来 る 場合 : 大量のテ キ ス ト が組版オ
プシ ョ ン群を含んだ状態で外部 ソ ース か ら 来ます。 組版はテ キ ス ト 内の イ ン ラ イ ン オ
プシ ョ ン群に よ っ て与え ら れ ます。 イ ン ラ イ ン オプシ ョ ンは単純なオプシ ョ ン と し て
書かれてい る こ と も あれば、 マ ク ロ と し て書かれてい る こ と も あ り え ます。 マ ク ロ に
関 し ては、 マ ク ロ 定義 と マ ク ロ 呼び出 し と を区別 し て考え る 必要があ り ます。 そ う す
る と 、 面白い中間的形態が作 り 出せます : テ キ ス ト 内容は外部 ソ ース か ら 来て組版の
ためのマ ク ロ 呼び出 し も その中に含んでい る のですが、 マ ク ロ 定義は別に用意 し てお
いて実行時には じ めて与え る よ う にす る のです。 こ の方式の利点は、 外部のテ キ ス ト

244 第 9 章 : テキス ト と 表の組版


hortabmethod ruler
tabalignment left right right right
ruler 30 150 250 350

ITEM DESCRIPTION QUANTITY PRICE AMOUNT


1 Super Kite 2 20.00 40.00
2 Turbo Flyer 5 40.00 200.00
図 9.17
3 Giga Trash 1 180.00 180.00
テキス ト を TOTAL 420.00
表 と し て配置

に手を加えずに組版を簡単に変更で き る こ と です。 た と えばグ リ ーテ ィ ン グ カー ド を


作 る 際な ど、 さ ま ざ ま な ス タ イ ルを マ ク ロ で定義 し ておけば、 カー ド の雰囲気を ロ マ
ンチ ッ ク に し た り 、テ ク ニ カルに し た り 、その他 さ ま ざ ま に変え る こ と がで き る で し ょ
う。

9.2.4 タ ブ位置
次の例では タ ブキ ャ ラ ク タ ーを用いて左寄せ ・ 右寄せの列のあ る 簡単な表を配置 し ます。
表は以下の よ う な複数行のテ キ ス ト を持ち、個々のエン ト リ ーが互いに タ ブキ ャ ラ ク タ ー
(矢印で示す) で区切っ て あ り ます :

ITEM DESCRIPTION QUANTITY PRICE AMOUNT


1 Super Kite 2 20.00 40.00
2 Turbo Flyer 5 40.00 200.00
3 Giga Trash 1 180.00 180.00
TOTAL 420.00

こ の簡単な表を配置す る には、 PDF__add/create_textflow( ) で以下のオプシ ョ ン リ ス ト を


用い ます。 ruler オプシ ョ ンが タ ブ位置を定義 し てお り 、 tabalignment が タ ブ位置の整列
方向を指定 し てお り 、 hortabmethod オプシ ョ ンが タ ブ位置の処理方式を指定 し てい ます
(出力を図 9.17 に示 し ます) :
String optlist =
"ruler={30 150 250 350} " +
"tabalignment={left right right right} " +
"hortabmethod=ruler leading=120% fontname=Helvetica fontsize=9";

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の textflow/tabstops_in_text ト ピ ッ ク にあ り ます。

注 複雑な表を作成するには PDFlib の表機能を推奨 し ます (259 ページ 「9.3 表の組版」 参照)。

9.2.5 番号付き リ ス ト と 段落間隔


イ ン ラ イ ンオプシ ョ ンleftindentを用いて番号付 き リ ス ト を組む方法を以下に示 し ます(図
9.18 参照) :
1.<leftindent 10>Long Distance Glider: With this paper rocket you can send all
your messages even when sitting in a hall or in the cinema pretty near the back.
<leftindent 0>2.<leftindent 10>Giant Wing: An unbelievable sailplane! It is amazingly
robust and can even do aerobatics. But it is best suited to gliding.
<leftindent 0>3.<leftindent 10>Cone Head Rocket: This paper arrow can be thrown with big

9.2 複数行のテキス ト フ ロー 245


leftindent = &indent
parindent = – &indent 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.
図 9.19
We launched it from the roof of a hotel. It stayed in the air a long
マ ク ロによ る
番号付き リ ス ト time and covered a considerable distance.

swing. We launched it from the roof of a hotel. It stayed in the air a long time and
covered a considerable distance.

ク ッ ク ブ ッ ク ビ ュ レ ッ ト リ ス ト と 番号付き リ ス ト の完全な コ ー ド サン プルがク ッ ク ブ ッ クの textflow/


bulleted_list ・ textflow/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 で指定 し た分だけ イ ンデ
ン ト さ れ る よ う にな り ます。図 9.19 に parindent・leftindent オプシ ョ ンの作用を示 し ます。

1. Long Distance Glider: With this paper rocket you can send all your 図 9.18
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.

246 第 9 章 : テキス ト と 表の組版


2 つの段落の間隔を設定 多 く の場合、 と な り あ っ た段落の間隔は、 段落の中の行間 よ
り も 、 広 く と り た い も のです。 こ れ を実現す る には、 空の行を挿入 し て (nextline オプ
シ ョ ンで作成で き ます) 、 その空行に適切な行送 り 値を設定 し ます。 こ の値は、 直前の段
落の最終行のベース ラ イ ン と 、 空行のベース ラ イ ン と の間隔です。 以下の例は、 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.

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の textflow/distance_between_paragraphs ト ピ ッ ク


にあ り ます。

9.2.6 制御キ ャ ラ ク タ ー と キ ャ ラ ク タ ーマ ッ ピ ン グ
テキス ト フ ロ ー内で制御キ ャ ラ ク タ ー テ キ ス ト フ ロ ーの中で は さ ま ざ ま な キ ャ ラ ク
タ ーが特別な扱いを受け ます。 PDFlib はシ ン ボ リ ッ ク キ ャ ラ ク タ ー名に対応 し てお り 、 こ
れはその対応す る 文字 コ ー ド のかわ り と し て charmapping オプシ ョ ン(テ キ ス ト を処理す
る 前にその中の キ ャ ラ ク タ ーを置換で き る オプシ ョ ン。 後述) 内で用い る こ と がで き ま
す。 表 9.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 キ ャ ラ ク タ ーに縮め ます :

9.2 複数行のテキス ト フ ロー 247


表 9.1 テキス ト フ ロー内の制御キ ャ ラ ク タ ー と その意味
等価な テキ
Unicode キ ャ ラ ク 実体名 ス ト フ ロー テキス ト フ ロー内における意味
ター オプ シ ョ ン

U+0020 SP, space space 単語揃え ・ 改行


U+00A0 NBSP, nbsp (な し ) (no-break space) 改行 し ない空白文字

U+202F NNBSP, (な し ) (narrow no-break space) 改行 し ない、 かつ組版オプ シ ョ ンに


nnbsp 従っ てその幅を変え る こ と のない固定幅空白文字

U+0009 HT, hortab (な し ) 水平 タ ブ : ruler ・ tabalignchar ・ tabalignment オプ シ ョ ン に


従っ て処理 さ れます

U+002D HY, hyphen (な し ) 単語のハイ フ ネーシ ョ ンのための区切 り 文字


U+00AD SHY, shy (な し ) (soft hyphen) ハイ フ ネーシ ョ ン機会。 改行箇所でのみ表示 さ
れる

U+000B VT, verttab nextline (next line) 次の行へ移る


U+2028 LS, linesep

U+000A LF, linefeed next- (next paragraph) nextline と 同効果。 それに加え、 parindent
U+000D CR, return paragraph オプ シ ョ ンが次の行に影響 し ます
U+000D ・ U+000A CRLF
U+0085 NEL, newline
U+2029 PS, parasep

U+000C FF, formfeed return PDF_fit_textflow( ) 関数が中断 し て文字列 _nextpage を返 し ま


す。

charmapping={linefeed {linefeed -1}}

CRLF キ ャ ラ ク タ ー列を それぞれ 1 個の スペース に置換 し ます :


charmapping={CRLF {space -1}}

こ の最後の例について も う 少 し 詳 し く 見てみま し ょ う 。た と えばど こ かか ら テ キ ス ト を受


け取っ た時、何か他の ソ フ ト ウ ェ アのせいで行の途中に改行がブ ツ ブ ツ入っ ていた と し た
ら 、 その ま ま では適切に組版がで き ません。 適切にはめ込み枠内での組版が行え る よ う に
す る には、 こ れ ら の改行を スペース に置換 し たい と こ ろ です。 こ れを行 う ため、 任意長の
連続改行を 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.

以下の コ ー ド 断片は、無駄な改行キ ャ ラ ク タ ーを置換 し た う えでで き たテ キ ス ト を組版す


る 方法を演示 し てい ます :

248 第 9 章 : テキス ト と 表の組版


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 図 9.20
long sides inwards 上 : 無駄な改行のあ る テキス ト
that the points A and B meet on the central fold.

To fold the famous rocket looper proceed as follows: Take a sheet of 下 : charmapping オプ シ ョ ン で
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 alignment=justify "
"charmapping {CRLF {space -1}}"
/* テキストフローをはめ込み枠に配置 */
textflow = p.add_textflow(-1, text, optlist);
if (textflow == -1)
throw new Exception("エラー:" + p.get_errmsg());

result = p.fit_textflow(textflow, left_x, left_y, right_x, right_y, "");


if (!result.equals("_stop"))
{ /* ... */ }

p.delete_textflow(textflow);

図 9.20 に、 処置前のテ キ ス ト のテ キ ス ト フ ロ ー出力 と 、 charmapping オプシ ョ ンに よ る


改善後の出力 と を示 し ます。

9.2.7 ハ イ フ ネーシ ョ ン
PDFlib は自動的にテ キ ス ト のハ イ フ ネーシ ョ ン を行 う 能力は持ち ませんが、テ キ ス ト 内で
ソ フ ト ハ イ フ ン キ ャ ラ ク タ ーに よ っ て明示的にハ イ フ ネーシ ョ ン機会が示 さ れてい る 場
合にはそ こ で単語を分割す る こ と がで き ます。 ソ フ ト ハ イ フ ン キ ャ ラ ク タ ーは Unicode で
は位置 U+00AD にあ り ます。 あ る いは文字実体を用い る こ と も で き ます : &shy;
グ リ フ U+00AD がその フ ォ ン ト 内で得 ら れ る 場合にはそれが、 そ う でない場合には
U+002D がハ イ フ ン キ ャ ラ ク タ ー と し て使われ ま す。 ソ フ ト ハ イ フ ン で示 さ れたハ イ フ
ネーシ ョ ン機会でな く て も 、 単語は強制的にハ イ フ ネーシ ョ ン さ れ る こ と があ り ます。 こ
れは単語間隔伸縮や長体な ど、他の調整手段が う ま く いかなかっ た極端な場合に起 こ り ま
す。

テキス ト 両端揃え でハ イ フ ン キ ャ ラ ク タ ーがあ る場合 と ない場合 以下の例では、 以下


のテ キ ス ト を両端揃えで印字 さ せます。テ キ ス ト には ソ フ ト ハ イ フ ン キ ャ ラ ク タ ーを適宜
入れて あ り ます ( こ こ ではダ ッ シ ュ で視覚化 し てい ます) :

Our paper planes are the ideal way of pas sing the time. We offer revolu tionary
brand new dev elop ments of the tradi tional common paper planes. If your lesson,
confe 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 sively
folded without using any adhe sive. Several models are equip ped with a folded
landing gear enab ling a safe landing on the intended loca tion provided that you

9.2 複数行のテキス ト フ ロー 249


Our paper planes are the ideal way of Our paper planes are the ideal way of
passing the time. We offer revolu- passing the time. We offer revolutionary
tionary brand new developments of the brand new developments of the
traditional common paper planes. If traditional common paper planes. If
your lesson, conference, or lecture turn your lesson, conference, or lecture turn
out to be deadly boring, you can have out to be deadly boring, you can have
a wonderful time with our planes. All a wonderful time with our planes. All
our models are folded from one paper our models are folded from one paper
sheet. They are exclusively folded sheet. They are exclusively folded
without using any adhesive. Several without using any adhesive. Several
models are equipped with a folded models are equipped with a folded
landing gear enabling a safe landing landing gear enabling a safe landing
on the intended location provided that on the intended location provided that
you have aimed well. Other models are you have aimed well. Other models are
able to fly loops or cover long dist- able to fly loops or cover long
ances. Let them start from a vista point distances. Let them start from a vista
in the mountains and see where they point in the mountains and see where
touch the ground. they touch the ground.

図 9.21 図 9.22
テキス ト 両端揃えで ソ フ ト ハイ フ ンあ り 。 テキス ト 両端揃えで ソ フ ト ハイ フ ン な し 。
デ フ ォ ル ト 設定 と 広いはめ込み枠を使用。 デ フ ォル ト 設定 と 広いはめ込み枠を使用。

have aimed well. Other models are able to fly loops or cover long dist ances. Let them
start from a vista point in the mount ains and see where they touch the ground.

図 9.21 に、テ キ ス ト 両端揃えのデフ ォ ル ト 設定で生成 さ れたテ キ ス ト 出力を示 し ます。完


璧な見ばえ と な っ てい ま す。 なぜな ら 条件が最適だか ら です : はめ込み枠枠が充分広 く
て、 し か も 、 明示的なハ イ フ ネーシ ョ ン機会を ソ フ ト ハ イ フ ン キ ャ ラ ク タ ーで指定 し て あ
る か ら です。 図 9.22 を見 る と 、 明示的 ソ フ ト ハ イ フ ンがない場合で も 出力はおおむね良
好です。 オプシ ョ ン リ ス ト はど ち ら の場合 も 以下の よ う にな り ます :
fontname=Helvetica fontsize=9 encoding=winansi alignment=justify

9.2.8 ウ ィ ド ー行 ・ オー フ ァ ン行
1 つの段落の先頭の 1 行 (ない し 複数行) だけが段ま たはページの下端に現れ る と き 、 こ
れをオーフ ァ ン と いい ます。 同様に、 1 つの段落の末尾の 1 行 (ない し 複数行) が次の段
ま たはページの先頭に現れ る と き 、 こ れを ウ ィ ド ー と いい ます。 高品質な文字組版におい
て、 孤立 し たオーフ ァ ン行ま たは ウ ィ ド ー行は望ま し く ない と 考え ら れてい ます。

オー フ ァ ン制御 テ キ ス ト フ ロ ーオプシ ョ ン minlinecount は、 はめ込み枠の末尾段落の


最少行数を指定 し ます。 行がそれ よ り も 少ない場合には、 それ ら は次のはめ込み枠の中に
配置 さ れます。値 minlinecount=2 を用い る と 、はめ込み枠の末尾の段落の 1 行のオーフ ァ
ン行を避け る こ と がで き ます。

ウ ィ ド ー制御 PDFlib は、将来のテ キ ス ト フ ロ ー配置について何 も 知 り ませんので、 ウ ィ


ド ー行を直接制御す る こ と はで き ません。 し か し 、 ク ラ イ ア ン ト コ ー ド 内に以下の仕組み
で ウ ィ ド ー制御を実装す る こ と は可能です :
> テ キ ス ト フ ロ ーの先頭部分 を、 先頭はめ込み枠内へブ ラ イ ン ド モー ド (オプ シ ョ ン
blind=true) で、 すなわち実際の出力を生成せずにはめ込みます。
> テ キ ス ト フ ロ ーの次の部分を、2 番目のはめ込み枠内へブ ラ イ ン ド モー ド ではめ込みま
す。 PDF_info_textflow( ) を キー ワー ド firstparalinecount と と も に呼び出す こ と に よ っ
て、 こ の 2 番目のはめ込み枠の先頭段落の行数を ク エ リ ー し ます。 も し こ の結果が 1
な ら ば、 1 行 ウ ィ ド ーを見つけた こ と にな り ます。
> そ う であれば、先頭はめ込み枠へ rewind オプシ ョ ン を用いて戻る こ と がで き ますので、
アルゴ リ ズ ム で、 ウ ィ ド ー行を避け る ためにはめ込みオプシ ョ ン群を調整す る 必要が

250 第 9 章 : テキス ト と 表の組版


あ り ます。 た と えば こ れは、 先頭はめ込み枠内の行数を maxlines オプシ ョ ン を用いて
減 ら す こ と に よ っ て実現で き ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の textflow/widows_and_orphans ト ピ ッ ク にあ り ま
す。

9.2.9 標準改行アルゴ リ ズムの制御


PDFlib は洗練 さ れた改行アルゴ リ ズ ム を実装 し てい ます。改行アルゴ リ ズ ム を制御す る テ
キ ス ト フ ロ ーオプシ ョ ン を表 9.2 に挙げます

改行規則 1つの単語、ない し 両端を スペース キ ャ ラ ク タ ーで挟まれた一連のテ キ ス ト が、


1 つの行に収ま り き ら ない場合、 次の行へ送 る 必要が出て き ます。 こ の よ う な状況で改行
アルゴ リ ズ ムは、 ど のキ ャ ラ ク タ ーの後で改行が可能か を決定 し ます。
た と えば、 -12+235/8*45 の よ う な数式は絶対に途中で改行 さ れませんが、 一方、 文字列
PDF-345+LIBRARY はマ イ ナ ス の所で次行に送 ら れ る 可能性があ り ます。 テ キ ス ト が ソ フ ト
ハ イ フ ン キ ャ ラ ク タ ーを含んでいればその う ちのいずれかの後で改行 さ れ る 可能性 も あ
り ます。
括弧 と 引用符については、 開 く 所 と 閉 じ る 所 と で規則が異な り ます : 括弧や引用符が
開 く 所では改行機会は一切与え ら れません。 引用符については、 どれが開いて どれが閉 じ
てい る のかを判定す る 手段 と し て、 引用符のペア を数え てい く 仕組みにな っ てい ます。

表 9.2 改行アルゴ リ ズムを制御する ためのオプ シ ョ ン


オプ シ ョ ン 説明
adjust- (キーワー ド ) minspacing ・ maxspacing オプ シ ョ ン で指定 さ れた制限内で単語間を詰めた り 拡げた
method り し て も テキス ト が 1 行に収ま り き ら ない時に行の調整に用いる方式。 デ フ ォル ト : auto。
auto 以下の方式が順に適用 さ れます : shrink ・ spread ・ nofit ・ split。
clip nofit (後述) と 同 じ 。 ただ し 、 はめ込み枠の右端 (rightindent オプ シ ョ ン を考慮)
か らはみ出 し た部分を切 り 落 と し 。
nofit 最後の単語を次行へ送る。 ただ し 、 残 さ れる (短い) 行が、 nofitlimit オプ シ ョ ン で
指定 さ れたパーセ ン ト 値よ り も短 く な ら ない場合に限る。 均等配置の段落で も若干がた
ついて見え る場合あ り 。
shrink 単語が行内に収ま ら ない と き、 収ま る ま で テキス ト を圧縮。 ただ し shrinklimit の制限
に従い、 それで収ま り き ら なければ nofit 方式を適用。
split 最後の単語を次行へ送ら ず、 強制的にハイ フ ネーシ ョ ンする。 テキス ト フ ォ ン ト の場合
はハイ フ ンキ ャ ラ ク タ ーを挿入 し 、 記号 フ ォ ン ト の場合は し ない。
spread 最後の単語を次行へ送 り 、 残 さ れた (短い) 行を均等配置する よ う 単語内の字間を拡げ
る。 ただ し spreadlimit の制限に従い、 それで均等配置で き なければ nofit 方式を適
用。
advanced- (論理値) 複雑用字系で必要な高度な改行アルゴ リ ズムを有効に し ます。 これは タ イ語な ど、 単語
linebreak 境界を示すのに空白キ ャ ラ ク タ ーを使わない用字系で改行を行 う ために必要です。 オプ シ ョ ン
locale ・ script に従います。 デ フ ォ ル ト : false

avoidbreak (論理値) true な ら、 avoidbreak が false に再設定 さ れる ま で一切改行 し ない。 デ フ ォル ト :


false。

9.2 複数行のテキス ト フ ロー 251


表 9.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 文字の小文字の言語 コ ー ド 。 例 : en (英語) ・ de ( ド イ ツ
語) ・ ja (日本語)。 こ れは language オプ シ ョ ン と は異な り ます。
> オプ シ ョ ナルな、 ISO 15924 に従 っ た 4 文字の用字系 コ ー ド 。 例 : Hira (ひ らがな) ・ Hebr (ヘブ
ラ イ) ・ Thai ( タ イ)。
> オプ シ ョ ナルな、 ISO 3166 に従っ た 2 文字の大文字の国 コ ー ド 。 例 : DE ( ド イ ツ) ・ CH (ス イ
ス) ・ GB (イ ギ リ ス)
キーワー ド _none は、 ロ ケール固有の処理が一切行われない こ と を指定 し ます。
ロ ケールを指定する こ と は、 タ イ語な どい く つかの用字系では高度な改行のために必須です。 デ
フ ォ ル ト : _none
例 : Thai ・ de_DE ・ en_US ・ en_GB

maxspacing (float またはパーセ ン ト 値) 単語間の最大間隔 ・ 最小間隔 (ユーザー座標で表すか、 スペースキ ャ


minspacing ラ ク タ ーの幅に対するパーセ ン ト 値で指定)。 単語間隔の算出時は こ の値を限度 と する (ただ し
wordspacing オプ シ ョ ンが加算 さ れる)。 デ フ ォ ル ト : minspacing=50%、 maxspacing=500%。

nofitlimit (float またはパーセ ン ト 値) nofit 方式における行の長 さ の下限 (ユーザー座標で表すか、 収める


はめ込み枠の幅に対するパーセ ン ト 値で指定)。 デ フ ォ ル ト : 75%。
shrinklimit (パーセ ン ト 値) shrink 方式における テキス ト 圧縮の下限。 縮小率の算出時は こ の値を限度 と す
る。 ただ し 、 horizscaling オプ シ ョ ンの値を掛け算 さ れる。 デ フ ォ ル ト : 85%。
spreadlimit (float またはパーセ ン ト 値) spread 方式における 2 文字間の間隔の上限 (ユーザー座標で表すか、
文字サイ ズに対するパーセ ン ト 値で指定)。 計算 さ れる文字間は charspacing オプ シ ョ ンの値に加
算 さ れる。 デ フ ォ ル ト : 0。

イ ン ラ イ ン オプシ ョ ン リ ス ト は通常は改行機会を生み出 し ません。 それは単語内での


オプシ ョ ン変更を可能にす る ためです。 ただ し 、 オプ シ ョ ン リ ス ト が ス ペー ス キ ャ ラ ク
タ ーで挟まれてい る 場合はオプシ ョ ン リ ス ト の開始位置に改行機会があ り ます。 も し その
オプシ ョ ン リ ス ト で改行が起 き て し か も alignment=justify の場合、オプシ ョ ン リ ス ト の前
にあ る スペース群は破棄 さ れます。 オプシ ョ ン リ ス ト の後の スペース群は保持 さ れ、 次行
先頭に表れます。

252 第 9 章 : テキス ト と 表の組版


改行を防止 charclass オプシ ョ ン を使 う と 、 テ キ ス ト フ ロ ーが特定のキ ャ ラ ク タ ーの後
で改行 さ れ る のを防止す る こ と がで き ます。 以下のオプシ ョ ンはキ ャ ラ ク タ ー / の直後で
の改行を防止 し ます :
charclass={letter /}

以下のオプシ ョ ンは、 「20 °C」 の よ う なテ キ ス ト の中の度キ ャ ラ ク タ ー 「°」 と 「C」 の


間の改行を防止 し ます。度キ ャ ラ ク タ ーが開 き 括弧の よ う に扱われ る ので行末で孤立 し ま
せん :
charclass={open °}

ひ と つなが り のテ キ ス ト が複数行に泣 き 別れて し ま う の を防ぐ には、それを avoidbreak ~


noavoidbreak で く く る と い う 方法があ り ます。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の textflow/avoid_linebreaking ト ピ ッ ク にあ り ま


す。

日中韓テキス ト の組版 テ キ ス ト フ ロ ーエ ン ジ ン は、 日中韓テ キ ス ト を扱え る よ う に作


ら れてい る ので、 Unicode 標準の通 り 、 日中韓キ ャ ラ ク タ ーを表意文字 と し て適切に取 り
扱い ます。 その結果、 日中韓テ キ ス ト はけ っ し てハ イ フ ネーシ ョ ン さ れません。 組版の品
質を高め る ため、 日中韓テ キ ス ト でテ キ ス ト フ ロ ーを使 う と き は、 以下の組版オプシ ョ ン
を推奨 し ます。 こ う す る と 、 欧文テ キ ス ト が混在 し ていて も そ こ でハ イ フ ネーシ ョ ンが行
われな く な り 、 ま た、 均等に間隔を あ けたテ キ ス ト 出力が作成 さ れます :
hyphenchar=none
alignment=justify
shrinklimit=100%
spreadlimit=100%

縦書 き はテ キ ス ト フ ロ ーでは対応 し てい ません。

狭いはめ込み枠で テキス ト 両端揃え はめ込み枠が狭ければ狭いほ ど、 両端揃えのテ キ


ス ト を制御す る ためのオプシ ョ ンが重要にな っ てい き ます。 図 9.23 は、 狭いはめ込み枠
でテ キ ス ト が さ ま ざ ま な方式で両端揃え さ れた出力結果を例示 し てい ます。 図 9.23 のオ
プシ ョ ン設定は基本的におおむね良好ですが、 ただ、 maxspacing がやや広すぎ る 単語間
隔を与え てい る のが気にな り ます。 と はいえ、 狭いはめ込み枠に対 し ては こ れは こ の ま ま
に し てお く こ と を推奨 し ます。 でない と 、 split 方式に よ る 見苦 し い強制ハ イ フ ネーシ ョ ン
の発生頻度が高ま る で し ょ う 。
はめ込み枠が狭すぎ る ために不適切な箇所が強制ハ イ フ ネーシ ョ ン さ れて し ま う 場合
は、 対処を考慮 し て、 ソ フ ト ハ イ フ ン を入れ る な り 、 テ キ ス ト 両端揃え を制御す る オプ
シ ョ ン を変え る な り する 必要があ る で し ょ う 。

テキス ト 両端揃え で shrinklimit オ プ シ ョ ン 見 た 目に も っ と も 受け入れやすい解決策


は shrinklimit オプシ ョ ン を小 さ く す る こ と で し ょ う 。 こ のオプシ ョ ンは、 shrink 方式でか
か る 長体の割合の下限を指定す る も のです。 図 9.24a は、 テ キ ス ト に shrinklimit=50% ま
で長体を かけ る こ と で強制ハ イ フ ネーシ ョ ン を防いでい る 様子を示 し てい ます。

テキス ト 両端揃え で spreadlimit オ プ シ ョ ン 字間 を 拡げ る こ と で改行 を 制御す る の も


一つの方法です。 こ れは spread 方式で行われ、 spreadlimit オプシ ョ ンで制御 さ れます。 し

9.2 複数行のテキス ト フ ロー 253


Our paper planes 図 9.23 狭いはめ込み枠で テキス ト 両端揃え。 デ フ ォ ル ト 設定を用いています
are the ideal way of
passing the time. We 単語間ツ メ (minspacing オプ シ ョ ン)
offer revolutionary
brand new develop-
ments of the traditional 行に長体 (shrink 方式 ・ shrinklimit オプ シ ョ ン)
common paper planes.
If your lesson, conf- 強制ハイ フ ネーシ ョ ン (split 方式)
erence, or lecture
turn out to be deadly
boring, you can have
a wonderful time 単語間アケ (spread 方式 ・ maxspacing オプ シ ョ ン)
with our planes. All

か し こ の方式は美 し く ないのでめ っ たに使われないで し ょ う 。 図 9.24b は、 spreadlimit=5


を使っ て、 字間の最大を非常に広 く 5 単位 と し た例です。

図 9.24 狭いはめ込み枠内の両端揃え テキス ト のためのオプ シ ョ ン


生成 さ れる出力 PDF_fit_textline( ) に与え るオプ シ ョ ン リ ス ト

passing the time. We


offer revolutionary
brand new developments
a) of the traditional alignment=justify shrinklimit=50%
common paper planes.
If your lesson, conference,
or lecture turn out to

Our paper planes


are the ideal way of
passing the time. We alignment=justify spreadlimit=5
b) offer revolutionary
b r a n d n e w
developments of the

ments of the traditional


common paper planes.
If your lesson,
c) conference, or lecture alignment=justify nofitlimit=50
turn out to be deadly
boring, you can have

テキス ト 両端揃え で nofitlimit オ プ シ ョ ン nofitlimit オプシ ョ ンは、 nofit 方式が適用 さ


れた と き の行の最小の幅を制御す る も のです。 はめ込み枠が非常に狭い場合は、 こ れをデ
フ ォ ル ト 値 75% か ら 下げたほ う が強制ハ イ フ ネーシ ョ ン よ り は ま し です。 図 9.24c は、 行
の最小幅 50% を指定 し た場合の出力結果を示 し てい ます。

9.2.10 高度な用字系固有の改行
PDFlib は、 標準の改行アルゴ リ ズ ム に加え て、 追加の改行アルゴ リ ズ ム を実装 し てい ま
す。 こ の高度な改行アルゴ リ ズ ムは、 い く つかの用字系では必須であ り 、 ま た、 必須でな
いその他の用字系 / ロ ケールの組み合わせのなかに も 、 こ れに よ り 改行動作が改善 さ れ る
も のがあ り ます。 こ れは advancedlinebreak オプシ ョ ンで有効にする こ と がで き ます。 改
行はテ キ ス ト の言語に依存 し ますので、 高度な改行アルゴ リ ズ ムは script オプシ ョ ン (表
7.3 参照) と locale オプシ ョ ン (PDFlib API リ フ ァ レ ン ス参照) に従い ます。 高度な改行
は、 以下の状況において正 し い改行機会を決定 し ます :

254 第 9 章 : テキス ト と 表の組版


> タ イ 語な ど、 テ キ ス ト 内の空白キ ャ ラ ク タ ーの存在に改行が依拠 し ない用字系に対 し
て。 以下のテ キ ス ト フ ロ ーオプシ ョ ンは、 タ イ 語に対 し て高度な改行を有効に し ます :
<advancedlinebreak script=thai locale=tha>

> 仏文テ キ ス ト 内で引用符 と し て用い ら れ る «» ギユ メ キ ャ ラ ク タ ーな ど、 あ る 特定の句


読点キ ャ ラ ク タ ーの特別な扱いを必要 と す る 用字系 / ロ ケールの組み合わせにおいて。
下記のテ キ ス ト フ ロ ーオプシ ョ ンは、 仏文テ キ ス ト に対 し て高度な改行を有効に し ま
す。 その結果、 単語を囲 う ギユ メ キ ャ ラ ク タ ーが行末で単語 と 泣 き 別れ し な く な り ま
す:
<advancedlinebreak script=latn locale=fr>

locale テ キ ス ト フ ロ ーオプシ ョ ンは language テ キ ス ト オプシ ョ ン (表 7.4 参照) と 違 う こ


と に留意 し て く だ さ い : locale オプシ ョ ンは同 じ 3 文字の言語識別子で始ま る こ と がで き
ますが、1 個ない し 2 個の追加部分を任意に含む こ と も で き ます。ただ し 、こ れ ら が PDFlib
で必要にな る こ と は まれです。

9.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 オプシ ョ ン を使っ て配置 し ま し ょ う (図 9.25 参照) :
result = p.fit_textflow(textflow, left_x, left_y, right_x, right_y,
"wrap={usematchboxes={{img}}}");

図 9.25 図 9.26
範囲枠を持つ画像にテキス ト を回 り 込ませる 三角形の輪郭にテキス ト を回 り 込ませる

Have a look at our new paper plane models! Our Our paper planes are50% 80%
the ideal way of passing the time.
paper planes are the ideal way of passing the time. We offer a lot of revolutionary brand-new developments
We offer revolutionary new of the traditional common paper planes. If your
developme- nts of the traditi- lesson, conference, or lecture turn out to be
deadly boring, you can have a wonderful
onal com- mon paper planes. time with our planes. All our models are
If your les- son, conference, folded from one paper sheet. They
or lecture turn out to be are exclusively folded without
deadly bor- ing, you can using
20% 30% any 80% 30%
adhesive.
have a wonderful time with our planes. All our Several models are equipped with a folded landing gear.
enabling a safe landing on the intended location provided
models are folded from one paper sheet. They are that you have aimed well. Other models are able to fly
exclusively folded without using any adhesive. loops or cover long distances.

9.2 複数行のテキス ト フ ロー 255


テ キ ス ト を配置す る 前に、同 じ 範囲枠名を使っ て さ ら にほかの画像をはめ込んでい く こ と
も で き ます。 その場合、 テ キ ス ト はすべての画像を回 り 込みます。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の textflow/wrap_text_around_images ト ピ ッ ク にあ


り ます。

任意のパスに テキス ト を回 り 込ませる パ ス オブジ ェ ク ト を作成 し て (71 ページ 「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", "");

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);

256 第 9 章 : テキス ト と 表の組版


画像を配置 し て テキス ト を それに回 り 込ませる 前の項では画像の ク リ ッ ピ ン グパ ス だ
け を使い ま し た (画像自体ではな く ) が、 今度は画像をはめ込み枠の中に配置 し て、 テ キ
ス ト を そ れ に 回 り 込 ま せ て み ま し ょ う 。 こ れ を 実 現 す る に は、 今 度 も 画 像 を
clippingpathname オプシ ョ ン をつけて読み込んで、 それを PDF_fit_image( ) でページ上に
配置す る 必要があ り ます。テ キ ス ト を回 り 込ませ る のに適切なパ ス オブジ ェ ク ト を作成す
る ために、 PDF_fit_image( ) と 同 じ オプシ ョ ン リ ス ト をつけて PDF_info_image( ) を呼び出
し ま し ょ う 。 こ う すれば、 ク リ ッ ピ ン グパ ス が抽出 さ れ る 際 と 、 画像が実際に配置 さ れ る
際に、 必ず同一の変換 (拡縮な ど) が適用 さ れ ま す。 最後に、 参照点 (PDF_fit_image( )
の x/y 引数) を wrap オプシ ョ ンの paths サブオプシ ョ ンの refpoint サブオプシ ョ ンに与
え る 必要があ り ます :
image = p.load_image("auto", "image.tif", "clippingpathname={path 1}");

/* 画像を何らかのはめ込みオプション群でページ上に配置 */
String imageoptlist = "scale=2";
p.fit_image(image, x, y, imageoptlist);

/* 同じオプションリストを用いて、画像からパスオブジェクトを作成 */
path = (int) p.info_image(image, "clippingpath", imageoptlist);
if (path == -1)
throw new Exception("エラー : クリッピングパスが見つかりません!");

result = p.fit_textflow(tf, llx1, lly1, urx1, ury1,


"wrap={paths={{path=" + path + " refpoint={" + x + " " + y + "} }}}");

p.delete_path(path);

PDF_fit_textflow( ) を複数回呼び出 し て同一の wrap オプシ ョ ン を与え る こ と も で き ます。


こ れは多段組な ど、配置 さ れた画像が複数のテ キ ス ト フ ロ ーはめ込み枠に重な っ てい る と
き に有用です。

非長方形形状に テキス ト を回 り 込ませる パ ス オブジ ェ ク ト を回 り こ み輪郭 と し て作成


す る のではな く 、 パ ス要素群を直接 Textflow オプシ ョ ン群で指定す る こ と も で き ます。
テ キ ス ト は、範囲枠で指定 さ れ る 長方形を回 り 込ませ る だけでな く 、任意のグ ラ フ ィ ッ
ク 要素を回 り 込み輪郭 と し て定義す る こ と も で き ます。た と えば以下のオプシ ョ ン リ ス ト
は、 三角形の ま わ り にテ キ ス ト を回 り 込ませます (図 9.26 参照) :
wrap={ polygons={ {50% 80% 20% 30% 80% 30% 50% 80%} } }

なお、 showborder=true オプシ ョ ン を使っ て輪郭を図示 し て あ り ます。 wrap オプシ ョ ンは


複数の輪郭を持つ こ と も で き ます。 以下のオプシ ョ ン リ ス ト は、 2 つの三角形の ま わ り に
テ キ ス ト を回 り 込ませます :
wrap={ polygons={ {50% 80% 20% 30% 80% 30% 50% 80%}
{20% 90% 10% 70% 30% 70% 20% 90%} } }

パーセ ン ト 値 (はめ込み枠内におけ る 相対座標) のかわ り に、 ページ上の絶対座標を使 う


こ と も で き ます。

注 横で も 縦で も ない向きの線分を持つ輪郭を使 う と きは、 fixedleading=true に設定する こ と


を推奨 し ます。

9.2 複数行のテキス ト フ ロー 257


図 9.28
50% 100%
重な り 合 う 輪郭へ流 し 込む
図 9.27
ひ し 形へテキス ト Our
paper
を流 し 込む planes are
the ideal way Our paper planes are
of passing the the ideal way of pas-
time. We offer a lot sing the time. We offer
of revolutionary brand- revolutionary new develop-
new developments of the ments of the tradi-
10% 50% traditional common paper 90% 50% tional co- mmon pa-
planes. If your lesson, con- per planes. If your les-
ference, or lecture turn son, conf- erence, or
out to be deadly bor- lecture turn out to be
ing, you can have deadly boring,
a wonderful you can have a wonderful
time with time with our planes. All
our pla- our models are folded
nes. from one paper sheet.

50% 0%

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の textflow/wrap_text_around_polygons ト ピ ッ ク に


あ り ます。

非長方形の輪郭へ流 し 込む 回 り 込み機能を使えば、 任意の輪郭の領域の中にテ キ ス ト


フ ロ ーを配置す る こ と も で き ます。 こ れを実現する には、 wrap オプシ ョ ンで addfitbox ま
たは inversefill サブオプシ ョ ン を使い ます。 テ キ ス ト は指定 さ れた輪郭の ま わ り に回 り 込
むのではな く 、 1 個ない し 複数の輪郭の中にテ キ ス ト が配置 さ れます。 以下のオプシ ョ ン
リ ス ト を使えば、 ひ し 形の中へテ キ ス ト を流 し 込む¥ こ と がで き ます。 こ こ で座標は、 は
め込み枠の長方形に対す る パーセ ン ト 値 と し て与え てい ます (図 9.27 参照) :
wrap={ addfitbox polygons={ {50% 100% 10% 50% 50% 0% 90% 50% 50% 100%} } }

な お、 こ こ で も showborder=true オ プ シ ョ ン を 使 っ て 輪郭 を 図示 し て あ り ま す。 も し
addfitbox オプシ ョ ン をつけなければ、 ひ し 形は空の ま ま、 その ま わ り にテ キ ス ト が回 り
込む こ と にな り ます。

重な り 合 う 輪郭へ流 し 込む 次の例 と し て、 重な り 合 う 2 つの多角形か ら 成る 輪郭へ流


し 込みを行な っ てみま し ょ う 。 た と えば六角形の中に四角形が入っ た輪郭です。 addfitbox
オプシ ョ ン を使えば、 はめ込み枠自体は流 し 込みの範囲か ら 除外 さ れ、 その後の リ ス ト の
中の多角形は、 重な り 合っ てい る 領域を除いて流 し 込みが行われます (図 9.28 参照) :
wrap={ addfitbox polygons=
{ {20% 10% 80% 10% 100% 50% 80% 90% 20% 90% 0% 50% 20% 10%}
{35% 35% 65% 35% 65% 65% 35% 65% 35% 35%} } }

も し addfitbox オプシ ョ ン をつけなければ、 こ れ と 反対の効果を得ます : さ っ き 流 し 込ま


れた領域は空の ま ま と な り 、 さ っ き 空だっ た領域へテ キ ス ト が流 し 込まれ る こ と にな り ま
す。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の textflow/fill_polygons_with_text ト ピ ッ ク にあ
り ます。

258 第 9 章 : テキス ト と 表の組版


9.3 表の組版
表組版機能を使 う と 、 複雑な表を自動組版す る こ と がで き ます。 表のセルには、 一行か複
数行のテ キ ス ト か、 画像か、 SVG グ ラ フ ィ ッ ク か、 PDF ページ を入れ る こ と がで き ます。
表は 1 個のはめ込み枠に収ま ら な く て も よ く 、 複数のページにわた る こ と が可能です。

ク ッ ク ブ ッ ク 表の諸側面に関する コ ー ド サン プルがPDFlib ク ッ ク ブ ッ クのtable カ テ ゴ リ ーにあ り ます。

表の一般的特徴 表組版機能の説明は、以下の概念 と 用語に も と づき ます(図 9.29 参照):


> 表は、 長方形の輪郭を持つ仮想のオブジ ェ ク ト です。 横方向の表行 と 縦方向の列でで
き てい ます。
> 単純セルは、 表内の長方形の領域であ り 、 表行 と 列の交差 と し て定義 さ れ ます。 連結
セルは、 複数の列か複数の表行、 ない し 両方にわた っ てい ます。 セル と い う 用語を用
い る と き は、 単純セル と 連結セルの両方を指す も の と し ます。
> 表は、1 つのはめ込み枠に収ま り き る こ と も あ り ます し 、複数のはめ込み枠が必要にな
る こ と も あ り ます。1 つのはめ込み枠に配置 さ れた表行群は、表イ ン ス タ ン ス を構成 し
ます。 PDF_fit_table( ) は、 1 回呼び出 さ れ る ご と に、 1 つのはめ込み枠に 1 つの表 イ ン
ス タ ン ス を配置 し ます (269 ページ 「9.3.5 表 イ ン ス タ ン ス」 参照)。
> ヘ ッ ダー と フ ッ タ ーは、 表の最初か最後にあ る 1 個ない し 複数の表行のかた ま り であ
り 、すべての表 イ ン ス タ ン ス の上端か下端に繰 り 返 し 現れます。ヘ ッ ダーに も フ ッ タ ー
に も 属 さ ない表行は本体表行 と 呼びます。
> オプシ ョ ナルな キ ャ プシ ョ ン (図 9.29 では示 さ れてい ません) は、 表の説明を配置す
る ために使え る 追加の要素です。 こ れは表の任意の辺に配置す る こ と がで き ます。

ヘッ Our Paper Plane Models 3 列連結セル


1 Giant Wing

単純セル Material Offset print paper 220g/sqm セルに画像 と


Amazingly robust! テキス ト 行
Benefit It is amazingly robust and
can even do aerobatics. But
it is best suited to gliding.

2 Long Distance Glider


3 行連結セル
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 Cone Head Rocket

Material Kent paper 200g/sqm


With big swing!
Benefit This paper arrow can be
thrown with big swing. It
stays in the air a long time.
図 9.29
フッ 表の例

例 と し て、 図 9.29 の表を作成す る すべての側面を説明 し てい き ます。 表組版オプシ ョ ン


の完全な説明については PDFlib API リ フ ァ レ ン ス を参照 し て く だ さ い。 表の作成は まず、
各表セルの内容 と 視覚的プ ロ パテ ィ を PDF_add_table_cell( ) で定義 し てい く こ と か ら 始ま
り ます。 それか ら 、 PDF_fit_table( ) を 1 回ない し 複数回呼び出 し て、 その表を配置 し ます。

9.3 表の組版 259


表を配置す る 際には、 そのはめ込み枠の大 き さ と 、 その表行や列の罫線 と 塗 り 分け を
指定す る こ と も で き ます。 セルご と の塗 り 分けな ど の細かい指定には、 範囲枠機能を使っ
て く だ さ い (詳 し く は 275 ページ 「9.4 範囲枠」 参照)。
こ の節では、 表セルの定義 と 表のはめ込みに必要な、 も っ と も 重要なオプシ ョ ン のみ
を解説 し ます。いずれの例において も 、そのための PDF_add_table_cell( ) と PDF_fit_table( )
への呼び出 し だけ を示 し ま すが、 必要な フ ォ ン ト はすでに読み込 ま れてい る も の と し ま
す。

注 表の処理は、 カ レ ン ト 図形ス テー タ スか らは独立です。 表セルの定義は文書ス コ ープ で も


で き ますが、実際に表を配置するのはページかパターン / テンプレート / グリフス コ ープ
で行 う 必要があ り ます。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の table/starter_table ト ピ ッ ク にあ り ます。

表に関す る組版上の問題を分析 セルの数 と 、 表組版オプシ ョ ンに よ っ ては、 PDFlib の


表組版機能の結果が、 自分の期待 と は一致 し ない こ と があ り ます。 ほ と ん ど の場合におい
て、 こ れは適切なオプ シ ョ ン に よ っ て矯正で き ま す。 し か し 、 問題の起 き てい る セル群
や、 セルの グループ を、 誤っ たオプ シ ョ ン を用いて特定す る のは、 難 し い場合 も あ り ま
す。表に関する 組版上の問題のデバ ッ グ を実施可能にする ため、PDFlib は、PDF_fit_table( )
に以下のオプシ ョ ン を提供 し てい ます :
> オプシ ョ ン showcells は、 各セル内枠の境界を視覚化 し ます。 こ の メ ソ ッ ド がページ ス
コ ープで呼ばれ、 かつ PDF/A モー ド が有効でない場合には、 各表セルの中央に、 その
セル内容に関す る 詳細を持っ た注釈が配置 さ れます。
> オプシ ョ ン debugshow が true の場合には、高すぎ る 、あ る いは幅が広すぎ る 、あ る いは
セルが小 さ く な り すぎ る 表に関す る エ ラ ーがすべて抑制 さ れ、 ロ グ記録 さ れ ます。 結
果 と し て作成 さ れ る 表 イ ン ス タ ン ス は、 その表は破損 し てい ますが、 デバ ッ グの助け
と し て生成 さ れます。
> オプシ ョ ン showgrid が true の場合には、 すべての列 と 表行の縦 ・ 横境界が描線 さ れま
す。 すなわち、 基礎を なす表グ リ ッ ド が視覚化 さ れます。

9.3.1 単純な表を配置
表の概念を さ ら に詳 し く 説明す る 前に、 単純な表作成の例を示 し ます。 表には 6 つのセル
があ り 、 3 表行 ・ 2 列に配 さ れてい ます。 4 つのセルにはテ キ ス ト 行があ り 、 1 つのセルに
は複数行のテ キ ス ト フ ロ ーがあ り ます。 セルの内容はすべて、 余白を 1 単位 と っ て横方向
に左寄せ、 縦方向に中央揃えにな っ てい ます。
こ の表を作成す る ために、 まずはテ キ ス ト 行セルに対す る オプシ ョ ン リ ス ト を作 る た
めに、 その fittextline サブオプシ ョ ン リ ス ト で、 必要なオプシ ョ ン font ・ fontsize と 位置
{left center} を定義 し ま し ょ う 。 さ ら に、 1 単位のセル余白を定義 し ま し ょ う 。 そ し て、 テ
キ ス ト 行セルを 1 つずつそれぞれの列 ・ 表行に追加 し 、 その際に中身のテ キ ス ト も 、 PDF_
add_table_cell( ) への呼び出 し に直接与え ます。
次に、 テ キ ス ト フ ロ ーを作成 し 、 そのテ キ ス ト フ ロ ーのハン ド ルを使っ て テ キ ス ト フ
ロ ー表セルに対す る オプシ ョ ン リ ス ト を構築 し た後、 そのセルを表に追加 し ま し ょ う 。
最後に、 PDF_fit_table( ) を使っ て表を配置 し 、 その際に、 表の外枠 と セルの各辺を黒
い罫線で視覚化 し ま し ょ う 。 列の幅は一切与え ませんで し たので、 与え たテ キ ス ト 行 と 余
白か ら 自動的に計算 さ れます。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の table/vertical_text_alignment ト ピ ッ ク にあ り


ます。

260 第 9 章 : テキス ト と 表の組版


以下の コ ー ド 断片は、 こ の単純な表を作成す る 方法を示 し ます。 結果を図 9.30a に示 し ま
す。
/* 複数行のテキストフローで表セルに入れるテキスト */
String tf_text = "It is amazingly robust and can even do aerobatics. " +
"But it is best suited to gliding.";

/* 1列目と2列目の列幅を定義 */
int c1 = 80, c2 = 120;

/* 表インスタンスの左下隅と右上隅を定義(はめ込み枠)*/
double llx=100, lly=500, urx=300, ury=600;

/* エラー時には抜け出す */
p.set_option("errorpolicy=exception");

/* フォントを読み込む */
font = p.load_font("Helvetica", "unicode", "");

/* 1列目に配置するテキスト行セルに用いるオプションリストを定義 */
optlist = "fittextline={position={left center} font=" + font + " fontsize=8} margin==4" +
colwidth=" + c1;

/* 列1表行1にテキスト行セルを追加 */
tbl = p.add_table_cell(tbl, 1, 1, "Our Paper Planes", optlist);

/* 列1表行2にテキスト行セルを追加 */
tbl = p.add_table_cell(tbl, 1, 2, "Material", optlist);

/* 列1表行3にテキスト行セルを追加 */
tbl = p.add_table_cell(tbl, 1, 3, "Benefit", optlist);

/* 2列目に配置するテキスト行に用いるオプションリストを定義 */
optlist = "fittextline={position={left center} font=" + font + " fontsize=8} " +
"colwidth=" + c2 + " margin=4";

/* 列2表行2にテキスト行セルを追加 */
tbl = p.add_table_cell(tbl, 2, 2, "Offset print paper 220g/sqm", optlist);

/* テキストフローを追加 */
optlist = "font=" + font + " fontsize=8 leading=110%";
tf = p.add_textflow(-1, tf_text, optlist);

/* 上で取得したハンドルを使ってテキストフローセルに用いるオプションリストを定義 */
optlist = "textflow=" + tf + " margin=4 colwidth=" + c2;

/* 列2表行3にテキストフロー表セルを追加 */
tbl = p.add_table_cell(tbl, 2, 3, "", optlist);

p.begin_page_ext(0, 0, "width=200 height=100");

/* 表をはめ込むためのオプションリストを表枠とセル罫線つきで定義 */
optlist = "stroke={{line=frame linewidth=0.8} {line=other linewidth=0.3}}";

/* 表インスタンスを配置 */
result = p.fit_table(tbl, llx, lly, urx, ury, optlist);

9.3 表の組版 261


/* 結果をチェック。 「_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, "");

セルの内容の縦位置を調整 表セ ルの縦方向中央に さ ま ざ ま な 種類の内容 を 配置す る


と 、 それ ら ら は、 その辺か ら の ま ち ま ちの距離に位置付け ら れます。 図 9.30a において、
4 つのテ キ ス ト 行セルは以下のオプシ ョ ン リ ス ト で配置 さ れてい ます :
optlist = "fittextline={position={left center} font=" + font +
" fontsize=8} colwidth=80 margin=4";

テ キ ス ト フ ロ ーセルは特殊なオプシ ョ ン を一切使わずに追加 さ れてい ます。テ キ ス ト 行を


縦方向中央に配置 し たために、 Benefit の行がテ キ ス ト フ ロ ーの分だけ下へずれます。

図 9.30 テキス ト 行 と テキス ト フ ローを表セル内で整列 さ せる


生成 さ れる出力

Our Paper Planes

Material Offset print paper 220g/sqm


a)
It is amazingly robust and can
Benefit even do aerobatics. But it is
best suited to gliding.

Our Paper Planes


Material Offset print paper 220g/sqm
b) Benefit It is amazingly robust and can
even do aerobatics. But it is
best suited to gliding.

図 9.30b に示 し た よ う に、 セルの辺か ら セルの中身 ま での縦間隔は、 それがテ キ ス ト フ


ロ ーであ る かテ キ ス ト 行であ る かにかかわ ら ず、 すべて同 じ に し たい も のです。 こ れを実
現す る ために、 まずテ キ ス ト 行のためのオプシ ョ ン リ ス ト を用意 し ま し ょ う 。 表行の高 さ
を固定値 14 ポ イ ン ト 、テ キ ス ト 行の位置を左上で余白 4 ポ イ ン ト と し て定義 し ま し ょ う 。
さ き に与えたオプシ ョ ン fontsize=8 は、 文字の高 さ を正確には表 し てお ら ず、 上下に
い く ら かあ き がで き てい ます。 で も 、 大文字の高 さ はフ ォ ン ト の capheight 値で正確に表
さ れます。 ですので、 fontsize={capheight=6} を用いれば、 文字サ イ ズが結果的にほぼ 8 ポ
イ ン ト にな り 、 ま た (margin=4 と あわせて) 高 さ の合計が 14 ポ イ ン ト と な っ て rowheight
オプ シ ョ ン と 対応 し ま す。 ですので全体 と し ては、 テ キ ス ト 行セルに対す る PDF_add_
table_cell( ) のオプシ ョ ン リ ス ト は次の よ う に し ま し ょ う :

262 第 9 章 : テキス ト と 表の組版


/* テキスト行セルに用いるオプションリスト */
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";

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の table/vertical_text_alignment ト ピ ッ ク にあ り


ます。

9.3.2 表セルの さ ま ざ ま な内容


PDF_add_table_cell( ) で表にセルを追加す る と き は、 さ ま ざ ま な種類のセル内容を指定す
る こ と がで き ます。 表セルは、 同時に複数の種類の内容を含む こ と も で き ます。 罫線 ・ 塗
り の追加 も 可能なほか、 範囲枠を使っ て表セル内に追加の内容を配置す る こ と も で き ま
す。
た と えば紙飛行機の表には、 図 9.31 に示す要素があ り ます。

࠹ࠠࠬ࠻ⴕ
࠹ࠠࠬ࠻ⴕ

࠹ࠠࠬ࠻ⴕ ࠹ࠠࠬ࠻ⴕ
࠹ࠠࠬ࠻ⴕ
࠹ࠠࠬ࠻ⴕ ࠹ࠠࠬ࠻ࡈࡠ࡯ ....................
.............................................. 図 9.31
.............................................. 表セルの さ ま ざ ま
な内容

テキス ト 行に よ る一行テキス ト テ キ ス ト は、 PDF_add_table_cell( ) の text 引数で与え ま


す。 fittextline オプシ ョ ン リ ス ト で、 PDF_fit_textline( ) のすべての組版オプシ ョ ン を与え
る こ と がで き ます。 デフ ォ ル ト のはめ込み方式は fitmethod=nofit です。 テ キ ス ト がセル
に収ま り き ら ない と き は、 セルが大 き く な り ます。 こ れを避け る には、 fitmethod=auto を
使えば、 shrinklimit オプシ ョ ンの範囲内でテ キ ス ト が縮ま り ます。 表行の高 さ が指定 さ れ
なかっ た場合は、 組版機能はテ キ ス ト サ イ ズの 2 倍を表セルの高 さ と し ます ( よ り 正確に
い う と : boxheight の 2 倍。 こ れは、 別途指定 さ れない限 り デフ ォ ル ト 値 {capheight none}
を持ち ます)。 テ キ ス ト が回転 さ せて あ る と き の表行の幅について も 同 じ です。

9.3 表の組版 263


テ キ ス ト に色をつけ る には fittextline オプシ ョ ン リ ス ト で fillcolor オプシ ョ ン を使用 し
て く だ さ い。

テキス ト フ ロ ーに よ る複数行テキス ト テ キ ス ト フ ロ ーは、 表関数の外で用意 し ておい


て、 PDF_add_table_cell( ) を呼び出す前に PDF_create_textflow( ) か PDF_add_textflow( ) で
作成 し てお く 必要があ り ます。 そのテ キ ス ト フ ロ ーのハン ド ルは、 textflow オプシ ョ ンで
与え ます。 fittextflow オプシ ョ ンで、 PDF_fit_textflow( ) の組版オプシ ョ ンのすべて を与え
る こ と がで き ます。
デフ ォ ル ト のはめ込み方式は fitmethod=clip です。 すなわち、 まず、 テ キ ス ト がセル
に収ま り き る か ど う かが試 さ れます。 セルの大 き さ が充分でない と き は、 その高 さ が増や
さ れます。 それで も テ キ ス ト が収ま り き ら ない場合は、 末尾が切 り 落 と さ れます。 こ れを
避け る には、 fitmethod=auto を使えば、 minfontsize オプシ ョ ンの範囲内でテ キ ス ト が縮
ま り ます。
セルが狭すぎ る 場合には、1 つの単語を好ま し く ない箇所で分割 さ せる よ う 、 テ キ ス ト
フ ロ ーに強制す る こ と も で き ます。 avoidwordsplitting オプシ ョ ンが 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 オプシ ョ

264 第 9 章 : テキス ト と 表の組版


ンで作成す る こ と がで き ます。 fitannotation オプシ ョ ンでは、 PDF_create_annotation( ) の
すべてのオプシ ョ ン を指定可能です。 セル枠が注釈長方形 と し て用い ら れます。

フ ォ ーム フ ィ ール ド 表セル内の フ ォ ーム フ ィ ール ド は、 PDF_create_field( ) の name ・


type 引数 (ただ し こ の メ ソ ッ ド を呼び出す必要はあ り ません) に対応す る PDF_add_table_
cell( ) の fieldname ・ fieldtype オプシ ョ ン で作成す る こ と がで き ます。 fitfield オプシ ョ ンで
は、 PDF_create_field( ) のすべてのオプシ ョ ン を指定可能です。 セル枠が フ ィ ール ド 長方形
と し て用い ら れます。

セル内枠内で セル内容を位置付け デ フ ォ ル ト では、 セル内容はセル枠に合わせて位置


付け ら れます。 PDF_add_table_cell( ) で margin オプシ ョ ン を使えば、 セルの端 と の間に間
隔を指定す る こ と がで き ます。 その結果で き る 長方形を、 セル内枠 と 呼びます。 余白が 1
つで も 定義 さ れていれば、 セル内容はセル内枠に合わせて配置 さ れます (図 9.32 参照)。
余白が 1 つ も 定義 さ れていない と き は、 セル内枠はセル枠 と 同 じ です。
こ れ と あわせて、 セルの内容は、 内容依存のはめ込みオプシ ョ ン で与え たオプシ ョ ン
に も 従 う こ と があ り ます。 266 ページ 「9.3.4 さ ま ざ ま な種類の内容を持っ た表」 で説明 し
ます。
਄૛⊕

࠮࡞ౝᨒ
Ꮐ૛⊕ ฝ૛⊕
図 9.32
内容を セル内枠に
࠮࡞ᨒ はめ込み
ਅ૛⊕

9.3.3 表 と 列の幅
セルを表に追加す る 際には、 そのセルが ま たが る 列か表行、 ま たは両方の数を、 colspan ・
rowspan オプシ ョ ン で定義 し ます。 デフ ォ ル ト ではセルの列は 1 つ、 表行 も 1 つです。 表
の列 と 表行の総数は、 セルを追加す る ご と に、 それぞれの値だけ自動的に加算 さ れ ます。
図 9.33 に、 3 列 ・ 4 表行の表の例を示 し ます。

ⴕ1
1 1
㧟ߟߩ ............ ೉ߦ ............ ࠊߚࠆ ............ ࠮࡞ 図 9.33
1 2 3 2
単純セル と 、 複数の表行や
ⴕ2 㧞ߟߩ ...... ೉ߦ ...... ࠊߚࠆ ...... ࠮࡞ 㧟ߟߩ .... 列を連結 し たセル
1 3 2 3
ⴕ3 න⚐࠮࡞ න⚐࠮࡞ .... ⴕߦ ....
1 4 2 4
ⴕ4 න⚐࠮࡞ න⚐࠮࡞ .... ࠊߚࠆ࠮࡞

೉1 ೉2 ೉3

さ ら に、 colwidth オプシ ョ ン を使っ て、 セルが ま たが る 最初の列の幅を明示的に与え る こ


と も で き ます。 なお、 与え た colwidth が効力を及ぼすのは最初の列に対 し てだけであ り 、
colspan グループ内のすべての列に対 し てではない こ と に留意 し て く だ さ い。 各セルご と

9.3 表の組版 265


に、 その最初の列の幅を決めて与え る と 、 それ ら の幅の値はすべて、 表全体の幅に自動的
に加算 さ れてい き ます。 図 9.34 に例を示 し ます。

1 1
colspan=3 図 9.34
colwidth=50 列幅を足 し 合わせる
1 2 colspan=2 3 2
と 表全体の幅に
colwidth=50
1 3
colspan=1 2 3
colspan=1 rowspan=3
colwidth=50 colwidth=100 colwidth=90
1 4 2 4
colspan=1 colspan=1
colwidth=50 colwidth=100

50 100 90
⴫ߩో᏷ 240

ま たは適当で あれば、 列幅を パーセ ン ト 値で指定す る こ と も で き ま す。 その場合 こ の値


は、 表のはめ込み枠の幅に対す る 割合にな り ま す。 パーセ ン ト 値に よ る 指定を行 う 場合
は、 すべての列に対 し て行 う 必要があ り ます。 でなければ一切 し てはいけ ません。
PDF_add_table_cell( ) の colscalegroup オプシ ョ ン を使っ て、 い く つかの列を列伸縮グ
ループ と し て ま と めて あ る 場合、 それ ら の幅は、 グループ内で も っ と も 幅の広い列 と 同 じ
にな り ます (図 9.35 参照)。

೉᜛ᄢ❗ዊࠣ࡞࡯ࡊ

図 9.35
Max. Load

1 番目の表行の右 4 セルは、 同 じ 列伸縮


Weight

グループに属 し ているので、 同 じ 幅にな


Range

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

絶対座標が使われてい る 場合 (パーセ ン ト 値でな く ) 、 列幅を定義 さ れていないセルがあ


る と き は、 その未決定の幅は以下の よ う に し て算定 さ れます : まず、 テ キ ス ト 行を含む各
セルについて、 列幅かテ キ ス ト の幅 (回転 さ れてい る テ キ ス ト の場合はテ キ ス ト の高 さ )
に も と づいて、 実際の幅が算出 さ れます。 それか ら 、 残 り の表幅が、 ま だ決定 し ていない
列幅に均等に分配 さ れます。

9.3.4 さ ま ざ ま な種類の内容を持 っ た表
以下のい く つかの項では、 図 9.36 に示す よ う な、 さ ま ざ ま な種類の内容を持っ た表の例
を、 一歩ずつ作成 し てい き ま し ょ う 。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の table/mixed_table_contents ト ピ ッ ク にあ り ま


す。

前準備 と し て、 2 つの フ ォ ン ト を読み込む必要があ り ます。 表のはめ込み枠の大 き さ を、


その左下隅 と 右上隅の座標に よ っ て定義 し 、 3 つの表列の幅を指定 し ま し ょ う 。 そ し て、
新規ページ を A4 寸法で開始 し ま し ょ う :
double llx = 100, lly = 500, urx = 360, ury = 600; // 表の座標

int c1 = 50, c2 = 120, c3 = 90; // 3つの表列の幅

266 第 9 章 : テキス ト と 表の組版


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} " +
"fillcolor=red 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 ポ イ ン ト と り ます。 262 ページ 「セルの内容の縦位置を調整」
で述べたの と 同様に、fontsize={capheight=6} を用いて、 テ キ ス ト の縦揃え を統一 し ま し ょ
う。
こ の見出 し 「Giant Wing」 のセルは、 行全体でな く 3 列中 2 列 し か連結 し ないので、 行
ベース の塗 り 分けオプシ ョ ンでは色がつけ ら れません。 かわ り に範囲枠機能を使っ て、 セ
ルが覆 う 長方形を灰色の背景色で塗 り ま し ょ う 。範囲枠機能について詳 し く は 275 ページ
「9.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);

図 9.36 さ ま ざ ま な内容の表セルを一歩ずつ追加
生成 さ れる表 生成手順

Our Paper Plane Models 手順 1 : 3 列にまたがる セルを追加


手順 2 : 2 列にまたがる セルを追加
1 Giant Wing
手順 3 : さ ら にテキス ト 行セル 3 つ追加
Material Offset print paper 220g/sqm
Amazingly robust! 手順 4 : テキス ト フ ローセル追加
Benefit It is amazingly robust and can
even do aerobatics. But it is 手順 5 : テキス ト 行付き画像セル追加
best suited to gliding. 手順 6 : 表をはめ込む

手順 3 : さ ら に 3 つのテキス ト 行セルを追加 以 下 の コ ー ド 断 片 は、 「Material」 ・


「Benefit」 ・ 「Offset print paper」 … のセルを追加 し ます。 「Offset print paper」 … のセルは
2 列目で始ま る ので、 同時に 120 ポ イ ン ト の列幅を定義 し ます。 セルの内容は左上に位置
付け、 すべての端で余白を 4 ポ イ ン ト と り ます。
optlist = "fittextline={position={left top} font=" + normalfont +
" fontsize={capheight=6}} rowheight=14 colwidth=" + c1 + " margin=4";

9.3 表の組版 267


tbl = p.add_table_cell(tbl, 1, 3, "Material", optlist);
tbl = p.add_table_cell(tbl, 1, 4, "Benefit", optlist);

optlist = "fittextline={position={left top} font=" + normalfont +


" fontsize={capheight=6}} rowheight=14 colwidth=" + c2 + " margin=4";

tbl = p.add_table_cell(tbl, 2, 3, "Offset print paper 220g/sqm", optlist);

手順 4 : テキス ト フ ロ ーセルを追加 以下の コ ー ド 断片は、 「It is amazingly」 … のテ キ


ス ト フ ロ ーセルを追加 し ます。 テ キ ス ト フ ロ ーの入っ た表セルを追加す る には、 まずテ キ
ス ト フ ロ ーを作成 し ま し ょ う 。 上記のテ キ ス ト 行同様、 fontsize={capheight=6} を用いれ
ば、 文字サ イ ズが結果的にほぼ 8 ポ イ ン ト にな り 、 ま た (margin=4 と あわせて) 高 さ の
合計が 14 ポ イ ン ト と な り ます。
tftext = "It is amazingly robust and can even do aerobatics. " +
"But it is best suited to gliding.";

optlist = "font=" + normalfont + " fontsize={capheight=6} leading=110%";

tf = p.add_textflow(-1, tftext, optlist);

取得 し たテ キ ス ト フ ロ ーハン ド ルは、 表セルを追加す る 時に使い ます。 テ キ ス ト フ ロ ーの


1 行目は、 テ キ ス ト 行 「Benefit」 のベース ラ イ ン と 揃っ てい る べ き です。 と 同時に、 テ キ
ス ト 「Benefit」 は、 そのセル上端か ら の間隔がテ キ ス ト 「Material」 と 同 じ にな る べ き で
す。 テ キ ス ト フ ロ ー を 追 加 す る 際 は、 上 に 余 白 が 生 じ な い よ う 、
fittextflow={firstlinedist=capheight} を用い ます。 そ し てテ キ ス ト 行 と 同 じ く 、 余白を 4 ポ
イ ン ト 加え ます :
optlist = "textflow=" + tf + " fittextflow={firstlinedist=capheight} " +
"colwidth=" + c2 + " margin=4";

tbl = p.add_table_cell(tbl, 2, 4, "", optlist);

手順 5 : テキス ト 行の入 っ た画像セルを追加 5 番目の手順 と し て、Giant Wing 紙飛行機


の画像 と テ キ ス ト 行 「Amazingly robust!」 の入っ たセルを追加 し ま し ょ う 。 こ のセルは 2
行目の 3 列目で始ま り 、 3 つの行に ま たが り ます。 列幅は 90 ポ イ ン ト です。 セルの余白
は 4 ポ イ ン ト に設定 し ます。1 つ目の例 と し ては TIFF 画像を セル内に配置 し てみま し ょ う :
image = p.load_image("auto", "kraxi_logo.tif", "");

optlist = "fittextline={font=" + boldfont + " fontsize=8} image=" + image +


" colwidth=" + c3 + " rowspan=3 margin=4";

tbl = p.add_table_cell(tbl, 3, 2, "Amazingly robust!", optlist);

あ る いは、 画像は PDF ページ と し て取 り 込む こ と も で き ます。 PDI ページ を閉 じ る のは必


ず、 PDF_fit_table( ) を呼び出 し た後に し て く だ さ い :
int doc = p.open_pdi("kraxi_logo.pdf", "", 0);

page = p.open_pdi_page(doc, pageno, "");

optlist = "fittextline={font=" + boldfont + " fontsize=9} pdipage=" + page +

268 第 9 章 : テキス ト と 表の組版


" 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("");

9.3.5 表 イ ン ス タ ン ス
1 つのはめ込み枠に配置 さ れた表行群は、 表 イ ン ス タ ン ス を構成 し ます。 表全体を表現す
る には、 複数の表 イ ン ス タ ン ス が必要な こ と も あ り ます。 PDF_fit_table( ) は、 1 回呼び出
さ れ る ご と に、 1 つのはめ込み枠に 1 つの表 イ ン ス タ ン ス を配置 し ます。 こ れ ら のはめ込
み枠は、 同 じ ページに多段組レ イ ア ウ ト な ど で配置 し てお く こ と も 、 ま たは複数のページ
に配置 し てお く こ と も で き ます。
図 9.37 の表は、 3 つのページにわた っ てい ます。 各ページに 1 つずつあ る はめ込み枠
に、 各表 イ ン ス タ ン ス が 1 つずつ配置 さ れます。 PDF_fit_table( ) を呼び出すたびに、 最初
の行はヘ ッ ダー と し て定義 さ れ、 最後の行はフ ッ タ ー と し て定義 さ れます。

図 9.37
表は複数の表イ ン ス タ
Our Paper Plane Models ン スに分解 さ れ、 各は
3 Cone Head Rocket め込み枠に 1 つずつ配
Material Kent paper 200g/sqm
置 さ れます。
With big swing!
BenefitOur Paper Plane
This paper Models
arrow can be
thrown with big swing. It
2 Long Distance Glider
stays in the air a long time.
Material Drawing paper 180g/sqm
ࡋ࠶࠳ Benefit Our PaperWith this Plane Models
paper rocket you
⴫ࠗࡦࠬ࠲ࡦࠬ

can send all your messages


ⴕㅪേ 1 Giant Wing
even when sitting in the
ࠣ࡞࡯ࡊ Material Offset print paper pretty
cinema 220g/sqm
near the back.
Amazingly robust!
Benefit It is amazingly robust and
can even do aerobatics. But ࡍ࡯ࠫ3
it is best suited to gliding.
ࡈ࠶࠲

ࡍ࡯ࠫ2
⴫ߩߪ߼ㄟߺᨒ

ࡍ࡯ࠫ1

9.3 表の組版 269


以下の コ ー ド 断片は、 表を配置 し き る ま で表 イ ン ス タ ン ス をはめ込みつづけ る ための、 一
般的なループ を示 し ます。 配置す る べ き 表 イ ン ス タ ン ス があ る 限 り 、 そのつど新規ページ
を作成 し ます。
do {
/* 新規ページを作成 */
p.begin_page_ext(0, 0, "width=a4.width height=a4.height");

/* 最初の行をヘッダーとして使い、すべての表セルに線をひく */
optlist = "header=1 stroke={{line=other}}";

/* 表インスタンスを配置 */
result = p.fit_table(tbl, llx, lly, urx, ury, optlist);
if (result.equals("_error"))
throw new Exception("エラー:" + p.get_errmsg());

p.end_page_ext("");

} while (result.equals("_boxfull"));

/* 結果をチェック。 「_stop」はすべてOKを意味します */
if (!result.equals("_stop")) {
if (result.equals( "_error"))
throw new Exception("エラー:" + p.get_errmsg());
else {
/* これ以外の戻り値はすべて「return」オプションによるユーザー終了。
* これを扱うには専用のコードが必要です。*/
throw new Exception ("テキストフロー内でユーザーリターンを検出しました");
}
}
/* 表内で使ったテキストフローハンドルも削除されます */
p.delete_table(tbl, "");

ヘ ッ ダー ・ フ ッ タ ー PDF_fit_table( ) で header ・ footer オプシ ョ ン を使えば、 表の最初か


最後の行の数を定義 し て、それが各表 イ ン ス タ ン ス の上端か下端に配置 さ れ る よ う にする
こ と がで き ます。 fill オプシ ョ ンで area=header か area=footer を使 う と 、 ヘ ッ ダー ・ フ ッ
タ ーを別の色で塗 る こ と がで き ます。 ヘ ッ ダー行群は表定義の最初の n 行か ら 成 り 、 フ ッ
タ ー行群は最後の m 行か ら 成っ てい ます。
ヘ ッ ダー と フ ッ タ ーは、 PDF_fit_table( ) で表 イ ン ス タ ン ス ご と に指定 し ます。 結果 と
し て、 表 イ ン ス タ ン ス ご と に異な る も のに も な り え ます : ヘ ッ ダー / フ ッ タ ーをつけた表
イ ン ス タ ン ス と 省いた表 イ ン ス タ ン ス を混在 さ せ る 、 と いっ た こ と も 可能です。 それに よ
り た と えば、 最後の表 イ ン ス タ ン ス で特別な行を指定す る 、 と いっ た こ と も 可能にな り ま
す。

表行の連動 い く つ か の 表 行 を 必 ず 同 じ 表 イ ン ス タ ン ス に 入 れ さ せ た い と き は、
rowjoingroup オプシ ョ ン を使っ て、それ ら を同 じ 表行連動グループに割 り 当て る こ と がで
き ます。 表行連動グループは、 連続す る 複数の表行を持ち ます。 こ のグループの表行は、
複数の表 イ ン ス タ ン ス に別れ さ せ ら れ る こ と がな く な り ます。
セルで複数表行を連結 し て も 、 それ ら の表行は自動的に連動グループにはな り ません。

セルを分割 セルが行を連結 し てい る 場合、後のほ う の行がはめ込み枠に収ま ら ない と き


は、 そのセルは分割 さ れます。 画像 ・ PDI ページ ・ SVG グ ラ フ ィ ッ ク ・ テ キ ス ト 行セルの

270 第 9 章 : テキス ト と 表の組版


場合は、 セル内容は次の表 イ ン ス タ ン ス で も 繰 り 返 さ れます。 テ キ ス ト フ ロ ーセルの場合
は、 セル内容は後の表行のセルに続 き ます。
図 9.38 に、 テ キ ス ト フ ロ ーセルが分割 さ れてテ キ ス ト フ ロ ーが次の表行に続いてい る
様子を示 し ます。 図 9.39 に、 画像セルが次の表 イ ン ス タ ン ス の最初の行で繰 り 返 さ れ る
様子を示 し ます。

1 Giant Wing Our paper planes are the 図 9.38


ideal way of passing the セルの分割
⴫ࠗࡦࠬ Material Offset print paper 220g/sqm time. We offer revolutionary
࠲ࡦࠬ1

⴫ࠗࡦࠬ new developments of the


It is amazingly robust and
࠲ࡦࠬ2
Benefit can even do aerobatics. But traditional common paper
it is best suited to gliding. planes.

表行を分割 表のはめ込み枠に最後の本体行が収ま り き ら ない と き 、それは普通は分割 さ


れません。 こ の動作は PDF_fit_table( ) の minrowheight オプシ ョ ンで制御 さ れ、 デフ ォ ル
ト 値は 100% です。 こ のデフ ォ ル ト 設定では、 表行は分割 さ れず、 ま る ご と 次の表 イ ン ス
タ ン スへ配置 さ れます。
minrowheight 値を減 ら せば、 最後の本体行が分割 さ れ、 表行の内容の う ち指定 し た割
合が 1 つ目の部分に、 残 り が次の部分に配置 さ れます。
図 9.39 に、 テ キ ス ト フ ロ ー 「It's amazingly robust」 … が分割 さ れ、 次の表 イ ン ス タ ン
ス の最初の本体行へテ キ ス ト フ ロ ーが続 く 様子を示 し ます。複数行にわた る 画像セルが分
割 さ れ、 画像は繰 り 返 さ れます。 「Benefit」 セル も 繰 り 返 さ れます。

1 Giant Wing 図 9.39


表行の分割
⴫ࠗࡦࠬ Material Offset print paper 220g/sqm
࠲ࡦࠬ1
It is amazingly robust and
Benefit
can even do aerobatics. But

⴫ࠗࡦࠬ
Benefit it is best suited to gliding.
࠲ࡦࠬ2

9.3.6 表組版のアルゴ リ ズム
こ の項では、 表組版機能が表を配置す る 際に行 う ス テ ッ プ を詳説 し ます。 以下、 横書 き テ
キ ス ト の場合について述べ ます。 し か し 、 「表行高 さ 」 と 「列幅」 と い う 言葉を互いに入
れ替えれば、 縦書 き や回転テ キ ス ト に も あ ては ま り ます。
PDF_fit_table( ) へ の 最 初 の 呼 び 出 し の 際 に は、 オ プ シ ョ ン colwidth ・ rowheight ・
fittextline ・ fittextflow がすべてのセルについて吟味 さ れ、 表全体の幅 と 高 さ が、 列幅、 表
行高 さ 、 テ キ ス ト 行 ・ テ キ ス ト フ ロ ー内容、 先頭はめ込み枠の幅に基づいて算出 さ れ ま
す。 はめ込み枠の高 さ は無限 と 見な さ れます。 先頭表 イ ン ス タ ン ス (すなわち先頭はめ込
み枠内の表先頭部分の配置) は PDF_fit_table( ) の fitmethod オプシ ョ ンに従っ て算出 さ れ
ます。

テキス ト 行を持つ表セルの高 さ と 幅を算出 表組版機能は ま ず、 テ キ ス ト 行を持つ表セ


ルの う ち、 colwidth ま たは rowheight のない表列ま たは表行にわた る も のの寸法を決定 し
ます。 こ れを実現す る ために、 fittextline オプシ ョ ンに従っ てテ キ ス ト 行の、 ひいては表

9.3 表の組版 271


セルの幅を算出 し ます。 テ キ ス ト サ イ ズの 2 倍を表セルの高 さ と 見な し ます ( よ り 正確に
い う と : 枠高 さ の 2 倍。 こ れは、 別途指定 さ れない限 り デフ ォ ル ト 値 {capheight none} を
持ち ます) 。 縦書 き テ キ ス ト については、 も っ と も 幅の広いキ ャ ラ ク タ ーの幅がセル幅 と
し て用い ら れます。 西向 き ま たは東向 き のテ キ ス ト については、 テ キ ス ト 高 さ の 2 倍がセ
ル幅 と し て用い ら れます。
その後、 こ の表セルの残余の幅 と 高 さ が、 その表セルがわた る 表列ま たは表行の う ち
colwidth ま たは rowheight が指定 さ れていない も のすべてに按分 さ れます。

仮の表寸法を算出 次の ス テ ッ プ と し て組版機能は、 表の仮の幅 と 高 さ を、 それぞれ列


幅 ・ 表行高 さ すべての合計 と し て算出 し ます。 パーセ ン ト 値で指定 さ れてい る 列幅 と 表行
高 さ は、 先頭はめ込み枠の幅 と 高 さ に基づいて絶対値へ変換 さ れ ま す。 colwidth ま たは
rowheight を持たない列ま たは表行が ま だあ る 場合には、 仮の表寸法が先頭はめ込み枠に
等 し く な る ま で、 残 り の余白が均等に按分 さ れます。
rowheightdefault オプシ ョ ン を用いて、 はめ込み枠の高 さ を完全に満たすか (キーワ ー
ド auto と distribute)、 それ と も 広 さ を節約する か (キーワ ー ド minimum) を指定する こ
と も で き ます。rowheight オプシ ョ ン で明示的に表行の高 さ を指定す る と rowheightdefault
はオーバー ラ イ ド さ れます。

小 さ すぎ る セルを拡大 こ こ で組版機能はすべてのセル内枠を決定 し ます(図9.32参照)。


余白の合計がセルの幅ま たは高 さ よ り 小 さ い と き は、 そのセル枠は、 そのセルに属する す
べての列 と 表行を均等に拡大す る こ と に よ っ て適切に拡大 さ れます。

テキス ト 行の横方向をはめ込む 組版機能は、 テ キ ス ト 行を持つすべてのセルの幅を拡


げて、 テ キ ス ト 行が文字サ イ ズ を下げな く て も セルにはめ込め る よ う に し ます。 こ れが可
能でない と き は、 テ キ ス ト 行は自動的に fitmethod=auto で配置 さ れます。 こ れに よ っ て、
テ キ ス ト 行がセル内枠か ら はみ出 さ ない こ と が保証 さ れ ま す。 fittextline オプ シ ョ ン で
fitmethod=auto に設定す る と 、 セル幅が拡が る のを防ぐ こ と がで き ます。
colscalegroup オプシ ョ ン を用い る と 、 同一の列伸縮グループに属す る すべての列が必
ず等 し い幅に伸縮 さ れ る よ う に、 すなわち こ れ ら の幅が統一 さ れて、 グループ内で最 も 広
い幅に合わせ ら れ る よ う にす る こ と がで き ます (図 9.35 参照)。

強制ハ イ フ ネーシ ョ ン を避け る 算出 さ れた表幅がはめ込み枠 よ り 小 さ い と き は、 組版


機能はテ キ ス ト フ ロ ーセルの幅を拡げて、テ キ ス ト が強制ハ イ フ ネーシ ョ ン な し にはめ込
め る よ う に し ます。 こ れはオプシ ョ ン avoidwordsplitting=false で回避す る こ と も で き ま
す。 こ の よ う なセルの幅は、 表幅がはめ込み枠の幅に等 し く な る ま で拡げ ら れます。
PDF_info_table( ) の horboxgap キーを用いて、表幅 と はめ込み枠幅の差を ク エ リ ーで き
ます。

テキス ト の縦方向をはめ込む 組版機能は、 すべてのテ キ ス ト 行 ・ テ キ ス ト フ ロ ーセル


の高 さ を拡げて、テ キ ス ト 行ま たはテ キ ス ト フ ロ ーが文字サ イ ズ を下げずにセル内枠には
め込め る よ う 試みます。 ただ し 、 テ キ ス ト 行ま たはテ キ ス ト フ ロ ーに対 し てサブオプシ ョ
ン fitmethod=auto が設定 さ れてい る 場合、 ま たはテ キ ス ト フ ロ ーが continuetextflow オ
プシ ョ ンで他のセルに続いてい る 場合には、 セル高 さ は拡が り ません。
こ のセル高 さ を拡げ る 処理は、 テ キ ス ト 行ま たはテ キ ス ト フ ロ ーを内容 と し て持つセ
ルに対 し てのみ適用 さ れ、 それ以外の種類のセル内容、 すなわち画像 ・ グ ラ フ ィ ッ ク ・ PDI
ページ ・ パ ス オブジ ェ ク ト ・ 注釈 ・ フ ィ ール ド に対 し ては適用 さ れません。
rowscalegroup オプシ ョ ン を用い る と 、 同一の表行伸縮グループの中のすべての表行が
必ず等 し い高 さ に伸縮 さ れ る よ う にす る こ と がで き ます。

272 第 9 章 : テキス ト と 表の組版


表を次のはめ込み枠へ続け る 算出 さ れた表全体の高 さ がはめ込み枠 よ り も 大 き い (す
なわち、 すべての表セルをはめ込み枠に収め る こ と がで き ない) と き は、 組版機能は、 そ
のはめ込み枠に収ま ら ない初めての表行に出会 う 前に、そのはめ込み枠内に表行を配置す
る こ と を止め ます。
1 つのセルが複数の表行にわた り 、 かつ、 そのすべてがはめ込み枠に収ま る わけではな
い と き には、 こ のセルは分割 さ れます。 セルが画像 ・ PDI ページ ・ SVG グ ラ フ ィ ッ ク ・ パ
ス オブジ ェ ク ト ・ 注釈 ・ フ ォーム フ ィ ール ド を内容 と し て持つ と き は、repeatcontent=false
が指定 さ れていない限 り 、 そのセル内容は次のはめ込み枠内で繰 り 返 さ れます。 し か し テ
キ ス ト フ ロ ーは、 セルがわた る 後続の表行に続 き ます (図 9.38 参照)。
rowjoingroup オプシ ョ ン を用い る と 、 1 つの連動グループの中のすべての表行が 1 つ
のはめ込み枠内に現れ る よ う にす る こ と がで き ます。ヘ ッ ダーま たはフ ッ タ ーに属す る す
べての表行 と 1 つの本体表行は、 自動的に表行連動グループ を形成 し ます。 ですので組版
機能は、はめ込み枠に収ま ら ない初めての表行に出会 う 前に表行を配置す る こ と を止め ま
す (図 9.37 参照)。
return オプシ ョ ン を用い る と 、 対象表行を配置 し た後にその表 イ ン ス タ ン ス内に絶対
も う 表行が配置 さ れない よ う にす る こ と がで き ます。

表行を分割 表行は、 非常に高い と き 、 ま たは 1 個の本体表行 し かない と き には、 分割 さ


れ る こ と があ り ます。 末尾の本体表行がはめ込み枠に完全に収ま ら ない と き は、 それは次
のはめ込み枠へ移動 さ れます。 こ の動作は PDF_fit_table( ) の minrowheight オプシ ョ ンで
制御す る こ と がで き ます。こ のオプシ ョ ンのデフ ォ ル ト 値は 100% です。こ の minrowheight
値を小 さ く す る と 、末尾本体表行の内容の う ち指定 し た割合がカ レ ン ト はめ込み枠に配置
さ れ、 その表行の残 り は次のはめ込み枠に配置 さ れます (図 9.39 参照)。
PDF_info_table( ) の rowsplit キー ワー ド を用い る と 、 表行が分割 さ れてい る か ど う かを
チ ェ ッ ク す る こ と がで き ます。

表をはめ込み枠の幅に縮める 表列幅を合計 し た表幅は、 はめ込み枠 よ り も 大 き く な る


こ と があ り ます。 た と えばテ キ ス ト 行の横方向をはめ込んだ後な ど です。 こ の場合には、
表幅がはめ込み枠の幅に等 し く な る ま で、 すべての列が均等に縮め ら れます。 こ の縮小処
理 は horshrinklimit オ プ シ ョ ン に よ っ て 制 限 さ れ ま す。 一切 の 横縮小 を 避 け る に は
horshrinklimit=100% を用い ます。
PDF_info_table( ) の horshrinking キーワ ー ド を用い る と 横縮小率を ク エ リ ーで き ます。
horshrinklimit の閾値を超えた と き 、 すなわち、 表を横に過度に縮めなければな ら ない
場合には、 以下のエ ラ ー メ ッ セージが現れます :
Table width $1 exceeds fitbox width $2 (required shrinking factor $3 is smaller than
'horshrinklimit'

こ こ で $1 は算出 さ れた表幅を示 し 、 $2 は PDF_fit_table( ) で与え ら れたはめ込み枠の幅、


$3 は算出 さ れた縮小率です。 こ のエ ラ ーが出た場合には、 はめ込み枠の幅に も っ と 大 き
い値を与え る 必要があ り ます。

表をはめ込み枠の高 さ に縮める ヘ ッ ダー ・ フ ッ タ ー行に少な く と も 1 つの表本体行ま


たは表行連動グループを加え た表の高 さ が、はめ込み枠の高 さ よ り 大 き く な る こ と も あ り
え ます。 こ の場合には、 表の高 さ がはめ込み枠の高 さ と 等 し く な る ま ですべての表行が均
等に低 く さ れます。 こ の縮小過程は vertshrinklimit オプシ ョ ンに よ っ て制限 さ れます。 一
切の縦縮小を避け る には vertshrinklimit=100% を用い ます。
PDF_info_table( ) の vertshrinking キー ワー ド を用い る と 縦縮小率を ク エ リ ーで き ます。

9.3 表の組版 273


vertshrinking の閾値を超え た と き 、 すなわち、 表を縦に過度に縮めなければな ら ない
場合には、 以下のエ ラ ー メ ッ セージが現れます :
Table height $1 exceeds fitbox height $2 (required shrinking factor $3 is smaller than
'vertshrinklimit'

こ こ で $1 は算出 さ れた表高 さ を示 し 、 $2 は PDF_fit_table( ) で与え ら れたはめ込み枠の高


さ 、 $3 は算出 さ れた縮小率です。 こ のエ ラ ーが出た場合には、 はめ込み枠の高 さ に も っ
と 大き い値を与え る 必要があ り ます。

後続す るはめ込み枠の幅が異な る場合 後続す る はめ込み枠が最初のはめ込み枠 よ り 広


い場合、 表セルはそのはめ込み枠の幅を完全に満たす よ う に拡が る わけではあ り ません。
結果 と し て、 最初のはめ込み枠 よ り も 広いはめ込み枠群を持つ表 イ ン ス タ ン ス はすべて、
デ フ ォ ル ト で は等 し い 幅 を 持 ち ま す。 は め 込み枠 を 完全 に 満 た す に は、 オ プ シ ョ ン
fitmethod=auto を与え る 必要があ り ます。 fitmethod=meet を用い る と 、 セル高 さ がその
ア スペ ク ト 比を温存す る よ う 適切に拡大 さ れます。
最初のはめ込み枠 よ り も 後続のはめ込み枠のほ う が狭い場合には、 表セルの幅は、 狭
いはめ込み枠に収ま る よ う 縮ま り ます。 表幅を改めて計算 し なおすには、 PDF_fit_table( )
を rewind=1 をつけて呼び出 し ます。

274 第 9 章 : テキス ト と 表の組版


9.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 API リ フ ァ レ ン ス を参照 し て く だ
さ い。

注 範囲枠は blind モー ド においては、すなわち blind オプ シ ョ ン を用いて組版する際には、サ


ポー ト さ れていません。

9.4.1 テキス ト 行を装飾


テ キ ス ト 行の範囲枠か ら 話を始め ま し ょ う 。 PDF_fit_textline( ) においては範囲枠は、 与え
ら れたテ キ ス ト のテ キ ス ト 枠 と 同 じ にな り ます。 デフ ォ ル ト では、 テ キ ス ト 枠の幅はテ キ
ス ト の幅に等 し く 、 高 さ は、 与え ら れた文字サ イ ズのキ ャ ッ プハ イ ト に等 し く な り ます。
範囲枠の大 き さ を図示す る ために、 以下の コ ー ド 断片は、 範囲枠を青の背景色で塗 り ます
(図 9.40a 参照)。
String optlist =
"font=" + normalfont + " fontsize=8 position={left top} " +
"matchbox={fillcolor={rgb 0.8 0.8 0.87} boxheight={capheight none}}";

p.fit_textline("Giant Wing Paper Plane", 2, 20, optlist);

9.4 範囲枠 275


boxheight オプシ ョ ンは、 boxheight={capheight none} がデフ ォ ル ト 設定なので、 省略 し て
も か ま い ません。 boxheight オプシ ョ ンで枠の高 さ を も っ と 増や し て アセ ン ダーま で覆 う
よ う にすれば、 よ り 美 し く な り ます (図 9.40b 参照)。
枠の高 さ を増や し て文字サ イ ズに一致 さ せたい と き は、 boxheight={fontsize descender}
が使え ます (図 9.40c 参照)。
次の ス テ ッ プ と し ては、 範囲枠の左 ・ 右 ・ 下へ変位を加え て拡げ、 枠のすべての端を
テ キ ス ト と 均等な間隔に し てみま し ょ う 。 さ ら に枠線幅を指定 し て、 範囲枠の ま わ り に長
方形を描き ま し ょ う (図 9.40d 参照)。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の textflow/text_on_color ト ピ ッ ク にあ り ます。

図 9.40 さ ま ざ ま なサブオプ シ ョ ンの範囲枠を使っ て テキス ト 行を装飾


生成 さ れる出力 PDF_fit_textline( ) の matchbox オプ シ ョ ンのサブオプ
ション

a) Giant Wing Paper Plane boxheight={capheight none}

b) Giant Wing Paper Plane boxheight={ascender descender}

c) Giant Wing Paper Plane boxheight={fontsize descender}

boxheight={fontsize descender} borderwidth=0.3


d) Giant Wing Paper Plane offsetleft=-2 offsetright=2 offsetbottom=-2

9.4.2 テキス ト フ ロ ー内で範囲枠を用い る


テキス ト フ ロ ーの一部分を装飾 こ の項では、 テ キ ス ト フ ロ ー内の一部のテ キ ス ト を装
飾 し ま し ょ う : 「very dangerous」 と い う 言葉を マーカーペンの よ う に目立たせま し ょ う 。
こ れを実現す る には、 言葉を matchbox イ ン ラ イ ンオプシ ョ ン と matchbox=end イ ン ラ イ
ンオプシ ョ ンで囲い ます (図 9.41 参照) :

図 9.41 matchbox イ ン ラ イ ン オプ シ ョ ン を含んだ テキス ト フ ロー

生成 さ れる出力 PDF_create_textflow( ) に対する テキス ト と イ ン ラ イ ン


オプ シ ョ ン
It is <matchbox={fillcolor=red
It is very dangerous to fly boxheight={ascender descender}}>very dangerous
the Giant Wing in a
thunderstorm. <matchbox=end> to fly the Giant Wing in a
thunderstorm.

テキス ト フ ロ ーの範囲枠に Web リ ン ク を追加 今度は、テ キ ス ト フ ロ ーの一部分に Web


リ ン ク を追加 し ま し ょ う 。 1 番目の手順 と し て、 リ ン ク をつけたい部分のテ キ ス ト を示す
kraxi と い う 範囲枠を含んだテ キ ス ト フ ロ ーを作成 し ま し ょ う 。 2 番目に、 URL を開 く ア
ク シ ョ ン を作成 し ま し ょ う 。 3 番目に、 枠が不可視の Link 型の注釈を作成 し ま し ょ う 。 そ
のオプシ ョ ン リ ス ト の中で、 範囲枠 kraxi を参照 し て リ ン ク の長方形 と し て使い ま し ょ う
(範囲枠を指定す る と 、 PDF_create_annotation( ) の長方形の座標は無視 さ れます)。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の textflow/weblink_in_text ト ピ ッ ク にあ り ます。

/* 範囲枠「kraxi」を含んだテキストフローを作成してはめ込み */
String tftext =
"For more information about the Giant Wing Paper Plane see the Web site of " +

276 第 9 章 : テキス ト と 表の組版


"<underline=true matchbox={name=kraxi boxheight={fontsize descender}}>" +
"Kraxi Systems, Inc.<matchbox=end underline=false>";

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);

テ キ ス ト Kraxi Systems, Inc. が複数の行にわた る 場合には、1 回 PDF_create_annotation( ) を


呼び出すだけで、適切な数のア ク テ ィ ブな長方形が リ ン ク 注釈に対 し て自動的に作成 さ れ
ます (図 9.42 参照)。

For information about 図 9.42


Giant Wing Paper テキス ト フ ローの一部分に
Planes see the Web Web リ ン ク を追加
site of Kraxi Systems,
Inc.

9.4.3 範囲枠 と 画像
画像に リ ン ク を追加 画像で覆われた領域に Web リ ン ク を追加す る には、 画像の範囲枠
が使え ます。 コ ー ド は先述の 276 ページ 「テ キ ス ト フ ロ ーの範囲枠に 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 ト ピ ッ ク にあ り ます。

9.4 範囲枠 277


範囲枠はつねに画像 よ り 前の時点で描かれ る ので、 一部が画像で隠 さ れて し ま い ます。 こ
れを避け る ために、 枠の幅の 50 パーセ ン ト の offset サブオプシ ョ ン群を使っ て、 画像が
覆 う 領域 よ り も ふち を大 き く し ま し ょ う 。 あ る いは、 枠を その分太 く する と い う 方法 も あ
り ます。 図 9.43 に、 ふち をつけ る ために PDF_fit_image( ) で使 う オプシ ョ ン リ ス ト を示 し
ます。

図 9.43 画像の範囲枠を使 っ て画像にふち をつける


生成 さ れる出力 PDF_fit_image( ) に対する オプ シ ョ ン リ ス ト

boxsize={60 60} position={center} fitmethod=meet


matchbox={name=kraxi borderwidth=4 offsetleft=-2 offsetright=2
offsetbottom=-2 offsettop=2 linecap=round linejoin=round
strokecolor={rgb 0.0 0.3 0.3}}

テキス ト を画像に揃え る 以下の コ ー ド 断片は、 縦方向のテ キ ス ト を、 画像の右余白に


合わせ る 方法を示 し ます。 画像ははめ込み方式 meet を用いて、 与え ら れた枠に縦横比を
保っ てはめ込まれてい ます。 はめ込み枠の具体的な座標は PDF_info_matchbox( ) で取得 さ
れ、 縦方向のテ キ ス ト ははめ込み枠の右下隅 (x2, y2) に合わせて配置 さ れてい ます。 範囲
枠の辺は描線 さ れてい ます (図 9.44 参照)。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の images/align_text_at_image ト ピ ッ ク にあ り ま
す。
/* このオプションリストを使って画像を読み込んではめ込む */
String optlist = "boxsize={300 200} position={center} fitmethod=meet " +
"matchbox={name=giantwing borderwidth=3 strokecolor={rgb 0.85 0.83 0.85}}";

/* 画像を読み込んではめ込む */

/* 範囲枠の右下(第二)隅の座標を取得 */
if ((int) p.info_matchbox("giantwing", 1, "exists") == 1)
{
x2 = p.info_matchbox("giantwing", 1, "x2");
y2 = p.info_matchbox("giantwing", 1, "y2");
}
/* その隅から2だけ間隔をあけてテキスト行を開始 */
p.fit_textline("Foto: Kraxi", x2+2, y2+2, "font=" + font + " fontsize=8 orientate=west");

図 9.44 画像の範囲枠の座標を使 っ て テキス ト 行をはめ込む


生成 さ れる出力 生成手順

手順 1 : 画像を範囲枠 と と も にはめ込み
Foto: Kraxi

手順 2 : 範囲枠情報を得て座標 (x2, y2) を取得


手順 3 : 取得 し た座標 (x2, y2) から orientate=west オプ シ ョ ン で テ
キス ト 行を開始
(x2, y2)

278 第 9 章 : テキス ト と 表の組版


10 イ ン タ ラ ク テ ィ ブ機能
ク ッ ク ブ ッ ク イ ン タ ラ ク テ ィ ブ要素を作成する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ クの interactive カ
テ ゴ リ ーにあ り ます。

10.1 リ ン ク ・ し お り ・ 注釈
こ の項では、 し お り ・ フ ォーム フ ィ ール ド ・ 注釈 と いっ た さ ま ざ ま な イ ン タ ラ ク テ ィ ブ要
素の作成方法を説明 し ます。以下の イ ン タ ラ ク テ ィ ブ要素を持つ文書を作成 し てみま し ょ
う :
> 右上には、テ キ ス ト www.kraxi.com の所に、www.kraxi.com への非表示の Web リ ン ク が
あ り ます。 こ の領域を ク リ ッ ク す る と 、 その対応す る Web ページが表示 さ れます。
> 灰色の フ ォーム フ ィ ール ド が、 種類はテ キ ス ト で、 Web リ ン ク の下に作っ て あ り ます。
JavaScript を使っ て こ こ には今日の日付が自動的に記入 さ れます。
> 赤い押 し ピ ンは添付を持っ た注釈です。 ク リ ッ ク す る と フ ァ イ ル添付が開 き ます。
> 左下には フ ォーム フ ィ ール ド があ り 、 種類はボ タ ン で、 プ リ ン タ ーのア イ コ ン を表示
し てい ます。 こ のボ タ ン を ク リ ッ ク す る と Acrobat の メ ニ ュ ー項目 「フ ァ イル」 → 「印
刷」 が実行 さ れます。
> ナビ ゲーシ ョ ンパネルには し お り 「Our Paper Planes Catalog」 があ り ます。 こ の し お り
を ク リ ッ ク す る と 、 別の PDF 文書のページが表示 さ れます。

以下、 こ う し た イ ン タ ラ ク テ ィ ブ要素を作成す る 方法を説明 し ます。

Web リ ン ク まずは、 Web サ イ ト www.kraxi.com への リ ン ク を作 り ま し ょ う 。 こ れは 3


つの段階で達成で き ます。 まず、 Web リ ン ク をつけたいテ キ ス ト を配置 し ます。 matchbox
オプシ ョ ンで name=kraxi を指定 し て、 テ キ ス ト のはめ込み枠を後で参照で き る よ う に し
てお き ます。
次に、 URI 型 (Acrobat では : 「Web ページ を開 く 」) のア ク シ ョ ン を作成 し ま し ょ う 。
す る と ア ク シ ョ ンハン ド ルが得 ら れます。 こ のア ク シ ョ ンハン ド ルは後で 1 個ない し 複数
の イ ン タ ラ ク テ ィ ブ要素に割 り 当て る こ と がで き ます。
最後に、Link 型の注釈を用いて リ ン ク を実際に作成 し ま し ょ う 。 リ ン ク に対する action
オプシ ョ ンでは、 イ ベン ト 名 activate を指定 し て ア ク シ ョ ン を ト リ ガー さ せ、 加え て上記
で作成 し た 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);

10.1 リ ン ク ・ し お り ・ 注釈 279
/* 範囲枠「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 リ ン ク の作成例については 275 ページ 「9.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";
catalog_bookmark = p.create_bookmark("Our Paper Planes Catalog", optlist);

こ の し お り を ク リ ッ ク す る と 、 文書内のページの指定部分が表示 さ れます。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の interactive/nested_bookmarks ト ピ ッ ク にあ り ま


す。

フ ァ イ ル添付を持つ注釈 次に、 フ ァ イ ル添付を作成 し ま し ょ う 。 まず FileAttachment 型


の注釈を作成 し ま し ょ う 。 filename オプシ ョ ンで添付の名前を指定 し 、 mimetype=image/
png オ プ シ ョ ン で そ の 種 類 を 指 定 し ま す。 こ の し お り は 押 し ピ ン と し て 表示 さ れ
(iconname=pushpin) 、 色は赤で (annotcolor=red) 、 説明を持ち ます (contents={Get the
Kraxi Paper Plane!})。 印刷 さ れません (display=noprint) :
String optlist =
"filename=kraxi_logo.png mimetype=image/png 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);

280 第 10 章 : イ ン タ ラ ク テ ィ ブ機能
iconname で定義 し た ア イ コ ンの大 き さ は変化 し ません。 ア イ コ ンはその標準寸法の ま ま、
指定 し た長方形の左上隅に表示 さ れます。

10.1 リ ン ク ・ し お り ・ 注釈 281
10.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);

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の form_fields/form_pushbutton ト ピ ッ ク にあ り ま


す。

単純な テキス ト フ ィ ール ド 今度は、 テ キ ス ト フ ィ ール ド をページ右上隅付近に作成 し


ます。 ユーザーは今日の日付を こ の フ ィ ール ド に入力す る こ と がで き ます。 フ ォ ン ト ハン

282 第 10 章 : イ ン タ ラ ク テ ィ ブ機能
ド ルを取得 し 、 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 であ り 、 こ の場合フ ィ ール ド の高 さ がその ま ま初期の


文字サ イ ズ と な り ます。入力が フ ィ ール ド の終わ り ま で達す る と 文字サ イ ズは小 さ く な っ
て、 テ キ ス ト がつねに フ ィ ール ド に収ま る よ う 自動調整 さ れます。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の form_fields/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);

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の form_fields/form_textfield_fill_with_js ト ピ ッ


ク にあ り ます。

テキス ト フ ィ ール ド のための フ ォ ーマ ッ ト オ プ シ ョ ン Acrobat では、テ キ ス ト フ ィ ール


ド に対 し て さ ま ざ ま なオプシ ョ ン を指定 し て内容を フ ォーマ ッ ト する こ と が可能です。た
と えば通貨 ・ 日付 ・ パーセ ン ト な ど です。 こ れは、 カ ス タ ムの JavaScript コ ー ド を Acrobat
が使用する こ と に よ っ て実装 さ れてい ます。 こ う いっ た フ ォーマ ッ ト 機能は PDF リ フ ァ
レ ン ス には記載 さ れていない物ですか ら 、 PDFlib は直接には こ れに対応を し てい ません。
し か し なが ら 、 PDFlib ユーザーの便宜を図 る ため、 以下、 フ ォーマ ッ ト オプシ ョ ン を実現
す る ための さ ま ざ ま な簡単な JavaSctipt コ ー ド 断片を PDF_create_field( ) の action オプシ ョ
ンで与え る 方法について説明 し ます。

10.2 フ ォ ーム フ ィ ール ド と JavaScript 283


テ キ ス ト フ ィ ール ド が フ ォーマ ッ ト さ れ る よ う にす る には、 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);

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の form_fields/form_textfield_input_format ト ピ ッ


ク にあ り ます。

フ ォ ーム フ ィ ール ド 入力を検証 以下のサンプルは、 JavaScript を フ ォーム フ ィ ール ド に


検証ア ク シ ョ ン と し て紐付けて、 テ キ ス ト フ ィ ール ド へのユーザー入力が、 求め ら れ る 形
式 mm/dd/yyyy に合致 し てい る か ど う か をチ ェ ッ ク し ます :
optlist =
"script={" +
"// 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);

284 第 10 章 : イ ン タ ラ ク テ ィ ブ機能
10.3 ス ク リ ー ン注釈 と 表現ア ク シ ョ ン を用いた マル
チメディ ア
一般 マルチ メ デ ィ ア を、PDF 文書内で ス ク リ ーン注釈 と 表現ア ク シ ョ ン を使っ て再生で
き ま す。 こ の メ デ ィ アのデー タ は、 PDF 文書内に埋め込む こ と も で き ま す し 、 別の外部
フ ァ イ ルか ら 取っ て来 る こ と も で き ます し 、 リ モー ト のサーバーか ら 引っ張 る こ と も で き
ます。 こ の メ デ ィ ア (表現 と 呼びます) は、 ページ上で注釈に よ っ て定義 さ れた固定の位
置で も 、 別の フ ロ ーテ ィ ン グ ウ ィ ン ド ウ内で も 、 フルス ク リ ーンモー ド で も 再生 さ せ る こ
と がで き ます。 メ デ ィ ア と と も に コ ン ト ロ ー ラ ーを表示す る こ と も で き ますので、 そ う す
ればユーザーが メ デ ィ ア を再生 ・ 一時停止 ・ 再開 ・ 停止で き る よ う にな り ます。 あ る いは
こ れ ら の コ ン ト ロ ールを PDF の フ ォーム フ ィ ール ド を用いて実装す る こ と も 可能です。
マルチ メ デ ィ ア要素を持っ た PDF を再生する には、 Adobe Acrobat か、 マルチ メ デ ィ
アサポー ト を そなえ たサー ド パーテ ィ ーの PDF ビ ュ ーアが必要です。 Web ブ ラ ウ ザーに
内蔵 さ れてい る PDF ビ ュ ーアの多 く は目下マルチ メ デ ィ アの表現に対応 し てい ません。
PDFlib を用いて音声か動画を作成す る 手順はたいてい以下の と お り です :
> PDF_load_asset( ) で type=Rendition を用いて動画フ ァ イ ルか音声フ ァ イ ルか URL を読み
込む。
> PDF_create_action( ) で type=Rendition を用いて表現ア ク シ ョ ン を作成。
> 動画が再生 さ れ る ページ上の領域を用意す る ス ク リ ーン注釈を作成。 表現ア ク シ ョ ン
は注釈の さ ま ざ ま な ト リ ガー イ ベン ト に紐付け る こ と がで き ます。 た と えばページが
開 か れ た 時や注釈が ク リ ッ ク さ れ た 時 な ど です。 あ る い は ア ク シ ョ ン を し お り か
フ ォーム フ ィ ール ド に紐付けて メ デ ィ アの再生を制御で き る よ う にす る こ と も 可能で
す。

以下の コ ー ド 断片は、 表現 と ア ク シ ョ ン と 注釈を用いた標準的な手順を実装 し てい ます :


// その動画を持たせた表現オブジェクトを作成
rend_video = p.load_asset("Rendition", videofile,
"mimetype=video/mp4 name=rendition_video controller");
if (rend_video == -1)
throw new Exception("エラー : " + p.get_errmsg());

// その動画を再生するための表現アクションを作成
act = p.create_action("Rendition",
"target=annot_video operation=playfrombeginning rendition=" + rend_video);

// その動画が再生される場所であるスクリーン注釈を作成
p.create_annotation(25, 300, 575, 610, "Screen",
"title=annot_video name=annot_video action={activate=" + act + "}");

あ る いは こ の標準的な手順ではな く 、 注釈を使用せず、 JavaScript を用いて表現を再生す


る こ と も 可能です (286 ページ 「JavaScript でマルチ メ デ ィ ア」 を参照)。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の multimedia/screen_annotations ト ピ ッ ク にあ り


ます。

セキ ュ リ テ ィ を考慮 マ ル チ メ デ ィ ア の再生は頻繁 に攻撃 の タ ー ゲ ッ ト に な る の で、


Acrobat DC は さ ま ざ ま なセキ ュ リ テ ィ チ ェ ッ ク を実装 し てい ます。 マルチ メ デ ィ ア コ ン
テ ン ツの再生を成功 さ せ る には、 以下のいずれかの方式を用い る こ と に よ っ て、 PDF 文書
が必ず信頼 さ れ る よ う にす る 必要があ り ます :

10.3 ス ク リ ーン注釈 と 表現ア ク シ ョ ン を用いたマルチ メ デ ィ ア 285


> こ の文書を開 く 際に、 Acrobat は、 上端に 「セキ ュ リ テ ィ 上の問題が発生する 可能性を
防 ぐ ため、 い く つかの機能が無効にな っ てい ます。 こ の文書を信頼す る 場合は、 こ れ
ら の機能 を使用で き ま す。 」 と 書かれた黄色いバーを表示 し ま す。 「オプ シ ョ ン」 メ
ニ ュ ーで 「常に こ の文書を信頼す る 」 を ク リ ッ ク 。
> 「編集」 → 「環境設定」 → 「一般 ...」 → 「セキ ュ リ テ ィ (拡張)」 へ行き 、 特権の場所の
リ ス ト に こ の フ ァ イ ルか フ ォ ルダーを追加。
> こ の文書に証明書の署名を行い、 「編集」 → 「環境設定」 → 「一般 ...」 → 「セキ ュ リ テ ィ
(拡張)」 → 「有効な証明書を持つ文書を自動的に信頼する」 を有効にする 。

MIME タ イ プ PDF_load_asset( ) の mimetype オプシ ョ ンは必須です。 適切な MIME タ イ


プ ( コ ン テ ン ツ タ イ プ) を与え る こ と は、 メ デ ィ アが必ず正 し く 再生 さ れ る よ う にする た
めに不可欠です。 対応す る MIME タ イ プの リ ス ト は、 PDF ビ ュ ーア ・ バージ ョ ン と 、 オペ
レ ー テ ィ ン グ シ ス テ ム が 提供 し て い る 利用可能 な メ デ ィ ア 再生能力 に 依存 し ま す。
Acrobat で以下の JavaScript を使っ て対応 し てい る MIME タ イ プの リ ス ト を知る こ と がで
き ます :
// すべてのプレーヤーとメディアタイプをクエリー。JavaScriptコンソールで使用すること
var mp = app.media.getPlayers("");
for (var i = 0; i < mp.length; i++) {
console.println("\n'" + mp[i].name + "'が対応しているMIMEタイプ群:");
console.println(mp[i].mimeTypes);
}

よ く 使われ る 音声 ・ 動画形式に対す る MIME タ イ プ を表 10.1 に挙げ ます。 PDF_create_


action( ) の rendition オプシ ョ ンは表現の リ ス ト を受け付け ます。 その場合、 PDF ビ ュ ー
アは、 最初の対応 し てい る 形式の表現を採用 し ます。 こ の機能を活用す る と 、 1 つの動画
を複数の形式で与え る こ と に よ っ て、 さ ま ざ ま な タ ーゲ ッ ト 環境でな る べ く それが再生で
き る よ う にす る こ と が可能です。

表 10.1 よ く 使われる MIME タ イ プ


カテゴ リー よ く 使われる MIME タ イ プ
音声 audio/wav ・ audio/midi ・ audio/mp3 ・ audio/mp4

動画 video/mpeg ・ video/msvideo ・ video/avi ・ video/mp4 ・ video/quicktime

JavaScript で マルチ メ デ ィ ア Acrobat 用の JavaScript API は、マルチ メ デ ィ ア コ ン テ ン ツ


を PDF 内で扱 う 広汎な機会を提供 し てい ます。た と えば、PDF_create_action( ) の operation
オプシ ョ ン を用いて動画を起動す る のではな く 、 operation オプシ ョ ンのかわ り にシ ンプ
ルな JavaScript 命令を与え る こ と が可能です :
act = p.create_action("Rendition",
"target=my_annot script={app.media.openPlayer();} rendition=" + rend_video);

表現がその文書の 「表現名称ツ リ ー」 の中に格納 さ れていれば (Acrobat ではその よ う な


表現を 「JavaScript か ら ア ク セ ス可能」 と 称 し ます)、 JavaScript を使っ てその表現を操作
す る こ と も 可能です。 こ れを実現す る には PDF_load_asset( ) の nametree オプシ ョ ン を用
い ます。 以後その表現は注釈を一切必要 と せずに JavaScript ア ク シ ョ ン を用いて再生で き
る よ う にな り ます。 た と えば し お り の ク リ ッ ク を ト リ ガーに し た り す る こ と が可能です :

286 第 10 章 : イ ン タ ラ ク テ ィ ブ機能
// 表現を名前で取得し、それをフローティングウィンドウ内で特定のプロパティ群を用いて再生
// これが動作するには名称ツリー内の表現に対してだけ

var rendition = this.media.getRendition("rendition_sound");

if (rendition == null)
app.alert("表現が見つかりませんでした");
else
{
var floating = {
width: 400,
height: 300
};
var player = app.media.openPlayer({
rendition: rendition,
settings: {
windowType: app.media.windowType.floating,
floating: floating
}
});
}

以下の コ ー ド は、 上記の JavaScript コ ー ド が文字列変数 js に格納 さ れてい る 前提で、 それ


を仮想 (PVF) フ ァ イ ルへ読み込んで、 JavaScript アセ ッ ト を作成 し 、 そ し て JavaScript ア
ク シ ョ ン を作成 し て、 それを し お り に紐付けてい ます :
// 音声ファイルを持つ隠れた表現を作成してそれを名称ツリー内に格納することによって
// それをJavaScriptからアクセス可能にする
int rend_sound = p.load_asset("Rendition", soundfile,
"mimetype=audio/midi style=hidden nametree name=rendition_sound");
if (rend_sound == -1)
throw new Exception("エラー : " + p.get_errmsg());

// JavaScript文字列を仮想(PVF)ファイルへ読み込む
p.create_pvf("/pvf/javascript/script1.js", js.getBytes(), "");

// PVFファイルからJavaScriptアセットを作成
int js_asset = p.load_asset("JavaScript", "/pvf/javascript/script1.js", "");
if (js_asset == -1)
throw new Exception("エラー : " + p.get_errmsg());

// アセットからJavaScriptアクションを作成
int act_js = p.create_action("JavaScript", "javascript=" + js_asset);

// この音声表現を再生するためのしおり
p.create_bookmark("JavaScriptを用いて音声を作成(しおりをクリック)",
"action={activate=" + act_js + "}");

1 つの し お り に 2 つのア ク シ ョ ン を紐付ければ、 音声表現 と 動画表現を同時に再生す る こ


と も 可能であ り 、 し か も 対応す る ス ク リ ーン注釈は必要あ り ません。 注釈のない表現は、
ページ上に領域を必要 と し ない音声を再生す る ために と り わけ有用です。

ク ッ ク ブ ッ ク A full code sample for sound and video renditions without annotations can be found in the
Cookbook topic multimedia/javascript_for_renditions. The topic interactive/renditions in
the pCOS Cookbook demonstrates how to enumerate all renditions in the name tree.

10.3 ス ク リ ーン注釈 と 表現ア ク シ ョ ン を用いたマルチ メ デ ィ ア 287


ク ッ ク ブ ッ ク 注釈のない音声 ・ 動画表現の完全な コ ー ド サン プルがク ッ ク ブ ッ ク の multimedia/
javascript_for_renditions ト ピ ッ ク に あ り ま す。 pCOS ク ッ ク ブ ッ ク の interactive/
renditions ト ピ ッ ク は、 名称ツ リ ー内のすべての表現を列挙する方法を示 し ています。

288 第 10 章 : イ ン タ ラ ク テ ィ ブ機能
10.4 地理空間 PDF
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の geospatial/starter_geospatial ト ピ ッ ク にあ り
ます。

10.4.1 地理空間 PDF を Acrobat で利用


PDF 1.7ext3 では、 地理空間参照情報 (世界座標) を PDF ページ内容に追加す る こ と がで
き る よ う にな っ てい ます。 Acrobat では、 地理空間参照付き PDF 文書でい く つかの こ と が
で き ます。 Acrobat ・ Acrobat Reader DC では、 「ツール」 → 「も の さ し 」 を有効にす る 必
要があ り ます :
> マ ウ ス カー ソ ルの下の地図上の位置の座標を表示 : 「地図位置ツール」 。 マ ウ ス カー ソ
ルの下の地図上の位置の座標を、右 ク リ ッ ク し て 「座標を ク リ ッ プボー ド に コ ピー」 を
選択す る こ と で コ ピーで き ます。
> 地図上の位置を検索 : 「地図位置ツール」 →右 ク リ ッ ク し て 「位置を検索」 を選択→求
め る 座標を入力。
> 地図上の位置を マー ク : 「地図位置ツール」 →右 ク リ ッ ク し て 「位置を マー ク」 を選択。
> 地図上の距離 ・ 周辺 ・ 面積を測定 : 「もの さ し ツール」。

Acrobat Reader では上記の う ち最初の 2 つの機能だけが利用可能です。 地理空間測定のた


めの さ ま ざ ま な設定を、 「編集」 → 「環境設定」 (→ 「一般 ...」) → 「もの さ し (地図情報)」
で変更で き ます。 た と えば座標読み上げのための望ま し い座標系な ど です。
PDFlib の地理空間機能は以下の関数 と オプシ ョ ンで実装 さ れてい ます :
> 1 つのページに対 し て、 1 つない し 複数の地理参照付き 領域を、 PDF_begin/end_page_
ext( ) の viewports オプシ ョ ン ( と サブオプシ ョ ン georeference) を用いて割 り 当て る こ
と がで き ます。 ビ ュ ーポー ト を使 う と 、 ページ上の別々の領域で別々の地理空間参照
(georeference オプシ ョ ンで指定) を用い る こ と が可能にな り ます。 こ れはた と えば同
一ページ上に複数の地図があ る と き な ど に有用です。 こ の方式は、 地理空間 PDF への
対応を有す る すべての PDF ビ ュ ーアーで動作 し ます。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の geospatial/starter_geospatial ト ピ ッ ク にあ り


ます。

> PDF_load_image( ) の georeference オプシ ョ ン を使 う と 、画像に地球ベース の座標を割 り


当て る こ と がで き ます。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の geospatial/georeferenced_image ト ピ ッ ク にあ り


ます。

> PDF_open_pdi_page( ) ・ PDF_load_graphics( ) ・ PDF_begin_template_ext( ) の georeference


オプシ ョ ン を用いて地球ベース の座標を フ ォーム XObject に割 り 当て る こ と も で き ま
す。 し か し こ の方式は、 Acrobat DC を含むいずれの既知の ビ ュ ーアーにおいて も 対応
し ていないため、 推奨 し ません。

10.4.2 地理座標系 と 投影座標系


地理座標系は地球を地理座標で、 すなわち緯度 と 経度を度単位で表 し て記述 し ます。 投影
座標系は、 地理座標系の上に指定す る こ と がで き 、 地理座標系におけ る 点か ら 二次元 (投
影) 座標系への変換を記述 し ます。 こ こ か ら 算出 さ れ る 座標を Northing ・ Easting 値 と い
い、 投影座標系では角度は も はや不要です。 地理座標系が GPS な ど の全球的応用分野で

10.4 地理空間 PDF 289


用い ら れてい る のに対 し て、投影はそれ よ り も あ る 程度局地的な地図製作な ど の応用分野
で必要 と な り ます。
歴史的 ・ 数学的理由に よ り 、 世界 じ ゅ う で さ ま ざ ま な座標系が用い ら れてい ます。 地
理座標系 ・ 投影座標系 と も 、 EPSG ・ WKT と い う 2 種類の普及 し た方式で記述する こ と が
で き ます。 WKT ・ EPSG と も Acrobat で使用で き ますが、 Acrobat はすべての可能な EPSG
コ ー ド を実装 し てい る わけではあ り ません。 特に、 地理座標系のための EPSG コ ー ド 群に
は Acrobat は対応 し ていない よ う です。 その場合には WKT の使用を推奨 し ます。 以下の
Web サ イ ト で、 特定の EPSG コ ー ド に対応す る WKT を示 し てい ます :
www.spatialreference.org/ref/epsg

10.4.3 座標系の例
地理座標系の例 WGS84 (世界測地系) 地理座標系は、 GPS をは じ め と す る 多 く の応用
分野 (OpenStreetMap な ど) の基礎 と な っ てい ます。 こ れは以下の よ う に georeference オ
プシ ョ ンの worldsystem サブオプシ ョ ンで表現で き ます :
worldsystem={type=geographic wkt={
GEOGCS["WGS 84",
DATUM["WGS_1984", SPHEROID["WGS 84", 6378137, 298.257223563]],
PRIMEM["Greenwich", 0],
UNIT["degree", 0.01745329251994328]]
}}

ETRS (欧州地球基準系) 地理座標系は WGS84 と ほ と ん ど等価です。 こ れは以下の よ う に


指定で き ます :
worldsystem={type=geographic wkt={
GEOGCS["ETRS_1989",
DATUM["ETRS_1989", SPHEROID["GRS_1980", 6378137.0, 298.257222101]],
PRIMEM["Greenwich", 0.0],
UNIT["Degree", 0.0174532925199433]]
}}

注 WGS84 ・ ETRS 系に対する EPSG コ ー ド は こ こ では示 し ていません。 なぜな ら Acrobat は地


理座標系に対する EPSG コ ー ド に対応 し てお ら ず、 投影座標系に し か対応 し ていないよ う
だから です (後述)。

投影座標系の例 投影は、 その背景にあ る 地理座標系に基づいてい ます。 以下の例では、


GPS 座標での利用に適 し た投影座標系を指定 し ます。
中欧では、 ETRS89 UTM zone 32 N と い う 系が適用 さ れます。 こ れは広 く 利用 さ れてい
る UTM (国際 メ ルカ ト ル投影) を用いてお り 、 以下の よ う に georeference オプシ ョ ンの
worldsystem サブオプシ ョ ンで表現で き ます :
worldsystem={type=projected wkt={
PROJCS["ETRS_1989_UTM_Zone_32N",
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],

290 第 10 章 : イ ン タ ラ ク テ ィ ブ機能
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}

10.4.4 Acrobat におけ る地理空間 PDF の制約


地理空間 PDF を Acrobat 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 回の呼び出 し で取得 さ れた) 場
合には、 Acrobat は も はや さ ま ざ ま な画像の領域を考慮 し な く な り ます : 1 番目の画像
の座標が誤っ て 2 番目の画像の領域へ拡張 さ れ、 誤っ た座標表示 と な っ て し ま い ます。
回避策:同一ページ上に同 じ 画像をベース に し た地図を複数枚貼 り 付けたい と き は、そ
の画像を複数回開 く こ と 。
> 面積 も の さ し ツールは地理座標系に対 し ては正 し く 動作せず、 投影系に対 し てのみ正
し く 動作 し ます。

10.4 地理空間 PDF 291


292 第 10 章 : イ ン タ ラ ク テ ィ ブ機能
11 タ グ付き PDF と PDF/UA
11.1 タ グ付 き PDF の基礎
タ グ付き PDF は、 ISO 標準 PDF/UA ・ PDF/A-1a ・ PDF/A-2a ・ PDF/A-3a、 米国のセ ク シ ョ
ン 508、 ド イ ツ の BITV、 その他多 く の法規におけ る 必須事項です。 タ グ付 き PDF は、 以
下の利点を提供す る 文書構造情報で PDF を向上 さ せます :
> ア ク セシ ビ リ テ ィ ー : タ グ付 き PDF は、た と えば Acrobat 内蔵の読み上げ機能や、 よ り
高度な ス ク リ ーン リ ーダー ソ フ ト ウ ェ ア な ど を通 じ て、 障碍を持つユーザーのために
ア ク セシブルです。
> 他の文書形式への信頼性高い書 き 出 し ・ 変換 : タ グ付き PDF を、 RTF ・ XML ・ HTML と
いっ た他の形式へ変換す る と 、 よ り 正確な出力が得 ら れます。

PDF/UA は、 タ グ付 き PDF を、 文書 タ グに関す る 要件を仕様化す る こ と で改良 し た も の


です。 ア ク セシブルな PDF 文書を作成 し たいな ら 、 PDF/UA のための追加規則群に従 う
こ と を推奨 し ます : 詳 し く は 335 ページ 「11.4 PDF/UA に よ る ユニバーサルア ク セシ ビ リ
テ ィ ー」 を参照 し て く だ さ い。
すべての PDF/UA の要件には従え ない場合には (た と えば PDF/UA に準拠 し ていない
既存の PDF を元に文書を組み立てなければな ら ないな ど の理由で)、 PDF/UA モー ド を無
効に し て、 で き る 限 り 多 く の PDF/UA 規則に従 う こ と を推奨 し ます。

ク ッ ク ブ ッ ク タ グ付き PDF を生成する ための コ ー ド サン プルが、 PDFlib ク ッ ク ブ ッ ク の pdfua カ テ ゴ


リ ーにあ り ます。ク ッ ク ブ ッ ク 内の タ グ付き PDF サン プルはすべて PDF/UA を作成 し ます。

11.1.1 論理構造ツ リ ー (構造 ヒ エ ラ ルキー) を作成


タ グ付き PDF は、 ク ラ イ ア ン ト がその文書の内部構造に関する 情報を提供 し 、 かつ PDF
出力を生成す る 際に特定の規則に従っ た場合にのみ作成で き ます。 タ グ付き PDF を作成
す る には、 tagged 文書オプシ ョ ン を true に設定す る 必要があ り 、 ま た、 lang オプシ ョ ン
が推奨 さ れます (PDF/UA-1 では必須です) :
if (p.begin_document("tagged.pdf", "tagged=true lang=en") == -1) {
throw new Exception("エラー : " + p.get_errmsg());

タ グ付 き PDF 文書内の論理構造は、 要素の ヒ エ ラ ルキーに よ っ て記述 さ れます。 こ れを


構造 ヒ エ ラ ルキー、 ま たは論理構造ツ リ ー と いい ます。 ルー ト レベルか ら 始ま っ て、 こ の
構造 ヒ エ ラ ルキーは任意の数の レベルか ら 成 り ます。各レベルにおいては、1 個の要素は、
以下の種類のア イ テ ム を 0 個以上含む こ と がで き ます :
> 他の構造要素。 た と えば Document (文書) 要素は、 複数の Art (アーテ ィ ク ル) 要素を
含む こ と がで き 、 各 Art 要素は さ ら に、 複数の P (段落) 要素を含む こ と がで き ます。
> 内容ア イ テ ム。 すなわち、 ページ上のテ キ ス ト 列 と グ ラ フ ィ ッ ク や、 取 り 込ま れた画
像か ら 作成 さ れた XObject や、 注釈 ・ フ ォーム フ ィ ール ド への OBJR 参照。 こ う し た
ア イ テ ムは、 構造要素に関連づけ ら れた内容を表現 し ます。

Acrobat におけ る構造 ヒ エ ラ ルキー タ グ名 と 構造 ヒ エ ラ ルキーは、 Acrobat DC で以下


の よ う に表示で き ます :

11.1 タ グ付き PDF の基礎 293


図 11.1 Acrobat の タ グパネルが
文書の論理構造ツ リ ーを表示

> 「表示」 → 「表示切 り 替え」 → 「ナビゲーシ ョ ンパネル」 → 「 タ グ」 を選択 (図 11.1 参照)

タ グネ ス テ ィ ン グ関数 構造要素は、 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);

デフ ォ ル ト では、 構造要素は、 カ レ ン ト でア ク テ ィ ブな ア イ テ ムの子 と し て、 他の子ア イ


テ ムがすでに存在すればそれ ら すべての後に、 挿入 さ れます。 要素が論理的順序で作成 さ

294 第 11 章 : タ グ付き PDF と PDF/UA


れ る な ら ば、 こ れに よ っ て正 し い ツ リ ー構造が得 ら れます。 も っ と 高度な技法については
327 ページ 「11.2.5 内容を順序に と ら われず作成」 を参照 し て く だ さ い。
構造要素は、 オプシ ョ ン を通 じ て与え ら れ る 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);

タ グネ ス テ ィ ン グ メ ソ ッ ド は PDF_begin_item( ) に も 対応 し てい ますので、 両方の方式を


合わせ る こ と も 可能です。 こ れは、 タ グの下に タ グ を ネ ス ト す る 必要があ り 、 そ し てネ ス
ト さ れた タ グが さ ら に複数の内容ア イ テ ム を内容 と する 場面において役立ち ます。た と え
ば、 Caption 要素の中に P 要素があ り 、 その中に さ ら に複数のテ キ ス ト ア イ テ ムがあ る よ
う に し たければ、 以下の よ う に生成で き ます。
id_caption = p.begin_item("Caption", "tag={tagname=P}");
p.fit_textline(...);
p.fit_textline(...);
p.end_item(id_caption);

tag オプシ ョ ンのオプシ ョ ン リ ス ト の中のサブオプシ ョ ン と し て 2 番目の tag オプシ ョ ン


を ネ ス ト す る こ と も で き ます。 実際、 tag オプシ ョ ンは任意の レベルま でネ ス ト さ せ る こ
と が可能です。 ネ ス ト さ れた構造要素の内容が内容ア イ テ ム 1 個だけであ る 場合には、 上
記の コ ー ド 断片は、テ キ ス ト をページ上に配置す る ための呼び出 し の中で短縮 タ グ付け を
直接適用す る こ と に よ り 、 さ ら に単純化す る こ と が可能です。
p.fit_textline(..., "tag={tagname=Caption tag={tagname=P}");

短縮 タ グ 付 け は、 生成 さ れ た 構造要素のハ ン ド ル を 露出 し ま せん の で、 PDF_activate_
item( ) で、 ま たは tag オプシ ョ ンの parent サブオプシ ョ ンで使 う こ と はで き ません。 こ
れ ら は構造要素 ID を必要 と す る か ら です。tag オプシ ョ ンの動作は詳 し く は以下の と お り
です :

11.1 タ グ付き PDF の基礎 295


> 生成 さ れた内容のために新規の構造要素が作成 さ れ、 そ し て呼び出 し か ら 返 る 前に閉
じ ら れます。 以下の状況は こ の規則か ら 除外 さ れます :
> PDF_begin_document( ) で tag オプシ ョ ン を用いて作成 さ れた構造要素は、 PDF_end_
document( ) で閉 じ ら れます。
> PDF_begin_item( ) の tag オプシ ョ ン を用いて複数の タ グが与え ら れた と き は、こ れ ら
すべての タ グは、 対応す る PDF_end_item( ) への呼び出 し で閉 じ ら れます。
> PDF_fit_table( ):tagname=Table ま たは PDF_fit_table( ) で Table に ロ ールマ ッ プ さ れてい
る タ グ名は、 PDFlib に対 し て、 必要な表 タ グ群を作成する よ う 指示 し ます (317 ペー
ジ 「11.2.1 自動表 タ グ付け」 参照)。 表セルに対 し て自動的に生成 さ れた TH ・ TD タ グ
は、 PDF_add_table_cell( ) の tag オプシ ョ ンで さ ら に修飾する こ と も で き ます。
> PDF_fit_textflow( ) : 完全な テ キ ス ト フ ロ ー イ ン ス タ ン ス は新規の構造要素を形成 し ま
す。 短縮 タ グ付けは、 後述のテ キ ス ト フ ロ ーオプシ ョ ン リ ス ト の中の タ グ よ り も 優先
さ れます。
> 生成 さ れ る 要素は、 カ レ ン ト でア ク テ ィ ブな ア イ テ ムの、 ま たは parent オプシ ョ ンで
与え ら れてい る ア イ テ ムの子です。
> グループ化要素は、 PDF_begin_item( ) でのみ作成す る こ と がで き 、 PDF_begin_
document( ) 以外の短縮 タ グ付け を用いて作成する こ と はで き ません。
> PDF_begin_document( ) と PDF_add_table_cell( ) の場合を除いて、短縮 タ グ付けはページ
ス コ ープ内でのみ使用で き ます。

テキス ト フ ロ ーオ プ シ ョ ン リ ス ト 内で タ グ PDF_begin/end_item( ) を用いて明示的に タ


グ付け を行 う のではな く 、多 く の関数の tag オプシ ョ ン を用いて短縮 タ グ付け を行 う ので
も な く 、 タ グ付けの情報を テ キ ス ト フ ロ ーの一部 と し て与え る こ と も 可能です。 構造要素
名 と 属性を PDF_create_textflow( ) ・ PDF_add_textflow( ) でオプシ ョ ン と し て与え る こ と が
で き ます。 タ グ付けの情報を テ キ ス ト フ ロ ーオプシ ョ ン リ ス ト 内に直接含め る こ と がで き
ます :
<tagbegin={tagname=H1 Title={Company History}}>Introduction<tagend>\n
<tagbegin={tagname=P}>Kraxi Systems was founded in ... <tagend>\n

tagbegin オプシ ョ ンは短縮 タ グ付け と 同 じ オプシ ョ ン を受け付け、 一方 tagend オプシ ョ


ンは最 も 最近に開かれた構造要素を閉 じ ます。 こ れ ら の タ グ付けオプシ ョ ンは他のテ キ ス
ト フ ロ ー制御オプシ ョ ン と 組み合わせ る こ と も で き ます。
タ グ を持っ た テ キ ス ト フ ロ ーはすべての イ ン ス タ ン ス を出力ページに配置す る 必要が
あ り ます。 すなわち PDF_fit_textflow( ) を、 それが _stop を返すま で呼び出 し つづけ る 必
要があ り ます。 テ キ ス ト フ ロ ーのすべての イ ン ス タ ン ス が配置 さ れない まれな場合、 すな
わちテ キ ス ト の一部が失われ る 場合においては、最後に こ のテ キ ス ト フ ロ ーのためにPDF_
fit_textflow( ) を呼び出す時に tagstop オプシ ョ ン を与え る 必要があ り ます。
テ キ ス ト フ ロ ーを出力に配置す る 際には、 テ キ ス ト フ ロ ーの イ ン ス タ ン ス は、 テ キ ス
ト の量 と はめ込み枠の寸法に よ っ て 1 個ない し 複数生成 さ れます。 PDFlib は、 テ キ ス ト フ
ロ ーのすべての イ ン ス タ ン ス が必ず 1 つの共通の構造要素の子にな る よ う に し 、 ま た、 テ
キ ス ト フ ロ ーの イ ン ス タ ン ス の末尾で中断 さ れた要素が次の イ ン ス タ ン ス で必ず自動的
に ま た有効化 さ れ る よ う に し ます。 テ キ ス ト フ ロ ーの イ ン ス タ ン ス の配置は、 同一ページ
上であ っ て も 、 異な る ページ上であ っ て も か ま い ません。
テ キ ス ト フ ロ ーオプシ ョ ン リ ス ト 内の タ グは以下の場合には無視 さ れます :
> タ グ付けがサポー ト さ れていない コ ン テ キ ス ト において。 た と えばテ ンプ レー ト 上や、
タ グ付けな し の出力の場合。

296 第 11 章 : タ グ付き PDF と PDF/UA


> PDF_fit_textflow( ) に tag オプシ ョ ン を与え てい る 場合。

テ キ ス ト フ ロ ーマ ク ロ (242 ページ 「9.2.3 イ ン ラ イ ン オプシ ョ ン リ ス ト と マ ク ロ 」 を参


照) を使っ て、 タ グ付けのための便利なシ ョ ー ト カ ッ ト を定義す る こ と も で き ます。 例 :
macro {
H1 {tagbegin={tagname=H1 Title = {Company History}} }
/H1 {tagend}

P {tagbegin={tagname=P} }
/P {tagend}
}

マ ク ロ はそれ以後、 イ ン ラ イ ンオプシ ョ ン リ ス ト 内で、 マ ク ロ を開始する & を使っ て使


用す る こ と がで き ます。
<&H1>Introduction<&/H1>\n
<&P>Kraxi Systems was founded in ... <&/P>\n

なお、オプシ ョ ン リ ス ト はつねに各オプシ ョ ンに対 し て値を それぞれ 1 つずつ し か伝達 し


ない こ と に注意 し て く だ さ い。 1 つのオプシ ョ ン を複数回使用 し た場合、 同 じ オプシ ョ ン
リ ス ト の中で最後に書いたそのオプシ ョ ンが、それ よ り 前に書いた も の全部を オーバー ラ
イ ド し ます。 た と えば、 以下の構成は構造要素を 2 つ開始 し ません。 なぜな ら 2 個目の
tagbegin が 1 個目をオーバー ラ イ ド す る か ら で、 LI ア イ テ ムだけが作成 さ れて L ア イ テ ム
は無視 さ れます :
<tagbegin={tagname=L} tagbegin={tagname=LI}> // 間違い: 1つのオプションリスト!

構造要素を 2 つ作成す る には、2 つの tagbegin オプシ ョ ン を別々の イ ン ラ イ ンオプシ ョ ン


リ ス ト の中で与え る か、 別々の PDF_add_textflow( ) への呼び出 し で与え る 必要があ り ま
す。 例 :
<tagbegin={tagname=L}><tagbegin={tagname=LI}> // 正しい: 2つのオプションリスト

2 つのネ ス ト し た構造要素で同 じ 内容を囲 う 場合には、 1 つのオプシ ョ ン リ ス ト の中で


tagbegin オプシ ョ ン と 一緒に も う 1 つ、ネ ス ト し た tag オプシ ョ ン を与え る こ と がで き ま
す。 た と えば、 Caption 要素は内容ア イ テ ム を子に持てないので、 P な ど実際の内容を持
つ他の要素を子にす る 必要があ り ます。 こ の構成は イ ン ラ イ ン テ キ ス ト フ ロ ーオプシ ョ ン
を用いて以下の と お り 表現で き ます :
<tagbegin={tagname=Caption tag={tagname=P}}>Figure 9.1<tagend>

こ の tagend オプシ ョ ンは、 対応す る Caption 要素だけでな く 、 ネ ス ト し た P 要素を も 閉


じ ます。

ク ッ ク ブ ッ ク テキス ト フ ローオプ シ ョ ン リ ス ト 内で タ グを与えて タ グ付きPDFを作成する コ ー ド サン プ


ルが、PDFlib ク ッ ク ブ ッ クの pdfua カ テ ゴ リ ー内の inline_tags_in_textflow_pdfua1 ト ピ ッ
ク にあ り ます。

11.1.2 標準構造種別
PDF 1.7 と PDF 2.0 の タ グセ ッ ト PDF は、 幅広い文書分類に対応す る よ う 設計 さ れた さ
ま ざ ま な標準構造種別に対応 し てい ます。 PDFlib は、 表 11.1 に従っ て PDF 1.x と PDF 2.0

11.1 タ グ付き PDF の基礎 297


のすべての標準要素種別に対応 し てい ます。 こ の表の中で示 し てい る 説明は、 適切な種別
を選ぶ助け と な る こ と を意図 し てい ます。 選択 し た PDF 出力互換性に よ っ て、 利用可能
な構造種別のグループ、 いわゆ る タ グセ ッ ト が異な り ます :
> PDF 1.7 タ グセ ッ ト は、 compatibility=1.7 と それ以下の場合にはつねに利用可能です。
compatibility=2.0 の場合には、 こ の タ グセ ッ ト は、 pdftagset=1.7 であれば利用可能で
す。 こ れは、 表 11.1 で PDF 2.0 と 標識 し ていないすべての種別を含んでい ます。
> PDF 2.0 タ グセ ッ ト は、compatibility=2.0 の場合のデフ ォ ル ト です。 こ れは、PDF 1.7 タ
グセ ッ ト の種別の多 く に加え、 表 11.1 で PDF 2.0 と 標識 し てい る 種別を含んでい ます。

構造要素はすべて、 標準構造種別の集合か ら 採 る か、 (カ ス タ ム要素の場合には) 標準構


造種別のいずれか 1 つへ ロ ールマ ッ プ し てい る かのいずれか と する 必要があ り ます (308
ページ 「11.1.5 カ ス タ ム構造種別 ・ ロ ールマ ッ プ ・ カ ス タ ム タ グセ ッ ト 」 を参照) 。 標準
構造種別は以下を含むい く つかのカ テ ゴ リ ーに分類で き ます :
> グループ化レベル構造種別は、 他の要素を グループ化す る コ ン テナーであ り 、 ページ
内容を ま っ た く 子に持ち ません。
> ブ ロ ッ ク レベル構造種別は、 ページの内容の総体的な レ イ ア ウ ト を記述 し ます。
> イ ン ラ イ ン レベル構造種別は、 ブ ロ ッ ク レベル要素内の内容の レ イ ア ウ ト を記述 し ま
す。
> 特殊種別は、 リ ス ト 、 表、 日本語のルビ/割注な ど のために使用 さ れます。
> 擬似構造種別は、 いかな る 構造要素を も 作成す る こ と な く 、 内容を特定の特性でマー
ク ア ッ プす る ために用い ら れます。

複数のカ テ ゴ リ ー子に持っ てで使用で き る 構造種別 も あ り ます。


究極的にはページ内容は、 内容 ア イ テ ム、 すな わ ち テ キ ス ト ・ 画像 ・ ベ ク ト ル グ ラ
フ ィ ッ ク ・ イ ン タ ラ ク テ ィ ブ要素に よ っ て記述 さ れます。 構造種別ど う し の関係 と 、 内容
を子に持て る 要素ど う し の関係は、 タ グネ ス テ ィ ン グ規則に よ っ て規定 さ れます。 例外 も
あ り ますが、標準構造種別に対す る ネ ス テ ィ ン グ規則を ま と め る と おおむね以下の と お り
です :
> 文書レベル と グループ化レベルの要素は、 他の文書レベル ・ グループ化 ・ ブ ロ ッ ク レ
ベルの要素のみを子に持つ こ と がで き 、 イ ン ラ イ ン レベル要素か内容ア イ テ ム を子に
持つ こ と は一切で き ません。
> 内容ア イ テ ムは、 ブ ロ ッ ク レベル と イ ン ラ イ ン ラ ベルの要素の子 と 、 リ ス ト と 表の適
切なサブ要素の子にのみな る こ と がで き ます。
> ブ ロ ッ ク レベル要素は、 イ ン ラ イ ン レベル要素 と 内容ア イ テ ムのみを子に持て ます。
> イ ン ラ イ ン レベル要素は、 他の イ ン ラ イ ン レベル要素 と 内容ア イ テ ム のみを子に持て
ます。

PDF 1.7 と PDF 2.0 の場合の構造要素ネ ス テ ィ ン グ規則について詳 し く は以下の項で解説


し ます。 アプ リ ケーシ ョ ンは こ れ ら 規則に従 う 必要があ り ます。 PDF/UA-1 には他に も 規
則が課 さ れます (335 ページ 「11.4 PDF/UA に よ る ユニバーサルア ク セシ ビ リ テ ィ ー」 を
参照)。
構造要素に対す る ネ ス テ ィ ン グ規則チ ェ ッ ク は、 PDF_begin_document( ) の checktags
オプシ ョ ン を用いて無効化か緩和す る こ と も で き ます。 し か し こ れは、 無効な構造 ヒ エ ラ
ルキーを生み出す可能性があ り ますので推奨 し ません。 こ のオプシ ョ ンは、 レ ガシ アプ リ
ケーシ ョ ンのための移行の助け と し て意図 さ れてい る も のです。 表 11.3 内のい く つかの
規則を 「厳格規則」 と し て標識 し てい ます。 オプシ ョ ン checktags=relaxed は、 こ の厳格
規則群以外のすべてのチ ェ ッ ク を強制 し ます。

298 第 11 章 : タ グ付き PDF と PDF/UA


表 11.1 タ グ付き PDF 内の標準種別 ( タ グ) と 、 PDFlib に よ っ て追加 さ れた擬似種別
構造種別 説明

文書レ ベル構造種別 (文書レ ベル ・ グループ化 ・ ブ ロ ッ ク レ ベルの要素を子に持て るが、 イ ン ラ イ ン レ ベル要素


か内容ア イ テムを子に持てない)
Document 自己完結 し ている論理的文書。 PDF 2.0 では構造ツ リ ーのルー ト 要素 と し て必須。 ネス ト し た
Document 要素群を子に持つ こ と も 可能。

Document- (PDF 2.0) 論理的文書断片。 多 く の場合、 も と の文書全体の一部を抜き出 し て作成 さ れる。 ネス ト


Fragment し た DocumentFragment 要素群を子に持つ こ と も 可能。

グループ化レ ベル構造種別 (ページ内容を子に持て ない)


Art (アーテ ィ クル。 compatibility=2.0 の場合には pdftagset=1.7 が必須) 文書内のアーテ ィ ク ル。

Aside (PDF 2.0) 親構造要素内で他の内容か ら区別 さ れている内容。 た と えばサイ ド バー内のテキス ト や


補足コ メ ン ト 。
BlockQuote (ブ ロ ッ ク 引用。 compatibility=2.0 の場合には pdftagset=1.7 が必須) 周囲のテキス ト の作成者
以外の誰かに帰する 1 個ない し 複数の段落から 成る テキス ト の部分
Div (区画) 文書の、 意味上の意図のない分割。 セ マ ン テ ィ ク スに基づかないグループ化に対 し て使用
する こ と も で き ます。 た と えばブ ロ ッ ク レ ベル要素のシーケ ン スに lang 属性を紐付けた り 、 他の
標準構造要素がどれ もふ さ わ し く ない カ ス タ ムグループ化構造要素を ロールマ ッ プ し た り する場
合がこ れにあた り ます。
Index (イ ンデ ッ ク ス。 compatibility=2.0 の場合には pdftagset=1.7 が必須) 文書の主本文内における
指定 さ れた テキス ト の出現を指 し 示す Reference 要素を伴っ た識別テキス ト を内容 と する項目の

NonStruct (非構造要素) 固有の構造特性を何も 持たない要素を グループ化。 これはグループ化のみを目的 と
する も のです。
Part ヒ エ ラ ルキーを考慮せずに構造要素群を グループ化 し た ものを内包 (セマ ン テ ィ ク ス界の Div)

Private (プ ラ イ ベー ト 要素。 compatibility=2.0 の場合には pdftagset=1.7 が必須) ア プ リ ケーシ ョ ンに


属する プ ラ イ ベー ト 内容を内容 と するグループ化要素。 この種別の構造上の意義は仕様化 さ れて
いません。 こ の Private 要素 も、 その子孫要素のいずれも、 他の文書形式へは解釈も書き出 し も
さ れません。
Sect (セ ク シ ョ ン) ヒ エ ラルキーを考慮 し て構造要素群を グループ化 し た も のを内包
TOC (目次。 compatibility=2.0 の場合には pdftagset=1.7 が必須) 目次項目群 (構造種別 TOCI) およ
び / または他のネス ト さ れた目次エ ン ト リ ー群 (TOC) か ら成る リ ス ト 。

TOCI (目次項目。 compatibility=2.0 の場合には pdftagset=1.7 が必須) 目次の メ ンバー。 こ れは適切


な Link 要素を内容 と するべき です。

ブ ロ ッ ク レ ベル構造種別 (イ ン ラ イ ン レ ベル要素のみを子に持て ます)


FENote (PDF 2.0。 グループ化レ ベルかブ ロ ッ ク レ ベルかイ ン ラ イ ン レ ベル) 脚注 ・ 後注。 こ れを囲 っ てお
り 参照 し ている内容の一部 と し ては通常読まれない も の。
H (見出 し 。 PDF/UA-1 では structuretype=strong の場合にのみ可) 見出 し と 通常呼ばれる内容の低
レ ベル区画。 H 要素は階層的にネス テ ィ ングする こ と を意図 さ れています。 H1 な ど を用いた弱い
構造化のほ う が望ま し いです。

H1~H6 見出 し と 通常呼ばれる内容の低レ ベル区画。 こ れらの種別は、 ア プ リ ケーシ ョ ンがセ ク シ ョ ン群


を階層的にネス ト で き ないために見出 し のレ ベルを そのネス テ ィ ングのレ ベルか ら判定で き ない
場合に用いるべき です。 Lbl 構造種別を用いて見出 し の中のセ ク シ ョ ン番号を囲 う こ と も で き ま
す。

11.1 タ グ付き PDF の基礎 299


表 11.1 タ グ付き PDF 内の標準種別 ( タ グ) と 、 PDFlib に よ っ て追加 さ れた擬似種別
構造種別 説明

H7 ・ H8 ・ … (PDF 2.0 かロールマ ッ ピ ング を持つ PDF/UA-1) も っ と 深いネス テ ィ ングのための さ ら な る見出


し レ ベル。 PDF/UA-1 では P へのロールマ ッ ピ ン グ を推奨 し ます。

P (段落) 内容の低レ ベル区画。 多 く の場合に段落に用い られますが、 任意の内容の低レ ベル区画を


囲え ます。
Title (PDF 2.0。 グループ化レ ベルかブ ロ ッ ク レ ベル) 文書か内容の高レ ベル区画の タ イ ト ル と 通常呼ば
れる内容を囲います。 こ れを囲 っ ている内容か ら脚注か後注への参照があるべき です。

イ ン ラ イ ン レ ベル構造種別
BibEntry (書誌項目。 compatibility=2.0 の場合には pdftagset=1.7 が必須) 何 らかの引用内容の外部 ソ ー
ス を特定する参照
Code (compatibility=2.0 の場合には pdftagset=1.7 が必須) コ ン ピ ュ ー タ ーのプ ログ ラ ムのテキス ト
の断片
Em (PDF 2.0) 強調の目的のために内容を囲います。 強調のレ ベルを上げる ためにネス ト し た Em 要素
を使用する こ と も で き ます。
Lbl 同 じ 親要素の中の他の内容から 区別する ための内容。 た と えば リ ス ト 項目に対する ビ ュ レ ッ ト ・
番号や、 キ ャ プ シ ョ ンの中の番号や、 見出 し の中の付番。
Note (compatibility=2.0 の場合には pdftagset=1.7 が必須) 脚注や後注のよ う に、 文書の本体の中か
ら参照 さ れる説明テキス ト のア イ テム。 こ の要素は Lbl を子に持て ます。

Sub (PDF 2.0) ブ ロ ッ ク レ ベル要素の中の下位区画 と し て通常知覚 さ れる内容を囲います。 た と えば詩


の中の節や、 ソ ース コ ー ド の行や、 住所の中の行。
Quote (引用。 compatibility=2.0 の場合には pdftagset=1.7 が必須) 周囲のテキス ト の作成者以外の誰
かに帰する テキス ト のイ ン ラ イ ン部分。 こ の引用 さ れた テキス ト は、 単一の段落内に イ ン ラ イ ン
で含まれているべき です。
Reference (compatibility=2.0 の場合には pdftagset=1.7 が必須) 文書内の他の所にあ る内容への参照。 こ
れはロー カルな リ ン クのために使用 さ れるべき です。
Span (表の表行または列の連結 と は関係あ り ません) 特定の固有の特性を何ら持たない一般的な内容の
イ ン ラ イ ン部分。 lang な ど特定の属性を持っ た テキス ト の範囲を区切る ために使 う こ と も で き ま
す。
Strong (PDF 2.0) 強い重要性 ・ 重大性 ・ 緊急性の目的のために内容を囲います。

イ ン タ ラ ク テ ィ ブ要素のための構造種別 (グループ化レ ベルかブ ロ ッ ク レ ベルかイ ン ラ イ ン レ ベル) (320ページ


「11.2.2 イ ン タ ラ ク テ ィ ブ要素に タ グ付け」 参照)

Annot (PDF 1.5) 内容を 1 つない し 複数の注釈に紐付けます。 構造ツ リ ー内に 1 つない し 複数の注釈を含
める ために使用する こ と も で き ます。 Link か Form のほ う が適切でない限 り は この要素を注釈に対
し て使用する必要があ り ます。
Form 内容を、 対応する フ ォ ーム フ ィ ール ド と 紐付けます。 構造ツ リ ーに フ ォ ーム フ ィ ール ド を含める
ために も使え ます。 Lbl 要素を用いて フ ォ ーム フ ィ ール ド のラ ベルを マー ク ア ッ プする こ と も で き
ます。
Link 内容を リ ン ク注釈 と 紐付けます。 構造ツ リ ーに リ ン ク注釈を含める ために も使え ます。 この要素
を リ ン ク注釈に対 し て使用する必要があ り ます。

和文ルビ ・ 割注のための要素 (イ ン ラ イ ン レ ベル)


Ruby (PDF 1.5) 比較的小 さ な テキス ト サイ ズで書かれ、 それが参照する親文字テキス ト に隣接 し て配置
さ れたサイ ド ノ ー ト 。 こ の Ruby 要素は、 ルビ組立構造全体を囲む ラ ッ パー と し ての働き を し ま
す。 RB/RT ペア 1 個か、 RP ・ RT ・ RP の並び 1 個を子に持つ必要があ り ます。

300 第 11 章 : タ グ付き PDF と PDF/UA


表 11.1 タ グ付き PDF 内の標準種別 ( タ グ) と 、 PDFlib に よ っ て追加 さ れた擬似種別
構造種別 説明
RB (ルビ親文字テキス ト 。 PDF 1.5) ルビ注釈が施 さ れる対象 と な る フルサイ ズのテキス ト 。
RT (ルビ注釈テキス ト 。 PDF 1.5) ルビ親文字テキス ト に隣接 し て配置 さ れるべき、 比較的小 さ なサイ
ズのテキス ト 。
RP (ルビ約物) ルビ注釈テキス ト を囲 う 約物。 こ れは、 ルビ注釈がルビ ス タ イルで適切に組版で きず
に、 通常の コ メ ン ト と し て組版 さ れるか割注 と し て組版 さ れる場合にのみ用い ら れます。
Warichu (割注。 PDF 1.5) よ り 小 さ な テキス ト サイ ズで、 それを含むテキス ト 行の高 さ の中に、 よ り 小 さ な
2 行 と し て組版 さ れ、 それが参照するベース テキス ト に後続 し て (イ ン ラ イ ンに) 配置 さ れる、 コ
メ ン ト または注釈。 WP ・ WT ・ WP の並び 1 個を子に持つ必要があ り ます。

WT (割注テキス ト 。 PDF 1.5) 割注 コ メ ン ト の、 2 行 と し て組版 さ れ、 それを囲 う WP 要素の間に配置


さ れる、 よ り 小 さ なサイ ズのテキス ト 。
WP (割注約物。 PDF 1.5) WT 要素の中の内容を囲 う 約物

リ ス ト 構造種別
L ( リ ス ト 。 ブ ロ ッ ク レ ベルかイ ン ラ イ ン レ ベル) 意味的に互いに関連 し ている項目の並び
LI ( リ ス ト 項目) リ ス ト の個々の メ ンバーのための内容
LBody ( リ ス ト 本体) リ ス ト 項目の内容本体

表構造種別 (表は自動的に タ グ付けする こ と も可能です。 317ページ 「11.2.1 自動表 タ グ付け」 参照)

Table (ブ ロ ッ ク レ ベルかイ ン ラ イ ン レ ベル) 長方形セル群の 2 次元論理構造。 複雑な下位構造を含む こ


と も あ り ます
TR (表行) 表ヘ ッ ダーセル (TH) 群か表デー タ セル (TD) 群の表行

TH (表ヘ ッ ダーセル) 表の 1 個ない し 複数の表行、 または列、 ま たは表行 と 列を記述する表ヘ ッ ダー


セル。
TD (表デー タ セル) 表の内容の一部であ るデー タ を内容 と する表セル
THead (表ヘ ッ ダー行グループ : PDF 1.5) 表のヘ ッ ダーを成す TR 要素のグループ

TBody (表本体行グループ : PDF 1.5) 表の本体部を成す TR 要素のグループ


TFoot (表フ ッ タ ー行グループ : PDF 1.5) 表の フ ッ タ ーを成す TR 要素のグループ

キ ャ プ シ ョ ン構造種別 (グループ化レ ベルかブ ロ ッ ク レ ベル)


Caption (PDF 2.0。 PDF 1.5 では表 と リ ス ト に対 し てのみ可) 表 ・ リ ス ト ・ 図な ど要素を説明する短いテキ
スト

図 ・ 式構造種別 (グループ化レ ベルかブ ロ ッ ク レ ベルかイ ン ラ イ ン レ ベル)


Figure グ ラ フ ィ カルな内容
Formula 数式 ・ 化学式な ど式。 この種別は、 内容要素全体を式 と し て識別 し ます。

ページ装飾構造種別 (グループ化レ ベルかブ ロ ッ ク レ ベルかイ ン ラ イ ン レ ベル)


Artifact (PDF 2.0) ページ装飾。 実のページ内容に対 し て こ う 呼ばれます (Section 12.1.6, »Artifacts«, page
299 を参照)。 ページ装飾は構造ツ リ ーの要素 と し ては PDF 2.0 でのみ使用で き ます。 ページ装飾
はマー ク付き内容 と し てはどのバージ ョ ンの PDF で も 使用で き ます。 構造ツ リ ー内ではページ装
飾は、 他の構造要素を コ ン テキス ト と し て必要 と する本文外の内容のために使用で き ます。 た と
えば行番号です。 こ の種別は注釈を ページ装飾 と し て タ グ付けするに も必要です。

11.1 タ グ付き PDF の基礎 301


表 11.1 タ グ付き PDF 内の標準種別 ( タ グ) と 、 PDFlib に よ っ て追加 さ れた擬似種別
構造種別 説明

擬似構造種別
Artifact 直接マー ク 付き内容 と し てのページ装飾。 実のページ内容に対 し て こ う 呼ばれます (309 ページ
「11.1.6 ページ装飾」 を参照)。
ASpan (ア ク セシ ビ リ テ ィ ースパン。 PDF には Span と し て書き込まれますが、 イ ン ラ イ ン レ ベル構造種
別 Span と は区別する必要があ り ます) 構造要素に属 し ない、 あ るいは構造要素の一部分である よ
う な内容に対 し て、 ア ク セ シ ビ リ テ ィ ー特性群を紐付けます。 こ の ASpan 擬似要素は、 Alt ・
ActualText ・ Lang ・ E と い っ たア ク セ シ ビ リ テ ィ ー属性を持っ た Span と し て書き込まれます。
ASpan は、 いかな る構造要素 と も紐付き ません。

ReversedChars 右書き用字系の中の、 反転 し たキ ャ ラ ク タ ー群によ る テキス ト を指定。

Clip マー ク さ れた切 り 抜き列を指定。 こ れは、 ク リ ッ ピ ン グパス ま たはテキス ト 表現モー ド 7 のテキ


ス ト のみを内容 と する列であ り 、 目に見え る グ ラ フ ィ ッ ク または PDF_save( )/PDF_restore( ) を一
切含みません。

通常要素 と 直接要素の違い たいていの構造要素は、 対応す る テ キ ス ト か グ ラ フ ィ ッ ク


を マー ク ア ッ プ し 、 かつ文書構造ツ リ ー内へ対応す る エ ン ト リ ーを追加す る こ と に よ っ
て、 PDF へ出力 さ れます。 こ の よ う な要素は通常要素を呼ばれ、 Acrobat の タ グペーンの
中の構造ツ リ ーの中に表示 さ れます。
こ れに対 し 、 マー ク 付 き 内容のみか ら 成 り 、 構造ツ リ ー内にエ ン ト リ ーを持た ない要
素 と い う も の も あ り ます。 こ の よ う な要素は Acrobat の タ グペーンに表示 さ れません。 こ
の よ う な直接要素の利点は、 PDF 出力内で必要な スペース が少ない点です。 構造種別のな
かには、 direct オプシ ョ ン を用いてその ス テー タ ス を変え る こ と がで き る も のがあ り ます
(デフ ォ ル ト は true)。 通常の構造要素 と 直接要素 と の比較を表 11.2 に示 し ます。 PDF 2.0
では直接要素には他に も ネ ス テ ィ ン グ規則が課 さ れ る ので、 表ではそれ も 示 し てい ま す
(いずれの場合に も 通常の PDF 2.0 のネ ス テ ィ ン グ規則が子要素に課せ ら れます)。
デフ ォ ル ト で直接な要素が別の直接でない要素を子に持っ てい る 場合にはオプシ ョ ン
direct=false が必須です。 た と えば Reference が Link を子に持っ てい る 場合が こ れにあ た り
ます。

表 11.2 通常構造要素 と 直接構造要素


通常構造要素 (direct=false) 直接構造要素 (direct=true)

対象要素 その他すべての構造種別 Code ・ BibEntry ・ Em ・ FENote ・


Note ・ Quote ・ Reference ・ Span ・
Strong ・ Sub
BibEntry ・ TOCI ・ Note の子 と し
て Lbl
疑似ア イ テム Artifact ・ ASpan ・
ReversedChars ・ Clip

構造ツ リ ーの一部であ る ○ ×

ページ境界を また ぐ こ と が可能 ○ ×

302 第 11 章 : タ グ付き PDF と PDF/UA


表 11.2 通常構造要素 と 直接構造要素
通常構造要素 (direct=false) 直接構造要素 (direct=true)

他の要素で割 り 込む こ と が可能 ○ ×

PDF_activate_item( ) で有効にする こ と が ○ ×
可能

子要素に対する ネス テ ィ ング規則 通常 ・ 直接要素を内容 と する こ と その親が直接要素を内容 と する こ


が可能 と が可能な場合に限 り 、 直接要素
のみを内容 と する こ と が可能

空の構造要素 一般的には、子要素 も 内容ア イ テ ム も 子に持た ない構造要素は避け る べ き


です。 し か し 、 以下の例の よ う に、 こ の規則にはい く つかの例外があ っ て、 そ こ では空の
構造要素が、 何 ら かの他の構造の中にあ っ て、 意味的な役割を伝え ます :
> 空の TD 要素は空の表セルに対 し て必要です。PDFlib の自動表組版機能は こ の規則に従
い ます (317 ページ 「11.2.1 自動表 タ グ付け」 参照)。
> 空の LI 要素を リ ス ト 構造の中で。
> 空の Span 要素で、 空白キ ャ ラ ク タ ーに対す る ActualText を提供。
> 空の Div 要素で、 メ タ デー タ プ ロ パテ ィ ま たは属性を提供。
> 空の Document 要素で、 何 も 内容がない 1 ページ文書を表す。
> 空の NonStruct 要素で、 任意の タ グセ ッ ト を含め る 。

プ ロ グ ラ ミ ン グス コ ープ と ページ境界 多 く の構造要素は、 ページ ス コ ープ内でのみ作


成で き ます。 グループ化要素は、 複数のページにわた る 場合があ り 、 文書ス コ ープ内で も
作成で き ます。 疑似ア イ テ ム と 直接ア イ テ ムは、 ページ を終了ま たは一時停止す る 前に閉
じ る 必要が あ り ま す。 テ ン プ レ ー ト ス コ ープでの タ グ付け操作はサポー ト さ れてい ま せ
ん。

11.1.3 PDF 1.7 の構造要素ネ ス テ ィ ン グ規則


PDF 1.x では、 PDF が文書全体を内容 と し てい る 場合には Document 要素を構造ツ リ ーの
ルー ト と し て使用す る べ き です。PDF が文書の断片を内容 と し てい る 場合には Part か Sect
をルー ト 要素 と し て使用す る べ き です。 ルー ト 要素は PDF_begin_document( ) の tag オプ
シ ョ ン を用いて与え る こ と も で き て便利です。構造要素 ヒ エ ラ ルキーに対する PDF 1.7 の
タ グネ ス テ ィ ン グ規則を表 11.3 に挙げます。

11.1.4 PDF 2.0 の構造要素ネ ス テ ィ ン グ規則


PDF 2.0 の タ グネ ス テ ィ ン グ規則 PDF 2.0 は、 親子の組み合わせの う ち どれが許 さ れど
れが禁止かについて厳 し い掟を課 し てい ます。 PDF 2.0 の タ グネ ス テ ィ ン グ規則を表 11.4
に挙げ ます。 「内容ア イ テ ム」 列は、 要素がページ内容 (テ キ ス ト ・ 画像 ・ ベ ク ト ル画像

11.1 タ グ付き PDF の基礎 303


表 11.3 PDF_begin_item( ) と 、 さ ま ざ ま な関数の tag/begintag オプ シ ョ ンに対する PDF 1.7 の タ グネス テ ィ ング規

ア イ テム 規則

内容ア イ テム 以下の構造種別は、 ページ内容、 すなわち テキス ト か画像かベ ク ト ルグ ラ フ ィ ッ ク を子に


持て ます :
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

グループ化要素 グループ化要素は、 内容ア イ テムか ASpan か ILSE を子に持っ てはいけません。 すなわち、


内容が作成で き る前に、 BLSE が作成 さ れる必要があ り ます :
Document・Part・Art・Sect・Div・BlockQuote・Caption・TOC・TOCI・Index・
NonStruct・Private
以下の要素に対 し ては、 グループ化要素の子であ る場合、 オプ シ ョ ン Placement=Block を
推奨 し ます : Figure・Formula・Form・Link・Annot

ブ ロ ッ ク レ ベル 以下のブ ロ ッ ク レ ベル要素は、 内容ア イ テムを子に持っ てはいけません。 すなわち、 内容


要素 が作成で き る前に、 然るべき グループ化要素か BLSE が作成 さ れる必要があ り ます :
L・LI・Table・TR・THead・TFoot・TBody
厳格規則 : P 要素はグループ化要素を子に持て ません。

擬似 ・ イ ン ラ イ ン 擬似要素 (すなわち Artifact・ASpan・ReversedChars・Clip) と 、 以下の ILSE は、


要素 direct=true の場合には子孫を一切持っ てはいけません :
Code・BibEntry・Note・Quote・Reference・Span
ただ し これ らの要素は、 direct=false の場合には子を持つ こ と がで き ます。
擬似要素 と 、 以下の ILSE の中には、 direct=true の場合にはページ装飾を作成で き ませ
ん : Span・Quote・Note・Reference・BibEntry・Code

表要素 Table 要素は、 1 個ない し 複数の TR 要素を、 あ るいは 1 個のオプ シ ョ ナルな THead に続け
てその後の 1 個ない し 複数の TBody 要素 と 1 個のオプ シ ョ ナルな TFoot と を、 子に持て ま
す。 TBody は Table の唯一の子であ るべき ではあ り ません。 こ れに加えて 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 は、 Annot ・ LI ・ Link ・ TOCI ・ BibEntry ・ Note のみを親 と する こ と がで き ます。

304 第 11 章 : タ グ付き PDF と PDF/UA


表 11.3 PDF_begin_item( ) と 、 さ ま ざ ま な関数の tag/begintag オプ シ ョ ンに対する PDF 1.7 の タ グネス テ ィ ング規

ア イ テム 規則

インタ ラ クテ ィ ブ 以下の構造種別は、 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 を子に持て ますが、 それ以外の構造種別を子に持っ てはいけません。

PDF 2.0の整合性規 まれに し か使われない PDF 1.7 の親子 タ グ組み合わせに対 し て、 PDF 2.0 のネス テ ィ ング規
則 則 と の整合性のために、 以下のネス テ ィ ング規則が導入 さ れています :
非互換的変更 (ネス テ ィ ング規則が厳 し く な っ た も の) :
> RB ・ RT ・ RP は Ruby の子にのみなれる
> WT ・ WP は Warichu の子にのみなれる
> Document は Caption を子に持てない
> Caption は Document か Caption を子に持て ない
> H ・ H1 な どは Document か Part か Div を子に持てない
> TH ・ TD は Document か Caption を子に持てない
> direct=true に よ る イ ン ラ イ ン レ ベル要素は L か Table か Document を子に持てない

と 、 イ ン タ ラ ク テ ィ ブ要素のための OBJR) を子に持つ こ と が許 さ れてい る か ど う か を表


し てい ます。

表 11.4 PDF_begin_item( ) と 、 さ ま ざ ま な関数の tag/begintag オプ シ ョ ンに対する PDF 2.0 の タ グネス テ ィ ング規


則。 特記な き限 り 、 子要素は親要素の中に何回で も出現で き ます。
内容
アイ
親要素 許 さ れる子要素 テム

構造ツ リ ーのルー 構造ツ リ ーのルー ト は、 Document 要素を 1 つだけ子に持つ必要があ り ます。 また、 ―


ト 1 個の NonStruct 要素を子に持つ こ と も で き ます。 ルー ト は、 PDF_begin_document( )
の tag オプ シ ョ ン を用いて与え る こ と も で き て便利です。

Document ・ Document ・ DocumentFragment ・ Part ・ Div ・ Sect ・ Aside ・ NonStruct ・ P ・ H1・…・ ―


DocumentFragment H1・Title・Link・Annot・Form・L・Table・Figure・Formula・Artifact

Part こ の Part 要素の Part で ない最も 近い祖先要素の子 と し て許 さ れているすべての構 ―


造種別。
Div こ の Div 要素の Div で ない最も近い祖先要素の子 と し て許 さ れているすべての構造 ―
種別。
Sect DocumentFragment ・ Part ・ Div ・ Sect ・ Aside ・ NonStruct ・ P ・ H1 ・ … ・ H1 ・ Title ・ ―
Lbl ・ Link ・ Annot ・ Form ・ FENote ・ L ・ Table ・ Caption ・ Figure ・ Formula ・
Artifact

Aside Document ・ DocumentFragment ・ Part ・ Div ・ Sect ・ NonStruct ・ P ・ H1 ・ … ・ H1 ・ ○


Lbl ・ Link ・ Annot ・ Form ・ FENote ・ L ・ Table ・ Caption1 ・ Figure ・ Formula ・
Artifact

11.1 タ グ付き PDF の基礎 305


表 11.4 PDF_begin_item( ) と 、 さ ま ざ ま な関数の tag/begintag オプ シ ョ ンに対する PDF 2.0 の タ グネス テ ィ ング規
則。 特記な き限 り 、 子要素は親要素の中に何回で も出現で き ます。
内容
アイ
親要素 許 さ れる子要素 テム
NonStruct この NonStruct 要素の NonStruct でない最も近い祖先要素の子 と し て許 さ れている ―
すべての構造種別。
Title Part ・ Div ・ Aside ・ NonStruct ・ P ・ Lbl ・ Em ・ Strong ・ Span ・ Link ・ Annot ・ Form ・ ○
Ruby ・ Warichu ・ L ・ Table ・ Caption1 ・ Figure ・ Formula ・ Artifact
この要素がグループ化要素 と し て使用 さ れている場合には、 以下の要素 も子 と し て ×
許 さ れますが、 内容ア イ テム と 相互排他です : FENote
Sub NonStruct ・ Lbl ・ Em ・ Strong ・ Span ・ Link ・ Annot ・ Form ・ Ruby ・ Warichu ・ L ・ ○
Figure ・ Formula ・ Artifact

P NonStruct ・ Sub ・ Lbl ・ Em ・ Strong ・ Span ・ Link ・ Annot ・ Form ・ Ruby ・ Warichu ・ ○
L ・ Figure ・ Formula ・ Artifact

H1 ・ … ・ H Sect1 ・ NonStruct ・ Sub ・ Lbl ・ Em ・ Strong ・ Span ・ Link ・ Annot ・ Form ・ Ruby ・ ○
Warichu ・ Figure ・ Formula ・ Artifact

Lbl NonStruct ・ Sub ・ Em ・ Strong ・ Span ・ Link ・ Annot ・ Form ・ Ruby ・ Warichu ・ ○
Figure ・ Formula ・ Artifact

Em ・ Strong ・ Span NonStruct ・ Sub ・ Lbl ・ Em ・ Strong ・ Span ・ Link ・ Annot ・ Form ・ Ruby ・ Warichu ・ ○
Figure ・ Formula ・ Artifact

Link Div ・ Sect ・ NonStruct ・ Sub ・ Lbl ・ Em ・ Strong ・ Span ・ Annot ・ Ruby ・ Warichu ・ ○
Figure ・ Formula ・ Artifact
この要素がグループ化要素 と し て使用 さ れている場合には、 以下の要素 も子 と し て ×
許 さ れますが、 内容ア イ テム と 相互排他です :
DocumentFragment ・ Part ・ Aside ・ P ・ Hn ・ H ・ Title ・ Form ・ FENote ・ L ・ Table ・
Caption

Annot Div ・ Sect ・ NonStruct ・ Sub ・ Lbl ・ Em ・ Strong ・ Span ・ Link ・ Annot ・ Ruby ・ ○
Warichu ・ Figure ・ Formula ・ Artifact
この要素がグループ化要素 と し て使用 さ れている場合には、 以下の要素 も子 と し て ×
許 さ れますが、 内容ア イ テム と 相互排他です :
DocumentFragment ・ Part ・ Aside ・ P ・ Hn ・ H ・ Title ・ Form ・ FENote ・ L ・ Table ・
Caption

Form Div ・ NonStruct ・ Lbl ・ Caption1 ・ Artifact ○


この要素がグループ化要素 と し て使用 さ れている場合には、 以下の要素 も子 と し て ×
許 さ れますが、 内容ア イ テム と 相互排他です :
Part ・ L ・ Table ・ Figure ・ Formula

Ruby NonStruct ・ RB ・ RT ・ RP ○

Warichu NonStruct ・ WT ・ WP ○

RB ・ RT ・ RP ・ WT ・ NonStruct ・ Sub ・ Em ・ Strong ・ Span ・ Link ・ Annot ・ Form ・ Artifact ○


WP
FENote Part ・ Div ・ Sect ・ Aside ・ NonStruct ・ P ・ Sub ・ Lbl ・ Em ・ Strong ・ Span ・ Link ・ ○
Annot ・ Form ・ Ruby ・ Warichu ・ L ・ Table ・ Figure ・ Formula ・ Artifact
この要素がグループ化要素 と し て使用 さ れている場合には、 以下の要素 も子 と し て ×
許 さ れますが、 内容ア イ テム と 相互排他です :
DocumentFragment ・ Caption

306 第 11 章 : タ グ付き PDF と PDF/UA


表 11.4 PDF_begin_item( ) と 、 さ ま ざ ま な関数の tag/begintag オプ シ ョ ンに対する PDF 2.0 の タ グネス テ ィ ング規
則。 特記な き限 り 、 子要素は親要素の中に何回で も出現で き ます。
内容
アイ
親要素 許 さ れる子要素 テム
L NonStruct ・ L ・ LI ・ Caption1 ・ Artifact ―
LI Div ・ NonStruct ・ Lbl ・ FENote ・ LBody ・ Artifact ○
1
LBody Part ・ Div ・ Sect ・ Aside ・ NonStruct ・ P ・ H1 ・ … ・ H ・ Sub ・ Em ・ Strong ・ Span ・ ○
Link ・ Annot ・ Form ・ Ruby ・ Warichu ・ FENote ・ L ・ Table ・ Caption1 ・ Figure ・
Formula ・ Artifact

Table NonStruct ・ TR ・ THead1 ・ TBody ・ TFoot1 ・ Caption1 ・ Artifact ―


TR NonStruct ・ TH ・ TD ・ Artifact ―
1
TH ・ TD Div ・ Sect ・ NonStruct ・ P ・ H1 ・ … ・ H ・ Lbl ・ Em ・ Strong ・ Span ・ Link ・ Annot ・ ○
Form ・ Ruby ・ Warichu ・ FENote ・ L ・ Table ・ Figure ・ Formula ・ Artifact

THead ・ TBody ・ NonStruct ・ TR ・ Artifact ―


TFoot

Caption Part ・ Div ・ Sect ・ Aside ・ NonStruct ・ P ・ H1 ・ … ・ H1 ・ Sub ・ Lbl ・ Em ・ Strong ・ ○


Span ・ Link ・ Annot ・ Form ・ Ruby ・ Warichu ・ FENote ・ L ・ Table ・ Figure ・ Formula ・
Artifact
こ の要素がグループ化要素 と し て使用 さ れている場合には、 以下の要素 も子 と し て ×
許 さ れますが、 内容ア イ テム と 相互排他です : DocumentFragment

Figure ブ ロ ッ ク要素 と し て使用 さ れる場合 : Part ・ Div ・ Sect ・ Aside ・ NonStruct ・ P ・ ○


H1 ・ … ・ H1 ・ Lbl ・ Em ・ Strong ・ Span ・ Link ・ Annot ・ Form ・ Ruby ・ Warichu ・
FENote ・ L ・ Table ・ Caption1 ・ Figure ・ Formula ・ Artifact

Formula Part ・ Div ・ Aside ・ NonStruct ・ P ・ H1 ・ … ・ H1 ・ Sub ・ Lbl ・ Em ・ Strong ・ Span ・ ○


Link ・ Annot ・ Form ・ Ruby ・ Warichu ・ FENote ・ L ・ Table ・ Caption1 ・ Figure ・
Formula ・ Artifact
こ の要素がグループ化要素 と し て使用 さ れている場合には、 以下の要素 も子 と し て ×
許 さ れますが、 内容ア イ テム と 相互排他です : Sub

Artifact (すべての構造種別。 H ・ Caption は 1 回だけ出現で き ます。) ○

1. この要素は親要素の中に 1 回だけ出現で き ます。

PDF 2.0 の さ ら な る タ グネ ス テ ィ ン グ規則 2 つの構造種別の組み合わせを制限す る こ の


主要な タ グネ ス テ ィ ン グ規則のほかに も 、 PDF 2.0 は、 表 11.5 の通 り 、 シ ンプルな親子関
係だけでない制限を課 し てい ます。 PDF 2.0 の必須事項は PDFlib に よ っ て強制 さ れます
が、 推奨事項は強制 さ れません。

表 11.5 PDF_begin_item( ) と 、 さ ま ざ ま な関数の tag/begintag オプ シ ョ ンに対する PDF 2.0 の さ ら な る タ グネス


テ ィ ング規則
構造種別 要請

以下のPDF 2.0の必須規則はPDFlibによ っ て強制 さ れます :

Document ・ それぞれの Document か DocumentFragment 構造要素の中では、 見出 し 構造要素はすべてが


DocumentFragment Hn かすべてが H のど ち ら かであ る必要があ り ます。

Annot 1 つの Annot 構造要素の中の注釈はすべて同 じ 注釈種別であ る必要があ り ます。 Annot を リ


ン ク 注釈かフ ォ ーム フ ィ ール ド に対 し て使用 し てはいけません。

11.1 タ グ付き PDF の基礎 307


表 11.5 PDF_begin_item( ) と 、 さ ま ざ ま な関数の tag/begintag オプ シ ョ ンに対する PDF 2.0 の さ ら な る タ グネス
テ ィ ング規則
構造種別 要請
Form フ ォ ーム フ ィ ール ド は Form か Artifact 要素の中に入れる必要があ り ます。

Link 1 つの Link 要素は リ ン ク注釈を 1 つだけ子に持つ こ と がで き、 複数は持て ません。

Ruby 1 つの Ruby 要素は、 1 つの RB 要素を子に持つ必要があ り 、 その後に 1 つの RT 要素か並び


RP ・ RT ・ RP を持つ必要があ り ます。

Warichu 1 つの Warichu 要素は並び WP ・ WT ・ WP を子に持つ必要があ り ます。

Caption Caption 要素はその親要素の中の最初か最後の要素である必要があ り ます。 キ ャ プ シ ョ ン


の数は 1 個を超え る こ と はで き ません。

H、 それ と も 1 つの Document か DocumentFragment 要素 と と も に使用で き るのは、 番号な し の見出 し 要


H1 ・ H2 ・ … 素 H (強い構造化) か番号付きの見出 し 要素 H1 ・ H2 な ど (弱い構造化) のど ち らかであ っ
て、 両者を混在 さ せる こ と はで き ません。
以下のPDF 2.0の推奨規則はPDFlibに よ っ て強制 さ れません :
H H 要素はつねにその親要素の中の最初の構造要素であ るべき です。

Title Title 要素はその親である グループ化要素の中で 1 回だけ出現するべき で、 かつそのグ


ループ化要素の中の内容の先頭か先頭付近に出現するべき です。
FENote テキス ト が脚注か後注である と 見な さ れる ためには、 それを囲 っ ている内容か ら脚注か後
注への参照があ るべき です。 そのよ う な参照を実現するには、 Link 要素を使用 し てその リ
ン ク 注釈の中の構造移動先を通 じ て参照するか、 あ るいは構造要素内で ref オプ シ ョ ン を
使用 し ます。
Sub Sub 要素が使用 さ れる場合には、 その Sub 要素の親である ブ ロ ッ ク レ ベル要素の中の他の
内容 も すべて Sub 構造要素群で囲われているべき です。

11.1.5 カ ス タ ム構造種別 ・ ロ ールマ ッ プ ・ カ ス タ ム タ グセ ッ ト


表 11.1 に挙げた標準構造種別に加え て、 カ ス タ ム構造種別名 も 使用する こ と が可能です。
カ ス タ ム構造種別は通常、構造種別名を ロ ーカ ラ イ ズ し た り (た と えば ド イ ツ語 Abbildung
が Figure にマ ッ プ)、 アプ リ ケーシ ョ ン独自の種別名で作業 し た り (た と えば Normal が
P にマ ッ プ) す る ために用い ら れます。 カ ス タ ム構造種別を含んだ文書の再利用を可能に
す る ためには、 そのカ ス タ ム名を、 標準構造種別の集合の中の、 それ と 正確に同等、 ない
し おおむね同等の も のへマ ッ プす る 必要があ り ます。 ま た、 標準構造種別を、 その意味付
け を変更す る ために他の標準種別へ再マ ッ プす る こ と も 可能です。 カ ス タ ム要素種別は、
イ ン ラ イ ン要素・擬似要素へはマ ッ プで き ません。標準種別への要素マ ッ ピ ン グは rolemap
文書オプシ ョ ンで実現で き ます。 た と えば
p.begin_document("tagged.pdf",
"tagged=true lang=en rolemap={ {Heading H1} {Subhead H2} {Paragraph P} }");

カ ス タ ム構造種別は、 それが ロ ールマ ッ プ さ れた、 対応する 標準構造種別のネ ス テ ィ ン グ


規則に従 う 必要があ り ます。

Acrobat におけ る ロ ールマ ッ プ ロ ールマ ッ プは、 Acrobat DC で以下の よ う に表示 ・ 編


集で き ます :

308 第 11 章 : タ グ付き PDF と PDF/UA


> 「表示」 → 「表示切 り 替え」 → 「ナビゲーシ ョ ンパネル」 → 「 タ グ」 を選択 し 、 「 タ グ」
パネルの上端にあ る メ ニ ュ ーボ タ ン を ク リ ッ ク し て、 ド ロ ッ プダ ウ ン リ ス ト か ら 「ロー
ルマ ッ プ を編集」 を選択

PDF 2.0 で タ グセ ッ ト PDF 2.0 は、 2 つの定義済みの タ グ セ ッ ト を サポー ト し てお り 、


pdftagset=1.7 か pdftagset=2.0 かで選択で き ます。 こ れ ら の定義済みの タ グセ ッ ト のほか
に、 カ ス タ ム の タ グ セ ッ ト を定義す る こ と も 可能です。 こ れ ら は統一資源識別子 (URI)
の形式の名前空間に よ っ て識別 さ れます。 カ ス タ ムの タ グセ ッ ト は tagsets 文書オプシ ョ
ン内で定義する 必要があ り ます。 各 タ グセ ッ ト に対 し て、 対応す る 名前空間 URI と ロ ール
マ ッ プを与え る 必要があ り ます。 例 :
tagsets={
{namespace={http://www.pdflib.com/tagsets/foo} rolemap={{MyTag P} ...} }
{namespace={http://www.pdflib.com/tagsets/bar} rolemap={...} }
}

こ のや り 方でカ ス タ ム タ グセ ッ ト が宣言 さ れてい る 前提で、 対応す る タ グ を、 PDF_begin_


item( ) な ど タ グ付け操作に与え る こ と がで き ます :
tag={tagname=MyTag namespace={http://www.pdflib.com/tagsets/foo}}

11.1.6 ページ装飾
実質的な内容 と ページ装飾 ページの さ ま ざ ま な内容は、 以下の カ テ ゴ リ ーのいずれか
にあ ては ま り ます :
> 実質的な内容。 文書作成者に よ っ て、 その文書の意味を伝え る ために作成 さ れてい ま
す。 その文書の論理構造ツ リ ーは、 実際の内容を成すオブジ ェ ク ト 群を記述 し てい る
ほか、 注釈 も 含む場合があ り ます。
> 実質的なページ内容に貢献 し てお ら ず、 ページネーシ ョ ン ま たは レ イ ア ウ ト 目的のた
めに作成 さ れてい る グ ラ フ ィ ッ ク ま たはテ キ ス ト オブジ ェ ク ト を、 ページ装飾 と いい
ます。 ページ装飾は、 構造ツ リ ー内に含 ま れてお ら ず、 ス ク リ ーン リ ーダーに よ っ て
読み上げ ら れません。

ページ装飾 を 標識す る こ と は、 ア ク セ シ ビ リ テ ィ ー を 向上 さ せ る た めに強 く 推奨 さ れ、


PDF/UA-1 では必須です。 典型的なページ装飾は、 反復 さ れ る ヘ ッ ダー ・ フ ッ タ ー、 ペー
ジ番号、 背景画像、 その他各ページ上で反復 さ れ る ア イ テ ムです。
PDF 1.7 ではページ装飾は直接要素 と し てのみ表現で き ます。すなわちそれ ら は構造ツ
リ ーに含まれません。 PDF 2.0 ではページ装飾は構造ツ リ ーの一部にな る こ と も で き ます
(オプシ ョ ン direct=false)。 PDF 1.7 の直接ページ装飾を異な り 、 PDF 2.0 の構造ツ リ ー内
のページ装飾は コ ン テ キ ス ト (構造ツ リ ー内の他のエン ト リ ー群) を持っ てい ます。 こ れ
は行番号な ど に対 し て意味を持ち ます。 構造ツ リ ー内のページ装飾は、 注釈にページ装飾
と し て タ グ付けす る 場合に も 必要です。

Acrobat におけ る ページ装飾 ペー ジ 装飾は、 Acrobat DC で以下の方式の いずれ か で


チ ェ ッ ク で き ます :
> 「ツール」 → 「ア ク セシ ビ リ テ ィ ー」 → 「読み上げ順序」 を選択す る と 、 ページ上の内
容要素を表示ま たは編集で き ます。 ページ装飾は、 Acrobat の 「読み上げ順序」 ツール
内では 「背景」 と 呼ばれてい ます。 こ れは構造要素 と は異な り 、 こ の ツールを ア ク テ ィ
ブに し た際にふち と タ グ名を用いて視覚化 さ れません。

11.1 タ グ付き PDF の基礎 309


> ページ装飾を識別す る には、 「表示」 → 「表示切 り 替え」 → 「ナ ビゲーシ ョ ンパネル」
→ 「 コ ン テ ン ツ」 を選択 し ます。 「 コ ン テ ン ツ」 パネルには、 すべてのページ内容が、
それぞれの構造種別名 ま たは 「ページ装飾」 のいずれか適切なほ う と と も に一覧表示
さ れ ます。 ページ装飾は読み上げ ら れ ませんので、 ページ上に、 対応す る 番号付 き ブ
ロ ッ ク はあ り ません。 ただ し 、 こ の一覧内のページ装飾を ク リ ッ ク す る と 、 その対応
す る 、 ページ上の内容要素がハ イ ラ イ ト さ れます。
> ページ装飾を検索 : 「表示」 → 「表示切 り 替え」 → 「ナビゲーシ ョ ンパネル」 → 「 タ グ」
を選択 し 、 「 タ グ」 パネルの上端にあ る メ ニ ュ ーボ タ ン を ク リ ッ ク し て、 「検索 ...」 の
後、 ド ロ ッ プダ ウ ン リ ス ト か ら 「ページ装飾」 を選択 し ます。 ページ装飾は文書構造
の一部分ではあ り ませんので、 タ グナ ビ ゲーシ ョ ンパネルに も 順序パネルに も 、 対応
す る エン ト リ ーはあ り ません。
> 「表示」 → 「読み上げ ...」 を有効にす る と 、 Acrobat がページ上の構造要素を読み上げ る
こ と がで き る よ う にな り ます。 ページ装飾は読み上げ ら れません。

内容を ページ装飾 と し て指定 ページ装飾は、 PDFlib で、 PDF_begin_item( ) 内で Artifact


タ グ名で指定す る こ と がで き ます :
id = p.begin_item("Artifact", "");

あ る いは、 ページ装飾は、 短縮 タ グ付けで、 すなわち さ ま ざ ま な関数の tag オプシ ョ ンで


指定す る こ と も で き ます :
p.fit_textline(text, x, y, "tag={tagname=Artifact}");

ページ装飾は、 BLSE がカ レ ン ト でア ク テ ィ ブでない と き にのみ作成す る こ と を推奨 し ま


す。 し か し 、 アプ リ ケーシ ョ ンに よ っ ては こ れはつねに可能 と は限 り ませんので、 ページ
装飾が作成 さ れ る 際には、 PDFlib はカ レ ン ト でア ク テ ィ ブな要素を自動的に中断 し 、 その
ページ装飾の後でそれを再びア ク テ ィ ブ化 し ます。なお、タ グネ ス テ ィ ン グ規則 (303 ペー
ジ 「11.1.3 PDF 1.7 の構造要素ネ ス テ ィ ン グ規則」 参照) は、 ILSE 内にページ装飾を許容
し ません。

ページ装飾を分類 非実質的なページ内容は、 Artifact 擬似 タ グで識別 し 、 artifacttype オ


プシ ョ ンの以下のキーワ ー ド の う ちのいずれか 1 つに従っ て分類する 必要があ り ます :
> Pagination (ページネーシ ョ ン) ページ装飾 : ラ ン ニ ン グヘ ッ ド やページ番号 と い っ た
ページ機能群。 ページネーシ ョ ンページ装飾は、 artifactsubtype オプシ ョ ン と 、 キー
ワー ド Header ・ Footer ・ Watermark の う ちのいずれか 1 つで さ ら に分類で き ます。
> Layout (レ イ ア ウ ト ) ページ装飾 : 罫線や表シ ェ ーデ ィ ン グ と い っ た タ イ ポグ ラ フ ィ ー
ま たはデザ イ ン要素。
> Page (ページ) ページ装飾 : 補助、 た と えば ト ン ボやカ ラ ーバーな ど。
> Background (背景) ページ装飾 : ページの幅ま たは高 さ い っぱいに、 あ る いは構造要
素の寸法いっぱいに伸び る 画像ま たは色付 き 領域。

ページ ネーシ ョ ン ページ装飾 と 背景ページ装飾では、 ど のページ辺な い し ページ辺群


(Top/Bottom/Left/Right)にそのページ装飾が付着 し てい る か を指定する Attachedオプシ ョ
ンが使え ます。
以下の例は、 下位種別 Header を持つページネーシ ョ ンページ装飾を作成 し ます :
id = p.begin_item("Artifact",
"artifacttype=Pagination artifactsubtype=Header Attached={Top Left}");

310 第 11 章 : タ グ付き PDF と PDF/UA


自動ページ装飾 タ グ付け すべてのページ内容は、 構造要素かページ装飾のいずれか と
し て タ グ付け さ れてい る べ き ですので、 PDFlib は自動的に、 あ る 種のグ ラ フ ィ ッ カルな要
素群に タ グ 付け を 行い ま す。 以下の装飾要素は、 タ グ 付 き PDF モー ド では自動的に、
artifacttype= Layout を持つ Artifact と し て タ グ付け さ れます :
> ブ ロ ッ ク 装飾 : PDF_fill_*block( ) に よ っ て作成 さ れ る すべての装飾要素、 すなわち
backgroundcolor ・ bordercolor プ ロ パテ ィ に従っ て作成 さ れ る 描線 と 塗 り 。
> 範囲枠装飾 : 範囲枠オプシ ョ ン fillcolor ・ shading ・ strokecolor に従っ て作成 さ れ る 範囲
枠長方形。
> 表装飾 : 自動表 タ グ付けが有効の場合には (317 ページ 「11.2.1 自動表 タ グ付け」 参
照) 、 表の罫線 と 網掛け、 すなわちオプシ ョ ン fill ・ stroke ・ showborder ・ showgrid に
従っ た描線 と 塗 り 。 2 個目以降の表 イ ン ス タ ン ス においては、 header ・ footer ・ caption
オプシ ョ ンに よ っ て生成 さ れた表行 も すべてページ装飾 と し て標識 さ れます。
> テ キ ス ト 行ページ装飾 : leader ・ shadow ・ showborder
> テ キ ス ト フ ロ ーページ装飾 : leader ・ shadow ・ showborder ・ showtabs
> テ キ ス ト 装飾 : underline ・ overline ・ strikeout

すべての タ グ付 き PDF 機能同様、 自動ページ装飾 タ グ付けはページ ス コ ープ内でのみ動


作 し ます。

11.1.7 テキス ト 処理
言語指定 タ グ付 き PDF では、 テ キ ス ト の自然言語は明示的に指定 さ れ る べ き です : こ
れに よ っ て、 ス ク リ ーン リ ーダーがその文書を読み上げ る 際に適切な言語へ切 り 替われ る
よ う にな り ます。 こ の自然言語は、 さ ま ざ ま な レベルで指定する こ と がで き ます :
> PDF_begin_document( ) の lang オプシ ョ ン を、主要言語、すなわちその文書の全体 と し
ての自然言語を指定す る ために設定す る べ き です。 こ の指定は、 ページ内容のみな ら
ず、 し お り や注釈 と い っ た イ ン タ ラ ク テ ィ ブ要素を も カバー し ます。 こ の言語指定は、
PDF_end_document( ) で変更す る こ と も で き ます。 取 り 込んだ PDF 文書に基づいて言
語を選びたい場合な ど に こ れは有用で し ょ う 。
> こ の文書言語は、個別の構造要素について、PDF_begin_item( ) の lang オプシ ョ ンか、さ
ま ざ ま な関数の tag オプシ ョ ン を用いてオーバー ラ イ ド する こ と も で き ます。
> PDF 2.0 では、注釈の自然言語を指定す る ために PDF_create_annotation( ) に も lang オプ
シ ョ ン を与え る こ と が可能です。

テ キ ス ト と し て符号化 さ れなが ら 、 し か し 自然言語の一部分ではない内容、 た と えばプ ロ


グ ラ ミ ン グ コ ー ド 、 音符、 書体サ ン プル、 数式な ど は、 空の言語 コ ー ド を用い る べ き で
す。 例 : lang={ }
ハ イ パーテ キ ス ト 文字列は、 言語を指定す る ための Unicode 言語識別子を含む こ と も
で き ます。 し か し 現在の PDF ビ ュ ーア群は こ れに対応 し てい ません。 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 進表記での例 :

11.1 タ グ付き PDF の基礎 311


001B656E5553001B (=enUS)
001B7A68001B (=zh)
001B6465001B (=de)

Unicode 対応言語では、 こ の 2 個の ASCII キ ャ ラ ク タ ーはま と めて 1 個の Unicode 値 と す


る 必要があ り ます :
\u001B\u6465\u001B (=de)

C 言語では、 こ の 2 個の ASCII キ ャ ラ ク タ ーは ま と めて 1 個の Unicode 値 と す る 必要があ


り ます。 charref=true の場合、 こ の並びは以下の よ う に表現で き ます :
&#x001B;&#x6465;&#x001B; (=de)

単語間を空白キ ャ ラ ク タ ーで区切る 単語は空白キ ャ ラ ク タ ー (U+0020) で区切 る べ き


です。 autospace オプシ ョ ン を用い る と 、 テ キ ス ト 出力関数群の う ちのいずれかへのそれ
ぞれの呼び出 し の後に、 自動的に空白キ ャ ラ ク タ ーを生成 さ せる こ と がで き ます。

ハ イ フ ネーシ ョ ン ハ イ フ ネーシ ョ ン、 すなわち 1 つの単語を行末で 2 つの部分に分割


する こ と は、ハー ド ハ イ フ ン (U+002D) ではな く 、 ソ フ ト ハ イ フ ン キ ャ ラ ク タ ー (U+00AD)
を用いて表現 さ れ る 必要があ り ます。 こ の ソ フ ト ハ イ フ ン キ ャ ラ ク タ ーが用い ら れていれ
ば、 Acrobat は、 テ キ ス ト を検索す る 際に、 ハ イ フ ネーシ ョ ン さ れた単語を正 し く 再結合
(デハ イ フ ネーシ ョ ン) す る こ と がで き ます。 テ キ ス ト が ソ フ ト ハ イ フ ン U+00AD を含ん
でい る と き には、 テ キ ス ト エン ジ ンは、 U+00AD に対する グ リ フ がその フ ォ ン ト 内で得 ら
れ る 場合にはそれを、 そ う でないな ら U+002D を用い ます。 その フ ォ ン ト が U+00AD と
U+002D に対 し て別々のグ リ フ を持っ てい る 場合には、 ソ フ ト ハ イ フ ン U+00AD を テ キ ス
ト 内で使用すれば、 ハ イ フ ネーシ ョ ンのための タ グ付 き PDF の要件を満たすには充分で
す。 こ のシ ンプルなハ イ フ ネーシ ョ ン方式に フ ォ ン ト が対応 し てい る か ど う か をチ ェ ッ ク
す る には以下の コ ー ド 断片を使用 し ます :
gid1 = (int) p.info_font(font, "glyphid", "unicode=0x00AD"); /* ソフトハイフン */
gid2 = (int) p.info_font(font, "glyphid", "unicode=0x002D"); /* ハイフン-マイナス */

if (gid1 != -1 gid2 != -1 && gid1 != gid2)


System.err.println("フォントは別個のソフトハイフングリフを持っています");
else
System.err.println("フォントは別個のソフトハイフングリフを持っていません");

そのフ ォ ン ト が U+00AD に対す る 別個のグ リ フ を持っ ていない (あ る いは別のハ イ フ ネー


シ ョ ン キ ャ ラ ク タ ーが用い ら れてい る ) 場合には、 そのハ イ フ ン を、 U+00AD を内容 と す
る ActualText 属性を持っ た Span か ASpan で タ グ付けする 必要があ り ます(ただ し PDF 1.4
では こ れは可能ではあ り ません) 。 テ キ ス ト フ ロ ーを用いて複数行テ キ ス ト が作成 さ れ る
際には、 こ の ActualText は、 指定 さ れた hyphenchar に自動的に割 り 当て ら れます (かつ
autospace は抑止 さ れます)。
テ キ ス ト 行に対 し て必要な ActualText を付け る こ と は以下の よ う に達成で き ます :
> PDF_fit_textline( ) でオプシ ョ ン tagtrailinghyphen を指定すれば、然る べき ActualText が
付 き 、 かつ autospace が抑制 さ れます。 こ のオプシ ョ ンのデフ ォ ル ト は U+00AD です
ので、 そのテ キ ス ト がハ イ フ ン と し て U+00AD を用いてい る 場合には、 正 し い タ グ付
けが自動的に行われます。

312 第 11 章 : タ グ付き PDF と PDF/UA


> フ ォ ン ト が U+00AD に対す る 別個のグ リ フ を持っ ていない場合には、然 る べ き フ ォール
バ ッ ク フ ォ ン ト か ら の ソ フ ト ハ イ フ ン を用いて こ れを修正す る こ と も で き ます。 以下
の フ ォ ン ト 読み込みオプシ ョ ン を用い ます :
fallbackfonts={{fontname=AuxiliaryFont forcechars=x00AD}}

> 然 る べ き ActualText を手動で割 り 当て る には以下の よ う に し ます。ただ し 、こ れが必要


なのは、 その フ ォ ン ト が U+00AD と U+002D に対 し て 2 個の別々のグ リ フ を持っ てい
ない場合のみであ る こ と に留意 し て く だ さ い ( こ の コ ー ド は PDF 1.5 以上でのみ動作
し ます。 PDF 1.4 の場合にはオプシ ョ ン direct=false を追加 し て く だ さ い) :
p.set_option("charref=true");
p.fit_textline("-", x, y, "tag={tagname=ASpan ActualText=&#x00AD;}");

11.1.8 代替記述 ・ 置換テキス ト ・ 略語拡張


タ グ付 き PDF は、追加情報な し では容易に読めない画像・ テ キ ス ト のア ク セシ ビ リ テ ィ ー
を向上 さ せる 機能群を提供 し てい ます。

代替記述 (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 属性を用い る


際には、 以下の規則に従 う 必要があ り ます :

11.1 タ グ付き PDF の基礎 313


> Alt と ActualText は、対象構造要素配下の下位 ヒ エ ラ ルキー全体を覆い ますので、その構
造要素の構造 ヒ エ ラ ルキー内のいずれかの祖先がすでに Alt 属性か ActualText 属性を含
んでい る 場合には、 ど ち ら の属性 も 許容 さ れません。
> Alt か ActualText 属性を持つ要素は、内容ア イ テ ムか、1 個ない し 複数の Link 要素を子に
持つ必要があ り ます。 こ の属性が Link 要素に適用 さ れ る 場合には、 それは、 内容ア イ
テ ムか、PDF_create_annotation( ) に よ っ て作成 さ れた 1 個ない し 複数の OBJR 要素を子
に持つ必要があ り ます (320 ページ 「 リ ン ク と その他の注釈種別」 参照)。 そ う でない
と 、 その属性が ど のページ上で読み上げ ら れ る べ き なのか を決定す る こ と が不可能に
な り ます。こ の規則は当該要素自体に適用 さ れます:内容ア イ テ ム を持つ子要素を持っ
ていて も 充分ではあ り ません。

Acrobat におけ る代替 ・ 置換テキス ト 構造要素の Alt ・ ActualText 属性は、 Acrobat DC


で以下の よ う に表示で き ます :
> 「表示」 → 「表示切 り 替え」 → 「ナビゲーシ ョ ンパネル」 → 「 タ グ」 を選択 し 、 ヒ エ ラ
ルキー内の構造要素を右 ク リ ッ ク し て、 「プ ロパテ ィ ...」 を選択す る と 、 オブジ ェ ク ト
プ ロ パテ ィ ダ イ ア ロ グが表示 さ れ ます。 「 タ グ」 タ ブに、 「実際のテキス ト 」 ・ 「代替テ
キス ト 」 属性が表示 さ れてい ます。

略語拡張 (E) 略語 と 頭字語には、 拡張テ キ ス ト を、 tag オプシ ョ ンの E サブオプシ ョ ン


で割 り 当て る こ と がで き ます。 こ の拡張テ キ ス ト は、 ス ク リ ーン リ ーダーが読め る 1 個の
ま る ご と の単語ない し 句か ら 成 る べ き です。 略語が拡張テ キ ス ト を何 も 持た ない場合で
も 、 E 属性を、 テ キ ス ト か ら 読み上げへの変換処理を支援する ために与え る こ と がで き ま
す。 た と えば、 用語 IBM は、 拡張テ キ ス ト I B M (空白キ ャ ラ ク タ ーをは さ んで) を それ
に割 り 当て ら れて持つ こ と がで き ます。
以下の コ ー ド 断片では、 拡張テ キ ス ト Mister が略語 Mr. に割 り 当て ら れてい ます :
p.fit_textline("Mr.", x, y, "tag={tagname=ASpan E={Mister} } ...");

11.1.9 印刷ス ト リ ーム順序 と 論理読み取 り 順序


PDF には、 内容の順序付けについて、 根本か ら 異な る 2 種類の概念があ り ます。 図 11.2
に、 2 段組の メ イ ン テ キ ス ト に、 表 1 個がは さ ま り 、 灰色背景上のサマ リ ー 1 個が挿入 さ
れた、 さ ら にヘ ッ ダー と フ ッ タ ー も あ る サンプルページ を図示 し ます。
PDFlib API メ ソ ッ ド 呼び出 し の順序は、 ページ内容ス ト リ ーム内の PDF テ キ ス ト ・ 描
画演算子の順序 (Acrobat では 「生の印刷ス ト リ ーム順序」 と いい ます) を決定付け ます。
ページ内容は、制御アプ リ ケーシ ョ ンに都合のいい任意の方式で作成 さ れ う る も のですの
で、 こ れはただの技術的な順序付けであ り 、 意味付け上の重要性は必ず し も あ り ません。
こ の印刷ス ト リ ーム順序は Acrobat の 「順序」 ・ 「 コ ン テ ン ツ」 パネルで表示 さ れます。
論理読み取 り 順序は、 人がテ キ ス ト を読む順序です。 こ れは、 ス ク リ ーン リ ーダー と
Acrobat の読み上げ機能に よ っ て用い ら れ る 順序付け を決定 し ます。 こ の論理読み取 り 順
序は、 論理構造ツ リ ーに よ っ て決定 さ れます。 タ グ付き PDF では、 すべての内容が意味
付け上正 し い順序で タ グ付け さ れてい る こ と が必須であ り 、 すなわち、 その構造 ヒ エ ラ ル
キーはそのページ内容を人が読む順に含んでい る 必要が あ り ま す。 正 し い タ グ付けに よ
り 、 ス ク リ ーン リ ーダーが内容を論理順に表現で き る よ う にな り ます。 ページ装飾は構造
ツ リ ーの一部分ではあ り ませんので、 論理読み取 り 順序か ら は除外 さ れてい ます。

Acrobat におけ る読み取 り 順序 と 印刷ス ト リ ーム順序 論理読み取 り 順序は、Acrobat DC


で以下の方式でチ ェ ッ ク で き ます :

314 第 11 章 : タ グ付き PDF と PDF/UA


7 1
1 2
6 5
5 3
2 3 4 6
図 11.2
論理読み取 り 順序 4 7
(左) と 印刷ス ト リ ー
ム順序 (右) 8 8
> 「表示」 → 「表示切 り 替え」 → 「ナビゲーシ ョ ンパネル」 → 「 タ グ」 を選択 し 、 要素の
順序を上か ら 下へチ ェ ッ ク し ます。 こ の順序付けは、 望む読み取 り 順序を正確に反映
し てい る べ き です。
> 「表示」 → 「読み上げ ...」 を有効にす る と 、 Acrobat にページ内容を、 その文書内で指定
さ れてい る 読み取 り 順序で読み上げ さ せ る こ と がで き ます。

「順序」 ・ 「 コ ン テ ン ツ」 パネルでは、 ページ内容を印刷ス ト リ ーム順序で一覧表示 し てい


ます。

内容を論理読み取 り 順序で作成 多 く の状況において う ま く い く 自然な方式は、1 個の構


造要素のすべての構成部分を シーケ ン シ ャ ルに生成 し 、ついで論理シーケ ン ス内の次の要
素へ移っ てい く こ と です。 専門的にい う と 、 構造ツ リ ーは単一の深 さ 優先 ト ラ バーサルに
よ っ て作成 さ れ、 ページ内容を作成す る PDFlib 関数は、 内容が読まれ る 順に呼び出 さ れ
ます。
PDFlib では、 内容を任意の順序で作成 し なが ら も なお構造 ヒ エ ラ ルキーを論理順に作
成す る ためのい く つかの方法が可能です。 こ れ ら の方式は 327 ページ 「11.2.5 内容を順序
に と ら われず作成」 で説明 し ます。

11.1.10 Adobe Acrobat におけ る タ グ付き PDF の不具合


こ の項では、私達が タ グ付 き PDF 出力を Adobe Acrobat で試験 し てい く なかで得た知見を
述べます。 表 11.6 に、 Acrobat におけ る バグ と 動作不安定を、 以下の機能ご と に ま と めて
挙げます :
> Acrobat のア ク セシ ビ リ テ ィ ーチ ェ ッ カー:Acrobat のア ク セシ ビ リ テ ィ ーチ ェ ッ カーを
利用す る と 、 ス ク リ ーン リ ーダーの よ う な支援技術に対す る タ グ付 き PDF 文書の適合
性を調べ る こ と がで き ます。
> Acrobat の読み上げ機能 : タ グ付 き PDF は、 Acrobat の読み上げ機能を向上 さ せます。
> Acrobat の タ グパネル内の 「検索 ...」 機能を使っ てページ装飾 と マー ク な し 内容を検索
す る こ と も で き ます。

11.1 タ グ付き PDF の基礎 315


表 11.6 タ グ付き PDF 関連の Acrobat DC の不具合
説明 ・ 推奨 ・ 回避策

Acrobatのア ク セシ ビ リ テ ィ ーチ ェ ッ カ ー

Alt 属性が Figure タ グについて無視 さ れる。

ア ク セシ ビ リ テ ィ ーチ ェ ッ カ ーが、 チ ェ ッ ク マー ク記号を持 っ た種類チ ェ ッ ク ボ ッ ク スのフ ォ ーム フ ィ ー


ル ド について 「Character encoding – failed」 と 警告を発するが、 読み上げ機能はその フ ィ ール ド 内容を完
璧に読み上げる。

Acrobatの読み上げ機能

タ グ付きのページが PDI で配置 さ れてお り 、 かつページ装飾のみを子に持っ ている場合に も、 読み上げ機


能がその配置 さ れているページの内容を読み上げる。

その他のAcrobatの機能

タ グパネル内の「検索 ...」機能が、 ページ装飾を誤っ て マー ク な し 内容 と し て報告する。 例 : 表装飾。


対照的に、 こ れらのア イ テムは コ ン テ ン ツパネル内では 「 コ ン テナ < ページ装飾 >」 と し て正 し く 表示 さ
れる。

316 第 11 章 : タ グ付き PDF と PDF/UA


11.2 タ グ付 き PDF 作成の高度な ト ピ ッ ク
11.2.1 自動表 タ グ付け
PDF_fit_table( ) は、表内容のために PDF_add_table_cell( ) に与え ら れた情報に基づいて、生
成 さ れ る 表のために適切な タ グ を自動的に作成す る こ と がで き ます。PDF_fit_table( ) の tag
オプシ ョ ンで tagname=Table を用い る と 、 表 11.7 に説明す る と お り の自動表 タ グ付けが
行われます。

表 11.7 PDF_fit_table( ) の tag オプ シ ョ ン と 自動 タ グ付け

PDF_fit_table( ) の
tag オプ シ ョ ン 結果
tagname=Table 推奨ア プ ローチ : 自動表 タ グ付けが行われます。 tagname=Table のかわ り に、 Table へロー
ルマ ッ プ さ れた カ ス タ ム タ グ を用いる こ と も で き ます。
tagname=Artifact キ ャ プ シ ョ ン を含め、 表内容全体がページ装飾 と し て マー ク さ れます。 BBox 属性が自動的
に追加 さ れます。

他の任意の Table 構造は一切作成 さ れず、 そのセル内容は tag オプ シ ョ ン で指定 さ れた要素の子 と し


tagname て追加 さ れます。 擬似ア イ テム と イ ン ラ イ ン ア イ テムは PDF_fit_table( ) に対 し ては許容 さ
れません。
tagオプ シ ョ ンが与 自動 タ グ付けな し 。 tag オプ シ ョ ンが個別の PDF_add_table_cell( ) への呼び出 し に対 し て与
え ら れていない え ら れた場合には (fit* オプ シ ョ ンの う ちのいずれかの対するサブオプ シ ョ ン と し て)、
そのセル内容に対する、 対応する構造要素が作成 さ れますが、 表構造は一切作成 さ れませ
ん。

注 自動表 タ グ付けは、 PDFlib の表エ ン ジ ンが用い ら れる場合にのみ威力を発揮 し ます。 手作


業で作成 さ れた表に正 し く タ グを付ける こ と は可能ではあ り ますが、 こ の処理は、 ク ラ イ
ア ン ト ア プ リ ケーシ ョ ン側で表構造に関する詳 し い知識を必要 と し ます。 表行 / 列構造の
みな ら ず、 ヘ ッ ダーセル と 表行 / 列スパンに関する関連情報が必須です。 空セルに も タ グ
を付ける必要があ り ます。

Acrobat で表 タ グ を視覚化 表要素の構造は、 Acrobat DC で以下の よ う に視覚化で き ま


す:
> 「表示」 → 「ア ク セシ ビ リ テ ィ ー」 → 「読み上げ順序」 を選択。 表要素がハ イ ラ イ ト さ
れ、表の左上隅近 く の小 さ な番号で標識 さ れます。表サマ リ ーが存在す る 場合には、 そ
れは こ の小 さ な番号の後に表示 さ れます。
> 表の左上隅に あ る 番号 ま たは構造種別名を選択 し 、 「読み上げ順序」 ダ イ ア ロ グ内の
「テーブルエデ ィ タ ー」 を ク リ ッ ク 。 表構造が縦横の線で視覚化 さ れ ます。 「テーブル
エデ ィ タ ーオプ シ ョ ン」 ダ イ ア ロ グ内で、 Acrobat に、 表セルの種別に従っ て TH/TD ア
イ コ ン を表示 さ せ る こ と がで き ます (図 11.3 参照)。
> 表セルを右 ク リ ッ ク し て、 「テーブルセルのプ ロパテ ィ ...」 を選択す る と 、 そのセル種
別 (ヘ ッ ダーセルな ら TH、 デー タ セルな ら TD)、 scope 属性、 rowspan ・ colspan 属性、
header/ID 値をチ ェ ッ ク で き ます。

なお、 Acrobat においてテーブルエデ ィ タ ーで作業す る にあ た っ ては以下の制約があ り ま


す:

11.2 タ グ付き PDF 作成の高度な ト ピ ッ ク 317


図 11.3
タ グ付き PDF 表のための
Acrobat のテーブルエデ ィ タ ー
がヘ ッ ダー (TH) ・ デー タ
(TD) セルを表示

> 表セルを視覚化す る 線が、 誤っ た位置に表示 さ れ る こ と があ り ます。


> 表が、Table へ ロ ールマ ッ プ さ れた カ ス タ ム構造要素 (標準要素 Table ではな く ) を用い
てい る と 、 Acrobat はテーブルエデ ィ タ ーを ア ク テ ィ ブに し ません。
> テーブルエデ ィ タ ーは、 表内に Caption 要素が存在 し ていて も 表示 し ません。
> 表セルが縦書 き テ キ ス ト (た と えば orientate=east ま たは west に よ る テ キ ス ト 行)を含
んでい る と 、 こ のセル と その右隣セルはテーブルエデ ィ タ ーで表示 さ れ ませんが、 た
だ し それ ら は論理構造ツ リ ー内には存在 し 、 それ ら の内容はページ上で見え ます。

自動作成 さ れる表 タ グ と 属性 自動表 タ グ付けは、 ページ ス コ ープ内でのみ、 かつ、PDF_


fit_table( ) で tag={tagname=Table} を用いた場合にのみ働き ます。 動作の詳細は以下の と
お り です :
> それぞれの論理表に対 し てTable要素が1つずつ作成 さ れます。1個の表が2個以上の イ ン
ス タ ン ス に分割 さ れてい る 場合、 Table 要素は 1 つだけ作成 さ れます。 PDF_fit_table( )
の tag オプシ ョ ンに Summary サブオプシ ョ ンが与え ら れてい る 場合には、 Table 要素
に Summary 属性が追加 さ れます。
> PDF_fit_table( ) で caption オプシ ョ ンが指定 さ れた場合には、最初の表 イ ン ス タ ン ス の
中に Caption 要素が作成 さ れます。 グループ化要素 と し て、 Caption はいかな る 内容ア
イ テ ム を も 子に持つ こ と を許 し ませんので、 こ の caption オプシ ョ ンの tag サブオプ
シ ョ ン を与え る こ と に よ っ て、 Caption の子 と し て構造要素を指定す る 必要があ り ま
す。 こ の要素が こ のキ ャ プシ ョ ンの実際の内容を保持で き ます。 各 Table 要素に対 し て
許 さ れ る Caption 要素は 1 つだけですので、2 個目以降の表 イ ン ス タ ン ス の中で生成 さ
れた キ ャ プシ ョ ンは Artifact と し て標識 さ れます。
> それぞれの表行に対 し て 1 個の TR 要素が作成 さ れます。最初の表 イ ン ス タ ン ス の中で
は、 PDF_fit_table( ) の header オプシ ョ ン内で指定 さ れてい る 表行は THead で ラ ッ プ さ
れ、 footer オプシ ョ ン内で指定 さ れてい る 表行は TFoot で ラ ッ プ さ れます。 それ以外の
すべての表行は、 ヘ ッ ダーか フ ッ タ ーが存在す る 場合には TBody で ラ ッ プ さ れます。
ヘ ッ ダー表行グループ と フ ッ タ ー表行グループの出現は 1 回だけであ る 必要があ り ま
すので、2 個目以降の表 イ ン ス タ ン ス の中では、ヘ ッ ダー表行 と フ ッ タ ー表行は Artifact
と し て標識 さ れます。

318 第 11 章 : タ グ付き PDF と PDF/UA


> 表セルはそれぞれ、PDF_add_table_cell( )のtagオプシ ョ ンのtagnameサブオプシ ョ ンに
従っ て、 TH (表ヘ ッ ダー) か TD (表デー タ ) のいずれかの要素で ラ ッ プ さ れます。 こ
のオプシ ョ ン が指定 さ れていない場合には、 そのセル種別は以下の よ う に選択 さ れ ま
す:
> セルに対する Scope 属性は TH を強制 し ます (た と え tagname=TD が指定 さ れていて
も )。
> カ レ ン ト セルの id を指定 し た Headers サブオプシ ョ ン を持つ tag オプシ ョ ン を別のセ
ル が 含 ん で い る 場 合 に は、 カ レ ン ト セ ル は 強 制 的 に TH に な り ま す (た と え
tagname=TD が指定 さ れていて も )。
> そのセルが、 PDF_fit_table( ) の header オプシ ョ ンで指定 さ れてい る と お り の表ヘ ッ
ダーの一部分であ る 表行に含まれてい る 場合には、 それは TH で ラ ッ プ さ れ、 ま た、
Scope=Column が追加 さ れます。
> PDF_add_table_cell( ) が呼び出 さ れていない表セルそれぞれについて、空の TD 要素が作
成 さ れます。
> TH ・ TD 要素は、PDF_add_table_cell( ) の rowspan ・ colspan オプシ ョ ンに従っ て、適切な
RowSpan ・ ColSpan 属性を得ます。 tag オプシ ョ ンの RowSpan ・ ColSpan サブオプシ ョ
ンは使え ません。
> Table ・ TH ・ TD 要素には、 適切な Width ・ Height 属性が割 り 当て ら れます : Table 要素に
は BBox 属性 も 割 り 当て ら れます。
> 他の表セル属性は、PDF_add_table_cell( )のtag オプシ ョ ンに対 し てサブオプシ ョ ン と し
て与え る こ と が可能です。 以下のオプシ ョ ンは許容 さ れ ません : RowSpan ・ ColSpan ・
Height ・ index ・ parent ・ Width。
> 表行 と セルは、 PDF_add_table_cell( ) への呼び出 し の順序にかかわ ら ず、 左上セル (す
なわち列 1 ・ 行 1) か ら 右下セルへジ グザグ順に出力 さ れます。
> 装飾的な各種表要素は、自動的に artifacttype=Layout の Artifact と し て タ グ付け さ れま
す。 すなわち、 表セル ・ 表行 ・ 列 ・ 表全体の罫線 と シ ェーデ ィ ン グ (塗 り / 描線)、 範
囲枠の塗 り と 罫線、 showborder の罫線、 debugshow ・ showcells ・ showgrid を通 じ て制
御 さ れ る 視覚化支援です。
> 同 じ 表についての PDF_fit_table( ) への 2 回目以降の呼び出 し においては、自動 タ グ付け
がすべての関連す る タ グ を処理 し ますので、 tag オプシ ョ ンは無視 さ れます。

ク ッ ク ブ ッ ク 自動表 タ グ付けのための コ ー ド サン プルが、 PDFlib ク ッ ク ブ ッ クの pdfua カ テ ゴ リ ー内の


table_pdfua1 ・ invoice_pdfua1 ト ピ ッ ク にあ り ます。

表セルに タ グ と 属性を追加 短縮 タ グ付け を、 表キ ャ プシ ョ ン か表セルか、 ま たは表セ


ルの内容に適用す る こ と がで き ます。 PDF_add_table_cell( ) に tag オプシ ョ ン を与え る と 、
以下の状況において有用です :
> 表セルが、 ヘ ッ ダー行に含まれていないか、 Scope 属性を持た ない場合、 tagname=TH
を用いて それを強制的にヘ ッ ダーセルにす る こ と も で き ま す (TD デー タ セルではな
く )。
> リ ン ク に対 し て必要な正 し い タ グ構造を作成:詳 し く は 322 ページ 「表セル内で リ ン ク
に タ グ付け」 を参照 し て く だ さ い。

PDF_add_table_cell( ) の tag オプシ ョ ンのサブオプシ ョ ンに対 し ては、 以下の制約が課 さ


れます :
> 以下のオプシ ョ ンは使え ません : ColSpan ・ Height ・ index ・ parent ・ RowSpan ・ Width。

11.2 タ グ付き PDF 作成の高度な ト ピ ッ ク 319


> tagname オプシ ョ ンは、表セルの種別を指定する ために、値 TH か TD のいずれかのみを
持つ こ と がで き ます。 し か し 、 tag オプシ ョ ン を ネ ス ト する こ と に よ っ て子孫 タ グ を指
定す る こ と も で き ます。

表セルの内容に タ グ と 属性を追加 PDF_add_table_cell( ) の以下の オ プ シ ョ ン (ま た は


caption オプシ ョ ンの対応する サブオプシ ョ ン) にサブオプシ ョ ン と し て tag を与え る こ
と も で き ます :
fitannotation・fitfield・fitgraphics・fitimage・fitpath・
fitpdipage・fittextflow・fittextline

こ れは以下の状況において有用です :
> 表セルの内容に対 し て下位構造を指定。こ の tag オプシ ョ ンは、その表セルの TH か TD
要素の子要素を作成 し ます。 自動表 タ グ付けが有効の場合には、 tag オプシ ョ ンに対 し
て、 tagname について以下の値は許容 さ れません (言い換えれば、 表のネ ス ト には対
応 し てい ません) :
Table・TR・TH・TD・THead・TBody・TFoot

> 以下に挙げ る 表の属性は、 自動的には作成 さ れ る こ と がで き ませんが、 ア ク セシ ビ リ


テ ィ ー目的のために必要な場合があ り ます。 こ れ ら はユーザーに よ っ て与え ら れ る 必
要があ り ます :
> 表内の 1 個ない し 複数の TH セルを参照する TD セル(すなわち こ れは、PDF_fit_table( )
の header オプ シ ョ ン の一部分ではな いヘ ッ ダーセル を 参照 し ま す) に対 し ては、
Headers オプシ ョ ン を与え る 必要があ り ます。
> いずれかの Headers オプシ ョ ン内で参照 さ れてい る TH セルに対 し ては、Id オプシ ョ ン
と Scope=Row オプシ ョ ン を与え る 必要があ り ます (TH 列ヘ ッ ダーセルに対 し ては
Scope=Column は自動的に作成 さ れます)。
> キ ャ プシ ョ ンは任意の内容を子 と す る こ と がで き 、 その内容自体 も タ グ付け さ れ る こ
と がで き ます。 た と えば、 以下のオプシ ョ ン リ ス ト は、 ネ ス ト さ れた P 要素の中のテ
キ ス ト 行 1 個を内容 と す る Caption 要素を作成 し ます :

caption={ fittextline={tag={tagname=P title={出張旅費報告書}} ... } ... }

11.2.2 イ ン タ ラ ク テ ィ ブ要素に タ グ付け


リ ン ク ・ 注釈 ・ フ ォーム フ ィ ール ド も 、 ア ク セシブルにす る 必要があ り ます。 その対応す
る イ ン タ ラ ク テ ィ ブ要素を、 構造ツ リ ー内で、 構造ツ リ ー内の正 し い位置に表現する 必要
があ り ます。

ク ッ ク ブ ッ ク タ グ付きの リ ン ク を作成する ための コ ー ド サン プルが starter_pdfua1 サン プルにあ り ま


す。 image_with_link_pdfua1 ト ピ ッ クは、 背景画像付きの リ ン ク を生成 し ます。 table_of_
contents_pdfua1 ト ピ ッ ク は、 目次 と と も に、 TOC ・ TOCI 構造要素 と 、 動作する リ ン ク を生
成 し ます。

リ ン ク と その他の注釈種別 注釈は、 ア ク セ シ ビ リ テ ィ ーのために以下のア イ テ ム を要


請 し ます (図 11.4 参照) :
> Link 要素( リ ン ク 注釈に対 し て) ま たは Annot 要素(その他すべての注釈種別に対 し て)
は、 次の 2 つのア イ テ ムのための コ ン テナ と し て働 き ます。 Alt ま たは ActualText オプ
シ ョ ン を与え る こ と に よ っ て代替記述か置換テ キ ス ト を与え る こ と も で き ま す。 Link

320 第 11 章 : タ グ付き PDF と PDF/UA


図 11.4
構造ツ リ ー内における
ア ク セ シ ブルな リ ン クの表現

要素の Alt 属性はその リ ン ク の目的を記述す る べ き です。リ ン ク の タ ーゲ ッ ト がカ レ ン


ト 文書内に位置 し てい る 場合には(GoTo ア ク シ ョ ン)、その Link 要素は さ ら に Reference
要素の内容 と な る べ き です (オプシ ョ ン direct=false を用いて)。
> イ ン タ ラ ク テ ィ ブ要素を表現す る テ キ ス ト を、 こ の コ ン テナ要素の内側に作成す る べ
き です。 テ キ ス ト が全 く 必要ない場合には、 こ の要素は ス キ ッ プす る こ と がで き ます。
た と えばテ キ ス ト 注釈の場合な ど です。 注釈が ラ ス タ ー画像かベ ク ト ルグ ラ フ ィ ッ ク
に よ っ て表現 さ れてい る 場合には、 こ れは Artifact と し て タ グ付け さ れ る べき です。 こ
の場合、 こ の リ ン ク の代替テ キ ス ト は、 そのグ ラ フ ィ ッ ク と リ ン ク の両方を記述す る
こ と にな り ます。さ ま ざ ま な内容作成関数の matchbox オプシ ョ ン を用い る こ と に よ っ
て、 次の要素のための形状情報を用意す る こ と を推奨 し ます。 matchbox オプシ ョ ン を
与え る 時点におけ る カ レ ン ト のア ク テ ィ ブな要素は構造ア イ テ ム であ る べ き です。 す
なわちオプシ ョ ン direct=true は許 さ れません。
> 注釈は、PDF_create_annotation( ) を用いて作成す る 必要があ り ます。注釈に加え て、 こ
の メ ソ ッ ド は、 その注釈のための、 種別 OBJR (オブジ ェ ク ト 参照) の、 対応す る 構造
要素を生成 し ます。 リ ン ク 注釈に対 し ては、 PDF_create_annotation( ) の contents オプ
シ ョ ン を与え る べ き です ( こ れは PDF/UA-1 では必須です)。 その他の注釈種別につい
ては、 PDF_create_annotation( ) の contents オプシ ョ ン、 ま たは ActualText タ グ付けオ
プシ ョ ン を用いて作成す る べ き です。 usematchbox オプシ ョ ン を用い る と 、 2 番目の ス
テ ッ プで作成 さ れた視覚内容の形状を簡便に与え る こ と がで き ます。

こ の 2 番目 と 3 番目のア イ テ ムは、 ど ち ら を先に作成 し て も か ま い ません。 上記の注釈の


要件は、 PDF_add_table_cell( ) のオプシ ョ ン fitannotation を用いて表セル内に作成 さ れ る
注釈に対 し て も あ ては ま り ます。

明示的に リ ン ク に タ グ付け 以下の コ ー ド 断片は、 こ の必須の 3 つのア イ テ ム を持っ た


イ ン タ ラ ク テ ィ ブ リ ン ク を作成 し ます (生成 さ れ る タ グ構造を図 11.4 に示 し ます) :
/* 親Link要素を作成 */
id_link = p.begin_item("Link", "Title={Kraxi on the Web} Alt={Kraxi on the Web}");

/* このリンクを表現する可視内容を作成 */
p.fit_textline("Click here to go to the Kraxi website", x, y,
"matchbox={name={kraxi}} fontsize=14 font=" + font);

/* URIアクションを作成 */
action = p.create_action("URI", "url={http://www.kraxi.com}");

/* 名前付き範囲枠「kraxi」上にLink注釈を作成 */
p.create_annotation(0, 0, 0, 0, "Link",
"action={activate=" + action + "} "
"usematchbox={kraxi} contents={Kraxi Inc. Webサイトへのリンク}");

p.end_item(id_link);

11.2 タ グ付き PDF 作成の高度な ト ピ ッ ク 321


テキス ト フ ロ ーオ プ シ ョ ン リ ス ト 内の タ グ を用いて リ ン ク に タ グ付け テ キ ス ト フ ロ ー
オプシ ョ ン リ ス ト 内で範囲枠機能 と タ グ を用い る こ と に よ っ て、テ キ ス ト フ ロ ー内で リ ン
ク に正 し く タ グ付け を行 う こ と が可能です。 276 ページ 「テ キ ス ト フ ロ ーの範囲枠に Web
リ ン ク を追加」 で示 し た一般的な イ デ ィ オム を使い、 以下の コ ー ド 断片を用いて リ ン ク 注
釈に対 し て然 る べ き タ グ を追加で き ます。テ キ ス ト フ ロ ーは必要な数の範囲枠長方形を自
動的に生成 し ますので、ページ上に 1 つの名前付き 範囲枠のすべての イ ン ス タ ン ス を生成
し て タ グ付けす る には PDF_create_annotation( ) を 1 回呼び出せば充分です。
final String text =
"Visit our <tag={tagname=Link} matchbox={name=kraxi}>Web site<tagend matchbox=end>";
...
tflow = p.create_textflow(text, optlist);
result = p.fit_textflow(tflow, 0, 0, 50, 70, "fitmethod=auto");
...
/* URIアクションを作成 */
act = p.create_action("URI", "url={http://www.kraxi.com}");

/* 名前付き範囲枠(群) 「kraxi」上にリンク注釈を作成 */
p.create_annotation(0, 0, 0, 0, "Link",
"action={activate " + act + "} " +
"usematchbox={kraxi} contents={Link to Kraxi Inc. Web site}");

1 つの範囲枠が複数の長方形か ら 成 る こ と も あ り ます。 た と えばハ イ フ ネーシ ョ ンに よ る


場合や、 matchbox オプシ ョ ンの複数の イ ン ス タ ン ス が同 じ 名前を与え た場合です。 こ の
場合には PDFlib はデフ ォ ル ト では複数の有効領域 (その範囲枠の各長方形ご と に 1 つず
つ) か ら 成 る ただ 1 つの リ ン ク 注釈を生成 し ます。 あ る いは PDF_create_annotation( ) の
オプシ ョ ン singlelink=false を使用す る こ と に よ っ て複数の リ ン ク 注釈を生成する こ と も 可
能です。 その場合にはそれぞれの注釈はただ 1 つの長方形か ら 成 る こ と にな り ます。 ただ
し こ れは PDF 2.0 では許 さ れません。

ク ッ ク ブ ッ ク テキス ト フ ロー内に タ グ付きの リ ン ク を作成する ためのコ ー ド サン プルが、 PDFlib クック


ブックの pdfua カテゴリーの中の textflow_pdfua1 トピックにあります。

表セル内で リ ン ク に タ グ付け 表セル内の リ ン ク は、上述の タ グ構造を必要 と し ます。た


だ し こ れは、 構造要素 TH/TD ・ Link ・ OBJR と 、 さ ら におそ ら く 内容を、 正 し く ネ ス ト する
必要が あ り ま すので、 やや複雑か も し れ ま せん。 こ れ を 達成す る には、 PDF_add_table_
cell( ) に tag オプシ ョ ン を与え てそのネ ス ト 機能を利用する 必要があ り ます。 以下のオプ
シ ョ ン リ ス ト は、 表セルにテ キ ス ト 1 行 と リ ン ク 注釈 1 個を入れます。 それを囲 う TD 要
素は外側の tag オプシ ョ ンで与え ら れ (TD は表エン ジ ンに よ っ て自動的に作成 さ れます
ので、 外側の tagname サブオプシ ョ ンは省略で き ます)、 そ し て Link 要素は内側の tag オ
プシ ョ ンで与え ら れます。 最後に、 必要な OBJR 要素は、 PDF_create_annotation( ) と 同等
の働き をする fitannotation オプシ ョ ンに よ っ て自動的に作成 さ れます :
fittextline={font=... fontsize=25 fillcolor=blue}
annotationtype=Link fitannotation={contents={Kraxi home page} action={activate ...}}
tag={tagname=TD tag={tagname=Link}}

フ ォ ーム フ ィ ール ド に タ グ付け フ ォ ーム フ ィ ール ド はア ク セシ ビ リ テ ィ ーのために以
下のア イ テ ム を必要 と し ます (図 11.5 参照) :
> Part構造要素を用いて、関連す る フ ォーム フ ィ ール ド 群のグループ を グループ化する こ
と も 可能です。

322 第 11 章 : タ グ付き PDF と PDF/UA


> Div 構造要素を、以下に挙げ る 個々の フ ォーム フ ィ ール ド の要素群の コ ン テナーにす る
こ と を推奨 し ます。
> フ ィ ール ド の目的を記述 し た テ キ ス ト を P 構造要素で囲い、それを Caption 構造要素の
子 と する。
> チ ェ ッ ク ボ ッ ク ス と ラ ジオボ タ ンについては、 そのチ ェ ッ ク ボ ッ ク ス/ ラ ジオボ タ ン
と その対応す る キ ャ プシ ョ ン を囲 う も う 1 つの Div 要素を作成す る こ と を推奨 し ます。
Caption 構造要素は論理的にたいてい フ ィ ール ド よ り 前にあ る ので、それは構造 ヒ エ ラ
ルキー内でForm要素 よ り 前に来ます。ページ上での順序が逆であ っ て も そ う な り ます。
> フ ォーム フ ィ ール ド は PDF_create_field( ) を用いて作成する 必要があ り ます。それは P要
素の子であ る Form 要素の子であ る べ き です。 こ の メ ソ ッ ド は、 フ ィ ール ド だけでな
く 、 こ の Form 要素の中に種別 OBJR (オブジ ェ ク ト 参照) の構造要素を も 生成 し ます。
Alt か ActualText オプシ ョ ン を与え る こ と に よ っ て、 代替記述か置換テ キ ス ト を与え る
こ と も 可能です。 PDF_create_field( ) の tooltip オプシ ョ ン を与え る こ と に よ り 、 フ ィ ー
ル ド のア ク セシ ビ リ テ ィ ーを向上 さ せ る べ き です ( こ れは PDF/UA-1 では必須です)。
ラ ジオボ タ ン を作成す る 際には、 Form 要素は、 ラ ジオボ タ ン グループのための PDF_
create_fieldgroup( ) の中では必要な く 、 個々のボ タ ン を 作成す る た めの PDF_create_
field( ) の中でのみ必要です。

以下の コ ー ド 断片は、 テ キ ス ト フ ィ ール ド に対 し て推奨 さ れ る 構造を、 図 11.5 に示す と


お り に生成 し ます。 PDF_fit_textline( ) の tag オプシ ョ ン を使っ て、 短縮 タ グ付け を ネ ス ト
し て用いて、 Caption 構造要素 と P 構造要素を生成 し てい ます。 PDF_create_field( ) の中で
短縮 タ グ付け を使っ て、 P 構造要素 と Form 構造要素を ネ ス ト さ せて生成 し てい ます :
id_Div = p.begin_item("Div", "");

labeltext = "Enter name:";


p.fit_textline(labeltext, x1, y1, "tag={tagname=Caption tag={tagname=P}} ...");

p.create_field(x2, y2, x3, y3, "name", "textfield",


"tag={tagname=P tag={tagname=Form}} tooltip={" + labeltext + "} " +
"bordercolor={gray 0} font=" + font);

p.end_item(id_Div);

上記の フ ォーム フ ィ ール ド の要件は、 PDF_add_table_cell( ) のオプシ ョ ン fitfield を用いて


表セル内に生成 さ れ る フ ォーム フ ィ ール ド に も 課 さ れます。
ク ッ ク ブ ッ ク すべての種類の タ グ付き フ ォ ーム フ ィ ール ド を作成する コ ー ド サン プルが、PDFlib ク ッ ク
ブ ッ ク の pdfua カ テ ゴ リ ーの form_fields_pdfua1 ト ピ ッ ク にあ り ます。

タ グ付き し お り し お り には、通常のページ指向の移動先に加え て、構造要素を割 り 当て


る こ と も で き ます。 こ の よ う な し お り を タ グ付き し お り と いい、 Acrobat は こ れのために
追加の機能を提供 し てい ます。Acrobat で タ グ付き し お り を右 ク リ ッ ク する と 、機能 「ペー
ジ を削除」 と 「ページ を抽出」 が利用可能 と な っ てお り 、 こ れ ら はその構造化要素を含ん
でい る ページない し ページ群に対 し て動作 し ます。 タ グ付 き し お り は、 し お り と 構造要素
と の間に接続を作成 し ます。 こ の接続を作成で き る 方法は 2 つあ り ます :
> PDF_create_bookmark( ) で し お り を作成 し 、 そのハン ド ルを、 PDF_begin_item( ) の
bookmark オプシ ョ ンに、 ま たは さ ま ざ ま な関数の tag オプシ ョ ンに与え る :

11.2 タ グ付き PDF 作成の高度な ト ピ ッ ク 323


図 11.5
構造ツ リ ー内における フ ォ ーム フ ィ ール ド の表現

bm = p.create_bookmark("第1章", "");
id = p.begin_item("H1", "Title={第1章} bookmark=" + bm);
p.fit_textline(text, x, y, "");
p.end_item(id);

こ の方式は短縮 タ グ付けで も 用い る こ と がで き ます :
bm = p.create_bookmark("第1章", "");
p.fit_textline(text, x, y,
"tag={tagname=H1 Title={第1章} bookmark=" + bm + "}");

こ の方式の難点は、 し お り テ キ ス ト が、 その構造要素 と その内容が作成 さ れ る 前には


得 ら れていなければな ら ない と い う 点です。 こ れは、 参照 さ れ る 構造要素のほ う が構
造ツ リ ー内で上にあ っ た場合には困 る で し ょ う 。
> PDF_begin_item( ) で構造ア イ テ ム を作成 し 、そのハン ド ルを PDF_create_bookmark( ) の
item オプシ ョ ンに与え ます。 ア イ テ ムのハン ド ルのかわ り に、 キーワー ド current を、
PDF_create_bookmark( ) が呼び出 さ れ る 時点におけ る カ レ ン ト の構造要素を指 し 示す
シ ョ ー ト カ ッ ト と し て与え る こ と がで き ます :
id = p.begin_item("H1", "Title={第1章} ");
bm = p.create_bookmark("第1章", "item=current");
p.fit_textline(text, x, y, "");
p.end_item(id);

こ の方式には、 し お り テ キ ス ト が、 その構造要素 と その内容が作成 さ れ る 時点で得 ら


れれば よ い と い う 利点があ り ます。 ただ し 、 こ れは短縮 タ グ付けでは使え ません。

タ グ付 き し お り は、 オープン構造要素を参照す る こ と のみ可能であ り 、 擬似ア イ テ ム ま た


は イ ン ラ イ ン ア イ テ ム を参照す る こ と はで き ません。 し お り の移動先が構造要素 と 一致す
る よ う にす る のは ク ラ イ ア ン ト コ ー ド 側の役割です (そ う し ない と 、 Acrobat で し お り を
ク リ ッ ク し た ら その要素へジ ャ ンプせず、その文書内の別の場所へジ ャ ンプ し て し ま い ま
す) 。 関連付け ら れ る 構造要素が複数のページにわた っ てい る 場合には、 その し お り は こ
の範囲内の最初のページ を指 し 示すべ き です。

324 第 11 章 : タ グ付き PDF と PDF/UA


11.2.3 イ ン タ ラ ク テ ィ ブ要素に タ グ付けす る PDF 2.0 の機能
イ ン タ ラ ク テ ィ ブ要素を ページ装飾 と し て PDF 1.7 では、ページ装飾はマー ク 付 き 内容
ア イ テ ム と し てのみ表現で き る ので、 イ ン タ ラ ク テ ィ ブ要素をページ装飾 と し て分類す る
こ と はで き ません。 PDF 2.0 では、 ページ装飾を構造ツ リ ー内に含め る こ と がで き 、 それ
を用いて イ ン タ ラ ク テ ィ ブ要素をページ装飾 と し て タ グ付けする こ と が可能です。以下の
コ ー ド 断片 (compatibility=2.0 が必須) は、 リ ン ク 注釈をページ装飾 と し て作成 し ます :
p.create_annotation(100, 100, 300, 200, "Link",
"tag={tagname=Artifact direct=false}");

構造移動先 PDF 1.7 では移動先は、 文書内の 1 つのページの上の視覚的な位置を指 し 示


し ます。 構造移動先は、 PDF 2.0 の機能であ り 、 文書 ヒ エ ラ ルキー内のいずれかの構造要
素を指 し 示す も のですので、 物理的な位置か ら 独立です。 こ の技法は 2 つの手順を必要 と
し ます :
> elementid タ グ付けサブオプシ ョ ンで構造要素に一意な文字列を割 り 当て ます。 こ れは
リ ン ク や し お り の移動先 と し て働 き ます :
p.fit_textline("Introduction",
50, 700, "tag={tagname=H1 elementid={Intro}} fontsize=24");

> GoTo ア ク シ ョ ンで構造要素を指名 し て移動先 と し て使用 し ます :


action = p.create_action("GoTo", "destination={type=fitwindow structdest={Intro}}");

こ の要素 ID は タ ーゲ ッ ト 要素に割 り 当て る のは使用前で も 使用後で も か ま い ません。 構


造移動先は GoTo ア ク シ ョ ンに限 ら ず、 し お り や注釈な ど、 通常の移動先を使え る すべて
の場合に使用で き ます。 構造移動先を使っ て名前付き 移動先を定義する こ と も 可能です。

11.2.4 リ ス ト に タ グ付け
リ ス ト は、 関連す る 項目群を ま と め る ために使われます。 こ れは以下の構造要素に よ っ て
表現 さ れます :
> 以下のすべての構造要素を内容 と す る L要素1個。ListNumberingオプシ ョ ン を用い る と 、
Lbl 要素内で用い ら れ る 付番系列を指定す る こ と がで き ます。 こ の ListNumbering オプ
シ ョ ンは、 Lbl 要素がない場合で も 、 ス ク リ ーン リ ーダーのために有用で し ょ う 。
> オプシ ョ ナルな Caption 要素 1 個。Caption はグループ化要素ですので、内容ア イ テ ム を
内容 と す る こ と はで き ず、 他の構造要素のみを内容 と す る こ と がで き ます (P な ど)。
> 以下を内容 と す る 、 1 個ない し 複数の リ ス ト 項目 (LI) :
> オプシ ョ ナルな、 ビ ュ レ ッ ト や番号な ど を持っ た ラ ベル (Lbl) 1 個。
> その リ ス ト 項目の実際の内容を持っ た LBody 要素 1 個。LBody は、内容ア イ テ ムか、ネ
ス ト さ れた リ ス ト も 含めて他の構造要素のいずれか を内容 と す る こ と がで き ます。

明示的に リ ス ト に タ グ付け 以下の コ ー ド 断片は、 1 個のキ ャ プシ ョ ン と 3 個の項目を


持っ た リ ス ト を作成 し ます。 それぞれの リ ス ト 項目の頭には、 ラ ベル と し て タ グ付け さ れ
る ビ ュ レ ッ ト キ ャ ラ ク タ ーU+2022が付 き ます(生成 さ れ る タ グ構造を図11.6に示 し ます):
id_list = p.begin_item("L", "ListNumbering=Disc");

/* Caption要素とP要素の両方を一回で生成 */
p.fit_textline("The following kinds of fruit are available:",

11.2 タ グ付き PDF 作成の高度な ト ピ ッ ク 325


図 11.6
ア ク セ シ ブルな リ ス ト の
構造ツ リ ー内における表現

x1, y, "tag={tagname=Caption tag={tagname=P}}");


y -= leading;

id_listitem = p.begin_item("LI", "");


p.fit_textline("&#x2022;", x1, y, "tag={tagname=Lbl}");
p.fit_textline("Apples", x2, y, "tag={tagname=LBody}"); y -= leading;
p.end_item(id_listitem);

id_listitem = p.begin_item("LI", "");


p.fit_textline("&#x2022;", x1, y, "tag={tagname=Lbl}");
p.fit_textline("Oranges", x2, y, "tag={tagname=LBody}"); y -= leading;
p.end_item(id_listitem);

id_listitem = p.begin_item("LI", "");


p.fit_textline("&#x2022;", x1, y, "tag={tagname=Lbl}");
p.fit_textline("Bananas", x2, y, "tag={tagname=LBody}"); y -= leading;
p.end_item(id_listitem);

p.end_item(id_list);

テキス ト フ ロ ーオ プ シ ョ ン リ ス ト 内の タ グ を用いて リ ス ト に タ グ付け 図 11.6 の構造


は、 あ る いは、 テ キ ス ト フ ロ ーオプシ ョ ン リ ス ト 内の以下の タ グ を用いて生成する こ と も
可能です (見やすい よ う イ ンデン ト し てい ます) :
<tagbegin={tagname=L ListNumbering=None}>
<tagbegin={tagname=Caption tag={tagname=P}}>

326 第 11 章 : タ グ付き PDF と PDF/UA


The following kinds of fruit are available:\n
<tagend>
<tagbegin={tagname=LI}>
<tagbegin={tagname=Lbl}>&#x2022;<tagend>
<tagbegin={tagname=LBody}>Apples\n<tagend>
<tagend>
<tagbegin={tagname=LI}>
<tagbegin={tagname=Lbl}>&#x2022; <tagend>
<tagbegin={tagname=LBody}>Oranges\n<tagend>
<tagend>
<tagbegin={tagname=LI}>
<tagbegin={tagname=Lbl}>&#x2022; <tagend>
<tagbegin={tagname=LBody}>Bananas\n<tagend>
<tagend>
<tagend>

ク ッ ク ブ ッ ク タ グ付き PDF リ ス ト を作成する ための コ ー ド サン プルが、PDFlib ク ッ ク ブ ッ クの pdfua カ


テ ゴ リ ー内の ト ピ ッ ク list_pdfua1 にあ り ます。

11.2.5 内容を順序に と ら われず作成


314 ページ 「11.1.9 印刷ス ト リ ーム順序 と 論理読み取 り 順序」 で述べた よ う に、 構造 ヒ エ
ラ ルキー内の要素群を作成す る 際に論理読み取 り 順序の と お り にす る こ と は不可欠です。
アプ リ ケーシ ョ ンが、 論理読み取 り 順序 と は異な る 順序でページ内容を (た と えば、 段組
の相互関係にかかわ ら ずつねに上か ら 下へ) 処理する 場合には、 い く つかの PDFlib 機能
を用いて、 構造 ヒ エ ラ ルキー内で正 し い順序付け を保つ こ と がで き ます :
> 子要素群を順序に と ら われず作成す る ために index オプシ ョ ン を用い る 。 こ れは、新規
構造要素がその親の中へ挿入 さ れ る 位置を変更 し ます。
> 構造要素群を順序に と ら われず作成す る ために parent オプシ ョ ン を用い る 。こ れは、新
規構造要素が挿入 さ れ る 親要素を変更 し ます。
> 構造 ヒ エ ラ ルキー内で前後へジ ャ ンプす る ために PDF_activate_item( ) メ ソ ッ ド を用い
る 。 こ れを用い る と 、 構造 ヒ エ ラ ルキー内のいずれかの要素に対 し て、 構造要素ま た
は内容ア イ テ ム を さ ら に追加す る こ と がで き ます。

こ れ ら の方式について詳 し く は後述 し ます。

ク ッ ク ブ ッ ク 要素を順序に と ら わら ず タ グ付けする ための コ ー ド サン プルが、 PDFlib ク ッ ク ブ ッ クの


pdfua カ テ ゴ リ ー内の ト ピ ッ ク tag_out_of_order_pdfua1・parallel_columns_pdfua1 内にあ り
ます。

子要素群を順序に と ら われず作成 構造要素内の子要素群を順序に と ら われず作成す る


ためには、 構造ツ リ ー内の場所を指定す る ために、 PDF_begin_item( ) の index オプシ ョ ン
か、 あ る いは さ ま ざ ま な関数の tag オプシ ョ ンの index サブオプシ ョ ン を用い る こ と がで
き ま す。 以下の コ ー ド 断片は、 テ キ ス ト フ ラ グ メ ン ト 群を逆順に出力 し なが ら 、 構造ツ
リ ー内におけ る 順序を正 し く す る ために、それぞれの新規テ キ ス ト フ ラ グ メ ン ト を親要素
の新た な最初の子 (index=0) と し て挿入 し ます。 それぞれの新規要素が親の新た な最初
の子 と し て挿入 さ れてい ますか ら 、 結果 と し て論理順は作成順の反対にな り ます :
p.fit_textline("三", x, y, "tag={tagname=P index=0}");
y += leading;
p.fit_textline("二", x, y, "tag={tagname=P index=0}");
y += leading;
p.fit_textline("一", x, y, "tag={tagname=P index=0}");

11.2 タ グ付き PDF 作成の高度な ト ピ ッ ク 327


カ レ ン ト でア ク テ ィ ブな タ グの、 その親要素内におけ る 番号を ク エ リ ーす る ために、 PDF_
get_option( ) と その activeitemindex か activeitemkidcount キーワ ー ド を用い る こ と がで き
ますので、 後で構造ツ リ ー内の こ の場所へ戻っ て く る こ と が可能です。 以下の コ ー ド 断片
は、 新規要素を、 保管 し ていた番号の位置にあ る 要素の後に挿入 し ます :
nextindex = p.get_option("activeitemindex", "") + 1;

...同一レベル上の要素群をさらに作成...

p.fit_textline(text, x, y, "tag={tagname=P index=" + nextindex + "}");

構造要素群を順序に と ら われず作成 子要素群を、 カ レ ン ト 位置ではな く 、 構造ツ リ ー


内のど こ か他の場所に作成す る ためには、 parent オプシ ョ ン を用い ます。 こ れは、 ま だ閉
じ ら れていない構造要素を指 し 示す必要があ り ます。 短縮 タ グ付けで作成 さ れた要素は、
同一の メ ソ ッ ド 呼び出 し の中で作成 さ れて閉 じ ら れて し ま い ますので、 こ れは parent オ
プシ ョ ンの タ ーゲ ッ ト と し ては使え ません。カ レ ン ト でア ク テ ィ ブな タ グの ID を ク エ リ ー
す る ために、 PDF_get_option( ) と その activeitemid キーワ ー ド を用い る こ と がで き ますの
で、 後で構造ツ リ ー内の こ の場所へ戻っ て く る こ と が可能です :
parent_id = p.get_option("activeitemid", "");
...
p.fit_textline(text, x, y, "tag={tagname=P parent=" + parent_id + "}");

さ ら に柔軟性を得 る 方法 と し て、 parent オプシ ョ ン と index オプシ ョ ン を組み合わせて使


う こ と も で き ます。 PDF_suspend/resume_page( ) を用い る と 、 ページに割 り 込んで、 別の
ページで作業を続け、その後その一時停止 し たページに戻っ て さ ら に内容を追加する こ と
がで き ます。

複雑な レ イ ア ウ ト のためにア イ テム を ア ク テ ィ ブ化 複雑な非線形のページ レ イ ア ウ ト


のための構造情報の作成を支援す る ために、PDFlib はア イ テ ムのア ク テ ィ ブ化 と い う 機能
を提供 し てい ます。 こ れを呼び出す と 、 開発者が複数の構造分枝の進捗を同時進行 さ せ、
かつそれぞれの分枝が 1 個ない し 複数のページにわた る 可能性があ る よ う な状況におい
て、 以前に作成 さ れた構造要素を ア ク テ ィ ブ化す る こ と がで き ます。 こ の技法に よ っ て恩
恵を受け る 典型的な状況は以下の と お り です :
> 1 つのページ上に複数の段組
> メ イ ン テ キ ス ト に割 り 込む挿入部、 た と えばま と めやその他非線形のテ キ ス ト ア イ テ

> 段組ど う し の間に配置 さ れ る 表 ・ イ ラ ス ト

PDF_activate_item( ) メ ソ ッ ド を用い る と 、構造ツ リ ーの別々の分枝ど う し の間を行っ た り


来た り す る こ と が可能にな り ます。 「論理順」 アプ ロ ーチでは、 ク ラ イ ア ン ト アプ リ ケー
シ ョ ンはページ内容を論理順に構築す る 必要があ り 、 こ れはた と えそれを視覚順に作成す
る ほ う が簡単であ っ て も 変え る こ と はで き ません。 こ れ と 対照的に、 ア イ テ ムのア ク テ ィ
ブ化を用い る と 、 内容を視覚順で作成す る こ と が可能にな り ま す (あ る いはア プ リ ケー
シ ョ ンに と っ て便利ないかな る 順序で も ) 。 こ の技法は、 内容が複数ページにわた る 場合
に も 適用で き ます。
Acrobat での諸問題を回避す る ため、 PDF_activate_item( ) を呼び出 し た直後には、 内容
ア イ テ ム を追加す る べ き ではな く 、 他の構造要素だけ を追加する べき です。

328 第 11 章 : タ グ付き PDF と PDF/UA


カ レ ン ト で ア ク テ ィ ブ な構造要素を ク エ リ ー parent・index オプシ ョ ンや PDF_activate_
item( ) を使 う には、カ レ ン ト でア ク テ ィ ブな構造要素 と その子に関す る 情報が必要にな り
ます。こ の ス テー タ ス情報は、アプ リ ケーシ ョ ン側で把握 し ておいて も よ いですが、PDFlib
か ら ク エ リ ーする こ と も 可能です。メ ソ ッ ド PDF_get_option( ) でキーワ ー ド activeitemid・
activeitemindex ・ activeitemkidcount ・ activeitemname ・ activeitemstandardname を用い る
と 、 カ レ ン ト 要素の ID ・ 番号 ・ 子要素数 ・ 名前 ・ 標準名 (それが ロ ールマ ッ プ さ れてい
る 場合) が得 ら れます。

11.2 タ グ付き PDF 作成の高度な ト ピ ッ ク 329


11.3 タ グ付き PDF ページ を PDI で取 り 込む
ク ッ ク ブ ッ ク タ グ付き PDF 文書か ら ページ を取 り 込むためのコ ー ド サン プルが、PDFlib ク ッ ク ブ ッ ク の
pdfua カ テ ゴ リ ー内の ト ピ ッ ク clone_pdfua ・ merge_and_stamp_pdfua1 にあ り ます。

タ グ付 き PDF モー ド では、 タ グ付 き PDF 文書か ら のページは、 その構造要素 タ グ群 と 一


緒に取 り 込まれます。 タ グ付 き PDF モー ド で usetags=true を用いて取 り 込まれた タ グ付
き PDF 文書のページの こ と を 「 タ グ付 き ページ」 と 呼ぶ こ と に し ま し ょ う 。 こ の ス テー
タ ス を ク エ リ ーする には、 PDF_info_pdi_page( ) の tagged キーワー ド を用い ます。 タ グ付
き ページの取 り 込みは、 以下の説明の よ う に動作 し ます。

タ グ付き PDF 文書を開 く PDF_open_pdi_document( ) が、 取 り 込まれ る 文書がカ レ ン ト


の PDF/A-1a/2a/3a ま たは PDF/UA モー ド と 互換か ど う か をチ ェ ッ ク し た う えで、取 り 込
まれ る 文書の構造ツ リ ー と ロ ールマ ッ プ を読み取 り ます。
usetags オプシ ョ ンが false の場合には、 その文書の構造情報は無視 さ れ、 その文書か
ら は何の タ グ も 取 り 込 ま れ ま せん。 なお、 PDF_open_pdi_document( ) がオブ ジ ェ ク ト ス
コ ープ内で、 すなわち PDF_begin_document( ) の前に呼び出 さ れた場合には、 usetags のデ
フ ォ ル ト は false です。

注 属性ク ラ ス と ク ラ スマ ッ プは取 り 込まれません。

入力文書言語を転写 も し PDF 文書の大半ない し すべてのページが、 PDI を用いて取 り


込まれた も のであ る 場合には、その入力文書内にその文書言語エン ト リ ーが存在 し てい る
な ら ば、 それを転写す る こ と を推奨 し ます。 こ の文書言語を転写する には、 pCOS と 以下
の コ ー ド 断片を用い ます :
if (p.pcos_get_string(indoc, "type:/Root/Lang").equals("string"))
{
inputlang = p.pcos_get_string(indoc, "/Root/Lang");
optlist += " lang=" + inputlang;
}

p.begin_document(filename, optlist);

タ グ付き ページ を開 く PDF_open_pdi_page( ) が、取 り 込まれたページの内容を構成する


構造要素群を選択 し 、 そのページ上に存在す る タ グ を フ ィ ル タ ー し ま す。 取 り 込 ま れた
ページ上の、取 り 込まれた構造下位ツ リ ーの最上位を形成する 1 個ない し 複数の構造要素
が選択 さ れます。 usetags オプシ ョ ンが false の場合には、 そのページの構造情報は完全に
無視 さ れます。
取 り 込ま れた文書の ロ ールマ ッ プ内のエ ン ト リ ー群は、 も し そのページ上で、 その対
応す る 要素が用い ら れてい る な ら ば、 出力文書の ロ ールマ ッ プへ コ ピー さ れます。 衝突 し
あ う ロ ールマ ッ プエン ト リ ー群 (すなわち、 あ る カ ス タ ム タ グがすでに、 生成文書の ロ ー
ルマ ッ プ内で、 あ る いはそれ以前に取 り 込まれた文書内で、 別の標準 タ グへマ ッ プ さ れて
い る ) は無視 さ れます。 ただ し PDF/UA モー ド では、 衝突 し あ う ロ ールマ ッ プエン ト リ ー
を持つページは拒絶 さ れ、 すなわち PDF_open_pdi_page( ) への呼び出 し は失敗 し ます。

タ グな し PDF 内容を取 り 込む タ グ な し 文書のページ と 、 usetags=false を用いて開かれ


たページ も 、 処理で き ますが、 それ ら は自動的にページ装飾 と し て標識 さ れます。

330 第 11 章 : タ グ付き PDF と PDF/UA


無効な タ グ構造を持つ文書を取 り 込む PDFlib は、 303 ページ 「11.1.3 PDF 1.7 の構造要
素ネ ス テ ィ ン グ規則」 で説明 し た通 り の、 ISO 32000-1 で課 さ れてい る タ グネ ス テ ィ ン グ
規則に関す る 厳格なチ ェ ッ ク を行い ます。 こ れ ら のチ ェ ッ ク は、 取 り 込まれ る 文書に対 し
て も 、 そ し て取 り 込まれ る ページか ら 作成 さ れ る タ グ構造に対 し て も 適用で き ます。 取 り
込まれたページ内のネ ス テ ィ ン グ規則は、 デフ ォ ル ト ではチ ェ ッ ク さ れません。 し か し 、
こ れ ら のチ ェ ッ ク は、 PDF_open_pdi_document( ) の checktags オプシ ョ ンで有効にす る こ
と も 可能です。 checktags=strict の場合には、 PDF_open_pdi_page( ) ですべての タ グ ネ ス
テ ィ ン グ規則が強制 さ れます。 も し も 取 り 込まれたページの構造 ヒ エ ラ ルキーが、 構造要
素に対す る ネ ス テ ィ ン グ規則に違反 し てい る と き は、 PDF_open_pdi_page( ) への呼び出 し
は失敗 し 、 PDF_get_errmsg( ) は以下の よ う なエ ラ ーを報告 し ます :
Structure type 'Document' cannot contain content items,
but only other structure elements

多数の既存の現実世界の タ グ付 き PDF 文書が こ の タ グネ ス テ ィ ン グ規則に違反 し てい ま


すので、 取 り 込んだ文書内の こ れ ら の問題への対処 と し て、 以下の方式のいずれかを用い
る こ と がで き ます :
> 取 り 込まれた構造 ヒ エ ラ ルキーのて っぺんに追加の タ グ を挿入す る (た と えば PDF_fit_
pdi_page( ) の tags オプシ ョ ンで) こ と は、 取 り 込まれたページがその文書ルー ト の直
下に内容ア イ テ ム を子に持っ てい る あ り がちな問題を正すために有用です。
> 他の諸問題は、 追加の タ グ を挿入 し て も 解決で き ません。 た と えば表や リ ス ト のため
の構造要素が不完全な と き な ど です。 可能であれば入力文書を直す こ と を考慮す る べ
き で す。 こ れ が 実 行 可 能 な 解 決 策 で な い 場 合 に は、 PDF_open_pdi_document( ) で
checktags=none と 設定す る こ と に よ っ て、 非準拠の タ グ構造を持つ タ グ付 き PDF ペー
ジ を取 り 込む こ と も で き ます。
> も し も 取 り 込ま れた構造自体は正 し く て、 ただ出力文書の生成 さ れた新 し い タ グ群 と
衝突 し てい る と い う 場合には、 その新 し い タ グ群を適切に調整す る こ と を試み る べ き
です。 も し こ れが現実的でないな ら ば、 PDF_begin_document( ) で checktags=none と 設
定す る こ と に よ っ て、生成 さ れた タ グ付け構造内の衝突を無視す る こ と も で き ます。こ
れは PDF/UA-1 モー ド では許容 さ れません。

いずれの形の checktags=none に よ っ て処理 さ れた非準拠入力 も 、 非準拠の PDF 出力を生


成す る おそれがあ り ますので、 こ の設定は推奨 し ません。

取 り 込まれたページ内の タ グ を ク エ リ ーお よ びチ ェ ッ ク 状況に よ っ ては、 取 り 込ま れ


た構造要素群を、生成 さ れ る 新た な構造 ヒ エ ラ ルキー内に正 し く 統合 さ せ る こ と が難 し い
場合 も あ り ます。こ の状況を支援す る ために、ページ を開 く こ と が成功 し た後に PDF_info_
pdi_page( ) を用い る と 、 取 り 込まれた タ グ付 き PDF ページのい く つかの特性を ク エ リ ー
す る こ と がで き ます :
> キーワー ド fittingpossible は、 そのページがカ レ ン ト コ ン テ キ ス ト 内に配置で き る か ど
う か を報告 し ます。 その tag オプシ ョ ン を与え る と 、 そのページ を追加の最上位レベ
ル タ グ と と も に配置で き る か ど う か を チ ェ ッ ク で き ま す。 こ の tag オ プ シ ョ ン の
tagname サブオプシ ョ ンだけが評価 さ れます : 他のサブオプシ ョ ンは与え る べ き では
あ り ません。 こ のキー ワ ー ド を用い る こ と は、 取 り 込ま れ る ページ内の構造情報に関
し て よ く わか っ てお ら ず、取 り 込まれた構造要素群が不適合であ る せいで PDF_fit_pdi_
page( ) で例外が発生す る こ と を避けたい状況において推奨 さ れます。 も し も ページが
こ の fittingpossible テ ス ト で拒絶 さ れた場合には、 その tag オプシ ョ ン を通 じ て追加の
タ グ を挿入す る こ と を試み る こ と も で き ます。

11.3 タ グ付き PDF ページ を PDI で取 り 込む 331


> キーワー ド topleveltagcount は、 最上位レベル構造要素の数を報告 し ます。 なぜな ら 最
上位レベル タ グが複数あ る 場合 も あ る か ら です。 なお topleveltagcount は、 そのページ
内容が何の構造要素に よ っ て も 覆われていない稀な場合において、0 と な る こ と も あ り
ます。 こ の よ う なページは、 タ グ付 き でないページの よ う に動作 し ます。 他の内容ア
イ テ ム と 同様、 こ れはグループ化要素の子 と し て配置す る こ と はで き ず、 そのページ
のて っぺんに追加の タ グが必要です。
> キーワー ド topleveltag は、 その取 り 込まれたページの最上位レベル構造要素 (群) を
報告 し ます。 こ れは、 取 り 込 ま れたページ構造にかぶせて追加の構造要素を挿入す る
こ と がで き る か、 あ る いは挿入す る 必要があ る か ど う か を決定す る ために有用で し ょ
う。
> キーワー ド lang は、 すべての最上位レベルの取 り 込まれた構造要素 (群) の lang 属性
を報告 し ます。 こ れは、 よ り 高い構造要素内で lang 属性が必要か ど う か を決め る 助け
と な り ます。

タ グ付き ページ を配置 PDF_fit_pdi_page( ) が、 取 り 込まれたページ を新たなページ上に


配置 し 、 その構造 ヒ エ ラ ルキーを、 生成文書の構造ツ リ ー内に統合 し ます。 その際には、
カ レ ン ト でア ク テ ィ ブな要素を、 取 り 込まれた構造ツ リ ーの親 と し て用い ます。 追加の構
造要素を、 PDF_fit_pdi_page( ) の tag オプシ ョ ンで作成する こ と も で き ます。 こ れは、 取
り 込まれた構造 ヒ エ ラ ルキーのための新たな親 と し ての役割を果た し ます。
取 り 込まれた ヒ エ ラ ルキー内に Alt ま たは ActualText 属性が存在する 場合には、生成 さ
れ る 文書構造内の も っ と 上にあ る 既存の属性 と の衝突が見出 さ れた と き は、 こ の Alt ま た
は ActualText 属性は除去 さ れます (313 ページ 「代替テ キ ス ト と 置換テ キ ス ト に対する ネ
ス テ ィ ン グ規則」 参照)。
そのページが、 PDF_open_pdi_document( ) と PDF_open_pdi_page( ) で usetags=true を
用いて開かれてい る 場合には、 それは出力文書内に 1 回 し か配置で き ません。 なぜな ら 、
その取 り 込まれた構造は、出力文書の構造 ヒ エ ラ ルキーの一意な位置に統合 さ れ る 必要が
あ る か ら です。 ページが複数の位置において内容 と 構造に寄与す る 場合には、 それを複数
回開 く 必要があ り ます (すなわち、 別々のページハン ド ルが配置 さ れます)。
未知の文書構造を持つページ を取 り 込む際には、 以下の戦略を推奨 し ます :
> PDF_info_pdi_page( )のtopleveltagcountキーワー ド が タ グ カ ウ ン ト 0を報告 し たな ら ば、
そのページは usetags=false を用いて取 り 込まれてい る か、 空であ る か、 ページ装飾の
みを内容 と し てい る かの ど ち ら かです。アプ リ ケーシ ョ ンに よ っ ては、こ の よ う なペー
ジは実質的な内容に全 く 寄与 し な いので ス キ ッ プす る と 決め る こ と も で き る で し ょ
う。
> PDF_info_pdi_page( ) の fittingpossible キー ワー ド が こ のページについて 1 を返 し たな ら
ば、 こ れは PDF_fit_pdi_page( ) で安全に配置で き ます。 こ のテ ス ト は、 そのページが
usetags=false を用いて読み込まれてい る か、 ページ装飾 と し て配置 さ れ る 場合には不
要です。
> あ る いは、 取 り 込ま れたページの構造のて っぺんに追加の タ グ を挿入す る こ と も で き
ます。 こ の タ グ を何にす る かの選択は、 アプ リ ケーシ ョ ンに よ っ て異な り 、 と り わけ、
取 り 込ま れたページが構造ツ リ ー内に挿入 さ れ る 場所にあ る 構造要素の種別に依存 し
ます。
> PDF_info_pdi_page( ) の fittingpossible キーワ ー ド が、 追加の タ グ を用いて も なおその
ページ を拒絶す る な ら ば、 アプ リ ケーシ ョ ンは別の タ グ を試すか、 あ る いはそのペー
ジ を諦め る かの ど ち ら かで し ょ う 。

332 第 11 章 : タ グ付き PDF と PDF/UA


以下の コ ー ド 断片は、 上述の戦略を実装 し た も のです。 ページが直接配置で き ない場合
に、 追加の P 要素を挿入 し てい ます :
fittingpossible = true;
additionaltag = "";

topleveltagcount = (int) p.info_pdi_page(page, "topleveltagcount", "");

if (topleveltagcount == 0)
{
/* このページは構造要素を何も含んでいません、
* すなわち、これは空であるか、ページ装飾のみを内容としています。
* 「Artifact」を追加しましょう。
*/
additionaltag = "tag={tagname=Artifact} ";
}
else
/*
* ページを追加のタグなしで配置してみます。
* これがうまくいかないならば、別のタグを挿入しましょう。
*/
if (p.info_pdi_page(page, "fittingpossible", "") == 0)
{
additionaltag = "tag={tagname=P} ";

if (p.info_pdi_page(page, "fittingpossible", additionaltag) == 0)


{
fittingpossible = false;
}
}

if (fittingpossible)
{
p.fit_pdi_page(page, 0, 0, "adjustpage " + additionaltag);
}
else
{
System.err.println("ページをスキップします: " + p.get_errmsg());
}

さ ま ざ ま な用途 タ グ付 き PDF モー ド でページ を取 り 込む こ と の用途は、 以下の よ う に


分類す る こ と がで き ます : こ れ ら の用途に対す る オプシ ョ ン と 要件を表 11.8 に ま と め ま
す:
> タ グ を温存 : タ グ付 き PDF 文書か ら ページ を取 り 込んで、 その タ グ群を出力へ コ ピー
し ます。 そのページ を構成す る 構造要素群は、 新た な構造 ヒ エ ラ ルキーの一部分 と な
り ます。 オプシ ョ ナルに、 取 り 込 ま れた ヒ エ ラ ルキーのて っぺんに追加の タ グ を配置
す る こ と も で き ます。
> タ グ を無視 : タ グ付 き ま たは タ グ な し PDF 文書か ら ページ を取 り 込んで、 そのページ
全体に 1 個の新た な構造要素で タ グ付け し ます。 既存の構造要素群は破棄 さ れ、 取 り
込まれたページの内容は単一の要素を構成 し 、 内部構造を一切持た な く な り ます。
> ページ装飾 と し て配置: タ グ付 き ま たは タ グ な し PDF 文書か ら ページ を取 り 込みます。
た と えば背景グ ラ フ ィ ッ ク に使 う 場合な ど です。 ページは自動的にページ装飾 と し て
タ グ付け さ れ、 既存の構造要素群は破棄 さ れます。

11.3 タ グ付き PDF ページ を PDI で取 り 込む 333


表 11.8 タ グ付き PDF モー ド で タ グ付き ・ タ グな し PDF ページ を取 り 込み
用途 オプ シ ョ ン 要件 と コ メ ン ト

タ グ を温存 PDF_open_pdi_document( ) > 親1 は、 イ ン ラ イ ン要素か擬似要素であ っ てはいけま


と PDF_open_pdi_page( ) で せん
usetags=true > 取 り 込まれた タ グ付き ページ を配置で き るのは 1 回だ

> 取 り 込まれたページの最上位レ ベル要素 (群) はネ
ス テ ィ ング規則を守る必要があ り ます

タ グ を無視 PDF_open_pdi_document( ) > 取 り 込まれたページの内容は、 カ レ ン ト で ア ク テ ィ


してカレン か PDF_open_pdi_page( ) で ブ なア イ テムの一部分にな り ます
ト 要素内に usetags=false、 そ し て > 非グループ化親要素のみ許容 さ れます
ページ を配 PDF_fit_pdi_page( ) で
置 tagname=Span direct=true

ページ装飾 PDF_open_pdi_document( ) > カ レ ン ト で有効な要素がページ装飾を子 と し て許 し


と し て配置 か PDF_open_pdi_page( ) で ている必要があ り ます
usetags=false、 そ し て > PDF/UA モー ド では内容は自動的にページ装飾 と し て
PDF_fit_pdi_page( ) で タ グ付け さ れます
tagname=Artifact
> ページ を複数回配置で き ます

1. PDF_begin_item( ) で、ま たは PDF_fit_pdi_page( ) の tag オ プ シ ョ ン で指定 さ れた、カ レ ン ト で ア ク テ ィ ブ な タ グ

334 第 11 章 : タ グ付き PDF と PDF/UA


11.4 PDF/UA に よ る ユニバーサルア ク セ シ ビ リ テ ィ ー
11.4.1 PDF/UA-1 規格
注 PDF/UA 規格に関する一般情報が PDFlib ウ ェ ブサイ ト にあ り ます。

注 PDF/UA に初めてふれる方には、 PDF 協会が発行 し た文書 「PDF/UA in a Nutshell」 を推奨


し ます (www.pdfa.org/pdfua-in-a-nutshell/ 参照)。

PDF/UA-1 は、 PDF 文書のユニバーサルア ク セシ ビ リ テ ィ ーを向上 さ せる ために、 タ グ付


き PDF の要素群や、 その他の文書の諸側面の詳細を仕様化 し た も のです。 PDF/UA-1 は、
WCAG 2.0 (Web コ ン テ ン ツ ア ク セシ ビ リ テ ィ ーガ イ ド ラ イ ン群1) を PDF 文書に適用 し
た も の と 捉え る こ と がで き ます。
PDF/UA-1 は、 PDF 1.7 と ISO 32000-1 で定義 さ れてい る タ グ付き PDF に基づいてい
ます。 こ れは PDF フ ァ イ ル形式に何 ら かの新た な機能を加えたのではな く 、 主に、 い く
つかのア ク セシ ビ リ テ ィ ー と タ グ付けの側面が PDF 1.7 ではオプシ ョ ナルであ る のを必須
と し た も のです。 ま た こ れは、 構造要素の さ ま ざ ま な種別ど う し の関係を明確化 し てい ま
す。

ISO 14289-1 で定義 さ れた PDF/UA-1 PDF/UA-1 は、PDF 文書のア ク セシ ビ リ テ ィ ーを向


上 さ せ る ために以下の手段を用いてい ます :
> 文書構造に関す る 特定の要件を強制。 例 : タ グ付け規則な ど。
> 特定の補足情報を必須化。 例 : メ タ デー タ 、 グ ラ フ ィ ッ ク のための代替テ キ ス ト 。
> ア ク セシ ビ リ テ ィ ーの目的を阻害す る 特定の PDF 要素を防止。

PDFlib の PDF/UA-1 の実装は、 以下の文書に基づいてい ます :


> PDF/UA-1 規格 (ISO 14289-1:2014)

注 PDF 協会が発行 し ている文書 「Tagged PDF Best Practice Guide: Syntax」 を推奨 し ます
(www.pdfa.org/resource/tagged-pdf-best-practice-guide-syntax/ にあ り ます)

PDF/UA-1 ・ PDF/A 両立文書を作成 PDF/UA 文書であ り なが ら 、 同時にアーカ イ ビ ン グ


のための PDF/A に も 準拠 し てい る 文書を作成す る と 、 有用な こ と も あ る で し ょ う (346
ページ 「12.2 PDF/A に よ る アーカ イ ビ ン グ」 を参照)。 実際、 PDF/A-1a/2a/3a を作成 し
たい場合には、 PDF/UA の要件を遵守す る こ と に よ っ て、 生成 さ れ る 文書のア ク セシ ビ リ
テ ィ ー を 向上 さ せ る こ と を 推奨 し ま す。 PDF/A ・ PDF/UA-1 両立文書 を 作成す る には、
PDF_begin_document( ) の pdfa ・ pdfua オプシ ョ ンに対 し て適切な値を与え ます。 例 :
ret = p.begin_document("combo.pdf", "pdfa=PDF/A-2a pdfua=PDF/UA-1 lang=en");

こ の よ う な二重用途の文書を作成す る 際には、 両方の規格に準拠す る 両立フ ァ イ ルは、 両


方の規格に よ っ て課せ ら れ る 要件に従 う 必要が あ り ま すので、 留意 し て く だ さ い。 その
PDF 互換レベルは、 関与する 規格群の PDF 互換性の最小値です : 取 り 込まれ る PDF 文書
が、 PDF/UA 規格 と PDF/A 規格の両方を遵守 し てい る 必要があ り ます。
タ グ付 き PDF 出力のためには、 PDF/A-1a を避けて、 も っ と 新 し い PDF/A-2a か PDF/
A-3a 規格のほ う で作業す る こ と を推奨 し ます。 なぜな ら 、 PDF/UA-1 と PDF/A-1a の間
にはい く つか衝突があ る か ら です :

1. www.w3.org/TR/WCAG20/ 参照

11.4 PDF/UA に よ るユニバーサルア ク セシ ビ リ テ ィ ー 335


> PDF/UA-1 は、 注釈が存在す る 場合には、 ページオプシ ョ ン taborder=structure を必須
と し ます。 し か し 、 こ の taborder オプシ ョ ンは PDF 1.5 が必須で、 PDF/A-1a では使
用で き ません。結果 と し て、注釈は PDF/A-1a ・PDF/UA-1 両立文書内では使え ません。
> PDF/UA-1ではTH要素に対 し てscopeオプシ ョ ンが推奨 さ れてい ますが、PDF 1.5でのみ
利用可能であ り 、 PDF/A-1a の場合には使用で き ません。
> THead・TFoot 要素には PDF 1.5 が必要なので、PDF/A-1a の場合にはそれを使用 し て表
内のヘ ッ ダー表行か フ ッ タ ー表行を グループ化す る こ と はで き ません。
ク ッ ク ブ ッ ク PDFlib ク ッ ク ブ ッ ク内の invoice_pdfua1 サン プルが、PDF/UA-1 ・ PDF/A-2a 両立文書を作成
する方法を演示 し ています。

PDFlib は、 技術的な PDF/UA の要件への違反を検出 し た場合には、 例外を発生 さ せます。


こ の場合には PDF 出力は何 も 作成 さ れません。 表 11.9 に、 PDF/UA 準拠出力を作成する
ための一般的要件を挙げます。

表 11.9 PDF/UA 準拠のための一般的要件


項目 PDF/UA-1 準拠のための PDFlib の要件

一般的文書要件 PDF_begin/end_document( ) : pdfua オプ シ ョ ン を PDF/UA-1 に設定する必要があ り ます。 こ


れは タ グ付き PDF を必須 と し ます (tagged オプ シ ョ ンは自動的に設定 さ れます)。
PDF 1.7ext3 以上を要する操作 ( リ ッ チ メ デ ィ ア注釈 ・ ポー ト フ ォ リ オな ど) を避ける必要
があ り ます。 lang オプ シ ョ ンが必須です。
オプ シ ョ ン viewerpreferences : サブオプ シ ョ ン displaydoctitle に対 し て true のみが許
容 さ れます。
オプ シ ョ ン permissions : キーワー ド noaccessible が許容 さ れません。

タ グ付け すべての タ グ付け規則 (303 ページ 「11.1.3 PDF 1.7 の構造要素ネス テ ィ ング規則」 参照)
に従 う 必要があ り ます。 checktags 文書オプ シ ョ ン を none に設定 し てはいけません。

フォン ト フ ォ ン ト オプ シ ョ ン embedding を true にする必要があ り ます。 オプ シ ョ ン


unicodemap=false が許容 さ れません。 埋め込みは標準 Type 1 フ ォ ン ト について も必須で
す。

テキス ト 出力 と PUA PUA Unicode キ ャ ラ ク タ ー (ロ ゴや記号な ど) が、 適切な置換テキス ト を持つ必要があ り


Unicodeキ ャ ラ ク ます。 それを囲 う 内容ア イ テムに対する PDF_begin_item( ) の ActualText オプ シ ョ ン で指定
ター するか、 その対応する出力 メ ソ ッ ド の同等の tag オプ シ ョ ン で指定 し ます (353 ページ
「PUA キ ャ ラ ク タ ー」 参照)。

不可視テキス ト 埋め込み必須は、 不可視テキス ト (主 と し て OCR の生成結果のために有用) に対 し てのみ


用い られている フ ォ ン ト についてだけはあてはま り ません。 不可視 と は textrendering=3
です。 これは、 optimizeinvisible オプ シ ョ ン を用いて制御する こ と も で き ます。
不可視テキス ト は、 レ ン ダ リ ング さ れる等価物を一切持たない場合には、 Artifact と し て
マー ク する必要があ り ます。

レ イ ヤー レ イ ヤーを使え ますが、 ただ し PDF_define_layer( ) のい く つかのオプ シ ョ ン を避ける必要が


あ り ます (PDFlib API リ フ ァ レ ン ス参照)。

外部内容 PDF_begin_template_ext( ) ・ PDF_load_graphics( ) ・ PDF_open_pdi_page( ) : reference オプ シ ョ


ン を避ける必要があ り ます。

PDF取 り 込み PDF_open_pdi_document( ) : 取 り 込まれる文書が PDF/UA に準拠 し ている必要があ り ます。


340 ページ 「11.4.4 PDF/UA 文書のページ を PDI で取 り 込む」 を参照 し て く だ さ い。

メ タ デー タ PDF_set_info( ) で key=Title を、 ま たは PDF_begin/end_document( ) で metadata に与え る


XMP 内で dc:title を、 空でない値 と と も に与え る必要があ り ます。

336 第 11 章 : タ グ付き PDF と PDF/UA


11.4.2 タ グ付けの要件
PDF/UA は、 タ グ付 き PDF に基づいてい ますので、 293 ページ 「11.1 タ グ付き PDF の基
礎」 で説明 し た タ グ付 き PDF の要件に従 う 必要があ り ます。 ただ し 、 PDF/UA-1 は こ れ
に加え て、 タ グ付けの要件を多数課す る こ と に よ っ て、 ア ク セシ ビ リ テ ィ ーの向上を図っ
てい ます。

意味付けの要件 ユーザーは、文書 ヒ エ ラ ルキーを作成 し 、以下に挙げ る 意味付け規則に


従 う 必要があ り ます。 適切な構造要素を選ぶ こ と は、 PDF/UA 規格準拠の決定的な構成要
素です。 こ れ ら の側面に責任を負 う のはアプ リ ケーシ ョ ン側であ る こ と を理解す る こ と が
重要です。 なぜな ら PDFlib は こ れ ら をチ ェ ッ ク で き ないか ら です :
> タ グ付けは、 その文書構造に対 し て適切な構造要素を用い る 必要があ り ます : それが
見出 し であ る な ら 、 それを見出 し と し て タ グ付けす る 必要があ り ます。 それが表であ
る な ら 、 それを表 と し て タ グ付けす る 必要があ り ます。
> その文書に と っ て意味を な さ ない内容を、 その文書 ヒ エ ラ ルキー内に含めてはいけ ま
せん。 それは Artifact と し て タ グ付けす る 必要があ り ます。
> 構造要素群を、 論理読み取 り 順序に配列す る 必要があ り ます。 こ れは、 その タ グ群を
読み順に作成す る こ と に よ っ て最 も 容易に達成で き ます。 ただ し 、 複雑な レ イ ア ウ ト
に対 し ては、 PDF_activate_item( ) を用いて こ れを達成する こ と も で き ます (327 ペー
ジ 「11.2.5 内容を順序に と ら われず作成」 参照)。
> 内容の色や形式やレ イ ア ウ ト のせいで、 意図す る 情報がその ま ま ではア ク セシブルで
ない内容に、 適切に タ グ付けす る 必要があ り ます。
> グ ラ フ ィ ッ ク 内で表現 さ れてい る テ キ ス ト は、 も し それがテ キ ス ト を自然言語で含ま
ない場合には (フ ォ ン ト サンプルやス ク リ プ ト サンプルな ど)、 説明を持っ た Alt オプ
シ ョ ン を必須 と し ます。
> 画像のキ ャ プシ ョ ン を Caption タ グでマー ク す る 必要があ り ます。
> 内容が リ ス ト と し て読まれ る こ と を意図 し てい る 場合には、 リ ス ト 要素 (L) を作成す
る 必要があ り ます。
> ヘ ッ ダー と フ ッ タ ーを Artifact と し て、artifacttype=Pagination と artifactsubtype=Header
か Footer と と も に タ グ付けす る 必要があ り ます。
> 論理的に一体であ る グ ラ フ ィ カル要素群のグループに対 し ては、ただ 1 つの Figure を作
成す る 必要があ り ます。
> 脚注 ・ 後注 ・ 注 ラ ベル と 、 その文書内の場所への参照に、 適切に Note か Reference と し
て タ グ付けす る 必要があ り ます。

注 PDF 協会が発行 し た文書 「Tagged PDF Best Practice Guide: Syntax」 は、 PDF/UA-1 のための
タ グ付き PDF 構造要素の正 し い使い方に関する ガ イ ダ ン ス を提供 し ています。

タ グご と の要件 表 11.10 に、 PDF/UA-1 準拠を達成する ための、 タ グ ご と に対す る 要件


を挙げます。 こ こ に挙げた標準種別へマ ッ プ さ れた カ ス タ ム構造種別について も 、 こ れ ら
の規則に従 う 必要があ り ます。た と えば、rolemap オプシ ョ ン内でカ ス タ ム タ グ Illustration
が Figure へマ ッ プ さ れてい る な ら ば、 それ も Figure に対す る 条件下に置かれます。

表 11.10 PDF/UA-1 準拠のための タ グご と の要件


構造種別 PDF/UA-1 準拠のための PDFlib の要件

標準構造種別 PDF_begin_document( ) : rolemap オプ シ ョ ンが標準構造種別を マ ッ プ し てはいけません。

Figure オプ シ ョ ン Alt か ActualText の う ちの 1 つを与え る必要があ り ます。

11.4 PDF/UA に よ るユニバーサルア ク セシ ビ リ テ ィ ー 337


表 11.10 PDF/UA-1 準拠のための タ グご と の要件
構造種別 PDF/UA-1 準拠のための PDFlib の要件
Formula オプ シ ョ ン Alt を与え る必要があ り ます。

Table 表要素は、 論理的な表に対 し ては作成する必要があ り ますが、 レ イ アウ ト 目的のために作


成 さ れる表に対 し ては作成 し てはいけません。 PDFlib によ っ て組版 さ れる表は自動的に タ
グ付けで き ます。 317 ページ 「11.2.1 自動表 タ グ付け」 を参照 し て く だ さ い。
TH 表はヘ ッ ダーを含むべき です。 TH 要素に対 し てはオプ シ ョ ン Scope が推奨 さ れます ( これ
は、 PDF_fit_table( ) の header オプ シ ョ ンが用い られている場合には、 自動表 タ グ付けに
よ っ て常に生成 さ れます)。
L 構造種別 L ( リ ス ト ) は ListNumbering オプ シ ョ ン を必須 と し ます。 その子 LI ( リ ス ト 項
目) 群がいずれも Lbl (ラ ベル) 要素を含ま ない場合には、 ListNumbering を None にする
必要があ り ます。 一方、 も し も ListNumbering=None であ り なが ら、 可視な リ ス ト ラ ベルが
あ る場合には、 それら をページ装飾 と し てマー ク する必要があ り ます。
Note Note と し て タ グ付け さ れる脚注 と 後注に対 し ては id オプ シ ョ ンが必須です (id はど こ で
も参照 さ れていませんので、 こ れは何の得 も も も た ら し ませんが)。

見出 し すべての見出 し に対 し て、 適切な見出 し タ グ を用い る 必要があ り ます。 PDF 文


書内におけ る 見出 し の階層ネ ス ト については 2 通 り のアプ ロ ーチがあ り ます :
> 強 く 構造化 さ れた文書 : グループ化要素群が、 必要なだけ深 く ネ ス ト す る こ と に よ っ
て、 アーテ ィ ク ル ・ セ ク シ ョ ン ・ 下位セ ク シ ョ ン な ど を持っ た内容の組織を反映 し ま
す。 各レベルにおいて、 そのグループ化要素の子群は、 1 個の見出 し H と 、 その レベ
ルの内容のための 1 個ない し 複数の段落 P と 、 ネ ス ト さ れた下位セ ク シ ョ ン群のため
の さ ら な る グループ化要素群か ら 成 る べ き です。 強い構造は通常、 XML 文書において
用い ら れます。
> 弱 く 構造化 さ れた文書 : その文書の構造 ヒ エ ラ ルキーが比較的フ ラ ッ ト であ り 、 ほん
の 1 ~ 2 個の レベルのグループ化要素群を持ち、 すべての見出 し ・ 段落やその他 BLSE
群を それ ら の直接の子 と し ます。 その内容の組織が、 その論理構造 と し て反映 さ れず、
特定の見出 し レベル H1 ・ H2 ・ H3 な ど に よ っ て表現で き ます。 見出 し タ グは子孫を一
切持て ません。 弱い文書構造は通常、 HTML 内において用い ら れます。

PDF/UA-1 モー ド においては、 こ の区別を明示す る ために、 structuretype 文書オプシ ョ ン


を用い る 必要があ り ます。 PDFlib は、 文書構造の種別に応 じ て、 見出 し 要素の使用に関す
る 以下の規則を強制 し ます。
> すべての文書 :
> すべての見出 し タ グ内で Title オプシ ョ ン を用い る こ と に よ っ て、 文書のセ ク シ ョ ン
を表示す る 必要があ り ます (例 : 「第 1 章」)。
> 見出 し 要素 H ・ H1 ・ H2 な どは子孫を一切持っ てはいけ ません。
> 弱 く 構造化 さ れた文書、 すなわち structuretype=weak (デフ ォ ル ト ) :
> 見出 し の連鎖は、 H1 か ら 始ま り 、 数値レベルを一切ス キ ッ プ し てはいけ ません。 た
と えば、 H1 H3 と い う 連鎖は許容 さ れません。
> 6 個を超え る 見出 し レベルが必要な場合には、 追加の見出 し レベル H7 ・ H8 な ど を使
う こ と も で き ます。 こ れ ら は標準構造種別ではあ り ませんので、 rolemap オプシ ョ ン
内にエン ト リ ーが必要です。 推奨 さ れ る マ ッ ピ ン グは P です。
> 番号な し の見出 し 要素 H を使っ てはいけ ません。
> 強 く 構造化 さ れた文書、 すなわち structuretype=strong (非推奨) :

338 第 11 章 : タ グ付き PDF と PDF/UA


> 見出 し のためにH を用い る 必要があ り ますが、ただ し その構造 ヒ エ ラ ルキーの各 ノ ー
ド 内に複数の H タ グがあ っ てはいけ ません。
> 番号付 き の見出 し 要素 H1 ・ H2 な ど を使っ てはいけ ません。

11.4.3 内容種別ご と の追加の要件


表 11.11 に、 さ ま ざ ま な内容種別 と イ ン タ ラ ク テ ィ ブ要素に関連 し た PDF/UA-1 の要件 と
推奨事項を挙げます。

表 11.11 内容種別 と イ ン タ ラ ク テ ィ ブ要素ご と に対する PDF/UA-1 の要件 と 推奨事項


内容種別 PDF/UA-1 準拠のための PDFlib の要件

テキス ト ページ上のすべてのテキス ト の自然言語を宣言する必要があ り ます。 テキス ト 列内の自然


言語の変化 も宣言する必要があ り ます。 こ の自然元 と を宣言する には、 PDF_begin_
document( ) の lang オプ シ ョ ンやその他の手段を用います。 詳 し く は 311 ページ 「言語指
定」 を参照 し て く だ さ い。 要素の言語属性はそのすべての子孫へ継承 さ れます。

ベ ク ト ルグ ラ ラ ス タ ー画像 と ベ ク ト ルグ ラ フ ィ ッ ク に、 Artifact か Figure か Formula と し て タ グ付け


フ ィ ッ ク と ラス する必要があ り ます。 こ れは、 PDF_rect( ) な どのよ う な低レ ベルパス構築関数 と 、 PDF_
タ ー画像 draw_path( ) を用いたパスオブ ジ ェ ク ト と 、 PDF_fit_image( ) や同様の関数にあてはま り ます。
ベ ク ト ルグ ラ フ ィ ッ クかラ ス タ ー画像を内容 と し て持つ SVG グ ラ フ ィ ッ ク も 、 こ の要件の
対象 と な り ます。
取 り 込まれた PDF_fit_pdi_page( ) を用いて配置 さ れた、 グ ラ フ ィ ッ ク を含んだ PDF ページに、 Artifact か
PDFページ Figure と し て タ グ付けする必要があ り ます。

注釈 PDF_begin/end_page_ext( ) : オプ シ ョ ン taborder に対 し て値 structure のみが許容 さ れま


す。
PDF_create_annotation( ) で type=Link と する場合 : その注釈は Link 構造要素内に含まれて
いる必要があ り ます。
> PDF_create_action( ) の ismap オプ シ ョ ンが、 リ ン ク注釈内のア ク シ ョ ンに対 し ては許容 さ
れません。
PDF_create_annotation( ) で種別を Link ・ Popup 以外 と する場合 :
> その注釈は Annot 構造要素内に含まれている必要があ り ます。
> 可視注釈1のためには、サブオプ シ ョ ン ActualText を持 っ た contents オプ シ ョ ンか tag オ
プ シ ョ ンが必須です。
PDF_fit_pdi_page( ) : ページが usetags=false を用いて開かれている場合には、 useannots ・
usefields オプ シ ョ ン で none 以外の値は許 さ れません。

フ ォ ーム ページ上に フ ォ ーム フ ィ ール ド が存在する場合 : PDF_begin/end_page_ext( ) : オプ シ ョ ン


フ ィ ール ド taborder に対 し て値 structure のみが許容 さ れます。
PDF_create_field( ) と 、 PDF_add_table_cell( ) のオプ シ ョ ン fieldname ・ fieldtype : PDF_
create_field( ) か tag オプ シ ョ ン を用いて Form タ グ を作成する必要があ り ます。 PDF_create_
field( ) と PDF_create_fieldgroup( ) のオプ シ ョ ンが必須です。

ページ ラ ベル PDF_begin/end_document( ) で labels オプ シ ョ ン を用いて、 および PDF_begin/end_page_ext( )


で label オプ シ ョ ン を用いて作成 さ れるページ ラ ベルは、 意味付け的に適切であ るべき で
す。

しおり PDF_create_bookmark( ) を用いて し お り を生成する こ と が推奨 さ れます。 こ の し お り 群は、


正 し い読み取 り 順序 と 、 その内容のネス ト を反映するべき です。

添付 PDF_load_asset( ) : オプ シ ョ ン description が推奨 さ れます。 添付はそれ自体でア ク セシ ブ


ルであ るべき です。

1. 注釈が可視 と 見 な さ れ る のは、 そ の長方形の少 な く と も 一部分が そ のペ ー ジ の CropBox 内 に あ り 、 かつ PDF_create_


annotation( ) の display オ プ シ ョ ンが hidden ・ noview 以外の場合です。

11.4 PDF/UA に よ るユニバーサルア ク セシ ビ リ テ ィ ー 339


11.4.4 PDF/UA 文書のページ を PDI で取 り 込む
既存の PDF 文書か ら のページ を PDF/UA 準拠出力文書へ取 り 込 も う と する 際には、 追加
の諸規則が適用 さ れます (PDF 取 り 込みについて詳 し く は 211 ページ 「8.3 PDF ページ を
PDI で取 り 込む」 を参照 し て く だ さ い)。 既存の PDF 文書か ら タ グ付き ページ を取 り 込む
ためには、 その取 り 込まれ る 文書 と ページが、 以下の ク ラ イ テ リ アに従っ て カ レ ン ト 文書
に互換であ る 必要があ り ます :
> PDF_open_pdi_document( ) : PDF/UA-1 文書を取 り 込む こ と がで き 、 かつ usetags オプ
シ ョ ン を true にする 必要があ り ます。 タ グ な し 文書、非 PDF/UA 文書、PDF_open_pdi_
document( ) で usetags=false を用いて読み込まれた タ グ付 き 文書 も 配置で き ます。ただ
し 、 その よ う なページは自動的にページ装飾 と し て標識 さ れます。
> PDF_open_pdi_page( ) : 取 り 込まれ る 文書の ロ ールマ ッ プが、PDF_begin_document( ) の
rolemap オプシ ョ ンに よ っ て与え ら れたマ ッ ピ ン グ と 互換であ る 必要があ り ます。 こ
れはすなわち、 カ ス タ ム構造種別が、 rolemap オプシ ョ ン と 、 取 り 込まれ る 文書の ロ ー
ルマ ッ プ (ま たはそれ以前に取 り 込 ま れた文書の ロ ールマ ッ プ) と で、 別々の標準種
別へマ ッ プ さ れていてはいけない と い う こ と です。
> PDF_open_pdi_page( ) : 取 り 込まれ る ページの見出 し 構造が、 生成 さ れ る 文書の構造種
別 と 互換であ る 必要があ り ます。 すなわち、 structuretype=weak の場合には H1 ・ H2 な
ど のみ(H は不可)がそのページ上で使われてい る 必要があ り ます:structuretype=strong
の場合には H のみ (H1 ・ H2 は不可) が、 その取 り 込まれ る ページ上で使われてい る 必
要があ り ます : 番号付 き と 番号な し の見出 し を両方持っ たページは拒絶 さ れます。

PDFlib 内で PDF/UA-1 準拠が構成 さ れてお り 、 かつ取 り 込まれた文書が上記の要件を遵


守 し てい る な ら ば、 生成 さ れ る 文書 も PDF/UA-1 に準拠 し てい る こ と が保証 さ れます。

注 PDFlib は、 PDF 入力文書の PDF/UA 準拠に関する検証は行わず、 任意の入力 PDF 文書を


PDF/UA へ変換する こ と も で き ません。

340 第 11 章 : タ グ付き PDF と PDF/UA


12 PDF のバージ ョ ン と 規格
注 PDF/UA 規格については 335 ページ「11.4 PDF/UA によ るユニバーサルア ク セシ ビ リ テ ィ ー」
で扱っ ています。

12.1 PDF のバージ ョ ン


12.1.1 PDF のバージ ョ ンの概観
PDFlib は以下の PDF バージ ョ ンの う ちいずれか 1 つに従っ た出力を生成 し ます :
> PDF 1.4 (Acrobat 5、 2001 年 リ リ ース)。 主に PDF/A-1 を生成する ために有用
> PDF 1.5 (Acrobat 6、 2003 年 リ リ ース)
> PDF 1.6 (Acrobat 7、 2005 年 リ リ ース)
> PDF 1.7 (Acrobat 8、 2006 年 リ リ ース)。 技術的には ISO 32 000-1:2008 と 同等
> PDF 1.7 Adobe 拡張レベル 3 (Acrobat 9、 2008 年 リ リ ース)
> PDF 1.7 Adobe 拡張レベル 8 (Acrobat X/XI/DC、 2010/2012/2015 ~ 2021 年 リ リ ース)
> ISO 32000-2 に従っ た PDF 2.0:2017。 年月入 り 改訂版 ISO 32000-2:2020 を含みます

PDF 出力のバージ ョ ンは、 PDF_begin_document( ) の compatibility オプシ ョ ンで制御す る


こ と がで き ます。 ど の PDF 互換モー ド で も 、 それ よ り も 高い レベルのための PDFlib 機能
を利用する こ と はで き ません (表 12.1 参照)。 その よ う な機能を利用 し よ う と す る と 例外
が発生 し ます。

PDI で取 り 込む文書の PDF バージ ョ ン ど の互換モー ド において も 、PDI で取 り 込め る の


はそれ以下の PDF バージ ョ ンの PDF 文書だけです。 それ よ り 新 し い PDF バージ ョ ンの
PDF を取 り 込む必要があ る 場合は、 それに合っ た compatibility オプシ ョ ン を設定す る 必
要があ り ます (213 ページ 「8.3.3 文書 ・ ページ関連のチ ェ ッ ク 」 参照)。 ただ し こ の上位
PDF バージ ョ ン取 り 込み不可ルールの例外 と し て、 PDF 1.7 拡張レベル 3 (Acrobat 9) ・
PDF 1.7 拡張レベル 8 (Acrobat X/XI/DC) に従っ た文書は PDF 1.7 ・ PDF 2.0 文書へ も 取
り 込む こ と が可能です。

12.1 PDF のバージ ョ ン 341


12.1.2 PDF 1.x の機能
表 12.1 特定の PDF 互換モー ド を要する PDFlib 機能
機能 PDFlib API メ ソ ッ ド ・ オプ シ ョ ン

PDF 1.7 拡張レ ベル 8 (Acrobat X/XI/DC) 以上を要する機能

AES-256 を用いて PDF を暗号化 PDF_begin_document( ) : masterpassword か userpassword オプ シ ョ ン を与え


た場合には、 256 ビ ッ ト を用いた AES 暗号化 と 、 こ れよ り 前の PDF バー
ジ ョ ン よ り も 強力な暗号化アルゴ リ ズムが使用 さ れます。

PDF 1.7 拡張レ ベル 3 (Acrobat 9) 以上を要する機能

マルチ メ デ ィ ア PDF_load_asset( ) で type=3D/Sound/Video を用いる


PDF_create_annotation( ) : オプ シ ョ ン type=RichMedia
PDF_create_action( ) : オプ シ ョ ン type=RichMediaExecute

地理空間 PDF PDF_begin_document( ) : オプ シ ョ ン viewports


PDF_load_image( ) : オプ シ ョ ン georeference

フ ォ ルダーのあ る PDF_add_portfolio_folder( )
PDF ポー ト フ ォ リ オ

PRC 形式の 3D モデルの埋め込み PDF_load_3ddata( ) : オプ シ ョ ン type=PRC

PDF 1.7 = ISO 32000-1 (Acrobat 8) 以上を要する機能


PDF ポー ト フ ォ リ オ PDF_begin_document( ) : オプ シ ョ ン portfolio
PDF_add_portfolio_file( )

添付に Unicode フ ァ イル名 PDF_begin/end_document( ) : オプ シ ョ ン attachments、 サブオプ シ ョ ン


filename

PDF 1.6 (Acrobat 7) 以上を要する機能


AES-128 を用いて PDF を暗号化 PDF_begin_document( ) : masterpassword か userpassword オプ シ ョ ン

NChannel カ ラ ー PDF_create_devicen( ) : オプ シ ョ ン subtype=nchannel

ユーザー単位 PDF_begin/end_document( ) : オプ シ ョ ン userunit

印刷の拡縮 PDF_begin/end_document( ) : viewerpreferences オプ シ ョ ンに対するサブオ


プ シ ョ ン printscaling

文書を開 く モー ド PDF_begin/end_document( ) : オプ シ ョ ン openmode=attachments

フ ァ イル添付のみを暗号化 PDF_begin/end_document( ) : オプ シ ョ ン attachmentpassword

添付の説明 PDF_begin/end_document( ) : オプ シ ョ ン attachments に対するサブオプ シ ョ


ン description

U3D 形式の 3D モデルの埋め込み PDF_load_3ddata( ) ・ PDF_create_3dview( )


PDF_create_annotation( ) : オプ シ ョ ン type=3D
PDF_create_action( ) : オプ シ ョ ン type=GoTo3DView

PDF 1.5 (Acrobat 6) 以上を要する機能

マルチ メ デ ィ ア PDF_load_asset( ) で type=Rendition を用いる


PDF_create_annotation( ) : オプ シ ョ ン type=Screen
PDF_create_action( ) : オプ シ ョ ン type=Rendition

342 第 12 章 : PDF のバージ ョ ン と 規格


表 12.1 特定の PDF 互換モー ド を要する PDFlib 機能
機能 PDFlib API メ ソ ッ ド ・ オプ シ ョ ン

イ ンキ 8 色を超え る PDF_create_devicen( ) : オプ シ ョ ン names


DeviceN 色空間

さ ま ざ ま な フ ィ ール ド オプ シ ョ ン PDF_create_field( ) ・ PDF_create_fieldgroup( )
ページ レ イ アウ ト PDF_begin/end_document( ) : オプ シ ョ ン pagelayout=twopageleft/right

さ ま ざ ま な注釈オプ シ ョ ン PDF_create_annotation( )
拡張権限設定 PDF_begin_document( ) で permissions=plainmetadata、 表 3.3 参照

タ グ付き PDF PDF_begin_item( ) に対する さ ま ざ ま なオプ シ ョ ン。


PDF_begin/end_page_ext( ) : オプ シ ョ ン taborder

レ イ ヤー PDF_define_layer( ) ・ PDF_begin_layer( ) ・ PDF_end_layer( ) ・ PDF_layer_


dependency( )

JPEG 2000 画像 PDF_load_image( ) で imagetype=jpeg2000

圧縮オブ ジ ェ ク ト ス ト リ ーム compatibility=1.5 以上の場合には、 自動的に圧縮オブ ジ ェ ク ト ス ト リ ーム


が生成 さ れます。 ただ し 、 PDF_begin_document( ) で objectstreams=none と
設定 さ れている場合を除き ます。

12.1.3 PDF 2.0 の機能


PDF 2.0 は ISO 32000-2:2017 で仕様定義 さ れてお り 、年月入 り 改訂版 ISO 32000-2:2020 で
改定 さ れてい ます。 PDF 2.0 は以下のグループの機能を導入 し てい ます :
> Acrobat 9 の諸機能。PDFlib では compatibility=pdf1.7ext3 文書オプシ ョ ンで対応 し てい ま
す。 た と えば地理参照付 き PDF ・ ヒ エ ラ ルキー型ポー ト フ ォ リ オ ・ AES-256 暗号化な
ど。 詳 し い一覧については表 12.1 を参照 し て く だ さ い。
> Acrobat Xの諸機能。PDFlibではcompatibility=pdf1.7ext8文書オプシ ョ ンで対応 し てい ま
す。 と り わけ、 よ り 強力な暗号化アルゴ リ ズ ム を用いた AES-256 暗号化。
> PDF/X ・ PDF/A-3 ・ PDF/VT 規格のいずれかで導入 さ れた諸機能、 すなわち出力 イ ン テ
ン ト ・ 連携フ ァ イ ル ・ 文書部分 ヒ エ ラ ルキーな ど。
> 表 12.2 に挙げ る 追加機能。

PDF 2.0 について さ ら に詳 し い説明が PDFlib の ウ ェ ブサ イ ト にあ り ます。

12.1.4 PDF の廃止済の機能


PDF 2.0 で廃止済の機能 PDF 2.0 では、 表 12.3 に挙げ る 、 それ よ り 前のバージ ョ ン群に
おいて利用可能であ っ た機能のい く つかが廃止にな っ てい ます。 こ れ ら の機能が使われて
い る 場合には、 PDFlib は PDF 1.x モー ド では警告を、 PDF 2.0 モー ド ではエ ラ ーを発 し ま
す。 PDF 1.x モー ド で も こ れ ら の機能を避け る こ と を推奨 し ます。

ISO 32000 外の機能 表 12.4 に挙げ る 機能は、 ISO 32000-1 の一部であ っ た こ と はあ り ま


せん。 こ れ ら は Acrobat でのみ動作 し 、 サー ド パーテ ィ ーのビ ュ ーアー群では動作 し ませ
ん。 こ れ ら の機能のいずれかが使用 さ れてい る 場合には、 PDFlib は PDF 1.x モー ド では警
告を、 PDF 2.0 モー ド ではエ ラ ーを発 し ます。 こ れ ら の機能は標準の PDF の一部ではない
ので、 PDF 1.x モー ド で も 避け る こ と を推奨 し ます。

12.1 PDF のバージ ョ ン 343


表 12.2 PDF.2.0 (ISO 32000-2) か特定の PDF/A ・ PDF/VT ・ PDF/X いずれかの規格を要する機能
機能 PDFlib API メ ソ ッ ド ・ オプ シ ョ ン

タ グ付き PDF 以下の構造要素を、 PDF_begin_item( ) と 、 さ ま ざ ま な メ ソ ッ ド の tag オプ


シ ョ ンに与え るには、 PDF 2.0 を要 し ます : DocumentFragment ・ Aside ・ H7 な
ど ・ Title ・ FENote ・ Sub ・ Em ・ Strong ・ Artifact (構造 ヒ エ ラ ルキーの要素
と し て)
構造移動先 : PDF_add_nameddest( ) に対する移動先オプ シ ョ ン群 と 、 PDF_
create_action( ) ・ PDF_create_annotation( ) ・ PDF_create_bookmark( ) ・ PDF_
begin/end_document( ) で structdest オプ シ ョ ン を用いた場合の移動先オプ
ション
PDF_create_action( ) で remotestructdest オプ シ ョ ン を用いた場合
PDF 2.0 で構造要素に対する新たなネス テ ィ ン グ規則が導入 さ れています。
PDF 2.0 でオプ シ ョ ンが追加 さ れている構造エ レ メ ン ト 属性があ り ます。 例 :
artifacttype ・ artifactsubtype ・ ListNumbering
構造要素群のための名前空間 : PDF_end_document( ) の pdftagset ・ tagset オ
プ シ ョ ン と 、 PDF_begin_item( ) の namespace オプ シ ョ ン

出力イ ン テ ン ト 文書レ ベル出力イ ン テ ン ト ICC プ ロ フ ァ イルが PDF 2.0 ・ PDF/A ・ PDF/X の


いずれかを要する : PDF_load_iccprofile( ) で usage=outputintent を用いた場

ページ レ ベル出力イ ン テ ン ト ICC プ ロ フ ァ イルが PDF 2.0 を要する : PDF_
begin_page_ext( ) で outputintents オプ シ ョ ン を用いた場合

グ ラ フ ィ ッ ク ス テー ト PDF_create_gstate( ) と 、 さ ま ざ ま な メ ソ ッ ド の gstate オプ シ ョ ン :
useblackptcomp ・ halftoneorigin オプ シ ョ ン

タ ブ順序 PDF_begin/end_page_ext( ) : taborder オプ シ ョ ンに対する annotations ・


widgets キーワー ド

文書部分 ヒ エ ラ ルキー PDF_begin/end_dpart( ) : 文書部分 ヒ エ ラルキーは PDF 2.0 か PDF/VT を要 し


ます。

フ ァ イル添付の関係 PDF_load_asset( ) で type=Attachment を用いた場合 と PDF_add_portfolio_file( )


に対する relationship オプ シ ョ ン、 および PDF_begin/end_document( ) の
attachments オプ シ ョ ン と PDF_create_annotation( ) の attachment オプ シ ョ ン
に対する relationship サブオプ シ ョ ン : 関係指定は PDF 2.0 か PDF/A-3 を
要 し ます。

連携フ ァ イル PDF_end_document( ) ・ PDF_begin/end_page_ext( ) ・ PDF_begin/end_dpart( ) ・


PDF_begin_template_ext( ) ・ PDF_load_image( ) ・ PDF_open_pdi_page( ) ・ PDF_load_
graphics( ) に対する associatedfiles オプ シ ョ ン : PDF 2.0 か PDF/A-3 を要
し ます。
PDF_create_annotation( ) ・ PDF_begin_item( ) に対する associatedfiles オプ
シ ョ ン と 、 さ ま ざ ま な メ ソ ッ ド の tag オプ シ ョ ンは、 PDF 2.0 を要 し ます
PDF_end_document( ) に対する structureassociatedfiles オプ シ ョ ンは PDF
2.0 を要 し ます。

注釈 PDF_create_annotation( ) : blendmode ・ lang ・ opacityfill オプ シ ョ ン

344 第 12 章 : PDF のバージ ョ ン と 規格


表 12.3 PDF 2.0 では廃止済だが PDF 1.x モー ド では今 も利用可能な PDF 機能
PDF 2.0 で廃止済の PDFlib の機能 注

PDF_begin_document( ) : 文書のア ク セシ ビ リ テ ィ を制限する こ と は PDF 2.0 では廃止済。


permissions で noaccessible
キーワー ド

PDF_begin/end_document( ) : プ リ プ レ スのビ ュ ーア環境設定は PDF 2.0 では廃止済。


viewerpreferences、 printarea ・
printclip ・ viewarea ・ viewclip
サブオプ シ ョ ン

PDF_begin_page_ext( ) ・ PDF_end_ 分版辞書は PDF 2.0 では廃止済。


page_ext( ) : separationinfo

PDF_create_annotation( ) : type=RichMedia を使用。


type=Movie

PDF_create_action( ) : type=Movie type=RichMediaExecute を使用。

PDF_create_gstate( ) : blendmode ブ レ ン ド モー ド 配列は PDF 2.0 では廃止済。


はただ 1 つのキーワー ド のみを受
け付け、 複数の値の リ ス ト を受け
付けません

表 12.4 ISO 32000 外だが PDF 1.x モー ド では今も 利用可能な PDF 機能


ISO 32000 外の機能 PDFlib API メ ソ ッ ド ・ オプ シ ョ ン

バー コ ー ド フ ィ ール ド PDF_create_field( ) ・ PDF_create_fieldgroup( ) : barcode

検索イ ンデ ッ ク ス PDF_begin/end_document( ) : search

編集可能な透か し PDF_begin_template_ext( ) : watermark

12.1 PDF のバージ ョ ン 345


12.2 PDF/A に よ る アー カ イ ビ ン グ
12.2.1 各種の PDF/A 規格
注 PDF/A 規格に関する一般情報が PDF ウ ェ ブサイ ト にあ り ます。

ISO 19005 規格シ リ ーズで定め ら れた各種の PDF/A 形式は、長期間にわた っ て安全にアー


カ イ ブで き る 、あ る いは企業や政府の環境において信頼性を持っ たデー タ 交換に利用で き
る 、 首尾一貫、 かつ堅牢な PDF の部分集合を提供 し ます。

PDF 協会におけ る PDF/A PDFlib GmbH は PDF 協会 (the


PDF Association) の創立 メ ンバーです。 PDF 協会は、 その
さ ま ざ ま な活動の 1 つ と し て、 PDF/A 技術 ワーキ ン グ グ
ループ (TWG) を ホ ス ト し てい ま す。 こ の業界組織の目
的は 「オープン標準ベース の PDF 技術を利用 し た電子文
書実装を、 教育 ・ 専門技術 ・ 経験共有を通 じ て、 全世界の
ス テー ク ホルダーのために促進す る 」 です。詳 し く は PDF
協会の ウ ェ ブサ イ ト www.pdfa.org を訪れて く だ さ い。

ISO 19005-1 に従 っ た PDF/A-1a:2005 ・ PDF/A-1b:2005 PDF/A-1 は PDF 1.4 をベース に、


色 ・ フ ォ ン ト ・ 注釈な ど の要素の使用に さ ま ざ ま な制約を課 し てい ます。 PDF/A-1 には 2
つの種類があ り ます :
> ISO 19005-1 レベル B 準拠 (PDF/A-1b) は、文書の体裁が長期にわた っ て保持 さ れ る こ
と を保証 し ます。 簡単にいえば PDF/A-1b は、 文書を将来いつの日か処理する と き に
それが今 と 同 じ に見え る こ と を保証す る も のです。
> ISO 19005-1 レベル A 準拠 (PDF/A-1a) は、レベル B をベース に、タ グ付 き PDF か ら 知
ら れた諸特性を追加 し ます : こ れは、 文書の論理構造 と 自然な読み上げ順序を保持す
る た めに、 構造情報 と 、 信頼のおけ る テ キ ス ト 意味付け を 必須 と し ま す。 PDF/A-1a
は、 その文書が将来において処理 さ れ る 際にそれが同 じ に見え る こ と を保証す る のみ
な ら ず、 その コ ン テ ン ツ を信頼性を持っ て解釈で き 、 身体障碍を持つユーザーに対 し
て も ア ク セシブルであ る こ と を保証す る も のです。

PDFlib 内の PDF/A-1 対応は以下の文書に基づいてい ます :


> PDF/A-1 規格 (ISO 19005-1:2005)
> 技術正誤表 1 (ISO 19005-1:2005/Cor 1:2007)。
> 技術正誤表 2 (ISO 19005-1:2005/Cor.2:2011)。
> PDF 協会が発行 し た TechNote 0010 「Clarifications of ISO 19005」。

PDF/A-1 と (準拠レベルを添えずに) 言 う と き は、 PDF/A-1a と PDF/A-1b の両方の準拠


レベルを意味 し ます。

ISO 19005-2 に従 っ た PDF/A-2a ・ PDF/A-2b ・ PDF/A-2u 各種 の PDF/A-2 規格 は、


ISO 32000-1 (すなわち PDF 1.7) に基づいてい ます。 こ の こ と は、 こ れ ら が PDF/A-1 よ
り も 多 く の機能をサポー ト し てい る こ と を意味 し ます。 PDF/A-1 と 異な り 、 よ り 新 し い
PDF/A-2 規格は、 透過 ・ レ イ ヤー ・ JPEG 2000 圧縮 ・ PDF/A フ ァ イ ル添付 ・ PDF パ ッ ケー
ジやその他の PDF 諸機能を許 し てい ます。 PDF/A-2 は以下の種類を定義 し てい ます :
> ISO 19005-2 レベル B 準拠 (PDF/A-2b)。 文書の視覚的体裁を確保 し ます。

346 第 12 章 : PDF のバージ ョ ン と 規格


> ISO 19005-2 レベル A 準拠(PDF/A-2a)。信頼のおけ る Unicode テ キ ス ト 意味付け と 、構
造情報を持つ タ グ付 き PDF を追加 し てい ます。 タ グは、 PDF/A-2a 文書が完全にア ク
セシブルであ る こ と を確実に し ます。
> ISO 19005-2 レベル U 準拠(PDF/A-2u)。PDF/A-2a と PDF/A-2b の中間に位置付け ら れ
ます。 なぜな ら こ れは、 信頼のおけ る Unicode テ キ ス ト 意味付けについては必須 と し
ますが、 構造情報については必須 と し ないか ら です。 PDF/A-2u は、 そのページ群が忠
実に再現で き る こ と を、 ま た、 そのテ キ ス ト が抽出 ・ 検索で き る こ と を保証 し ます。

PDFlib 内の PDF/A-2 対応は以下の文書に基づいてい ます :


> PDF/A-2 規格 (ISO 19005-2:2011)
> PDF 協会が発行 し た TechNote 0010 「Clarifications of ISO 19005」。

PDF/A-2 と (準拠レベルを添えずに) 言っ た と き は、 PDF/A-2a ・ PDF/A-2b ・ PDF/A-2u


の 3 種類すべての準拠レベルを意味 し ます。

ISO 19005-3 で定義 さ れた PDF/A-3a ・ PDF/A-3b ・ PDF/A-3u PDF/A-3 は、 以下の違いを


除いて PDF/A-2 と 同様です :
> PDF/A-2 では、 PDF/A-1 か PDF/A-2 に準拠 し た フ ァ イ ル添付 し か許容 し ませんが、
PDF/A-3 では任意の フ ァ イ ル種別を添付 と し て許容 し ます。
> 添付 さ れた フ ァ イ ルは、 文書全体か、 ページか、 あ る いはその文書のその他の要素 と
関連付け さ れます。 フ ァ イ ル添付 と 、文書のそれに対応す る 部分 と の間の関係が、 ソ ー
ス ・ 代替 ・ 補足デー タ な ど、 明示的に指定 さ れ る 必要があ り ます。

PDFlib 内の PDF/A-3 対応は以下の文書に基づいてい ます :


> PDF/A-3 規格 (ISO 19005-3:2012)
> PDF 協会が発行 し た TechNote 0010 「Clarifications of ISO 19005」。

PDF/A-3 と (準拠レベルを添えずに) 言っ た と き は、 PDF/A-3a ・ PDF/A-3b ・ PDF/A-3u


の 3 種類すべての準拠レベルを意味 し ます。
電子 イ ン ボ イ ス のための ZUGFeRD 標準は、 PDF/A-3 に基づいた重要な応用です。 こ
れは、 その イ ン ボ イ ス の、 機械が読め る XML 版を、 PDF/A-3 に準拠 し た、 人が読め る 文
書の中へ埋め込みます。 ZUGFeRD に関す る さ ら に詳 し い情報が PDFlib ウ ェ ブサ イ ト にあ
り ます。

12.2.2 一般的要件
ク ッ ク ブ ッ ク PDF/A を生成する ための コ ー ド サン プルが PDFlib ク ッ ク ブ ッ ク の pdfa カ テ ゴ リ ーにあ り
ます。

PDFlib ク ラ イ ア ン ト プ ロ グ ラ ムが、 こ の節で記す規則に従 う な ら 、 有効な PDF/A 出力が


保証 さ れます。 PDFlib は、 PDF/A 規則への違反を検出 し た と き には例外を発生 さ せます
ので、 アプ リ ケーシ ョ ン側でそれを処理す る 必要があ り ます。 こ の場合には PDF 出力は
作成 さ れません。 表 12.5 に、 PDF/A 準拠出力を作成す る ための一般的要件を挙げます。

PDF/A ・ PDF/UA-1 両立文書を作成 PDF/A 文書が同時に PDF/UA-1 に準拠す る こ と も 可


能です。 実際、 PDF/A-1a/2a/3a を作成 し たい場合には、 生成文書のア ク セシ ビ リ テ ィ ー
を向上 さ せる ために、 PDF/UA の要件に従 う こ と を推奨 し ます。 詳細 と 制約については、
335 ページ 「PDF/UA-1 ・ PDF/A 両立文書を作成」 を参照 し て く だ さ い。

PDF/A ・ PDF/X 両立文書を作成 PDF/A 文書が同時に PDF/X-3 か PDF/X-4 に準拠す る


こ と も 可能です。 し か し PDF/X-4p か PDF/X-5n と は無理です。 こ の よ う な両立フ ァ イ ル

12.2 PDF/A に よ る アー カ イ ビ ング 347


表 12.5 PDF/A 準拠レ ベル A ・ B ・ U のための一般的要件
項目 PDF/A 準拠 (すべての準拠レ ベル) のための PDFlib の要件

PDF/A準拠レ ベル と PDF_begin_document( ) : pdfa オプ シ ョ ン を、 必要な PDF/A 準拠レ ベルに設定する必要があ


PDF互換性 り ます。 例 : pdfa=PDF/A-2b
PDF/A-1 : PDF 1.5 以上を要する操作 (レ イ ヤーな ど) を避ける必要があ り ます。
PDF/A-2/3 : PDF 1.7ext3 以上を要する操作 (PDF ポー ト フ ォ リ オな ど) を避ける必要があ
り ます。

フォン ト フ ォ ン ト オプ シ ョ ン embedding を true にする必要があ り ます。 オプ シ ョ ン


unicodemap=false は許容 さ れません。
標準 Type 1 フ ォ ン ト について も 埋め込みが必須です。 この埋め込み必須は、 不可視テキス
ト (主 と し て OCR の生成結果のために有用) に対 し てのみ用い られている フ ォ ン ト につい
てだけはあてはま り ません。 こ れは、 optimizeinvisible オプ シ ョ ン を用いて制御する こ
と も で き ます。
ページ寸法 (PDF/A-2/3) PDF_begin/end_page_ext( ) : PDF/A には、 厳密なページ寸法制限はあ り ませ
ん。 し か し 、 ページ寸法 (幅 と 高 さ 、 およびすべての枠エ ン ト リ ー) を、 PDF/A-1 では範
囲 3 ~ 14400 ポ イ ン ト (508 cm)、 PDF/A-2/3 では範囲 3 ~ 14400 ユーザー単位に収める
こ と が推奨 さ れます。

レ イ ヤー PDF/A-1 : PDF_define_layer( ) と PDF_set_layer_dependency( ) を避ける必要があ り ます。


PDF/A-2/3 : レ イ ヤーを使 う こ と はで き ますが、 PDF_define_layer( ) のい く つかのオプ シ ョ
ン を避ける必要があ り ます。

セキ ュ リ テ ィ ー PDF_begin_document( ) : userpassword ・ masterpassword ・ attachmentpassword ・


permissions オプ シ ョ ン を避ける必要があ り ます。

外部 コ ン テ ン ツ PDF_begin_template_ext( ) ・ PDF_load_graphics( ) ・ PDF_open_pdi_page( ) : reference オプ シ ョ


ン を避ける必要があ り ます。
PDF_load_asset( ) : external オプ シ ョ ン を避ける必要があ り ます。

フ ァ イルサイ ズ 生成 さ れる PDF 文書のフ ァ イルサイ ズが 2 GB を超えてはな ら ず、 かつ、 PDF オブ ジ ェ ク


ト の数が 8.388.607 未満でなければな り ません。 これ らの制約について詳 し く は 65 ページ
「3.1.6 PDF 文書の最大サイ ズ と その他の制限」 を参照 し て く だ さ い。

PDF取 り 込み PDF_open_pdi_document( ) が制約 さ れます。 ただ し infomode=true の場合を除き ます。 354


ページ 「12.2.7 PDF/A 文書を PDI で取 り 込み」 を参照 し て く だ さ い。

を作成す る には、 PDF_begin_document( ) の pdfa ・ pdfx オプシ ョ ンに対 し て適切な値を与


え ます。 例 :
ret = p.begin_document("combo.pdf", "pdfa=PDF/A-2b pdfx=PDF/X-4");

12.2.3 色 と 画像の要件
PDF/A は、 忠実な色再現を保証す る ために、 デバ イ ス独立な色指定を必須 と し てい ます。
色空間は以下の ソ ース か ら 来 る 可能性があ り ます :
> PDF_load_image( ) と PDF_fill_imageblock ( ) を用いて直接的に、 お よ び PDF_load_
graphics( ) を通 じ て間接的に読み込まれた画像
> PDF_set_graphics_option( ) か PDF_setcolor( ) を用いた明示的な色指定
> オプシ ョ ン リ ス ト を通 じ た色指定。 た と えばテ キ ス ト フ ロ ー内な ど において。
> 透過グ ループの た めにブ レ ン ド す る 色空間 : PDF_begin/end_page_ext( ) ・ PDF_begin_
template_ext( ) ・ PDF_load_graphics( ) : オプシ ョ ン transparencygroup でサブオプシ ョ
ン colorspace

348 第 12 章 : PDF のバージ ョ ン と 規格


> ス ポ ッ ト カ ラ ーか DeviceN カ ラ ーの代替色空間
> 注釈 ・ フ ォーム フ ィ ール ド は枠 ・ 背景 ・ 内容に色を指定す る こ と がで き ます

表 12.6 に、 上に挙げた操作すべてにおいて従 う 必要があ る 、 色処理のための PDF/A 要件


を挙げます。

表 12.6 PDF/A 準拠レ ベル A ・ B ・ U のための色 と 画像の要件


項目 PDF/A (すべての準拠レ ベル) のための PDFlib の要件

出力条件 も し も デバイ ス依存色空間 Gray ・ RGB ・ CMYK の う ちのいずれかがその文書内で用い られ


(出力イ ン テ ン ト ) てお り 、 かつ然るべき デ フ ォル ト 色空間がそのページに対 し て存在 し ていないな らば、
PDF_begin_document( ) の直後に、 PDF_load_iccprofile( ) で usage=outputintent と し て呼び出
すか、 PDF_process_pdi( ) で action=copyoutputintent と し て呼び出す必要があ り ます。

グ レースケール グ レースケールカ ラ ーを使え るのは、 グ レースケールか RGB か CMYK の出力イ ン テ ン ト が


カ ラー 存在する場合か、 defaultgray オプ シ ョ ンが設定 さ れている場合だけです。

RGBカ ラ ー ページ内容に RGB カ ラ ーを使え るのは、 RGB 出力イ ン テ ン ト が存在する場合か、


defaultrgb オプ シ ョ ンが設定 さ れている場合だけです。 フ ォ ーム フ ィ ール ド と 注釈では
RGB カ ラ ーはつねに使用で き ます。

CMYKカ ラ ー CMYK カ ラ ーを使え るのは、 CMYK 出力イ ン テ ン ト が存在する場合か、 defaultcmyk オプ


シ ョ ンが設定 さ れている場合だけです。
Separation > その代替色は上述の諸規則に従 う 必要があ り ます。
(スポ ッ ト ) ・ > PDF/A-2/3 : PDF_create_devicen( ) の前に、 その DeviceN 色空間内のすべてのカ ス タ ムス
DeviceNカ ラ ー
ポ ッ ト カ ラ ーについて PDF_makespotcolor( ) を呼び出す必要があ り ます。

透過 と PDF/A-1 : 透過を避ける必要があ り ます。 こ のこ と は以下の API 機能に影響を与え ます :


オーバープ リ ン ト > PDF_load_image( ) : masked オプ シ ョ ン を避ける必要があ り ます。 ただ し 、 そのマ ス ク が 1
ビ ッ ト 画像を指 し 示 し ている場合を除き ます。
> PDF_load_image( ) : 内在透過 (アルフ ァ チ ャ ン ネル) を持つ画像が許容 さ れません。 こ れ
を読み込むには ignoremask オプ シ ョ ン を用いる必要があ り ます。
> PDF_load_graphics( ) : 透過要素を含んだ SVG グ ラ フ ィ ッ ク を避ける必要があ り ます。
> PDF_create_gstate( ) : opacityfill ・ opacity オプ シ ョ ン を避ける必要があ り ます。 ただ
し 、 それが値 1 を持つ場合を除き ます。 blendmode を用いる場合には、 それが Normal で
ある必要があ り ます。 softmask を用いる場合には、 それが none であ る必要があ り ます。
> PDF_create_annotation( ) : opacity オプ シ ョ ン を避ける必要があ り ます。
PDF/A-2/3 : 透過は許容 さ れますが、 PDF_create_gstate( ) では以下の規則に従 う 必要があ
り ます : も し も カ レ ン ト 色空間が ICC ベース CMYK カ ラ ーであ り 、 かつ overprintfill か
overprintstroke が true の場合には、 overprintmode=1 は許容 さ れません。

透過グループ PDF_begin/end_page_ext( ) ・ PDF_begin_template_ext( ) ・ PDF_open_pdi_page( ) ・ PDF_load_


graphics( ) : オプ シ ョ ン transparencygroup が以下の と お り 制限 さ れます :
PDF/A-1 : オプ シ ョ ン transparencygroup は許容 さ れません。
PDF/A-2/3 : transparencygroup オプ シ ョ ンのサブオプ シ ョ ン colorspace が、 上でグ レー
スケール ・ RGB ・ CMYK カ ラ ーについて述べた要件を満たす必要があ り ます。 PDF_open_
pdi_page( ) と PDF_load_graphics( ) に対 し ては transparencygroup=auto が強制 さ れます。
PDF/A-2/3 : transparencygroup オプ シ ョ ンのサブオプ シ ョ ン colorspace が、 上でグ レー
スケール ・ RGB ・ CMYK カ ラ ーについて述べた要件を満たす必要があ り ます。 PDF_begin/
end_page_ext( ) に対 し てオプ シ ョ ン transparencygroup=none と サブオプ シ ョ ン
colorspace=none は許容 さ れません。

12.2 PDF/A に よ る アー カ イ ビ ング 349


表 12.6 PDF/A 準拠レ ベル A ・ B ・ U のための色 と 画像の要件
項目 PDF/A (すべての準拠レ ベル) のための PDFlib の要件

画像 と PDF_load_image( ) : interpolate=true オプ シ ョ ン を避ける必要があ り ます。


テ ン プ レー ト PDF/A-2/3 : JPEG 2000 画像は特定の条件を満たす必要があ り ますので、 詳 し く は 189
ページ 「JPEG 2000 画像」 を参照 し て く だ さ い。

出力 イ ン テ ン ト 出力条件は、 意図す る 出力先デバ イ ス を定義 し ます。 こ れは、 一貫性の


あ る 色表現のために重要です。 PDF/X では常に出力 イ ン テ ン ト が必須ですが、 PDF/A で
は こ れ と 異な り 、出力 イ ン テ ン ト ICC プ ロ フ ァ イ ルの使用はオプシ ョ ナルです。出力 イ ン
テ ン ト は、 RGB な どデバ イ ス依存カ ラ ーがその文書内で使われてい る 場合にのみ必須で
す。ICC ベース カ ラ ーな どデバ イ ス独立カ ラ ーのみがその文書内で使われてい る 場合には
出力 イ ン テ ン ト は必要あ り ません。 PDF/X は出力 イ ン テ ン ト と し てプ リ ン タ ー ICC プ ロ
フ ァ イ ルにのみ対応 し てい ますが、PDF/A ではモニ タ ープ ロ フ ァ イ ル も 許容 さ れます。 こ
れに よ り 、 広 く 使われてい る sRGB プ ロ フ ァ イ ルを出力 イ ン テ ン ト と し て使 う こ と も で き
る よ う にな っ てい ます。出力 イ ン テ ン ト を指定す る には、以下の よ う に ICC プ ロ フ ァ イ ル
を用い ます :
icc = p.load_iccprofile("sRGB", "usage=outputintent");

ICC プ ロ フ ァ イ ルを読み込むのではな く 、 出力 イ ン テ ン ト を、 取 り 込んだ PDF/A 文書か


ら コ ピーする こ と も で き ます (355 ページ 「取 り 込んだ文書か ら PDF/A 出力 イ ン テ ン ト
を コ ピー」 参照)。 生成 さ れ る 出力文書の出力 イ ン テ ン ト を設定する のはち ょ う ど 1 回だ
けにす る 必要があ り ます。 こ れを設定す る のは PDF_begin_document( ) の直後にする べき
です。

PDF/A を作成す る ための カ ラ ー戦略 表 12.7 に挙げ る カ ラ ー戦略の概略が、 さ ま ざ ま な


PDF/A アプ リ ケーシ ョ ン を計画す る う えで役立つか も し れ ません。 多 く の状況で う ま く
い く 最 も 簡単な手は、 sRGB 出力 イ ン テ ン ト ICC プ ロ フ ァ イ ルを使 う こ と です。 なぜな ら
こ れはグ レース ケール と RGB カ ラ ーに対応 し てい る か ら です。 さ ら に、 sRGB は PDFlib に
内部的に知 ら れてい ますので、 外部プ ロ フ ァ イ ルデー タ や構成を要 し ません。
黒い テ キ ス ト を、 出力 イ ン テ ン ト プ ロ フ ァ イ ル を 必要 と せず作成 し た い場合には、
CIELab 色空間を使え ます。 その Lab カ ラ ー値 (0, 0, 0) は、 純粋な黒をデバ イ ス独立な形で
指定 し てお り 、 かつ出力 イ ン テ ン ト プ ロ フ ァ イ ルな し で PDF/A に準拠 し てい ます ( こ れ
と 異な り DeviceGray では出力 イ ン テ ン ト プ ロ フ ァ イ ルが必須)。 PDFlib は各ページの先頭
でカ レ ン ト カ ラ ーを黒に初期化 し ます。ICC 出力 イ ン テ ン ト が指定 さ れてい る か ど う かに
応 じ て、 PDFlib は DeviceGray 色空間か Lab 色空間のいずれかを黒に対 し て用い ます。 以
下の呼び出 し を用いれば Lab 黒色を手動で設定で き ます :
p.set_graphics_option("fillcolor={lab 0 0 0}");

表 12.7 準拠レ ベル A ・ B ・ U のための PDF/A のカ ラ ー戦略


その文書内で使え る色空間
出力イ ン テ ン ト
CIELab ICC ベース Separation ・ グ レー RGB1, 2 CMYK1
DeviceN スケール1

なし ◯ ◯ ◯ - - -

グ レースケールICC ◯ ◯ ◯ ◯ - -
プ ロ フ ァ イル

350 第 12 章 : PDF のバージ ョ ン と 規格


表 12.7 準拠レ ベル A ・ B ・ U のための PDF/A のカ ラ ー戦略
その文書内で使え る色空間
出力イ ン テ ン ト
CIELab ICC ベース Separation ・ グレー RGB1, 2 CMYK1
DeviceN スケール1

RGB ICCプ ロ フ ァ イ ◯ ◯ ◯ ◯ ◯ -

CMYK ICCプ ロ フ ァ ◯ ◯ ◯ ◯ - ◯
イル

1. ICC プ ロ フ ァ イルを持たないデバイ ス色空間か、 ページ ・ パ タ ーン ・ テ ン プ レー ト のためのデ フ ォ ル ト 色空間


2. RGB カ ラ ーは フ ォ ーム フ ィ ール ド と 注釈に対 し てはつねに許 さ れます。

表 12.7 に挙げた色空間のみな ら ず、 カ ス タ ム ス ポ ッ ト カ ラ ーを、 その対応す る 代替色空


間に従っ て使 う こ と も で き ます。 PDFlib は CIELab を、 内蔵の HKS ・ PANTONE ス ポ ッ ト
カ ラ ーに対する 代替色空間 と し て用いてい ますので、 こ れ ら は常に PDF/A 規格 と と も に
使え ます。 カ ス タ ム ス ポ ッ ト カ ラ ーに対 し ては、 その代替色空間を、 それが出力 イ ン テ ン
ト と 互換にな る よ う に選び取 る 必要があ り ます。 DeviceN 色空間内で使用 さ れ る すべての
カ ス タ ム ス ポ ッ ト カ ラ ーについて PDF_makespotcolor( ) を呼び出す必要があ り ます。

12.2.4 イ ン タ ラ ク テ ィ ブ機能に対す る要件


表 12.8 に、 PDF/A 準拠出力を生成す る 際に制約 さ れ る すべての操作を示 し ます。 禁 じ ら
れたいずれかの関数を PDF/A モー ド 内で呼び出す と 例外が発生 し ます。

表 12.8 すべての PDF/A 準拠レ ベルのためのイ ン タ ラ ク テ ィ ブ機能に対する要件


項目 PDF/A (すべての準拠レ ベル) のための PDFlib の要件

注釈 PDF/A-1 : PDF_create_annotation( ) に以下の制約が課 さ れます :


> PDF_create_annotation( ) : type=FileAttachment ・ Highlight は許 さ れません。 以下の種別
は、 RGB 出力イ ン テ ン ト を指定 し ている場合のみ許 さ れます : Freetext ・ Text ・ Stamp ・
Underline ・ Squiggly ・ Strikeout ・ Polygon ・ Polyline ・ Line ・ Square ・ Circle ・ Ink。
> テキス ト 注釈に対 し ては zoom ・ rotate オプ シ ョ ン を true に設定する必要があ り ます。
> richtext オプションは許されません。
> annotcolor ・ fillcolor ・ interiorcolor オプ シ ョ ン : グ レ ースケールカ ラ ーは、 出力イ
ン テ ン ト 付き (種類は何で も よい) でのみ許 さ れます。
> opacity オプ シ ョ ン を用いてはいけません。
PDF/A-2/3 : PDF_create_annotation( ) に以下の制約が課 さ れます :
> PDF_create_annotation( ) : type=3D ・ Screen を用いる こ と は許 さ れません。
> annotcolor ・ fillcolor ・ interiorcolor オプ シ ョ ン : グ レ ースケールカ ラ ーは、 出力イ
ン テ ン ト 付き (種類は何で も よい) でのみ許 さ れ、 CMYK カ ラ ーは、 CMYK 出力イ ン テ ン
ト 付き でのみ許 さ れます
> テキス ト 注釈の場合には zoom ・ rotate オプ シ ョ ン を true に設定 し てはいけません。
> richtext オプ シ ョ ンは許 さ れません。

12.2 PDF/A に よ る アー カ イ ビ ング 351


表 12.8 すべての PDF/A 準拠レ ベルのためのイ ン タ ラ ク テ ィ ブ機能に対する要件
項目 PDF/A (すべての準拠レ ベル) のための PDFlib の要件

添付 PDF/A-1 : PDF_begin/end_document( ) : attachments オプ シ ョ ン を避ける必要があ り ます。


PDF/A-2 : PDF_begin/end_document( ) : attachments オプ シ ョ ンの参照先が PDF/A-1 文書
か PDF/A-2 文書であ る必要があ り ます。
PDF/A-3 : associatedfiles オプ シ ョ ン を用いて任意のフ ァ イル種別を添付で き ますが、
attachments オプ シ ョ ン を避ける必要があ り ます。 以下の条件に従 う 必要があ り ます :
> 添付は、 その文書の さ ま ざ ま な部分 と 関連付ける こ と がで き ます。 そのためには、 PDF_
end_document( ) ・ PDF_begin/end_page_ext( ) ・ PDF_begin/end_dpart( ) ・ PDF_begin_template_
ext( ) ・ PDF_create_annotation( ) ・ PDF_load_image( ) ・ PDF_open_pdi_page( ) ・ PDF_load_
graphics( ) の associatedfiles オプ シ ョ ン を用います。 それぞれの添付を、 その文書の
ち ょ う ど 1 つの部分に関連付ける必要があ り ます。 すなわち、 PDF_load_asset( ) を用いて
作成 さ れたそれぞれのア セ ッ ト ハン ド ルを、 ち ょ う ど 1 つの associatedfiles オプ シ ョ
ンに与え る必要があ り ます。
> mimetype ・ relationship サブオプ シ ョ ンが必須です。
> description サブオプ シ ョ ンが推奨 さ れます。
> external=true サブオプ シ ョ ン を避ける必要があ り ます。
アクシ ョ ンと PDF_create_action( ) : type=Hide ・ Launch ・ Movie ・ ResetForm ・ ImportData ・ JavaScript を
JavaScript 持つア ク シ ョ ン を避ける必要があ り ます。 type=name に対 し ては、 NextPage ・ PrevPage ・
FirstPage ・ LastPage のみが許容 さ れます。
PDF_begin/end_document( ) : オプ シ ョ ン action は、 ト リ ガー イ ベン ト open と と も にのみ使
用で き ます。
PDF_begin/end_document( ) ・ PDF_begin/end_page_ext( ) : オプ シ ョ ン action を避ける必要が
あ り ます。
フ ォ ーム PDF_create_field/fieldgroup( ) は以下の制約に縛ら れます :
フ ィ ール ド > 使用 さ れているすべてのフ ォ ン ト が埋め込まれている必要があ り ます。
> オプ シ ョ ン backgroundcolor ・ bordercolor ・ fillcolor ・ strokecolor : RGB カ ラ ーはつ
ねに許 さ れ、 グ レースケールカ ラ ーは出力イ ン テ ン ト (どの種別で も ) 付きの場合にの
み許 さ れ、 CMYK カ ラ ーは CMYK 出力イ ン テ ン ト 付きの場合にのみ許 さ れます (表 12.6
も 参照)。
> action オプ シ ョ ンは許 さ れません。

12.2.5 レ ベル U 準拠のための追加の PDF/A の要件


PDF/A-2u と PDF/A-3u のための、 規格の要件の多 く は、 PDFlib に よ っ て自動的に満た さ
れます。 レベル U 準拠の文書を生成す る 際には、 表 12.9 に挙げ る 操作のみが制限 さ れま
す。 言い換えれば、 アプ リ ケーシ ョ ンがすでに PDF/A-2b か PDF/A-3b を作成 し てお り 、
かつ表 12.9 の制約に従っ ていれば、 生成 さ れた文書はそれぞれ、 PDF/A-2u か PDF/A-3u
と し て も 宣言で き ます。

表 12.9 PDF/A 準拠レ ベル U のための追加の制約


項目 PDF/A-2u/3u 準拠のための PDFlib メ ソ ッ ド ・ オプ シ ョ ンの要件

フォン ト フ ォ ン ト オプ シ ョ ン unicodemap=false を避ける必要があ り ます。

12.2.6 レ ベル A 準拠のための追加の PDF/A の要件


PDF/A-1a ・ PDF/A-2a ・ PDF/A-3a を作成する 際には、 293 ページ 「11.1 タ グ付 き PDF の
基礎」 に従っ たすべての タ グ付 き PDF の要件を満たす必要があ り ます。 表 12.10 に、 レベ

352 第 12 章 : PDF のバージ ョ ン と 規格


ル A に従っ た出力を生成す る ための必須操作 と 推奨操作を挙げます。 一般的な タ グ付 き
PDF の諸規則のほかに も 、 PDF/UA の要件に も 従 う こ と に よ っ て、 生成文書のア ク セシ ビ
リ テ ィ ーを向上 さ せる こ と を強 く 推奨 し ます。 詳 し く は 335 ページ 「11.4 PDF/UA に よ る
ユニバーサルア ク セシ ビ リ テ ィ ー」 を参照 し て く だ さ い。
正 し い構造情報を作成す る こ と はユーザー側の役割です。 文書のテ キ ス ト 全体を 1 個
の構造エ レ メ ン ト に入れた ら 、 技術的には正 し い PDF/A ですが、 忠実な意味付け再生 と
い う ゴールに違反 し てい ます。

表 12.10 PDF/A 準拠レ ベル A のための追加の要件


項目 PDF/A-1a/2a/3a 準拠のための PDFlib の要件

フォン ト フ ォ ン ト オプ シ ョ ン unicodemap=false を避ける必要があ り ます。

タ グ付きPDF タ グ付き PDF のためのすべての要件を満たす必要があ り ます (293 ページ 「11.1 タ グ付き


PDF の基礎」 参照)。 文書の構造 ヒ エ ラ ルキーは、 その文書の論理構造を、 で き る だけ正確
に反映するべき です。
単語境界 単語間を空白キ ャ ラ ク タ ー (U+0020) で区切る必要があ り ます。 autospace オプ シ ョ ン を
用いる と こ の作業を単純化で き ます。

テキス ト 出力 と PUA PDF/A-2a/3a : PUA Unicode キ ャ ラ ク タ ー (ロ ゴや記号な ど) が、 適切な置換テキス ト を持


Unicodeキ ャ ラ ク つ必要があ り ます。 それを囲 う コ ン テ ン ツ ア イ テムに対する PDF_begin_item( ) の
ター ActualText オプ シ ョ ン で指定するか、 その対応する出力 メ ソ ッ ド の同等の tag オプ シ ョ ン
で指定 し ます (詳 し く は後述)。

注釈 PDF_create_annotation( ) : テキス ト を全 く 表示 し ない注釈に対 し ては contents オプ シ ョ ン


が推奨 さ れます。

PUA キ ャ ラ ク タ ー PDF/A-2a と PDF/A-3a は、 私用領域、 略 し て PUA、 すなわち主 と し


て範囲 U+E000 ~ U+F8FF (詳 し く は 109 ページ 「BMP と PUA」 を参照) の中にあ る
Unicode 値を持っ た キ ャ ラ ク タ ーに対 し て、 追加の要件を含んでい ま す。 PUA キ ャ ラ ク
タ ーは通常、 装飾的 ・ 記号グ リ フ、 ま たは企業 ロ ゴ な ど カ ス タ ム グ リ フ です。 PDF/A-2a/
3a は、 PUA キ ャ ラ ク タ ーが、 そのキ ャ ラ ク タ ーのテ キ ス ト 表現を内容 と す る ActualText
属性を伴 う こ と を必須 と し ます。 こ の ActualText は、 個別の PUA キ ャ ラ ク タ ーに対 し て
割 り 当て る こ と も で き ます し 、 あ る 1 個の PUA キ ャ ラ ク タ ーを包含す る も っ と 長いキ ャ
ラ ク タ ー列に対 し て割 り 当て る こ と も で き ます。 こ の ActualText を、 Span イ ン ラ イ ン レ
ベルエ レ メ ン ト と と も に与え る こ と を推奨 し ます。
PDF_info_font( )を使っ て、あ る 特定の コ ー ド の、あ る 指定 し た フ ォ ン ト に対す る Unicode
値をチ ェ ッ ク で き ます (152 ページ 「6.5.2 フ ォ ン ト 依存のエ ン コ ーデ ィ ン グ ・ Unicode ・
グ リ フ名 ク エ リ ー」 参照) :
uv = (int) p.info_font(font, "unicode", "code=" + c);

こ の生成 さ れ る Unicode 値 uv が PUA に帰す る 場合には、 こ れは ActualText 属性を必要 と


し ます。 以下の コ ー ド 断片は、 PDFlib 企業 ロ ゴのグ ラ フ ィ カル表現を包含 し た PDFlibLogo
と い う フ ォ ン ト を 想定 し て い ま す。 こ の ロ ゴ を ページ上に配置す る 際には、 テ キ ス ト
「PDFlib Logo」 を内容 と す る 然 る べ き ActualText サブオプシ ョ ン を持っ た Span エ レ メ ン ト
が tag オプシ ョ ンで与え ら れます :
p.fit_textline(text, 50, 700,
"fontname=PDFlibLogo fontsize=24 " +
"tag={tagname=Span ActualText={PDFlib Logo}}");

12.2 PDF/A に よ る アー カ イ ビ ング 353


そのグ リ フ に関 し て何 ら 情報を持たない場合、ゆえに然る べき ActualText がたやす く は得
ら れない場合には、 その フ ォ ン ト 内におけ る その グ リ フ の名前を使 う と い う 手 も あ り ま
す。 こ れを知 る には以下の よ う に し ます :
gn_idx = (int) p.info_font(font, "glyphname", "code=" + c);
glyphname = p.get_option(gn_idx, "");

こ のグ リ フ名を ActualText で使 う 際、 定常的な句 と 組み合わせる の も 手で し ょ う 。 た と え


ば Wingdings フ ォ ン ト 内の コ ー ド 0x1A は、 コ ン ピ ュ ー タ ーキーボー ド の絵を内容 と し 、
グ リ フ名 keyboard を持ち ます。 こ のグ リ フは U+F037 へマ ッ プ し ます。 すなわち PUA 値
です。 実テ キ ス ト と し て 「keyboard の記号」 を用いれば、 こ の記号に対 し て意味を成すで
し ょ う 。 ただ し 、 プ ロ グ ラ ム的に構築 さ れ る ActualText は、 当座 し のぎの解決策 と 考え る
べ き です。 人の選ぶテ キ ス ト は常に、 機械生成の ActualText よ り も 望ま し い も のです。

12.2.7 PDF/A 文書を PDI で取 り 込み


PDF/A 準拠の出力文書に既存の PDF 文書を取 り 込 も う と する と き は、 追加の規則が適用
さ れます (PDF 取 り 込みについて詳 し く は 211 ページ 「8.3 PDF ページ を PDI で取 り 込む」
を参照)。 あ ら ゆ る 取 り 込み文書は、 表 12.11 に従っ た カ レ ン ト の PDF/A モー ド と 互換な
PDF/A 準拠レベルに準拠 し てい る 必要があ り ます。

注 PDFlib は、入力 PDF 文書の PDF/A 準拠に関する検証は行わず、任意の入力 PDF 文書を PDF/


A へ変換する こ と も で き ません。

あ る 特定の PDF/A 準拠レベルが PDFlib で構成 さ れていて、 かつ、 取 り 込んだ文書がそれ


と 互換な レベルを厳守 し てい る な ら ば、 生成 さ れ る 出力は、 選ばれた PDF/A 準拠レベル
に従っ てい る こ と が保証 さ れます。カ レ ン ト の PDF/A レベル と 非互換の文書は PDF_open_
pdi_document( ) で拒絶 さ れます。

表 12.11 さ ま ざ ま な PDF/A 出力レ ベルに対する互換 PDF/A 入力レ ベル


取 り 込まれる文書の PDF/A レ ベル

PDF/A-2a ・ PDF/A-2b ・ PDF/A-2u ・


PDF/A 出力レ ベル PDF/A-1a:2005 PDF/A-1b:2005 PDF/A-3a PDF/A-3b PDF/A-3u

PDF/A-1a:2005 許容 - - - -

PDF/A-1b:2005 許容 許容 - - -

PDF/A-2a ・ PDF/A-3a 許容 - 許容 - -

PDF/A-2b ・ PDF/A-3b 許容 許容 許容 許容 許容
PDF/A-2u ・ PDF/A-3u 許容 - 許容 - 許容

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の pdfa/clone_pdfa ト ピ ッ ク にあ り ます。

1 個ない し 複数の PDF/A 文書を取 り 込む と き は、そのすべてが表 12.12 に従っ た互換な出


力条件で作成 さ れてい る 必要があ り ます。すべての取 り 込み文書の出力 イ ン テ ン ト は同一
か互換であ る 必要があ り 、 こ の条件を満たす よ う 手配する のはユーザー側の役割です。
PDFlib は、 い く つか特定の項目を修正す る こ と はで き ますが、 PDF/A の検証に利用 さ れ
る よ う に も 、 ま た、 取 り 込んだ文書に PDF/A 準拠を強制する よ う に も 作 ら れてい ません。
た と えば取 り 込んだ PDF のページに足 り ない フ ォ ン ト があ っ て も 、 PDFlib はそれの埋め
込みは し ません。

354 第 12 章 : PDF のバージ ョ ン と 規格


表 12.12 PDF/A 文書 (すべての準拠レ ベル) を取 り 込む際の出力イ ン テ ン ト の互換性
取 り 込む文書の出力イ ン テ ン ト

生成する文書の出力イ ン テ ン ト なし グ レース RGB CMYK


ケール

なし 有 - - -
1
グ レースケールの ICC プ ロ フ ァ イル 有 有 - -
1
RGB の ICC プ ロ フ ァ イル 有 - 有 -

CMYK の ICC プ ロ フ ァ イル 有 - - 有1

1. 取 り 込む文書の出力イ ン テ ン ト と 、 生成する文書の出力イ ン テ ン ト が、 同一であ る必要があ り ます。

取 り 込んだページ を連結す る 際に、 で き あが る PDF 出力文書が入力文書 (群) と 同 じ


PDF/A 準拠レベル ・ 出力条件に準拠す る よ う に し たければ、 取 り 込んだ PDF の PDF/A 状
況を以下の よ う に ク エ リ ーす る こ と がで き ます :
pdfalevel = p.pcos_get_string(doc, "pdfa");

こ の ス テー ト メ ン ト は、取 り 込んだ文書が PDF/A レベルに準拠 し ていればその PDF/A 準


拠レベルを示す文字列を取得 し 、 そ う でなければ none を返 し ます。 こ の返 さ れた文字列
を使えば、 PDF_begin_document( ) で pdfa オプシ ョ ン を使っ て、 出力文書の PDF/A 準拠
レベルを適切に設定す る こ と がで き ます。

取 り 込んだ文書か ら PDF/A 出力 イ ン テ ン ト を コ ピ ー PDF/A準拠レベルを ク エ リ ーす る


以外の方法 と し て、 PDF/A 出力 イ ン テ ン ト は、 取 り 込んだ文書か ら コ ピーす る こ と も で
き ます。 PDF/A 文書には必ず し も 出力 イ ン テ ン ト があ る と はかぎ ら ないので、 それを コ
ピー し よ う と す る 前に、まず pCOS を使っ て、出力 イ ン テ ン ト が存在す る か ど う かをチ ェ ッ
ク す る 必要があ り ます。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の pdfa/clone_pdfa ト ピ ッ ク にあ り ます。

こ れは、 PDF_load_iccprofile( ) を使っ て出力 イ ン テ ン ト を設定す る 方法のかわ り に使 う こ


と がで き 、 取 り 込んだ文書の出力 イ ン テ ン ト を、 生成す る 出力文書へ コ ピー し ます。 出力
イ ン テ ン ト の コ ピーは、 取 り 込んだ PDF/A と PDF/X の文書で動作 し ます。

12.2.8 PDF/A のための XMP 文書 メ タ デー タ


PDF/A は、 PDF 文書に メ タ デー タ を埋め込むために、 XMP 形式に強 く 依存 し てい ます。
PDF/A では、 2 つの種類の XMP 文書レベル メ タ デー タ に対応 し てい ます : 1 つは、 定義
済み ス キーマ と い う よ く 知 ら れた メ タ デー タ ス キーマの集合です。 こ れは、 XMP 仕様の
基礎を なすバージ ョ ン か ら 採 ら れた も のです。 も う 1 つはカ ス タ ム拡張 ス キーマです。
PDFlib は、 XMP の中の必須の PDF/A 準拠エン ト リ ー群を自動的に作成する ほか、 い く つ
かの よ く 使われ る エン ト リ ー (CreationDate な ど) も 自動的に作成 し ます。

文書レ ベル XMP XMP文書 メ タ デー タ は、PDF_begin_document( ) か PDF_end_document( )


ま たは両方の metadata オプシ ョ ンで与え る こ と がで き ます。 PDF/A モー ド では、 PDFlib
は、ユーザーが与えた XMP 文書 メ タ デー タ が PDF/A の要請に準拠 し てい る か ど う かを検
証 し ます。 取 り 込み PDF 文書の中の XMP メ タ デー タ は、 pCOS パ ス /Root/Metadata を用
いて入力 PDF か ら 抽出す る こ と がで き ます。

12.2 PDF/A に よ る アー カ イ ビ ング 355


ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク のinterchange/import_xmp_from_pdf ト ピ ッ ク にあ り
ます。

コ ン ポーネ ン ト レ ベル XMP 文書全体に対 し てだけではな く 、 XMP メ タ デー タ は、 PDF


文書内のそれ以外のページや画像 と い っ た構成要素に対 し て も 与え る こ と がで き ます。 コ
ン ポーネ ン ト レベルの メ タ デー タ に対 し ては、 PDF/A-1 の要請はあ り ませんが、 PDF/A-
2 と PDF/A-3 では、 コ ン ポーネ ン ト レベル XMP 内のカ ス タ ムプ ロ パテ ィ 群を も 文書レベ
ル XMP と 同様の拡張ス キーマ記述に よ っ て記述す る こ と を義務付けてい ます。
コ ン ポーネ ン ト レベル XMP メ タ デー タ は、 PDF_begin/end_page_ext( ) や PDF_load_
image( ) な ど の関数の metadata オプシ ョ ンで与え る こ と がで き ます。

定義済み XMP スキーマ PDF/A 内の文書 メ タ デー タ に対す る XMP の使用は、 以下の仕


様に基づいてい ます :
> PDF/A-1 : XMP 2004 仕様
> PDF/A-2 ・ PDF/A-3 : XMP 2005

それぞれの XMP 仕様に記述 さ れた ス キーマ を定義済みス キーマ と いい、 それ ら の名前空


間 URI と その望ま し い名前空間接頭辞 と と も に表 12.13 に挙げてい ます。 定義済みス キー
マのプ ロ パテ ィ のみを PDF/A では使え ます。 ただ し 、 拡張ス キーマ記述が存在す る 場合
は例外です (後述)。 PDF/A-1 のための定義済み XMP 2004 ス キーマ群内のプ ロ パテ ィ の
完全な一覧が、PDF 連合の PDF/A 技術セ ン タ ーか ら の TechNote 0008 内にあ り ます。PDF/
A-2/3 は、 XMP 2005 か ら の定義済みス キーマ群を追加 し てい ますが、 こ の追加ス キーマ
は画像 と 動的 メ デ ィ アに関連 し た も のですので、文書 メ タ デー タ のために有用 と はな り に
く いで し ょ う 。

表 12.13 PDF/A-1 のための定義済み XMP スキーマ (詳 し く は XMP 2004 と XMP 2005 を参照)
望ま し い
スキーマの名称 と 説明 名前空間 URI 名前空間接頭辞

PDF/A-1 ・ PDF/A-2 ・ PDF/A-3 で使 う ための XMP 2004 スキーマ群

Adobe PDF スキーマ http://ns.adobe.com/pdf/1.3/ pdf

Dublin Core スキーマ http://purl.org/dc/elements/1.1/ dc

EXIF 独自プ ロパテ ィ 群用 EXIF スキーマ http://ns.adobe.com/exif/1.0/ exif

TIFF プ ロパテ ィ 群用 EXIF スキーマ http://ns.adobe.com/tiff/1.0/ tiff

Photoshop スキーマ http://ns.adobe.com/photoshop/1.0/ photoshop

XMP 基本ジ ョ ブ チケ ッ ト スキーマ http://ns.adobe.com/xap/1.0/bj xmpBJ

XMP 基本スキーマ http://ns.adobe.com/xap/1.0/ xmp

XMP メ デ ィ ア管理スキーマ http://ns.adobe.com/xap/1.0/mm/ xmpMM

XMP ページ ド テキス ト スキーマ http://ns.adobe.com/xap/1.0/t/pg/ xmpTPg

XMP 権利管理スキーマ http://ns.adobe.com/xap/1.0/rights/ xmpRights

PDF/A-2 ・ PDF/A-3 で使 う ための追加 XMP 2005 スキーマ群

カ メ ラ Raw スキーマ http://ns.adobe.com/camera-rawsettings/1.0/ crs

追加 EXIF プ ロパテ ィ 群用 EXIF スキーマ http://ns.adobe.com/exif/1.0/aux/ aux

XMP 動的 メ デ ィ ア スキーマ http://ns.adobe.com/xmp/1.0/DynamicMedia/ xmpDM

356 第 12 章 : PDF のバージ ョ ン と 規格


XMP 拡張スキーマ記述 自分が必要 と す る メ タ デー タ が、 定義済みス キーマに含ま れて
いない と き は、 XMP 拡張ス キーマ を定義す る こ と も で き ます。 PDF/A では、 カ ス タ ム ス
キーマ を文書に埋め込む際に用いなければな ら ない拡張方式を記述 し てい ます。 表 12.14
に、 1 個ない し 複数の拡張ス キーマ と そのプ ロ パテ ィ 群を記述す る ために用いなければな
ら ない ス キーマ を ま と め、 あわせてその名前空間 URI と 、 必要な名前空間接頭辞を示 し ま
す。 名前空間接頭辞の、 必要な、 と い う 点に注意 し て く だ さ い (定義済みス キーマで示 し
た名前空間接頭辞 と は異な り 、 単に こ う つけ る のが望ま し い と い う だけではな く 、 それぞ
れ こ の通 り につけ る 必要があ り ます)。
コ ン ポーネ ン ト レベル XMP (ページ レベルな ど) に対 し て カ ス タ ム XMP プ ロ パテ ィ
が用い ら れ る 場合には、それに対応す る 拡張ス キーマ記述を そのカ ス タ ム XMP プ ロ パテ ィ
群 と と も に同一 メ ソ ッ ド (PDF_begin_page_ext( ) な ど) 内で与え る こ と も で き ます。 あ る
いは、コ ン ポーネ ン ト レベル XMP に対する 拡張ス キーマ記述を文書レベル XMP と と も に
PDF_begin_document( ) で与え る こ と も 可能です。
XMP 拡張ス キーマ記述の構築に関す る さ ら な る 詳細 と 例が、PDF/A 技術セ ン タ ーか ら
の TechNote 009 にあ り ます。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プル と XMP作成例がク ッ ク ブ ッ ク のpdfa/xmp_extension_schema_pdfa2b・


pdfa/pdfa_extension_schema_with_type_pdfa2b ト ピ ッ ク にあ り ます。

表 12.14 PDF/A 拡張スキーマ コ ン テナスキーマ と 補助スキーマ


必要な
スキーマの名称 と 説明 名前空間 URI1 名前空間接頭辞

PDF/A 拡張スキーマ コ ン テナスキーマ : http://www.aiim.org/pdfa/ns/extension/ pdfaExtension


あ ら ゆる拡張スキーマ記述を埋め込むた
めのコ ン テナ

PDF/A スキーマ値種別 : 1 個の拡張ス http://www.aiim.org/pdfa/ns/schema# pdfaSchema


キーマが任意個数のプ ロパテ ィ を持つの
を記述

PDF/A プ ロパテ ィ 値種別 : 1 個のプ ロパ http://www.aiim.org/pdfa/ns/property# pdfaProperty


テ ィ を記述

PDF/A ValueType 値種別 : 拡張スキーマ http://www.aiim.org/pdfa/ns/type# pdfaType


プ ロパテ ィ で用いる カ ス タ ム値種別を記
述。 XMP 2004 の種別一覧にない種別を
使いたい と き にのみ必要 と な り ます。

PDF/A フ ィ ール ド 種別スキーマ : 種別が http://www.aiim.org/pdfa/ns/field# pdfaField


構造化 さ れている場合に、 その中の
フ ィ ール ド を記述

1. 名前空間 URI は、 ISO 19005-1 では誤 っ て列挙 さ れてお り 、 技術正誤表 1 で修正 さ れま し た。

12.2 PDF/A に よ る アー カ イ ビ ング 357


12.3 PDF/X に よ る印刷出力
12.3.1 PDF/X 規格 フ ァ ミ リ ー
注 PDF/X に初めてふれる方には、 PDF 協会が発行 し た文書 「PDF/X in a Nutshell」 を導入 と し
て推奨 し ます (www.pdfa.org/pdfx-in-a-nutshell/ 参照)。

PDF/X 形式群は、 ISO 15930 で記述 さ れ、 商業印刷に適 し たデー タ の受け渡 し に利用で き


る 一貫 し た堅牢な PDF の部分集合を定義 し てい ます。 PDFlib は、 以下に説明する 種類の
PDF/X に準拠 し た出力を生成 し 入力を処理す る こ と がで き ます。 表 12.15 に、 各種 PDF/
X の主な違いを挙げます。

表 12.15 各種 PDF/X の比較


PDF/X-3 PDF/X-4 PDF/X-4p PDF/X-5n
PDF バージ ョ ン PDF 1.4 PDF 1.6 PDF 1.6 PDF 1.6

CMYK ・ スポ ッ ト カ ラ ー 可 可 可 可
デバイ ス独立カ ラ ー (ICCBased ・ 可 可 可 可
Lab)

透過 ・ レ イ ヤー ― 可 可 可
外部参照出力イ ン テ ン ト ICC プ ロ ― ― 可 可
フ ァ イル

n 色出力イ ン テ ン ト ICC ロ フ ァ イル ― ― ― 可

ISO 15930-4 で定義 さ れた PDF/X-1a:2003 こ の規格は、PDF 1.4 に基づいてお り 、 そのい


く つかの機能 (透過な ど) が禁止 さ れてい ます。 PDF/X-1a は、 CMYK ・ ス ポ ッ ト カ ラ ー
にのみ対応 し てお り 、 RGB ま たは ICC ベース の色には対応 し てい ません。 ですので PDF/
X-1a は廃止済です。

ISO 15930-6 で定義 さ れた PDF/X-3:2003 こ の規格は、 PDF 1.4 に基づいてお り 、 グ レー


ス ケール ・ CMYK ・ ス ポ ッ ト カ ラ ーだけでな く デバ イ ス独立色に基づ く ワ ー ク フ ロ ーに対
応 し てい ます。 出力デバ イ ス と し ては単色 ・ RGB ・ CMYK のいずれか を使 う こ と がで き ま
す。 い く つかの PDF 1.4 機能、 と り わけ透過が禁止 さ れてい ます。 PDF バージ ョ ンが古い
ので、 ま た、 透過が除外 さ れてい る ので、 PDF/X-3 は廃止済です。

ISO 15930-7 で定義 さ れた PDF/X-4 こ の規格は、 PDF 1.6 に基づいてい ま す。 PDF/X-4


では、 透過 と レ イ ヤーは許 さ れますが、 それ以外のい く つかの PDF 1.6 の機能は依然禁止
さ れてい ます。 その変種であ る PDF/X-4p では、 出力 イ ン テ ン ト ICC プ ロ フ ァ イ ルを、 容
量を抑え る ために PDF 文書の外に置 く こ と が許 さ れます。 PDFlib は 15930-7:2010 を実装
し てい ます。

ISO 15930-8 で定義 さ れた PDF/X-5 こ の規格は 「部分的交換」 のための も のです。 部分


的交換を行 う には、 フ ァ イ ルの作 り 手 と 受け手の間で事前の協議が必要です。 PDF/X-5n
は、 PDF 1.6 に基づいてお り 、 n 色の印刷特性に対す る 外部出力 イ ン テ ン ト ICC プ ロ フ ァ
イ ルに対応 し てい ます。 こ のプ ロ フ ァ イ ルは xCLR プ ロ フ ァ イ ル と も 呼ばれます。
PDFlib は、 ISO 15930-8:2010 を、 正誤表 1 も 含めて実装 し てい ます。

358 第 12 章 : PDF のバージ ョ ン と 規格


12.3.2 一般的要件
ク ッ ク ブ ッ ク PDF/X を生成する ためのコ ー ド サン プルが PDFlib ク ッ ク ブ ッ クの pdfx カ テ ゴ リ ーにあ り
ます。

PDFlib ク ラ イ ア ン ト プ ロ グ ラ ムが、 こ の項に記す諸規則に従えば、 有効な PDF/X 出力が


保証 さ れます。 PDFlib は、 PDF/X 規則への違反を検出す る と 例外を発生 さ せ、 PDF 出力
は何 も 生成 さ れません。 表 12.16 に、 PDF/X 準拠出力を生成す る ための一般的要件を挙げ
ます。

表 12.16 PDF/X 準拠のための一般的要件


項目 PDF/X 互換のための PDFlib の要件

PDF/X準拠レ ベル と PDF_begin_document( ) : pdfx オプ シ ョ ン を、 必要な PDF/X 準拠レ ベルに設定する必要があ


PDF互換性 り ます。 例 : pdfx=PDF/X-4。
PDF/X-3 : PDF 1.5 以上を必要 と する操作を避ける必要があ り ます。
PDF/X-4/5n : PDF 1.7 以上を必要 と する操作を避ける必要があ り ます。

フォン ト フ ォ ン ト オプ シ ョ ン embedding が true であ る必要があ り ます。 埋め込みは PDF コ ア フ ォ


ン ト について も必須です。 こ の埋め込みの要件への唯一の例外は、 不可視テキス ト のため
にだけ使用 さ れている フ ォ ン ト です (主 と し て OCR の出力のための有用)。 こ れは
optimizeinvisible オプ シ ョ ン を用いて制御で き ます (PDF/X-3 では許 さ れません)。

ページ寸法 PDF_begin/end_page_ext( ) : ページ枠群を cropbox ・ bleedbox ・ trimbox ・ artbox オプ シ ョ ン


を通 じ て設定可能です。 こ れら が以下の要件を満たす必要があ り ます :
> TrimBox か ArtBox を設定する必要があ り ますが、ただ し こ れら の枠エ ン ト リ ーを両方 と も
設定 し てはいけません。 TrimBox も ArtBox も 見つか ら ない と きは、 PDFlib は CropBox
( も し あれば) を TrimBox と し て採 り 、 CropBox も見つから ない と きは MediaBox を採 り ま
す。
> BleedBox が、 存在する と きは、 ArtBox と TrimBox を完全に包含 し ている必要があ り ます。
> CropBox が、 存在する と きは、 ArtBox と TrimBox を完全に包含 し ている必要があ り ます。
レ イ ヤー PDF/X-3 : レ イ ヤーを避ける必要があ り ます。
PDF/X-4/5n : レ イ ヤーを使え ますが、 ただ し PDF_define_layer( ) のい く つかのオプ シ ョ ン
を避ける必要があ り ます。

文書情報 Creator ・ Title 情報 フ ィ ール ド を、 空で ない値に設定する必要があ り ます。 PDF_set_info( )


フ ィ ール ド と を用いるか、 (PDF/X-4/5n では) PDF_begin/end_document( ) の metadata オプ シ ョ ン で
XMP メ タ デー タ xmp:CreatorTool ・ dc:title XMP プ ロパテ ィ を用います。
PDF_set_info( ) で Trapped 情報 フ ィ ール ド に、 ま たは PDF_begin/end_document( ) の
metadata オプ シ ョ ン でその対応する XMP プ ロパテ ィ pdf:Trapped には、 値 True か False
以外を避ける必要があ り ます。

セキ ュ リ テ ィ ー PDF_begin_document( ) : userpassword ・ masterpassword ・ permissions オプ シ ョ ン を避ける


必要があ り ます。

フ ァ イルサイ ズ PDF/X-4/5n : 生成 さ れる PDF 文書の フ ァ イルサイ ズが 2 GB を超え てはな ら ず、 かつ、


PDF オブ ジ ェ ク ト の数が 8.388.607 未満でなければな り ません。 こ れ らの制限に関 し て詳 し
く は 65 ページ 「3.1.6 PDF 文書の最大サイ ズ と その他の制限」 を参照 し て く だ さ い。

PDF取 り 込み PDF_open_pdi_document( ) が制約 さ れます。 ただ し infomode=true の場合を除き ます。 365


ページ 「12.3.6 PDF/X 文書を PDI で取 り 込む」 を参照 し て く だ さ い。

12.3 PDF/X に よ る印刷出力 359


12.3.3 出力 イ ン テ ン ト と 色の要件
PDF/X は、 忠実な色再現を保証す る ために、 デバ イ ス独立な色指定を必須 と し てい ます。
色空間は以下の ソ ース か ら 来 る 可能性があ り ます :
> PDF_load_image( ) と PDF_fill_imageblock( ) を用いて直接的に読み込まれた画像 と 、PDF_
load_graphics( ) を通 じ て間接的に読み込まれた画像
> PDF_set_graphics_option( ) か PDF_setcolor( ) を用いた明示的な色指定
> オプシ ョ ン リ ス ト を通 じ た色指定。 た と えばテ キ ス ト フ ロ ー内において。
> ス ポ ッ ト ま たは DeviceN カ ラ ーの代替色空間
> 透過グ ループの た めのブ レ ン ド す る 色空間 : PDF_begin/end_page_ext( ) ・ PDF_begin_
template_ext( ) ・ PDF_load_graphics( ) : オプシ ョ ン transparencygroup でサブオプシ ョ
ン colorspace

上記の操作は、 以下に詳 し く 示す よ う に、 PDF/X 出力を生成す る 際、 さ ま ざ ま な制約に


従 う 必要があ り ます。

出力 イ ン テ ン ト 出力 イ ン テ ン ト は、 意図 さ れ る 出力先デバ イ ス か印刷条件を定義 し ま
す。 こ れは、 プルーフ ィ ン グ (あ る 印刷機器を他の機器でシ ミ ュ レー ト する ) と 、 デバ イ
ス独自カ ラ ーの特性化のために有用であ り 、透過計算のためのブ レ ンデ ィ ン グ色空間 と し
て も 有用です。 PDF/X の出力 イ ン テ ン ト は通常、 グ レース ケール ・ RGB ・ CMYK いずれ
かの ICC プ リ ン タ ープ ロ フ ァ イ ルに よ っ て記述 さ れます。 ただ し PDF/X-5n は n 色 ICC
プ ロ フ ァ イ ルに対応 し てい ます。 詳細は PDF/X の種類に よ っ て異な り ます :
> PDF/X-3/4:出力 イ ン テ ン ト を、出力先デバ イ ス か印刷条件のための ICC プ ロ フ ァ イ ル
を埋め込む こ と に よ っ て指定で き ます。
> PDF/X-4p・PDF/X-5n:出力 イ ン テ ン ト のための外部 ICC プ ロ フ ァ イ ルを参照する こ と
に よ っ て (規格の名前の中の p は、外部プ ロ フ ァ イ ルが参照 さ れ る こ と を意味 し ます)。
チ ェ ッ ク サ ムに よ っ て保護 さ れた、 ICC フ ァ イ ルへの強力な参照が作成 さ れます。 参
照 ICC プ ロ フ ァ イ ルはその PDF 出力内に必ず し も 埋め込まれ る わけではないのです
が、 それで も PDF 作成時に こ れが利用可能であ る 必要があ り ます。 urls オプシ ョ ン を、
1 個ない し 複数の、 その ICC プ ロ フ ァ イ ルを発見で き る 場所の有効な URL と と も に与
え る 必要があ り ます :
if (p.load_iccprofile("CGATS TR 001",
"usage=outputintent urls={http://www.color.org}") == -1)
{
/* エラー */
}

> PDF/X-5n:その PDF 文書の受信者がその出力 イ ン テ ン ト ICC プ ロ フ ァ イ ルを利用で き


る よ う にす る ために、 ICC プ ロ フ ァ イ ルを PDF 文書内に添付する こ と も で き ます。 そ
のためには embedprofile オプシ ョ ン を用い ます。 こ れは、 ICC プ ロ フ ァ イ ルを PDF 文
書に、 フ ァ イ ル添付の よ う に添付 し ます。 こ の よ う にプ ロ フ ァ イ ルを埋め込む場合に
は、 urls オプシ ョ ンは必要あ り ません。

対応 し てい る すべての PDF/X 種別におけ る 出力 イ ン テ ン ト 処理の比較を表 12.17 に示 し


ます。出力 イ ン テ ン ト に対す る ICC プ ロ フ ァ イ ルは、意図する 印刷プ ロ セ ス と 用紙に基づ
いて、 プ リ ン ト プ ロ バ イ ダーに よ っ て指定 さ れ る べ き です。 印刷工程がわか ら ない場合、
ま たはプ リ ン ト プ ロ バ イ ダーが出力 イ ン テ ン ト を何 も 指定 し ていない場合には、然る べき
ICC プ ロ フ ァ イ ルを選ぶための推奨事項が www.pdflib.com にあ り ます。

360 第 12 章 : PDF のバージ ョ ン と 規格


表 12.17 さ ま ざ ま な PDF/X 種別に対する出力イ ン テ ン ト 処理
PDF/X-3 PDF/X-4 PDF/X-4p PDF/X-5n

出力イ ン テ ン ト の グ レース グ レースケールか RGB か CMYK n 色 ICC プ ロ フ ァ イル (xCLR)


色空間 ケールか の ICC プ ロ フ ァ イル
RGB か
CMYK

出力イ ン テ ン ト 常に埋め込 常に埋め込 外部参照、 ただ し ICC プ ロ フ ァ イルを添付する


ICC プ ロ フ ァ イル まれる まれる こ と も可能
の埋め込み

その他の制約 ― CMYK 出力イ ン テ ン ト プ ロ フ ァ イ 出力イ ン テ ン ト プ ロ フ ァ イル


ルを他の目的に使用する こ と は を他の目的に使用する こ と は
不可 不可

PDF/X-3 ・ PDF/X-4/4p に対す る色の要件 PDF/X-3/4 は、 ICC プ ロ フ ァ イ ルを用いたデ


バ イ ス独立な ワ ー ク フ ロ ーをサポー ト し てい ます。 表 12.18 に、 こ れ ら の規格のための要
件を挙げます。 PDF/X-5n は、 別の ワ ー ク フ ロ ーを対象に し てい ますので、 その要件は次
の項で別途挙げます。
PDF/X-4 には特殊な規則が適用 さ れます : CMYK 出力 イ ン テ ン ト プ ロ フ ァ イ ル (すな
わち usage=outputintent を用いて読み込まれた) を、 同一文書内の ICC ベース色空間 (す
なわち usage=iccbased を用いて読み込まれた) のために用い る こ と はで き ません。 こ の要
件は、 PDF/X 規格に よ っ て必須 と さ れてい る も のであ り 、 CMYK プ ロ フ ァ イ ルに対 し て
のみ適用 さ れ、 グ レース ケール ・ RGB プ ロ フ ァ イ ルには適用 さ れません。 こ の衝突が生 じ
た場合には、 単に ICC プ ロ フ ァ イ ルを省略 し てかわ り にプ レーン な CMYK カ ラ ーを使用
す る のが よ いで し ょ う 。 なぜな ら 出力 イ ン テ ン ト CMYK プ ロ フ ァ イ ルはいずれにせ よ 適
用 さ れ る か ら です。 不必要なエ ラ ー メ ッ セージ を避け る ため、 PDFlib は、 画像か SVG グ
ラ フ ィ ッ ク に埋め込まれてい る CMYK ICC プ ロ フ ァ イ ルが PDF/X 出力 イ ン テ ン ト と 等 し
い場合にはそれを無視 し ます。
こ の制約は、 取 り 込ま れ る 文書に も 適用 さ れ ます : 取 り 込ま れ る ページが、 生成 さ れ
る 文書の出力 イ ン テ ン ト と 同 じ CMYK ICC プ ロ フ ァ イ ルを用いてい る 場合には、 それは
PDF_open_pdi_page( ) に よ っ て拒絶 さ れます。

表 12.18 PDF/X-3 ・ PDF/X-4/4p 準拠のための色の要件


項目 PDF/X-3 ・ PDF/X-4/4p 互換のための PDFlib の要件

出力条件 PDF_begin_document( ) の直後に、 PDF_load_iccprofile( ) を usage=outputintent と し て、 ま た


(出力イ ン テ ン ト ) は PDF_process_pdi( ) を action=copyoutputintent と し て呼び出す必要があ り ます。 グ レー
スケールか RGB か CMYK の出力イ ン テ ン ト を与え る必要があ り ます。

グ レースケール グ レースケールカ ラ ーを使え るのは、 グ レースケールか CMYK の出力イ ン テ ン ト が存在す


カ ラー るか、 defaultgray オプ シ ョ ンが設定 さ れている と き だけです。

RGBカ ラ ー RGB カ ラ ーを使え るのは、 RGB 出力イ ン テ ン ト が存在するか、 defaultrgb オプ シ ョ ンが設


定 さ れている と き だけです。

CMYKカ ラ ー CMYK カ ラ ーを使え るのは、 CMYK 出力イ ン テ ン ト が存在するか、 defaultcmyk オプ シ ョ ン


が設定 さ れている と き だけです。

12.3 PDF/X に よ る印刷出力 361


表 12.18 PDF/X-3 ・ PDF/X-4/4p 準拠のための色の要件
項目 PDF/X-3 ・ PDF/X-4/4p 互換のための PDFlib の要件
Separation > PDF/X-3/4 : 代替色空間は上記の諸規則に従 う 必要があ り ます。
(スポ ッ ト ) ・ > PDF/X-4 : PDF_create_devicen( ) の前に、 その DeviceN 色空間内のすべてのカ ス タ ムスポ ッ
DeviceNカ ラ ー
ト カ ラ ーについて PDF_makespotcolor( ) を呼び出す必要があ り ます。
> PDF/X-4 : PDF_create_devicen( ) の process オプ シ ョ ンの colorspace サブオプ シ ョ ンは、
PDF/X 出力イ ン テ ン ト と 合致 し ている必要があ り ます。

PDF/X-5n に対す る出力 イ ン テ ン ト と 色の要件 PDF/X-5n に対す る 出力 イ ン テ ン ト ICC


プ ロ フ ァ イ ルは、 n 色印刷デバ イ ス を記述 し てい る 必要があ り ます。 こ の よ う なプ ロ フ ァ
イ ルは色空間指定 xCLR を内容 と し て持ち ます。 こ こ で x は、 2 か ら F ま での 16 進数で、
すなわち 2CLR ~ FCLR と な り 、 2 ~ 15 個の イ ン キ を表 し ます。 xCLR プ ロ フ ァ イ ルは、 プ
レーン な PDF では対応 さ れてお ら ず、PDF/X-5n の出力 イ ン テ ン ト と し てのみ使用可能で
す。 PDF は こ の よ う なプ ロ フ ァ イ ルに直接対応 し てい ませんので、 こ の よ う なプ ロ フ ァ イ
ルは、 出力 イ ン テ ン ト と し て埋め込む こ と はで き ず、 外部フ ァ イ ル と し て参照する 必要が
あ り ます。 ただ し こ れは外部オブジ ェ ク ト と し て、 フ ァ イ ル添付に し て埋め込む こ と は可
能ですので、 そ う す る と 入手可能性を向上 さ せる こ と がで き ます。
xCLR プ ロ フ ァ イ ルは、 名前付 き イ ン キ群の名前 と カ ラ ー値を持っ た イ ン キ テーブルを
内容 と し て持ち ます。 PDF/X-5n 文書内で許 さ れ る 色空間 と 関連 し て、 xCLR 出力 イ ン テ ン
ト プ ロ フ ァ イ ルが イ ン キ Black を内容 と し て持っ てい る か、 ま たは場合に よ っ てはすべて
の CMYK イ ン キ Cyan ・ Magenta ・ Yellow ・ Black を内容 と し て持っ てい る かは重要です。
た と えば、 CMYK ・ オ レ ン ジ ・ グ リ ーン ・ バ イ オ レ ッ ト イ ン キ (CMYKOGV) を用いた印
刷処理のための 7CLR プ ロ フ ァ イ ルは、 両方の要件を満た し ます。
表 12.19 に、 PDF/X-5n に対す る 要件を挙げます。

表 12.19 PDF/X-5n 準拠のための色の要件


項目 PDF/X-5n 互換のための PDFlib の要件
出力条件 PDF_begin_document( ) の直後に、 PDF_load_iccprofile( ) を usage=outputintent と し て、 ま た
(出力イ ン テ ン ト ) は PDF_process_pdi( ) を action=copyoutputintent と し て呼び出す必要があ り ます。 n 色
(xCLR) プ ロ フ ァ イルを与え る必要があ り ます。

グ レースケール グ レースケールカ ラ ーを使え るのは、 出力イ ン テ ン ト がイ ンキ Black を内容 と し て持 っ て


カ ラー いるか、 defaultgray オプ シ ョ ンが設定 さ れている と き だけです。

RGBカ ラ ー RGB カ ラ ーを使え るのは、 defaultrgb オプ シ ョ ンが設定 さ れている と き だけです。

CMYKカ ラ ー CMYK カ ラ ーを使え るのは、 出力イ ン テ ン ト がイ ンキ Cyan ・ Magenta ・ Yellow ・ Black をす


べて内容 と し て持 っ ているか、 defaultcmyk オプ シ ョ ンが設定 さ れている と き だけです。

Separation > 代替色空間は上記の諸規則に従 う 必要があ り ます。


(スポ ッ ト ) ・ > PDF_create_devicen( ) の前に、その DeviceN 色空間内のすべてのカ ス タ ムスポ ッ ト カ ラ ーに
DeviceNカ ラ ー
ついて PDF_makespotcolor( ) を呼び出す必要があ り ます。 出力イ ン テ ン ト 内のイ ンキ リ ス
ト にある スポ ッ ト カ ラ ーは こ の要件から除外 さ れます。
> PDF_create_devicen( ) のオプ シ ョ ン subtype=nchannel と process は許容 さ れません。

然るべき PDF/X 出力 イ ン テ ン ト を選ぶ PDF/X 出力 イ ン テ ン ト の選択は通常、 印刷出力


を と り し き る 印刷業者 と の話 し 合いで決ま り ます。出力 イ ン テ ン ト の選択に関する 情報が

362 第 12 章 : PDF のバージ ョ ン と 規格


印刷所側か ら 出て こ ない と き は、 然 る べ き ICC 出力 イ ン テ ン ト プ ロ フ ァ イ ルを イ ン タ ー
ネ ッ ト で見つけ る こ と がで き ます。

PDF/X-3/4/5 を作成す る ための カ ラ ー戦略 色処理については、以下の 2 種類の戦略が可


能であ り 、 場合に よ っ ては組み合わせ る こ と も で き ます :
> デバ イ ス独立カ ラ ー:出力 イ ン テ ン ト ICC プ ロ フ ァ イ ルの種類にかかわ ら ず、デバ イ ス
独立色空間を、 すなわち ICC ベース か CIELab を使え ます。 Lab カ ラ ー値 (0, 0, 0) は、
純粋な黒をデバ イ ス独立な形で指定 し ます。 Lab 黒色を手作業で設定す る には、 以下
の呼び出 し を用い ます :
p.set_graphics_option("fillcolor={lab 0 0 0}");

> デバ イ ス依存カ ラ ー:デバ イ ス独自のグ レース ケールか RGB か CMYK カ ラ ーを使え ま


す。 グ レ ー ス ケ ール カ ラ ーは ど ん な 種類の出力 イ ン テ ン ト に対 し て も 使 え ま すが、
RGB ・ CMYK カ ラ ーは整合す る 出力 イ ン テ ン ト と し か使え ません。

ス ポ ッ ト ・ DeviceN カ ラ ー を、 そ の対応す る 代替色空間に従 っ て使 う こ と も で き ま す。


PDFlib は CIELab を、 内蔵の HKS ・ Pantone ス ポ ッ ト カ ラ ーに対す る 代替色空間 と し て用
いてい ますので、 こ れ ら は常に PDF/X-3/4/5 で使え ます。 カ ス タ ム ス ポ ッ ト カ ラ ーに対
し ては、 その代替色空間を、 それが出力 イ ン テ ン ト と 互換にな る よ う に選び取 る 必要があ
り ま す。 DeviceN 色空間内で使用 さ れてい る すべての カ ス タ ム ス ポ ッ ト カ ラ ーについて
PDF_makespotcolor( ) を呼び出す必要があ り ます。
表 12.20 内のカ ラ ー戦略の要約は、 PDF/X のアプ リ ケーシ ョ ン を計画す る ために有用
でし ょ う 。

表 12.20 PDF/X-3/4/5 のカ ラ ー戦略


出力イ ン テ ン ト その文書で使え る色空間
ICC プ ロ フ ァ イル
CIELab ICC ベース Separation ・ グレー RGB1 CMYK1
DeviceN スケール1

グ レースケール ◯ ◯ ◯ ◯ - -
RGB2 ◯ ◯ ◯ ◯ ◯ -
CMYK ◯ ◯ ◯ ◯ - ◯

PDF/X-5nのための ◯ ◯ ◯ ◯ - -
xCLR

1. ICC プ ロ フ ァ イルを、 ま たはそのページのためのデ フ ォ ル ト 色空間を持たないデバイ ス色空間


2. PDF/X 規格はプ リ ン タ ープ ロ フ ァ イルを必須 と し ます。 sRGB な ど モ ニ タ ープ ロ フ ァ イルを使 う こ と はで き ません。
RGB プ リ ン タ ープ ロ フ ァ イルは非常に稀です。

12.3.4 画像 と 透過の要件
ラ ス タ ー画像は、 363 ページ 「12.3.5 イ ン タ ラ ク テ ィ ブ機能のための要件」 で説明 し た色
関連の諸要件に従 う 必要があ り ます。 に、 PDF/X 準拠のための画像関連の追加の要件を
挙げます。

12.3.5 イ ン タ ラ ク テ ィ ブ機能のための要件
表 12.22 に、 PDF/X 準拠出力を生成す る 際に制限 さ れ る すべての操作を挙げます。 PDF/
X モー ド で こ の禁 じ ら れた関数の う ちのいずれかを呼び出す と 例外が発生 し ます。

12.3 PDF/X に よ る印刷出力 363


表 12.21 PDF/X 準拠のための画像要件
項目 PDF/X 準拠のための PDFlib の要件

画像 > PDF/X-3 : JBIG2 画像は避ける必要があ り ます。


> PDF/X-4/5 : JPEG 2000 画像は特定の諸要件を満たす必要があ り ます。 詳 し く は 189 ペー
ジ 「JPEG 2000 画像」 参照。
透過 PDF/X-3 : 透過は避ける必要があ り ます。 こ れは以下の API 機能に影響 し ます :
> PDF_load_image( ) : masked オプ シ ョ ンは、 そのマス クが 1 ビ ッ ト 深度の画像を参照 し てい
るのでない限 り 、 避ける必要があ り ます。
> PDF_load_image( ) : 内在透過 (アルフ ァ チ ャ ン ネル) を持 っ た画像は許容 さ れません。 そ
れを読み込むには ignoremask オプ シ ョ ン を用いる必要があ り ます。
> PDF_load_graphics( ) : 透過要素を内容 と し て持つ SVG グ ラ フ ィ ッ クは避ける必要があ り ま
す。
> PDF_create_gstate( ) : opacityfill ・ opacitystroke オプ シ ョ ンは、 それが値 1 を持つので
ない限 り 、 避ける必要があ り ます。 blendmode が使用 さ れる場合には、 それは Normal で
あ る必要があ り ます。 softmask が使用 さ れる場合には、 それは none であ る必要があ り ま
す。
PDF/X-4/5n : 透過画像 ・ グ ラ フ ィ ッ ク を使用で き ます。

透過グループ PDF_begin/end_page_ext( ) ・ PDF_begin_template_ext( ) ・ PDF_open_pdi_page( ) ・ PDF_load_


graphics( ) : オプ シ ョ ン transparencygroup に以下の制約が課せ られます :
> PDF/X-3 : オプ シ ョ ン transparencygroup は許容 さ れません。
> PDF/X-4 : transparencygroup オプ シ ョ ンのサブオプ シ ョ ン colorspace は、 表 12.18 のグ
レースケール ・ RGB ・ CMYK カ ラ ーに対する要件を満たす必要があ り ます。 PDF_open_pdi_
page( ) と PDF_load_graphics( ) に対 し ては transparencygroup=auto が強制 さ れます。
> PDF/X-5n : 透過オブ ジ ェ ク ト を内容 と し て持つすべてのページに対 し てオプ シ ョ ン
transparencygroup が必要です。 transparencygroup オプ シ ョ ンのサブオプ シ ョ ン
colorspace は、 表 12.19 に示 さ れているグ レースケール ・ RGB ・ CMYK カ ラ ーに対する要
件を満たす必要があ り ます。 PDF_begin/end_page_ext( ) に対 し ては、 オプ シ ョ ン
transparencygroup=none と サブオプ シ ョ ン colorspace=none は許容 さ れません。

表 12.22 イ ン タ ラ ク テ ィ ブ機能のための PDF/X の要件


項目 PDF/X 互換のための PDFlib メ ソ ッ ド ・ オプ シ ョ ンの要件

注釈 と フ ォ ーム PDF_create_annotation( ) ・ PDF_create_field( ) : BleedBox (BleedBox が存在 し ない場合には


フ ィ ール ド TrimBox/ArtBox) 内では注釈を避ける必要があ り ます。 以下の種別の場合には、 注釈の長
方形を、 少な く と も線幅の半分は BleedBox の外に置 く 必要があ り ます : Square ・ Circle ・
Ink ・ PolyLine ・ Polygon。 PDF_create_annotation( ) の calloutline ・ cloudy ・
createrichtext オプ シ ョ ンは許 さ れません。

PDF/X-3 : PDF_create_annotation( ) で type=Caret ・ FileAttachment ・ Highlight を用いる こ


と は許 さ れません。
PDF/X-4/5 : PDF_create_annotation( ) で type=Caret ・ Highlight ・ Screen を用いる こ と は許
さ れません。
PDF_fit_pdi_page( ) で useannots/usefields オプ シ ョ ン を用いた場合 : し お り と フ ォ ーム
フ ィ ール ド は、 それが生成 さ れるページの BleedBox (それが生成 さ れるページの BleedBox
がないな ら TrimBox/ArtBox) の中に位置する場合にのみ取 り 込まれます。 こ の場合にはオ
プ シ ョ ン clipannotations=false が必須です。

フ ァ イル添付 PDF/X-3 : PDF_begin/end_document( ) : オプ シ ョ ン attachments を避ける必要があ り ます。

364 第 12 章 : PDF のバージ ョ ン と 規格


表 12.22 イ ン タ ラ ク テ ィ ブ機能のための PDF/X の要件
項目 PDF/X 互換のための PDFlib メ ソ ッ ド ・ オプ シ ョ ンの要件

アクシ ョ ンと PDF_create_action( ) : すべてのア ク シ ョ ン を、 JavaScript も 含めて避ける必要があ り ます。


JavaScript

ビ ュ ーアー環境設 PDF_begin/end_document( ) : viewerpreferences オプ シ ョ ンに対 し て viewarea ・ viewclip ・


定/表示 ・ 印刷領域 printarea ・ printclip サブオプ シ ョ ン を用いる場合には、 media か bleed 以外の値は許容
さ れません。

12.3.6 PDF/X 文書を PDI で取 り 込む


既存の PDF 文書のページ を PDF-X 出力文書へ取 り 込 も う と する 際には、 追加の規則が適
用 さ れます (詳 し く は 211 ページ 「8.3 PDF ページ を PDI で取 り 込む」 参照)。 取 り 込ま
れ る 文書はすべて、 表 12.23 に従っ て カ レ ン ト PDF/X モー ド に互換な PDF/X レベルに準
拠 し てい る 必要があ り ます。 許容 さ れ る すべての PDF/X-4/5 出力 と の組み合わせに対 し
て、 以下の追加の規則に服する 必要があ り ます : 取 り 込まれ る ページが、 生成 さ れ る 文書
の出力 イ ン テ ン ト と 同 じ CMYK ICC プ ロ フ ァ イ ルを用いてい る 場合には、それは PDF/X-
4/5 規格に違反す る ので、 PDF_open_pdi_page( ) に よ っ て拒絶 さ れます。
あ る 特定の PDF/X 準拠レベルが PDFlib で構成 さ れていて、 かつ、 取 り 込まれた文書
も その互換レベルを遵守 し てい る な ら ば、 生成出力はその選択 さ れた PDF/X 準拠レベル
に準拠 し てい る こ と が保証 さ れます。 カ レ ン ト PDF/X レベルに互換でない文書は PDF_
open_pdi_document( ) で拒絶 さ れます。

表 12.23 さ ま ざ ま な PDF/X 出力レ ベルに対する互換 PDF/X 入力レ ベル


取 り 込まれる文書の PDF/X レ ベル

PDF/X-1a ・ PDF/X-4 PDF/X-4p PDF/X-5n


PDF/X 出力レ ベル PDF/X-3
PDF/X-3 許容
PDF/X-4 許容 許容 許容
PDF/X-4p 許容 許容 許容1
PDF/X-5n 許容2

1. PDF_process_pdi( ) で action=copyoutputintent を指定する と 、 外部出力イ ン テ


ン ト ICC プ ロ フ ァ イルへの参照が コ ピー さ れます。
2. 取 り 込まれる文書が、 同一の出力イ ン テ ン ト (チ ェ ッ ク サムが等 し い) を使用 し て
いる必要があ り ます。

複数の PDF/X 文書を取 り 込む場合は、 それ ら はすべて同一の出力条件に対 し て作成 さ れ


てい る 必要があ り ます。
PDFlib は、 い く つか特定の項目を修正す る こ と はで き ますが、 PDF/X の検証を行な っ
た り 、取 り 込み文書に PDF/X 互換を強制 し た り す る よ う には も と も と 作 ら れてい ません。
た と えば PDFlib は、 取 り 込んだ PDF ページに欠けてい る フ ォ ン ト を埋め込んだ り は し ま
せん し 、 取 り 込んだページに対 し て色補正な ど も 一切行い ません。
ページ を取 り 込んだ結果 と し てで き る PDF 出力文書が、 入力文書 (1 つ複数) と 同 じ
PDF/X 準拠レベル と 出力条件に準拠す る よ う に し たい場合は、 次の よ う に、 取 り 込ま れ
た PDF の PDF/X ス テー タ ス を ク エ リ ーす る こ と がで き ます :
pdfxlevel = p.pcos_get_string(doc, "pdfx");

12.3 PDF/X に よ る印刷出力 365


こ の ス テー ト メ ン ト は、 取 り 込まれた文書が ISO PDF/X レベルに準拠 し てい る 場合には、
PDF/X 準拠レベルを表す文字列を得ます。 そ う でない場合には none を得ます。 こ の返っ
て き た文字列を用いれば、 PDF_begin_document( ) の pdfx オプシ ョ ン を用いて出力文書の
PDF/X 準拠レベルを適切に設定す る こ と がで き ます。

取 り 込まれた文書か ら PDF/X 出力 イ ン テ ン ト を コ ピ ー PDF/X 準拠 レ ベル を ク エ リ ー


す る だけでな く 、 取 り 込まれた文書か ら PDF/X 出力 イ ン テ ン ト を コ ピーする こ と も で き
ます。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の pdfx/clone_pdfx ト ピ ッ ク内にあ り ます。

こ れは、 PDF_load_iccprofile( ) に よ る 出力 イ ン テ ン ト 設定のかわ り に利用する こ と がで き 、


取 り 込み文書の出力 イ ン テ ン ト を、 生成す る 文書に コ ピー し ま す。 出力 イ ン テ ン ト を コ
ピーす る 方法は、 取 り 込まれた PDF/A と PDF/X の文書に対 し て通用 し ます。

366 第 12 章 : PDF のバージ ョ ン と 規格


12.4 PDF/VT に よ る可変 ・ ト ラ ンザ ク シ ョ ン印刷
12.4.1 PDF/VT 規格
注 PDF/VT 規格に関する一般情報が PDFlib Web サイ ト にあ り ます。 PDF 協会が発行 し た文書
「PDF/VT Application notes」 も推奨 し ます (www.pdfa.org/resource/pdfvt-application-notes/
参照)。

PDF/VT 規格は ISO 16612-2 と し て発行 さ れてい ます。 こ れは 「 さ ま ざ ま な環境で可変文


書印刷 (VDP) を可能にする よ う 設計 さ れた」 も のです。 PDF/VT 文書は、 最終的な コ ン
テ ン ツ エ レ メ ン ト 群 と 、 関連す る メ タ デー タ と を内容 と し ますが、 変数やテ ンプ レー ト を
含んではい ません。 PDF/VT は、 PDF/X-4 に基づいてお り 、 さ ら に透過 と レ イ ヤーを含め
て PDF 1.6 の諸機能に対応 し てい ます。 PDF/X の要件に加え て、 PDF/VT 規格は、 大量
パー ソ ナ ラ イ ズ印刷の要請を満たす補足機能を PDF に追加 し てい ます。 PDF/VT は、 電
子印刷フ ァ イ ルの高パフ ォーマ ン ス レ ン ダ リ ン グ を可能にする ために、効果的な リ ソ ース
管理を PDF に追加 し てい ます。
PDF/VT-1 は、 PDF 1.6 に基づいてお り 、 単一フ ァ イ ル交換のために設計 さ れてお り 、
PDF/X-4 に基づいてい ます。 1 個の PDF 文書を表現す る ために必要な リ ソ ース のすべて
が、 単一の PDF/VT-1 フ ァ イ ル内に含まれてい ます。

12.4.2 PDF/VT の諸概念


こ の項では、 PDF/VT が基づいてい る 技術的諸概念のあ ら ま し を提供 し ます。

文書部分 ヒ エ ラ ルキー 文書部分 (DPart) ヒ エ ラ ルキーは、 1 個の PDF/VT フ ァ イ ル内


の文書群ない し 文書の部分群の並び と 関係を指定 し ま す。 代表的な シナ リ オでは、 こ の
PDF/VT フ ァ イ ルは、 多 く の受領者のための下位文書群を内容 と し てお り 、 そ し てそれぞ
れの文書部分は、 個々の受領者のための下位文書を構成す る ページ群に対応 し てい ます。
受領者にページ を割 り 当て る だけでな く 、 こ の文書部分 ヒ エ ラ ルキーは、 も っ と 複雑な構
造を反映す る こ と も で き ます。 た と えば、 受領者を その住所内の郵便番号に従っ て グルー
プ化 し た り 、 郵便番号を州に従っ て ま と めた り 、 州を国に従っ て ま と めた り す る こ と がで
き ます。 こ の種の文書組織化は、 その文書内のすべてのページ を包含する 1 個の樹状構造
を作成 し ます。 こ のツ リ ーの要素群を DPart ノ ー ド と いい、 そ こ ではそれぞれの内部 ノ ー
ド は他の DPart ノ ー ド 群を内容 と し 、 それぞれの葉 ノ ー ド は 1 つの受領者のための 1 個な
い し 複数のページ を指定 し ます。
PDF/VT フ ァ イ ル内の文書部分 ヒ エ ラ ルキーを用いて、 ページにア ク セ スす る こ と も
で き ます。 こ れは、 ページ番号やページ ラ ベルに よ る ア ク セ ス と いっ た他の方式のかわ り
に使え ます。 こ の DPart ヒ エ ラ ルキーは、 PDF/VT フ ァ イ ル内では必須です。 そのオプ
シ ョ ナルな レ コ ー ド レベル値は、 個別の受領者に対す る レ コ ー ド に対応す る DPart ヒ エ ラ
ルキー内の レベルを選択 し ます。 こ れは ス コ ープ ヒ ン ト のために意味を持ち ます (後述)。

文書部分 メ タ デー タ 文書ツ リ ー内のルー ト ノ ー ド か ら 葉群 ま で下 る 文書部分 ヒ エ ラ ル


キー内の各 ノ ー ド は、 文書部分 メ タ デー タ (DPM) を含む こ と がで き ま す。 こ れ を使 う
と 、 1 つの受領者の文書 と その部分群に関す る 情報を伝え る こ と がで き ます。 と り わけ、
印刷のために意味を持つ諸特性 (あ る 文書部分の印刷部数な ど) や、 受領者に関す る 情報
(その対応す る 郵便番号な ど) を DPM 内に符号化す る こ と が可能です。
JDF (ま たは他の) 印刷 メ タ デー タ は、 PDF/VT では必須ではあ り ませんが、 JDF 対応
ワ ー ク フ ロ ーにおいては実用的な価値を加え ます。

12.4 PDF/VT に よ る可変 ・ ト ラ ンザク シ ョ ン印刷 367


反復す る グ ラ フ ィ カ ル内容に対す る最適化 印刷要素が複数のページ上で再利用 さ れ る
こ と は よ く あ り ます。 た と えば、 1 つの送付文書のすべてのページ上に現れ る 企業 ロ ゴや
製品画像です。 反復す る グ ラ フ ィ カル内容の処理を最適化す る こ と は、 印刷フ ァ イ ルの
フ ァ イ ルサ イ ズ と 処理速度を向上 さ せ る ための重要な戦略です。 PDF は、 フ ァ イ ルサ イ ズ
を最適化す る ための手段 と し て、 つねに XObject をサポー ト し て き ま し た。 こ れは、 1 個
の印刷要素のために必要なデー タ を その フ ァ イ ル内に 1 回だけ入れ込んで、複数のページ
(ま たは同一ページ上の複数の イ ン ス タ ン ス) か ら こ のデー タ への参照を許す も のです。
XObject は、 ラ ス タ ー画像か、 任意のテ キ ス ト ・ ベ ク ト ルグ ラ フ ィ ッ ク コ ン テ ン ツ を内容
と す る こ と がで き ます。 PDF におけ る XObject は、 1 個の文書の全体のサ イ ズ を最適化す
る こ と に主眼を置いてい ますが、 PDF は現在ま での と こ ろ、 反復する ページ コ ン テ ン ツ の
レ ン ダ リ ン グ を最適化す る ための手段を一切含んでい ません。た と えばあ る 特定のページ
上のあ る 画像が、 後で同一文書内の別のページ上に再び現れ る と い う こ と や、 あ る いは次
の印刷ジ ョ ブ内に現れ る か も し れない と い う こ と を、消費 ソ フ ト ウ ェ アに対 し て告げ る こ
と ので き る も のが、 PDF 内には何 も ないのです。 PDF/VT は、 PDF におけ る XObject の既
存の概念を拡張 し て、 印刷パフ ォーマ ン ス を最適化す る ための以下の手段を追加 し ます :
> 一意識別 : XObject に対 し て、 すべての文書を通 じ て一意であ る 識別子 (GTS_XID と い
う ) を割 り 当て る こ と がで き ます。 こ の識別子はキ ャ ッ シ ン グの実装のために利用可
能です。 なぜな ら こ の実装は、 同等な XObject を識別する 必要があ る か ら です。 簡単
な言葉で言えば、 ジ ョ ブ 1 のためにすでに処理 さ れてい る 、 かつジ ョ ブ 2 内で再利用
さ れ る こ と が発見 さ れた グ ラ フ ィ ッ ク については、 再度 リ ッ プす る 必要がな く 、 その
レ ン ダ リ ン グ結果を キ ャ ッ シ ュ か ら 採 る こ と がで き ます。
> ス コ ープ ヒ ン ト と 環境 コ ン テキス ト : XObject が、 そのグ ラ フ ィ カル内容が再利用 さ れ
る ページ群か文書群の範囲に関す る 情報 (GTS_Scope と い う ) を含む こ と がで き ます。
こ れに よ っ て XObject は、 キ ャ ッ シ ュ 内のその レ ン ダ リ ン グ結果の有用継続期間に関
す る 情報を伴 う こ と がで き ます : こ の コ ン テ ン ツはカ レ ン ト 受領者のためにだけ再利
用 さ れ る のか、 それ と も 同一フ ァ イ ルない し フ ァ イ ル ス ト リ ーム内の ど こ か別の所で
再利用 さ れ る のか、 あ る いは全 く 再利用 さ れないのか。 環境コ ン テ キ ス ト (GTS_Env と
い う ) が与え ら れ る と 、 XObject はグ ロ ーバル用途を、 すなわち、 それが複数の PDF/
VT イ ン ス タ ン ス内で再利用 さ れ る と い う こ と を指定す る こ と がで き ます。環境コ ン テ
キ ス ト 文字列について制限は全 く あ り ません。 た と えば、 顧客名やジ ョ ブ名を用いて
その環境を識別で き ます。
> カ プ セル化 ヒ ン ト :RIP 内の XObject キ ャ ッ シ ン グ アルゴ リ ズ ムは、XObject の、その呼
び出 し コ ン テ キ ス ト と 、 その同一ページ (ま たは他のページ群。 た と えば複数のペー
ジ を同一シー ト 上に重ね合わせ る 場合) 上の既存の印刷要素群 と の、 相互作用を考慮
に入れ る 必要があ り ます。 た と えば も し も 、 あ る XObject が色や線幅を指定 し てお ら
ず、 それが参照 さ れ る 時点において有効な色 と 線幅に基づいてその体裁が変わ る な ら
ば、 レ ン ダ リ ン グ結果を キ ャ ッ シ ュ し て も 、 こ の変わ る 体裁のせいで効果的ではあ り
ません。 も し も その XObject が透過要素を含んでお り 、 その既存の背景を その XObject
と ブ レ ン ド し なければな ら ない状態の場合に も 、 同様の状況が起 こ り ます。 RIP 内にお
け る XObject のキ ャ ッ シ ン グ を支援す る ために、 PDF/VT はカプセル化 XObject と い
う 概念を導入 し てお り 、 それがそ う であ る こ と を標識で き る よ う に し てい ます (GTS_
Encapsulated キーを用いて)。 カプセル化 XObject は、 RIP 内におけ る キ ャ ッ シ ン グ を
支援す る 特定の諸規則を満たす必要があ り ます。

こ れ ら のエン ト リ ーはすべてオプシ ョ ナルです : PDF/VT は、 反復する グ ラ フ ィ カル内容


の最適化をいずれ も 必須 と し てい ませんが、 それ ら を利用すれば、 PDF/VT 対応 RIP を用
いた と き に目ざ ま し い印刷パフ ォーマ ン ス向上が実現 し ます。

368 第 12 章 : PDF のバージ ョ ン と 規格


12.4.3 PDF/VT-1 を生成す る ための規則の要約
ク ッ ク ブ ッ ク PDF/VT-1 を生成する ための コ ー ド サン プルが、 PDFlib ク ッ ク ブ ッ クの pdfvt カ テ ゴ リ ー内
にあ り ます。

PDFlib を使っ て PDF/VT-1 を作成す る こ と は、 以下の手段で実現で き ます :


> PDF/VTはPDF/Xに基づいてい ますので、基礎を なすPDF/X準拠レベルのためのすべて
の要件を満たす必要があ り ます。 pdfvt ・ pdfx 文書オプシ ョ ンで、 然 るべ き値を用い る
必要があ り ます。
> 文書部分群を指定す る 必要があ り ます。 DPart API を用い ます。 その文書部分 ヒ エ ラ ル
キー内の各 ノ ー ド が、 オプシ ョ ナルに DPM メ タ デー タ を伴 う こ と も で き ます。 その
DPart ツ リ ー内の レ コ ー ド レベルを指定す る こ と も で き ます。
> 反復す る グ ラ フ ィ カル内容のための ス コ ープ ヒ ン ト を与え る べ き です。
> その文書が透過を含む場合には、カプセル化 XObject のための諸条件を満たすために追
加の努力を払 う べ き です。
> 既存の PDF 文書か ら ページ を取 り 込む際には、追加の諸規則が適用 さ れます(374 ペー
ジ 「12.4.7 PDF/X ・ PDF/VT 文書を PDI で取 り 込む」 参照)。

表 12.24 に、 359 ページ 「12.3.2 一般的要件」 で挙げた、 その対応する PDF/X の要件に加


え て、 PDF/VT 準拠出力を生成す る ための必須操作 と オプシ ョ ナルな操作を要約 し ます。
特定の諸側面については、 以下に続 く 各項で詳 し く 説明 し ます。

表 12.24 PDF/VT 準拠のための必須操作 と オプ シ ョ ナルな操作


項目 PDF/VT 準拠のための PDFlib の要件

準拠レ ベル PDF_begin_document( ) の pdfvt オプ シ ョ ン を、 必要な PDF/VT 準拠レ ベルに設定する必要


があ り ます。 例 : pdfvt=PDF/VT-1
PDF/VT-1 : オプ シ ョ ン pdfx=PDF/X-4 が自動的に設定 さ れます。 pdfx オプ シ ョ ン に対 し て
他の値を与え る こ と はエ ラ ーです。
文書部分 文書部分 ヒ エ ラルキーを指定する必要があ り ます。 こ れは以下の操作を必要 と し ます :
ヒ エ ラルキー > PDF_begin_document( ) : nodenamelist オプ シ ョ ンが、 DPart ツ リ ーのすべてのレ ベルのた
めの名前を指定する必要があ り ます。 recordlevel オプ シ ョ ン を用いて、 受領者レ コ ー ド
群に対応する DPart ツ リ ーのレ ベルを指定する こ と も で き ます。
> PDF_begin_dpart( ) ・ PDF_end_dpart( ) : 文書部分 ヒ エ ラ ルキーを構築する必要があ り ます。
> 文書部分群が、 オプ シ ョ ナルに文書部分 メ タ デー タ (DPM) を伴 う こ と も で き ます。
DPM を生成するには、 POCA イ ン タ ー フ ェ イ ス を用いて DPM 辞書を構築 し ます。

反復するグ ラ フ ィ PDF_load_image( ) ・ PDF_open_pdi_page( ) ・ PDF_begin_template_ext( )、 および PDF_load_


カル内容のための graphics( ) の templateoptions オプ シ ョ ン : pdfvt オプ シ ョ ンに scope サブオプ シ ョ ン を、
ス コ ープ ヒ ン ト 値 unknown ・ singleuse ・ record ・ file ・ stream ・ global の う ちの 1 つ と と も に与え る こ と
によ っ て、 反復する画像 ・ テ ン プ レー ト ・ 取 り 込み PDF ページのための用途 ヒ ン ト を与え
る必要があ り ます。
scope=stream と scope=global に対 し ては、 サブオプ シ ョ ン environment が PDF/VT 環境
コ ン テキス ト を指定する必要があ り ます。 こ れはすなわち、 PDF/VT 準拠の リ ーダーが、
関連する XObject 群を管理する ための管理イ ン タ ー フ ェ イ ス を提供する ために使え る識別
子です。 た と えば顧客名やジ ョ ブ名を用いてその環境を識別で き ます。

12.4 PDF/VT に よ る可変 ・ ト ラ ンザク シ ョ ン印刷 369


表 12.24 PDF/VT 準拠のための必須操作 と オプ シ ョ ナルな操作
項目 PDF/VT 準拠のための PDFlib の要件

カ プ セル化XObject PDF_begin_document( ) : その文書が透過要素を一切含んでいない場合には、 オプ シ ョ ン


usestransparency=false を与え る こ と に よ っ て、 透過グループ を持たないすべてのフ ォ ー
ム XObject を PDFlib がカ プ セル化で き る よ う にするべき です。
PDF_load_image( ) : 画像は、 XObject がカ プ セル化 さ れている と 標識 さ れる こ と を可能にす
る ために、 renderingintent か mask オプ シ ョ ン を用いるべき です。 (373 ページ 「12.4.6 カ
プ セル化 XObject」 を参照)。

PDF/VT ・ PDF/A 両立文書を作成 PDF/VT 印刷文書であ り なが ら 、 同時にアーカ イ ビ ン


グのための PDF/A に も 準拠 し てい る 文書を作成す る と 、有用な こ と も あ る で し ょ う (PDF/
A に関する 詳 し い情報は 346 ページ 「12.2 PDF/A に よ る アーカ イ ビ ン グ」 を参照 し て く
だ さ い)。 こ の よ う な二重用途の文書を作成する 際には以下に留意 し て く だ さ い :
> 以下の文書オプシ ョ ン を用いれば、 PDF/VT ・ PDF/A 両立文書を作成で き ます :
ret = p.begin_document("combo.pdf", "pdfx=PDF/X-4 pdfvt=PDF/VT-1 pdfa=PDF/A-2b");

> こ のマニ ュ アル内で PDF/VT と PDF/A に対 し て述べた制約に従 う 必要があ り 、かつ、両


方の規格で許容 さ れてい る 機能だけ を使え ます。
> 取 り 込まれ る PDF 文書が、受け付け可能であ る ためには、PDF/X 規格 と PDF/A 規格の
両方を遵守 し てい る 必要があ り ます。

12.4.4 文書部分 ヒ エ ラ ルキー と 文書部分 メ タ デー タ (DPM)


ク ッ ク ブ ッ ク 文書部分 ヒ エ ラルキーを持っ た PDF/VT を作成する ための コ ー ド サン プルが、 PDFlib ク ッ
ク ブ ッ ク の pdfvt カ テ ゴ リ ーにあ り ます。

文書部分 ヒ エ ラ ルキー を作成 文書内のすべてのページ を、 文書部分 ヒ エ ラ ルキー内に


組織化す る 必要があ り ます。 イ ン ボ イ ス な ど シ ンプルな場合においては、 こ の ツ リ ー構造
は、 root レベル と recipient レベルの 2 つの レベルか ら 成 り ます。 こ の文書内のページ群
は、 受領者レ コ ー ド 群の線形配列を構成 し てい ます。 こ こ で各レ コ ー ド は 1 個ない し 複数
のページ を内容 と し てい ます。 こ の文書部分 ヒ エ ラ ルキーの構造を、 文書オプシ ョ ン リ ス
ト で指定す る 必要があ り ます。 例 :
if (p.begin_document(outfile,
"pdfvt=PDF/VT-1 nodenamelist={root recipient} recordlevel=1") == -1)

も っ と 複雑な文書は、 も っ と 深い文書 ヒ エ ラ ルキーを必要 と す る か も し れません。 た と え


ば、 カ ス タ マ イ ズ さ れ た 小冊子が、 前付 ・ 本文 ・ 後付部か ら 成 る 場合 です。 こ れ ら は
docpart レベル内で保持 さ れます :
if (p.begin_document(outfile,
"pdfvt=PDF/VT-1 nodenamelist={root recipient docpart} recordlevel=1") == -1)

こ の recordlevel オ プ シ ョ ン は、 そ の 受領 者 か レ コ ー ド レ ベル を 発見 で き る 場所 の、
nodenamelist 内でのゼ ロ ベース の番号を指定 し ます。こ れは scope=record オプシ ョ ンに対
し て意味を持ち ます。
ヒ エ ラ ルキーの構造 を 定義 し た後は、 ページ群 を 文書 ヒ エ ラ ルキー ノ ー ド 群内で グ
ループ化す る 必要があ り ます。 こ れを達成する には PDF_begin/end_dpart( ) を用い ます :

370 第 12 章 : PDF のバージ ョ ン と 規格


/* DPartヒエラルキーのルートノードを作成 */
p.begin_dpart("");
p.begin_dpart(""); /* 受領者レベルに新規ノードを作成 */
p.begin_page_ext(...); /* 1個ないし複数のページを作成 */
...
p.end_page_ext(...);
p.end_dpart(""); /* 受領者ノードを閉じる */

p.begin_dpart(""); /* 受領者レベルに次のノードを作成 */
p.begin_page_ext(...); /* 1個ないし複数のページを作成 */
...
p.end_page_ext(...);
p.end_dpart(""); /* 受領者ノードを閉じる */
/* ルートノードを閉じる */
p.end_dpart("");

こ の PDF_begin/end_dpart( ) への呼び出 し 群が、 nodenamelist オプシ ョ ンに従っ た ツ リ ー


構造を作成す る 必要があ り ます。 すなわち、 その最大ネ ス ト レベルが、 こ の nodenamelist
配列内のエン ト リ ーの数に対応す る 必要があ り ます。
PDF_begin_document( ) の groups オプシ ョ ン と 、 PDF_begin/end_page_ext( ) の group ・
pagenumber オプ シ ョ ン は、 PDF/VT モー ド では許容 さ れ ま せん。 なぜな ら 、 こ れ ら は
DPart 構造を阻害す る か ら です。

文書部分 メ タ デー タ (DPM) を作成 文書部分 ヒ エ ラ ルキー内の各 ノ ー ド に対 し て、1 つ


の葉 ノ ー ド に対応す る ページ群に、 ま たは こ の ノ ー ド 配下の下位ツ リ ー全体に適用 さ れ る
メ タ デー タ 情報を指定で き ます。 PDF/VT は特定の種類の メ タ デー タ を何 ら 規定 し てい ま
せんが、 こ れは CIP4 機構に よ っ て発行 さ れた JDF 規格 と と も に用い ら れ る こ と を意図 し
てい ます。
こ の CIP4 メ タ デー タ 形式は、 代表的な PDF デー タ 型を活用 し てお り 、 その メ タ デー
タ は、 PDF/VT 規格で仕様化 さ れてい る 形で PDF 出力へ書き 出 さ れます。
PDFlib ユーザーは、 POCA (PDF Object Creation API = PDF オブジ ェ ク ト 作成 API) イ
ン タ ーフ ェ イ ス を使っ て、 PDF 辞書 ・ 配列やその他のデー タ 型か ら 成 る 任意のデー タ 構造
を作成す る こ と も で き ます。 DPM メ タ デー タ に対す る 最上位レベル辞書を、 PDF_begin/
end_dpart( ) の dpm オプシ ョ ンへ渡す こ と がで き ます :
dpm = p.poca_new("type=dict usage=dpm");
cip4_root = p.poca_new("type=dict usage=dpm");
cip4_metadata = p.poca_new("type=dict usage=dpm");

p.poca_insert(dpm, "type=dict key=CIP4_Root value=" + cip4_root);


p.poca_insert(cip4_root, "type=dict key=CIP4_Metadata value=" + cip4_metadata);
p.poca_insert(cip4_metadata, "type=string key=CIP4_Conformance value=base");
p.poca_insert(cip4_metadata, "type=string key=CIP4_Creator value=starter_pdfvt1");
p.poca_insert(cip4_metadata, "type=string key=CIP4_JobID value={Kraxi Systems invoice}");

/* DPartヒエラルキー内にノードを作成してDPMメタデータを追加 */
p.begin_dpart("dpm=" + dpm);

p.poca_delete(dpm, "recursive=true");

ク ッ ク ブ ッ ク PDFlib pCOS ク ッ ク ブ ッ ク に、 PDF/VT 文書から DPM を取得 し て、 その対応する XML 表現


を作成する ための コ ー ド サン プルがあ り ます。

12.4 PDF/VT に よ る可変 ・ ト ラ ンザク シ ョ ン印刷 371


12.4.5 反復す る グ ラ フ ィ カ ル内容のためのス コ ープ ヒ ン ト
ス コ ープ ヒ ン ト pdfvt オプシ ョ ンの scope サブオプシ ョ ン を、然 る べ き 値 と と も に、PDF_
load_image( ) ・ PDF_load_graphics( ) ・ PDF_open_pdi_page( ) ・ PDF_begin_template_ext( ) に
与え る べき です。 こ れを達成す る には、 カ レ ン ト PDF 文書内で、 ま たは (な る べ く は) 複
数文書にわた っ て、 画像 ・ ページ ・ テ ンプ レー ト が再利用 さ れ る 場所 と 回数を ク ラ イ ア ン
ト アプ リ ケーシ ョ ンが知 る 必要があ り ます。 こ の scope オプシ ョ ンは必須ではあ り ません
が、 こ れは強 く 推奨 さ れます。 なぜな ら こ れは、 RIP のための重要な最適化情報を提供す
る か ら です。 その よ う な情報が得 ら れない場合には、 間違っ てい る おそれのあ る 値を与え
る よ り も 、 こ の scope オプシ ョ ン を省略す る か、 値 unknown と と も に指定する べき です。
ス コ ープ singleuse ・ record ・ file に対 し ては、 PDFlib は、 その ス コ ープ値がその XObject
の実際の使用 と 整合 し てい る か ど う か をチ ェ ッ ク し て、 も し も その ス コ ープが大き すぎ る
と き は、 ロ グ フ ァ イ ル内にた と えば以下の よ う な警告を出力 し ます :
XObject with handle 9 was assigned PDF/VT scope 'record', but was used only once
(use 'scope=singleuse' instead)

こ の よ う な警告を得た と き には、 も っ と 然 る べ き ス コ ープ値を、 その対応す る 画像かグ ラ


フ ィ ッ ク か取 り 込み PDF ページかテ ンプ レー ト に割 り 当て る こ と に よ っ て、RIP 内の不必
要な キ ャ ッ シ ン グ を回避 し 、ひいては印刷パフ ォーマ ン ス を向上 さ せる こ と がで き る か ど
う か をチ ェ ッ ク す る べ き です。
あ る XObject への参照が少なすぎ る 場合 (その scope オプシ ョ ン と 比較 し て) には、 ク
ラ イ ア ン ト コ ー ド に改善の余地があ り う る こ と を示唆する 警告が発生する だけですが、あ
る XObject への参照が多すぎ る 場合にはエ ラ ーにな り ます。なぜな ら こ れは PDF/VT 規格
に違反す る か ら です。 よ り 具体的には、 以下の状況で例外が発生 し ます :
> オプシ ョ ン scope=singleuse が与え ら れてお り 、かつ、その XObject がその文書内で複数
回使用 さ れてい る 。
> オプシ ョ ン scope=record が与え ら れてお り 、かつ、その XObject が複数の受領者レ コ ー
ド 内で使用 さ れてい る 。

scope=stream と scope=global に対 し ては、 environment サブオプシ ョ ン を与え る 必要があ


り ます。 こ れは、 キ ャ ッ シ ュ さ れたオブジ ェ ク ト を複数の文書にわた っ て識別する ために
用い ら れ る 、 然 る べ き 文字列を内容 と す る べ き です。 ワー ク フ ロ ーに応 じ て、 顧客参照や
ジ ョ ブ参照を こ のオプシ ョ ンのために使 う と よ いで し ょ う 。 た と えば、 複数の印刷ジ ョ ブ
にわた っ て頻繁に柄笑え る 企業 ロ ゴ を、 こ の方法で識別する と よ いで し ょ う 。

一意な ID PDFlib は、 すべての取 り 込まれた PDF ページ ・ 画像 ・ グ ラ フ ィ ッ ク に対 し て、


一意な ID を自動的に割 り 当て ます (グ ラ フ ィ ッ ク に対 し ては、 templateoptions オプシ ョ
ン を与え る 必要があ り ます)。 等価な画像 ・ ページ ・ グ ラ フ ィ ッ ク 群に等 し い ID 値が割 り
当て ら れ る こ と に よ り 、 RIP 内での効果的な キ ャ ッ シ ン グ を可能に し てい ま す。 テ ン プ
レー ト に対 し ては、 一意な ID を、 pdfvt オプシ ョ ンの xid サブオプシ ョ ン を通 じ てユー
ザーが与え る べ き です。 テ ン プ レー ト に対す る 識別子は、 PDF/VT に従っ て等価な PDF
フ ォーム XObject を作成す る テ ンプ レー ト 定義群 (すなわち、 同一の視覚的出力を持つテ
ンプ レー ト ) に対 し て等 し く す る べ き です。 等価でないテ ンプ レー ト は、 異な る 識別子を
持つか、 識別子を全 く 持たない よ う にす る 必要があ り ます。
アプ リ ケーシ ョ ンが、 PDFlib に よ っ て作成 さ れた一意な ID 文字列を必要 と する 場合、
こ れを取得す る には、 画像 と テ ンプ レー ト に対 し ては PDF_info_image( ) の、 グ ラ フ ィ ッ
ク に対 し ては PDF_info_graphics( ) の、 取 り 込まれた PDF ページに対 し ては PDF_info_pdi_
page( ) の、 xid オプシ ョ ン を用い ます。

372 第 12 章 : PDF のバージ ョ ン と 規格


12.4.6 カ プ セル化 XObject
XObject を カプセル化す る と 、 リ ッ ピ ン グのパフ ォーマ ン ス が大いに向上 し ます。 ただ し
XObject を カプセル化で き る のは、 完全に不透明な文書内か、 (透過が使われてい る 文書
内では) 特定の要件が満た さ れた場合のみです。

文書内の透過 その文書内で透過が使われ る か ど う かを PDFlib はあ ら か じ め知 り ません


ので、 ヒ ン ト と し て PDF_begin_document( ) に usestransparency オプシ ョ ン を与え る こ と
も で き ます。 ク ラ イ ア ン ト が こ のオプシ ョ ン を用いて、 透過が一切使われていない と 宣明
し た場合には、 すべての XObject を カプセル化で き ます。 その文書内で透過が使われてい
る 場合には、 その XObject 群がカプセル化 さ れ る よ う にす る には、 ク ラ イ ア ン ト は特定の
諸規則に従 う 必要があ り ます。 usestransparency=false が与え ら れたに も かかわ ら ず、 その
文書が透過要素を含んでいた場合には、 PDFlib は例外を発生 さ せます。
以下の条件の う ちの 1 つない し 複数が真であれば、 その生成文書内で透過が使われて
い る と 見な さ れます :
> PDF_load_image( ) か PDF_fill_imageblock( ) が、以下のいずれかのオプシ ョ ン と と も に呼
び出 さ れてい る :
> その画像がアルフ ァ チ ャ ン ネルを含んでお り 、 かつ ignoremask オプシ ョ ンが false。
> ピ ク セルあ た り ビ ッ ト 数が複数であ る 画像のハン ド ルを持っ た masked オプシ ョ ン。
> PDF_load_graphics( ) を用いて取 り 込まれた グ ラ フ ィ ッ ク が、 何 ら かの透過要素を含ん
でい る 。
> PDF_create_gstate( ) が、 以下のいずれかのオプシ ョ ン と と も に呼び出 さ れてい る :
> オプシ ョ ン リ ス ト を持っ た (すなわち、 キー ワー ド none を持っ てい る のではない)
softmask オプシ ョ ン。
> 値 1 以外を持っ たオプシ ョ ン opacityfill か opacitystroke のいずれか 1 つ。
> 値 None ・ Normal 以外を持っ た blendmode オプシ ョ ン。
> PDF_open_pdi_page( )かPDF_fill_pdfblock( ) を用いて取 り 込まれた PDFページが、何 ら か
の透過要素を含んでい る 。 取 り 込まれた PDF ページ内の透過を識別する には、 pCOS
イ ン タ ー フ ェ イ ス と usespagetransparency 擬似オブ ジ ェ ク ト を 用い ま す (詳 し く は
pCOS パ ス リ フ ァ レ ン ス を参照 し て く だ さ い)。

XObject を カ プ セル化 PDFlib は、多 く の XObject を以下の規則に従っ て カプセル化 し ま


す:
> PDF_load_image( ) か PDF_fill_imageblock( ) を用いて作成 さ れ る 画像 XObject は、以下の
条件のいずれかが真であれば、 カプセル化 さ れます :
> PDF_load_image( ) の renderingintent オプシ ョ ンが値 Auto 以外 と と も に与え ら れてい
る。
> PDF_load_image( ) の mask オプシ ョ ンが値 true と と も に与え ら れてい る 。
> PDF_begin_template_ext( ) を用いて作成 さ れ る フ ォーム XObject は、 も し も 文書オプ
シ ョ ン usestransparency=false が与え ら れてい る か、transparencygroup オプシ ョ ンがサ
ブオプシ ョ ン colorspace と isolated=true と と も に与え ら れてい る 場合には、 カプセル
化 さ れます。
> PDF_load_graphics( ) か PDF_load_image( ) で templateoptions オプシ ョ ン を付けて生成 さ
れた フ ォーム XObject はつねにカプセル化 さ れます。文書オプシ ョ ン usestransparency=
trueが与え ら れてい る 場合には、然 る べ き 色空間を持っ た透過グループがその フ ォーム
XObject に紐付け ら れます。 そ う でない場合にはグループは一切生成 さ れません。

12.4 PDF/VT に よ る可変 ・ ト ラ ンザク シ ョ ン印刷 373


> PDF_open_pdi_page( ) を用いて生成 さ れた フ ォーム XObject は、その取 り 込み PDF ペー
ジが レ イ ヤーを一切含んでいないか、 ま たは PDF_open_pdi_document( ) が uselayers=
false と と も に呼び出 さ れ て い る 場合に は、 カ プ セ ル化 さ れ ま す。 文書オ プ シ ョ ン
usestransparency= true が与え ら れて い る 場合には、 然 る べ き 色空間 を 持 っ た透過グ
ループがその フ ォーム XObject に紐付け ら れます。 そ う でない場合にはグループは一
切生成 さ れません。 取 り 込むページが、 すでにカプセル化 さ れてい る XObject を含ん
でい る 場合には、 そのページ を取 り 込む際に、 こ のプ ロ パテ ィ は変更 さ れずに温存 さ
れます。

XObject を カプセル化で き ない と き は、 警告が ロ グ フ ァ イ ルへ書 き 出 さ れます。

カ プ セル化 XObject に対す る ス コ ープ PDF_load_image( ) ・ PDF_fill_imageblock( ) ・ PDF_


load_graphics( )・PDF_begin_template_ext( ) を用いて作成する すべてのカプセル化 XObject
に対 し て、pdfvt オプシ ョ ンの scope サブオプシ ョ ン を与え る こ と を推奨 し ます。こ の scope
サブオプシ ョ ンは、 非カプセル化 XObject に対 し て与え る こ と も 許容 さ れてい ますので、
も し も 画像か グ ラ フ ィ ッ ク か取 り 込 ま れ る ページかテ ン プ レ ー ト の継続期間がわか っ て
い る な ら ば、 その生成 さ れ る XObject のカプセル化ス テー タ ス にかかわ ら ず、 すべての関
連す る API 呼び出 し に こ れを与え る こ と も で き ます。

12.4.7 PDF/X ・ PDF/VT 文書を PDI で取 り 込む


既存の PDF 文書か ら のページ を PDF/VT 準拠の出力文書内へ取 り 込 も う と す る 際には、
特別な諸規則が適用 さ れます (PDI について詳 し く は 211 ページ 「8.3 PDF ページ を PDI
で取 り 込む」 を参照 し て く だ さ い)。すべての取 り 込まれ る 文書は、PDF/X-3/4/4p か PDF/
VT-1 に準拠 し てい る 必要があ り ます。 も し も PDF/VT 準拠が PDFlib 内で構成 さ れてお
り 、 かつ取 り 込まれ る 文書がその互換 PDF/X レベルを遵守 し てい る な ら ば、 その生成出
力が、 その選択 さ れた PDF/VT 準拠レベルに準拠す る こ と が保証 さ れます。 取 り 込まれ る
文書は、 受け付け可能な PDF/X レベルの う ちの 1 つを遵守 し ていない場合には、 拒絶 さ
れます。

PDF/VT 取 り 込みでの DPart と DPM の制約 PDF/VT 文書を取 り 込む際には、 以下の制


約に留意 し て く だ さ い : 文書部分 ヒ エ ラ ルキー (DPart) と 文書部分 メ タ デー タ (DPM)
は取 り 込まれません。 それ ら を、 pCOS を用いて ク エ リ ー し て、 PDF_begin/end_dpart( ) と
POCA 関数群を用いて再構築す る こ と が可能です。

374 第 12 章 : PDF のバージ ョ ン と 規格


13 PPS と PDFlib Block Plugin
PDFlib Personalization Server (PPS) は、 可変デー タ を 処理す る 、 テ ン プ レ ー ト を 用い る
PDF ワー ク フ ロ ーをサポー ト す る も のです。 ブ ロ ッ ク と い う 概念を用い、 外部の情報源か
ら 取得 し た、 任意の量の、 1 行ない し 複数行のテ キ ス ト 、 ま たは画像 ・ PDF ページ ・ ベ ク
ト ルグ ラ フ ィ ッ ク を、取 り 込んだページに入れ込む こ と がで き ます。こ れを利用 し て、PDF
文書のカ ス タ マ イ ズ を要す る アプ リ ケーシ ョ ン を容易に実装が可能です。 た と えば :
> メ ールを連結
> ダ イ レ ク ト メ ールの宛名印刷
> 納品書 ・ 明細な ど を発行
> 名刺の項目内容を各人ご と に変更

ブ ロ ッ ク は、 PDFlib Block Plugin を 使 っ て対話的に作成 ・ 編集 も で き ま す し 、 フ ォ ー ム


フ ィ ール ド 変換プ ラ グ イ ン を使っ て既存の PDF フ ォーム フ ィ ール ド を PDFlib ブ ロ ッ ク に
変換 も で き ます。 PPS を使っ てブ ロ ッ ク に流 し 込みがで き ます。 Block Plugin は内蔵版 PPS
を含んでい ますので、PPS でブ ロ ッ ク に流 し 込んだ結果を Acrobat でプ レ ビ ュ ーで き ます。

注 ブ ロ ッ ク 処理を利用するには PDFlib Personalization Server (PPS) が必要です。 PPS はすべ


ての PDFlib 商用パ ッ ケージに含まれていますが、PPS に対する ラ イ セ ン スキーを ご購入い
ただ く 必要があ り 、 PDFlib や PDFlib+PDI のラ イ セ ン スキーだけではご利用になれません。
PDF テ ン プ レー ト に対話的にブ ロ ッ ク を作成する には Adobe Acrobat 用 PDFlib Block Plugin
が必要 と な り ます。

ク ッ ク ブ ッ ク 可変デー タ と ブ ロ ッ ク に関する コ ー ド サン プルがPDFlib ク ッ ク ブ ッ ク のblocks カ テ ゴ リ ー


にあ り ます。

13.1 PDFlib Block Plugin を イ ン ス ト ール


Block Plugin が動作す る Acrobat のバージ ョ ンは以下の と お り です (Adobe Reader では動
作 し ません) :
> Windows : Acrobat 8/9/X/XI
> Windows : Acrobat Standard ・ Pro 2017/2020
> Windows : Acrobat Pro DC (32 ビ ッ ト ・ 64 ビ ッ ト )
> macOS : Acrobat Standard ・ Pro 2017/2020 (Intel)
> macOS : Acrobat DC (Intel ・ M1 用ユニバーサルバ イ ナ リ ー)

Windows 版 Acrobat DC には 32 ビ ッ ト 版 と 64 ビ ッ ト 版があ り ますので、 イ ン ス ト ー ラ ー


が 2 種類あ り ます。 イ ン ス ト ール さ れてい る Acrobat のバージ ョ ンに合致 し てい る イ ン ス
ト ー ラ ーを使 う こ と が重要です。

Windows で PDFlib Block Plugin を イ ン ス ト ール PDFlib Block Plugin と PDF フ ォ ーム


フ ィ ール ド 変換プ ラ グ イ ン を Acrobat に イ ン ス ト ールす る には、 プ ラ グ イ ンの フ ァ イ ルを
Acrobat のプ ラ グ イ ン フ ォ ルダーのサブデ ィ レ ク ト リ ーに入れ る 必要があ り ます。 プ ラ グ
イ ンの イ ン ス ト ー ラ ーは こ れを自動的に実行 し ますが、 手作業 も 可能です。 プ ラ グ イ ンの
フ ァ イ ル名は Block.api と AcroFormConversion.api です。
64 ビ ッ ト Windows 上の 32 ビ ッ ト Acrobat の場合はプ ラ グ イ ン フ ォ ルダーはたいてい以
下の と お り です :

13.1 PDFlib Block Plugin を イ ン ス ト ール 375


C:\Program Files (x86)\Adobe\Acrobat DC\Acrobat\plug_ins\PDFlib Block Plugin

64 ビ ッ ト Acrobat の場合はプ ラ グ イ ン フ ォ ルダーはたいてい以下の と お り です :


C:\Program Files\Adobe\Acrobat DC\Acrobat\plug_ins\PDFlib Block Plugin

macOS で PDFlib Block Plugin を イ ン ス ト ール こ の プ ラ グ イ ン を すべ て の ユーザーの


ために イ ン ス ト ールす る には以下の操作を行い ます :
> デ ィ ス ク イ メ ージ を ダブル ク リ ッ ク す る こ と に よ っ てマ ウ ン ト 。 プ ラ グ イ ン フ ァ イ ル
群の入っ た フ ォ ルダーが現れます。
> こ のプ ラ グ イ ン フ ォ ルダーを、 シ ス テ ム の ラ イ ブ ラ リ ー フ ォ ルダー内の以下のパ スへ
複製 (Plug-ins フ ォ ルダーが ま だない場合には作成) :
/Library/Application Support/Adobe/Acrobat/XXX/Plug-ins

あ る いは以下の操作を行 う と 、 こ のプ ラ グ イ ン を単独のユーザーのためだけに イ ン ス ト ー
ルで き ます :
> デス ク ト ッ プ を ク リ ッ ク す る こ と に よ っ て Finder 内に確実にい る よ う に し てか ら 、
Option キーを押 し なが ら 「移動」 → 「ラ イ ブ ラ リ ー」 を選択する こ と に よ っ て、 その
ユーザーの ラ イ ブ ラ リ ーフ ォ ルダーを開 き ます。
> プ ラ グ イ ン フ ォ ルダーを、 そのユーザーの ラ イ ブ ラ リ ー フ ォ ルダーの中の以下のパ ス
へ複製 (Plug-ins フ ォ ルダーが ま だない場合には作成) :

/Users/<ユーザー名>/Library/Application Support/Adobe/Acrobat/XXX/Plug-ins

多言語 イ ン タ ー フ ェ イ ス PDFlib Block Plugin は、 ユーザー イ ン タ ーフ ェ イ ス内で複数言


語に対応 し てい ます。 Block Plugin は、 Acrobat のアプ リ ケーシ ョ ン言語に従っ て イ ン タ ー
フ ェ イ ス言語を自動的に選択 し ます。 目下、 日本語 ・ 英語 ・ ド イ ツ語の イ ン タ ーフ ェ イ ス
が利用可能です。 Acrobat が こ れ以外の言語モー ド で動作 し てい る 場合には、 Block Plugin
は英語 イ ン タ ーフ ェ イ ス を使用 し ます。

Windows 版 Acrobat DC のためのサン ド ボ ッ ク ス保護 Acrobat DC 2020 で は、 サ ン ド


ボ ッ ク ス保護 と い う 新たなセキ ュ リ テ ィ ーモデルが導入 さ れま し た。 こ れを有効にする に
は 「環境設定」 → 「セキ ュ リ テ ィ ー (拡張) 」 → 「起動時に保護モー ド を有効にする (プ
レ ビ ュ ー) 」 ・ 「保護 さ れた ビ ュ ー」 を選択 し ます。 こ れが有効にな っ てい る と 、 さ ま ざ ま
な操作が制限 さ れ、文書ウ ィ ン ド ウ の上端の黄色い帯にセキ ュ リ テ ィ ー メ ッ セージが表示
さ れます。 サン ド ボ ッ ク ス保護について詳 し く は :
helpx.adobe.com/acrobat/using/whats-new/2020-august.html
www.adobe.com/devnet-docs/acrobatetk/tools/AppSec/sandboxprotections.html

サン ド ボ ッ ク ス が有効にな っ てい る と 、 PDFlib Block Plugin のプ レ ビ ュ ー機能に影響があ


り ます。 保護ビ ュ ーはデフ ォ ル ト では、 Acrobat の AppData デ ィ レ ク ト リ ー と 、 temp デ ィ
レ ク ト リ ーな ど い く つかのデ ィ レ ク ト リ ーへのア ク セ ス は許 し ま すが、 任意のユーザー
デ ィ レ ク ト リ ーへのア ク セ ス は許 し ません。Block Pluginが読み書き で き る デ ィ レ ク ト リ ー
は、 保護ビ ュ ーのデフ ォ ル ト デ ィ レ ク ト リ ー リ ス ト に含まれてい る か、 以下の場所にあ る
ポ リ シーフ ァ イ ルの中で構成 (ホ ワ イ ト リ ス ト ) さ れてい る も のに限 ら れ ま す (Acrobat
の 32 ビ ッ ト 版の場合 と 64 ビ ッ ト 版の場合) :
C:\Program Files (x86)\Adobe\Acrobat DC\Acrobat\PDFlibBlockCustomPolicies.txt
C:\Program Files\Adobe\Acrobat DC\Acrobat\PDFlibBlockCustomPolicies.txt

376 第 13 章 : PPS と PDFlib Block Plugin


デフ ォ ル ト では こ のポ リ シーフ ァ イ ルは、以下のデ ィ レ ク ト リ ーへのア ク セ ス を許 し てい
ますが、 管理者は こ れにデ ィ レ ク ト リ ー名を追加する こ と も で き ます :
; Protected Path Section
FILES_ALLOW_ANY = C:\Users\<username>\*.*
FILES_ALLOW_ANY = C:\Users\Public\*.*

も し 保護モー ド か保護ビ ュ ーが有効に さ れていて、 かつ、 使用 さ れてい る デ ィ レ ク ト リ ー


がホ ワ イ ト リ ス ト さ れていない場合には、 Block Plugin の機能の う ち、 プ レ ビ ュ ーや、 ブ
ロ ッ ク の取 り 込み/書 き 出 し な どは、 失敗す る 可能性があ り ます。

ト ラ ブルシ ュ ーテ ィ ン グ PDFlib Block Plugin が動作 し ない よ う に見 ら れ る 場合には、 以


下を確認 し て く だ さ い :
> 「編集」 → 「環境設定」 (→ 「一般 ...」) → 「一般」 で 「承認 さ れたプ ラ グ イ ンのみを使
用」 チ ェ ッ ク ボ ッ ク ス がオ フ にな っ てい る こ と を確認 し て く だ さ い。 Acrobat が こ の承
認済みモー ド で動作 し てい る と 、 プ ラ グ イ ンは読み込まれません。
> Adobe Designer ま たは Adobe Experience Manager に よ っ て作成 さ れた PDF フ ォームは、
Block Plugin の適切な動作を妨げ る こ と があ り ます。 他の Acrobat のプ ラ グ イ ンの動作
について も 同様です。 なぜな ら こ う し た フ ォームは、 Acrobat の内部セキ ュ リ テ ィ ーモ
デル と 衝突す る か ら です。 ですので、 Designer の静的な PDF フ ォームは利用せずに、
動的な PDF フ ォームだけ を Block Plugin への入力 と し て用い る こ と を推奨 し ます。

13.1 PDFlib Block Plugin を イ ン ス ト ール 377


13.2 ブ ロ ッ ク の概念の概要
13.2.1 文書デザ イ ン と プ ロ グ ラ ム コ ー ド の分離
PDFlib のデー タ ブ ロ ッ ク を利用す る と 、 取 り 込んだページに、 可変のテ キ ス ト ・ 画像 ・
PDF ページ ・ ベ ク ト ルグ ラ フ ィ ッ ク を簡単に配置で き ます。 単純な PDF ページ と 違っ て、
デー タ ブ ロ ッ ク を含むページは、後でサーバーサ イ ド で行われ る べき 処理についての情報
を内部に持っ てい ます。 PDFlib ブ ロ ッ ク の概念は、 以下の 2 種類の作業を完全に分離する
も のです :
> デザ イ ナーはページ レ イ ア ウ ト を作成 し 、 可変なページ構成要素の位置を指定す る と
と も に、 その文字サ イ ズ ・ 色 ・ 画像拡縮 と い っ た関連特性 も 指定 し ます。 レ イ ア ウ ト
を PDF 文書 と し て作成 し 、 その後にデザ イ ナーが、 Acrobat 用 PDFlib Block Plugin を
使っ て、 可変デー タ ブ ロ ッ ク と そのそれぞれのプ ロ パテ ィ を指定 し ます。
> プ ロ グ ラ マーは、取 り 込まれ る PDF ページの PDFlib ブ ロ ッ ク に含まれ る 情報をデー タ
ベース の フ ィ ール ド な ど動的な情報 と 紐づけ る コ ー ド を書 き ます。プ ロ グ ラ マーは、ブ
ロ ッ ク の詳細 (内容が名前なのか ZIP コ ー ド なのか と か、 ページ上の具体的な位置や
書式) については何 も 知 る 必要がないので、 レ イ ア ウ ト が ど う 変更 さ れて も 影響 さ れ
ずにい ら れ ます。 ブ ロ ッ ク に関連す る 詳細についてはすべて、 フ ァ イ ル内のブ ロ ッ ク
プ ロ パテ ィ に基づいて PPS の側で処理 さ れます。

言いかえれば、 プ ロ グ ラ マーが書 く コ ー ド が 「デー タ 非依存」 にな り ます。 すなわち汎用


であ り 、 ブ ロ ッ ク のいかな る 特性に も 依存 し ないのです。 た と えば手紙の宛先を印字する
ブ ロ ッ ク があ っ た と し て、 か り にデザ イ ナーがそれをページ上で別の所へ動かそ う が、 文
字サ イ ズ を変え よ う が、 汎用で あ る ブ ロ ッ ク 処理 コ ー ド に変更を加え る 必要はあ り ま せ
ん。 デザ イ ナーが こ のブ ロ ッ ク に ラ ス ト ネーム でな く フ ァ ー ス ト ネーム を印字 し たい と
思っ た ら 、 ブ ロ ッ ク のプ ロ パテ ィ を Acrobat プ ラ グ イ ンで変更する だけで正 し い出力が生
成 さ れます。
中間ス テ ッ プ と し て、 ブ ロ ッ ク への流 し 込みは Acrobat でプ レ ビ ュ ーで き ますので、開
発 と テ ス ト のサ イ ク ルを高速化で き ます。 ブ ロ ッ ク のプ レ ビ ュ ーには、 ブ ロ ッ ク の定義で
指定 し てい る デフ ォ ル ト デー タ (文字列や画像フ ァ イ ル名) が用い ら れます。

13.2.2 ブ ロ ッ ク のプ ロパテ ィ
ブ ロ ッ ク の動作はブ ロ ッ ク のプ ロ パテ ィ で制御で き ます。 Block Plugin を使っ てブ ロ ッ ク
にプ ロ パテ ィ を割 り 当て ます。

定義済みブ ロ ッ ク プ ロパテ ィ ブ ロ ッ ク はページ上の長方形 と し て定義 さ れ、 名前や種


類、 その他自由なプ ロ パテ ィ を割 り 当て る こ と がで き ます。 こ れ ら プ ロ パテ ィ は後で PPS
に よ っ て処理 さ れ ま す。 名前は、 ブ ロ ッ ク を 識別す る 任意の文字列で あ り 、 た と え ば
firstname ・ lastname ・ zipcode の よ う に名づけ る こ と がで き ます。 PPS では、 さ ま ざ ま な
種類のブ ロ ッ ク を使 う こ と がで き ます :
> テキス ト 行ブ ロ ッ ク は、 1 行のテ キ ス ト デー タ を持ち ます。 こ のデー タ は、 PPS のテ キ
ス ト 行 メ ソ ッ ド で処理 さ れます。
> テキス ト フ ローブ ロ ッ ク は、1 行ない し 複数行のテ キ ス ト デー タ を持ち ます。複数行の
テ キ ス ト は、 PPS のテ キ ス ト フ ロ ーフ ォーマ ッ タ ーに よ っ て組版 さ れます。 複数のテ
キ ス ト フ ロ ーブ ロ ッ ク を連結 し て、 前のブ ロ ッ ク か ら あふれた テ キ ス ト を次のブ ロ ッ
ク に入れ る こ と も 可能です (399 ページ 「 テ キ ス ト フ ロ ーブ ロ ッ ク を連結」 参照)。
> 画像ブ ロ ッ ク は、ラ ス タ ー画像を持ち ます。DTPアプ リ ケーシ ョ ンでTIFFやJPEGのフ ァ
イ ルを貼 り 付け る の と 似てい ます。

378 第 13 章 : PPS と PDFlib Block Plugin


> PDF ブ ロ ッ ク は、他の PDF文書のページか ら 取 り 込んだ任意の PDF コ ン テ ン ツ を持ち ま
す。 こ れは、 DTP アプ リ ケーシ ョ ン で PDF ページ を貼 り 付け る の と 似てい ます。
> グ ラ フ ィ ッ ク ブ ロ ッ ク は、 ベ ク ト ルグ ラ フ ィ ッ ク を持ち ます。 こ れは、 レ イ ア ウ ト ア
プ リ ケーシ ョ ン で SVG フ ァ イ ルを貼 り 付け る のに似てい ます。

ブ ロ ッ ク は、 その種類に よ っ て異な る さ ま ざ ま な定義済みプ ロ パテ ィ を持っ てい ます。 プ


ロ パテ ィ は、 Block Plugin で作成 ・ 変更で き ます (384 ページ 「13.3.2 ブ ロ ッ ク プ ロ パテ ィ
を編集」 を参照)。 定義済みブ ロ ッ ク プ ロ パテ ィ の全一覧が 402 ページ 「13.7 ブ ロ ッ ク の
プ ロ パテ ィ 」 にあ り ます。 た と えばテ キ ス ト ブ ロ ッ ク な ら テ キ ス ト の フ ォ ン ト やサ イ ズ を
指定で き ます し 、 画像ブ ロ ッ ク や PDF ブ ロ ッ ク な ら 拡縮倍率や回転を指定で き ます。 PPS
は ブ ロ ッ ク の 種 類 ご と に、 そ れ を 処 理 す る 専 用 の 関数 を 提供 し て い ま す (PDF_fill_
textblock( ) な ど)。 こ れ ら 関数は、 取 り 込まれた PDF ページにおいてブ ロ ッ ク を名前で検
索 し 、 そのプ ロ パテ ィ を分析 し て、 ク ラ イ ア ン ト の与え たデー タ (1 行テ キ ス ト ・ 複数行
テ キ ス ト ・ ラ ス タ ー画像 ・ PDF ページ ・ ベ ク ト ルグ ラ フ ィ ッ ク のいずれか) を、 新 し い
ページ上に、 指定 さ れたブ ロ ッ ク プ ロ パテ ィ に従っ て配置 し ます。 プ ロ グ ラ マーがブ ロ ッ
ク のプ ロ パテ ィ を オーバー ラ イ ド す る こ と も 可能です。そのためにはブ ロ ッ ク 流 し 込み関
数でそれに対応す る オプシ ョ ン を指定 し ます。

デ フ ォ ル ト 内容に関す る プ ロパテ ィ ブ ロ ッ ク のデ フ ォ ル ト 内容 を 持 た せ る 特殊 な ブ
ロ ッ ク プ ロ パテ ィ を指定す る こ と も 可能です。ブ ロ ッ ク 流 し 込み関数に可変デー タ が与え
ら れなかっ た と き や、ブ ロ ッ ク 内容が次回の印刷実行時には変わ る か も し れないが現時点
では固定な と き にそのブ ロ ッ ク に配置 さ れ る テ キ ス ト ・ 画像 ・ PDF ・ グ ラ フ ィ ッ ク 内容を
指定で き ます。
こ のデフ ォ ル ト プ ロ パテ ィ はBlock Pluginのプ レ ビ ュ ー機能で も 用い ら れます(392ペー
ジ 「13.5 ブ ロ ッ ク を Acrobat でプ レ ビ ュ ー」 参照)。

カ ス タ ムブ ロ ッ ク プ ロパテ ィ 定義済みのブ ロ ッ ク プ ロ パテ ィ を利用すれば可変デー タ


処理アプ リ ケーシ ョ ン を手軽に実装で き ますが、こ れ ら のプ ロ パテ ィ について PPS は内部
的に知っ ていて自動的に処理で き る わけですが、ブ ロ ッ ク に も っ と 高い柔軟性を与え る た
めにデザ イ ナーが カ ス タ ム のプ ロ パテ ィ を割 り 当て る こ と も 可能です。 カ ス タ ム プ ロ パ
テ ィ を利用 し てブ ロ ッ ク の概念を拡張す る こ と で、 よ り 高度な可変デー タ 処理アプ リ ケー
シ ョ ンの要請に応え ら れ る で し ょ う 。
カ ス タ ム プ ロ パテ ィ には何のルール も あ り ません。 PPS はカ ス タ ムプ ロ パテ ィ を何 ら
処理 し ないか ら です。 PPS は ク ラ イ ア ン ト がカ ス タ ムプ ロ パテ ィ を利用で き る よ う にす る
だけです。 ク ラ イ ア ン ト の コ ー ド で カ ス タ ム プ ロ パテ ィ を取得 し て よ し なに処理で き ま
す。 レ イ ア ウ ト やデー タ 抽出についてブ ロ ッ ク のカ ス タ ムプ ロ パテ ィ を見て決め る よ う な
アプ リ ケーシ ョ ンが可能です。科学的な アプ リ ケーシ ョ ンでは数値出力の桁数を指定す る
カ ス タ ムプ ロ パテ ィ を設けて も よ いで し ょ う し 、デー タ ベース の フ ィ ール ド 名を カ ス タ ム
ブ ロ ッ ク プ ロ パテ ィ に し てそ こ か ら ブ ロ ッ ク 用デー タ を取得 し て も よ いで し ょ う 。

13.2.3 なぜ PDF の フ ォ ーム フ ィ ール ド を使わないの


経験あ る Acrobat ユーザーな ら 疑問に思 う で し ょ う 。 なぜ我々は新たにブ ロ ッ ク と い う 概
念を導入 し たのか、 なぜ PDF にすでにあ る フ ォーム フ ィ ール ド の し く みを活用 し ないの
か と 。 根本的な違いは、 PDF の フ ォーム フ ィ ール ド は対話的に記入 さ れ る こ と を主眼 と し
て作 ら れてい る のに対 し て、PDFlib のブ ロ ッ ク は自動的に流 し 込まれ る こ と を目的 と し て
い る 点です。 対話的記入 と 自動流 し 込みを両方 と も 要す る アプ リ ケーシ ョ ンの場合には、
フ ォーム フ ィ ール ド 変換プ ラ グ イ ン を用いて PDF フ ォーム と PDFlib ブ ロ ッ ク を併用す る

13.2 ブ ロ ッ クの概念の概要 379


こ と も 可能です (389 ページ 「13.4 PDF フ ォーム フ ィ ール ド を PDFlib ブ ロ ッ ク に変換」 参
照)。
両者は似た点 も 多いですが、 PDFlib ブ ロ ッ ク には、 PDF フ ォーム フ ィ ール ド に比べて、
表 13.1 に示す利点があ り ます。

表 13.1 PDF フ ォ ーム フ ィ ール ド と PDFlib ブ ロ ッ ク の比較


機能 PDF フ ォ ーム フ ィ ール ド PDFlib ブ ロ ッ ク

設計の趣旨 対話的利用 自動流 し 込み

文字組版機能 ( フ ォ ン ト 指定 ・ 文 - カ ーニ ング ・ 単語間隔 ・ 文字間隔 ・ 下線 / 上線


字サイ ズ指定よ り も高度な) / 取り消し線

OpenType レ イ アウ ト 機能 - 何ダース もの OpenType レ イ アウ ト 機能 (合字 ・


スワ ッ シ ュ文字 ・ オール ド ス タ イル数字な ど)

複雑用字系への対応 制約あ り シ ェ ーピ ング ・ 双方向テキス ト (ア ラ ビ ア語 ・


デーヴ ァ ナーガ リ ーな ど)

フ ォ ン ト 制御 フ ォ ン ト 埋め込み フ ォ ン ト 埋め込み ・ サブ セ ッ ト 化 ・ エ ン コ ー
デ ィ ング

テキス ト 組版制御 左 ・ 中央 ・ 右揃え 左 ・ 中央 ・ 右 ・ 両端揃え。 各種組版アルゴ リ ズ


ム ・ 制御。 イ ン ラ イ ンオプ シ ョ ン を用いて テキ
ス ト の見映え を制御可能

テキス ト の途中で フ ォ ン ト な ど テ - ○
キス ト 属性を変更可能

書き込んだ内容が PDF のページ - ○


記述に取 り 込まれる

追加フ ィ ール ド の内容をユーザー ○ ×
が編集可能

プ ロパテ ィ の拡張セ ッ ト - ○ (カ ス タ ムブ ロ ッ ク プ ロパテ ィ )

画像フ ァ イルを流 し 込める - BMP ・ CCITT ・ GIF ・ PNG ・ JPEG ・ JBIG2 ・


JPEG 2000 ・ TIFF

ベ ク ト ルグ ラ フ ィ ッ ク を流 し 込め - SVG

カ ラ ー対応 RGB グ レースケール ・ RGB ・ CMYK ・ Lab ・ スポ ッ ト


カ ラ ー (HKS ・ Pantone スポ ッ ト カ ラ ーが Block
Plugin に内蔵) ・ DeviceN

PDF 各種規格 - PDF/A ・ PDF/X ・ PDF/VT ・ PDF/UA

流 し 込みの際にグ ラ フ ィ ッ ク やテ - ○
キス ト のプ ロパテ ィ を オーバー ラ
イ ド 可能

透過内容 - ○

テキス ト ブ ロ ッ ク を連結可能 - ○

380 第 13 章 : PPS と PDFlib Block Plugin


13.3 PDFlib Block Plugin で ブ ロ ッ ク を編集
13.3.1 ブ ロ ッ ク を作成
ブ ロ ッ ク ツ ールを ア ク テ ィ ブ にす る PDFlib ブ ロ ッ ク を作成する Block Plugin は、Acrobat
におけ る フ ォーム ツールに似てい ます。ブ ロ ッ ク ツールを ア ク テ ィ ブにす る と ページ上の
ブ ロ ッ ク が全部表示 さ れます。 Acrobat の他の ツールを選択す る と ブ ロ ッ ク は見え な く な
り ますが、 な く な っ たわけではあ り ません。 ブ ロ ッ ク ツールを ア ク テ ィ ブにす る には以下
の操作の ど ち ら かを行い ます :
> ブロ ッ ク アイ コン を ク リ ッ ク 。こ れは Acrobat DC で以下の場所にあ り ます:「ツー
ル」 → 「PDF を編集」 を ク リ ッ ク 。
> メ ニ ュ ー項目 「PDFlib ブ ロ ッ ク」 → 「PDFlib ブ ロ ッ ク ツール」。

ブ ロ ッ ク を作成 ・ 変更 ブ ロ ッ ク ツ ール を ア ク テ ィ ブ に し た ら 、 十字ポ イ ン タ ー を ド
ラ ッ グすれば、 ページ上の希望の位置に希望の大 き さ のブ ロ ッ ク を作れます。 ブ ロ ッ ク は
つねに長方形で、 かつ辺がページの辺 と 平行にな り ます (rotate プ ロ パテ ィ を用い る と ブ
ロ ッ ク の内容をページの辺に平行でな く す る こ と がで き ま す) 。 ブ ロ ッ ク の長方形を ド
ラ ッ グ し 終え る と 、 「PDFlib ブ ロ ッ ク プ ロパテ ィ 」 ダ イ ア ロ グが現れ、 ブ ロ ッ ク の各種プ
ロ パテ ィ を編集で き ます (384 ページ 「13.3.2 ブ ロ ッ ク プ ロ パテ ィ を編集」 参照)。 ブ ロ ッ
ク ツールはブ ロ ッ ク の名前を自動的に生成 し ますが、 こ の名前はプ ロ パテ ィ ダ イ ア ロ グで
変更可能です。 ブ ロ ッ ク 名はページ内では一意であ る 必要があ り ますが、 別のページで同
じ 名前を使 う のはか ま い ません。
ダ イ ア ロ グ の一番上で、 ブ ロ ッ ク の種類を 「Textline」 (テ キ ス ト 行) ・ 「Textflow」 (テ
キ ス ト フ ロ ー) ・ 「Image」 (画像) ・ 「PDF」 ・ 「Graphics」 (グ ラ フ ィ ッ ク ) か ら 選べます。 ブ
ロ ッ ク の種類ご と に色が変え て あ り ます (図 13.1 参照) 。 タ ブは、 その時選んでい る ブ
ロ ッ ク 種別の も のだけがア ク テ ィ ブにな り ます。 「PDFlib ブ ロ ッ ク プ ロパテ ィ 」 ダ イ ア ロ
グは、 ブ ロ ッ ク の種類に よ っ て、 プ ロ パテ ィ を グループやサブグループに ま と めて階層的
に表示 し ます。

注 PDF にブ ロ ッ ク を追加 し た後や、 既存のブ ロ ッ ク に変更を加えた後には、 Acrobat の 「名


前を付けて保存 ...」 コ マ ン ド を使 う ほ う が (「上書き保存」 よ り も) フ ァ イルサイ ズが小
さ く な り ます。

ブ ロ ッ ク を選択 コ ピー ・ 移動 ・ 削除 ・ プ ロ パテ ィ 編集な ど のブ ロ ッ ク 操作は、 選択 し た


1 個ない し 複数のブ ロ ッ ク に対 し て働 き ます。 ブ ロ ッ ク ツールを用いてブ ロ ッ ク を選択す
る には以下の と お り 操作 し ます :
> ブ ロ ッ ク 1 個を選択す る には単にそれを シ ン グル ク リ ッ ク 。
> 複数のブ ロ ッ ク を選択 し たい場合は、2 個目以降のブ ロ ッ ク を Shift キーを押 し なが ら 選
択。
> ページ上のすべてのブ ロ ッ ク を選択す る には、 Ctrl+A (Windows の場合) か Cmd+A
(macOS の場合) を押すか、 ま たは 「編集」 → 「すべて選択」。

コ ン テキス ト メ ニ ュ ー 1 個ない し 複数のブ ロ ッ ク を選択 し てい る 時に コ ン テ キ ス ト メ


ニ ュ ーを開 く と 、 ブ ロ ッ ク に関す る さ ま ざ ま な機能 (「PDFlib ブ ロ ッ ク」 メ ニ ュ ーか ら 利
用で き る 各種機能 と 同 じ ) を さ っ と 実行で き ます。 コ ン テ キ ス ト メ ニ ュ ーを開 く には、 選
択 し た 1 個ない し 複数のブ ロ ッ ク を、 Windows ではマ ウ ス の右ボ タ ンで ク リ ッ ク 、 macOS
では Ctrl+ ク リ ッ ク し ます。 た と えばブ ロ ッ ク を削除す る には、 ブ ロ ッ ク ツールで選択 し

13.3 PDFlib Block Plugin で ブ ロ ッ ク を編集 381


図 13.1
各種ブ ロ ッ ク
の視覚化

てか ら Delete キーを押 し て も いいのですが、 コ ン テ キ ス ト メ ニ ュ ーで 「編集」 → 「削除」


と い う 方法 も あ る のです。
ページ上でブ ロ ッ ク のない所を右 ク リ ッ ク (macOS では Ctrl+ ク リ ッ ク ) し た場合の
コ ン テ キ ス ト メ ニ ュ ーには、 ブ ロ ッ ク プ レ ビ ュ ーを作成す る 項目 と 、 ブ ロ ッ ク 機能を構成
す る 項目があ り ます。

ブ ロ ッ ク のサ イ ズ と 位置 ブ ロ ッ ク ツールを使っ て選択 し た 1 個ない し 複数のブ ロ ッ ク


を別の位置へ動かす こ と も で き ます。Shift キーを押 し なが ら ブ ロ ッ ク を ド ラ ッ グする と 真
横か縦へだけ動 き ま す。 ブ ロ ッ ク を き っ ち り 揃え る のに便利で し ょ う 。 ポ イ ン タ ーを ブ
ロ ッ ク の角付近へ持っ て行 く と 、 ポ イ ン タ ーが二重矢印に変わ り 、 ブ ロ ッ ク のサ イ ズ を変
え る こ と がで き ます。
複数のブ ロ ッ ク の位置やサ イ ズ を揃えたい と き は、複数のブ ロ ッ ク を選択 し て、「PDFlib
ブ ロ ッ ク 」 メ ニ ュ ーか コ ン テ キ ス ト メ ニ ュ ーか ら 「整列」 ・ 「中央揃え」 ・ 「均等配置」 ・ 「サ

382 第 13 章 : PPS と PDFlib Block Plugin


図 13.2
ブ ロ ッ ク プ ロパテ ィ ダ イ ア ログ

イ ズ」 コ マ ン ド を選択 し ます。 1 個ない し 複数のブ ロ ッ ク の位置を、 矢印キーを使っ て小


刻みに動かす こ と も で き ます。
あ る いは、 ブ ロ ッ ク の座標を数値でプ ロ パテ ィ ダ イ ア ロ グに入力す る と い う 方法 も あ
り ます。 こ の座標系の原点はページの左上隅です。 座標の表示は、 その時点で Acrobat で
選んでい る 単位に よ り ます :
> Acrobat DC で表示単位を変更す る には、 「編集」 → 「環境設定」 (→ 「一般 ...」) → 「単
位 と ガ イ ド 」 → 「ページ と 定規の単位」 で イ ンチ ・ セ ンチ メ ー ト ル ・ パ イ カ ・ ポ イ ン
ト ・ ミ リ のいずれか を選択。
> カー ソ ルの座標を表示す る には、 「表示」 → 「表示切 り 替え」 → 「カ ー ソル座標」。

た だ し こ こ で選んだ単位は、 Rect プ ロ パ テ ィ にのみ効力 を 持ち、 他の数値プ ロ パ テ ィ


(fontsize な ど) には効力を持ち ません。

グ リ ッ ド で ブ ロ ッ ク の位置合わせ Acrobat のグ リ ッ ド 機能を活用す る と 、 ブ ロ ッ ク の位


置合わせやサ イ ズ変更が正確にで き ます :
> グ リ ッ ド を表示 : 「表示」 → 「表示切 り 替え」 → 「定規 と グ リ ッ ド 」 → 「グ リ ッ ド 」。

13.3 PDFlib Block Plugin で ブ ロ ッ ク を編集 383


> グ リ ッ ド スナ ッ プ を有効化 : 「表示」 → 「表示切 り 替え」 → 「定規 と グ リ ッ ド 」 → 「グ
リ ッ ド にスナ ッ プ」。
> グ リ ッ ド を変更 : 「編集」 → 「環境設定」 (→ 「一般 ...」) → 「単位 と ガ イ ド 」 でグ リ ッ
ド の線の間隔や位置や色を変更で き ます。

「グ リ ッ ド にスナ ッ プ」 を有効に し てい る と 、 構成 し た グ リ ッ ド にブ ロ ッ ク のサ イ ズ と 位
置が揃い ます。 こ の 「グ リ ッ ド にスナ ッ プ」 は、 新規作成す る ブ ロ ッ ク に も 効 き ます し 、
既存のブ ロ ッ ク をブ ロ ッ ク ツールで移動 ・ サ イ ズ変更する 際に も 効き ます。

画像やグ ラ フ ィ ッ ク を選択す る こ と に よ っ て ブ ロ ッ ク を作成 ブ ロ ッ ク の長方形を手作


業で ド ラ ッ グせずに、 既存のページ内容か ら ブ ロ ッ ク のサ イ ズ を定義す る こ と も 可能で
す。 まず、 メ ニ ュ ー項目 「PDFlib ブ ロ ッ ク」 → 「オブ ジ ェ ク ト を ク リ ッ ク で ブ ロ ッ ク を定
義」 を有効化 し ます。 その う えでブ ロ ッ ク ツールを使っ てページ上の画像を ク リ ッ ク する
と 、 その画像 と 同 じ 位置に同 じ サ イ ズのブ ロ ッ ク がで き ます。 それ以外のグ ラ フ ィ ッ ク オ
ブジ ェ ク ト を ク リ ッ ク す る こ と も で き 、 その場合、 ブ ロ ッ ク ツールはその グ ラ フ ィ ッ ク
(た と えば ロ ゴ) 全体を選択 し よ う と し ます。 こ の 「オブ ジ ェ ク ト ク リ ッ ク」 機能の意図
は、 ブ ロ ッ ク を定義す る 作業を支援す る こ と です。 で き たブ ロ ッ ク の位置やサ イ ズは後か
ら 自由に変更で き ます。画像やグ ラ フ ィ ッ ク にブ ロ ッ ク が固定 さ れて し ま う わけではな く
位置 ・ サ イ ズ決めの補助 と し て使 う だけです。
こ の 「オブジ ェ ク ト ク リ ッ ク 」 機能は、 ページで ど のベ ク ト ルグ ラ フ ィ ッ ク や画像が
論理的要素を形成 し てい る か を認識 し よ う と 試みます。 ページ内容を ク リ ッ ク す る と 、 そ
れが白い場合 と 極端に大 き い場合でなければ、 その外接枠 (対象を囲む長方形) が選択 さ
れます。 その次の段階 と し て、 こ の検知 さ れた長方形に他の物の一部が入 り 込んでいれば
それが選択領域に追加 さ れ、 こ れが繰 り 返 さ れます。 こ う し て最終的に得 ら れた領域に基
づいてブ ロ ッ ク の長方形が生成 さ れ る のです。 結局の と こ ろ 「オブジ ェ ク ト ク リ ッ ク 」 機
能は、 個々の線ではな く グ ラ フ ィ ッ ク 全体を選択 し よ う と する こ と にな り ます。

フ ォ ン ト プ ロパテ ィ を自動検出 Block Plugin は、 テ キ ス ト 行 ま た は テ キ ス ト フ ロ ーブ


ロ ッ ク の置かれた場所の背景にあ る フ ォ ン ト を分析 し 、対応する ブ ロ ッ ク プ ロ パテ ィ に自
動的に書 き 込む こ と も で き ます :
fontname・fontsize・fillcolor・charspacing・horizscaling・wordspacing・
textrendering・textrise

こ のフ ォ ン ト プ ロ パテ ィ の自動検出は結果が変にな る こ と も あ る ため、背景を無視 さ せた
い と き には 「PDFlib ブ ロ ッ ク 」 → 「背景フ ォ ン ト ・ 色の検出」 で機能の有効 ・ 無効を切 り
替え る こ と がで き ます。 デフ ォ ル ト では こ の機能は無効にな っ てい ます。

ブ ロ ッ ク を ロ ッ ク ブ ロ ッ ク が う っ か り 移動 ・ サ イ ズ変更 ・ 削除 さ れぬ よ う ロ ッ ク し て
保護す る こ と も で き ます。ブ ロ ッ ク ツールがア ク テ ィ ブな状態でブ ロ ッ ク を選択 し て コ ン
テ キ ス ト メ ニ ュ ーか ら 「ロ ッ ク 」 を選択 し ます。 ブ ロ ッ ク が ロ ッ ク さ れてい る と 、 移動 ・
サ イ ズ変更 ・ 削除で き ず、 そのプ ロ パテ ィ ダ イ ア ロ グ を編集する こ と も で き ません。

13.3.2 ブ ロ ッ ク プ ロパテ ィ を編集


新規ブ ロ ッ ク を作成 し た時 と 、 既存ブ ロ ッ ク を ダブル ク リ ッ ク し た時 と 、 ブ ロ ッ ク の コ ン
テ キ ス ト メ ニ ュ ーか ら 「プ ロパテ ィ 」 を選択 し た時には、 プ ロ パテ ィ ダ イ ア ロ グが現れ、
その選んだブ ロ ッ ク のあ ら ゆ る 設定を編集で き ます (図 13.2 参照) 。 プ ロ パテ ィ にはブ
ロ ッ ク 種別に よ っ て グループがい く つかあ り 、 詳 し く は 402 ページ 「13.7 ブ ロ ッ ク のプ ロ
パテ ィ 」 で説明 し ます。

384 第 13 章 : PPS と PDFlib Block Plugin


ダ イ ア ロ グ内の 1 個ない し 複数のプ ロ パテ ィ を変更 し た時だけ 「適用」 ボ タ ンが有効
にな り ます。 プ ロ パテ ィ の変更をブ ロ ッ ク に適用 し た後には、 ブ ロ ッ ク の名前の中にア ス
タ リ ス ク が表示 さ れて、ブ ロ ッ ク が変更 さ れたが ま だデ ィ ス ク には保存 さ れていない と い
う こ と を示 し ます。 ロ ッ ク さ れたブ ロ ッ ク では 「適用」 ボ タ ンは無効 と な り ます。

注 ブ ロ ッ ク 種別やプ ロパテ ィ の設定によ っ ては表示 さ れないプ ロパテ ィ も あ り ます。た と え


ば、 タ ブ設定を編集する ための「hortabmethod=ruler におけるルーラータブ」プ ロパテ ィ サ
ブグループは、「テキスト組版」→「ルーラータブ」 グループの hortabmethod プ ロパテ ィ を
ruler に設定 し ている と き にのみ表示 さ れます。

注 ブ ロ ッ ク プ ロパテ ィ に テキス ト を入力す る と キ ャ ラ ク タ ーの置換が起 こ る こ と があ り ま


す。 た と えばス ト レー ト 引用符がスマー ト 引用符へ置き換え られた り し ます。 この置き換
えはオペ レーテ ィ ングシ ス テムが行な っ ている こ と ですので、 無効化するには 「シ ス テム
環境設定」 → 「キーボー ド 」 → 「ユーザー辞書」 → 「スマー ト 引用符 と スマー ト ダ ッ シ ュ
を使用」 を選択 し ます。

プ ロ パテ ィ の値を変更す る には、入力 し たい数や文字列を プ ロ パテ ィ の入力領域に入力す


る か (linewidth な ど)、 ド ロ ッ プダ ウ ン リ ス ト か ら 値を選ぶか (fitmethod ・ orientate な
ど)、 ダ イ ア ロ グの右側にあ る 「...」 ボ タ ン を ク リ ッ ク し て フ ォ ン ト やカ ラ ー値やフ ァ イ ル
名を選びます (backgroundcolor ・ defaultimage な ど)。 fontname プ ロ パテ ィ の場合は、 シ
ス テ ムに イ ン ス ト ール さ れてい る フ ォ ン ト の一覧か ら 選ぶ こ と も で き ます し 、カ ス タ ムの
フ ォ ン ト 名を打ち込む こ と も 可能です。 ど の方式で フ ォ ン ト 名を入力 し たにせ よ 、 PPS が
ブ ロ ッ ク へ内容を流 し 込むシ ス テ ムでその フ ォ ン ト が利用可能でなければな り ません。
変更 さ れたプ ロ パテ ィ は、ブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ グ内で太字で表示 さ れます。ブ
ロ ッ ク のいずれかのプ ロ パテ ィ が変更 さ れてい る と き には、その表示 さ れてい る ブ ロ ッ ク
名の後に接尾辞 (*) が付 さ れます。 プ ロ パテ ィ の編集が済んだ ら 、 「適用」 ボ タ ン を ク リ ッ
ク し てブ ロ ッ ク を更新 し ます。 定義 し たプ ロ パテ ィ は、 PDF フ ァ イ ル内にブ ロ ッ ク 定義の
一部 と し て格納 さ れます。

重な っ た ブ ロ ッ ク 重な り あ う ブ ロ ッ ク 群は選択 し づ ら い こ と があ り ま す。 その領域を
ク リ ッ ク す る と 必ず最前面のブ ロ ッ ク が選ばれて し ま う か ら です。そんな と き は コ ン テ キ
ス ト メ ニ ュ ーの 「ブ ロ ッ ク の選択」 項目を用いれば、 ブ ロ ッ ク の う ちの 1 個を名前で選択
で き ます。 1 個のブ ロ ッ ク を選んだ直後にその領域で行 う 操作は、 その選択 し た 1 個のブ
ロ ッ ク に対 し てのみ効力を持ち、 他のブ ロ ッ ク に対 し ては効力を持ち ま せん。 た と えば
Enter を押せば、 その選択 し たブ ロ ッ ク のプ ロ パテ ィ を編集で き ます。 こ の方法を駆使す
れば、 ブ ロ ッ ク の上に他のブ ロ ッ ク が部分的ない し 完全にかぶ さ っ ていて も 、 簡単にその
ブ ロ ッ ク のプ ロ パテ ィ を編集す る こ と がで き ます。

ブ ロ ッ ク プ ロパテ ィ の値を繰 り 返 し 使用 ・ リ セ ッ ト キー入力や ク リ ッ ク の量を い く ら


か軽減で き る よ う 、 ブ ロ ッ ク ツールは、 直前のブ ロ ッ ク のプ ロ パテ ィ ダ イ ア ロ グで入力 さ
れたプ ロ パテ ィ 値を記憶 し てい ます。 こ れ ら の値は新規ブ ロ ッ ク の作成時に再利用 さ れま
す。 も ち ろんその値はいつで も 別の値でオーバー ラ イ ド し てか ま い ません。
プ ロ パテ ィ のダ イ ア ロ グで 「全て リ セ ッ ト 」 ボ タ ン を押す と 、 下記以外のブ ロ ッ ク プ
ロ パテ ィ がデフ ォ ル ト に リ セ ッ ト さ れます :
> Name ・ Type ・ Rect ・ Description プ ロ パテ ィ
> すべてのカ ス タ ムプ ロ パテ ィ

注 定義済みプ ロパテ ィ のデ フ ォル ト 値は、プ レ ビ ュ ー生成時のプ レースホルダーデー タ を保


持する defaulttext ・ defaultimage ・ defaultpdf ・ defaultgraphics プ ロパテ ィ と は別物です
ので注意 し て く だ さ い (392 ページ 「ブ ロ ッ ク のデ フ ォル ト 内容」 参照)。

13.3 PDFlib Block Plugin で ブ ロ ッ ク を編集 385


複数のブ ロ ッ ク を ま と めて編集 複数のブ ロ ッ ク のプ ロ パテ ィ を ま と めて編集すれば大
いに時間を節約で き ます。 複数のブ ロ ッ ク を選択する には以下の と お り 操作 し ます :
> メ ニ ュ ー項目 「PDFlib ブ ロ ッ ク 」 → 「PDFlib ブ ロ ッ ク ツール」 を選択する こ と に よ っ て、
ブ ロ ッ ク ツールを ア ク テ ィ ブに し ます。
> 1 個目のブ ロ ッ ク を ク リ ッ ク し て選択。こ の最初に選んだブ ロ ッ ク がマ ス タ ーブ ロ ッ ク
にな り ます。 他の 1 個ない し 複数のブ ロ ッ ク を Shift+ ク リ ッ ク する こ と に よ っ て選択
ブ ロ ッ ク 群に加え ま す。 あ る いは 「編集」 → 「すべて を選択」 を ク リ ッ ク す る と 、 現
在のページの全ブ ロ ッ ク を選択で き ます。
> こ れ ら のいずれかのブ ロ ッ ク を ダブル ク リ ッ ク す る と 、 ブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ
グが開 き ます。 こ の時ダブル ク リ ッ ク し たブ ロ ッ ク は新たにマ ス タ ーブ ロ ッ ク にな り
ます。
> あ る いはいずれかのブ ロ ッ ク を ク リ ッ ク し てマ ス タ ーブ ロ ッ ク に し た う えでEnterキー
を押す こ と に よ っ てブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ グ を開 く こ と も で き ます。

プ ロ パテ ィ の う ち、選択 し てい る ブ ロ ッ ク すべてに該当する 部分集合だけがプ ロ パテ ィ ダ


イ ア ロ グに表示 さ れます。プ ロ パテ ィ 値はマ ス タ ーブ ロ ッ ク か ら 採 ら れてダ イ ア ロ グに表
示 さ れます。 こ の時、 選択 し てい る ブ ロ ッ ク すべてにプ ロ パテ ィ 群を以下の よ う に適用で
き ます :
> チ ェ ッ ク ボ ッ ク ス 「マ ス タ ーブ ロ ッ ク のすべてのプ ロパテ ィ を適用」 をチ ェ ッ ク し て
いない と き : 「適用」 を ク リ ッ ク す る と 、 選択 し てい る すべてのブ ロ ッ ク へ、 ダ イ ア ロ
グで手変更 さ れたプ ロ パテ ィ (黒でハ イ ラ イ ト さ れてい る ) だけが コ ピー さ れます。
> チ ェ ッ ク ボ ッ ク ス 「マ ス タ ーブ ロ ッ ク のすべてのプ ロパテ ィ を適用」 をチ ェ ッ ク し て
い る と き : 「適用」 を押す と 、 選択 し てい る すべてのブ ロ ッ ク へ、 マ ス タ ーブ ロ ッ ク の
すべてのカ レ ン ト プ ロ パテ ィ と 、 ダ イ ア ロ グで手変更 さ れたすべてのプ ロ パテ ィ が コ
ピー さ れます。 こ れを利用 し て、 あ る ブ ロ ッ ク のブ ロ ッ ク プ ロ パテ ィ を他の 1 個ない
し 複数のブ ロ ッ ク へ コ ピーす る こ と も で き る わけです。

以下の定義済みプ ロ パテ ィ お よ びカ ス タ ムプ ロ パテ ィ は共用で き ません。 すなわち、 複数


のブ ロ ッ ク で ま と めて編集で き ません :
Name・Description・Subtype・Type・Rect・Status

13.3.3 ページ間 ・ 文書間で ブ ロ ッ ク を コ ピ ー


Block Plugin は、 ブ ロ ッ ク を現在のページの中で、 ま たは現在の文書の中で、 あ る いは他
の文書へ移動 ・ コ ピーす る 手段をい く つか提供 し てい ます :
> ブ ロ ッ ク を マ ウ ス で ド ラ ッ グす る こ と に よ っ て、 移動 ・ コ ピーす る か、 あ る いは他の
ページか開いてい る 文書へブ ロ ッ ク を貼 り 付け る
> ブ ロ ッ ク を、通常の コ ピー/貼 り 付け操作を用いて、同一文書内の 1つない し 複数のペー
ジへ複製
> ブ ロ ッ ク を、 新 し い フ ァ イ ル (ページが空白の) か既存の文書 (既存のページにブ ロ ッ
ク を適用) へ書 き 出す
> 他の文書か ら ブ ロ ッ ク を取 り 込む

ブ ロ ッ ク の定義は維持 し た ま まページ内容を差 し 替え たい と き は、ブ ロ ッ ク を温存 し なが


ら 背景の 1 つない し 複数のページ を置換す る こ と がで き ます。 そのためには、 「ツール」
→ 「ページ を整理」 → 「置換」 を用い ます。

ブ ロ ッ ク を移動 ・ コ ピ ー ブ ロ ッ ク の位置を変え た り コ ピーを作成 し た り す る には、1 個


ない し 複数のブ ロ ッ ク を選択 し て、 Ctrl キー (Windows の場合) か Alt キー (macOS の場

386 第 13 章 : PPS と PDFlib Block Plugin


合) を押 し なが ら 、 新 し い位置へ ド ラ ッ グ し ます。 キーを押 し てい る 間は、 マ ウ ス カー ソ
ルが変わ り ます。 コ ピー さ れたブ ロ ッ ク は、 名称 と 位置が自動的に変更 さ れ る 以外は、 元
のブ ロ ッ ク と 同 じ プ ロ パテ ィ を持ち ます。
ま た、 コ ピー/貼 り 付け を使っ て、 ブ ロ ッ ク を、 同一ページ内の他の場所へ、 ま たは
同一文書内の他のページへ、 あ る いはその時に Acrobat で開いてい る 他の文書へ コ ピーす
る こ と も で き ます :
> ブ ロ ッ ク ツールを ア ク テ ィ ブに し て、 コ ピー し たいブ ロ ッ ク 群を選択。
> Ctrl+C (Windows の場合) か Cmd+C (macOS の場合) ま たは 「編集」 → 「 コ ピー」 を
使っ て、 選択 し たブ ロ ッ ク を ク リ ッ プボー ド へ コ ピー。
> コ ピー先ページへ移動 (必要な ら )。
> ブ ロ ッ ク ツールがア ク テ ィ ブであ る こ と を確認 し て、Ctrl+V(Windows の場合)か Cmd+V
(macOS の場合) ま たは 「編集」 → 「貼 り 付け」 を使っ て、 ク リ ッ プボー ド か ら ブ ロ ッ
ク を現在のページ ・ 文書へ貼 り 付け。

ブ ロ ッ ク を他のページ群へ複製 1 個ない し 複数のブ ロ ッ ク の複製を、現在の文書の中の


任意の数のページ上に一気に作 る こ と も で き ます :
> ブ ロ ッ ク ツールを ア ク テ ィ ブに し て、 複製 し たいブ ロ ッ ク 群を選択。
> 「PDFlib ブ ロ ッ ク」 メ ニ ュ ーか コ ン テ キ ス ト メ ニ ュ ーか ら 「取 り 込み と 書き出 し 」 → 「複
製 ...」 を選択。
> ど う い う ブ ロ ッ ク を複製す る か を選び (「選択 さ れている ブ ロ ッ ク 」 ま たは 「 このペー
ジ上の全ブ ロ ッ ク」)、 こ の選んだブ ロ ッ ク 群を複製 し たい複製先ページの範囲を選択。

ブ ロ ッ ク を書 き出 し ・ 取 り 込み ブ ロ ッ ク の書 き 出 し /取 り 込み機能を使 う と 、 あ る 1
つのページ上のブ ロ ッ ク の定義や、 あ る 文書のすべてのブ ロ ッ ク の定義を、 複数の PDF
フ ァ イ ル間で共用す る こ と が可能です。 こ れは、 既存のブ ロ ッ ク 定義を温存 し た ま まペー
ジ内容を差 し 替え と き に便利です。ブ ロ ッ ク 定義を別フ ァ イ ル と し て書 き 出すには以下の
と お り 操作 し ます :
> ブ ロ ッ ク ツールを ア ク テ ィ ブに し て、 書 き 出 し たいブ ロ ッ ク 群を選択。
> 「PDFlib ブ ロ ッ ク」 メ ニ ュ ーか コ ン テ キ ス ト メ ニ ュ ーか ら 「取 り 込み と 書き出 し 」 → 「書
き出 し ...」 を選択。 ページ範囲 と 、 ブ ロ ッ ク 定義を持たせたい新規 PDF フ ァ イ ル名を
入力。

ブ ロ ッ ク 定義を取 り 込むには 「PDFlib ブ ロ ッ ク」 → 「取 り 込み と 書き出 し 」 → 「取 り 込み


...」 を選択 し ます。 ブ ロ ッ ク を取 り 込む際には、 取 り 込んだブ ロ ッ ク を文書の全ページに
適用す る のか、 それ と も 特定のページ範囲にだけ適用す る か を選べます。 複数のページ を
選択 し た場合、 ブ ロ ッ ク 定義は変更 さ れずに各ページへ コ ピー さ れます。 取 り 込むブ ロ ッ
ク 定義 よ り も 取 り 込み先範囲のほ う がページ数が多い場合には、 「テ ン プ レー ト を繰 り 返
す」 チ ェ ッ ク ボ ッ ク ス を用い る こ と も で き ます。 こ れをチ ェ ッ ク す る と 、 取 り 込みフ ァ イ
ル内のブ ロ ッ ク のシーケ ン ス が、 現在の文書の中で、 文書の終わ り に達す る ま で繰 り 返 さ
れます。

書き出 し で ブ ロ ッ ク を他の文書へ コ ピ ー ブ ロ ッ ク を書 き 出す際には、 そのブ ロ ッ ク 群


を他の文書のページ群へ直接適用す る こ と も で き ます。 結果 と し て、 あ る 文書か ら 別の文
書へブ ロ ッ ク 群を転写す る こ と がで き る わけです。 そのためには、 ブ ロ ッ ク の書 き 出 し 先
と し て既存の文書を選びます。 「既存のブ ロ ッ ク を削除」 チ ェ ッ ク ボ ッ ク ス をチ ェ ッ ク す
る と 、 書 き 出 し 先の文書にブ ロ ッ ク が存在 し ていて も すべて削除 さ れてか ら 、 新たにブ
ロ ッ ク 群がその文書へ コ ピー さ れます。

13.3 PDFlib Block Plugin で ブ ロ ッ ク を編集 387


13.3.4 Block Plugin のユーザー イ ン タ ー フ ェ イ ス を XML で カ ス タ マ イ ズ
Block Plugin のユーザー イ ン タ ーフ ェ イ ス の設定の一部は、Acrobat セ ッ シ ョ ン ご と に保管
/ 再読み込み さ れてお り 、 XML 構成フ ァ イ ルで制御可能です。 構成フ ァ イ ルのサンプル と
し て factory settings.xml をデ ィ ス ト リ ビ ュ ーシ ョ ンに同梱 し てい ます。 構成が変更 さ れた
と き 、 新 し い設定は user settings.xml に格納 さ れます。 変更 さ れた構成は、 Acrobat が起
動 さ れ る たびに読み込まれ、 Acrobat が閉 じ ら れ る たびに書き 込まれます。 こ の構成フ ァ
イ ルは以下の よ う な場所に格納 さ れてい ます (シ ス テ ムデ ィ レ ク ト リ ーの名前は ロ ーカ ラ
イ ズ さ れてい る 場合があ り ます。 必要に応 じ て DC を他の Acrobat ト ラ ッ ク 名へ置き 換え
て く だ さ い) :
Windows:C:\Users\<user>\AppData\Local\Adobe\Acrobat\DC\PDFlib\Block Plugin 5
macOS:/Users\<user>/Library/Application Support/Adobe/Acrobat/DC/PDFlib/Block Plugin 5

以下の XML エ レ メ ン ト を用いて構成を手動で変更で き ます :


> エ レ メ ン ト /Block_Plugin/MainDialog/CloseOnApply:ブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ グの
「適用 し た ら ダ イ ア ログを閉 じ る」 チ ェ ッ ク ボ ッ ク ス の初期状態を制御。 こ のチ ェ ッ ク
ボ ッ ク ス は、 ブ ロ ッ ク 作成後 ま たはブ ロ ッ ク プ ロ パテ ィ 変更後に も ブ ロ ッ ク プ ロ パ
テ ィ ダ イ ア ロ グが開いた ま ま にな る か ど う かを決め る も のです。
> エ レ メ ン ト /Block_Plugin/MainDialog/ApplyAllProps:ブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ グの
「マ ス タ ー ブ ロ ッ ク のすべてのプ ロパテ ィ を適用」 チ ェ ッ ク ボ ッ ク ス の初期状態を制
御。 こ のチ ェ ッ ク ボ ッ ク ス は、 選択 し てい る 複数のブ ロ ッ ク へ コ ピー さ れ る のはマ ス
タ ーブ ロ ッ ク のすべて のプ ロ パテ ィ な のか、 それ と も ダ イ ア ロ グ で変更 し た プ ロ パ
テ ィ 群のみか を指定す る も のです。
> エ レ メ ン ト /Block_Plugin/FontDialog/ShowBaseFonts : ブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ グ
の フ ォ ン ト 一覧 (「書式」 プ ロ パテ ィ グループの fontname プ ロ パテ ィ ) に、 シ ス テ ム
に イ ン ス ト ール さ れてい る フ ォ ン ト 群だけでな く ベース フ ォ ン ト 14 種 も 表示する か ど
う か を制御。
> エ レ メ ン ト /Block_Plugin/Command/ControlByClick: メ ニ ュ ー項目 「PDFlib ブ ロ ッ ク」 →
「オブ ジ ェ ク ト を ク リ ッ ク で ブ ロ ッ ク を定義」 の初期状態を制御。
> エ レ メ ン ト /Block_Plugin/Command/DetectFonts : メ ニ ュ ー項目 「PDFlib ブ ロ ッ ク 」 →
「背景 フ ォ ン ト ・ 色の検出」 の初期状態を制御。
> エ レ メ ン ト /Block_Plugin/Command/KeyAccelerator:control (Windows では Ctrl キーを、
macOS では Command キーを示 し ます) ・ shift (Shift キーを示 し ます) ・ control+shift ・
none のいずれかの値を と り 、 以下のキーボー ド シ ョ ー ト カ ッ ト に対す る ア ク セ ラ レー
タ ーキーを指定 :
A(すべてを選択)・C(コピー)・I(ブロックプロパティダイアログ)
・V(貼り付け)・X(切り
取り)

変更は、 Acrobat を次に起動 し た際に有効にな り ます。 キーボー ド シ ョ ー ト カ ッ ト は実


行時には変更で き ないためです。 こ のエ ン ト リ ーがない場合、 ア ク セ ラ レー タ は利用
で き ません。 デフ ォ ル ト は control です。
> エ レ メ ン ト Configuration/Preferences/PreviewStatusMessage : 各プ レ ビ ュ ー操作後に ス
テー タ ス メ ッ セージダ イ ア ロ グ (「10 個のブ ロ ッ ク が処理 さ れま し た :…」 な ど) が表
示 さ れ る か ど う か を制御。

388 第 13 章 : PPS と PDFlib Block Plugin


13.4 PDF フ ォ ーム フ ィ ール ド を PDFlib ブ ロ ッ ク に変

PDFlib ブ ロ ッ ク を手作業で作 ら ず、PDF フ ォーム フ ィ ール ド を ブ ロ ッ ク へ自動変換 さ せ る
こ と も 可能です。 こ れが特に役立つのは、 複雑な PDF フ ォームに PPS で自動流 し 込みで
き る よ う に し たい場合や、 既存の大量の PDF フ ォーム を自動流 し 込みで き る よ う 変換 し
たい場合な ど です。1 つのページのすべての フ ォーム フ ィ ール ド を PDFlib ブ ロ ッ ク に変換
す る には、 「PDFlib ブ ロ ッ ク」 → 「フ ォ ーム フ ィ ール ド の変換」 → 「現在のページ」 を選
択 し ま す。 文書のすべての フ ォ ーム フ ィ ール ド を変換 し た ければ 「全ページ」 を選び ま
す。選択 し た フ ォーム フ ィ ール ド だけ を変換 し たければ(1 個ま たは複数の フ ォーム フ ィ ー
ル ド を選択する には、 Acrobat の 「ツール」 → 「 リ ッ チ メ デ ィ ア」 か ら 「オブ ジ ェ ク ト を
選択」 ツールを選択)、 「選択 さ れている フ ォ ーム フ ィ ール ド 」 を選択 し ます。

フ ォ ーム フ ィ ール ド 変換の詳細 自動 フ ォ ー ム フ ィ ール ド 変換におい ては、 「PDFlib ブ


ロ ッ ク」 → 「 フ ォ ーム フ ィ ール ド の変換」 → 「変換オプ シ ョ ン ...」 ダ イ ア ロ グで選んでい
る 種類の フ ォーム フ ィ ール ド が、テ キ ス ト 行ブ ロ ッ ク かテ キ ス ト フ ロ ーブ ロ ッ ク に変換 さ
れます。 デフ ォ ル ト ではすべての種類の フ ォーム フ ィ ール ド が変換 さ れます。 変換 さ れた
フ ィ ール ド の属性は、 表 13.3 の と お り 、 それぞれ対応す る ブ ロ ッ ク プ ロ パテ ィ へ変換 さ
れます。

同名の複数の フ ォ ーム フ ィ ール ド フ ォ ーム フ ィ ール ド の場合には同 じ ページに同 じ 名


前の も のが複数あ っ て も 許 さ れ る のですが、ブ ロ ッ ク の場合には名称がページ上で一意で
なければな り ません。 ですので、 フ ォーム フ ィ ール ド がブ ロ ッ ク に変換 さ れ る 際には、 生
成 さ れ る ブ ロ ッ ク の名前の末尾に数 を 付加 し て一意な ブ ロ ッ ク 名が生成 さ れ ま す (389
ページ 「フ ォーム フ ィ ール ド を対応す る ブ ロ ッ ク に紐付け」 も 参照)。
なお、 Acrobat の内部的な問題に よ り 、 同名の フ ォーム フ ィ ール ド が複数あ る と フ ィ ー
ル ド の属性が正 し く 報告 さ れません。 同名の複数の フ ィ ール ド で属性が異な る と 、 生成 さ
れ る ブ ロ ッ ク には こ の属性の違いが反映 さ れ ま せん。 変換処理は こ の場合には警告 メ ッ
セージ を表示 し 、 関連す る フ ォーム フ ィ ール ド 群の名前を示 し ます。 その場合には、 生成
さ れたブ ロ ッ ク のプ ロ パテ ィ を よ く チ ェ ッ ク す る 必要があ り ます。

フ ォ ーム フ ィ ール ド を対応す る ブ ロ ッ ク に紐付け 同名の フ ィ ール ド が複数あ っ た場合


( ラ ジオボ タ ン な ど)、変換先の フ ォーム フ ィ ール ド の名前は変更 さ れて し ま っ てい ますか
ら 、 ど の フ ォーム フ ィ ール ド が ど のブ ロ ッ ク にな っ たのか を特定 し づ ら く な り ます。 こ れ
は特に、FDF フ ァ イ ルか XFDF フ ァ イ ルを ソ ース と し てブ ロ ッ ク へ流 し 込んでその結果を
フ ォーム記入 と 同 じ に し たい と き に問題 と な り ます。
こ の問題を解決す る ため、 AcroFormConversion プ ラ グ イ ンでは、 元の フ ォーム フ ィ ー
ル ド に関す る 情報を、 それに対応す る ブ ロ ッ ク を生成す る 際に、 カ ス タ ムプ ロ パテ ィ 群 と
し て記録 し ます。 表 13.2 に、 ブ ロ ッ ク を正 し く 特定す る ために利用で き る カ ス タ ムプ ロ
パテ ィ の一覧を示 し ます。 プ ロ パテ ィ の型はすべて文字列です。

ブ ロ ッ ク を対応す る フ ォ ーム フ ィ ール ド へバ イ ン ド PDFlib フ ォーム フ ィ ール ド と 生成


PDFlib ブ ロ ッ ク と を同期 さ せ る ために、 生成 さ れたブ ロ ッ ク を、 その対応す る フ ォ ーム
フ ィ ール ド にバ イ ン ド さ せてお く こ と がで き ます。 言い換えれば、 プ ラ グ イ ンが内部的に
フ ォーム フ ィ ール ド と ブ ロ ッ ク と の紐付け を保持する と い う こ と です。変換処理が再実行
さ れ る 際、 バ イ ン ド さ れたブ ロ ッ ク は、 その対応する PDFlib フ ォーム フ ィ ール ド の属性
を反映 し て更新 さ れます。 ブ ロ ッ ク がバ イ ン ド さ れてい る と 、 作業の二度手間が省けて便

13.4 PDF フ ォ ーム フ ィ ール ド を PDFlib ブ ロ ッ ク に変換 389


表 13.2 ブ ロ ッ ク に対応する元のフ ォ ーム フ ィ ール ド を同定する ためのカ ス タ ムプ ロパテ ィ
カ ス タ ムプ ロパテ ィ 意味
PDFlib:field:name フ ォ ーム フ ィ ール ド の完全修飾名。
PDFlib:field:pagenumber 元の文書で フ ォ ーム フ ィ ール ド が存在 し ていたページの番号 (文字列で)。
PDFlib:field:type フ ォ ーム フ ィ ール ド の種類。 pushbutton ・ checkbox ・ radiobutton ・ listbox ・
combobox ・ textfield ・ signature の う ちのいずれか。

PDFlib:field:value (type=checkbox の場合にのみ可) フ ォ ーム フ ィ ール ド の出力値。

表 13.3 PDF フ ォ ーム フ ィ ール ド から PDFlib ブ ロ ッ クへの変換


以下の PDF フ ォ ーム フ ィ ール ド 属性は ... ... 以下の PDFlib ブ ロ ッ ク プ ロパテ ィ に変換 さ れる

全 フ ィ ール ド

位置 Rect

名前 Name

ツール ヒ ン ト Description

一般→一般プ ロパテ ィ →表示 と 印刷 Status :


表示 =active
非表示 =ignore
表示 / 印刷 し ない =ignore
非表示 / 印刷する =active

一版→一般プ ロパテ ィ →向き orientate : 0=north、 90=west、 180=south、 270=east

表示方法→テキス ト → フ ォ ン ト fontname

表示方法→テキス ト → フ ォ ン ト サイ ズ fontsize : 文字サイ ズ auto は、 ブ ロ ッ クの高 さ の 3 分の 2 の固定文


字サイ ズに変換 さ れ、 fitmethod は auto に設定 さ れます。 複数行の
ブ ロ ッ ク/ フ ィ ール ド においては、 こ の組み合わせでは結果 と し て
自動的に適切な文字サイ ズにな るので、 ブ ロ ッ クの高 さ の 3 分の 2
と い う 初期値よ り も小 さ く な る こ と があ り ます。
表示方法→テキス ト →テキス ト の色 strokecolor ・ fillcolor

表示方法→境界線 と 色→境界線の色 bordercolor

表示方法→境界線 と 色→塗 り つぶ し の色 backgroundcolor

表示方法→境界線 と 色→幅 linewidth : 細 =1、 標準 =2、 太 =3

テキス ト フ ィ ール ド

オプ シ ョ ン→整列 position :
左揃え ={left center}
中央 ={center center}
右揃え ={right center}

オプ シ ョ ン→デ フ ォル ト defaulttext

オプ シ ョ ン→複数行 チ ェ ッ ク あ り な ら テキス ト フ ローブ ロ ッ ク を作成


チ ェ ッ ク な し な ら テキス ト 行ブ ロ ッ ク を作成

ラ ジオボ タ ン ・ チ ェ ッ ク ボ ッ ク ス

390 第 13 章 : PPS と PDFlib Block Plugin


表 13.3 PDF フ ォ ーム フ ィ ール ド から PDFlib ブ ロ ッ クへの変換
以下の PDF フ ォ ーム フ ィ ール ド 属性は ... ... 以下の PDFlib ブ ロ ッ ク プ ロパテ ィ に変換 さ れる

「デ フ ォ ル ト でチ ェ ッ ク」 がオ ンの場合 : defaulttext :
オプ シ ョ ン→チ ェ ッ ク ボ ッ ク ス ス タ イル、 チ ェ ッ ク マー ク =4
オプ シ ョ ン→ボ タ ン ス タ イル 円形 =l
十字形 =8
ひ し 形 =u
四角形 =n
星形 =H
(文字は ZapfDingbats フ ォ ン ト における各記号を表 し ます)
リ ス ト ボ ッ ク ス ・ コ ンポボ ッ ク ス

オプ シ ョ ン→選択 さ れている (デ フ ォ ル defaulttext


ト ) 項目

ボタ ン

オプ シ ョ ン→ア イ コ ン と ラ ベル→ラ ベル defaulttext

利です。 フ ォームが対話的利用のために更新 さ れた時に、 対応す る ブ ロ ッ ク も 自動的に更


新 さ れ る か ら です。
ブ ロ ッ ク を生成 し た後に変換元の フ ォーム フ ィ ール ド を残 し た く なければ、 「PDFlib ブ
ロ ッ ク」 → 「フ ォ ーム フ ィ ール ド の変換」 → 「変換オプ シ ョ ン ...」 ダ イ ア ロ グの 「変換 さ
れた フ ォ ーム フ ィ ール ド を削除」 オプシ ョ ン を選びます。 こ のオプシ ョ ン を選ぶ と 、 変換
処理後に フ ォーム フ ィ ール ド が完全に削除 さ れます。削除 さ れた フ ィ ール ド に関連づけ ら
れていた ア ク シ ョ ン (JavaScript な ど) も すべて文書か ら 削除 さ れます。

バ ッ チ変換 フ ォーム フ ィ ール ド を PDFlib ブ ロ ッ ク に変換 し たい PDF 文書が多数あ る 場


合には、 バ ッ チ変換機能 を 利用 し て、 任意の数の文書 を 自動処理す る こ と も 可能です。
「PDFlib ブ ロ ッ ク」 → 「フ ォ ーム フ ィ ール ド の変換」 → 「バ ッ チ変換 ...」 を選択すれば、
バ ッ チ処理ダ イ ア ロ グが現れます :
> 入力フ ァ イ ルは、個別に選ぶ こ と も で き ます し 、1 個の フ ォ ルダーの中身をすべて ま と
めて処理 さ せ る こ と も で き ます。
> 出力フ ァ イ ルは、 入力フ ァ イ ル と 同 じ フ ォ ルダーへ書 き 出す こ と も で き ます し 、 別の
フ ォ ルダーへ書 き 出す こ と も で き ます。 出力フ ァ イ ルには、 入力フ ァ イ ル と 区別す る
ためにプ レ フ ィ ッ ク ス を追加す る こ と も で き ます。
> 大量の文書を処理す る 際には、 ロ グ フ ァ イ ルを指定する こ と を推奨 し ます。変換後、 ロ
グ フ ァ イ ルには、 処理 さ れたすべての フ ァ イ ルの一覧 と 、 それぞれの変換結果に関す
る 詳細が書 き 込ま れてお り 、 エ ラ ーが起 き た場合にはエ ラ ー メ ッ セージ も 書 き 込ま れ
ます。

変換処理の間、 変換 さ れ る PDF 文書は Acrobat で表示 さ れますが、 変換が完了す る ま で、


Acrobat の メ ニ ュ ー機能やツールは使用で き ません。

13.4 PDF フ ォ ーム フ ィ ール ド を PDFlib ブ ロ ッ ク に変換 391


13.5 ブ ロ ッ ク を Acrobat で プ レ ビ ュ ー
注 PDFlib デ ィ ス ト リ ビ ュ ーシ ョ ンの中の block_template.pdf 文書で プ レ ビ ュ ー機能を試せま
す。 必要な リ ソ ース (フ ォ ン ト ・ 画像な ど) も PDFlib デ ィ ス ト リ ビ ュ ーシ ョ ンに含まれ
ています。

PDFlib ブ ロ ッ ク は PPS に よ っ て処理 さ れます。 PPS を用い る こ と で、 ブ ロ ッ ク への流 し 込


み処理について、 そのデー タ ソ ー ス (デー タ ベー ス 内のテ キ ス ト や、 デ ィ ス ク 上の画像
フ ァ イ ルな ど) や、 生成 さ れ る 文書の書式 ・ 対話的性質を カ ス タ マ イ ズする こ と がで き ま
す。こ の処理について詳 し く は 397 ページ「13.6 PPS でブ ロ ッ ク に流 し 込み」で説明 し ます。
し か し Block Plugin には内蔵バージ ョ ンの PPS が含まれてお り 、 こ れを用いて、 プ ロ グ
ラ ミ ン グ を一切必要 と せずに Acrobat 上で、 流 し 込まれたブ ロ ッ ク のプ レ ビ ュ ーバージ ョ
ン を生成す る こ と がで き ます。 こ のプ レ ビ ュ ー機能は、 カ ス タ ムプ ロ グ ラ ミ ン グ と 同等の
柔軟性を提供す る こ と はで き ませんが、ブ ロ ッ ク への流 し 込み結果を手軽に眺め る には適
し てい ます。 ブ ロ ッ ク プ レ ビ ュ ーを活用すれば、 ブ ロ ッ ク の位置やサ イ ズ を改善 し た り 、
ブ ロ ッ ク のプ ロ パテ ィ (フ ォ ン ト 名 ・ 文字サ イ ズな ど) をチ ェ ッ ク し た り す る こ と がで き
ます。 プ レ ビ ュ ーの表示結果に満足す る ま で、 ブ ロ ッ ク を変更 し 、 プ レ ビ ュ ーを生成 し な
お し こ と がで き ます。 プ レ ビ ュ ーは、 カ レ ン ト ページについて も 、 文書全体について も 生
成で き ます。
プ レ ビ ュ ーはつねに新規 PDF 文書 と し て表示 さ れます。 元の文書 (ブ ロ ッ ク を有 し て
い る ) は、 プ レ ビ ュ ーを生成 し て も 変更を受け ません。 プ レ ビ ュ ー文書は、 必要に応 じ て
保存す る こ と も で き ます し 、 捨て る こ と も で き ます。

ブ ロ ッ ク のデ フ ォ ル ト 内容 プ ラ グ イ ン の場合には、 ブ ロ ッ ク のテ キ ス ト ・ 画像 ・ ベ ク
ト ルグ ラ フ ィ ッ ク ・ PDF 内容をサーバーサ イ ド のデー タ ソ ース (デー タ ベース な ど) か ら
取得す る のは無理ですので、プ レ ビ ュ ー機能ではつねにブ ロ ッ ク のデフ ォ ル ト 内容が用い
ら れます。 具体的には defaulttext ・ defaultimage ・ defaultpdf ・ defaultgraphics プ ロ パテ ィ
で指定 し た値が用い ら れます。 PPS で使 う 現実のブ ロ ッ ク 内容を代表する よ う なサンプル
デー タ 集合をデフ ォ ル ト デー タ と し て使 う のが普通です。デフ ォ ル ト 内容のないブ ロ ッ ク
はプ レ ビ ュ ー生成の際に無視 さ れ ます。 Status=ignoredefault のブ ロ ッ ク について も 同様
です。
新規ブ ロ ッ ク では、 デフ ォ ル ト プ ロ パテ ィ は空です。 プ レ ビ ュ ー機能を使 う には、 「デ
フ ォル ト 内容」プ ロ パテ ィ グループの defaulttext・defaultimage・defaultpdf・defaultgraphics
プ ロ パテ ィ (ブ ロ ッ ク の種類に よ る ) に書 き 込むか、 「高度な PPS オプ シ ョ ン ...」 ダ イ ア
ロ グの同名オプシ ョ ンに適切な値を与え る 必要があ り ます。

注 記号フ ォ ン ト のデ フ ォル ト テキス ト を入力するのは少 し ト リ ッ キーな場合があ り ます。詳


し く は 396 ページ 「 デ フ ォル ト テキス ト に記号フ ォ ン ト を使用」 を参照 し て く だ さ い。

ブ ロ ッ ク プ レ ビ ュ ー を生成 ブ ロ ッ ク プ レ ビ ュ ーを生成す る には、 以下のいずれかの方


法を用い ます :
> PDFlib ブ ロ ッ ク プ レ ビ ュ ーアー イ コ ン を ク リ ッ ク 。こ れは Acrobat DC で以下の場
所にあ り ます : 「ツール」 → 「PDF を編集」 を ク リ ッ ク 。
> メ ニ ュ ー項目 「PDFlib ブ ロ ッ ク」 → 「プ レ ビ ュ ー」 → 「プ レ ビ ュ ーの生成」。
> ブ ロ ッ ク ツールがア ク テ ィ ブの時は、 ど のブ ロ ッ ク も ない所を右 ク リ ッ ク すれば、 コ
ン テ キ ス ト メ ニ ュ ーに項目 「プ レ ビ ュ ーの生成」 と 「プ レ ビ ュ ー設定 ...」 が現れます。

プ レ ビ ュ ーは、 デ ィ ス ク 上の PDF フ ァ イ ルに基づいて作成 さ れます。 Acrobat 上で変更を


行な っ ていた場合には、 ブ ロ ッ ク PDF を 「フ ァ イル」 → 「上書き保存」 ま たは 「フ ァ イ

392 第 13 章 : PPS と PDFlib Block Plugin


図 13.3
図 13.1 の文書のプ レ
ビ ュ ー PDF。 ブ ロ ッ
ク情報レ イヤー と 注
釈を内容 と し て持っ
ています。

ル」 → 「名前を付けて保存 ...」 を用いてデ ィ ス ク に保存 し ては じ めて、 その変更はプ レ


ビ ュ ーに反映 さ れます。 変更を受けたブ ロ ッ ク は、 ブ ロ ッ ク 名の後にア ス タ リ ス ク が付い
てい る こ と で識別で き ます。 プ レ ビ ュ ー作成前にブ ロ ッ ク PDF が自動保存 さ れ る よ う プ
レ ビ ュ ー機能を構成す る こ と も 可能です。 そ う すれば、 対話的に行な っ た変更が確実に、
ただちにプ レ ビ ュ ー内で反映 さ れます。

プ レ ビ ュ ー を構成 ブ ロ ッ ク プ レ ビ ュ ーの生成 と 、 その基礎を なす PPS の動作について、


い く つかの性質を、 「PDFlib ブ ロ ッ ク」 → 「プ レ ビ ュ ー」 → 「プ レ ビ ュ ー設定 ...」 で構成
で き ます :
> 現在のページ をプ レ ビ ュ ーす る か、 それ と も 文書全体をプ レ ビ ュ ーす る か。
> 生成 さ れ る プ レ ビ ュ ー文書の出力デ ィ レ ク ト リ ー。
> ブ ロ ッ ク PDF を プ レ ビ ュ ー作成前に自動保存。
> ブ ロ ッ ク 情報レ イ ヤー と 注釈を追加。
> 生成 さ れ る 出力へブ ロ ッ ク 群を コ ピー。

13.5 ブ ロ ッ ク を Acrobat で プ レ ビ ュ ー 393


図 13.4 ブ ロ ッ クのプ レ ビ ュ ーを構成

> 「ブ ロ ッ ク PDF の PDF/A か PDF/UA か PDF/X ス テー タ ス を転写」: こ れ ら の規格では、レ イ


ヤー と 注釈の使用は制限 さ れてい ますので、 「ブ ロ ッ ク情報レ イ ヤー と 注釈を追加」 オ
プシ ョ ン と こ のオプシ ョ ンは同時には使え ません。
> 「ブ ロ ッ ク を プ レ ビ ュ ー フ ァ イルへ コ ピー」 を使 う と 、 流 し 込みの際、 生成 さ れ る プ レ
ビ ュ ーへ PDF ブ ロ ッ ク 群を コ ピーで き ます。 ブ ロ ッ ク への流 し 込みが成功 し たか否か
にかかわ ら ず、 すべてのブ ロ ッ ク が コ ピー さ れます。
> 「高度な PPS オプ シ ョ ン」ダ イ ア ロ グ を使 う と 、PPS の関数のオプシ ョ ン リ ス ト を PPS の
API に従っ て追加指定で き ます。 た と えば、 ブ ロ ッ ク への流 し 込みに使 う フ ォ ン ト や画
像が位置 し てい る デ ィ レ ク ト リ ーを PDF_set_option( ) の searchpath オプシ ョ ン を用い
て指定で き ます。 こ の高度なオプシ ョ ン を指定す る 際には、 PPS の コ ー ド の開発者 と
連携 し て行 う こ と を推奨 し ます。

ブ ロ ッ ク の順序 文書が Acrobat の 「別名で保存 ...」 で保存 さ れ る 際には、 そのブ ロ ッ ク


群は、 そのブ ロ ッ ク 名に従っ てアルフ ァ ベ ッ ト 順に並べ替え さ れます。 ブ ロ ッ ク 群がプ レ
ビ ュ ーに よ っ て処理 さ れ る 順序 も 、 pCOS に よ っ て報告 さ れ る 順序 も 、 こ れ と 同 じ です。
と はいえ、 各種アプ リ ケーシ ョ ンでは通常、 ブ ロ ッ ク への流 し 込みを、 その名称に基づい
て行い ますので (フ ァ イ ル内での格納順に よ っ てではな く )、 PDF 文書内での順序が問題
と な る こ と は通常あ り ません。

プ レ ビ ュ ーで提供 さ れる情報 生成 さ れ る プ レ ビ ュ ー文書には、 元のページ内容 (背景)


と 、 流 し 込みが行われたブ ロ ッ ク のほかに、 さ ま ざ ま な情報 も 含ま れ る こ と があ り ます。
こ の情報は、 ブ ロ ッ ク や PPS 構成のチ ェ ッ ク や改善に役立つ も のです。 デフ ォ ル ト 内容を
持つア ク テ ィ ブなブ ロ ッ ク それぞれについて、 以下のア イ テ ムが生成 さ れます :
> エ ラ ーマー カ ー : 流 し 込みが成功 し なか っ たブ ロ ッ ク は、 打ち消 し 線の付いた長方形
と し て視覚化 さ れてい ま すので、 容易に識別で き ます。 エ ラ ーマーカーは、 ブ ロ ッ ク
が処理で き なか っ た と き には必ず作成 さ れます。
> し お り : ブ ロ ッ ク の処理結果は し お り に ま と め ら れ ます。 こ の し お り は、 ページ番号
と ブ ロ ッ ク の種類に従っ て、 かつエ ラ ーが起 き た と き はエ ラ ーに も 従っ て、 構造化 さ
れてい ます。 し お り は 「表示」 → 「表示切 り 替え」 → 「ナビゲーシ ョ ンパネル」 → 「 し
お り 」 (Acrobat X/XI/DC) で表示で き ます。 し お り は必ず作成 さ れます。
> 注釈 : 処理 さ れたブ ロ ッ ク ご と に、 ブ ロ ッ ク 内容その も のに加え て、 ページ上に注釈
が作成 さ れます。 こ の注釈の長方形は、元のブ ロ ッ ク の枠を視覚化 し てい ます (デフ ォ

394 第 13 章 : PPS と PDFlib Block Plugin


ル ト 内容 と 流 し 込みモー ド に よ っ ては、 こ れはブ ロ ッ ク 内容の枠 と は異な る 場合があ
り ます)。 こ の注釈の中にはブ ロ ッ ク の名前が入っ てお り 、 ブ ロ ッ ク への流 し 込みがで
き なか っ た と き にはエ ラ ー メ ッ セージ も 入っ てい ます。 注釈はデフ ォ ル ト で生成 さ れ
ますが、 プ レ ビ ュ ーの構成で無効化す る こ と も で き ます。 PDF/A-1 ・ PDF/X 規格では
注釈の使用は制限 さ れてい ますので、 「ブ ロ ッ ク PDF の PDF/A か PDF/UA か PDF/X ス
テー タ ス を転写」 オプシ ョ ン を有効にす る と 、 注釈は生成 さ れません。
> レ イ ヤー : ページの内容は、 分析 と デバ ッ グが容易にな る よ う 、 複数の レ イ ヤーに分
けて配置 さ れます。 ページ背景 (すなわち元のページの内容)、 ブ ロ ッ ク の種類毎、 流
し 込みがで き なか っ たエ ラ ーブ ロ ッ ク 、 ブ ロ ッ ク 情報を持っ た注釈について、 それぞ
れ別々の レ イ ヤーが作成 さ れ ます。 空の レ イ ヤーは生成 さ れ ません (エ ラ ーが何 も 起
き なか っ た場合な ど)。 レ イ ヤーの一覧を 「表示」 → 「ナビゲーシ ョ ンパネル」 → 「レ
イ ヤー」 で表示で き ま す。 デフ ォ ル ト では、 ページのすべての レ イ ヤーが表示 さ れ ま
す。 いずれかの レ イ ヤーの内容を見え な く す る には、 レ イ ヤー名の左にあ る 眼のア イ
コ ン を ク リ ッ ク し ます。 レ イ ヤーの生成は、 プ レ ビ ュ ーの構成で無効化す る こ と も 可
能です。 PDF/A-1 ・ PDF/X-3 規格では レ イ ヤーの使用は制限 さ れてい ますので、 「ブ
ロ ッ ク PDF の PDF/A か PDF/UA か PDF/X ス テー タ ス を転写」 オプシ ョ ン を有効にす る
と 、 レ イ ヤーは生成 さ れません。

PDF/A か PDF/UA か PDF/X ス テー タ ス を転写 「ブ ロ ッ ク PDF の PDF/A か PDF/UA か PDF/


X ス テー タ ス を転写」 構成は、 こ れ ら の規格に従っ た PDF 出力を生成す る 必要があ る と き
に有用です。 転写モー ド は、 入力が以下のいずれかの規格に準拠 し てい る と き に有効にで
き ます :
PDF/A-1a:2005, PDF/A-1b:2005
PDF/A-2a, PDF/A-2b, PDF/A-2u
PDF/A-3a, PDF/A-3b, PDF/A-3u

PDF/UA-1

PDF/X-3:2003
PDF/X-4, PDF/X-4p
PDF/X-5n

プ レ ビ ュ ーが転写モー ド で作成 さ れ る と き は、 PPS は、 ブ ロ ッ ク PDF の以下の性質を、 生


成す る プ レ ビ ュ ーへ複製 し ます :
> PDF 規格識別。
> 出力 イ ン テ ン ト 条件。
> ページ寸法。 すべてのページ枠を含みます。
> タ グ付 き PDF : 文書言語 ( も し あれば)。
> XMP 文書 メ タ デー タ 。

規格準拠の PDF 文書を転写す る 際には、 すべてのブ ロ ッ ク 流 し 込み操作が、 それぞれの


規格に準拠 し てい る 必要があ り ま す。 た と えば、 出力 イ ン テ ン ト がな ければ、 ICC プ ロ
フ ァ イ ルのない RGB 画像は使え ません。 同様に、 使用フ ォ ン ト はすべて埋め込む必要が
あ り ます。 すべての要件の一覧を、 346 ページ 「12.2 PDF/A に よ る アーカ イ ビ ン グ」 と 、
358 ページ 「12.3 PDF/X に よ る 印刷出力」 に示 し てい ます。 PDF/A ま たは PDF/X 転写
モー ド でのブ ロ ッ ク 流 し 込み操作が、 選択 さ れてい る 規格に違反す る と き には (デフ ォ ル
ト 画像が RGB 色空間を用いてい る に も かかわ ら ず文書が適切な出力 イ ン テ ン ト を含んで
いない場合な ど) 、 エ ラ ー メ ッ セージが表示 さ れ、 プ レ ビ ュ ーは生成 さ れません。 こ れに
よ り ユーザーは作業フ ロ ーのかな り 早い時点で規格違反の危険に気づけ ます。

13.5 ブ ロ ッ ク を Acrobat で プ レ ビ ュ ー 395


デ フ ォ ル ト テキス ト に記号 フ ォ ン ト を使用 記号 フ ォ ン ト を 用い て い る ブ ロ ッ ク に デ
フ ォ ル ト テ キ ス ト を与え る 方法は 2 通 り あ り ます :
> 8 ビ ッ ト レ ガシー コ ー ド を使用す る 。こ の コ ー ド はた と えば Windows の文字コ ー ド 表ア
プ リ ケーシ ョ ンで表示 さ れます。 こ の 8 ビ ッ ト コ ー ド を defaulttext に与え ます。 その
ためには具体的には、 対応す る 8 ビ ッ ト キ ャ ラ ク タ ーを直接的に入力する か (た と え
ば Windows の文字 コ ー ド 表か ら コ ピー ・ ペース ト す る こ と に よ っ て)、 あ る いは数値の
エ ス ケープシーケ ン ス を用い ます。 こ の場合には、 「テキス ト 作成」 プ ロ パテ ィ グルー
プの charref プ ロ パテ ィ をデフ ォ ル ト 値 false の ま ま に し てお く 必要があ り 、 文字参照
は使用で き ません。 た と えば、 以下のデフ ォ ル ト テ キ ス ト は、 charref=false であれば、
記号フ ォ ン ト Wingdings の 「ス マ イ リ ー」 グ リ フ を生成 し ます :
J
\x4A
\112

> Unicode 値か、 フ ォ ン ト 内で用い ら れてい る グ リ フ名を使用す る 。 「テキス ト 作成」 プ


ロ パテ ィ グループの charref プ ロ パテ ィ を true に設定 し 、記号の文字参照かグ リ フ名参
照を与え ます (122 ページ 「5.4.2 文字参照」 を参照)。 た と えば、 以下のデフ ォ ル ト テ
キ ス ト は、 charref=true であれば、 記号フ ォ ン ト Wingdings の 「ス マ イ リ ー」 グ リ フ を
生成 し ます :
&#xF04A;
&.smileface;

ど ち ら のや り 方で も 、 ブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ グでは、 実際の記号グ リ フ ではな く 、


代替表現が表示 さ れ る こ と に留意 し て く だ さ い。

396 第 13 章 : PPS と PDFlib Block Plugin


13.6 PPS で ブ ロ ッ ク に流 し 込み
PPS でブ ロ ッ ク に流 し 込みを行 う には、 まずブ ロ ッ ク を含むページ を、PDF_fit_pdi_page( )
関数で出力ページ上に貼 り 付け る 必要が あ り ま す。 ページ を貼 り 付け た後、 その上のブ
ロ ッ ク へ PDF_fill_*block( ) 関数群で流 し 込みを行 う こ と がで き ます。

簡単な例 : 可変テキス ト を テ ン プ レ ー ト に追加 PDF テ ンプ レー ト への動的テ キ ス ト の


追加は、 非常に頻繁に必要 と な る 動作です。 以下の コ ー ド 断片は、 入力 PDF 文書 (テ ン
プ レー ト 、 ブ ロ ッ ク コ ン テナ) の中のページ を開 き 、 それを出力ページ上に配置 し 、 そ し
て firstname と い う テ キ ス ト ブ ロ ッ ク に可変テ キ ス ト を入れ込んでい ます :
doc = p.open_pdi_document(filename, "");
if (doc == -1)
throw new Exception("エラー : " + p.get_errmsg());

page = p.open_pdi_page(doc, pageno, "");


if (page == -1)
throw new Exception("エラー : " + p.get_errmsg());

p.begin_page_ext(width, height, "");


/* 取り込んだページを貼り付け */
p.fit_pdi_page(page, 0.0, 0.0, "");

/* 貼り付けたページ上のブロック1個へ流し込み */
p.fill_textblock(page, "firstname", "Serge", "encoding=winansi");

p.close_pdi_page(page);
p.end_page_ext("");
p.close_pdi_document(doc);

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の blocks/starter_block ト ピ ッ ク にあ り ます。

ブ ロ ッ ク のプ ロパテ ィ を オーバー ラ イ ド 場合に よ っ ては、 プ ロ グ ラ マーが、 ブ ロ ッ ク


の定義が与え てい る プ ロ パテ ィ 群を一部だけ採用 し 、その他のプ ロ パテ ィ を カ ス タ ムの値
でオーバー ラ イ ド し たい こ と があ り ます。 こ れは さ ま ざ ま な場合に有用です :
> 業務上の要請で特定のオーバー ラ イ ド が必要 と 判断 さ れ る 場合に対応。
> 画像・PDF ページの拡縮倍率を、ブ ロ ッ ク 定義か ら 採 ら ずに、アプ リ ケーシ ョ ンで算出。
> ブ ロ ッ ク の座標を プ ロ グ ラ ム で変え る 。 生成 し たい請求書のデー タ 項目数が一定でな
い場合な ど。
> 別々の ス ポ ッ ト カ ラ ー名を与え る こ と も 可能。 プ リ ン ト サービ ス業務で、 顧客ご と の
要請に合わせ る ため。

プ ロ パテ ィ を オーバー ラ イ ド す る には、 PDF_fill_*block( ) 関数群のオプシ ョ ン リ ス ト にプ


ロ パテ ィ の名前 と 値を与え ます。 例 :
p.fill_textblock(page, "firstname", "Serge", "fontsize=12");

こ れは、 ブ ロ ッ ク の内部の fontsize プ ロ パテ ィ を、 与え た値 12 でオーバー ラ イ ド し ます。


ほ と ん どすべてのプ ロ パテ ィ 名を、 オプシ ョ ン と し て用い る こ と が可能です。
プ ロ パテ ィ のオーバー ラ イ ド は、それぞれの関数呼び出 し にのみ適用 さ れます。ブ ロ ッ
ク 定義内に保持 さ れ る わけではあ り ません。

13.6 PPS で ブ ロ ッ ク に流 し 込み 397


テキス ト フ ロ ーブ ロ ッ ク を流 し 込み と 同時に移動 さ せる テ キ ス ト フ ロ ーブ ロ ッ ク はサ
イ ズが固定なので、 そのテ キ ス ト 内容が変わ る と そ ぐ わない場合があ り ます。 テ キ ス ト が
わずか し かない と き には、 2 つのブ ロ ッ ク の間にア キが生 じ て し ま う か も し れません。 テ
キ ス ト が多すぎ る 場合には、 そのブ ロ ッ ク の長方形に収ま り き ら ない こ と も あ り え ます。
その よ う な場合には、テ キ ス ト フ ロ ーの流 し 込みの結果を ク エ リ ー し て次のブ ロ ッ ク の位
置を調整す る こ と が可能です :
> デフ ォ ル ト の fitmethod は auto ですので、テ キ ス ト がブ ロ ッ ク の長方形にむ り や り はめ
込 ま れ ま す。 テ キ ス ト が 多 い 時 に ブ ロ ッ ク か ら あ ふれ て も よ い こ と に す る に は、
fitmethod を nofit に設定す る 必要があ り ます。 こ れを指定する には、 デザ イ ン時にブ
ロ ッ ク テ ン プ レ ー ト 内で ブ ロ ッ ク プ ロ パ テ ィ で指定す る か、 PDF_fill_textblock( ) に
fitmethod オプシ ョ ン を与え ます。
> PDF_fill_textblock( ) にダ ミ ーオプシ ョ ン textflowhandle=-1(PHP では textflowhandle=0)
を与え る と 、 こ の メ ソ ッ ド は、 ブ ロ ッ ク の内容のテ キ ス ト フ ロ ーハン ド ルを返 し ます。
> 返 さ れた テ キ ス ト フ ロ ーハン ド ルを PDF_info_textflow( ) に与え る こ と に よ っ て、 キー
ワー ド textendy を用いてテ キ ス ト の終点を ク エ リ ー し ます。
> PDF_pcos_get_number( ) と pCOS パス pages[ ..]/blocks/<blockname>/Rect[1] を用いてブ
ロ ッ ク の下辺の位置を ク エ リ ー し ます。
> こ の 2 つの値の差を と り ます。こ のオ フ セ ッ ト が正な ら 、テ キ ス ト フ ロ ーがブ ロ ッ ク を
満た し き ら なか っ た と い う こ と です。 負な ら 、 テ キ ス ト フ ロ ーがブ ロ ッ ク か ら あふれ
たわけです。 いずれの場合 も 、 次のブ ロ ッ ク を、 こ のオ フ セ ッ ト の分だけ上か下へ動
かせば よ いのです。 こ れを実現す る には、 PDF_fill_textblock( ) の refpoint オプシ ョ ンで
Rect プ ロ パテ ィ を オーバー ラ イ ド し ます。 こ のオプシ ョ ンでは絶対座標が必要ですか
ら 、 ブ ロ ッ ク の縦位置を ク エ リ ーす る 必要があ り (前の手順を参照)、 そ し て元の位置
と オ フ セ ッ ト の和を refpoint オプシ ョ ンに与え る 必要があ り ます。
> こ の方式は、 任意の数のテ キ ス ト フ ロ ーブ ロ ッ ク に対 し て も 、 各ブ ロ ッ ク のオ フ セ ッ
ト を累積 さ せ る こ と に よ っ て、 適用 し てゆ く こ と がで き ます。 各ブ ロ ッ ク の内容に応
じ て、 その次のブ ロ ッ ク を、 上か下へ、 適切な量だけ動か し てい き ます。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが starter_block サン プルにあ り ます。

流 し 込んだ ブ ロ ッ ク の上に取 り 込んだページ を配置 取 り 込んだページは、 ど のブ ロ ッ


ク 流 し 込み関数を使 う よ り も 前に、 出力ページに配置 し てお く 必要があ り ます。 と い う こ
と は元ページは通常、 ブ ロ ッ ク 内容 よ り も 下層に配置 さ れ る こ と にな り ます。 し か し 場合
に よ っ ては、流 し 込みが行われたブ ロ ッ ク よ り も 上層に元ページ を配置 し たい こ と も あ る
で し ょ う 。 こ れを実現す る には、 ページ をい っ たん PDF_fit_pdi_page( ) の blind オプシ ョ
ン を用いて貼 り 付け る こ と に よ り 、そのページのブ ロ ッ ク と その位置を PPS に知 ら せてお
き 、 ブ ロ ッ ク への流 し 込みが済んだ後にページ を再び貼 り 付け る こ と に よ り 、 実際にペー
ジ内容を表示 さ せます :
/* ブロックを用意するためにページをblindモードで配置してページを見えなくする */
p.fit_pdi_page(page, 0.0, 0.0, "blind");

/* ブロックへ流し込み */
p.fill_textblock(page, "firstname", "Serge", "encoding=winansi");
/* ... いろいろなブロックへ流し込み ... */

/* ページを再度配置、今度は見えるように */
p.fit_pdi_page(page, 0.0, 0.0, "");

398 第 13 章 : PPS と PDFlib Block Plugin


ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の blocks/block_below_contents ト ピ ッ ク にあ り ま
す。

ブ ロ ッ ク へ流 し 込む際に コ ン テ ナページ を無視 取 り 込んだブ ロ ッ ク は、 そのブ ロ ッ ク


の背景のページ内容を一切参照せずに、 プ レー ス ホルダー と し て使っ て も よ いで し ょ う 。
ブ ロ ッ ク を持つ コ ン テナページ を ブ ラ イ ン ド モー ド で、 すなわち PDF_fit_pdi_page( ) で
blind オプシ ョ ン を指定 し て、 1 個ない し 複数のページ上に貼 り 付けた う えで、 ブ ロ ッ ク へ
の流 し 込みを行 う と い う 方法です。 こ う すれば、 出力ページ上に コ ン テナページ を貼 り 付
け る こ と な く 、 ブ ロ ッ ク やそのプ ロ パテ ィ の利点を活用する こ と がで き 、 ま た、 ブ ロ ッ ク
を複数のページ上へ (ま たは同一出力ページ上へ も ) 複製する こ と が可能にな り ます。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の blocks/duplicate_block ト ピ ッ ク にあ り ます。

テキス ト フ ロ ーブ ロ ッ ク を連結 テ キ ス ト フ ロ ーブ ロ ッ ク は、 前のブ ロ ッ ク か ら あふれ


たテ キ ス ト が次のブ ロ ッ ク に入 る よ う 、 連結す る こ と が可能です。 た と えば、 長い可変テ
キ ス ト があ っ て、 別のページへ続かせ る 必要が想定 さ れ る 場合、 2 個のブ ロ ッ ク を連結 し
ておけば、 1 個目のブ ロ ッ ク がいっぱいにな っ て も 、 残 り は 2 個目のブ ロ ッ ク へ流 し 込ま
れます。
PPS は、PDF_fill_textblock( ) と ブ ロ ッ ク プ ロ パテ ィ に与え ら れた テ キ ス ト か ら 内部的に
1 つのテ キ ス ト フ ロ ーを生成 し ます。 連結 さ れていないブ ロ ッ ク の場合には、 こ のテ キ ス
ト フ ロ ーはそのブ ロ ッ ク の中に配置 さ れ、 そのテ キ ス ト フ ロ ーハン ド ルは呼び出 し が終
わっ た時点で削除 さ れ、 あふれたテ キ ス ト は失われます。
連結 さ れた テ キ ス ト フ ロ ーの場合には、 最初のブ ロ ッ ク へ流 し 込んだ後に余っ てい る
あふれテ キ ス ト を、 その次のブ ロ ッ ク へ流 し 込む こ と がで き ます。 最初のテ キ ス ト フ ロ ー
の余 り がブ ロ ッ ク 内容 と し て使われ、 新たなテ キ ス ト フ ロ ーは生成 さ れません。 こ のテ キ
ス ト フ ロ ーブ ロ ッ ク の連結は以下の よ う に動作 し ます :
> 連結 さ れたテ キ ス ト ブ ロ ッ ク チ ェーンの う ちの最初の PDF_fill_textblock( ) を呼び出す
際に、 textflowhandle オプシ ョ ンに値 -1 (PHP の場合 : 0) を与え る 必要があ り ます。
PDF_fill_textblock( ) は内部的に生成 さ れたテ キ ス ト フ ロ ーハン ド ルを返 し ますので、こ
れを アプ リ ケーシ ョ ン側で保持 し てお く 必要があ り ます。
> 次に PDF_fill_textblock( ) を呼び出す際に、 前段で返 さ れた テ キ ス ト フ ロ ーハン ド ルを
textflowhandle オプシ ョ ンに与え る こ と がで き ます ( こ の時 text 引数にテ キ ス ト を与
えて も 無視 さ れ る ので空にす る べ き です)。 ブ ロ ッ ク へ、 テ キ ス ト フ ロ ーの余 り が流 し
込まれます。
> こ の処理を、 さ ら な る テ キ ス ト フ ロ ーブ ロ ッ ク 群に対 し て繰 り 返す こ と がで き ます。
> 返 さ れたテ キ ス ト フ ロ ーハン ド ルを PDF_info_textflow( ) に与えればブ ロ ッ ク 流 し 込み
の結果を知 る こ と がで き ます。 終了状況やテ キ ス ト の終了位置な ど がわか り ます。

なお、 fitmethod プ ロ パテ ィ は clip に設定す る 必要があ り ます (textflowhandle を与え て


い る 場合には こ れがデフ ォ ル ト です) 。 テ キ ス ト フ ロ ーブ ロ ッ ク を連結す る 基本的な コ ー
ド 断片は以下の よ う にな り ます :
p.fit_pdi_page(page, 0.0, 0.0, "");
tf = -1;

for (i = 0; i < blockcount; i++)


{
String optlist = "encoding=winansi textflowhandle=" + tf;
int reason;
tf = p.fill_textblock(page, blocknames[i], text, optlist);

13.6 PPS で ブ ロ ッ ク に流 し 込み 399


text = null;

if (tf == -1)
break;

/* いちばん最近のfit_textflow()呼び出しの結果をチェック */
reason = (int) p.info_textflow(tf, "returnreason");
result = p.get_string(reason, "");

/* テキストが全部配置されたならループを抜ける */
if (result.equals("_stop"))
{
p.delete_textflow(tf);
break;
}
}

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の blocks/linked_textblocks ト ピ ッ ク にあ り ます。

ブ ロ ッ ク の流 し 込み順序 ブ ロ ッ ク 関数群 PDF_fill_*block( ) は、 プ ロ パテ ィ と ブ ロ ッ ク 内


容を、 以下の順序で処理 し ます :
> 背景 :backgroundcolor プ ロ パテ ィ が存在 し 、None 以外の色空間キーワ ー ド を持っ てい
る と き は、 指定 さ れた色でブ ロ ッ ク 領域が塗 ら れます。
> 枠線 : bordercolor プ ロ パテ ィ が存在 し 、 None 以外の色空間キーワ ー ド を持っ てい る と
き は、 指定 さ れた色 と 線幅でブ ロ ッ ク の枠が描線 さ れます。
> 内容 : 与え ら れたブ ロ ッ ク 内容 と 、 bordercolor ・ linewidth 以外のすべてのプ ロ パテ ィ
が処理 さ れます。
> テ キ ス ト 行 ・ テ キ ス ト フ ロ ーブ ロ ッ ク : テ キ ス ト も デフ ォ ル ト テ キ ス ト も 与え ら れて
いない と き は、 何 も 出力 さ れません。 背景色やブ ロ ッ ク の枠線 も あ り ません。

ネ ス ト さ れた ブ ロ ッ ク ブ ロ ッ ク へ流 し 込みを行 う 前には、 そのブ ロ ッ ク を含むページ


を出力ページ上に まず貼 り 付け る 必要があ り ます (そ う でない と 、 ページ を拡縮 ・ 回転 ・
平行移動 し た後のブ ロ ッ ク の位置を PPS が知 り え ないため)。 ページ をブ ロ ッ ク の コ ン テ
ナ と し てのみ使っ てお り 、 静的内容を新ページへ コ ピー し な く て よ い場合には、 取 り 込ん
だページ を、 blind オプシ ョ ン を用いて貼 り 付け る こ と がで き ます。
取 り 込んだページ を、 ど の よ う な方法で出力ページ上に貼 り 付けて も 、 ブ ロ ッ ク への
流 し 込みは行 う こ と がで き ます :
> ページ を PDF_fit_pdi_page( ) で直接貼 り 付け。
> ページ を テーブルセル内に PDF_fit_table( ) で間接的に貼 り 付け。
> ページ を他の PDF ブ ロ ッ ク の内容 と し て PDF_fill_pdfblock( ) で貼 り 付け。

こ の 3 番目の方法、 すなわち PDF ブ ロ ッ ク へ、 ブ ロ ッ ク を含む他のページ を流 し 込む と


い う 方法を用い る と 、 ブ ロ ッ ク コ ン テナ を ネ ス ト す る こ と がで き ま す。 こ れを活用す る
と 、 面白い使い方を簡単に実装で き ます。 た と えば、 2 段階のブ ロ ッ ク 流 し 込み処理で、
組み付け と パー ソ ナ ラ イ ゼーシ ョ ンの両方を実装する こ と がで き ます :
> 第一層のブ ロ ッ ク コ ン テナページには、い く つかの大 き な PDF ブ ロ ッ ク を置き ます。こ
れ ら は、 印刷す る 紙の上の主要な領域を表 し てい ます。 PDF ブ ロ ッ ク の配置は、 想定
し てい る 紙の後工程を反映 し てい ます (折 り ・ 断裁な ど)。
> こ の第一層の PDF ブ ロ ッ ク それぞれへ、第二層の コ ン テナ PDF ページ を流 し 込みます。
こ の PDF ページには、 テ キ ス ト ・ 画像 ・ PDF ・ グ ラ フ ィ ッ ク の う ちのいずれかのブ ロ ッ

400 第 13 章 : PPS と PDFlib Block Plugin


ク を置いてお き 、 それ ら へ可変テ キ ス ト を流 し 込んでパー ソ ナ ラ イ ゼーシ ョ ン を行い
ます。

こ の方法でブ ロ ッ ク コ ン テナ を ネ ス ト で き ま す。 ブ ロ ッ ク のネ ス ト は何重で も 可能です


が、 三重以上のネ ス ト が必要にな る こ と は まれで し ょ う 。
こ の第二層のブ ロ ッ ク コ ン テナ (レ タ ーのテ ン プ レー ト ページ な ど) は、 それぞれの
組み付けページで同 じ にす る こ と も で き ます し 、 別の も のにす る こ と も で き ます。 も し 同
じ に し た場合には、 ま ず レ タ ーテ ン プ レ ー ト 上のブ ロ ッ ク 群への流 し 込みを行な っ てか
ら 、 その レ タ ーテ ン プ レー ト 自体を次の第一層ブ ロ ッ ク 内に貼 り 付け る 必要があ り ます。
なぜな ら 、 PPS はつねに、 テ ンプ レー ト ページが も っ と も 最近に配置 さ れた位置を用い る
か ら です。

ク ッ ク ブ ッ ク 完全な コ ー ド サン プルがク ッ ク ブ ッ ク の blocks/nested_blocks ト ピ ッ ク にあ り ます。

ブ ロ ッ ク の座標 ブ ロ ッ ク の長方形の座標は、 PDF のデフ ォ ル ト 座標系を参照 し てい ま


す。ブ ロ ッ ク を含んだページ を PPS で出力ページに配置す る と き には、PDF_fit_pdi_page( )
に対 し てい く つかの位置付け ・ 拡縮オプシ ョ ン を与え る こ と がで き ま す。 こ れ ら のオプ
シ ョ ンは、 そのブ ロ ッ ク が処理 さ れ る 際に考慮 さ れます。 こ れを利用す る と 、 1 つのテ ン
プ レー ト ページ を出力ページ上に何度で も 配置 し て、そのたびにそのブ ロ ッ ク 群へデー タ
を流 し 込む こ と がで き ます。 た と えば 1 枚の組み付け紙上に、 1 つの名刺テ ンプ レー ト を
4 回配置す る と い っ た こ と が可能です。 ブ ロ ッ ク 関数群は、 座標系の変換を正 し く 行い、
すべてのブ ロ ッ ク に対 し て、 それがページ上に配置 さ れ る たびに、 正 し く テ キ ス ト を配置
し ま す。 ク ラ イ ア ン ト に求め ら れ る のはただ、 ページ を配置 し て、 そ し て その配置 し た
ページ上のすべてのブ ロ ッ ク を処理す る こ と だけです。 以後はそのページ を、 出力ページ
上の他の場所に配置 し た う えで、その新 し い場所に対 し て さ ら にブ ロ ッ ク 処理操作を行 う
こ と がで き 、 こ れを繰 り 返 し てい く こ と が可能です。
Block Plugin におけ る ブ ロ ッ ク 座標の表示の さ れ方は、 PDF フ ァ イ ル内に格納 さ れてい
る も の と は異な っ てい ます。 プ ラ グ イ ンでは Acrobat の方式を用いて、 座標の原点をペー
ジの左上隅に置いてい ますが、 内部座標 (ブ ロ ッ ク 内に格納 さ れてい る も の) では PDF
の方式を用いて、 座標の原点をページの左下隅に置いてい る ためです。 プ ロ パテ ィ ダ イ ア
ロ グの座標表示は、 Acrobat で指定 さ れてい る 単位に も 従い ます (382 ページ 「ブ ロ ッ ク
のサ イ ズ と 位置」 参照)。

ブ ロ ッ ク プ ロパテ ィ で スポ ッ ト カ ラ ー ブ ロ ッ ク プ ロ パテ ィ で特色 (ス ポ ッ ト カ ラ ー) を
使 う には、 「...」 を ク リ ッ ク すれば、 すべての HKS ・ Pantone ス ポ ッ ト カ ラ ーの一覧を表示
で き ます。 こ れ ら のカ ラ ー名は PPS に内蔵 さ れてお り 、 こ と さ ら 準備な し に使用で き ま
す。 カ ス タ ム ス ポ ッ ト カ ラ ーに対 し ては、 Block Plugin で代替色を定義する こ と が可能で
す。ブ ロ ッ ク プ ロ パテ ィ で代替色を指定 し ていない と き は、PPS アプ リ ケーシ ョ ン で PDF_
makespotcolor( ) か然 る べ き カ ラ ーオプシ ョ ン リ ス ト を用いて カ ス タ ム ス ポ ッ ト カ ラ ーを
あ ら か じ め定義 し てお く 必要があ り ます。そ う でない と ブ ロ ッ ク への流 し 込みは失敗 し ま
す。

13.6 PPS で ブ ロ ッ ク に流 し 込み 401


13.7 ブ ロ ッ ク のプ ロパテ ィ
PPS と Block Plugin には、 すべての種類のブ ロ ッ ク に適用で き る 一般プ ロ パテ ィ 群 と 、 ブ
ロ ッ ク の種類 「テキス ト 行」 ・ 「テキス ト フ ロー」 ・ 「画像」 ・ 「PDF」 ・ 「グ ラ フ ィ ッ ク」 にそ
れぞれ特有のプ ロ パテ ィ 群が用意 さ れてい ます。
プ ロ パテ ィ は、 ハン ド ル と ア ク シ ョ ン リ ス ト 以外、 オプシ ョ ン リ ス ト と 同 じ デー タ 型
をサポー ト し てい ます。
ブ ロ ッ ク プ ロ パテ ィ の名前は一般に、 PDF_fit_textline( ) や PDF_fit_image( ) な ど API 関
数のオプシ ョ ン と 同 じ です (た と えば fitmethod や charspacing)。 その場合には動作は、
それぞれ対応す る オプシ ョ ンの説明に書いて あ る も の と ま っ た く 同 じ です。

13.7.1 管理プ ロパテ ィ


管理プ ロ パテ ィ 群はすべての種類のブ ロ ッ ク に適用 さ れます。 必須エン ト リ ー群は Block
Plugin に よ っ て自動生成 さ れます。 管理プ ロ パテ ィ の一覧を表 13.4 に示 し ます。

表 13.4 管理プ ロパテ ィ


キーワー ド と り う る値 ・ 解説
Description (文字列) ブ ロ ッ クの機能に関する、 人が読める説明。 エ ン コ ーデ ィ ングは PDFDocEncoding か
Unicode (後者の場合は先頭 BOM)。 こ のプ ロパテ ィ は、 ユーザーへの情報提供のためだけにあ り 、
PPS から は無視 さ れます。
Locked (論理値) true にする と 、 ブ ロ ッ ク と そのプ ロパテ ィ を Block Plugin で編集で き な く な り ます。 こ
のプ ロパテ ィ は PPS からは無視 さ れます。 デ フ ォ ル ト : false
Name (文字列、 必須) ブ ロ ッ クの名称。 こ のブ ロ ッ ク 名は、 ページ ご と に一意である必要があ り ます
が、 文書内では一意でな く て も かまいません。 3 種のキ ャ ラ ク タ ー [ ] / は、 ブ ロ ッ ク 名には使え
ません。 ブ ロ ッ ク 名は最長 125 文字です。
Subtype (キーワー ド 、 必須) ブ ロ ッ クの種類によ っ て、 Text ・ Image ・ PDF・Graphics のいずれか。 なお、
テキス ト 行ブ ロ ッ ク と テキス ト フ ローブ ロ ッ クはど ち ら も Subtype が Text にな り 、 両者は
textflow プ ロパテ ィ で区別 さ れます。
textflow (論理値) 一行処理か複数行処理かを制御。 こ のプ ロパテ ィ は、 Block Plugin のユーザー イ ン タ ー
フ ェ イ スでは表示 さ れず、 それぞれテキス ト 行ブ ロ ッ ク と テキス ト フ ローブ ロ ッ クへマ ッ プ さ れ
ます (デ フ ォ ル ト : false) :
false テキス ト 行ブ ロ ッ ク : テキス ト が一行で組まれ、 PDF_fit_textline( ) で処理 さ れます。
true テキス ト フ ローブ ロ ッ ク : テキス ト が複数行にわた る こ と がで き、 PDF_fit_textflow( ) で
処理 さ れます。 標準テキス ト プ ロパテ ィ 群のほかにテキス ト フ ロー関連プ ロパテ ィ 群 も
指定で き ます (表 13.9 参照)。
Type (キーワー ド 、 必須) つねに Block

402 第 13 章 : PPS と PDFlib Block Plugin


13.7.2 長方形プ ロパテ ィ
長方形プ ロ パテ ィ 群はすべての種類のブ ロ ッ ク に適用 さ れ、ブ ロ ッ ク の長方形本体の書式
を記述 し ます。 必須エン ト リ ー群は Block Plugin に よ っ て自動生成 さ れます。 長方形プ ロ
パテ ィ の一覧を表 13.5 に示 し ます。

表 13.5 長方形プ ロパテ ィ


キーワー ド と り う る値 ・ 解説
background- (色) このプ ロパテ ィ を指定 し て None 以外の色空間キーワー ド を与えると、 長方形が描かれ、 与
color えた色で塗ら れます。 既存のページ内容を覆い隠 し たい と き に有用です。 デ フ ォ ル ト : None
bordercolor (色) このプ ロパテ ィ を指定 し て None 以外の色空間キーワー ド を与えると、 長方形が描かれ、 与
えた色で描線 さ れます。 デ フ ォル ト : None

linewidth (float。 正の値で なければな ら ない) ブ ロ ッ クの長方形の描画に使用する線の描線幅。 bordercolor


設定時のみ有効です。 デ フ ォ ル ト : 1
Rect (長方形、 必須) ブ ロ ッ クの座標。 座標原点はページ左下隅。 ただ し Block Plugin では、 座標は
Acrobat の方式で、 すなわちページ左上隅を原点 と し て表 さ れます。 座標の単位は、 Acrobat では
その時点で選択 さ れている単位で表示 さ れますが、 PDF フ ァ イル内部ではつねにポ イ ン ト 単位で
格納 さ れています。
Status (キーワー ド ) PPS と ブ ロ ッ ク機能がブ ロ ッ ク を処理する方式を記述 (デ フ ォル ト : active) :
active ブ ロ ッ ク を そのプ ロパテ ィ に従っ て完全に処理。
ignore ブ ロ ッ ク を無視。
ignoredefault
defaulttext/image/pdf/graphics プ ロパテ ィ ・ オプ シ ョ ンが無視 さ れる、 すなわち可
変内容がない と き (特にプ レ ビ ュ ーで) ブ ロ ッ クが空のま まにな る点を除き、 active
と 同 じ 。 こ れは特に、 ブ ロ ッ クがプ レ ビ ュ ー生成のためのデ フ ォル ト 内容を持っ ている
か も し れないけれど も、 サーバーサイ ド で ブ ロ ッ クへ流 し 込みが行われる際にはそのブ
ロ ッ クのデ フ ォ ル ト 内容が用い ら れないよ う に し たい と き に有用です。 また、 ブ ロ ッ ク
を プ レ ビ ュ ーする際に も、 ブ ロ ッ ク プ ロパテ ィ から デ フ ォル ト 内容を削除する こ と な く
デ フ ォル ト 内容を無効化する ために用いる こ と がで き ます。
static 可変内容を配置 し ない。 ブ ロ ッ ク にデ フ ォ ル ト のテキス ト ・ 画像 ・ PDF ・ グ ラ フ ィ ッ ク
内容があれば、 それが用い られます。

13.7 ブ ロ ッ クのプ ロパテ ィ 403


13.7.3 書式プ ロパテ ィ
書式プ ロ パテ ィ 群は組版の詳細を指定 し ます :
> 透過書式プ ロ パテ ィ の一覧を表 13.6 に示 し ます。 こ れ ら はすべての種類のブ ロ ッ ク に
適用 さ れます。
> テ キ ス ト 書式プ ロ パテ ィ の一覧を表 13.7 に示 し ます。 こ れ ら はテ キ ス ト 行ブ ロ ッ ク と
テ キ ス ト フ ロ ーブ ロ ッ ク に適用 さ れます。

表 13.6 すべてのブ ロ ッ ク種別に対する透過書式プ ロパテ ィ


キーワー ド と り う る値 ・ 解説
blendmode (キーワー ド リ ス ト 。 PDF/A-1 モー ド で用い ら れる と きは値 Normal を持つ必要があ り ます) ブ レ
ン ド モー ド の名前 : None・Color・ColorDodge・ColorBurn・Darken・Difference・Exclusion・
HardLight・Hue・Lighten・Luminosity・Multiply・None・Normal・Overlay・Saturation・
Screen・SoftLight。 デ フ ォ ル ト : None

opacityfill (float。 PDF/A モー ド で用い ら れる と きは値 1 を持つ必要があ り ます) 塗 り 操作の不透明度を範囲


0 ~ 1 で表 し た もの。 値 0 は完全透過を意味 し 、 1 は完全不透過を意味 し ます。
opacitystroke (float。 PDF/A モー ド で用い ら れる と きは値 1 を持つ必要があ り ます) 描線操作の不透明度を範囲
0 ~ 1 で表 し た もの。 値 0 は完全透過を意味 し 、 1 は完全不透過を意味 し ます。

404 第 13 章 : PPS と PDFlib Block Plugin


表 13.7 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク に対する テキス ト 書式プ ロパテ ィ
キーワー ド と り う る値 ・ 解説
charspacing (float またはパーセ ン ト 値) 文字間隔。 パーセ ン ト 値は fontsize に対する割合。 デ フ ォル ト : 0

decoration- (論理値) true の場合、 underline ・ strikeout ・ overline オプ シ ョ ン で有効に さ れた テキス ト 装


above 飾がテキス ト の前面に描かれ、 そ う でなければテキス ト の背面に描かれます。 描画順序を変え る
と 、 装飾線の書式に影響を与え ます。 デ フ ォル ト : false

fillcolor (色) テキス ト の塗 り 色。 デ フ ォ ル ト : gray 0 (= 黒)


1
fontname (文字列) フ ォ ン ト の名前。 PDF_load_font( ) が求める もの と 同 じ です。 Block Plugin では、 シ ス テム
で利用可能な フ ォ ン ト の一覧が表示 さ れます。 ただ し こ う し た フ ォ ン ト 名は、 macOS ・ Windows ・
Unix シ ス テム間で互換 と は限 り ません。 fontname の先頭が 「@」 キ ャ ラ ク タ ーである場合は、 そ
のフ ォ ン ト は縦書き モー ド で適用 さ れます。 ブ ロ ッ ク に流 し 込みを行 う 際には、 PDF_fill_
textblock( ) に、 font オプ シ ョ ン を与え ていない限 り 、 テキス ト のエ ン コ ーデ ィ ング を オプ シ ョ ン
と し て与え る必要があ り ます。
fontsize1 (float) 文字のサイ ズをポ イ ン ト 単位で指定
horizscaling (float またはパーセ ン ト 値) テキス ト の横伸縮。 デ フ ォ ル ト : 100%
italicangle (float) テキス ト の斜体角度を度単位で指定。 デ フ ォル ト : 0
kerning (論理値) カ ーニ ングの動作。 デ フ ォ ル ト : false

overline (論理値) 上線のモー ド 。 デ フ ォ ル ト : false

shadow (複合) 影付き効果を生成 (デ フ ォル ト : 影な し )。 以下のサブ プ ロパテ ィ を使え ます :


fillcolor (色) 影の色。 デ フ ォル ト : {gray 0.8}
offset (float 2 個かパーセ ン ト 値 2 個の リ ス ト ) テキス ト の参照点か らの影のオ フ セ ッ ト を、
ユーザー座標で、 ま たは文字サイ ズに対するパーセ ン ト 値で表 し た もの。 デ フ ォ ル ト :
{5% -5%}
strikeout (論理値) 取 り 消 し 線のモー ド 。 デ フ ォ ル ト : false

strokecolor (色) テキス ト の描線色。 デ フ ォ ル ト : gray 0 (= 黒)


strokewidth (float ・ パーセ ン ト 値 ・ キーワー ド のいずれか。 textrendering が袋文字に設定 さ れている と きの
み意味を持ち ます) 袋文字の線幅 (ユーザー座標で、 または percentage に対するパーセ ン ト 値
で)。 キーワー ド auto、またはそれ と 等価な値 0 は、 内蔵のデ フ ォル ト を用います。 デ フ ォ ル ト :
auto

textrendering (整数) テキス ト 表現モー ド 。 Type 3 フ ォ ン ト では値 3 のみ意味を持ち ます (デ フ ォル ト : 0) :

0
P テキス ト を塗る 4 テキス ト を塗 り 、 ク リ ッ ピ ングパスに追加

1 テキス ト を描線 (袋文字) 5 テキス ト を描線 し 、 ク リ ッ ピ ングパスに追加

2
P テキス ト を塗っ て描線 6 テキス ト を塗っ て描線 し 、 ク リ ッ ピ ン グパスに追加

3 不可視テキス ト 7 テキス ト を ク リ ッ ピ ングパスに追加


(ブ ロ ッ ク では不可)
textrise (float またはパーセ ン ト 値) テキス ト の縦方向のオ フ セ ッ ト 。 パーセ ン ト 値は fontsize に対する
割合。 デ フ ォ ル ト : 0
underline (論理値) 下線のモー ド 。 デ フ ォ ル ト : false

13.7 ブ ロ ッ クのプ ロパテ ィ 405


表 13.7 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク に対する テキス ト 書式プ ロパテ ィ
キーワー ド と り う る値 ・ 解説
underline- (float ・ パーセ ン ト 値 ・ キーワー ド のいずれか) 下線テキス ト のベース ラ イ ンに対する描線の相対
position 位置。 パーセ ン ト 値は fontsize に対する割合。 デ フ ォル ト : auto

underline- (float ・ パーセ ン ト 値 ・ キーワー ド のいずれか) 下線テキス ト の線幅。 パーセ ン ト 値は fontsize に


width 対する割合。 デ フ ォ ル ト : auto

wordspacing (float またはパーセ ン ト 値) 単語間隔。 パーセ ン ト 値は fontsize に対する割合。 デ フ ォル ト : 0

1. こ のプ ロパテ ィ は、 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク では必須です。 Block Plugin は こ れを自動生成 し ます。

406 第 13 章 : PPS と PDFlib Block Plugin


13.7.4 テキス ト 作成プ ロパテ ィ
テ キ ス ト 作成プ ロ パテ ィ 群は、 テ キ ス ト 行 ・ テ キ ス ト フ ロ ーブ ロ ッ ク の前処理工程を指定
し ます。 テ キ ス ト 行 ・ テ キ ス ト フ ロ ーブ ロ ッ ク に適用 さ れ る テ キ ス ト 作成プ ロ パテ ィ の一
覧を表 13.8 に示 し ます。

表 13.8 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク に対する テキス ト 作成プ ロパテ ィ


キーワー ド と り う る値 ・ 解説
charref (論理値) true にする と 、 数値参照 ・ 文字参照 ・ グ リ フ 名参照の置き換えが行われます。 デ フ ォ ル
ト : グ ローバルな charref オプ シ ョ ン
escape- (論理値) true にする と 、 内容文字列 ・ ハイパーテキス ト 文字列 ・ 名前文字列内のエ スケープ シー
sequence ケ ン スの置き換えが行われます。 デ フ ォ ル ト : グローバルな escapesequence オプ シ ョ ン

features (キーワー ド の リ ス ト ) script ・ language オプ シ ョ ンに従 っ て、 OpenType フ ォ ン ト のどの タ イ ポ


グ ラ フ ィ ー機能を テキス ト に適用するかを指定。 フ ォ ン ト にない機能のキーワー ド は警告な く 無
視 さ れます。 以下のキーワー ド を使え ます :
_none フ ォ ン ト 内のどの機能 も適用 し ない。 例外 と し て、 vert 機能は novert キーワー ド を用
いて明示的に無効化する必要があ り ます。
<名前> 4文字のOpenType タ グ名を与え る と その機能が有効化 さ れます。 よ く 用い られる機能名
はliga ・ ital ・ tnum ・ smcp ・ swsh ・ zeroな ど です。 利用で き る機能の名前 と 説明の全一
覧を、 163ページ 「7.4.1 対応 し ているOpenTypeレ イ アウ ト 機能」 に示 し ています。
no<名前> 機能名の前に接尾辞noをつける と (noligaな ど) その機能が無効化 さ れます。
デ フ ォ ル ト : 横書き モー ド では _none。 縦書き モー ド では vert が自動的に適用 さ れます。
OpenType 機能対応を利用するには PDF_load_font( ) の readfeatures オプ シ ョ ンが必要です。

language (キーワー ド 。 script を与え ら れている場合にのみ意味を持ち ます) 指定 し た言語に従っ て テキス


ト を処理。 こ れは features ・ shaping オプ シ ョ ンに対 し て意味を持ち ます。 すべてのキーワー ド
の一覧を 171 ページ 「7.5.2 シ ェ ーピ ング処理を制御」 に示 し ています。 例 : ARA (ア ラ ビ ア語) ・
JAN (日本語) ・ HIN ( ヒ ンデ ィ ー語)。 デ フ ォル ト : _none (言語未定義)

script (キーワー ド 。 shaping=true の場合には必須) 指定 し た用字系に従っ て テキス ト を処理。 こ れは


features ・ shaping ・ advancedlinebreaking オプ シ ョ ンに対 し て意味を持ち ます。 最も よ く 使われ
る用字系のキーワー ド は以下の通 り です : _none (未定義の用字系) ・ latn ・ grek ・ cyrl ・ armn ・
hebr ・ arab ・ deva ・ beng ・ guru ・ gujr ・ orya ・ taml ・ thai ・ laoo ・ tibt ・ hang ・ kana ・ han。 キー
ワー ド _auto は、 テキス ト 内の大多数のキ ャ ラ ク タ ーが属する用字系を選択 し ますが、 ただ し
latn ・ _none は無視 さ れます。 キーワー ド の全一覧が 171 ページ 「7.5.2 シ ェ ーピ ング処理を制御」
にあ り ます。 デ フ ォ ル ト : _none
shaping (論理値) true にする と 、 テキス ト が script ・ language オプ シ ョ ンに従っ て整形 (シ ェ ーピ ング)
さ れます。 script オプ シ ョ ンの値を _none 以外にする必要があ り 、 かつ、 必要な シ ェ ーピ ン グ
テーブルがフ ォ ン ト 内で得 られる必要があ り ます。 デ フ ォル ト : false

13.7 ブ ロ ッ クのプ ロパテ ィ 407


13.7.5 テキス ト 組版プ ロパテ ィ
テ キ ス ト フ ロ ーブ ロ ッ ク にだけ使用で き る テ キ ス ト 組版プ ロ パテ ィ の一覧を表 13.9 に示
し ます。 ただ し stamp プ ロ パテ ィ だけはテ キ ス ト 行ブ ロ ッ ク に も 使用で き ます。 こ れ ら を
用いて、 テ キ ス ト フ ロ ー処理のための初期オプシ ョ ン リ ス ト を構築で き ます (PDF_create_
textflow( ) の optlist 引数に対応)。 テ キ ス ト フ ロ ーで用い る イ ン ラ イ ンオプシ ョ ン リ ス ト
は、 プ ラ グ イ ン では指定で き ず、 サーバー上で PDF_fill_textblock( ) に よ る ブ ロ ッ ク への流
し 込みの際に、 ま たはブ ロ ッ ク の defaulttext プ ロ パテ ィ 内で、 テ キ ス ト 内容の一部 と し
て与え る こ と がで き ます。

表 13.9 テキス ト 組版プ ロパテ ィ (主にテキス ト フ ローブ ロ ッ ク用)


キーワー ド と り う る値 ・ 解説
adjust- (キーワー ド ) minspacing ・ maxspacing オプ シ ョ ン で指定 し た制限の範囲内で単語間隔を詰めた り
method 拡げた り し て も テキス ト が行内に収ま り き ら ない時に行の調整に用いる方式 (デ フ ォ ル ト :
auto) :
auto 以下の方式を順に適用 : shrink ・ spread ・ nofit ・ split。
clip はめ込み枠の右端 (rightindent オプ シ ョ ン を考慮) から はみ出 し た部分を切 り 落 と す
点を除いて、 nofit と 同 じ 。
nofit 最後の単語を次行へ送る。 ただ し 、 残 さ れる (短い) 行が、 nofitlimit オプ シ ョ ン で
指定 さ れたパーセ ン ト 値よ り も短 く な ら ない場合に限 り ます。 均等配置の段落であ っ て
も、 若干がたついて見え る こ と があ り ます。
shrink 単語が行内に収ま ら ない と き、 shrinklimit の制限内で テキス ト を圧縮。 それで も収ま
ら なければ nofit 方式を適用。
split 最後の単語を次行へ送ら ずハイ フ ネーシ ョ ン を強制。 テキス ト フ ォ ン ト な らハイ フ ン
キ ャ ラ ク タ ーを挿入 し ますが、 記号フ ォ ン ト な ら挿入 し ません。
spread 最後の単語を次行へ送 り 、 残 さ れた (短い) 行を均等配置する よ う 単語内の文字間の間
隔を spreadlimit の制限内で拡張。 それで均等配置で き なければ nofit 方式を適用。

advanced- (論理値) 複雑用字系で必要 と さ れる高度な改行アルゴ リ ズムを適用 し ます。 これは タ イ語な ど、


linebreak 単語間の区切 り を空白キ ャ ラ ク タ ーを用いて示 さ ない用字系での改行に必須です。 locale ・
script オプ シ ョ ン に従います。 デ フ ォ ル ト : false
alignment (キーワー ド ) 段落内の行の書式を指定。 デ フ ォ ル ト : left。
left 左揃え (leftindent を始点 と し て)。
center 中央揃え (leftindent から rightindent ま での間で)。
right 右揃え (rightindent を終点 と し て)。
justify 両端揃え。

avoid- (論理値) true にする と 、 はめ込み枠先頭の空行が削除 さ れます。 デ フ ォ ル ト : false


emptybegin

fixedleading (論理値) true にする と 、 各行内で最初に見つか っ た行送 り 値を用います。 そ う で ないな ら、 行内


のすべての行送 り 値の う ちの最大値を用います。 デ フ ォル ト : false

hortab- (キーワー ド ) テキス ト 内の水平 タ ブの扱い。 算出位置がカ レ ン ト テキス ト 位置よ り 左の と きは、


method その タ ブは無視 さ れます (デ フ ォ ル ト : relative) :
relative hortabsize で指定 さ れた分、 位置を進めます。
typewriter hortabsize の次の倍数ま で位置を進めます。
ruler ruler オプ シ ョ ン内の n 番目の タ ブ値ま で位置を進めます。 こ こ で n は、 その行内でそ
れま でに見つかっ た タ ブの数です。 n が タ ブ位置の数を超え る分については、 relative
方式を適用 し ます。

408 第 13 章 : PPS と PDFlib Block Plugin


表 13.9 テキス ト 組版プ ロパテ ィ (主にテキス ト フ ローブ ロ ッ ク用)
キーワー ド と り う る値 ・ 解説
hortabsize (float またはパーセ ン ト 値) 水平 タ ブの幅1。 その解釈は hortabmethod オプ シ ョ ンに依存 し ます。
デ フ ォ ル ト : 7.5%
lastalignment (キーワー ド ) 段落内の最終行の書式。 alignment オプ シ ョ ンの全キーワー ド と 以下のキーワー ド
を使え ます (デ フ ォ ル ト : auto) :
auto alignment オプ シ ョ ンの値を使用、 ただ し それが justify な ら left を使用。

leading (float またはパーセ ン ト 値) テキス ト のベース ラ イ ン間の間隔を、 ユーザー座標で、 または文字サ


イ ズに対するパーセ ン ト 値で指定。 デ フ ォ ル ト : 100%
locale (キーワー ド ) advancedlinebreak=true の と き に用字系特有の改行方式で用い ら れる ロ ケール。
キーワー ド は、 以下の 1 個ない し 複数の構成要素から 成 り 、 オプ シ ョ ナルな構成要素は下線キ ャ
ラ ク タ ー 「_」 で区切ら れます (その文法は、 NLS/POSIX のロ ケール ID と は若干異な っ ていま
す) :
> (必須) ISO 639-2 (www.loc.gov/standards/iso639-2 を参照) に従っ た、小文字 2 文字ま たは 3 文
字の言語 コ ー ド 。 例 : en (英語) ・ de ( ド イ ツ語) ・ ja (日本語)。 これは language オプ シ ョ ン と
は異な っ ています。
> (オプ シ ョ ン) ISO 15924 に従っ た、 4 文字の用字系コ ー ド 。 例 : Hira (ひ らがな) ・ Hebr (ヘブ ラ
イ) ・ Arab (ア ラ ビ ア) ・ Thai ( タ イ)。
> (オプ シ ョ ン) ISO 3166 に従っ た、 大文字 2 文字の国コ ー ド 。 例 : DE ( ド イ ツ) ・ CH (ス イ ス) ・ GB
(イ ギ リ ス)。
ロ ケールを指定する こ と は、 高度な改行のために必須ではあ り ません : キーワー ド _none は、 ロ
ケール独自の処理が行われない こ と を指定 し ます。 デ フ ォル ト : _none。
例 : de_DE ・ en_US ・ en_GB

maxspacing (float またはパーセ ン ト 値) 単語間の最大間隔 ・ 最小間隔 (ユーザー座標で表すか、 空白キ ャ ラ ク


minspacing タ ーの幅に対するパーセ ン ト 値で指定)。 算出 さ れる単語間隔が、 与え られた値ま でに制限 さ れま
す (ただ し 、 wordspacing オプ シ ョ ンはなお加算 さ れます)。 デ フ ォル ト : minspacing=50%、
maxspacing=500%
minlinecount (整数) はめ込み枠の最終段落の最小行数。 こ れよ り 行が少ない と き には次のはめ込み枠内に配置
さ れます。 値 2 を用いる と 、 段落の中の 1 行だけがはめ込み枠末尾に配置 さ れる (「オー フ ァ ン」)
のを避け られます。 デ フ ォ ル ト : 1
nofitlimit (float またはパーセ ン ト 値) nofit 方式における行の長 さ の下限 (ユーザー座標で表すか、 はめ込
み枠の幅に対するパーセ ン ト 値で指定)。 デ フ ォル ト : 75%
parindent (float またはパーセ ン ト 値) 段落の先頭行の左イ ンデン ト 1。 leftindent に こ の値が加算 さ れま
す。 こ のオプ シ ョ ン を行内で指定する と 、 タ ブのよ う に動作 し ます。 デ フ ォル ト : 0
rightindent (float またはパーセ ン ト 値) 全テキス ト 行の右イ ンデン ト ・ 左イ ンデン ト 1。 leftindent が行内で
leftindent 指定 さ れた場合、 決定 さ れた位置がカ レ ン ト テキス ト 位置よ り 左の と きは、 こ のオプ シ ョ ンはカ
レ ン ト 行については無視 さ れます。 デ フ ォ ル ト : 0
ruler2 (float の リ ス ト 、 またはパーセ ン ト 値の リ ス ト ) hortabmethod=ruler に対する絶対 タ ブ位置の リ ス
ト 1。 こ の リ ス ト は、 非負エ ン ト リ ーを昇順で最大 32 個持て ます。 デ フ ォ ル ト : hortabsize の整
数倍
shrinklimit (パーセ ン ト 値) shrink 方式におけ る テキス ト 長体の下限。 算出 さ れる縮小率が、 与え ら れた値ま
でに制限 さ れます。 ただ し 、 horizscaling オプ シ ョ ンの値が乗算 さ れます。 デ フ ォ ル ト : 85%

spreadlimit (float またはパーセ ン ト 値) spread 方式における 2 文字間の間隔の上限 (ユーザー座標で表すか、


文字サイ ズに対するパーセ ン ト 値で指定)。 算出 さ れた文字間隔が、 charspacing オプ シ ョ ンの値
に加算 さ れます。 デ フ ォル ト : 0

13.7 ブ ロ ッ クのプ ロパテ ィ 409


表 13.9 テキス ト 組版プ ロパテ ィ (主にテキス ト フ ローブ ロ ッ ク用)
キーワー ド と り う る値 ・ 解説
stamp (キーワー ド 。 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク) こ のオプ シ ョ ン を使 う と 、 ブ ロ ッ ク長方形
内の対角線上にス タ ン プ を作成する こ と がで き ます。 ス タ ン プのテキス ト は可能な限 り 拡大 さ れ
て印字 さ れます。 ス タ ン プのテキス ト を枠内に配置する際には、 position ・ fitmethod ・
orientate (north ・ south のみ) オプ シ ョ ン に従います。 デ フ ォ ル ト : none。
ll2ur 左下隅から右上隅へ向か う 対角線上にス タ ン プが配置 さ れます。
ul2lr 左上隅から右下隅へ向か う 対角線上にス タ ン プが配置 さ れます。
none ス タ ン プは作成 さ れません。

tabalignchar (整数) タ ブの小数点揃えの整列位置に し たいキ ャ ラ ク タ ーの Unicode 値。 デ フ ォル ト : キ ャ ラ ク


タ ー 「.」 (U+002E)
tabalignment2 (キーワー ド の リ ス ト ) タ ブ位置の整列方式。 こ の リ ス ト 内の各エ ン ト リ ーはそれぞれ、 ruler オ
プ シ ョ ン内で、 その対応する エ ン ト リ ーの整列方式を定義 し ます (デ フ ォ ル ト : left) :
center テキス ト は タ ブ位置で中央揃え さ れます。
decimal 最初に現れる tabalignchar を タ ブ位置で左揃え さ れます。 tabalignchar が見つから な
い と きは右揃えが適用 さ れます。
left テキス ト は タ ブ位置で左揃え さ れます。
right テキス ト は タ ブ位置で右揃え さ れます。

1. ユーザー座標で、 ま たははめ込み枠の幅に対するパーセ ン ト 値で指定 し ます。


2. タ ブ設定は、 ブ ロ ッ ク プ ロパテ ィ ダ イ ア ロ グの「テキスト組版」グループの「hortabmethod=ruler におけるルーラータブ」
サブグループ で編集する こ と がで き ます。

410 第 13 章 : PPS と PDFlib Block Plugin


13.7.6 オ ブ ジ ェ ク ト はめ込みプ ロパテ ィ
はめ込みプ ロ パテ ィ 群は、 すべての種類のブ ロ ッ ク で利用で き ますが、 ただ し い く つかの
プ ロ パテ ィ は、 特定の種類のブ ロ ッ ク でのみ利用で き ます。 こ れ ら は、 ブ ロ ッ ク 内に内容
が配置 さ れ る 方法を制御 し ます :
> テ キ ス ト 行 ・ 画像 ・ PDF ・ グ ラ フ ィ ッ ク ブ ロ ッ ク で利用で き る はめ込みプ ロ パテ ィ の
一覧を表 13.10 に示 し ます。
> テ キ ス ト フ ロ ーブ ロ ッ ク で利用で き る はめ込みプ ロ パテ ィ の一覧を表 13.11 に示 し ま
す (主に縦方向のはめ込みに関す る も のです)。

オブ ジ ェ ク ト はめ込みア ル ゴ リ ズ ム は、 ブ ロ ッ ク 長方形 を はめ込み枠 と し て用い ま す。


fitmethod=clip の場合を除 き 、 切 り 落 と し は行われません。 ブ ロ ッ ク 内容がブ ロ ッ ク 長方
形か ら はみ出 さ ない よ う に し たい と き は、 fitmethod=nofit を避けて く だ さ い。

表 13.10 テキス ト 行 ・ 画像 ・ PDF ・ グ ラ フ ィ ッ ク ブ ロ ッ ク に対するはめ込みプ ロパテ ィ


キーワー ド と り う る値 ・ 解説
alignchar (Unichar ま たはキーワー ド 。 テキス ト 行ブ ロ ッ ク にのみ適用) 指定 さ れたキ ャ ラ ク タ ーを テキス
ト 内に見つけた と き、 その左下隅を、 ブ ロ ッ ク 長方形の左下隅に整列 さ せます。 横書き テキス ト
で orientate=north か south の場合には、 position オプ シ ョ ンの 1 番目の値で位置を決定 し ます。
縦書き テキス ト で orientate=west か east の場合には、 position オプ シ ョ ンの 2 番目の値で位置
を決定 し ます。 指定 さ れた位置整列キ ャ ラ ク タ ーがテキス ト 内にない と きは、 こ のオプ シ ョ ンは
無視 さ れます。 値 0 かキーワー ド none ならば、 位置整列キ ャ ラ ク タ ーを無効に し ます。
fitmethod は指定 さ れれば適用 し ますが、 alignchar で強制的に位置付け ら れるので、 はめ込み枠
内にテキス ト 配置する こ と はで き ません。 デ フ ォ ル ト : none

dpi (float の リ ス ト 。 画像ブ ロ ッ ク にのみ適用) 縦方向 ・ 横方向の画像解像度を表す 1 個または 2 個の


値。 単位は pixels per inch。 値 0 の場合、 画像内部に解像度が格納 さ れていればそれを用い、 なけ
れば 72 dpi と し ます。 fitmethod プ ロパテ ィ が指定 さ れていて、 そのキーワー ド が auto ・ meet ・
slice ・ entire のいずれかな ら ば、 本プ ロパテ ィ は無視 さ れます。 デ フ ォ ル ト : 0

fitmethod (キーワー ド ) 与え られた内容がブ ロ ッ ク長方形に収ま り き ら ない と きの解決方式 : auto ・ clip ・


entire ・ meet ・ nofit ・ slice。 (デ フ ォル ト : meet)。

margin (float の リ ス ト 。 テキス ト 行ブ ロ ッ ク にのみ適用) テキス ト 枠の縦 ・ 横方向の長 さ 差 し 引き を記述


する 1 個ま たは 2 個の値。 デ フ ォ ル ト : 0
minfontsize (float またはパーセ ン ト 値。 テキス ト 行にのみ適用) fitmethod=auto で shrinklimit を超えた と
き、 テキス ト がブ ロ ッ ク長方形に収ま る よ う 縮小 さ れる際に、 許 さ れる最小の文字サイ ズ。 下限
値を、 ユーザー座標で、 またはブ ロ ッ ク の高 さ に対するパーセ ン ト 値で指定 し ます。 下限に達 し
た と きは、 テキス ト は指定 さ れた minfontsize を文字サイ ズ と し て作成 さ れます。 デ フ ォ ル ト :
0.1%
orientate (キーワー ド ) 内容を配置する向き を指定 し ます。 と り う る値は north ・ east ・ south ・ west。 デ
フ ォル ト : north

position (float の リ ス ト ) 内容の中における参照点の位置を指定する、 1 個または 2 個の値。 ブ ロ ッ ク内で


のパーセ ン ト 値 と し て位置を指定 し ます。 テキス ト 行ブ ロ ッ クのみ : キーワー ド auto を、 リ ス ト
の 1 番目の値 と し て用いる こ と も で き ます。 こ れは、 テキス ト の筆記方向が右書きの場合 (ア ラ
ビ ア語 ・ ヘブ ラ イ語な ど) には right を意味 し 、 そ う で ない場合 (欧文な ど) には left を意味 し
ます。
デ フ ォ ル ト : {0 0}、 すなわち左下隅
rotate (float) 回転角を度単位で表 し た も の。 処理が始ま る前にブ ロ ッ クが反時計回 り に回転 さ れます。
参照点が回転の中心 と な り ます。 デ フ ォ ル ト : 0

13.7 ブ ロ ッ クのプ ロパテ ィ 411


表 13.10 テキス ト 行 ・ 画像 ・ PDF ・ グ ラ フ ィ ッ ク ブ ロ ッ ク に対するはめ込みプ ロパテ ィ
キーワー ド と り う る値 ・ 解説
scale (float の リ ス ト 。 画像 ・ PDF ・ グ ラ フ ィ ッ ク ブ ロ ッ クのみ) 縦方向 ・ 横方向の、 求める伸縮倍率を
表す 1 個ま たは 2 個の値。 fitmethod プ ロパテ ィ が指定 さ れていて、 かつそのキーワー ド が auto ・
meet ・ slice ・ entire のいずれかな ら ば、 本プ ロパテ ィ は無視 さ れます。 デ フ ォル ト : 1

shrinklimit (float またはパーセ ン ト 値。 テキス ト 行ブ ロ ッ ク にのみ適用) fitmethod=auto で テキス ト を収める


際に適用 さ れる縮小倍率の下限。 デ フ ォ ル ト : 0.75

表 13.11 テキス ト フ ローブ ロ ッ ク に対するはめ込みプ ロパテ ィ


キーワー ド と り う る値 ・ 解説
firstlinedist (float ・ パーセ ン ト 値 ・ キーワー ド のいずれか) ブ ロ ッ ク長方形上端 と テキス ト 先頭行ベース ラ イ
ン と の間隔を、 ユーザー座標で表すか、 そ こ の文字サイ ズ (fixedleading=true な ら 行の先頭の文
字サイ ズ、 そ う でないな ら行内のすべての文字サイ ズの う ちの最大値) に対するパーセ ン ト 値で
表すか、 キーワー ド で表 し た も の (デ フ ォル ト : leading)。
leading 先頭行について決定 さ れた行送 り 値。 À のよ う な、 読み分け記号付きの文字は普通、 は
め込み枠上端に接する で し ょ う 。
ascender 先頭行について決定 さ れたアセ ン ダー値。 d や h のよ う な、 大き な アセ ン ダーを持つ文
字は普通、 はめ込み枠上端に接する で し ょ う 。
capheight 先頭行について決定 さ れたキ ャ ッ プハイ ト 値。 H のよ う な大文字は普通、 はめ込み枠上
端に接する で し ょ う 。
xheight 先頭行について決定 さ れた x ハイ ト 値。 x のよ う な小文字は普通、 はめ込み枠上端に接
する で し ょ う 。
fixedleading=false な ら、 先頭行内で見出 さ れたすべての leading ・ ascender ・ xheight ・
capheight 値の う ちの最大値が用い られます。

fitmethod (キーワー ド ) ブ ロ ッ クがテキス ト フ ローに対 し て小 さ すぎ る と きの解決方式 :


auto テキス ト が収ま る ま で、 fontsize と leading を縮めます。
clip テキス ト を ブ ロ ッ ク の端で切 り 落 と し ます (テキス ト フ ローブ ロ ッ ク を連結する場合に
有用です)。
nofit テキス ト を ブ ロ ッ ク 下端からはみ出 さ せます (ブ ロ ッ ク を移動 さ せる場合に有用です)。
デ フ ォ ル ト : textflowhandle オプ シ ョ ンが与え られている な ら clip、 そ う でないな ら auto

lastlinedist (float ・ パーセ ン ト 値 ・ キーワー ド のいずれか。 fitmethod=nofit の と きは無視 さ れます) テキス


ト 最終行ベース ラ イ ン と はめ込み枠下端 と の間隔を、 ユーザー座標で表すか、 文字サイ ズ
(fixedleading=true な ら行の先頭の文字サイ ズ、 そ う で ないな ら行内のすべての文字サイ ズの う
ちの最大値) に対するパーセ ン ト 値で表すか、 キーワー ド で表 し た もの。 デ フ ォ ル ト : 0、 すなわ
ちはめ込み枠下端を ベース ラ イ ン と し て用い、 アセ ン ダーは普通、 はめ込み枠の下へはみ出すで
し ょ う。
descender 最終行について決定 さ れたアセ ン ダー値。 g や j のよ う な、 アセ ン ダーを持つ文字は普
通、 はめ込み枠下端に接する で し ょ う 。
fixedleading=false な ら、 最終行内で見出 さ れたすべてのアセ ン ダー値の う ちの最大値が用い ら
れます。
linespread- (float またはパーセ ン ト 値。 verticalalign=justify の場合にのみ可) 上下合わせの場合に行送 り
limit を増やす際の最大値を、 ユーザー座標で表すか、 行送 り に対するパーセ ン ト 値で表 し た もの。 デ
フ ォ ル ト : 200%
maxlines (整数ま たはキーワー ド ) はめ込み枠内の最大行数。 あ るいはキーワー ド auto を指定 し て、 で き
る だけ多 く の行をはめ込み枠内に入れ さ せる こ と も で き ます。 最大行数が入っ た と き、 PDF_fit_
textflow( ) は文字列 _boxfull を返 し ます。

412 第 13 章 : PPS と PDFlib Block Plugin


表 13.11 テキス ト フ ローブ ロ ッ ク に対するはめ込みプ ロパテ ィ
キーワー ド と り う る値 ・ 解説
minfontsize (float またはパーセ ン ト 値) 特に fitmethod=auto の と き、 はめ込み枠に収ま る よ う テキス ト が縮
小 さ れる際に許 さ れる最小文字サイ ズ。 下限値を、 ユーザー座標で、 ま たははめ込み枠の高 さ に
対するパーセ ン ト 値で指定 し ます。 下限に達 し て も なおテキス ト が収ま り き ら ない と きは、 文字
列 _boxfull が返 さ れます。 デ フ ォ ル ト : 0.1%

orientate (キーワー ド ) テキス ト を配置する向き を指定 し ます。 と り う る値は north ・ east ・ south ・ west。
デ フ ォ ル ト : north

rotate (float) 回転角を度単位で表 し た も の。 はめ込み枠の左下隅を中心 と し て、 座標系を回転 さ せます。


こ れに よ っ て、 枠 と テキス ト が回転 さ れます。 テキス ト が配置 さ れた時点で回転は リ セ ッ ト さ れ
ます。 デ フ ォ ル ト : 0
verticalalign (キーワー ド ) はめ込み枠内のテキス ト の縦揃え (デ フ ォ ル ト : top) :
top 先頭行か ら下へ順に組版。 テキス ト がはめ込み枠に満たない と きは、 テキス ト の下に余
白があ き ます。
center はめ込み枠内の縦方向の中央にテキス ト を配置。 テキス ト がはめ込み枠に満たない と き
は、 テキス ト の上下に余白があ き ます。
bottom 最終行か ら上へ順に組版。 テキス ト がはめ込み枠に満たない と きは、 テキス ト の上に余
白があ き ます。
justify はめ込み枠の上端 と 下端にテキス ト を合わせます。 それを実現する ために、 行送 り を増
や し ます。 ただ し 、 linespreadlimit で指定 さ れた限界ま で し か増や し ません。 先頭行
の高 さ は、 firstlinedist=leading の場合のみ増や し ます。

13.7 ブ ロ ッ クのプ ロパテ ィ 413


13.7.7 デ フ ォ ル ト 内容のためのプ ロパテ ィ
デフ ォ ル ト 内容に関する プ ロ パテ ィ 群は、内容が特に与え ら れなか っ た と き のブ ロ ッ ク へ
の流 し 込みの方法を指定 し ます。 こ れ ら は と り わけプ レ ビ ュ ー機能で有用です。 なぜな ら
プ レ ビ ュ ーではブ ロ ッ ク にそのデフ ォ ル ト 内容を流 し 込むか ら です。デフ ォ ル ト 内容に関
する プ ロ パテ ィ の一覧を表 13.12 に示 し ます。

表 13.12 デ フ ォル ト 内容のためのプ ロパテ ィ


キーワー ド と り う る値 ・ 解説
default- (文字列。 グ ラ フ ィ ッ ク ブ ロ ッ ク にのみ適用) グ ラ フ ィ ッ クが ク ラ イ ア ン ト ア プ リ ケーシ ョ ンか ら
graphics 与え られなかっ た と き に用い ら れるグ ラ フ ィ ッ ク フ ァ イルのパス名。1
defaultimage (文字列。 画像ブ ロ ッ ク にのみ適用) 置き換え画像がク ラ イ ア ン ト ア プ リ ケーシ ョ ンから 与え ら れ
なか っ た と き に用い られる画像のパス名。 1
defaultpdf (文字列。 PDF ブ ロ ッ ク にのみ適用) 置き換え PDF がク ラ イ ア ン ト ア プ リ ケーシ ョ ンから与え られ
なか っ た と き に用い られる PDF 文書のパス名。 1
default- (整数。 PDF ブ ロ ッ ク にのみ適用) デ フ ォル ト PDF 文書内のページのページ番号。 デ フ ォル ト : 1
pdfpage

defaulttext (文字列。 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク にのみ適用) 可変テキス ト がク ラ イ ア ン ト ア プ リ


ケーシ ョ ンから与え られなかっ た と き に用い られる テキス ト 2

1. フ ァ イル名には絶対パス を付けず、 SearchPath 機能を利用する よ う PPS ク ラ イ ア ン ト ア プ リ ケーシ ョ ン を作 っ てお く ほ う


がよ いで し ょ う 。 そ う すればブ ロ ッ ク 処理を、 プ ラ ッ ト フ ォ ームや フ ァ イルシ ス テムの細かい違いか ら 切 り 離す こ と がで き ま
す。
2. テキス ト は winansi エ ン コ ーデ ィ ン グか Unicode で解釈 さ れます。

13.7.8 カ ス タ ムプ ロパテ ィ
カ ス タ ムプ ロ パテ ィ は、 すべての種類のブ ロ ッ ク に適用 さ れます。 PPS と プ レ ビ ュ ー機能
か ら は無視 さ れます。 カ ス タ ムプ ロ パテ ィ の命名規則を表 13.13 に示 し ます。

表 13.13 すべてのブ ロ ッ ク種別に対する カ ス タ ムブ ロ ッ ク プ ロパテ ィ


キーワー ド と り う る値 ・ 解説
3 種類のキ ャ ラ ク タ ー (文字列 ・ 名前 ・ float のいずれか、 または float の リ ス ト ) 各カ ス タ ムプ ロパテ ィ の
[ ] / を含ま ないあ ら ゆる 値を ど う 解釈するかは、 全 く ク ラ イ ア ン ト ア プ リ ケーシ ョ ンの領分です。 PPS か ら
名前 は無視 さ れます。

414 第 13 章 : PPS と PDFlib Block Plugin


13.8 pCOS で ブ ロ ッ ク 名 と プ ロパテ ィ を ク エ リ ー
PPS に よ る 自動ブ ロ ッ ク 処理に加え て、 内蔵の pCOS 機能を使 う と 、 ブ ロ ッ ク 名を評価 し
た り 、 標準 ・ カ ス タ ムプ ロ パテ ィ を ク エ リ ー し た り す る こ と がで き ます。

ク ッ ク ブ ッ ク 取 り 込んだPDFの中に含まれてい る ブ ロ ッ クのプ ロパテ ィ を ク エ リ ーする完全な コ ー ド サ


ン プルがク ッ ク ブ ッ ク の blocks/query_block_properties ト ピ ッ ク にあ り ます。

ブ ロ ッ ク の数 と 名前を知る ク ラ イ ア ン ト コ ー ド 側では、 取 り 込んだページ上のブ ロ ッ


ク の名前 も 数 も 知 ら な く てか ま い ません。 なぜな ら ク エ リ ーす る こ と も で き る か ら です。
以下の ス テー ト メ ン ト は、 ページ番号 pagenum のページ上のブ ロ ッ ク の数を返 し ます :
blockcount = (int) p.pcos_get_number(doc, "length:pages[" + pagenum + "]/blocks");

以下の ス テー ト メ ン ト は、 ページ pagenum 上の blocknum 番目のブ ロ ッ ク の名前を返 し


ます (ブ ロ ッ ク と ページの番号は 0 か ら 始ま り ます) :
blockname = p.pcos_get_string(doc,
"pages[" + pagenum + "]/blocks[" + blocknum + "]/Name");

返 さ れたブ ロ ッ ク 名はその後、 ブ ロ ッ ク のプ ロ パテ ィ を ク エ リ ー し た り 、 ブ ロ ッ ク へテ キ
ス ト ・ 画像 ・ PDF ・ グ ラ フ ィ ッ ク 内容を流 し 込んだ り する ために利用で き ます。 指定 さ れ
たブ ロ ッ ク が存在 し ない と き には例外が発生 し ます。 こ れを避け る には、 length 接頭辞を
用いれば、 ブ ロ ッ ク の数を知 り 、 ひいては blocks 配列の最大添字を知 る こ と がで き ます
(配列の添字は 0 か ら 始ま る ので、 ブ ロ ッ ク の数は最大可能添字 よ り 1 大 き い こ と に留意
し て く だ さ い)。

ブ ロ ッ ク が存在す るかど う かを チ ェ ッ ク ク ラ イ ア ン ト アプ リ ケーシ ョ ン コ ー ド に さ ら


に柔軟性を加え る ために、 ブ ロ ッ ク に流 し 込みを行 う 前に、 そのブ ロ ッ ク が存在す る か ど
う かをチ ェ ッ ク する こ と も で き ます。 こ う し ておけば、 デザ イ ナーが別のページへブ ロ ッ
ク を移動 さ せて も 、そのブ ロ ッ ク へ流 し 込みを行 う アプ リ ケーシ ョ ン を破壊せずにすみま
す。
以下の コ ー ド は、foo と い う 名前のブ ロ ッ ク がページ上に存在す る か ど う かをチ ェ ッ ク
し ます :
/* pCOSオブジェクト種別「辞書」はそのブロックが存在することを意味します */
if (pcos_get_string(doc, "type:pages[" + pagenum + "]/blocks/" + "foo").equals("dict"))
{
/* ブロック「foo」はそのページ上に存在 */
}

ブ ロ ッ ク を番号か名前で特定 ブ ロ ッ ク プ ロ パテ ィ を特定す る パ ス 文法において、 以下


の表現は互いに等価です。 こ こ では、 番号 6 のブ ロ ッ ク が、 その Name プ ロ パテ ィ を foo
に設定 さ れてい る と し ます :
pages[...]/blocks[6]
pages[...]/blocks/foo

ブ ロ ッ ク の座標を ク エ リ ー 名前 foo のブ ロ ッ ク の左下隅 と 右上隅を記述す る 2 個の座標


ペア (llx, lly) お よ び (urx, ury) は、 以下の よ う に ク エ リ ーで き ます :
llx = p.pcos_get_number(doc, "pages[" + pagenum + "]/blocks/foo/rect[0]");
lly = p.pcos_get_number(doc, "pages[" + pagenum + "]/blocks/foo/rect[1]");

13.8 pCOS で ブ ロ ッ ク名 と プ ロパテ ィ を ク エ リ ー 415


urx = p.pcos_get_number(doc, "pages[" + pagenum + "]/blocks/foo/rect[2]");
ury = p.pcos_get_number(doc, "pages[" + pagenum + "]/blocks/foo/rect[3]");

なお、 上記の座標はデフ ォ ル ト 座標系で与え ら れます (左下隅が原点、 ただ し 、 そのペー


ジの CropBox に よ っ て変更 さ れてい る 可能性 も あ り ます)。 一方 Block Plugin は、 ページ
左上隅に原点を持つ Acrobat のユーザー イ ン タ ーフ ェ イ ス座標系に従っ て座標を表示 し ま
す。
pCOS 擬似オブジ ェ ク ト rect (すべて小文字の) を用いて ク エ リ ー さ れ る 値は、 関連す
る いかな る CropBox/MediaBox ・ Rotate エン ト リ ーを も 考慮に入れ、 かつ座標の順序を正
規化 し ます。こ れに対 し 、ネ イ テ ィ ブ PDF キーRect を用いて ク エ リ ー さ れ る 値は、CropBox
が存在す る 場合には新 し い座標 と し てその ま ま受け渡す こ と はで き ません。
topdown オプシ ョ ンはブ ロ ッ ク 座標を ク エ リ ーする 際には考慮 さ れない こ と に留意 し
て く だ さ い。

カ ス タ ムプ ロパテ ィ を ク エ リ ー カ ス タ ム プ ロ パテ ィ は、 以下の例の よ う に ク エ リ ーす
る こ と がで き ます。 こ こ では、 ページ pagenum 上の b1 と い う ブ ロ ッ ク か ら プ ロ パテ ィ
zipcode を ク エ リ ー し てい ます :
zip = p.pcos_get_string(doc, "pages[" + pagenum + "]/blocks/b1/Custom/zipcode");

ブ ロ ッ ク 内に具体的に何 と い う カ ス タ ムプ ロ パテ ィ があ る かわか ら ない場合には、実行時


にその名前を取得す る こ と も 可能です。b1 と い う ブ ロ ッ ク の最初のカ ス タ ムプ ロ パテ ィ の
名前を得 る には、 以下の よ う に し ます :
propname = p.pcos_get_string(doc, "pages[" + pagenum + "]/blocks/b1/Custom[0].key");

番号を 0 でな く 1 つずつ増や し ていけば、すべてのカ ス タ ムプ ロ パテ ィ の名前を得る こ と


がで き ます。 length 接頭辞を用いれば、 カ ス タ ムプ ロ パテ ィ の数を知 る こ と がで き ます。

存在 し ない ブ ロ ッ ク プ ロパテ ィ と デ フ ォ ル ト 値 ブ ロ ッ ク ま たはプ ロ パテ ィ が実在す る


か ど う か を知 る には、 type 接頭辞を用い ます。 パ ス に対す る 型が 0 か null な ら ば、 その
オブジ ェ ク ト は PDF 文書内に存在 し てい ません。 なお、 定義済みプ ロ パテ ィ の場合、 こ
れはプ ロ パテ ィ のデフ ォ ル ト 値が用い ら れ る こ と を意味 し ます。

カ ス タ ムプ ロパテ ィ の名前空間 さ ま ざ ま な ソ ース か ら の PDF 文書をや り 取 り する 際に


混乱が生 じ る こ と を避け る ため、 カ ス タ ムプ ロ パテ ィ 名をつけ る と き には必ず、 イ ン タ ー
ネ ッ ト ド メ イ ン名を企業固有の接頭辞 と し て用い、 その後に コ ロ ン 「:」 と プ ロ パテ ィ 名
本体を続け る こ と を推奨 し ます。 た と えば、 ACME 社であれば以下の よ う なプ ロ パテ ィ 名
を使用す る のです :
acme.com:digits
acme.com:refnumber

標準プ ロ パテ ィ と カ ス タ ム プ ロ パテ ィ はブ ロ ッ ク 内で異な る 格納の さ れ方を し てい る の


で、 標準 PPS プ ロ パテ ィ 名 (402 ページ 「13.7 ブ ロ ッ ク のプ ロ パテ ィ 」 で定義 さ れてい る
も の) がカ ス タ ムプ ロ パテ ィ 名 と 衝突す る こ と は決 し て あ り ません。

416 第 13 章 : PPS と PDFlib Block Plugin


13.9 ブ ロ ッ ク を プ ロ グ ラ ム的に作成 ・ 取 り 込む
13.9.1 POCA で PDFlib ブ ロ ッ ク を作成
PDFlib ブ ロ ッ ク は、PPS に内蔵 さ れてい る POCA イ ン タ ーフ ェ イ ス でプ ロ グ ラ ム的に作成
す る こ と も 可能です。 POCA を用い る と 、 ブ ロ ッ ク のために必要な PDF デー タ 構造を生
成 し て、 PDF_begin/end_page_ext( ) の blocks オプシ ョ ンに与え る こ と がで き ます。 ブ ロ ッ
ク 定義を作成する 際には、 419 ページ 「13.10 PDFlib ブ ロ ッ ク の仕様」 の要請に従 う 必要
があ り ます。 ブ ロ ッ ク プ ロ パテ ィ は、 402 ページ 「13.7 ブ ロ ッ ク のプ ロ パテ ィ 」 に挙げた
デー タ 型に従っ て作成す る 必要があ り ます。

ク ッ ク ブ ッ ク PDFlib ブ ロ ッ ク を PPS で作成するのコ ー ド サン プルが PDFlib ク ッ ク ブ ッ ク の blocks カ テ


ゴ リ ーにあ り ます。

PDFlib ブ ロ ッ ク の仕様には、 1 つのブ ロ ッ ク の名前が 2 回記録 さ れてい る と い う 残念な冗


長性があ り ます。 すなわちページの メ イ ン Blocks 辞書内に 1 回 と 、 特定のブ ロ ッ ク 辞書内
の Name エン ト リ ー内に も う 1 回です。 こ の 2 個の名前は、 そのブ ロ ッ ク に PPS で流 し 込
みを行 う 際や、 そのブ ロ ッ ク を Block Plugin でプ レ ビ ュ ーす る 際に問題が起 こ る こ と を避
け る ために、 同一でなければな り ません。 PDF_begin/end_page_ext( ) はそのため、 blocks
オプシ ョ ンで与え ら れた辞書が こ の 「同一ブ ロ ッ ク 名」 規則に違反す る ブ ロ ッ ク 定義を含
んでい る 場合には、 例外を発生 さ せます。 以下の コ ー ド サンプルでは、 その対応す る ペア
を青色で示 し てい ます。
以下の コ ー ド 断片では、419 ページ「ブ ロ ッ ク 辞書のキー」で示すブ ロ ッ ク 定義を POCA
関数群を用いて作成す る 様子を演示 し てい ます :
/* ブロック辞書を作成 */
blockdict = p.poca_new("containertype=dict usage=blocks");

/* ---------------------------------------------------------
* テキストブロックを作成
* ---------------------------------------------------------
*/
textblock = p.poca_new("containertype=dict usage=blocks type=name key=Type value=Block");

container1 = p.poca_new("containertype=array usage=blocks " +


"type=integer values={70 640 300 700}");

p.poca_insert(textblock, "type=array key=Rect value=" + container1);


p.poca_insert(textblock, "type=name key=Name value=job_title");
p.poca_insert(textblock, "type=name key=Subtype value=Text");
p.poca_insert(textblock, "type=name key=fitmethod value=auto");
p.poca_insert(textblock, "type=name key=fontname value=Helvetica");
p.poca_insert(textblock, "type=float key=fontsize value=12");

/* このブロックをページのブロック辞書内に挿入 */
p.poca_insert(blockdict, "type=dict key=job_title direct=false value=" + textblock);

/* ---------------------------------------------------------
* 画像ブロックを作成
* ---------------------------------------------------------
*/
imageblock = p.poca_new("containertype=dict usage=blocks " +
"type=name key=Type value=Block");

13.9 ブ ロ ッ ク を プ ログ ラ ム的に作成 ・ 取 り 込む 417


container2 = p.poca_new("containertype=array usage=blocks " +
"type=integer values={70 440 300 600}");

p.poca_insert(imageblock, "type=array key=Rect value=" + container2);


p.poca_insert(imageblock, "type=name key=Name value=logo");
p.poca_insert(imageblock, "type=name key=Subtype value=Image");
p.poca_insert(imageblock, "type=name key=fitmethod value=auto");

/* このブロックをページのブロック辞書内に挿入 */
p.poca_insert(blockdict, "type=dict key=logo direct=false value=" + imageblock);

/* ---------------------------------------------------------
* PDFブロックを作成
* ---------------------------------------------------------
*/
pdfblock = p.poca_new("containertype=dict usage=blocks " +
"type=name key=Type value=Block");

container3 = p.poca_new("containertype=array usage=blocks " +


"type=integer values={70 240 300 400}");

p.poca_insert(pdfblock, "type=array key=Rect value=" + container3);


p.poca_insert(pdfblock, "type=name key=Name value=pdflogo");
p.poca_insert(pdfblock, "type=name key=Subtype value=PDF");
p.poca_insert(pdfblock, "type=name key=fitmethod value=meet");

/* このブロックをページのブロック辞書内に挿入 */
p.poca_insert(blockdict, "type=dict key=pdflogo direct=false " + "value=" + pdfblock);

/* ---------------------------------------------------------
* このブロック辞書をカレントページ内に挿入
* ---------------------------------------------------------
*/
p.end_page_ext("blocks=" + blockdict);

/* クリーンナップ */
p.poca_delete(blockdict, "recursive");

13.9.2 PDFlib ブ ロ ッ ク を取 り 込む
入力文書か ら 1個ない し 複数のPDFlibブ ロ ッ ク を、PDF_process_pdi( ) と action=copyallblocks
か action=copyblock で以下の よ う にカ レ ン ト 出力ページへ コ ピーす る こ と も 可能です :
if (p.process_pdi(p, doc, 0, "action=copyallblocks block={pagenumber=1}") != 1)
{
/* エラー */
}

こ の よ う にす る と 、マルチ レベルのブ ロ ッ ク 流 し 込みワ ー ク フ ロ ーを実装する こ と がで き


ます。 ただ し 、 各ページ上でブ ロ ッ ク 名は一意でなければな ら ない こ と に留意 し て く だ さ
い。 すなわち、 同 じ 名前を持つ複数のブ ロ ッ ク を同 じ ページ上へ取 り 込む こ と はで き ませ
ん。ブ ロ ッ ク を コ ピー時に名称変更す る にはoutputblocknameサブオプシ ョ ン を用い ます。

418 第 13 章 : PPS と PDFlib Block Plugin


13.10 PDFlib ブ ロ ッ ク の仕様
ブ ロ ッ ク の文法は、PDF ページ を構成す る デー タ 構造にアプ リ ケーシ ョ ンが独自デー タ を
追加格納で き る よ う にす る 拡張の し く みを定めた PDF Reference に準拠 し てい ます。 こ こ
では PDFlib ブ ロ ッ ク の文法を説明 し ます。 Block Plugin か PDFlib でブ ロ ッ ク を作成す る
ユーザーには こ の情報は必要ではあ り ません。

PDFlib ブ ロ ッ ク の PDF オ ブ ジ ェ ク ト 構造 ページ辞書は PieceInfo エン ト リ ーを含んでお


り 、 こ のエン ト リ ーは値 と し て別の辞書を持っ てい ます。 ページ辞書は、 ブ ロ ッ ク 構造の
作成ま たは最終更新の タ イ ム ス タ ンプを内容 と す る キーLastModified を も 含む必要があ り
ます。 こ の辞書はキー PDFlib を含んでお り 、 こ のキーはアプ リ ケーシ ョ ンデー タ 辞書を値
と し て持っ てい ます。 こ のアプ リ ケーシ ョ ンデー タ 辞書は、 表 13.14 に挙げ る 2 個の標準
キーを含んでい ます。

表 13.14 PDFlib ア プ リ ケーシ ョ ンデー タ 辞書内のエ ン ト リ ー


キー 値
LastModified (日付文字列、 必須) ページ上のブ ロ ッ クが作成 さ れた、 または最近更新 さ れた日時。 こ のエ ン ト
リ ーは、 POCA イ ン タ ー フ ェ イ スで ブ ロ ッ ク を作成 し た場合には PDFlib が作成 し ます。
Private (辞書、 必須) ブ ロ ッ ク リ ス ト (表 13.15 参照)

ブ ロ ッ ク リ ス ト と は、 ブ ロ ッ ク 処理に関す る 一般的な情報に加えて、 ページ上のすべての


ブ ロ ッ ク の一覧を も 含んだ辞書です。 ブ ロ ッ ク リ ス ト 辞書の中のキーの一覧を表 13.15 に
示 し ます。

表 13.15 ブ ロ ッ ク リ ス ト 辞書内のエ ン ト リ ー
キー 値
Blocks (辞書、 必須) キーはそれぞれ、 ブ ロ ッ ク名の名前オブ ジ ェ ク ト 。 その対応する値は、 そのブ ロ ッ
ク に対する ブ ロ ッ ク 辞書です (表 13.17 参照)。 ブ ロ ッ ク辞書内の Name キーは、 こ の辞書内のブ
ロ ッ ク 名 と 同 じ でなければな り ません。
BlockProducer1 (文字列) ブ ロ ッ ク を プ ログ ラ ム的に作成するのに用い ら れた ソ フ ト ウ ェ アの名前。 こ のエ ン ト
リ ーは、 POCA イ ン タ ー フ ェ イ スで ブ ロ ッ ク を作成 し た際に PDFlib に よ っ て作成 さ れます。
PluginVersion1 (文字列) ブ ロ ッ クの作成に使われた Block Plugin のバージ ョ ン識別を表す文字列。
1
pdfmark (論理値) ブ ロ ッ ク リ ス ト が pdfmark を用いて生成 さ れている場合は true でなければな り ません。

Version (数、 必須) フ ァ イルが準拠する ブ ロ ッ ク仕様のバージ ョ ン番号。 本文書では、 バージ ョ ン 10 の


ブ ロ ッ ク仕様を解説 し ています。

1. キー BlockProducer ・ PluginVersion ・ pdfmark の う ちのいずれか 1 つが、 かつ 1 つのみが存在する必要があ り ます。

ブ ロ ッ ク プ ロパテ ィ のデー タ 型 プ ロ パテ ィ はオプシ ョ ン リ ス ト と 同 じ デー タ 型に対応


し てい ます。 ただ し ハン ド ル と 、 ア ク シ ョ ン リ ス ト の よ う な特化 さ れた リ ス ト には対応 し
てい ません。こ れ ら の型が PDF デー タ 型へど の よ う にマ ッ プ さ れてい る か を表 13.16 に示
し ます。

ブ ロ ッ ク 辞書のキー ブ ロ ッ ク 辞書は、 表 13.17 に挙げ る キーを含む こ と がで き ます。

13.10 PDFlib ブ ロ ッ ク の仕様 419


表 13.16 ブ ロ ッ ク プ ロパテ ィ に対するデー タ 型
デー タ 型 PDF での型および注釈

論理値 (論理値)

文字列 (文字列)

キーワー ド (名前) そのプ ロパテ ィ が対応するキーワー ド の リ ス ト にないキーワー ド を与え る と エ ラ ー。


(名前)

float ・ 整数 (数値) オプ シ ョ ン リ ス ト では点も カ ン マ も小数点 と し て対応 し ているのに対 し 、 PDF の数値では


点を必要 と し ます。

パーセ ン ト (要素 2 個の配列) 配列の 1 番目の要素は数、 2 番目の要素はパーセ ン ト キ ャ ラ ク タ ーを持 っ た文


値 字列。

リスト (配列)

色 (要素 2 個か 3 個の配列) 配列の 1 番目の要素は色空間を指定 し 、 2 番目の要素はカ ラ ー値を指定。


色な し を指定する には、 各プ ロパテ ィ を省略する必要があ り ます。 配列の 1 番目の要素に対 し て
は以下のエ ン ト リ ーを指定で き ます :
/DeviceGray
2 番目の要素はグ レー値 1 個。
/DeviceRGB
2 番目の要素は RGB 値 3 個の配列。
/DeviceCMYK
2 番目の要素は CMYK 値 4 個の配列。
[/Separation/ スポ ッ ト カ ラ ー名 ]
1 番目の要素は、 キーワー ド Separation と スポ ッ ト カ ラ ー名 1 個を持っ た配列。 2 番目
の要素は濃度値。
オプ シ ョ ン と し て 3 番目の要素で、 スポ ッ ト カ ラ ーの代替色を指定 し ます。 代替色はそ
れ自体が 1 個の色配列であ り 、 DeviceGray ・ DeviceRGB ・ DeviceCMYK ・ Lab のいずれか
の色空間で表 さ れます。 代替色を指定 し ない と きは、 スポ ッ ト カ ラ ー名は、 PPS が内部
的に知 っ ている色か、 ま たはア プ リ ケーシ ョ ン で動作時に定義 し ておいた色でなければ
な り ません。
[/Lab] 1 番目の要素はキーワー ド Lab を持 っ た配列。 2 番目の要素は Lab 値 3 個の配列。

unichar (テキス ト 文字列) UTF-16 BOM U+FEFF で始ま る utf16be 形式の Unicode 文字列

表 13.17 ブ ロ ッ ク 辞書内のエ ン ト リ ー
プ ロパテ ィ グループ 値

管理プ ロパテ ィ 群 (い く つかのキーは必須) 表 13.4 に従っ た管理プ ロパテ ィ 群

長方形プ ロパテ ィ 群 (い く つかのキーは必須) 表 13.5 に従っ た長方形プ ロパテ ィ 群

書式プ ロパテ ィ 群 (い く つかのキーは必須) 表 13.6 に従っ た、 すべての種類のブ ロ ッ ク に適用 さ れる


書式プ ロパテ ィ 群 と 、 表 13.7 に従っ た、 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク に適
用 さ れる テキス ト 書式プ ロパテ ィ 群

テキス ト 作成プ ロパテ ィ 群 (オプ シ ョ ン) 表 13.8 に従 っ た、 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク に適用 さ れ


る テキス ト 作成プ ロパテ ィ 群

テキス ト 組版プ ロパテ ィ 群 (オプ シ ョ ン) 表 13.9 に従 っ た、 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク に適用 さ れ


る テキス ト 組版プ ロパテ ィ 群

オブ ジ ェ ク ト はめ込みプ ロ (オプ シ ョ ン) 表 13.10 に従っ た、 テキス ト 行 ・ 画像 ・ PDF ・ グ ラ フ ィ ッ ク ブ ロ ッ ク


パテ ィ 群 に適用 さ れる オブ ジ ェ ク ト はめ込みプ ロパテ ィ 群 と 、 表 13.11 に従 っ た、 テキス ト
フ ローブ ロ ッ ク に適用 さ れるはめ込みプ ロパテ ィ 群

420 第 13 章 : PPS と PDFlib Block Plugin


表 13.17 ブ ロ ッ ク辞書内のエ ン ト リ ー
プ ロパテ ィ グループ 値

デ フ ォル ト 内容に関する プ (オプ シ ョ ン) 表 13.12 に従っ た、 デ フ ォ ル ト 内容に関する プ ロパテ ィ 群


ロパテ ィ 群

カスタム (辞書、 オプ シ ョ ン) 表 13.13 に従っ た、 カ ス タ ムプ ロパテ ィ に対するキー / 値ペア


を含んだ辞書

13.10 PDFlib ブ ロ ッ ク の仕様 421


422 第 13 章 : PPS と PDFlib Block Plugin
A 改訂履歴
日付 更新点

2022 年 8 月 28 日 > PDFlib 10.0.0 に関する更新


2021 年 6 月 06 日 > PDFlib 9.3.1 に関する更新
2020 年 8 月 16 日 > PDFlib 9.3.0 に関する更新
2019 年 2 月 01 日 > PDFlib 9.2.0 に関する更新
2018 年 2 月 01 日 > PDFlib 9.1.2 に関する更新
2017 年 7 月 24 日 > PDFlib 9.1.1 に関する更新
2017 年 5 月 09 日 > PDFlib 9.1.0 に関する更新
2016 年 8 月 14 日 > PDFlib 9.0.7 に関する更新
2016 年 1 月 13 日 > PDFlib 9.0.6 に関する更新
2015 年 5 月 24 日 > PDFlib 9.0.5 に関する更新
2014 年 12 月 16 日 > PDFlib 9.0.4 に関する更新
2014 年 5 月 14 日 > PDFlib 9.0.3 に関する更新
2013 年 12 月 17 日 > PDFlib 9.0.2 に関する更新
2013 年 6 月 06 日 > PDFlib 9.0.1 に関する更新
2013 年 3 月 12 日 > PDFlib 9.0.0 に関する更新
2011 年 6 月 09 日 > PDFlib 8 VT Edition (内部的には 8.1.0) に関する更新
2010 年 12 月 09 日 > PDFlib 8.0.2 に関する さ ま ざ ま な更新 ・ 修正
2010 年 9 月 22 日 > PDFlib 8.0.1p7 に関する さ ま ざ ま な更新 ・ 修正
2010 年 4 月 13 日 > PDFlib 8.0.1 に関する さ ま ざ ま な更新 ・ 修正
2009 年 12 月 07 日 > PDFlib 8.0.0 に関する更新
2009 年 3 月 13 日 > PDFlib 7.0.4 に関する さ ま ざ ま な更新 ・ 修正
2008 年 2 月 13 日 > PDFlib 7.0.3 に関する さ ま ざ ま な更新 ・ 修正
2007 年 8 月 08 日 > PDFlib 7.0.2 に関する さ ま ざ ま な更新 ・ 修正
2007 年 2 月 19 日 > PDFlib 7.0.1 に関する さ ま ざ ま な更新 ・ 修正
2006 年 10 月 03 日 > PDFlib 7.0.0 に関する更新 と 再構成
2006 年 2 月 21 日 > PDFlib 6.0.3 に関する さ ま ざ ま な更新 ・ 修正。 Ruby の節を追加
2005 年 8 月 09 日 > PDFlib 6.0.2 に関する さ ま ざ ま な更新 ・ 修正
2004 年 11 月 17 日 > PDFlib 6.0.1 に関する小規模な更新 ・ 修正
> 8 章に言語別関数プ ロ ト タ イ プ用新書式導入
> 3 章にハイパーテキス ト の例を追加

A 改訂履歴 423
日付 更新点

2004 年 6 月 18 日 > PDFlib 6 に関する大規模な変更


2004 年 1 月 21 日 > PDFlib 5.0.3 に関する小規模な追加 ・ 修正
2003 年 9 月 15 日 > PDFlib 5.0.2 に関する小規模な追加 ・ 修正。 ブ ロ ッ ク の仕様を追加
2003 年 5 月 26 日 > PDFlib 5.0.1 に関する小規模な更新 ・ 修正
2003 年 3 月 26 日 > PDFlib 5.0.0 に関する全面的変更 と 書き直 し
2002 年 6 月 14 日 > PDFlib 4.0.3 に関する小規模な変更 と .NET バイ ンデ ィ ングに関する追加
2002 年 1 月 26 日 > PDFlib 4.0.2 に関する小規模な変更 と IBM eServer エデ ィ シ ョ ン に関する追加
2001 年 5 月 17 日 > PDFlib 4.0.1 に関する小規模な変更
2001 年 4 月 1 日 > PDFlib 4.0.0 の PDI ・ 他機能を解説
2001 年 2 月 5 日 > PDFlib 3.5.0 のテ ン プ レー ト ・ CMYK 機能を解説
2000 年 12 月 22 日 > ColdFusion 解説 と PDFlib 3.03 に関する追加。 COM エデ ィ シ ョ ン を別マニ ュ アルに
2000 年 8 月 8 日 > Delphi 解説 と PDFlib 3.02 に関する小規模な追加
2000 年 7 月 1 日 > PDFlib 3.01 に関する追加 ・ 説明の明瞭化
2000 年 2 月 20 日 > PDFlib 3.0 に関する変更
1999 年 8 月 2 日 > PDFlib 2.01 に関する小規模な変更 ・ 追加
1999 年 6 月 29 日 > 言語バイ ンデ ィ ングご と に節を分離
> PDFlib 2.0 に関する追加
1999 年 2 月 1 日 > PDFlib 1.0 に関する小規模な追加 (公開せず)
1998 年 8 月 10 日 > PDFlib 0.7 に関する追加 (一つのお客様用のみ)
1998 年 7 月 8 日 > PDFlib 0.6 の PDFlib ス ク リ プ テ ィ ングサポー ト を初めて記述
1998 年 2 月 25 日 > PDFlib 0.5 に関 し て説明を若干追加
1997 年 9 月 22 日 > PDFlib 0.4 と 本マニ ュ アルを初めて公開
索引

記号 H
.NET バイ ンデ ィ ング 39 HKS カ ラ ー 92
hypertextformat オプ シ ョ ン 114
A
Acrobat のブ ロ ッ ク作成用プ ラ グ イ ン 375 I
ArtBox 71 IBM System i 66
ascender 157 IBM Z 66
asciifile オプ シ ョ ン 67 iccprofilegray/rgb/cmyk オプ シ ョ ン 87
autosubsetting オプ シ ョ ン 149 ISO 14289 (PDF/UA) 335
ISO 15930 (PDF/X) 358
B ISO 19005 (PDF/A) 346
ISO 32000-1 (PDF 1.7) 341
BleedBox 71
BMP 109, 191 ISO 32000-2 (PDF 2.0) 343
bytes → hypertextformat
J
C Javadoc 38
Java バイ ンデ ィ ング 37
C++ バイ ンデ ィ ング 35
JBIG2 190
capheight 157
JFIF 189
CCSID 117
JPEG 189
CIE L*a*b* カ ラ ースペース 90
EXIF 形式の画像 189
CMap 118, 119
JPEG2000 189
COLR カ ラ ー フ ォ ン ト 128
CropBox 71
currentx ・ currenty オプ シ ョ ン 157 L
C バイ ンデ ィ ン グ 31 leading 157

D M
defaultgray/rgb/cmyk 色空間 88 masked 195
descender 157 MediaBox 71
DeviceN カ ラ ー 94
dpi 計算 187 N
NChannel 色空間 95
E .NET バイ ンデ ィ ング 39
EBCDIC 66 n 色 ICC プ ロ フ ァ イル 358
ebcdicutf8 → hypertextformat
errorpolicy オプ シ ョ ン 213 O
EUDC (end-user defined characters) 176 Objective-C バイ ンデ ィ ング 42
EUDC (エ ン ド ユーザー定義キ ャ ラ ク タ ) フ ォ OBJR 構造エ レ メ ン ト
ン ト 127 イ ン タ ラ ク テ ィ ブ要素のための 321, 323
EXIF JPEG 画像 189 OpenType
カ ラ ー フ ォ ン ト 128
G コ レ ク シ ョ ン 127
get_buffer() 64 フ ォ ン ト 127
grid.pdf 69 フ ォ ン ト バ リ エーシ ョ ン 127

索引 425
レ イ アウ ト 機能 163 T
OTC (OpenType Collection) 175
textformat オプ シ ョ ン 114
overline オプ シ ョ ン 159
textrendering オプ シ ョ ン 159
textx ・ texty オプ シ ョ ン 157
P TIFF 190
page 188 topdown オプ シ ョ ン 70
Pantone カ ラ ー 91 TrimBox 71
PDF 1.7 341
TrueType フ ォ ン ト 127
PDF 1.7 と PDF 2.0 の タ グセ ッ ト 297
TTC (TrueType コ レ ク シ ョ ン) 127
PDF 2.0 343
TTC (TrueType Collection) 175
PDF_EXIT_TRY( ) 33
PDF_get_buffer() 64 Type 3 (ユーザー定義) フ ォ ン ト 131
PDF/A 346
PDF/UA 335 U
PDF/X 358
PDFlib underline オプ シ ョ ン 159
機能一覧 24 UPR (Unix PostScript Resource) 59
PDFlib Personalization Server 375 usehypertextencoding オプ シ ョ ン 114
pdflib.upr 63 usercoordinates オプ シ ョ ン 68
PDFLIBRESOURCEFILE 環境変数 63 utf8/utf16/utf16be/utf16le → hypertextformat
PDFlib の機能 24, 28 UTF 形式 110
PDF 取 り 込みラ イ ブ ラ リ (PDI) 211
PDI (PDF 取 り 込み) 211 W
pdiusebox オプ シ ョ ン 215
WOFF ・ WOFF2 フ ォ ン ト 130
Perl バイ ンデ ィ ン グ 44
permissions 77
Photoshop CMYK 画像 192 X
PHP バイ ンデ ィ ング 46 xCLR ICC プ ロ フ ァ イル 358
PNG 189 XMP メ タ デー タ 79
POCA (PDF オブ ジ ェ ク ト 作成 API) XObject 74
ブ ロ ッ ク を作成する ための 417 x ハイ ト 157
文書部分 メ タ デー タ (DPM) のための 371
PPS (PDFlib Personalization Server) 375
Python バイ ンデ ィ ング 48
Z
ZUGFeRD 標準
R 電子イ ンボ イ スのための 347

RAW 画像デー タ 191


resourcefile オプ シ ョ ン 63 あ
RGB カ ラ ー 83 アセ ン ダー 157
RPG バイ ンデ ィ ング 49 アル フ ァ チ ャ ン ネル
Ruby バイ ンデ ィ ング 51 別画像か らの 195
暗号化 76
S
sbix カ ラ ー フ ォ ン ト 128 い
SearchPath オプ シ ョ ン 61 一意識別
SING フ ォ ン ト 131, 176 PDF/VT のための XObject の 368
sRGB カ ラ ースペース 86 色空間 83
strikeout オプ シ ョ ン 159 色を変更
SVG 199 オブ ジ ェ ク ト の 104
色 205 イ ン コ ア生成 64
SVG カ ラ ー フ ォ ン ト 128 印刷ス ト リ ーム順序 314
イ ン チ 68
イ ン ラ イ ン画像 188

426 索引
う 切 り 抜き 71

ウ ィ ド ー行 250
上付き 157 く
グ ラ デーシ ョ ン 98

え グ ラ フ ィ ッ ク 199
グ リ フ 109
エ スケープ シーケ ン ス 121
記号 フ ォ ン ト か ら選択 138
絵文字修飾シーケ ン ス 161
グ リ フ ID (GID) 指定 133
エ ラ ー処理 55
置換 183
エ ン コ ーデ ィ ング
入手可能性 152
カ ス タ ム 118
グ リ フ レ ッ ト 131
シ ス テムか らの取得 117
ク ロ マキーマス ク処理 195

お け
オーバープ リ ン ト 制御 107
権限 76
オー フ ァ ン行 250
権限パスワー ド 76
言語バイ ンデ ィ ング→バイ ンデ ィ ング

カ ーニ ング 157 こ
回転 69 コ ア フ ォ ン ト 143
カ ス タ ムエ ン コ ーデ ィ ング 118 高度な改行 254
カ ス タ ム構造種別 308 黒点補償 89
画像 コ ピー
拡縮 187 ページ枠を 226
デー タ を再利用 187
フ ァ イル形式 189
画像を拡縮 187

座標系 68
カテゴ リ
リ ソ ース 60 下向き 69
カ プ セル化 XObject メ ー ト ル 68
PDF/VT のための 373 サブ セ ッ ト 化 149
カ プ セル化 ヒ ン ト サブパス 71
PDF/VT のための 368
カ ラ ー フ ォ ン ト 128 し
カ ラ ーブ レ ン ド 98 シ ェ ーデ ィ ング 98
カ レ ン ト 点 72 しおり
環境変数 PDFLIBRESOURCEFILE 63 構造を持っ た 323
韓国語 119, 175 シ ス テムエ ン コ ーデ ィ ン グ対応 117
下付き 157
き 下向き座標 69
出力イ ン テ ン ト
記号フ ォ ン ト
PDF/A のための 349
グ リ フ を選択 138
PDF/X に対する 361, 362
輝度マス ク 105
商用ラ イ セ ン ス 13
機能
PDFlib の 24, 28 私用領域 (PUA) 109, 137
所有者パスワー ド 76
機能一覧
PDFlib 24
基本多言語面 109 す
キ ャ ッ プハイ ト 157 透か し (編集可能な) 236
キ ャ ラ ク タ ー と グ リ フ 109 スケー ラ ブルベ ク ト ルグ ラ フ ィ ッ ク (SVG)
キ ャ ラ ク タ ー メ ト リ ッ ク 157 199
行送 り 157 ス コ ープ ヒ ン ト

索引 427
PDF/VT のための 372 内容文字列 114
ス タ イル名 名前文字列 114
Windows の 145
ス テ ン シルマス ク 196
スポ ッ ト カ ラ ー (分版カ ラ ースペース) 91

日中韓 (日本語 ・ 中国語 ・ 韓国語)
Windows コ ー ド ページ 120
そ カ ス タ ム フ ォ ン ト 175
ソ フ ト マス ク 105 構成 119
日本語 119, 175

タ イ リ ングパ タ ーン 100 ぬ
ダウ ンサン プ リ ング 187 塗 り 71
タ グセ ッ ト 297, 298
タ グセ ッ ト 名前空間 309 ね
タ グ付き し お り 323 ネス ト
脱色 例外の 32
オブ ジ ェ ク ト を 104
縦書き 175
単位 68

バイ ト サービ ング 66
バイ ト 順序マー ク (BOM) 110, 115
ち ハイパーテキス ト 文字列 114
着色 バイ ンデ ィ ング 31
オブ ジ ェ ク ト を 104 パス 71
画像に 197 パスオブ ジ ェ ク ト 72
中国語 119, 175 パスワー ド 76
パ タ ーン ( タ イ リ ング) 100
つ バ ッ ク ス ラ ッ シ ュ置換 121
強 く 構造化 さ れた文書 338 バ リ ア ブル フ ォ ン ト 127
反転
オブ ジ ェ ク ト の色を 104

デ ィ セ ン ダー 157
テキス ト 位置 157 ひ
テキス ト 進行方向 175 評価版 11
テキス ト ス タ イル 157 標準 14 フ ォ ン ト 143
テキス ト フ ロー 238 標準化異体字シーケ ン ス 179
テキス ト メ ト リ ッ ク 157 標準構造種別 297
デ フ ォル ト 色空間 87 描線 71
デ フ ォル ト 座標 68
添付パスワー ド 76 ふ
テ ン プ レー ト 74 フ ァ イル検索 61
フ ォ ーム XObject 74
と フ ォ ーム フ ィ ール ド : PDFlib ブ ロ ッ クへの変
透過 換 389
PDF/VT 内の 373 フォン ト
OpenType 127
取 り 込まれた PDF ページ内で検出 373
SING 131
取 り 込み PDF ページ内で検出 373
TrueType 127
TrueType コ レ ク シ ョ ン 127
な Type 3 (ユーザー定義) 131
アル フ ァ チ ャ ン ネル Type 3 (ユーザー定義) フ ォ ン ト 131
内蔵 193 Windows のス タ イル名 145

428 索引
WOFF ・ WOFF2 130
記号グ リ フ を選択 138

ユーザースペース 68
サブ セ ッ ト 化 149
ユーザー定義 (Type 3) フ ォ ン ト 131
標準欧文 143
ユーザーパスワー ド 76
メ ト リ ッ ク 157
ユーザー定義 (Type 3) 131
リ ソ ース構成 59 よ
フ ォ ン ト 名エ イ リ ア ス設定 141 用字系固有の改行 254
不可視テキス ト 405 横書き 175
復号画像オプ シ ョ ン 197 読み上げ順序 314
復号配列 弱 く 構造化 さ れた文書 338
画像の色に対する 197
複数ページ画像 フ ァ イル 188
袋文字 405

リ ソ ース カ テ ゴ リ 60
プ ラグイ ン
ブ ロ ッ ク作成用 375
ブ レ ン ド モー ド 101, 104 れ
ブロ ッ ク 例外 55
POCA で作成 417 レ イ ヤー と PDI 215
プ ラ グ イ ン 375 レ コ ー ド レ ベル
ブ ロ ッ ク プ ロパテ ィ 378 PDF/VT のための 367
文書部分 ヒ エ ラ ルキー 367, 370 連携フ ァ イル 80
文書部分 メ タ デー タ (DPM) 367, 371

へ ロールマ ッ プ
ページ寸法規格 70 カ ス タ ム構造種別のための 308
ページ寸法限界 ログ記録 57
Acrobat の 71 論理読み取 り 順序 314
ページ定義 68
ベ ク ト ルグ ラ フ ィ ッ ク 199
編集可能なすか し 236


ホス ト エ ン コ ーデ ィ ング 117
ホス ト フ ォ ン ト 144


マ ス タ ーパスワー ド 76


ミ リ メ ー ト ル 68


メ ー ト ル座標 68
メ ト リ ッ ク 157
メ モ リ 内に PDF 文書を生成 64


文字参照 122

索引 429
ABC
PDFlib GmbH
Franziska-Bilek-Weg 9
80339 München, Germany
www.pdflib.com
電話 +49 • 89 • 452 33 84-0

ラ イ セ ン ス発行のお問い合わせ
sales@pdflib.com

サポー ト
support@pdflib.com (お持ちの ラ イ セ ン ス番号をお書 き く だ さ い)

You might also like