チュートリアル - PDFlib

ABC
PDFlib, PDFlib+PDI, PPS
A library for generating PDF on the fly
Version 8.0.3
チ ュ ー ト リ アル
Cobol ・ C ・ C++ ・ Java ・ Perl ・
PHP ・ Python ・ RPG ・ Ruby ・ Tcl エデ ィ シ ョ ン
Copyright © 1997–2011 PDFlib GmbH and Thomas Merz. All rights reserved.
PDFlib ユーザーは本マニ ュ アルを内部利用のために印刷または電子的に複製する こ と を許諾 さ れます。
PDFlib GmbH
Franziska-Bilek-Weg 9, 80339 München, Germany
www.pdflib.com
電話 +49 • 89 • 452 33 84-0
FAX +49 • 89 • 452 33 84-99
疑問点がおあ り の場合は tech.groups.yahoo.com/group/pdflib にある PDFlib メ ー リ ン グ リ ス ト と アー カ イ ブ
を ご覧 く だ さ い。
ラ イ セ ン ス取得のための連絡先 : [email protected]
商用 PDFlib ラ イ セ ン ス保持者向けサポー ト : [email protected] (ラ イ セ ン ス番号をお知らせ く だ さ い)
この出版物および こ こ に含まれた情報はあ り のま まに供給 さ れる ものであ り 、 通知な く 変更 さ れる こ と が
あ り 、 また、 PDFlib GmbH によ る誓約 と し て解釈 さ れるべき ものではあ り ません。 PDFlib GmbH はいかな
る誤 り や不正確に対 し て も責任や負担を全 く 負 う ものではな く 、 こ の出版物に関するいかな る類の (明示
的 ・ 暗示的または法定に関わ ら ず) 保障を も行 う ものではな く 、 そ し て、 いかな る そ し てすべての売買可
能性の保障 と 、 特定の目的に対する適合性 と 、 サー ド パーテ ィ の権利の侵害 と を明白に否認 し ます。
PDFlib と PDFlib ロ ゴは PDFlib GmbH の登録商標です。 PDFlib ラ イ セ ン ス保持者は PDFlib の名称 と ロ ゴ を彼
らの製品の文書内で用いる権利を与え られます。 ただ し 、 こ れは必須ではあ り ません。
Adobe ・ Acrobat ・ PostScript ・ XMP は Adobe Systems Inc. の商標です。 AIX ・ IBM ・ OS/390 ・ WebSphere ・
iSeries ・ zSeries は International Business Machines Corporation の商標です。 ActiveX ・ Microsoft ・ OpenType ・
Windows は Microsoft Corporation の 商標です。 Apple ・ Macintosh ・ TrueType は Apple Computer, Inc. の 商標
です。 Unicode ・ Unicode ロ ゴは Unicode, Inc. の 商標です。 Unix は The Open Group の 商標です。 Java ・
Solaris は Sun Microsystems, Inc. の 商標です。 HKS は HKS 商標連合= Hostmann-Steinberg ・ K+E Printing
Inks ・ Schmincke の登録商標です。 他の企業の製品 と サービ ス名は他の商標やサービ スマー ク である場合が
あ り ます。
ソ フ ト ウ ェ ア ア プ リ ケーシ ョ ンやユーザー向け文書で表示 さ れる PANTONE® カ ラ ーは PANTONE 定義規格 と
一致 し ない場合があ り ます。 正確な色については最新の PANTONE Color Publication を ご覧 く だ さ い。
PANTONE® およびその他の Pantone, Inc. の商標は Pantone, Inc. に帰属 し ます。 © Pantone, Inc., 2003.
Pantone, Inc. は PDFlib GmbH に対 し て PDFlib ソ フ ト ウ ェ ア と の組み合わせでのみ使用する ための頒布ラ イ
セ ン ス さ れた色デー タ および/または ソ フ ト ウ ェ アの著作権者です。 PANTONE カ ラ ーデー タ および/また
は ソ フ ト ウ ェ アは PDFlib ソ フ ト ウ ェ アの実行の部分 と し て以外に他のデ ィ ス ク上や メ モ リ 内へ複製 し ては
いけません。
PDFlib は以下のサー ド パーテ ィ ソ フ ト ウ ェ アの変更 さ れた部分を含んでいます。
ICClib、 Copyright © 1997-2002 Graeme W. Gill
GIF 画像デ コ ーダ、 Copyright © 1990-1994 David Koblas
PNG 画像参照ラ イ ブ ラ リ (libpng)、 Copyright © 1998-2004 Glenn Randers-Pehrson
Zlib 圧縮ラ イ ブ ラ リ 、 Copyright © 1995-2002 Jean-loup Gailly and Mark Adler
TIFFlib 画像ラ イ ブ ラ リ 、 Copyright © 1988-1997 Sam Leffler、 Copyright © 1991-1997 Silicon Graphics, Inc.
Eric Young の書いた Cryptographic ソ フ ト ウ ェ ア 、 Copyright © 1995-1998 Eric Young ([email protected])
Independent JPEG Group の JPEG ソ フ ト ウ ェ ア、 Copyright © 1991-1998, Thomas G. Lane
Cryptographic ソ フ ト ウ ェ ア、 Copyright © 1998-2002 The OpenSSL Project (www.openssl.org)
Expat XML パーサ、 Copyright © 1998, 1999, 2000 Thai Open Source Software Center Ltd
ICU International Components for Unicode、 Copyright © 1995-2009 International Business Machines
Corporation and others
参照 sRGB ICC カ ラ ープ ロ フ ァ イルデー タ 、 Copyright © 1998 Hewlett-Packard Company
PDFlib は RSA Security, Inc. の MD5 メ ッ セージダ イ ジ ェ ス ト アルゴ リ ズムを含んでいます。
目次
0 PDFlib ラ イ セ ン スキーの適用
1 導入
9
13
1.1 説明書 と サン プルの紹介 13
1.2 PDFlib プ ログ ラ ミ ング 15
1.3 PDFlib/PDFlib+PDI/PPS 8 の新機能 17
1.3.1 Acrobat 9 対応の PDF 機能 17
1.3.2 フ ォ ン ト 処理 と テ キ ス ト 出力 18
1.3.3 PDFlib Block Plugin と PDFlib Personalization Server (PPS) 20
1.3.4 その他の重要な機能 21
1.4 PDFlib の機能一覧 22
1.5 PDFlib+PDI の追加機能 26
1.6 PPS の追加機能 27
1.7 製品別機能一覧 28
2 PDFlib の言語バイ ンデ ィ ング
29
2.1 各言語バイ ンデ ィ ングにおけ るデー タ 型 29
2.2 Cobol バイ ンデ ィ ング 30
2.3 COM バイ ンデ ィ ン グ 31
2.4 C バイ ンデ ィ ング 32
2.5 C++ バイ ンデ ィ ング 36
2.6 Java バイ ンデ ィ ング 39
2.7 .NET バイ ンデ ィ ン グ 42
2.8 Perl バイ ンデ ィ ング 43
2.9 PHP バイ ンデ ィ ング 45
2.10 Python バイ ンデ ィ ング 47
2.11 REALbasic バイ ンデ ィ ング 48
2.12 RPG バイ ンデ ィ ン グ 49
2.13 Ruby バイ ンデ ィ ング 51
2.14 Tcl バイ ンデ ィ ング 53
目次
3
3 PDFlib 文書を作成
3.1
PDFlib
3.1.1
3.1.2
3.1.3
3.1.4
3.1.5
3.1.6
55
プ ロ グ ラ ミ ン グの一般的特徴 55
例外処理 55
PDFlib 仮想フ ァ イ ルシ ス テ ム (PVF) 57
リ ソ ース設定 と フ ァ イ ル検索 59
PDF 文書を メ モ リ 内に生成 63
大容量 PDF 文書 64
PDFlib を EBCDIC ベース のプ ラ ッ ト フ ォーム で利用 65
3.2 ページ記述 67
3.2.1 座標系 67
3.2.2 ページサ イ ズ 69
3.2.3 直接パス と パス オブジ ェ ク ト 70
3.2.4 テ ンプ レー ト 72
3.2.5 外部 PDF 文書内の参照ページ 73
3.3 暗号化 PDF 75
3.3.1 PDF のセキ ュ リ テ ィ 機能 75
3.3.2 PDFlib に よ る 文書保護 76
3.4 Web 最適化 (線形化) PDF 78
3.5 色を扱 う 79
3.5.1 パ タ ーン と ス ムーズシ ェーデ ィ ン グ 79
3.5.2
3.5.3
Pantone ・ HKS ・ カ ス タ ム ス ポ ッ ト カ ラ ー 80
カ ラ ーマネジ メ ン ト と ICC プ ロ フ ァ イ ル 83
3.6 さ ま ざ ま な イ ン タ ラ ク テ ィ ブ要素 86
3.6.1 リ ン ク ・ し お り ・ 注釈 86
3.6.2 フ ォーム フ ィ ール ド ・ JavaScript 88
3.7 地理空間 PDF 93
3.7.1 GeoPDF を Acrobat で使 う 93
3.7.2 地理座標系 と 投影座標系 93
3.7.3 座標系関連の作成例 94
3.7.4 Acrobat におけ る GeoPDF の制約 95
4 Unicode と レ ガシ エ ン コ ーデ ィ ング
97
Unicode の重要な概念 97
4.1
4.2 シ ングルバイ ト (8 ビ ッ ト ) エ ン コ ーデ ィ ング 99
4.3 日本語 ・ 中国語 ・ 韓国語エ ン コ ーデ ィ ング 103
4.4 PDFlib の文字列処理 106
4.4.1 内容文字列 ・ ハ イ パーテ キ ス ト 文字列 ・ 名前文字列 106
4.4.2 Unicode 対応言語バ イ ンデ ィ ン グの文字列 107
4.4.3 Unicode 非対応言語バ イ ンデ ィ ン グの文字列 107
4
目次
4.5 キ ャ ラ ク タ を指定 111
4.5.1 エ ス ケープシーケ ン ス 111
4.5.2 文字参照 112
5 フ ォ ン ト 処理
5.1
115
さ ま ざ ま な フ ォ ン ト 形式 115
5.1.1 TrueType フ ォ ン ト 115
5.1.2 OpenType フ ォ ン ト 115
5.1.3 PostScript Type 1 フ ォ ン ト 116
5.1.4 SING フ ォ ン ト (グ リ フ レ ッ ト ) 117
5.1.5 Type 3 フ ォ ン ト 117
5.2 Unicode のキ ャ ラ ク タ と グ リ フ 119
5.2.1 グ リ フ ID 119
5.2.2 グ リ フ に対する Unicode マ ッ ピ ン グ 119
5.2.3 Unicode 制御キ ャ ラ ク タ 120
5.3 テキス ト 処理パイ プ ラ イ ン 122
5.3.1 入力文字列を Unicode へ正規化 122
5.3.2 Unicode 値を グ リ フ ID へ変換 123
5.3.3 グ リ フ ID を転換 124
5.4 フ ォ ン ト を読み込む 125
5.4.1 テ キ ス ト フ ォ ン ト に対す る エン コ ーデ ィ ン グ を選ぶ 125
5.4.2 記号フ ォ ン ト に対す る エン コ ーデ ィ ン グ を選ぶ 127
5.4.3 フ ォ ン ト を検索 128
5.4.4 Windows ・ Mac OS X 上のホ ス ト フ ォ ン ト 133
5.4.5 予備フ ォ ン ト 135
5.5 フ ォ ン ト の埋め込み ・ サブ セ ッ ト 化 139
5.5.1 フ ォ ン ト の埋め込み 139
5.5.2 フ ォ ン ト のサブセ ッ ト 化 140
5.6 フ ォ ン ト 情報を取得 143
5.6.1 フ ォ ン ト 非依存のエン コ ーデ ィ ン グ ・ Unicode ・ グ リ フ名取得 143
5.6.2 フ ォ ン ト 依存のエン コ ーデ ィ ン グ ・ Unicode ・ グ リ フ名取得 144
5.6.3 コ ー ド ページ網羅性 と 予備フ ォ ン ト を取得 145
6 テキス ト 出力
6.1
147
さ ま ざ ま な テキス ト 出力方式 147
6.2 フ ォ ン ト メ ト リ ッ ク と テキス ト バ リ エーシ ョ ン 149
6.2.1 フ ォ ン ト と グ リ フ の メ ト リ ッ ク 149
6.2.2 カーニ ン グ 150
6.2.3 テ キ ス ト バ リ エーシ ョ ン 151
6.3 OpenType レ イ アウ ト 機能 154
目次
5
6.3.1
6.3.2
対応 し てい る OpenType レ イ ア ウ ト 機能 154
テ キ ス ト 行 ・ テ キ ス ト フ ロ ーで OpenType レ イ ア ウ ト 機能 157
6.4 複雑用字系出力 161
6.4.1 複雑用字系 161
6.4.2 用字系 と 言語 163
6.4.3 複雑用字系のシ ェーピ ン グ 164
6.4.4 双方向組版 164
6.4.5 ア ラ ビ ア文字テ キ ス ト 組版 167
6.5 日本語 ・ 中国語 ・ 韓国語テキス ト 出力 169
6.5.1 標準日中韓フ ォ ン ト 169
6.5.2 カ ス タ ム日中韓フ ォ ン ト 171
6.5.3 EUDC ・ SING フ ォ ン ト で外字キ ャ ラ ク タ を利用 172
6.5.4 OpenType レ イ ア ウ ト 機能 と 高度な日中韓テ キ ス ト 出力 173
7 画像 ・ PDF ページの取 り 込み
7.1
175
ラ ス タ 画像の取 り 込み 175
7.1.1 基本的な画像処理 175
7.1.2 対応画像フ ァ イ ル形式 177
7.1.3 ク リ ッ ピ ン グパス 180
7.1.4 画像マ ス ク と 透過 180
7.1.5 画像の着色 183
7.2 PDI で PDF ページ を取 り 込み 184
7.2.1 PDI の機能 と 用途 184
7.2.2 PDFlib で PDI 関数を利用 184
7.2.3 受け入れ可能な PDF 文書 186
7.3 画像 と 取 り 込み PDF ページの配置 188
7.3.1 単純にオブジ ェ ク ト を配置 188
7.3.2 オブジ ェ ク ト を枠内に置 く 189
7.3.3 オブジ ェ ク ト の向 き を変え る 191
7.3.4 オブジ ェ ク ト を回転 192
7.3.5 ページサ イ ズの調整 193
7.3.6 配置画像 ・ PDF ページに関す る 情報を取得 194
8 テキス ト ・ 表組版
197
テキス ト 行の配置 と はめ込み 197
8.1.1 単純なテ キ ス ト 行配置 197
8.1.2 テ キ ス ト を枠内に置 く 198
8.1.3 テ キ ス ト を枠にはめ込み 199
8.1.4 テ キ ス ト を文字で整列 さ せ る 201
8.1.5 ス タ ンプ を配置 202
8.1.6 リ ーダ を利用 202
8.1
6
目次
8.1.7
パ ス上のテ キ ス ト 203
8.2 複数行のテキス ト フ ロー 205
8.2.1 テ キ ス ト フ ロ ーをはめ込み枠に配置 207
8.2.2 段落の組版のオプシ ョ ン 208
8.2.3 イ ン ラ イ ンオプシ ョ ン リ ス ト と マ ク ロ 209
8.2.4 タ ブ位置 212
8.2.5 番号 リ ス ト と 段落間隔 212
8.2.6 制御キ ャ ラ ク タ と キ ャ ラ ク タ マ ッ ピ ン グ 214
8.2.7 ハ イ フ ネーシ ョ ン 216
8.2.8 標準改行アルゴ リ ズ ムの制御 217
8.2.9 高度な用字系固有の改行 221
8.2.10 テ キ ス ト をパ ス ・ 画像に回 り 込み 222
8.3 表の組版 226
8.3.1 単純な表を配置 227
8.3.2 表セルの さ ま ざ ま な内容 230
8.3.3 表 と 列の幅 232
8.3.4 さ ま ざ ま な種類の内容を持っ た表 233
8.3.5 表 イ ン ス タ ン ス 236
8.3.6 表組版のアルゴ リ ズ ム 239
8.4 範囲枠 242
8.4.1 テ キ ス ト 行を装飾 242
8.4.2 テ キ ス ト フ ロ ーで範囲枠を利用 243
8.4.3 範囲枠 と 画像 244
9 pCOS イ ン タ フ ェ ース
247
10 PDF のバージ ョ ン と 規格
249
10.1 Acrobat ・ PDF のバージ ョ ン 249
10.2 ISO 32000 252
10.3 PDF/X によ る印刷出力 253
10.3.1 PDF/X 規格フ ァ ミ リ 253
10.3.2 PDF/X 準拠出力の生成 254
10.3.3 出力 イ ン テ ン ト と 標準出力条件 257
10.3.4 PDI に よ る PDF/X 文書の取 り 込み 258
10.4 PDF/A によ る アー カ イ ビ ング 261
10.4.1 各種の PDF/A 規格 261
10.4.2 PDF/A 準拠の出力を生成 261
10.4.3 PDF/A 文書を PDI で取 り 込み 265
10.4.4 PDF/A 作成のためのカ ラ ー戦略 266
10.4.5 PDF/A のための XMP 文書 メ タ デー タ 267
10.5 タ グ付き PDF 270
目次
7
10.5.1
10.5.2
10.5.3
10.5.4
PDFlib で タ グ付 き PDF を生成 270
直接テ キ ス ト 出力 ・ テ キ ス ト フ ロ ーに よ る タ グ付 き PDF の作成 272
複雑な レ イ ア ウ ト におけ る ア イ テ ムのア ク テ ィ ブ化 273
Acrobat におけ る タ グ付き PDF の利用 276
11 PPS と PDFlib Block Plugin
279
11.1 PDFlib Block Plugin を イ ン ス ト ール 279
11.2 PDFlib
11.2.1
11.2.2
11.2.3
ブ ロ ッ クの概念あ ら ま し 281
文書デザ イ ン と プ ロ グ ラ ム コ ー ド と の分離 281
ブ ロ ッ ク プ ロ パテ ィ 281
PDF の フ ォーム フ ィ ール ド を利用 し ない理由は ? 282
11.3 PDFlib Block Plugin で ブ ロ ッ ク を編集 284
11.3.1 ブ ロ ッ ク を作成 284
11.3.2 ブ ロ ッ ク プ ロ パテ ィ を編集 288
11.3.3 ページ間 ・ 文書間でブ ロ ッ ク を コ ピー 290
11.3.4 PDF フ ォーム フ ィ ール ド を PDFlib ブ ロ ッ ク に変換 291
11.3.5 Block Plugin のユーザー イ ン タ フ ェース を XML でカ ス タ マ イ ズ 295
11.4 Acrobat で ブ ロ ッ ク を プ レ ビ ュ ー 296
11.5 PPS で ブ ロ ッ クへ流 し 込み 301
11.6 ブ ロ ッ クのプ ロパテ ィ 306
11.6.1 管理プ ロ パテ ィ 群 306
11.6.2 矩形プ ロ パテ ィ 群 307
11.6.3 書式プ ロ パテ ィ 群 308
11.6.4 テ キ ス ト 作成プ ロ パテ ィ 群 311
11.6.5 テ キ ス ト 組版プ ロ パテ ィ 群 312
11.6.6 オブジ ェ ク ト はめ込みプ ロ パテ ィ 群 315
11.6.7 デフ ォ ル ト 内容に関す る プ ロ パテ ィ 群 318
11.6.8 カ ス タ ムプ ロ パテ ィ 318
11.7 pCOS で ブ ロ ッ ク名 と プ ロパテ ィ を取得 319
11.8 PDFlib
11.8.1
11.8.2
11.8.3
ブ ロ ッ クの仕様 321
PDFlib ブ ロ ッ ク の PDF オブジ ェ ク ト 構造 321
ブ ロ ッ ク 辞書のキー 323
pdfmark で PDFlib ブ ロ ッ ク を生成 324
A 改訂履歴
索引
8
目次
329
327
0 PDFlib ラ イ セ ン スキーの適用
PDFlib GmbH が提供す る PDFlib ・ PDFlib+PDI ・ PPS のバ イ ナ リ バージ ョ ンはいずれ も 、 商
用 ラ イ セ ン ス をお持ちでな く て も 、 フル機能の評価版 と し て ご利用いただけ ます。 ただ し
未 ラ イ セ ン ス版では、 生成 さ れ る ページすべてに、 www.pdflib.com と い う デモ ス タ ン プ
が横断印字 さ れ、 ま た、 内蔵の pCOS イ ン タ フ ェース は小容量の文書に限 ら れます (詳 し
く は PDFlib チ ュ ー ト リ アルを参照)。 PDFlib ラ イ セ ン ス の取得を前向 き にご検討いただい
てい る 企業で、 評価段階やプ ロ ト タ イ プのデモ期間中に評価制約の除去を ご希望の場合
は、 [email protected] 宛に企業情報 ・ プ ロ ジ ェ ク ト 内容を簡単にご説明いただければ、 一
時的な ラ イ セ ン ス キーを ご提供 し ます (評価キーの提供をお断 り す る 権利を私達は保持い
た し ます。 た と えば匿名に よ る ご希望の場合等)。
PDFlib ・ PDFlib+PDI ・ PDFlib Personalization Server (PPS) は 1 つのパ ッ ケージ と し て頒
布 さ れてはい ますが、 それぞれ異な る 製品であ り 、 別々の ラ イ セ ン ス キーを必要 と す る こ
と に注意 し て く だ さ い。 PDFlib+PDI の ラ イ セ ン ス キーは PDFlib に対 し て も 有効ですが、
その逆は無効であ り 、 ま た、 PPS の ラ イ セ ン ス キーは PDFlib+PDI と PDFlib に対 し て有効
です。 すべての ラ イ セ ン ス キーはプ ラ ッ ト フ ォーム依存であ り 、 購入 さ れた対象のプ ラ ッ
ト フ ォームで し か使用で き ません。
PDFlib ま たは PDI の ラ イ セ ン ス キーを ご購入いただいた ら 、 それを適用 し てデモ ス タ
ンプ を除去 し て く だ さ い。 ラ イ セ ン ス キーを設定する にはい く つかの方法があ り ます。 以
下にそれを解説 し ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの general/license_key ト ピ ッ ク にあ り ます。
Windows イ ン ス ト ー ラ Windows イ ン ス ト ー ラ を使用す る 場合は、 製品を イ ン ス ト ール
す る 際に ラ イ セ ン ス キーを入力す る こ と がで き ます。 イ ン ス ト ー ラ は ラ イ セ ン ス キーを レ
ジ ス ト リ に追加 し ます (後述)。
API 呼び出 し で実行時に ラ イ セ ン スキー を適用 ス ク リ プ ト やプ ロ グ ラ ム に行 を 追加 し
て、 ラ イ セ ン ス キーを実行時に設定す る よ う に し ます。 PDFlib オブジ ェ ク ト を イ ン ス タ ン
ス化 し た直後に (すなわち、 PDF_new( ) かそれ と 同等の呼び出 し の後に)、 license パ ラ メ
タ を設定す る 必要があ り ます。 具体的な文法は、 使用す る プ ロ グ ラ ミ ン グ言語に よ っ て異
な り ます。
> C ・ Python の場合 :
PDF_set_parameter(p, "license", "...あなたのライセンスキー ...")
> C++ ・ Java ・ Ruby の場合 :
p.set_parameter("license", "...あなたのライセンスキー ...")
> Perl ・ PHP の場合 :
p->set_parameter("license", "...あなたのライセンスキー ...")
> RPG の場合 :
c
c
callp
RPDF_set_parameter(p:%ucs2('license'):
%ucs2('...あなたのライセンスキー ...'))
> TCL の場合 :
PDF_set_parameter $p, "license", "...あなたのライセンスキー ..."
9
ラ イ セ ン ス フ ァ イルの利用 実行時の呼び出 し で ラ イ セ ン ス キー を 与え る のでは な く 、
ラ イ セ ン ス キーを テ キ ス ト フ ァ イ ルに入力 し てお く と い う 方法 も あ り ま す。 次の形式に
従っ て く だ さ い (PDFlib のデ ィ ス ト リ ビ ュ ーシ ョ ンにはすべて、 ラ イ セ ン ス フ ァ イ ルテ ン
プ レー ト licensekeys.txt が入っ てい る ので、 それを ご利用いただ く こ と も で き ます)。 「#」
キ ャ ラ ク タ で始ま る 行は、 注釈を内容 と し てお り 、 無視 さ れます。 2 行目は、 ラ イ セ ン ス
フ ァ イ ル自体のバージ ョ ン情報を内容 と し てい ます :
# Licensing information for PDFlib GmbH products
PDFlib license file 1.0
PDFlib
8.0.3
...あなたのライセンスキー ...
ラ イ セ ン ス フ ァ イ ル内には、 複数の PDFlib GmbH 製品に対す る ラ イ セ ン ス キー群を、 そ
れぞれ別の行に記述す る こ と も で き ます。 ま た、 複数のプ ラ ッ ト フ ォームに対す る ラ イ セ
ン ス キー群を内容 と し て持たせ る こ と に よ り 、同一の ラ イ セ ン ス フ ァ イ ルを複数のプ ラ ッ
ト フ ォームで共用す る こ と も 可能です。 ラ イ セ ン ス フ ァ イ ルは、 下記の方法で設定す る こ
と がで き ます :
> licensekeys.txt と い う 名前の フ ァ イ ルが、 すべてのデフ ォ ル ト 位置で検索 さ れます (11
ページ 「デフ ォ ル ト フ ァ イ ル検索パ ス」 を参照)。
> licensefile パ ラ メ タ を set_parameter( ) API 関数で設定す る こ と も で き ます :
p.set_parameter($p, "licensefile", "/ファイルへの/パス/licensekeys.txt");
> ラ イ セ ン ス フ ァ イ ルを指 し 示す環境(シ ェ ル)変数を設定する こ と も で き ます。Windows
では、 シ ス テ ムの コ ン ト ロ ールパネルを使っ て、 「シ ス テム」 → 「詳細」 → 「環境変数」
を選択 し ます。 Unix では、 以下の よ う な コ マ ン ド を適用 し ます :
export PDFLIBLICENSEFILE=/ファイルへの/パス/licensekeys.txt
> IBM i5/iSeries では、 ラ イ セ ン ス フ ァ イ ルは下記の よ う に指定で き ます ( こ の コ マ ン ド
は、 ス タ ー ト ア ッ ププ ロ グ ラ ム QSTRUP 内で指定す る こ と がで き 、 すべての PDFlib
GmbH 製品で動作 し ます) :
ADDENVVAR ENVVAR(PDFLIBLICENSEFILE) VALUE(<... パス ...>) LEVEL(*SYS)
レ ジ ス ト リ に ラ イ セ ン スキー Windows では、下記の レ ジ ス ト リ キーに ラ イ セ ン ス フ ァ イ
ルの名前を書 き 込む と い う 方法 も あ り ます :
HKLM\SOFTWARE\PDFlib\PDFLIBLICENSEFILE
ま たは、下記の レ ジ ス ト リ キーの う ちのいずれか 1 つに ラ イ セ ン ス キーを直接書 き 込む こ
と も で き ます :
HKLM\SOFTWARE\PDFlib\PDFlib8\license
HKLM\SOFTWARE\PDFlib\PDFlib8\8.0.3\license
MSI イ ン ス ト ー ラ は、 イ ン ス ト ール時に与え ら れた ラ イ セ ン ス キーを、 こ れ ら のエン ト リ
の末尾に書 き 込みます。
注 64 ビ ッ ト Windows シ ス テム上で レ ジ ス ト リ を手作業で扱 う 際の注意点 : 通常どお り 、 64
ビ ッ ト の PDFlib バイ ナ リ は Windows レ ジス ト リ の 64 ビ ッ ト ビ ュ ー と と も に動作 し 、 64
ビ ッ ト シ ス テム上で動作する 32 ビ ッ ト の PDFlib バイ ナ リ はレ ジ ス ト リ の 32 ビ ッ ト ビ ュ ー
と と も に動作 し ます。 32 ビ ッ ト 製品に対する レ ジ ス ト リ キーを手作業で追加する必要が
ある と きは、 必ず 32 ビ ッ ト 版の regedit ツールを使用 し て く だ さ い。 これは 「ス タ ー ト 」
10
第 0 章 : PDFlib ラ イ セ ン スキーの適用
→ 「フ ァ イル名を指定 し て実行 ...」 のダ イ ア ロ グから下記によ っ て起動する こ と がで き ま
す:
%systemroot%\syswow64\regedit
デ フ ォ ル ト フ ァ イル検索パス Unix ・ Linux ・ Mac OS X ・ i5/iSeries シ ス テ ム では、 パス ・
デ ィ レ ク ト リ 名を何 も 指定 し な く て も 、デフ ォ ル ト でい く つかのデ ィ レ ク ト リ で フ ァ イ ル
群が検索 さ れます。 UPR フ ァ イ ル ( さ ら な る 検索パ ス を含んでい る 場合 も あ る ) を検索 し
て読み込む前に、 下記のデ ィ レ ク ト リ が検索 さ れます :
<rootpath>/PDFlib/PDFlib/8.0/resource/cmap
<rootpath>/PDFlib/PDFlib/8.0/resource/codelist
<rootpath>/PDFlib/PDFlib/8.0/resource/glyphlst
<rootpath>/PDFlib/PDFlib/8.0/resource/fonts
<rootpath>/PDFlib/PDFlib/8.0/resource/icc
<rootpath>/PDFlib/PDFlib/8.0
<rootpath>/PDFlib/PDFlib
<rootpath>/PDFlib
Unix ・ Linux ・ Mac OS X では、 <rootpath> は、 まず /usr/local で、 ついで HOME デ ィ レ ク
ト リ で置 き 換え ら れます。 i5/iSeries では <rootpath> は空です。
ラ イ セ ン ス ・ リ ソ ース フ ァ イルのデ フ ォ ル ト フ ァ イル名 デフ ォ ル ト で、 下記の フ ァ イ
ル名が、 デフ ォ ル ト 検索パ スデ ィ レ ク ト リ 群の中で検索 さ れます :
licensekeys.txt
pdflib.upr
(ライセンスファイル)
(リソースファイル)
こ の機能を利用す る と 、 環境変数や ラ ン タ イ ム オプシ ョ ン を一切設定せずに ラ イ セ ン ス
フ ァ イ ルを扱 う こ と も で き ます。
i5/iSeries ・ zSeries でのマルチ シ ス テム ラ イ セ ン ス フ ァ イル i5/iSeries・zSeries に対す る
ラ イ セ ン ス キーはシ ス テ ム固有ですので、 複数のシ ス テ ム間で共用す る こ と はで き ま せ
ん。 リ ソ ース の共有を実現 し 、 複数のシ ス テ ム で共用で き る 単一の ラ イ セ ン ス フ ァ イ ルで
作業を行 う には、 下記の ラ イ セ ン ス フ ァ イ ル形式を用いて、 複数のシ ス テ ム固有キーを単
一の フ ァ イ ル内に持たせ る こ と がで き ます :
PDFlib license file 2.0
# Licensing information for PDFlib GmbH products
PDFlib
8.0.3
...あなたのライセンスキー ...
PDFlib
8.0.3
...あなたのライセンスキー ...
...マシン1のシリアル番号...
...マシン2のシリアル番号...
1 行目のバージ ョ ン番号が変わ っ てい る 点 と 、 複数の ラ イ セ ン ス キーの後にそれぞれ、 16
進 8 桁のシ リ アル番号 (i5/iSeries の場合) か 16 進 4 桁の CPU ID (zSeries の場合) を付
加 し てい る 点に留意 し て く だ さ い。
i5/iSeries で ラ イ セ ン ス フ ァ イ ル を利用 i5/iSeries シ ス テ ムでは、 ラ イ セ ン ス フ ァ イ ルは
ASCII でエン コ ー ド さ れてい る 必要があ り ます (asciifile パ ラ メ タ 参照)。 以下の コ マ ン ド
は、 環境変数 PDFLIBLICENSEFILE が適切な ラ イ セ ン ス フ ァ イ ルを指 し 示す よ う 設定 し てい
ます。
ADDENVVAR ENVVAR(PDFLIBLICENSEFILE) VALUE('/PDFLIB/7.0.3/licensefile.txt')
LEVEL(*SYS)
11
ア ッ プデー ト と ア ッ プ グ レ ー ド ア ッ プデー ト (あ る 製品の古いバージ ョ ン か ら その同
じ 製品の新 し いバージ ョ ンへの切 り 換え) ま たはア ッ プグ レー ド (PDFlib か ら PDFlib+PDI
ま たは PPS への、 あ る いは PDFlib+PDI か ら PPS への切 り 換え) を購入 さ れた場合は、 そ
のア ッ プデー ト かア ッ プ グ レ ー ド に対 し て受け取っ た新 し い ラ イ セ ン ス キーを適用す る
必要が あ り ま す。 前の製品に対す る 古い ラ イ セ ン ス キーは も う 利用す る こ と がで き ま せ
ん。 なお、 ラ イ セ ン ス キーは、 あ る 製品バージ ョ ンのなかのすべての メ ン テナン ス リ リ ー
ス に対 し て有効です。 すなわち、 ラ イ セ ン ス に関する 限 り 、 すべての 8.0.x バージ ョ ンは
同 じ に扱われます。
未 ラ イ セ ン スの評価版機能 いずれの機能 も 、 ソ フ ト ウ ェ アに対 し て ラ イ セ ン ス キーを
一切適用せずに完全に評価 し ていただけ ます。 し か し 、 あ る 特定製品に対す る 有効な ラ イ
セ ン ス キーの適用後は、 それ よ り も 高いカ テ ゴ リ の機能は利用で き な く な り ます。 た と え
ば、 有効な PDFlib の ラ イ セ ン ス キーを イ ン ス ト ールす る と 、 PDI の機能は試用で き な く な
り ま す。 同様に、 PDFlib+PDI の ラ イ セ ン ス キーを イ ン ス ト ール し た後は、 パー ソ ナ ラ イ
ゼーシ ョ ン機能 (ブ ロ ッ ク 関数) は利用で き な く な り ます。
あ る 製品に対す る ラ イ セ ン ス キーがすでに イ ン ス ト ール さ れてい る 時は、 そのかわ り
にダ ミ ーの ラ イ セ ン ス文字列 「0」 (数字のゼ ロ ) を設定すれば、 それ よ り も 高い製品 ク ラ
ス の機能が試用で き る よ う にな り ます。 そ う す る こ と に よ り 、 それ以前に無効に さ れた関
数が有効にな り 、 ま た、 すべてのページ を横断する デモ ス タ ンプが再び有効にな り ます。
ラ イ セ ン ス オ プ シ ョ ン PDFlib の 1 台ま たは複数台のサーバ上での利用や、 PDFlib を利
用者自身の製品 と と も に再配布す る こ と に対 し ては、 それぞれ異な っ た ラ イ セ ン ス オプ
シ ョ ン がご利用いただけ ます。 サポー ト 契約や ソ ース コ ー ド 契約 も ご提供 し てお り ます。
ラ イ セ ン ス についての詳細情報 と PDFlib購入申込フ ォームはPDFlibデ ィ ス ト リ ビ ュ ーシ ョ
ンの中にあ り ます。 商用 PDFlib ラ イ セ ン ス のご購入に関心があ る 場合や、 ご質問に関 し
ては何で も 、 下記ま でご連絡 く だ さ い。
PDFlib GmbH, Licensing Department
Franziska-Bilek-Weg 9, 80339 München, Germany
www.pdflib.com
電話 +49 ・ 89 ・ 452 33 84-0、 FAX +49 ・ 89 ・ 452 33 84-99
ラ イ セ ン ス に関す る お問い合わせ : [email protected]
PDFlib ラ イ セ ン ス のサポー ト : [email protected]
12
第 0 章 : PDFlib ラ イ セ ン スキーの適用
1 導入
1.1 説明書 と サ ン プルの紹介
PDFlib 製品の有効活用を支援す る ために、 以下に挙げ る 資料を提供 し てい ます。
注 Windows Vista ・ Windows 7 では、 ミ ニサン プル と ス タ ー タ サン プルはデ フ ォル ト で
「Program Files」 デ ィ レ ク ト リ 内へイ ン ス ト ール さ れます。 Windows の保護スキームに従
い、 こ れ らのサン プルによ っ て作成 さ れる PDF 出力フ ァ イルは 「互換性フ ァ イル」 のも と
で し か見えません。 推奨 さ れる回避策 : サン プルの入っ た フ ォルダ をユーザーデ ィ レ ク ト
リ へ コ ピー し ます。
すべての言語バ イ ン デ ィ ン グ用の ミ ニサ ン プル ミ ニサン プル(hello・image・pdfclock 等)
は、 ど のパ ッ ケージに も 、 ど の言語バ イ ンデ ィ ン グ に も 入っ てい ま す。 最小限の コ ー ド
で、 テ キ ス ト 出力 ・ 画像 ・ ベ ク タ グ ラ フ ィ ッ ク の出力例を示 し てい ます。 こ の ミ ニサンプ
ルを使えば簡単に、 PDFlib が正 し く イ ン ス ト ールで き てい る か試 し た り 、 PDFlib アプ リ
ケーシ ョ ンの書 き 方を さ っ と 把握 し た り す る こ と がで き ます。
すべての言語バ イ ン デ ィ ン グ用のス タ ー タ サ ン プル ス タ ー タ サ ン プ ル は、 す べ て の
パ ッ ケージに入っ てお り 、 さ ま ざ ま な言語バ イ ンデ ィ ン グ で利用可能です。 主要な用途
で、 汎用的な出発点 と し て利用で き ます。 簡単なテ キ ス ト ・ 画像出力、 テ キ ス ト フ ロ ー ・
表組版、 PDF/A ・ PDF/X 生成、 その他 さ ま ざ ま な用途を網羅 し てい ます。 こ の ス タ ー タ
サンプルを見れば、PDFlib 製品を使っ て特定の目的を達す る ための基本技法を知 る こ と が
で き ます。 こ の ス タ ー タ サンプルを見てみ る こ と を強 く 推奨 し ます。
PDFlib チ ュ ー ト リ アル PDFlib チ ュ ー ト リ アル (本説明書) は、 ど のパ ッ ケージに も あ
る 1 個の PDF 文書で、 重要なプ ロ グ ラ ミ ン グ概念を よ り 詳 し く 、 小 さ な コ ー ド 例を用い
て説明 し て い ま す。 コ ー ド を ス タ ー タ サ ン プル よ り 拡張 し て い く に あ た っ て は、 こ の
PDFlib チ ュ ー ト リ アル内の関連す る 内容を知っ てお く 必要があ り ます。
注 本 PDFlib チ ュ ー ト リ アルでは、 作成例はたいてい Java 言語で示 さ れています (29 ページ
「2 章 PDFlib の言語バイ ンデ ィ ン グ」 の言語ご と の作成例 と 、 別途その旨特記するい く つ
かの C 特有の作成例を除いて)。 具体的な文法は言語ご と に異な り ますが、 PDFlib プ ログ
ラ ミ ングの基本概念は、 対応する どの言語バイ ンデ ィ ングについて も同 じ です。
PDFlib API リ フ ァ レ ン ス PDFlib API リ フ ァ レ ン スは、ど のパ ッ ケージに も あ る 1 個の PDF
文書で、 PDFlib アプ リ ケーシ ョ ンプ ロ グ ラ ミ ン グ イ ン タ フ ェース (API) を構成す る すべ
ての関数 ・ 引数 ・ オプシ ョ ン を簡潔に記述 し てい ま す。 引数の詳細や対応す る オプシ ョ
ン、 入力条件、 その他従 う べ き プ ロ グ ラ ミ ン グ規則を調べる には、 こ の PDFlib API リ フ ァ
レ ン ス が絶対の規範です。 こ れ以外の参照文書はどれ も 必ず し も 完全ではあ り ません。 た
と えば Javadoc の PDFlib API 一覧や、 php.net での PDFlib 関数一覧は不完全です。 PDFlib
を使用す る 際はかな ら ず、 PDFlib API リ フ ァ レ ン スの完全な内容を参照 し て く だ さ い。
pCOS パス リ フ ァ レ ン ス pCOS イ ン タ フ ェ ース を利用する と 、 PDF 文書か ら さ ま ざ ま な
特性を取得す る こ と がで き ます。 pCOS は PDFlib+PDI ・ PPS に内蔵 さ れてい ます。 pCOS
パ ス リ フ ァ レ ン ス は、PDF 文書内の個々の対象を指 し 示 し てそれぞれの値を取得す る ため
に用い ら れ る パ ス文法の説明を内容 と し てい ます。
1.1 説明書 と サン プルの紹介
13
PDFlib ク ッ ク ブ ッ ク PDFlib ク ッ ク ブ ッ ク は、 いろいろ な課題を達成する ための PDFlib
コ ー ド を集めてい ます。 ク ッ ク ブ ッ ク の例はたいてい Java 言語で書かれてい ますが、 簡
単に他のプ ロ グ ラ ミ ン グ言語に合わせ る こ と がで き ます。 なぜな ら PDFlib API は、 対応す
る ど の言語バ イ ンデ ィ ン グについて も ほぼ等価だか ら です。 こ の PDFlib ク ッ ク ブ ッ ク に
は、サンプルプ ロ グ ラ ムが ど ん ど ん追加 さ れてい ます。Web 上で下記 URL で利用可能です:
www.pdflib.com/pdflib-cookbook/
pCOS ク ッ ク ブ ッ ク pCOS ク ッ ク ブ ッ ク は、 PDFlib+PDI と PPS に含まれてい る pCOS イ
ン タ フ ェース の コ ー ド を集めてい ます。 pCOS イ ン タ フ ェース を利用す る と 、 PDF 文書か
ら さ ま ざ ま な特性を取得す る こ と がで き ます。 下記 URL で利用可能です :
www.pdflib.com/pcos-cookbook/
TET ク ッ ク ブ ッ ク PDFlib TET (Text Extraction Toolkit) は、 PDF 文書か ら テ キ ス ト や画
像を抽出す る ための別製品です。 こ れを PDFlib+PDI と 組み合わ る と 、 PDF 文書を その内
容に応 じ て処理す る こ と がで き ます。 TET ク ッ ク ブ ッ ク は、 TET のための コ ー ド を集めて
い ます。 こ の中には、 TET と PDFlib+PDI を組み合わせた利用例が含まれてい ます。 た と
えば、 ページ上のテ キ ス ト に応 じ て Web リ ン ク や し お り を追加 し た り 、 検索単語をハ イ
ラ イ ト し た り 、 テ キ ス ト に応 じ て文書を分割 し た り 、 目次を生成 し た り な ど です。 TET
ク ッ ク ブ ッ ク は下記 URL で利用可能です :
www.pdflib.com/tet-cookbook/
14
第 1 章 : 導入
1.2 PDFlib プ ロ グ ラ ミ ン グ
PDFlib と は何か PDFlib は、 Adobe の Portable Document Format (PDF) 形式の フ ァ イ ル
生成を可能にす る 開発 コ ン ポーネ ン ト です。 PDFlib は、 開発 し たプ ロ グ ラ ムに対す る バ ッ
ク エン ド と し て働 き ます。 アプ リ ケーシ ョ ンプ ロ グ ラ マーの役割 と し ては、 ただ処理 さ せ
たいデー タ を持っ て く れば よ く 、 後の仕事は PDFlib が全部引 き 継いで、 そのデー タ を視
覚化 し た PDF 出力を生成 し ます。 そのデー タ を視覚的に表現する PDF 出力の生成処理は
PDFlib がすべて請け負い ます。 PDFlib を使えば、 PDF の実際の内部構造を見 る こ と な し
に、 さ ま ざ ま なや り 方で出力を組版す る こ と がで き ます。 PDFlib のバ イ ナ リ パ ッ ケージで
は、 以下の製品が ま と めて 1 個のバ イ ナ リ に入っ てい ます。
> PDFlib。 テ キ ス ト やベ ク ト ルグ ラ フ ィ ッ ク ・ 画像 ・ ハ イ パーテ キ ス ト 要素を含んだ PDF
出力を作成す る ために必要な あ ら ゆ る 機能を持ち ます。 PDFlib は、 一行 ・ 複数行のテ
キ ス ト や画像の配置、 表の作成のための強力な組版機能を そな えてい ます。
> PDFlib+PDI。PDFlib の全機能に加え、既存 PDF 文書内のページ を取 り 込んだ出力が生成
で き る PDF 取 り 込み ラ イ ブ ラ リ (PDI) と 、 取 り 込み文書か ら 任意の PDF オブジ ェ ク
ト (ページ上の全フ ォ ン ト 一覧や メ タ デー タ 等 さ ま ざ ま な) を取得す る ための pCOS
イ ン タ フ ェース を含んでい ます。
> PDFlib Personalization Server (PPS)。 PDFlib+PDI に加え、 PDFlib ブ ロ ッ ク に自動流 し 込
みを行 う 機能 も 持ち ます。 ブ ロ ッ ク と は、 ページ上のプ レー ス ホルダであ り 、 その中
にテ キ ス ト や画像や PDF ページ を流 し 込め る も のです。ブ ロ ッ ク は、Adobe Acrobat 用
PDFlib Block Plugin (Mac 版 ・ Windows 版あ り ) を用いて対話的に作成す る こ と がで き 、
その中に、 PPS を用いて自動的に流 し 込みを行い ます。 こ のプ ラ グ イ ン も PPS に含ま
れてい ます。
PDFlib はどのよ う に利用で き るのか PDFlib は さ ま ざ ま なプ ラ ッ ト フ ォーム上で利用可
能です。 Unix ・ Windows ・ Mac のいずれで も 利用す る こ と がで き 、 ま た、 IBM i5/iSeries ・
zSeries と いっ た EBCDIC ベース のシ ス テ ムで も 使え ます。 PDFlib は C 言語で書かれてい
ま すが、 それ以外に も さ ま ざ ま な言語やプ ロ グ ラ ミ ン グ環境か ら 呼び出す こ と が可能で
す。 こ の よ う な言語や環境を言語バ イ ンデ ィ ン グ と 呼びます。 PDFlib の言語バ イ ンデ ィ ン
グは、 イ ン タ ーネ ッ ト と ス タ ン ド ア ロ ン両方の、 現在広 く 使用 さ れてい る あ ら ゆ る アプ リ
ケーシ ョ ン開発言語を カバー し てい ます。 PDFlib の API (アプ リ ケーシ ョ ンプ ロ グ ラ ミ ン
グ イ ン タ フ ェース) はわか り やす く 、 ま た、 ど のバ イ ンデ ィ ン グにおいて も 共通 し た形を
持っ てい ます。 現在、 対応 し てい る バ イ ンデ ィ ン グは以下の と お り です。
> COM。 Visual Basic や、 VBScript か JScript に よ る Active Server Pages、 Borland Delphi、
Windows Script Host な ど の環境で利用 さ れます
> ANSI C
> ANSI C++
> Cobol (IBM zSeries)
> Java。 J2EE サーブ レ ッ ト ・ JSP を含みます
> .NET。 C# や VB.NET、 ASP.NET な ど の環境で利用 さ れます
> PHP
> Perl
> Python
> REALbasic
> RPG (IBM i5/iSeries)
> Ruby。 Ruby on Rails を含みます
> Tcl
1.2 PDFlib プ ロ グ ラ ミ ング
15
PDFlib は何に使え るのか PDFlib の利用目的 と し て まず挙げ ら れ る のは、 自分の ソ フ ト
ウ ェ ア内や Web サーバ上で PDF を動的に作成す る こ と です。Web サーバ上で HTML ペー
ジ を動的に生成す る の と 同 じ よ う に、 PDFlib プ ロ グ ラ ム を使っ て PDF を動的に生成 さ せ
る よ う にすれば、 その中にユーザーか ら の入力を反映 さ せた り 、 Web サーバ上のデー タ
ベース か ら 抽出 し たデー タ な ど の動的デー タ を反映 さ せた り する こ と がで き ます。 PDFlib
を用いた アプ ロ ーチには以下の よ う な利点を挙げ る こ と がで き ます。
> PDFlib はデー タ 生成アプ リ ケーシ ョ ンに直接組み込め ます。
> こ の直接処理の採用に よ り 、PDFlib は PDF 生成手段 と し て最速であ り 、Web 用途に最適
です。
> PDFlib の ス レ ッ ド セーフ性 と 堅牢な メ モ リ ・ エ ラ ー処理は、 高パフ ォーマ ン ス なサー
バアプ リ ケーシ ョ ンの運用に対応 し ます。
> PDFlib は さ ま ざ ま なオペレーテ ィ ン グ シ ス テ ム、 さ ま ざ ま な開発環境で利用で き ます。
PDFlib 活用の必要条件 PDFlib を使えば、 PDF の実際の仕様を知 ら ずに PDF を生成で き
ます。 PDFlib は PDF の技術的な中身を な る べ く ユーザーか ら 隠 し てい ますが、 PDF に関
す る 一般的理解はあ る に こ し た こ と はあ り ません。PDFlib を最大限活用 し よ う と す る アプ
リ ケーシ ョ ンプ ロ グ ラ マーは、 PostScript (ひいては PDF) の基本的グ ラ フ ィ ッ ク モデル
をひ と と お り 理解 し てい る こ と が理想です。 と はいえ、 アプ リ ケーシ ョ ンプ ロ グ ラ マー と
し て相応の経験があ り 、画面表示や印刷用の何 ら かのグ ラ フ ィ ッ ク API の取扱経験があ る
な ら ば、 PDFlib の API について も そ う 障害な く 会得で き る と 思われます。
16
第 1 章 : 導入
1.3 PDFlib/PDFlib+PDI/PPS 8 の新機能
PDFlib/PDFlib+PDI/PPS 8 と Block Plugin 4 の主な新機能 ・ 改良機能を以下に挙げます。 こ
れ以外に も 多 く の新機能があ り ます:詳 し く は PDFlib API リ フ ァ レ ン ス を参照 し て く だ さ
い。
1.3.1 Acrobat 9 対応の PDF 機能
PDFlib は、Acrobat 9 (技術的には : PDF 1.7 Adobe 拡張レベル 3) に従っ た さ ま ざ ま な PDF
機能に対応 し てい ます。
外部グ ラ フ ィ ッ ク 内容 PDF 文書のページは、 他の PDF 文書のページへの参照を含む こ
と がで き ます。 こ れを参照 XObject と いい ます。 参照元フ ァ イ ルはプ レース ホルダだけ を
含みます。 た と えば画像の低解像度版や、 実際のページ内容がない と 記 し た単な る 注記な
ど です。 こ の技法を使えば、 繰 り 返 さ れ る 内容 ( ト ラ ンザ ク シ ョ ン印刷等) を何度 も 送 る
必要があ り ません。 参照 XObject は PDF/X-5g ・ PDF/X-5pg の重要な構成要素です。
レ イ ヤーバ リ ア ン ト レ イ ヤーバ リ ア ン ト (レ イ ヤー設定 と も いい ま す) は、 レ イ ヤー
のグループ と と ら え る こ と がで き ます。 レ イ ヤーを グループ化する こ と に よ り 、 印刷が安
全にな り ます。 なぜな ら 、 ユーザーが う っか り 間違っ たセ ッ ト の レ イ ヤーを有効 ・ 無効に
し て し ま う (た と えば特定の言語の レ イ ヤーを有効に し なが ら 、 全言語共用の画像 レ イ
ヤー を 有効に し 忘れ る ) こ と を 防げ る か ら です。 こ の理由か ら レ イ ヤーバ リ ア ン ト は、
PDF/X-4 ・ PDF/X-5 規格ではレ イ ヤー使用の基本 と な っ てい ます。
PDF ポー ト フ ォ リ オ PDF ポー ト フ ォ リ オは、 PDF やその他の文書を 1 個の実体に ま と
めた も ので、 こ れは Acrobat 9 で便利に利用す る こ と がで き ます。 フ ァ イ ル添付の整頓に
フ ォ ルダ構造を用いていなければ、 で き た PDF コ レ ク シ ョ ンは Acrobat 8 で も 利用可能で
す。 PDFlib では ま た、 PDF ポー ト フ ォ リ オ内の フ ァ イ ル添付の整頓を実現す る 定義済み ・
カ ス タ ム メ タ デー タ フ ィ ール ド を使 う こ と も で き ます。 新 し いア ク シ ョ ン を用いれば、 埋
め込んだ文書のページへ直接飛ぶ し お り を作 る こ と も 可能です。
地理参照付 き PDF GeoPDF は、 ページ全体に対す る 、 ま たはページ上の個別の地図に対
す る 、 地理参照情報を含みます。 Acrobat 9 は、 GeoPDF を操作す る ための さ ま ざ ま な機能
を提供 し てい ます。 PDFlib を使えば、 画像お よ びページの一部ま たは全体に対 し て地理空
間参照デー タ を割 り 当て る こ と がで き ます。
AES-256 暗号化 と Unicode パスワー ド PDFlib は、 セキ ュ リ テ ィ 向上のため AES-256 暗
号化に対応 し てい ます。 AES-256 は、 Acrobat 9 で導入 さ れてお り 、 Unicode パ ス ワー ド も
使 う こ と がで き ます。
Acrobat 9 文書の取 り 込み PDFlib+PDI ・ PPS で、 Acrobat 9 文書を取 り 込んで処理す る こ
と がで き ます。 pCOS イ ン タ フ ェ ース も Acrobat 9 文書を分析で き ます。
1.3 PDFlib/PDFlib+PDI/PPS 8 の新機能
17
1.3.2 フ ォ ン ト 処理 と テキス ト 出力
複雑用字系のシ ェ ー ピ ン グ と 双方向テキス ト 組版 単純用字系 ( ラ テ ン字等) は、 キ ャ
ラ ク タ が左か ら 右へ順番に置かれ る 用字系です。 複雑用字系では、 テ キ ス ト のシ ェーピ ン
グ ( コ ン テ キ ス ト に応 じ て適切な グ リ フ形を選ぶ) や、 キ ャ ラ ク タ の並べ替えや、 テ キ ス
ト を右か ら 左へ組むための追加処理が必要にな り ます。 PDFlib は、 ア ラ ビ ア ・ ヘブ ラ イ ・
デーヴ ァ ナーガ リ ー・ タ イ 用字系を含む さ ま ざ ま な用字系に対す る 複雑用字系出力が可能
です。
予備 フ ォ ン ト 予備フ ォ ン ト は、さ ま ざ ま な フ ォ ン ト と エン コ ーデ ィ ン グ関連の制約を扱
う ための強力な し く みです。 フ ォ ン ト を混ぜて組み合わせた り 、 足 り ない グ リ フ を他の
フ ォ ン ト か ら 持っ て来た り 、 エ ン コ ーデ ィ ン グ を拡張 し た り す る こ と が可能です。 予備
フ ォ ン ト は、合成フ ォ ン ト のデザ イ ンの相違に対応す る ために個別のグ リ フ の大 き さ を自
動的に調整す る こ と がで き ます。
OpenType レ イ ア ウ ト 機能 OpenType レ イ ア ウ ト 機能は、 フ ォ ン ト フ ァ イ ル内の追加
テーブルの形で、 OpenType フ ォ ン ト に賢 さ を追加 し ます。 こ れ ら のテーブルは、 合字 ・
ス モールキ ャ ピ タ ル・ ス ウ ォ ッ シ ュ キ ャ ラ ク タ と いっ た高度な タ イ ポグ ラ フ ィ 機能を記述
し ます。 ま た、 半角 ・ 全角 ・ プ ロ ポーシ ョ ナルグ リ フ ・ 異体字、 その他 さ ま ざ ま な高度な
日中韓テ キ ス ト 出力が可能です。
文書間で フ ォ ン ト を保持 フ ォ ン ト と 関連デー タ を、 生成文書の完了後 も メ モ リ に保持
し てお く こ と がで き ます。 こ れに よ り 、 次の文書で こ の フ ォ ン ト を再度解析す る 必要がな
く な り 、 フ ォ ン ト のサブセ ッ ト 化 と い っ た文書個別の処理だけが行われ る ので、 パフ ォー
マ ン ス が向上 し ます。
日中韓外字キ ャ ラ ク タ のための SING フ ォ ン ト 外字 と い う 日本語の用語は、広 く 使われ
て (苗字 ・ 地名等で) いなが ら も ど のエン コ ーデ ィ ン グ規格に も 含まれていないカ ス タ ム
キ ャ ラ ク タ を指 し ます。 Adobe の SING フ ォ ン ト アーキ テ ク チ ャ (グ リ フ レ ッ ト ) は、 日
中韓テ キ ス ト におけ る 外字問題を解決 し ま す。 PDFlib は、 SING フ ォ ン ト と 、 関連す る
Microsoft の EUDC フ ォ ン ト (エン ド ユーザー定義フ ォ ン ト ) の概念に対応 し てい ます。 予
備 フ ォ ン ト 機能を利用すれば、 SING ・ EUDC フ ォ ン ト を既存フ ォ ン ト に合成す る こ と も 可
能です。
フ ォ ン ト エ ン ジ ン を再設計 PDFlib の フ ォ ン ト エン ジ ンが再設計 さ れて最適化 さ れ、 さ
ま ざ ま な Unicode ・ エン コ ーデ ィ ン グ関連の利点が得 ら れ る と と も に、 全体的なパフ ォー
マ ン ス向上、 メ モ リ 使用量の低減を実現 し ま し た。 こ の再設計に よ り 、 い く つかの制約が
取 り 除かれ る こ と がで き 、 既存の機能の性能が拡張 さ れて い ま す。 た と えば、 Type 1 ・
Type 3 フ ォ ン ト で 256 個を超え る グ リ フ を指定 し た り 、ス ウ ォ ッ シ ュ キ ャ ラ ク タ を グ リ フ
名で指定 し た り す る こ と がで き る よ う にな り ま し た。
画像 ク リ ッ ピ ン グパスのまわ り に テキス ト を回 り 込み テ キ ス ト フ ロ ー組版 エ ン ジ ン
は、 テ キ ス ト を任意のパス に回 り 込ませ、 ま た、 取 り 込み TIFF ・ JPEG 画像の ク リ ッ ピ ン
グパ ス を用い る こ と も で き ます。 こ の よ う に し て、 複数行テ キ ス ト を画像に回 り 込ませ る
こ と がで き ます。
パス上のテキス ト テ キ ス ト を、 直線分 ・ 曲線 ・ 円弧を任意に混ぜた任意のベ ク ト ルパ
ス上に配置す る こ と がで き ます。 こ のパス はプ ロ グ ラ ムで構築す る こ と も 可能です。 あ る
18
第 1 章 : 導入
いは、 TIFF ・ JPEG 画像の ク リ ッ ピ ン グパ ス を抽出 し てテ キ ス ト パ ス と し て用い る こ と も
で き ます。
1.3 PDFlib/PDFlib+PDI/PPS 8 の新機能
19
1.3.3 PDFlib Block Plugin と PDFlib Personalization Server (PPS)
PDFlib Block Plugin は、 PDFlib Personalization Server (PPS) でブ ロ ッ ク 流 し 込み (パー ソ
ナ ラ イ ゼーシ ョ ン) を行 う ための PDF 文書の作成に使い ます。
PPS ブ ロ ッ ク 処理 を Acrobat で プ レ ビ ュ ー こ のプ ラ グ イ ンは、PPS に よ る ブ ロ ッ ク 流 し
込み処理のプ レ ビ ュ ーを Acrobat で直接生成す る こ と がで き ます。 迅速なプ レ ビ ュ ーに よ
り 、 デザ イ ナーは、 自分のブ ロ ッ ク 文書をサーバへ送っ て処理 さ せ る 前に、 その文書への
PPS 流 し 込みの結果をす ぐ に吟味す る こ と がで き ます。 プ レ ビ ュ ー PDF は、 デバ ッ グ と
開発の支援 と し て、 可能なエ ラ ー メ ッ セージ を持っ た し お り ・ レ イ ヤー ・ 注釈を内容 と し
て持ち ます。 こ のプ レ ビ ュ ー機能は開発サ イ ク ルを速め る と と も に、 PDFlib の諸機能を試
すための イ ン タ ラ ク テ ィ ブなテ ス ト フ レーム ワ ー ク と し て利用する こ と も で き ます。
ブ ロ ッ ク コ ン テ ナの PDF/A ・ PDF/X 状態 を複製 PDF/A ま たは PDF/X 文書に基づ く ブ
ロ ッ ク プ レ ビ ュ ーを生成する 際には、 Block Plugin は、 規格同定 ・ 出力 イ ン テ ン ト ・ メ タ
デー タ 等、 その規格の関連す る あ ら ゆ る 側面を複製す る こ と がで き ます。 PDF/A ・ PDF/
X 複製モー ド におけ る ブ ロ ッ ク 流 し 込み操作が、 選ばれてい る 規格に違反す る であ ろ う 場
合は (た と えばデフ ォ ル ト 画像が RGB 色空間を用いていなが ら 、 文書に適切な出力 イ ン
テ ン ト が含まれていない場合等)、エ ラ ー メ ッ セージが表示 さ れます。 こ のため、ユーザー
は起 こ り う る 規格違反を ワー ク フ ロ ーの非常に早い段階で捕捉する こ と がで き ます。
再設計 さ れたユーザー イ ン タ フ ェ ース と スナ ッ プ グ リ ッ ド PDFlib Block Plugin の ユ ー
ザー イ ン タ フ ェース は、 さ ま ざ ま な既存の、 そ し て新 し いブ ロ ッ ク プ ロ パテ ィ の利用を実
現す る ために再構築 さ れま し た。
新機能ス ナ ッ プグ リ ッ ド は、 ブ ロ ッ ク をデザ イ ン ラ ス タ に従っ てすばや く レ イ ア ウ ト
す る のに有用です。
ブ ロ ッ ク プ ロパテ ィ を追加 Block Plugin と PPS に新 し いブ ロ ッ ク プ ロ パテ ィ が さ ら に追
加 さ れま し た。 た と えば、 ブ ロ ッ ク 内に配置 さ れ る テ キ ス ト ・ 画像 ・ PDF 内容の透過を指
定す る こ と がで き ます。
PDFlib 8 の諸機能 を ブ ロ ッ ク で活用 複雑用字系のテ キ ス ト 出力やOpenType レ イ ア ウ ト
機能 と いっ た PDFlib 8 の関連する 新機能を、 ブ ロ ッ ク プ ロ パテ ィ で直接活用で き ます。 た
と えば、 ブ ロ ッ ク にア ラ ビ ア語や ヒ ンデ ィ ーのテ キ ス ト を流 し 込む こ と が可能です。
20
第 1 章 : 導入
1.3.4 その他の重要な機能
再利用可能なパス オ ブ ジ ェ ク ト パ ス オブジ ェ ク ト は、 いずれのページか ら も 独立に構
築 し て、 描線 ・ 塗 り ・ ク リ ッ ピ ン グのために複数回用い る こ と がで き ます。 パ ス オブジ ェ
ク ト は ま た、 回 り 込み形状 と し て用いた り (テ キ ス ト を不規則な形状の領域内に組む) 、
テ キ ス ト をパ ス上に配置す る ために用いた り す る こ と がで き ます。
PDF/X-4 ・ PDF/X-5 PDFlib は、 グ ラ フ ィ ッ ク アー ト 業界のための PDF/X-4 ・ PDF/X-5 規
格に従っ た出力を生成 し ます。 従来の PDF/X-1 ・ PDF/X-3 規格 と 異な り 、 こ れ ら は よ り
新 し い PDF バージ ョ ンに基づいてお り 、 透過 と レ イ ヤーを許容 し ます。 PDF/X-4p ・ PDF/
X-5pg では、外部的に参照 さ れた ICC プ ロ フ ァ イ ルを出力 イ ン テ ン ト と し て用い る こ と が
で き ます。 PDF/X-5g ・ PDF/X-5pg は、 外部グ ラ フ ィ ッ ク 内容の使用に対応 し てい ます。
TIFF ・ PNG 画像のアル フ ァ チ ャ ン ネル PDFlib は、 TIFF ・ PNG 画像を取 り 込む際、 画像
の透過 (アルフ ァ チ ャ ン ネル) に従い ます。 アルフ ァ チ ャ ン ネルは、 なめ ら かな遷移を生
み出 し 、 画像を背景に溶け込ませ る のに利用す る こ と がで き ます。
JBIG2 圧縮画像 JBIG2 は、 白黒画像のための高効率な画像圧縮形式です。 PDFlib は、 単
ページ ・ 複数ページの JBIG2 画像を取 り 込み、 その圧縮の利点を生成 PDF 出力内で維持
し ます。
圧縮オ ブ ジ ェ ク ト ス ト リ ーム ・ 相互参照ス ト リ ーム PDFlib は、 圧縮オブジ ェ ク ト ス ト
リ ーム と 相互参照ス ト リ ーム を生成 し ます。 こ れ ら の方式は、 生成 PDF 文書全体の フ ァ
イ ルサ イ ズ を低減す る と と も に、 旧来の相互参照テーブルを持つ PDF に課せ ら れ る 従来
の 10 GB の制約を超え て飛ぶ こ と を PDF 文書で可能に し ます。 10 GB は と んで も な く 大
き なデー タ と 思われ る か も し れませんが、 ト ラ ンザ ク シ ョ ン印刷の分野では こ の限界に達
す る 応用例が増え て き てい ます。 PDFlib ユーザーが こ の領域の PDF 文書を生成 し たいシ
ナ リ オは今後ますます増え てい く と 我々は予測 し てい ます。
内蔵 PANTONE® Goe™ カ ラ ー ラ イ ブ ラ リ PDFlib は、 コ ー ト 紙 ・ 上質紙用の新色 2058 色
と 新カ ラ ー命名方式を持つ PANTONE® Goe™ カ ラ ー ラ イ ブ ラ リ に対応 し てい ます。 こ の
Goe™ カ ラ ー ラ イ ブ ラ リ は Pantone, Inc. に よ っ て 2008 年に導入 さ れた も のです。
既存関数の改良 以下に、 PDFlib 8 におけ る 既存機能の最 も 重要な改良を挙げます :
> 画像の詳細を PDF_info_image( ) で取得
> PPS と Block Plugin:新 し いPDFlibの諸機能を PDFlibブ ロ ッ ク を通 じ て利用可能 と す る 追
加のブ ロ ッ ク プ ロ パテ ィ
> Unix シ ス テ ム上での Unicode フ ァ イ ル名
> 表組版機能 : パス オブジ ェ ク ト ・ 注釈 ・ フ ォーム フ ィ ール ド を表セル内に配置
> テ キ ス ト フ ロ ー : 追加の組版制御オプシ ョ ン、 高度な言語個別の改行
> 影付 き テ キ ス ト
> 取 り 込み画像内の XMP メ タ デー タ を保持
> PDF_info_font( ) におけ る さ ま ざ ま な改良
> し お り 作成のための追加のオプシ ョ ン
> C++ バ イ ンデ ィ ン グにおけ る 設定可能な文字列デー タ 型 (wstring で Unicode 対応等)
1.3 PDFlib/PDFlib+PDI/PPS 8 の新機能
21
1.4 PDFlib の機能一覧
表 1.1 に、 PDF lib の主な PDF 生成機能を挙げます。 PDFlib 8 の新機能 ・ 改良機能には注
釈を付 し てい ます。
表 1.1 PDFlib の機能一覧
分類
機能
PDF 出力
PDF 文書をデ ィ ス ク フ ァ イルまたは (Web サーバで) 直接 メ モ リ 上へ生成
大容量出力、 任意の PDF フ ァ イルサイ ズ (10 GB 超も 可)
ページの一時停止 / 再開 ・ 挿入機能で、 ページ を順番によ ら ず生成
各種 PDF
PDF 1.3 ~ PDF 1.7ext31 (Acrobat 4 ~ 9)。 ISO 32000-1 (= PDF 1.7) も
線形化 (Web 最適化) PDF によ る、 Web 上でのバイ ト サービ ング
タ グ付き PDF によ る ア ク セ シ ビ リ テ ィ ・ リ フ ロー
マー ク付き内容に よ る ア プ リ ケーシ ョ ン独自デー タ ・ 代替テキス ト を タ グ付けな し で追加 1
ISO 規格
ISO 15930 : PDF/X。 グ ラ フ ィ ッ ク アー ト 業界向け 1
ISO 19005 : PDF/A。 アー カ イ ビ ン グ用
ISO 32000 : PDF 1.7 の標準化バージ ョ ン 1
グラ フ ィ ッ ク
一般的な基本ベ ク ト ルグ ラ フ ィ ッ ク要素 : 線 ・ 曲線 ・ 円弧 ・ 楕円 1 ・ 矩形等
スムーズシ ェ ーデ ィ ング (カ ラ ーブ レ ン ド ) ・ パ タ ーン塗 り / 描線
透過 (不透明) ・ ブ レ ン ド モー ド
外部グ ラ フ ィ ッ ク 内容 (参照 XObject) によ る可変デー タ 印刷 1
再利用可能パスオブ ジ ェ ク ト 、 ク リ ッ ピ ングパス を画像か ら取 り 込み 1
レ イ ヤー
表示を切 り 替え ら れる オプ シ ョ ナルなページ内容
注釈 ・ フ ォ ーム フ ィ ール ド を レ イ ヤー上に配置可
レ イ ヤーのロ ッ ク 、 表示倍率に よ る自動表示な ど
PDF/X-4 ・ PDF/X-5 のレ イ ヤーバ リ ア ン ト
フォン ト
1
(レ イヤーのグループ化で誤印刷防止)
TrueType (TTF ・ TTC) ・ PostScript Type 1 フ ォ ン ト (PFB ・ PFA、 Mac では LWFN も )
PostScript/TrueType のアウ ト ラ イ ン を持つ OpenType フ ォ ン ト (TTF ・ OTF)
欧文 ・ 日中韓テキス ト 出力のための何ダース もの OpenType レ イ アウ ト 機能に対応。 例 :
合字 ・ ス モールキ ャ ピ タ ル ・ オール ド タ イ プ数字 ・ スウ ォ ッ シ ュ キ ャ ラ ク タ ・ 簡体 / 繁
体 ・ 縦書き字体 1
Windows ・ Mac シ ス テムに イ ン ス ト ール さ れている フ ォ ン ト (「ホス ト フ ォ ン ト 」) の直接利
用
あ ら ゆる種類のフ ォ ン ト の埋め込み。 TrueType ・ OpenType ・ Type 3 フ ォ ン ト のサブ セ ッ ト
化
ユーザー定義 (Type 3) フ ォ ン ト に よ る ビ ッ ト マ ッ プ フ ォ ン ト やカ ス タ ムロ ゴ
EUDC ・ SING1 フ ォ ン ト (グ リ フ レ ッ ト ) で、 日中韓外字キ ャ ラ ク タ
予備 フ ォ ン ト (足 り ないグ リ フ を補助のフ ォ ン ト か ら取得)
フ ォ ン ト を文書間で保持 し 、 パ フ ォ ーマ ン ス向上 1
22
第 1 章 : 導入
1
表 1.1 PDFlib の機能一覧
分類
機能
テキス ト 出力
さ ま ざ ま な フ ォ ン ト で テキス ト 出力。 テキス ト に下線 ・ 上線 ・ 取 り 消 し 線
フ ォ ン ト 内のグ リ フ を数値 ・ Unicode 値 ・ グ リ フ 名 1 で指定可能
カ ーニ ングで、 文字間隔を改善
テキス ト を太字化 ・ 斜体化 ・ 影付き 1
パス上にテキス ト を生成 1
日中韓 フ ォ ン ト で プ ロポーシ ョ ナル幅 1
見つか ら ないグ リ フ の代替設定
国際化
ページ内容 ・ イ ン タ ラ ク テ ィ ブ要素 ・ フ ァ イル名 1 に Unicode 文字列。 UTF-8 ・ UTF-16 ・
UTF-32 形式
多様な 8 ビ ッ ト ・ レ ガシ マルチバイ ト 日中韓エ ン コ ーデ ィ ング (Shift-JIS ・ Big5 等) に対
応
シ ス テムから コ ー ド ページ を取得 (Windows ・ IBM i5/iSeries ・ zSeries)
日本語 ・ 中国語 ・ 韓国語テキス ト の標準 ・ カ ス タ ム日中韓フ ォ ン ト ・ CMap
日本語 ・ 中国語 ・ 韓国語テキス ト の縦書き
ア ラ ビ ア語 ・ タ イ語 ・ デーヴ ァ ナーガ リ ー等の複雑用字系のキ ャ ラ ク タ シ ェ ーピ ング 1
ア ラ ビ ア語 ・ ヘブ ラ イ語等の右書き用字系の双方向テキス ト 組版 1
Unicode 情報を PDF 内に埋め込み、 Acrobat での適切な テキス ト 抽出を促す
画像
BMP ・ GIF ・ PNG ・ TIFF ・ JBIG21 ・ JPEG ・ JPEG 20001 ・ CCITT ラ ス タ 画像の埋め込み
画像フ ァ イル形式の自動検出
画像情報の取得 (ピ ク セルサイ ズ ・ 解像度 ・ ICC プ ロ フ ァ イル ・ ク リ ッ ピ ングパスな ど)
TIFF ・ JPEG 画像内の ク リ ッ ピ ングパス を解釈
TIFF ・ PNG 画像内のアルフ ァ チ ャ ン ネル (透過) を解釈 1
画像マス ク (透過画像に色を適用)、 スポ ッ ト カ ラ ーに よ る画像着色
色
グ レースケール ・ RGB (数値 ・ 16 進列 ・ HTML 色名) ・ CMYK ・ CIE L*a*b* カ ラ ー
PANTONE® カ ラ ー (PANTONE® Goe™ も)
1
・ HKS® カ ラ ー対応内蔵
ユーザー定義スポ ッ ト カ ラ ー
カ ラー
マネジ メ ン ト
ICC プ ロ フ ァ イルに よ る ICC 準拠カ ラ ー。 ICC 4 プ ロ フ ァ イル対応 1
テキス ト ・ 図形 ・ ラ ス タ 画像のレ ン ダ リ ング イ ン テ ン ト
デ フ ォ ル ト グ レー ・ RGB ・ CMYK カ ラ ースペースで、 デバイ ス独自カ ラ ーを再対応付け
PDF/A ・ PDF/X の出力イ ン テ ン ト に ICC プ ロ フ ァ イル
アー カ イ ビ ング
PDF/A-1a ・ PDF/A-1b (ISO 19005-1)
PDF/A-1 の XMP 拡張スキーマ
グラ フ ィ ッ ク
アー ト
PDF/X-1a ・ PDF/X-3 ・ PDF/X-41 ・ PDF/X-4p1 ・ PDF/X-5p1 ・ PDF/X-5pg1 (ISO 15930)
1.4 PDFlib の機能一覧
23
1
表 1.1 PDFlib の機能一覧
分類
機能
埋め込み / 外部参照 1 出力イ ン テ ン ト ICC プ ロ フ ァ イル
PDF/X-5p ・ PDF/X-5pg の外部グ ラ フ ィ ッ ク 内容 (参照ページ)
1
取 り 込み画像の OPI 1.3 ・ OPI 2.0 情報を生成
分版情報 (PlateColor)
テキス ト のヌ キ ・ ノ セな どの設定
テキス ト フ ロー
組版
テキス ト を、 1 個ない し 複数の矩形内に、 または任意形状領域内に組版。 ハイ フ ネーシ ョ
ン (ユーザー定義ハイ フ ネーシ ョ ン位置が必要) ・ フ ォ ン ト / 色変更 ・ 揃え方式 ・ タ ブ ・
リ ーダ ・ 制御コ マ ン ド を指定可能。 テキス ト を画像に回 り 込み
言語独自処理で高度な改行
柔軟な画像貼 り 付け ・ 組版
画像または画像の ク リ ッ ピ ングパス 1 にテキス ト を回 り 込み
表組版
さ ま ざ ま なユーザー設定に従っ て表行 ・ 表列のサイ ズを自動計算 し て配置する表組版機能。
複数ページにわた る表も 可能。
表セル内に、 一行 / 複数行テキス ト ・ 画像 ・ PDF ページ ・ パスオブ ジ ェ ク ト ・ 注釈 ・
フ ォ ーム フ ィ ール ド を配置可能
表セルを、 枠線 ・ 背景色オプ シ ョ ン を指定 し て組版可能
柔軟なス タ ン プ機能
貼 り 付け画像等各種オブ ジ ェ ク ト の座標を参照する範囲枠の概念
セキ ュ リ テ ィ
RC4 (40/128 ビ ッ ト ) または AES 暗号化アルゴ リ ズム (128/2561 ビ ッ ト ) で PDF 出力を
暗号化
Unicode パスワー ド
1
権限設定の指定 (印刷不可 ・ コ ピー不可等)
インタ ラ クテ ィ ブ
要素
フ ォ ーム フ ィ ール ド の生成。 すべての フ ィ ール ド オプ シ ョ ン と JavaScript を設定可能
フ ィ ール ド 群から バー コ ー ド を生成
し お り ・ 注釈 ・ ページ を開 く / 閉 じ る等各種イ ベン ト に対する ア ク シ ョ ンの生成
し お り の生成。 さ ま ざ ま なオプ シ ョ ン ・ 制御を設定可能
ページ遷移効果 (シ ェ ー ド ・ モザイ ク 等)
PDF リ ン ク ・ 起動 リ ン ク (他の文書種別) ・ Web リ ン ク等、 あ ら ゆる種類の PDF 注釈を生
成可能
リ ン ク ・ し お り ・ 文書を開 く ア ク シ ョ ンに名前付き移動先
ページ ラ ベル (ページのシ ンボ リ ッ ク 名) の生成
マルチ メ デ ィ ア
PDF 内に 3D アニ メ ーシ ョ ン を埋め込み
GeoPDF
地理空間参照情報を持つ PDF の生成 1
タ グ付き PDF
タ グ付き PDF ・ 構造情報の生成に よ る、 ア ク セシ ビ リ テ ィ ・ ページ リ フ ロー ・ 内容再利用
改善。 リ ン ク等各種注釈を文書構造へ入れ込み可能
メ タ デー タ
文書情報 : 標準フ ィ ール ド ( タ イ ト ル ・ サブ タ イ ト ル ・ 作成者 ・ キーワー ド ) ・ ユーザー定
義フ ィ ール ド
24
第 1 章 : 導入
表 1.1 PDFlib の機能一覧
分類
機能
文書情報フ ィ ール ド から、 または ク ラ イ ア ン ト が与えた XMP ス ト リ ームから XMP メ タ
デー タ を生成
TIFF ・ JPEG ・ JPEG 2000 画像内の XMP 画像 メ タ デー タ を処理 1
プ ロ グ ラ ミ ング
Cobol ・ COM ・ C ・ C++1 ・ Java ・ .NET ・ Perl ・ PHP ・ Python ・ REALbasic ・ RPG ・ Ruby ・ Tcl
の言語バイ ンデ ィ ン グ
仮想フ ァ イルシ ス テムによ る イ ン メ モ リ 処理 (デー タ ベースの画像処理な ど)
1. PDFlib 8 の新機能 / 大幅改良機能
1.4 PDFlib の機能一覧
25
1.5 PDFlib+PDI の追加機能
PDFlib+PDI ・ PPS には、 表 1.1 に示 し た基本的な PDF 生成機能に加えて、 表 1.2 に挙げ る
機能があ り ます。
表 1.2 PDFlib+PDI の追加機能一覧
分類
機能
PDF 入力 (PDI)
既存 PDF 文書から ページ を取 り 込み
PDF 1.7 拡張レ ベル 3 (Acrobat 9) ま でのすべてのバージ ョ ンの PDF を取 り 込み可能1
すべての PDF 標準暗号化アルゴ リ ズムによ る暗号化文書を取 り 込み可能 (要マ ス タ ーパス
ワー ド ) 1
取 り 込みページの情報を取得 1
取 り 込みページのページ寸法を複製 (BleedBox ・ TrimBox ・ CropBox 等)
1
複数の取 り 込み PDF 文書にわた る冗長なオブ ジ ェ ク ト (同一フ ォ ン ト 等) を削除
異常な入力 PDF 文書を修復 1
取 り 込み PDF 文書から PDF/A ・ PDF/X 出力イ ン テ ン ト を複製
pCOS
イ ン タ フ ェ ース
pCOS イ ン タ フ ェ ースで、 取 り 込み PDF 文書の詳細を取得 1
1. PDFlib+PDI 8 の新機能 / 大幅改良機能
26
第 1 章 : 導入
1.6 PPS の追加機能
表 1.3 に、 PDFlib Personalization Server (PPS) でのみ利用可能な機能を挙げます (表 1.1
に示 し た基本的な PDF 生成機能 と 表 1.2 に示 し た PDF 取 り 込み機能に加え て)。
表 1.3 PDFlib Personalization Server (PPS) の追加機能一覧
分類
機能
可変デー タ 処理
(PPS)
PDFlib ブ ロ ッ ク にテキス ト ・ 画像 ・ PDF デー タ を流 し 込んで PDF をパー ソ ナ ラ イ ズ
PDFlib Block Plugin
PDFlib Block Plugin で、 Windows ・ Mac 版 Acrobat 上で PDFlib ブ ロ ッ ク を対話的に作成
再設計 さ れたユーザー イ ン タ フ ェ ース 1
PPS ブ ロ ッ ク流 し 込みを Acrobat 上で プ レ ビ ュ ー 1
Acrobat 上で ブ ロ ッ ク を対話的に作成 ・ 編集する際のスナ ッ プグ リ ッ ド
1
ブ ロ ッ ク コ ン テナの PDF/X ・ PDF/A プ ロパテ ィ を複製 1
PDF フ ォ ーム フ ィ ール ド を PDFlib ブ ロ ッ ク に変換 し て、 自動流 し 込み可能に
テキス ト フ ローブ ロ ッ ク を連結 し て、 ブ ロ ッ ク であふれた テキス ト を次のブ ロ ッ クへ
ブ ロ ッ ク プ ラ グ イ ン に PANTONE® ・ HKS® スポ ッ ト カ ラ ー名一覧を内蔵 1
1. PDFlib Personalization Server 8 の新機能 / 大幅改良機能
1.6 PPS の追加機能
27
1.7 製品別機能一覧
表 1.4 は、 PDFlib フ ァ ミ リ の各種製品の機能一覧です。
基本的な PDF 生成
以下に挙げる もの以外すべて
PPS
API 関数 ・ 引数 ・ オプ シ ョ ン
PDFlib+PDI
機能
PDFlib
表 1.4 製品別機能一覧
○
○
○
1
○
○
線形化 (Web 最適化) PDF
PDF_end_document( ) の linearize オプ シ ョ ン
○
PDF の最適化 (効果的でない ク ラ イ ア ン
ト コ ー ド と 、 最適化 さ れていない取 り 込
み PDF 文書に対 し てのみ意味を持ち ま
す)
PDF_end_document( ) の optimize オプ シ ョ ン
○1
○
○
参照 PDF、 PDF/X-5g ・ PDF/X-5pg
PDF_begin_template_ext( ) ・ PDF_open_pdi_page( )
の reference オプ シ ョ ン
○1
○
○
ポー ト フ ォ リ オ作成のために PDF 文書を PDF_add_portfolio_file( ) の password オプ シ ョ ン
解析
○1
○
○
PDF 取 り 込み (PDI)
すべての PDI 関数
―
○
○
既存 PDF から pCOS で情報を取得
すべての pCOS 関数
―
○
○
ブ ロ ッ ク によ る可変デー タ 処理 ・ パー ソ
ナ ラ イ ゼーシ ョ ン
ブ ロ ッ ク流 し 込みのためのすべての PPS 関数
―
―
○
Acrobat 用 PDFlib Block Plugin
PPS で利用する ための PDFlib ブ ロ ッ ク を対話的
に作成
―
―
○
1. この機能には内部的に PDI を必要 と するので、 PDFlib ソ ース コ ー ド パ ッ ケージ では利用で き ません
28
第 1 章 : 導入
2 PDFlib の言語バイ ンデ ィ ング
注 ス タ ー タ サン プルに目を通 さ れる こ と を強 く 推奨 し ます。 すべての PDFlib パ ッ ケージに
入っ ています。 ア プ リ ケーシ ョ ン開発の出発点 と し て有用です。 PDFlib プ ロ グ ラ ミ ングの
重要な点を多数網羅 し ています。
2.1 各言語バ イ ン デ ィ ン グにおけ る デー タ 型
こ の説明書では、 さ ま ざ ま な言語バ イ ンデ ィ ン グにおけ る 関数 / メ ソ ッ ド のプ ロ ト タ イ プ
を示 し てい ま す。 言語バ イ ンデ ィ ン グ に よ る 主な違いは、 オブジ ェ ク ト 指向言語バ イ ン
デ ィ ン グでは PDFlib メ ソ ッ ド は名前に PDF_ 接頭辞がないのに対 し 、それ以外の言語バ イ
ンデ ィ ン グではすべての関数名に PDF_ 接頭辞がついてい る こ と です。 ま た、 非オブジ ェ
ク ト 指向言語バ イ ンデ ィ ン グではすべての関数に 1 番目の引数 と し て PDF コ ン テ キ ス ト
引数を与え る 必要があ り ます。 こ れに対 し 、 オブジ ェ ク ト 指向言語バ イ ンデ ィ ン グは言語
ラ ッ パが作成す る オブジ ェ ク ト の中に PDF コ ン テ キ ス ト を隠 し てい ます。
表 2.1 に、 すべての言語バ イ ンデ ィ ン グにおけ る PDF 文書型 と 文字列文書型の使い方
を挙げます。テ キ ス ト と 文字列の扱いについて詳 し く は PDFlib チ ュ ー ト リ アルを参照 し て
く だ さ い。 デー タ 型 integer ・ long ・ double については、 すべてのバ イ ンデ ィ ン グで こ れ
ら の型には明 ら かな対応づけがあ り ますので、 ふれてい ません。
表 2.1 各言語バイ ンデ ィ ン グにおけるデー タ 型一覧
言語バイ ンデ ィ ン
グ
p 引数 と PDF_ 接頭辞?
文字列デー タ 型
バイ ナ リ デー タ 型
C
あり
const char *
1
const char *
C++
なし
デ フ ォ ル ト で std::wstring2
const char *
Cobol
あり3
STRING
STRING
Java
なし
String
byte[ ]
Perl
なし
string
string
PHP
なし
string
string
Python
あり
string
string
RPG
あり
string、 ただ し x’00’ を加え る必要 data
あり
Ruby
なし
string
string
Tcl
あり
string
byte 配列
1. C 言語の NULL 文字列値 と 空文字列は同等 と 見な さ れます。
2. C++ API を、 std::basic_string テ ン プ レー ト のイ ン ス タ ン ス化を通 じ て カ ス タ マ イ ズする こ と も で き ます。 た と えば、 API
を std::string に切 り 替え て、 古いア プ リ ケーシ ョ ン と の互換を実現する こ と がで き ます。 あ る いはユーザー定義のデー タ 型
を、 API 内で用い ら れる文字列型の基盤 と し て用い る こ と も で き ます (36 ページ 「2.5 C++ バイ ンデ ィ ン グ」 参照)。
3. Cobol プ ロ グ ラ ムでは PDFlib 関数の短縮名を用いる必要があ り ます。
2.1 各言語バイ ンデ ィ ングにおけるデー タ 型
29
2.2 Cobol バ イ ン デ ィ ン グ
Cobol 用 PDFlib API では、 標準の C 名は使用で き ず、 かわ り に省略形の関数名を用い ま
す。 その短縮関数名は こ こ には記 さ ないので、 相互参照一覧 (xref.txt) を別途参照 し て く
だ さ い。た と えば PDF_load_font( ) のかわ り に短縮形 PDLODFNT を用い る 必要があ り ます。
Cobol で書かれた PDFlib の ク ラ イ ア ン ト は PDFLBCOB オブジ ェ ク ト に静的に リ ン ク さ
れてい ます。 こ のオブジ ェ ク ト は、 PDLBDLCB Load Module (DLL) を動的に ロ ー ド し ま
す。 こ の DLL は、 PDNEW (PDF_new( ) に対応) への最初の呼び出 し の際に PDFlib Load
Module (DLL) を動的に ロ ー ド し ま す。 PDFlib の内部構造が メ モ リ に新規に割 り 当て ら
れ、 その イ ン ス タ ン スハン ド ルが P 引数に格納 さ れます。 こ の引数は、 以後呼び出 し ご と
に指定す る 必要があ り ます。
PDLBDLCB ロ ー ド モジ ュ ールは、 8 文字の Cobol 関数 と コ ア PDFlib ルーチン と の間の
イ ン タ フ ェース を提供す る も のです。 こ のモジ ュ ールは ま た、 PDFlib の非同期な例外処理
と 、 Cobol が期待す る 一本槍な 「関数ご と に戻 り 値を調べ る 」 方式 と の間の対応づけ を提
供す る も ので も あ り ます。
注 PDLBDLCB と PDFLIB が、STEPLIB の使用を通 じ て COBOL プ ログ ラ ムから利用可能にな っ て
いる必要があ り ます。
デー タ 型 PDFlib API リ フ ァ レ ン ス内で使用 さ れてい る 各種デー タ 型は、以下の例の よ う
に Cobol デー タ 型に対応づけ る 必要があ り ます。
05
05
05
05
05
05
PDFLIB-A4-WIDTH
WS-INT
WS-FLOAT
WS-STRING
P
RETURN-RC
USAGE COMP-1 VALUE 5.95E+2. // float
PIC S9(9) BINARY.
// int
COMP-1.
// float
PIC X(128).
// const char *
PIC S9(9) BINARY.
// long *
PIC S9(9) BINARY.
// int *
PDFlib API に渡 さ れ る Cobol 文字列はすべて、LOW-VALUES (NULL) 終端子のために 1 バ
イ ト 多 く 格納領域を持たせて定義す る 必要があ り ます。
戻 り 値 PDFlib API の さ ま ざ ま な関数の戻 り 値は、 参照渡 し の ret と い う 引数を追加 し て
お く こ と に よ っ て、 そ こ に格納 さ れて き ます。 各関数呼び出 し の結果が こ の引数に代入 さ
れ る のです。 戻 り 値がゼ ロ の場合は、 その関数呼び出 し が正常に実行 さ れた こ と を意味 し
ます。 それ以外の値は何 ら かのエ ラ ーの発生を示 し てお り 、 その場合 PDF の生成は続行
で き ません。
戻 り 値を何 も 返 さ ない関数 (戻 り 値型 void の C 関数) については、 こ の追加引数は用
い ら れません。
エ ラ ー処理 PDFlib の例外処理は Cobol 言語バ イ ンデ ィ ン グでは利用で き ません。そのか
わ り すべての API 関数は、 エ ラ ーを示す戻 り コ ー ド (rc) 引数 と い う 追加の引数に対応 し
てい ます。 rc 引数は参照渡 し であ り 、 問題発生の通知に用い ら れます。 非ゼ ロ 値は関数呼
び出 し 失敗を示 し ます。
30
第 2 章 : PDFlib の言語バイ ンデ ィ ング
2.3 COM バ イ ン デ ィ ン グ
( こ の節は、 PDFlib チ ュ ー ト リ アルの COM ・ .NET ・ REALbasic エデ ィ シ ョ ンにのみ掲載 し
てい ます)
2.3 COM バイ ンデ ィ ング
31
2.4 C バ イ ン デ ィ ン グ
PDFlib は、C 言語にい く つかの C++ モジ ュ ールを加え た も ので書かれてい ます。PDFlib の
C バ イ ンデ ィ ン グ を利用す る には、静的ま たは共有 ラ イ ブ ラ リ (Windows ・ MVS 上の DLL)
を使 う こ と がで き 、 中心 と な る PDFlib イ ン ク ルー ド フ ァ イ ル pdflib.h を PDFlib の ク ラ イ
ア ン ト の ソ ース モジ ュ ールに イ ン ク ルー ド す る 必要があ り ます。 あ る いは、 pdflibdl.h を
用いて PDFlib DLL を実行時に動的に読み込ませ る こ と も で き ます (詳 し く は次項参照)。
注 PDFlib の C バイ ンデ ィ ン グを用いたア プ リ ケーシ ョ ンは、C++ コ ンパイ ラ で リ ン ク を行 う
必要があ り ます。 PDFlib ラ イ ブ ラ リ では、 C++ で実装 さ れた部分を い く つかイ ン クルー ド
し ている ためです。 C リ ン カ を用い る と 、 必要な C++ サポー ト ラ イ ブ ラ リ に対 し てア プ リ
ケーシ ョ ンが明示的に リ ン ク さ れていない限 り 、未解決の外部参照エ ラ ーが出る可能性が
あ り ます。
実行時に読み込まれ る DLL と し て PDFlib を利用 たいていの ク ラ イ ア ン ト では、 PDFlib
を、 静的に結合 し た ラ イ ブ ラ リ と し て用い る か、 リ ン ク 時に結合 さ れ る ダ イ ナ ミ ッ ク ラ イ
ブ ラ リ と し て用い る と 考え ら れ ますが、 それ以外の利用法 と し て、 PDFlib DLL を実行時
に読み込み、 全 API 関数へのポ イ ン タ を動的に取得す る こ と も で き ます。 こ の方法は特
に、 PDFlib DLL を必要時にのみ読み込みたい場合に有用であ り 、 ま た、 MVS 上で も 有用
です。 なぜな ら MVS では通例、 ラ イ ブ ラ リ は PDFlib に明示的に リ ン ク さ れず、 DLL と し
て実行時に必要に応 じ て読み込まれ る か ら です。PDFlib では こ の よ う な動的な利用法を可
能にす る ための し く みを特に設け て あ り ま す。 それは以下の方法に し たが っ て利用 し ま
す。
> pdflib.h のかわ り に pdflibdl.h を イ ン ク ルー ド する 。
> PDF_new( ) ・ PDF_delete( ) のかわ り に PDF_new_dl( ) ・ PDF_delete_dl( ) を用い る 。
> PDF_TRY( ) ・ PDF_CATCH( ) のかわ り に PDF_TRY_DL( ) ・ PDF_CATCH_DL( ) を用い る 。
> それ以外のすべての PDFlib 呼び出 し については関数ポ イ ン タ を用い る 。
> PDF_get_opaque( ) は使っ てはいけ ません。
> 追加のモジ ュ ール pdflibdl.c を コ ンパ イ ル し て、 アプ リ ケーシ ョ ン を それに リ ン ク さ せ
る。
注 PDFlib DLL の実行時読み込みは、 限ら れたプ ラ ッ ト フ ォ ームでのみ対応 し ています。
C でのエ ラ ー処理 PDFlib は、try ~ catch 節に よ る 構造化例外処理に対応 し てい ます。で
すので、 C と C++ の ク ラ イ ア ン ト では、 PDFlib で発生 し た例外を キ ャ ッ チ し て、 その例
外に対 し て適切に反応す る こ と がで き ます。 catch 節で ク ラ イ ア ン ト は、 問題の正 し い性
質を記 し た文字列 と 、 一意な例外番号 と 、 例外を発生 さ せた PDFlib API 関数の名前 と を得
る こ と がで き ます。 例外処理を持つ PDFlib C ク ラ イ ア ン ト プ ロ グ ラ ムの一般的構造は次
の よ う にな り ます。
PDF_TRY(p)
{
...いろいろなPDFlib命令...
}
PDF_CATCH(p)
{
printf("PDFlib exception occurred in hello sample:\n");
printf("[%d] %s: %s\n",
PDF_get_errnum(p), PDF_get_apiname(p), PDF_get_errmsg(p));
PDF_delete(p);
return(2);
32
第 2 章 : PDFlib の言語バイ ンデ ィ ング
}
PDF_delete(p);
PDF_TRY/PDF_CATCH は ト リ ッ キーなプ リ プ ロ セ ッ サマ ク ロ と し て実装 さ れてい ます。こ の
う ちの ど ち ら か を う っか り 入れ忘れ る と 、 コ ンパ イ ラ か ら 出 る エ ラ ー メ ッ セージは原因理
解が困難な も のにな っ て し ま う 可能性があ り ます。マ ク ロ は上記 と 正確に同 じ よ う に用い
る よ う に し て く だ さ い。TRY節 と CATCH節の間には一切 コ ー ド を入れてはいけ ません(PDF_
CATCH( ) 以外)。
catch 節の重要な仕事は、PDF_delete( ) と PDFlib オブジ ェ ク ト へのポ イ ン タ と を用いて
PDFlib の内部構造を解放す る こ と です。 PDF_delete( ) は必要に応 じ て出力フ ァ イ ル も 閉 じ
ます。 致命的例外の後は PDF 文書は使用不能であ り 、 不完全 ・ 不整合な状態で取 り 残 さ
れます。 も ち ろん、 例外発生時に ど の よ う な動作を さ せ る のが適切かはアプ リ ケーシ ョ ン
に依存 し ます。
C と C++ の ク ラ イ ア ン ト で例外を キ ャ ッ チ し ない場合、 例外発生時のデフ ォ ル ト 動作
は、 適切な メ ッ セージ を標準エ ラ ー出力な ど に出力 し て、 致命的エ ラ ーな ら ば抜け る と い
う も のです。 PDF 出力フ ァ イ ルは未完成の状態で残 さ れます! こ れは ラ イ ブ ラ リ のルー
チン と し て適当 と は言いかね る ので、 エ ラ ー処理が重要な アプ リ ケーシ ョ ン では PDFlib
の例外処理機能を活用す る こ と を強 く 推奨 し ます。ユーザー定義の catch 節ではた と えば、
エ ラ ー メ ッ セージ を GUI ダ イ ア ロ グボ ッ ク ス に表示 し 、 停止以外の処置を と る こ と がで
き るでし ょ う 。
volatile 変数 PDF_TRY( ) ブ ロ ッ ク と PDF_CATCH( ) ブ ロ ッ ク の両方で使 う 変数については
特に注意が必要です。 1 つのブ ロ ッ ク か ら 別のブ ロ ッ ク へ制御が移 る こ と について コ ンパ
イ ラ は知 ら ないので、 こ の よ う な場合には不適切な コ ー ド を生成 し て し ま う 可能性があ り
ます (レ ジ ス タ 変数の最適化等) 。 幸い、 こ う し た問題を避け る には次の よ う な簡単な規
則があ り ます。
注 PDF_TRY( ) ブ ロ ッ ク と PDF_CATCH( ) ブ ロ ッ クの両方で使 う 変数は、 volatile 宣言するべき
です。
volatile キー ワ ー ド を使 う と 、 変数に最適化 (危険をは ら む) を適用 し てはいけない と い
う こ と を コ ンパ イ ラ に知 ら せ る こ と がで き ます。
try/catch ブ ロ ッ ク の入れ子 と 例外の再 throw PDF_TRY( ) は、 任意の深 さ の入れ子にす
る こ と が可能です。 エ ラ ー処理を入れ子に し た場合、 以下の よ う に内側の catch ブ ロ ッ ク
で例外を再 throw す る こ と に よ っ て外側の catch ブ ロ ッ ク を ア ク テ ィ ブにす る こ と がで き
ます。
PDF_TRY(p)
{
/* ... */
/* 外側のtryブロック */
PDF_TRY(p)
/* 内側のtryブロック */
{
/* ... */
}
PDF_CATCH(p)
/* 内側のcatchブロック */
{
/* エラーをクリーンアップ */
PDF_RETHROW(p);
}
2.4 C バイ ンデ ィ ング
33
/* ... */
}
PDF_CATCH(p)
/* 外側のcatchブロック */
{
/* さらにエラーをクリーンアップ */
PDF_delete(p);
}
内側のエ ラ ーハン ド ラ で PDF_RETHROW( ) を呼び出す と 、 プ ロ グ ラ ムの実行はただちに外
側の PDF_CATCH( ) ブ ロ ッ ク の最初の ス テー ト メ ン ト へ移 り ます。
try ブ ロ ッ ク を未完了で抜け る PDF_TRY( ) ブ ロ ッ ク を、 た と えば return ス テー ト メ ン ト
に よ っ て抜けたい場合、 すなわちそれに対応する PDF_CATCH( ) マ ク ロ への呼び出 し をバ
イ パ スす る 場合は、 以下の よ う に PDF_EXIT_TRY( ) マ ク ロ を使っ て例外機構に通知す る 必
要があ り ます。 こ のマ ク ロ か ら try ブ ロ ッ ク 末尾ま での間、 他の ラ イ ブ ラ リ 関数は一切呼
び出 し てはいけ ません。
PDF_TRY(p)
{
/* ... */
if (error_condition)
{
PDF_EXIT_TRY(p);
return -1;
}
}
PDF_CATCH(p)
{
/* エラーをクリーンアップ */
PDF_RETHROW(p);
}
C での メ モ リ 管理 最大限の柔軟性を持たせ る ため、 PDFlib 内部の メ モ リ 管理ルーチ ン
(標準の C の malloc/free に基づいてい る ) は、 ク ラ イ ア ン ト が作成 し た外部のプ ロ シー
ジ ャ で置 き 換え る こ と がで き ます。 こ のプ ロ シージ ャ は、 PDFlib 内部のすべての メ モ リ 割
り 当て と メ モ リ 解放の際に呼び出 さ れ ま す。 メ モ リ 管理ルーチ ン を イ ン ス ト ールす る に
は、 PDF_new2( ) を呼び出せば、 PDFlib 内部のルーチンのかわ り に用い ら れ る よ う にな り
ます。 PDF_new2( ) の引数には以下の全ルーチン を指定 (あ る いは何 も 指定 し ない) す る
必要があ り ます。
> 割 り 当てルーチン
> 解放 (割 り 当て解除) ルーチン
> 再割 り 当てルーチン。 以前に割 り 当てルーチン で割 り 当て ら れた メ モ リ ブ ロ ッ ク を拡
げ る ために用い ら れます。
こ う し たルーチンは、 標準の C の malloc/free/realloc と 同 じ 意味を持た なければな り ませ
んが、 実装内容は任意に選ぶ こ と がで き ます。 ど のルーチンに も 、 呼び出 し 側 PDFlib オ
ブジ ェ ク ト へのポ イ ン タ が与え ら れます。 こ の規則の唯一の例外 と し て、 割 り 当てルーチ
ンへの一番最初の呼び出 し は PDF ポ イ ン タ と し て NULL を与え ます。 そのため、 ク ラ イ
ア ン ト で作成す る メ モ リ 割 り 当てルーチンは、NULL の PDF ポ イ ン タ を扱え る よ う に作っ
てお く 必要があ り ます。
34
第 2 章 : PDFlib の言語バイ ンデ ィ ング
PDF_get_opaque( ) 関数を用い る と 、アプ リ ケーシ ョ ン固有の void ポ イ ン タ を PDFlib オ
ブジ ェ ク ト か ら 取 り 出す こ と がで き ます。 こ の void ポ イ ン タ 自体は PDF_new2( ) への呼び
出 し で ク ラ イ ア ン ト に よ っ て指定 さ れ ま す。 void ポ イ ン タ は、 マルチ ス レ ッ ド のアプ リ
ケーシ ョ ンが PDFlib オブジ ェ ク ト 内の ス レ ッ ド 固有デー タ や ク ラ ス固有デー タ へのポ イ
ン タ を保持 し ておいて メ モ リ 管理やエ ラ ー処理に利用 し たい場合に有用です。
C 言語バ イ ン デ ィ ン グでの Unicode C 言語バ イ ンデ ィ ン グの ク ラ イ ア ン ト では、テ キ ス
ト が null キ ャ ラ ク タ を含む可能性があ る 場合には標準のテ キ ス ト 出力関数 (PDF_show( ) ・
PDF_show_xy( ) ・ PDF_continue_text( )) を使用 し ない よ う 注意す る 必要があ り ます。 その
よ う な場合にはかわ り に関数 PDF_show2( ) 等を用いなければな ら ず、 ま た、文字列長は別
途与え る 必要があ り ます。 こ れ以外の言語バ イ ンデ ィ ン グでは こ の こ と に注意す る 必要は
あ り ません。 なぜな ら PDFlib 言語 ラ ッ パがそ も そ も 内部的に PDF_show2( ) 等を呼び出す
よ う にな っ てい る か ら です。
2.4 C バイ ンデ ィ ング
35
2.5 C++ バ イ ン デ ィ ン グ
注 C++ で書かれた .NET ア プ リ ケーシ ョ ンについては、 C++ バイ ンデ ィ ングを通 じ てではな
く 、PDFlib .NET DLL を直接利用する こ と を推奨 し ます (例外 と し て、ク ロ ス プ ラ ッ ト フ ォ ー
ムア プ リ ケーシ ョ ンの場合は C++ バイ ンデ ィ ング を使 う 必要があ り ます)。 PDFlib デ ィ ス
ト リ ビ ュ ーシ ョ ンには、 この組み合わせを演示する .NET CLI で使 う C++ サン プル コ ー ド
があ り ます。
pdflib.h C ヘ ッ ダ フ ァ イ ルに加え て、 C++ のためのオブジ ェ ク ト 指向の ラ ッ パが PDFlib ク
ラ イ ア ン ト のために提供 さ れてい ます。こ れは pdflib.hpp ヘ ッ ダ フ ァ イ ルを必要 と し ます。
こ のヘ ッ ダ フ ァ イ ルは pdflib.h を イ ン ク ルー ド し てい ます。pdflib.hpp はテ ンプ レー ト ベー
ス の実装を内容 と し て持っ てい ま すので、 対応す る .cpp モジ ュ ールは必要あ り ま せん。
C++ オブジ ェ ク ト ラ ッ パを用い る と 、 すべての PDFlib 関数名の PDF_ 接頭辞は、 よ り オブ
ジ ェ ク ト 指向的な表現に置 き 換わ り ます。
実行時に読み込まれ る DLL と し て PDFlib を利用 C 言語バ イ ンデ ィ ン グ と 同様、 C++ バ
イ ンデ ィ ン グでは、PDFlib を自分のアプ リ ケーシ ョ ンに実行時に結合 さ せ る こ と も で き ま
す (32 ページ 「実行時に読み込まれ る DLL と し て PDFlib を利用」 を参照)。 動的読み込
みは、pdflib.hpp を イ ン ク ルー ド す る アプ リ ケーシ ョ ンモジ ュ ールを コ ンパ イ ルす る 際に、
下記の よ う に し て有効にす る こ と がで き ます :
#define PDFCPP_DL
1
こ れに加え て、 追加モジ ュ ール pdflibdl.c を コ ンパ イ ル し て、 で き る オブジ ェ ク ト フ ァ イ
ルに自分のアプ リ ケーシ ョ ン を リ ン ク さ せ る 必要があ り ます。動的読み込みの詳細は こ の
PDFlib オブジ ェ ク ト 内に隠蔽 さ れてい ますので、 こ れは C++ API に影響を与え ません : す
べての メ ソ ッ ド 呼び出 し は、動的読み込みが有効に さ れてい る か否かにかかわ ら ず同 じ に
見え ます。
注 実行時の DLL 読み込みは、 一部のプ ラ ッ ト フ ォ ームでのみ利用で き ます。
C++ での文字列処理 PDFlib 8 では、新たな Unicode 対応 C++ バ イ ンデ ィ ン グが導入 さ れ
ま し た。 新 し いテ ンプ レー ト ベース のアプ ロ ーチに よ り 、 文字列処理に関 し て下記の利用
パ タ ーンに対応 し てい ます :
> C++標準 ラ イ ブ ラ リ 型std::wstringの文字列が基本文字列型 と し て用い ら れます。こ れは
UTF-16 ま たは UTF-32 でエン コ ー ド さ れた Unicode キ ャ ラ ク タ 群を保持す る こ と がで
き ます。 こ れが PDFlib 8 のデフ ォ ル ト 動作であ り 、 カ ス タ ムデー タ 型 (次項参照) が
wstring よ り も 顕著な利点を提供す る のでない限 り 、 新 し いアプ リ ケーシ ョ ンにおいて
推奨 さ れ る アプ ロ ーチです。
> 文字列処理にカ ス タ ム (ユーザー定義) デー タ 型を用い る こ と も で き ます。 ただ し 、 そ
のカ ス タ ムデー タ 型が basic_string ク ラ ス テ ンプ レー ト の イ ン ス タ ン ス化であ り 、かつ
ユーザーが提供す る 変換 メ ソ ッ ド を通 じ て Unicode への変換 と Unicode か ら の変換がで
き る も のであ る 必要があ り ます。 例 と し て、 UTF-8 文字列のためのカ ス タ ム文字列型
実装が PDFlib デ ィ ス ト リ ビ ュ ーシ ョ ンに含まれてい ます。
> プ レーン C++ 文字列を用い る こ と も で き ます。こ れは、PDFlib 7 ま でのバージ ョ ン を利
用 し て開発 さ れた既存 C++ アプ リ ケーシ ョ ン と の互換のためです。 こ の互換方式は既
存アプ リ ケーシ ョ ンのためにのみ意図 さ れてい る も のです (後述の ソ ース コ ー ド 互換
性に関す る 記述を参照 し て く だ さ い)。
36
第 2 章 : PDFlib の言語バイ ンデ ィ ング
新 し い イ ン タ フ ェース では、 PDFlib メ ソ ッ ド に受け渡 さ れ る 文字列 と 、PDFlib メ ソ ッ ド か
ら 受け取 る 文字列はすべて、 ネ イ テ ィ ブ wstring であ る と 前提 し ます。 wchar_t デー タ 型
のサ イ ズに応 じ て、 wstring は UTF-16 (2 バ イ ト キ ャ ラ ク タ 群) か UTF-32 (4 バ イ ト キ ャ
ラ ク タ 群) でエン コ ー ド さ れた Unicode 文字列を内容 と し て持つ と 見な さ れます。 ソ ース
コ ー ド 内の リ テ ラ ル文字列は、 ワ イ ド 文字列であ る こ と を示すために接頭辞 L をつけ る 必
要があ り ます。 リ テ ラ ル内の Unicode キ ャ ラ ク タ は \u ・ \U 文法で作成で き ます。 こ の文
法は ISO C++ 規格に含まれてい ますが、 こ れに対応 し ていない コ ンパ イ ラ も あ り ます。 そ
の場合には リ テ ラ ル Unicode キ ャ ラ ク タ は 16 進キ ャ ラ ク タ で作成す る 必要があ り ます。
ア プ リ ケーシ ョ ン を新 し い C++ バ イ ン デ ィ ン グに合わせる PDFlib 7 ま でのバージ ョ ン
を利用 し て開発 さ れた既存 C++ アプ リ ケーシ ョ ンは、 下記の よ う に し て PDFlib 8 に合わ
せ る こ と がで き ます :
> PDFlib C++ ク ラ ス は pdflib 名前空間に属す る よ う にな り ま し たので、ク ラ ス名は修飾す
る 必要があ り ます。 pdflib::PDFlib 構造を避け る ため、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン
は PDFlib メ ソ ッ ド を使 う 前に下記を追加す る 必要があ り ます :
using namespace pdflib;
> アプ リ ケーシ ョ ンの文字列処理を wstring に切 り 替え ます。 こ れは外部情報源か ら の
デー タ も 含みます。 し か し 、 ソ ー ス コ ー ド 内の文字列 リ テ ラ ル (オプシ ョ ン リ ス ト を
含む) に も L 接頭辞をつけ る 必要があ り ます。 例 :
const wstring imagefile = L"nesrin.jpg";
image = p.load_image(L"auto", imagefile, L"");
> PDFlib エ ラ ー メ ッ セージ と 例外文字列 (PDFlib ・ PDFlibException ク ラ ス の get_errmsg( )
メ ソ ッ ド ) を処理す る 際には、 適切な wstring 対応 メ ソ ッ ド (wcerr 等) を用い る 必要
があ り ます。
> Unicode 非対応言語においてのみ必要な PDFlib メ ソ ッ ド の呼び出 し は除去 し ます。特に
下記を除去 し ます :
p.set_parameter("hypertextencoding", "host");
> PDFlib C++ バ イ ンデ ィ ン グにおいて、 pdflib.cpp モジ ュ ールは必要な く な り ま し た。
PDFlib デ ィ ス ト リ ビ ュ ーシ ョ ン には こ のモ ジ ュ ールのダ ミ ー実装が含 ま れてい ま す
が、 PDFlib アプ リ ケーシ ョ ンのビル ド 処理か ら は こ れは除去す る 必要があ り ます。
レ ガ シ ア プ リ ケーシ ョ ンの フ ル ソ ース コ ー ド 互換 新 し い C++ バ イ ンデ ィ ン グは、 アプ
リ ケーシ ョ ン レベルの ソ ース コ ー ド 互換を念頭に設計 さ れてい ますが、 ク ラ イ ア ン ト アプ
リ ケーシ ョ ンは再 コ ンパ イ ルす る 必要があ り ます。 レ ガシアプ リ ケーシ ョ ンにおいて フル
ソ ース コ ー ド 互換を実現す る には下記の方法があ り ます :
> pdflib.hpp を イ ン ク ルー ド す る 前に、wstring ベース の イ ン タ フ ェース を下記の よ う に無
効化 し ます :
#define PDFCPP_PDFLIB_WSTRING 0
> pdflib.hpp を イ ン ク ルー ド す る 前に、 PDFlib 名前空間を下記の よ う に無効化 し ます :
#define PDFCPP_USE_PDFLIB_NAMESPACE 0
C++ でのエ ラ ー処理 PDFlib API 関数は、エ ラ ー発生時には C++ 例外を発生 さ せます。 こ
の例外は ク ラ イ ア ン ト コ ー ド 内で C++ の try ~ catch 節を用いて キ ャ ッ チ さ れ る 必要があ
2.5 C++ バイ ンデ ィ ング
37
り ま す。 詳 細 な エ ラ ー 情 報 提 供 の た め、 PDFlib
ク ラ ス にはパブ リ ッ ク ク ラ ス
PDFlib::Exception があ り ます。 こ のパブ リ ッ ク ク ラ ス は、 詳 し いエ ラ ー メ ッ セージ取得の
ための メ ソ ッ ド と 、 例外番号取得のための メ ソ ッ ド と 、 例外を発生 さ せた PDFlib API 関数
の名前を取得す る ための メ ソ ッ ド と を公開 し てい ます。
PDFlib ルーチンが発生 さ せ る C++ 準拠の例外は規則どお り に動作 し ます。 PDFlib で発
生 し た例外を キ ャ ッ チす る コ ー ド の抜粋を以下に挙げます。
try {
...いろいろなPDFlib命令...
catch (PDFlib::Exception &ex) {
wcerr << L"PDFlib exception occurred in hello sample: " << endl
<< L"[" << ex.get_errnum() << L"] " << ex.get_apiname()
<< L": " << ex.get_errmsg() << endl;
}
C++ での メ モ リ 管理 C++ バ イ ンデ ィ ン グで ク ラ イ ア ン ト が作成 し た メ モ リ 管理は、C 言
語バ イ ンデ ィ ン グの場合 と 同様に動作 し ます。
PDFlib コ ン ス ト ラ ク タ は、 オプシ ョ ンのエ ラ ーハン ド ラ と 、 オプシ ョ ンの メ モ リ 管理
プ ロ シージ ャ 、 オプシ ョ ンの void ポ イ ン タ 引数を受け入れます。 pdflib.hpp ではデフ ォ ル
ト で NULL 引数が与え ら れてお り 、 こ れは PDFlib の内部エ ラ ーを引 き 起 こ し 、 メ モ リ 管
理ルーチン を起動 さ せます。 メ モ リ 管理関数はすべて C 関数でなければな ら ず、 C++ メ
ソ ッ ド であ っ てはな り ません。
38
第 2 章 : PDFlib の言語バイ ンデ ィ ング
2.6 Java バ イ ン デ ィ ン グ
Java には、 ネ イ テ ィ ブ言語 コ ー ド を Java プ ロ グ ラ ムに接続で き る ポー タ ブルな仕組みが
そなわっ てい ます。 こ れを Java Native Interface (JNI) と いい ます。 JNI は、 ネ イ テ ィ ブな
C や C++ のルーチン を Java コ ー ド 内か ら 呼び出せ る プ ロ グ ラ ミ ン グ方式を提供 し ます。逆
の呼び出 し も 可能です。 各 C ルーチンは、 Java VM で利用可能 と す る には、 適切な コ ー ド
に よ る ラ ッ パを必要 と し ます。成果物であ る ラ イ ブ ラ リ は、Java VM に読み込まれ る には、
共有オブジ ェ ク ト か動的オブジ ェ ク ト と し て生成 さ れ る 必要があ り ます。
PDFlib は、 ラ イ ブ ラ リ を Java か ら 利用可能にす る JNI ラ ッ パ コ ー ド を提供 し ます。 こ
の技法に よ り 、 共有 ラ イ ブ ラ リ を Java VM か ら 読み込んで、 PDFlib を Java に接続 さ せ る
こ と がで き ます。 ラ イ ブ ラ リ の実際の読み込みは、 pdflib Java ク ラ ス中の静的 メ ンバ関数
を介 し て実現 さ れます。 こ のため、 Java ク ラ イ ア ン ト では共有 ラ イ ブ ラ リ の取 り 扱いにい
ちいちわず ら わ さ れ る こ と があ り ません。
PDFlib は安定かつ こ なれてい ますので、 ネ イ テ ィ ブ PDFlib ラ イ ブ ラ リ を Java VM に接
続 し て も 、Java アプ リ ケーシ ョ ンに安定性やセキ ュ リ テ ィ 上の制約が加わ る こ と はあ り ま
せん。 む し ろ ネ イ テ ィ ブな実装に よ る 速度向上の利点があ り ます。
PDFlib Java 版の イ ン ス ト ール PDFlibバ イ ンデ ィ ン グが動作する には、Java VMが、PDFlib
Java ラ ッ パ と PDFlib Java パ ッ ケージ を利用で き る よ う にす る 必要があ り ます。 PDFlib は
次のパ ッ ケージ名を持つ Java パ ッ ケージ と し て ま と め ら れてい ます。
com.pdflib.pdflib
こ のパ ッ ケージは pdflib.jar フ ァ イ ルの中にあ っ て、pdflib と い う ただ 1 つの ク ラ ス を持っ
て い ま す。 こ の パ ッ ケ ー ジ を ア プ リ ケ ー シ ョ ン で 利用可能 に す る に は、 pdflib.jar を
CLASSPATH 環境変数に追加す る 必要があ り ます。 ま たは、 Java コ ンパ イ ラ と ラ ン タ イ ムへ
の呼び出 し の中に -classpath pdflib.jar オプシ ョ ン を加え る か、 こ れ と 等価の手順を Java
IDE 中で踏む必要があ り ます。 JDK では、 Java VM が既知のデ ィ レ ク ト リ を検索す る よ う
に設定す る こ と がで き ます。 具体的には、 java.library.path プ ロ パテ ィ にデ ィ レ ク ト リ の名
前を設定 し ます。 た と えば次の よ う に記述 し ます。
java -Djava.library.path=. pdfclock
こ のプ ロ パテ ィ の値を知 る には次の よ う に し ます。
System.out.println(System.getProperty("java.library.path"));
上記に加え、 プ ラ ッ ト フ ォームに よ っ て以下の手順を行 う 必要があ り ます。
> Unix : libpdf_java.so ラ イ ブ ラ リ (Mac OS X では libpdf_java.jnilib) は、 共有 ラ イ ブ ラ リ
のためのデフ ォ ル ト 格納場所の う ちのいずれかに置 く か、 適切に設定 し たデ ィ レ ク ト
リ に置 く 必要があ り ます。
> Windows:pdf_java.dll ラ イ ブ ラ リ は、Windows のシ ス テ ムデ ィ レ ク ト リ に置 く か、PATH
環境変数で列挙 さ れたデ ィ レ ク ト リ に置 く 必要があ り ます。
J2EE ア プ リ ケーシ ョ ンサーバ と サーブ レ ッ ト コ ン テ ナで PDFlib を使 う PDFlib は、サー
バサ イ ド の Java アプ リ ケーシ ョ ンに完全に適合 し てい ます。PDFlib デ ィ ス ト リ ビ ュ ーシ ョ
ンには、 PDFlib を J2EE 環境で利用す る ためのサンプル コ ー ド と 設定が含まれてい ます。
下記の設定上の注意点に留意 し て く だ さ い :
> サーバがネ イ テ ィ ブ ラ イ ブ ラ リ を さ が し に行 く デ ィ レ ク ト リ はベン ダーに よ っ て異な
り ます。通常その候補 と な る 場所は、 シ ス テ ムデ ィ レ ク ト リ や、基盤 と な っ てい る Java
2.6 Java バイ ンデ ィ ング
39
VM に固有のデ ィ レ ク ト リ や、 サーバデ ィ レ ク ト リ です。 サーバベン ダーが提供す る マ
ニ ュ アルを参照 し て く だ さ い。
> アプ リ ケーシ ョ ンサーバ と サーブ レ ッ ト コ ン テナは し ば し ば特別な ク ラ ス ロ ーダ を用
いてい ますが、 それには制約があ っ た り 、 専用の ク ラ ス パ ス を利用 し ていた り す る 場
合があ り ます。 サーバのなかには、 特別な ク ラ スパ ス を定義す る こ と に よ っ て PDFlib
パ ッ ケージが確実に発見 さ れ る よ う に し なければな ら ない も のがあ り ます。
PDFlib の各サーブ レ ッ ト エン ジ ン ・ 各アプ リ ケーシ ョ ンサーバでの利用については、 詳細
は PDFlib デ ィ ス ト リ ビ ュ ーシ ョ ンの中の J2EE デ ィ レ ク ト リ 内の追加のマニ ュ アルを参照
し て く だ さ い。
Java でのエ ラ ー処理 Java バ イ ンデ ィ ン グは、 PDFlib のエ ラ ーを ネ イ テ ィ ブ Java 例外に
翻訳す る 特別なエ ラ ーハン ド ラ を イ ン ス ト ール し ます。 例外が起き る と PDFlib は次の ク
ラ ス のネ イ テ ィ ブ Java 例外を発生 さ せます。
PDFlibException
Java 例外は以下の よ う に通常の try/catch で処理で き ます。
try {
...いろいろなPDFlib命令...
} catch (PDFlibException e) {
System.err.print("PDFlib exception occurred in hello sample:\n");
System.err.print("[" + e.get_errnum() + "] " + e.get_apiname() +
": " + e.get_errmsg() + "\n");
} catch (Exception e) {
System.err.println(e.getMessage());
} finally {
if (p != null) {
p.delete();
}
}
/* PDFlibオブジェクトを削除 */
PDFlib は適切な throws 節を宣言 し ますので、 ク ラ イ ア ン ト の コ ー ド では、 起 こ り う る す
べての PDFlib 例外を キ ャ ッ チす る か、 それ ら を自分で宣言 し なければな り ません。
Unicode と レ ガ シ エ ン コ ーデ ィ ン グの変換 PDFlib ユーザーの便宜のため、 こ こ でい く
つか便利な文字列変換方法を示 し ます。 詳 し く は Java の説明書を参照 し て く だ さ い。 下
記の コ ン ス ト ラ ク タ はバ イ ト 配列か ら 、そのプ ラ ッ ト フ ォームのデフ ォ ル ト エン コ ーデ ィ
ン グ を用いて Unicode 文字列を生成 し ます。
String(byte[] bytes)
下記の コ ン ス ト ラ ク タ はバ イ ト 配列か ら 、 enc 引数で与え ら れたエン コ ーデ ィ ン グ (SJIS ・
UTF8 ・ UTF-16 等) を用いて Unicode 文字列を生成 し ます。
String(byte[] bytes, String enc)
下記の String ク ラ ス の メ ソ ッ ド は Unicode 文字列を、 enc 引数で指定 さ れたエン コ ーデ ィ
ン グに従っ た文字列に変換 し ます。
40
第 2 章 : PDFlib の言語バイ ンデ ィ ング
byte[] getBytes(String enc)
PDFlib の Javadoc 仕様書 PDFlib パ ッ ケージには、PDFlib の Javadoc 仕様書が含まれてい
ます。 こ の Javadoc は、すべての PDFlib API メ ソ ッ ド の短い記述 し か含んでい ませんので、
詳 し く は PDFlib API リ フ ァ レ ン ス を参照 し て く だ さ い。
PDFlib の Javadoc を Eclipse で設定す る には下記の よ う に操作 し ます :
> パ ッ ケージ ・ エ ク ス プ ロ ー ラ ーで Java プ ロ ジ ェ ク ト を右 ク リ ッ ク し 、 「Javadoc ロ ケー
シ ョ ン」 を選択 し ます。
> 「ブ ラ ウズ ...」 を ク リ ッ ク し て、 Javadoc が置かれてい る パ ス (PDFlib パ ッ ケージに含ま
れてい ます) を選びます。
こ の手順をふめば、 「Java 参照」 パースペ ク テ ィ ブや 「ヘルプ」 メ ニ ュ ー等で PDFlib の
Javadoc を ブ ラ ウ ズで き る よ う にな り ます。
Groovy での PDFlib の利用 PDFlib の Java バ イ ンデ ィ ン グは、 Groovy 言語で も 使 う こ と
がで き ます。 その API 呼び出 し は Java の呼び出 し と 同等であ り 、 オブジ ェ ク ト の イ ン ス
タ ン ス化だけが若干違い ます。 PDFlib を Groovy で使 う 簡単な例が、 PDFlib デ ィ ス ト リ
ビ ュ ーシ ョ ンに含まれてい ます。
2.6 Java バイ ンデ ィ ング
41
2.7 .NET バ イ ン デ ィ ン グ
( こ の節は、 PDFlib チ ュ ー ト リ アルの COM ・ .NET ・ REALbasic エデ ィ シ ョ ンにのみ掲載 し
てい ます)
42
第 2 章 : PDFlib の言語バイ ンデ ィ ング
2.8 Perl バ イ ン デ ィ ン グ
Perl1 用 PDFlib ラ ッ パは、 C ラ ッ パフ ァ イ ル 1 個 と Perl パ ッ ケージモジ ュ ール 2 個で構成
さ れてい ます。 こ のモジ ュ ールの う ち 1 個は各 PDFlib API 関数の Perl 版を提供 し 、 も う 1
個は PDFlib オブジ ェ ク ト のための も のです。C モジ ュ ールは、Perl イ ン タ プ リ タ が実行時
に読み込む共有 ラ イ ブ ラ リ を ビル ド す る ために使われます。こ の処理には Perl パ ッ ケージ
モジ ュ ール も 使用 さ れます。 Perl ス ク リ プ ト では use ス テー ト メ ン ト で共有 ラ イ ブ ラ リ モ
ジ ュ ールを参照 し ます。
PDFlib Perl 版の イ ン ス ト ール Perl の拡張機構は共有 ラ イ ブ ラ リ を、実行時に DynaLoader
モジ ュ ールを通 じ て読み込みます。 Perl の実行形式が、 共有 ラ イ ブ ラ リ 対応つ き で コ ンパ
イ ル さ れてい る 必要があ り ます (大多数の Perl の設定ではそ う な っ てい ます)。
PDFlib バ イ ンデ ィ ン グが動作す る ためには、 Perl イ ン タ プ リ タ が PDFlib Perl ラ ッ パ と
モジ ュ ール pdflib_pl.pm ・ PDFlib/PDFlib.pm を利用で き る よ う にな っ てい る 必要があ り ま
す。 以下に述べ る プ ラ ッ ト フ ォーム依存な方式を用い る こ と も で き ます し 、 次の よ う に I コ マ ン ド ラ イ ンオプシ ョ ン を用いて Perl の @INC モジ ュ ール検索パ ス にデ ィ レ ク ト リ を
追加す る こ と も で き ます。
perl -I/path/to/pdflib hello.pl
Unix Perl は、pdflib_pl.so(Mac OS X では pdflib_pl.bundle)・pdflib_pl.pm・PDFlib/PDFlib.pm
を、 カ レ ン ト デ ィ レ ク ト リ で検索す る か、 下記の Perl コ マ ン ド で出力 さ れ る デ ィ レ ク ト リ
で検索 し ます :
perl -e 'use Config; print $Config{sitearchexp};'
Perl は auto/pdflib_pl サブデ ィ レ ク ト リ も 検索 し ます。 上記 コ マ ン ド の一般的な出力は次
の よ う にな り ます。
/usr/lib/perl5/site_perl/5.8/i686-linux
Windows
PDFlib は、 Perl 5 の Windows への ActiveState ポー ト に対応 し てい ます。 こ れ
はActivePerl2 と も 呼ばれます。DLL pdflib_pl.dll と モジ ュ ールpdflib_pl.pm・PDFlib/PDFlib.pm
が、 カ レ ン ト デ ィ レ ク ト リ で検索 さ れ る か、 下記の Perl コ マ ン ド で出力 さ れ る デ ィ レ ク ト
リ で検索 さ れます :
perl -e "use Config; print $Config{sitearchexp};"
上記 コ マ ン ド の一般的な出力は次の よ う にな り ます。
C:\Program Files\Perl5.8\site\lib
Perl でのエ ラ ー処理 Perl バ イ ンデ ィ ン グは、 PDFlib のエ ラ ーを ネ イ テ ィ ブ Perl 例外に
翻訳す る 特別なエ ラ ーハン ド ラ を イ ン ス ト ール し ます。 Perl の例外は、 適切な言語構造を
適用す る こ と に よ り 取 り 扱 う こ と がで き ます。 すなわち、 問題の起 こ り そ う な箇所を次の
よ う に挟みます。
eval {
...いろいろなPDFlib命令...
1. www.perl.com を参照。
2. www.activestate.com を参照。
2.8 Perl バイ ンデ ィ ング
43
};
if ($@) {
die("$0: PDFlib Exception occurred:\n$@");
文字列処理の複数の方式 アプ リ ケーシ ョ ン での必要に応 じ て、 UTF-8 ・ UTF-16 ・ レ ガ
シエン コ ーデ ィ ン グのいずれで処理を行 う こ と も で き ます。以下の コ ー ド は こ の 3 つの場
合すべての作成例です。 ど の例 も 同 じ 日本語の出力を生成 し ますが、 それぞれ違 う 形式の
入力文字列を受け取っ てい ます。
1 つ目の例は Unicode UTF-8 で処理を行い、Unicode::String モジ ュ ールを使用 し てい ま
す。 こ のモジ ュ ールは最新の Perl デ ィ ス ト リ ビ ュ ーシ ョ ンに含まれてお り 、 CPAN で入手
可能です。 Perl は内部処理を UTF-8 で行 う ので、 明示的な UTF-8 変換は不要です。
use Unicode::String qw(utf8 utf16 uhex);
...
$p->set_parameter("textformat", "utf8");
$font = $p->load_font("Arial Unicode MS", "unicode", "");
$p->setfont($font, 24.0);
$p->set_text_pos(50, 700);
$p->show(uhex("U+65E5 U+672C U+8A9E"));
2 つ目の例は Unicode UTF-16 で処理を行っ てい ます。 バ イ ト 順序は リ ト ルエンデ ィ ア ン
です。
$p->set_parameter("textformat", "utf16le");
$font = $p->load_font("Arial Unicode MS", "unicode", "");
$p->setfont($font, 24.0);
$p->set_text_pos(50, 700);
$p->show("\xE5\x65\x2C\x67\x9E\x8A");
3 つ目の例は Shift-JIS で処理を行っ てい ます。 Windows 以外では、 文字列変換のために
90ms-RKSJ-H CMap を利用で き る 必要があ り ます。
$p->set_parameter("SearchPath", "../../../resource/cmap");
$font = $p->load_font("Arial Unicode MS", "cp932", "");
$p->setfont($font, 24.0);
$p->set_text_pos(50, 700);
$p->show("\x93\xFA\x96\x7B\x8C\xEA");
Unicode と レ ガ シ エ ン コ ーデ ィ ン グの変換 PDFlib ユーザーの便宜のために、 こ こ で便
利な文字列変換方法を示 し ます。 詳 し く は Perl の説明書を参照 し て く だ さ い。 下記の コ ン
ス ト ラ ク タ はバ イ ト 配列か ら UTF-16 Unicode 文字列を生成 し ます :
$logos="\x{039b}\x{03bf}\x{03b3}\x{03bf}\x{03c3}\x{0020}" ;
下記の コ ン ス ト ラ ク タ は Unicode キ ャ ラ ク タ 名か ら Unicode 文字列を生成 し ます :
$delta = "\N{GREEK CAPITAL LETTER DELTA}";
Encode モジ ュ ールは多 く のエ ン コ ーデ ィ ン グに対応 し てお り 、 そのエ ン コ ーデ ィ ン グ間
変換のための イ ン タ フ ェース を持っ てい ます :
use Encode 'decode';
$data = decode("iso-8859-3", $data);
44
第 2 章 : PDFlib の言語バイ ンデ ィ ング
# レガシからUTF-8へ変換
2.9 PHP バ イ ン デ ィ ン グ
注 PDFlib を PHP1 で使 う 際の さ ま ざ ま な方式やオプ シ ョ ンに関する詳細な情報は、 PHP 用の
PDFlib のロ ーダ ブルモ ジ ュ ールを用い るべ きかど う か と い っ た質問を含めて、 PDFlib-inPHP-HowTo.pdf 文書に記載 し てあ り ます。 こ の文書はデ ィ ス ト リ ビ ュ ーシ ョ ンパ ッ ケージ
に含まれてお り 、 また、 PDFlib ウ ェ ブサイ ト に も 掲載 し てあ り ます。
PDFlib PHP 版の イ ン ス ト ール PHP を設定 し て、 外部の PDFlib ラ イ ブ ラ リ について PHP
が認識す る 必要があ り ます。 以下の 2 通 り の選択肢があ り ます。
> php.ini に以下の行の う ちのいずれか を追加す る 。
extension=libpdf_php.so
; Unix・Mac OS X用
extension=libpdf_php.dll
; Windows用
PHP は、 ラ イ ブ ラ リ を検索す る と き 、 Unix では php.ini の中の extension_dir 変数で指
定 さ れたデ ィ レ ク ト リ の中を捜 し 、 Windows ではその他に標準のシ ス テ ムデ ィ レ ク ト
リ の中 も 捜 し ます。 ど のバージ ョ ンの PHP PDFlib バ イ ンデ ィ ン グが イ ン ス ト ール し て
あ る か を確認す る には、 次の よ う な一行の PHP ス ク リ プ ト を用い ます。
<?phpinfo()?>
そ う す る と 、 カ レ ン ト の PHP の設定に関 し て、 長い情報ページが表示 さ れます。 こ の
ページの中で pdf と い う 見出 し のセ ク シ ョ ン を見て く だ さ い。こ のセ ク シ ョ ンに PDFlib
GmbH Binary Version と (PDFlib のバージ ョ ン番号 と と も に) 書いて あれば、 サポー ト
さ れてい る 新 し い PDFlib ラ ッ パを使用 し てい る と い う こ と です。 サポー ト さ れていな
い古い ラ ッ パの場合はかわ り に PDFlib GmbH Version と 表示 さ れます。
> ス ク リ プ ト の先頭に以下の行の う ちのいずれか を書いて PDFlib を実行時に読み込む。
dl("libpdf_php.so");
Unix用
dl("libpdf_php.dll");
Windows用
PHP に合わせた PDFlib 関数のエ ラ ー戻 り 値 PHP では、 関数内でのエ ラ ー発生時に値 0
(FALSE) を返す方式が用い ら れてい る ので、 PDFlib 関数はすべて、 エ ラ ー発生時に -1 で
な く 0 を返す よ う 変更 し て あ り ます。 こ の変更については、 PDFlib API リ フ ァ レ ン ス の関
数解説に記 し て あ り ます。 ただ し 55 ページ 「3 章 PDFlib 文書を作成」 の コ ー ド 抜粋例で
は、 エ ラ ー時に -1 を返す通常の PDFlib の方式を用いてい る ので、 読む際には注意 し て く
だ さ い。
PHP の フ ァ イルの取 り 扱い
PDF や画像な ど のデ ィ ス ク 上のパ ス の指定の無い フ ァ イ ル
名や相対パ ス の フ ァ イ ル名は、 PHP の Unix 版 と Windows 版 と では次の よ う に異な っ た取
り 扱いを受け ます。
> Unix シ ス テ ム上の PHP は、パ ス部分を ま っ た く 持た ない フ ァ イ ルを、ス ク リ プ ト が置か
れてい る デ ィ レ ク ト リ の中で検索 し ます。
> Windows 上の PHP は、パ ス部分を ま っ た く 持た ない フ ァ イ ルを、PHP DLL が置かれてい
る デ ィ レ ク ト リ の中でのみ検索 し ます。
プ ラ ッ ト フ ォームに依存 し ない フ ァ イ ル名の取 り 扱いを行 う には、 SearchPath 機能の利用
を強 く 推奨 し ます (59 ページ 「3.1.3 リ ソ ース設定 と フ ァ イ ル検索」 参照)。
1. www.php.net を参照。
2.9 PHP バイ ンデ ィ ング
45
PHP での例外処理 PHP は構造化例外処理に対応 し てい る ため、 PDFlib 例外は PHP 例外
と し て発生 し ます。 PDFlib は ク ラ ス PDFlibException の例外を発生 さ せます。 こ の ク ラ ス
は PHP の標準の Exception ク ラ ス を派生 さ せた も のです。 以下の よ う に、 標準的な try ~
catch 技法を用いて PDFlib 例外を扱 う こ と がで き ます。
try {
...いろいろなPDFlib命令...
} catch (PDFlibException $e) {
print "PDFlib exception occurred:\n";
print "[" . $e->get_errnum() . "] " . $e->get_apiname() . ": "
$e->get_errmsg() . "\n";
}
catch (Exception $e) {
print $e;
}
Unicode と レ ガ シ エ ン コ ーデ ィ ン グの変換 iconv モジ ュ ールを用いて文字列変換がで き
ます。 詳 し く は PHP の説明書を参照 し て く だ さ い。
Eclipse と Zend Studio に よ る PDFlib 開発 PHP Development Tools (PDT)1 は Eclipse と
Zend Studio に よ る PHP 開発に対応 し てい ます。 PDT は、 下記に示す手順で、 状況依存ヘ
ルプに対応す る よ う 設定す る こ と がで き ます。
PDFlib を Eclipse 設定に追加 し て、すべての PHP プ ロ ジ ェ ク ト に知 ら れ る よ う に し ます:
> 「Window」 → 「Preferences」 → 「PHP」 → 「PHP Libraries」 → 「New...」 を選択 し て ウ ィ
ザー ド を起動 し ます。
> 「User library name」 に PDFlib と 入力 し 、 「Add External folder...」 を ク リ ッ ク し て フ ォ ル
ダ bind\php\Eclipse PDT を選びます。
既存ま たは新規の PHP プ ロ ジ ェ ク ト で、 PDFlib ラ イ ブ ラ リ への参照を下記の よ う に追加
す る こ と がで き ます :
> PHP Explorer で PHP プ ロ ジ ェ ク ト を右 ク リ ッ ク し 、「Include Path」 → 「Configure Include
Path...」 を選択 し ます。
> 「Libraries」 タ ブへ行 き 、 「Add Library...」 を ク リ ッ ク し 、 「User Library」 → 「PDFlib」 を
選択 し ます。
こ れ ら の手順をふめば、 PHP Explorer ビ ュ ーの PHP Include Path/PDFlib/PDFlib ノ ー ド 配下
で PDFlib メ ソ ッ ド の一覧を閲覧で き る よ う にな り ます。 新 し い PHP コ ー ド を書いてい る
時、 Eclipse は、 すべての PDFlib メ ソ ッ ド に対す る コ ー ド 補完 と 状況依存ヘルプで支援 し
ます。
1. www.eclipse.org/pdt を参照。
46
第 2 章 : PDFlib の言語バイ ンデ ィ ング
2.10 Python バ イ ン デ ィ ン グ
PDFlib Python 版の イ ン ス ト ール Python1 の拡張機構は共有 ラ イ ブ ラ リ を実行時に読み
込む こ と に よ っ て動作 し ます。 PDFlib バ イ ンデ ィ ン グ を動作 さ せ る には、 以下の よ う に、
Python イ ン タ プ リ タ が PDFlib Python ラ ッ パを利用で き る よ う にす る 必要があ り ます。 こ
の ラ ッ パは、PYTHONPATH 環境変数に列挙 さ れたデ ィ レ ク ト リ 内で検索 さ れます。Python
ラ ッ パの名前はプ ラ ッ ト フ ォームに よ っ て異な り ます :
> Unix ・ Mac OS X : pdflib_py.so
> Windows : pdflib_py.pyd
Python でのエ ラ ー処理 Python バ イ ンデ ィ ン グは、 PDFlib エ ラ ーを Python 例外に翻訳
す る 特別なエ ラ ーハン ド ラ を イ ン ス ト ール し ます。 Python 例外は次の よ う に通常の try/
catch で取 り 扱 う こ と がで き ます。
try:
...いろいろなPDFlib命令...
except PDFlibException:
print 'PDFlib Exception caught!'
1. www.python.org を参照。
2.10 Python バイ ンデ ィ ング
47
2.11 REALbasic バ イ ン デ ィ ン グ
( こ の節は、 PDFlib チ ュ ー ト リ アルの COM ・ .NET ・ REALbasic エデ ィ シ ョ ンにのみ掲載 し
てい ます)
48
第 2 章 : PDFlib の言語バイ ンデ ィ ング
2.12 RPG バ イ ン デ ィ ン グ
PDFlib は、 PDFlib 関数を埋め込まれた ILE-RPG プ ロ グ ラ ム を コ ンパ イ ルす る ために必要
なすべてのプ ロ ト タ イ プ と い く つかの有用な定数 と を定義 し た /copy モジ ュ ールを提供 し
てい ます。
Unicode 文字列処理 PDFlib が提供す る 関数はすべて、可変長の Unicode 文字列を引数 と
し て用いてい る ので、%UCS2 ビル ト イ ン関数を使っ てシ ン グルバ イ ト 文字列を Unicode 文
字列に変換す る 必要があ り ます。PDFlib の関数が返す文字列はすべて可変長の Unicode 文
字列です。 こ れ ら の Unicode 文字列を シ ン グルバ イ ト 文字列に変換す る には %CHAR ビル
ト イ ン関数を使い ます。
注 %CHAR ・ %UCS2 関数は、 カ レ ン ト ジ ョ ブの CCSID を使っ て文字列を Unicode と 変換 し ま
す。 PDFlib に同梱の例では CCSID 37 (US EBCDIC) をベース と し ています。 こ の例を こ れ
以外の コ ー ド ページ で走 らせる と 、 オプ シ ョ ン リ ス ト 内のい く つかの特殊キ ャ ラ ク タ ({ [
] } 等) が正 し く 翻訳 さ れない こ と があ り ます。
すべての文字列は可変長文字列 と し て渡 さ れ る ので、文字列長を明示的に指定す る 必要の
あ る さ ま ざ ま な関数では length 引数を渡 し てはいけ ません (可変長文字列の長 さ は、 文
字列の先頭 2 バ イ ト に格納 さ れてい ます)。
PDFlib を利用 し てい る RPG プ ロ グ ラ ムの コ ンパ イル と バ イ ン ド PDFlib 関数を RPG か
ら 利用す る には、 コ ンパ イ ル済みの PDFLIB ・ PDFLIB_RPG サービ ス プ ロ グ ラ ムが必要で
す。 PDFlib の定義を コ ンパ イ ル時に イ ン ク ルー ド する には、 /copy メ ンバの名前を次の よ
う に ILE-RPG プ ロ グ ラ ムの D スペ ッ ク の中で指定す る 必要があ り ます。
d/copy QRPGLESRC,PDFLIB
PDFlib ソ ース フ ァ イ ル ラ イ ブ ラ リ が ラ イ ブ ラ リ リ ス ト の先頭にない場合は、次の よ う にそ
の ラ イ ブ ラ リ も 指定 し なければな り ません。
d/copy PDFsrclib/QRPGLESRC,PDFLIB
ILE-RPG プ ロ グ ラ ムの コ ンパ イ ルを開始す る 前に、PDFlib に同梱の PDFLIB・ PDFLIB_RPG
サービ ス プ ロ グ ラ ム を含むバ イ ン ド デ ィ レ ク ト リ を作成 し てお く 必要があ り ます。次の例
は、 ラ イ ブ ラ リ PDFLIB の中の PDFLIB と い う バ イ ン ド デ ィ レ ク ト リ を作成 し たい場合の
指定です。
CRTBNDDIR BNDDIR(PDFLIB/PDFLIB) TEXT('PDFlib Binding Directory')
バ イ ン ド デ ィ レ ク ト リ を作成 し た後は、 PDFLIB ・ PDFLIB_RPG サービ ス プ ロ グ ラ ム をバ イ
ン ド デ ィ レ ク ト リ に追加す る 必要があ り ます。 次の例は、 さ き に作成 し たバ イ ン ド デ ィ レ
ク ト リ に ラ イ ブ ラ リ PDFLIB の中のサービ ス プ ロ グ ラ ム PDFLIB を追加 し たい場合の指定
です。
ADDBNDDIRE BNDDIR(PDFLIB/PDFLIB) OBJ((PDFLIB/PDFLIB *SRVPGM))
ADDBNDDIRE BNDDIR(PDFLIB/PDFLIB) OBJ((PDFLIB/PDFLIB_RPG *SRVPGM))
こ れで、 次の よ う に CRTBNDRPG コ マ ン ド (ま たは PDM の中のオプシ ョ ン 14) を用いて
プ ロ グ ラ ム を コ ンパ イ ルで き る よ う にな り ま し た。
2.12 RPG バイ ンデ ィ ング
49
CRTBNDRPG PGM(PDFLIB/HELLO) SRCFILE(PDFLIB/QRPGLESRC) SRCMBR(*PGM) DFTACTGRP(*NO)
BNDDIR(PDFLIB/PDFLIB)
RPG でのエ ラ ー処理 ILE-RPG で書かれた PDFlib ク ラ イ ア ン ト では、 ILE-RPG が提供す
る monitor/on-error/endmon エ ラ ー処理機構を利用する こ と がでい ます。 あ る いは、 ILERPG の *PSSR グ ロ ーバルエ ラ ー処理サブルーチン を用いて例外を モニ タ す る 方法 も あ り ま
す。 ジ ョ ブ ロ グにはエ ラ ー番号 と 、失敗 し た関数、お よ び例外の原因が示 さ れます。PDFlib
は呼び出 し 側プ ロ グ ラ ムへエ ス ケープ メ ッ セージ を送 り ます。
c
*
c
*
c
:
:
*
c
*
*
c
c
50
eval
p=PDF_new
monitor
eval
doc=PDF_begin_document(p:%ucs2('/tmp/my.pdf'):docoptlist)
エラー処理
on-error
このエラーについて何かします
PDFlibオブジェクトの解放を忘れないように
callp
PDF_delete(p)
endmon
第 2 章 : PDFlib の言語バイ ンデ ィ ング
2.13 Ruby バ イ ン デ ィ ン グ
PDFlib Ruby 版の イ ン ス ト ール Ruby1 の拡張機構、 共有 ラ イ ブ ラ リ を動作時に読み込む
こ と に よ っ て動作 し ます。 PDFlib バ イ ンデ ィ ン グが動作す る には、 Ruby 用の PDFlib 拡張
ラ イ ブ ラ リ の場所を Ruby イ ン タ プ リ タ が知っ ていて利用で き る 必要があ り ます。 たいて
いの場合、 こ の ラ イ ブ ラ リ (Windows ・ Unix では PDFlib.so、 Mac OS X では PDFlib.bundle)
が イ ン ス ト ール さ れ る 場所は、 ロ ーカル ruby イ ン ス ト ールデ ィ レ ク ト リ の site_ruby ブ ラ
ンチの中であ り 、すなわち、次の よ う な名前のデ ィ レ ク ト リ の中に イ ン ス ト ール さ れます。
/usr/local/lib/ruby/site_ruby/<rubyバージョン>/
ただ し Ruby は、 こ れ以外のデ ィ レ ク ト リ へ も 拡張を探 し に行 き ます。 こ れ ら のデ ィ レ ク
ト リ の一覧を取得す る には、 次の ruby コ ールを用い る こ と がで き ます。
ruby -e "puts $:"
こ の一覧はたいていの場合、 カ レ ン ト デ ィ レ ク ト リ を含んでい ますので、 テ ス ト 目的にお
いては、 PDFlib 拡張 ラ イ ブ ラ リ と ス ク リ プ ト を同 じ デ ィ レ ク ト リ に入れ る だけで よ いで
し ょ う。
Ruby でのエ ラ ー処理 Ruby バ イ ンデ ィ ン グは、 PDFlib 例外を ネ イ テ ィ ブ Ruby 例外に翻
訳す る 特別なエ ラ ーハン ド ラ を イ ン ス ト ール し ます。 こ う し た Ruby 例外は、 以下の よ う
な通常の rescue 技法で扱 う こ と がで き ます。
begin
...いろいろなPDFlib命令...
rescue PDFlibException => pe
print "PDFlib exception occurred in hello sample:\n"
print "[" + pe.get_errnum.to_s + "] " + pe.get_apiname + ": " + pe.get_errmsg + "\n"
Ruby on Rails Ruby on Rails2 は、 Ruby に よ る Web 開発を実現す る オープン ソ ース フ レー
ム ワー ク です。 Ruby 用 PDFlib 拡張は Ruby on Rails で利用可能です。 作成例をパ ッ ケージ
内に収めて あ り ます。 Ruby on Rails 用 PDFlib 作成例を実行す る には以下の手順に従っ て
く だ さ い。
> Ruby を イ ン ス ト ール し ます。
> Ruby on Rails を イ ン ス ト ール し ます。
> Ruby on Rails 用サンプルを含む Ruby 版 PDFlib パ ッ ケージ を ア ンパ ッ ク し ます。
> bind/ruby/RubyOnRails デ ィ レ ク ト リ へ移動 し 、次の よ う に Ruby ウ ェ ブサーバを起動 し
ます。
ruby script/server
> ブ ラ ウ ザで http://localhost:3000 を開 き ます。
PDFlib サンプルの コ ー ド は app/controllers/pdflib_controller.rb にあ り ます。
ロ ー カルに PDFlib を イ ン ス ト ール PDFlib を Ruby on Rails だけで使いたいに も かかわ ら
ず、 PDFlib を Ruby で一般利用で き る よ う グ ロ ーバルに イ ン ス ト ールす る こ と がで き ない
場合は、 Rails ツ リ ー内の vendors デ ィ レ ク ト リ の中に PDFlib を ロ ーカルに イ ン ス ト ール
1. www.ruby-lang.org/en を参照。
2. www.rubyonrails.org を参照。
2.13 Ruby バイ ンデ ィ ング
51
す る と い う 方法があ り ます。 こ の方法は特に、Ruby 拡張を一般利用で き る よ う イ ン ス ト ー
ルす る 権限を持たない場合に、 それで も PDFlib を Rails で扱いたい と い う と き に役立ち ま
す。
52
第 2 章 : PDFlib の言語バイ ンデ ィ ング
2.14 Tcl バ イ ン デ ィ ン グ
PDFlib Tcl 版の イ ン ス ト ール Tcl 1 の拡張機構は共有 ラ イ ブ ラ リ を実行時に読み込む こ
と に よ っ て動作 し ます。PDFlib バ イ ンデ ィ ン グ を動作 さ せる には、Tcl シ ェ ルが PDFlib Tcl
ラ ッ パ共有 ラ イ ブ ラ リ と パ ッ ケージ イ ンデ ッ ク ス フ ァ イ ル pkgIndex.tcl を利用で き る よ う
にす る 必要があ り ます。 あ る デ ィ レ ク ト リ 内の ラ イ ブ ラ リ を利用で き る よ う にす る には、
ス ク リ プ ト 内で次の よ う な指定を用い ます ( こ の方法は、 PDFlib を イ ン ス ト ールす る ため
のルー ト 権限を持た ないマシ ン上で PDFlib を利用 し たい場合に有用です)。
lappend auto_path /path/to/pdflib
> Unix : ラ イ ブ ラ リ pdflib_tcl.so (Mac OS X では pdflib_tcl.dylib) は、共有 ラ イ ブ ラ リ のデ
フ ォ ル ト の場所の う ちの 1 つに置かれてい る か、 適切に設定 さ れたデ ィ レ ク ト リ に置
かれてい る 必要があ り ます。 通常、 pkgIndex.tcl と pdflib_tcl.so は両方 と も 次のデ ィ レ
ク ト リ に置かれてい ます。
/usr/lib/tcl8.4/pdflib
> Windows:フ ァ イ ルpkgIndex.tcl と pdflib_tcl.dllは以下のデ ィ レ ク ト リ 内で検索 さ れます。
C:\Program Files\Tcl\lib\pdflib
C:\Program Files\Tcl\lib\tcl8.3\pdflib
Tcl でのエ ラ ー処理 Tcl バ イ ンデ ィ ン グは、PDFlib エ ラ ーを ネ イ テ ィ ブ Tcl 例外に翻訳す
る 特別なエ ラ ーハン ド ラ を イ ン ス ト ール し ます。 Tcl 例外は次の よ う に通常の try ~ catch
技法で処理で き ます。
if [ catch { ...いろいろなPDFlib命令... } result ] {
puts stderr "Exception caught!"
puts stderr $result
}
1. www.tcl.tk を参照。
2.14 Tcl バイ ンデ ィ ング
53
54
第 2 章 : PDFlib の言語バイ ンデ ィ ング
3 PDFlib 文書を作成
3.1 PDFlib プ ロ グ ラ ミ ン グの一般的特徴
ク ッ ク ブ ッ ク プ ログ ラ ミ ングの一般的な諸側面に関する コ ー ド サン プルが
general カ テ ゴ リ にあ り ます。
PDFlib
ク ッ ク ブ ッ クの
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=legacy: こ の設定は非推奨ですが、以前のバージ ョ ンの PDFlib と 互換な動作
を保証 し ます。 すなわち例外やエ ラ ー戻 り 値を、 fontwarning ・ imagewarning と い っ
たパ ラ メ タ やオプシ ョ ン で制御す る 方式です。 こ れは、 PDFlib 6 と の ソ ース コ ー ド 互
換性を要す る アプ リ ケーシ ョ ン についてのみ推奨 し ます。 新 し いアプ リ ケーシ ョ ン で
は使用す る べ き ではあ り ません。 legacy 設定はデフ ォ ル ト のエ ラ ーポ リ シーです。
> errorpolicy=return : エ ラ ー状況が検出 さ れた と き 、 いか な る 警告パ ラ メ タ ・ オプ シ ョ
ンに も よ ら ず、 各関数がエ ラ ー値 -1 (PHP では 0) を返 し ます。 アプ リ ケーシ ョ ン開
発者は こ の戻 り 値を調べて問題を発見 し 、 その問題に対 し て アプ リ ケーシ ョ ン ご と に
適切な方法で対処す る 必要があ り ます。 こ のアプ ロ ーチではエ ラ ー処理に統一的な ア
プ ロ ーチがで き る ので、 推奨 し ます。
> errorpolicy=exception : エ ラ ー状況が検出 さ れた と き 、 例外を発生 さ せ ま す。 た だ し 、
出力文書は例外の後には使え な く な り ます。 こ の方式を使 う と 、 エ ラ ー条件分岐を さ
ぼっ て手軽にプ ロ グ ラ ミ ン グがで き ますが、そのかわ り 問題が起 き る と 出力文書は、た
と えそれがアプ リ ケーシ ョ ン側で対処で き る 問題であ っ て も 失われて し ま い ます。
以下の コ ー ド に、 例外処理に関す る 各種の戦略を示 し ます。 各作成例は、 存在す る か し な
いかわか ら ない フ ォ ン ト を読み込 も う と し てい ます。
errorpolicy=return の と き は、 戻 り 値がエ ラ ーか ど う か を調べ る 必要があ り ます。 それ
が失敗を示 し てい る と き は、 以下の よ う に失敗の原因を取得す る こ と で、 状況を適切に さ
ば く こ と がで き る で し ょ う 。
font = p.load_font("MyFontName", "unicode", "errorpolicy=return");
if (font == -1)
{
/* フォントハンドルが無効。しかしPDF出力は継続可能。*/
errmsg = p.get_errmsg();
/* 別のフォントを試すか諦める */
...
}
/* フォントハンドルは有効。継続 */
errorpolicy=exception の と き は以下の よ う に、 エ ラ ーが発生 し た ら 文書は放棄 し なければ
な り ません。
font = p.load_font("MyFontName", "unicode", "errorpolicy=exception");
/* 例外が発生しなければフォントハンドルは有効。
* 例外が発生したら、PDF出力は継続できない
*/
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの general/error_handling ト ピ ッ ク にあ り ます。
56
第 3 章 : PDFlib 文書を作成
警告 問題の状況に よ っ ては、 PDFlib がそれを内部的に検出で き て も 、例外を発生 さ せて
プ ロ グ ラ ムの流れを さ え ぎ る 正当な理由にはな ら ない も の も あ り ます。以前のバージ ョ ン
の PDFlib は、 致命的でない例外 と い う 概念に対応 し ていて、 それは無効に も で き ま し た
が、 PDFlib 7 は致命的でない状況では、 例外を一切発生 し な く な り ま し た。 かわ り に、 状
況の説明を ロ グ記録 し ます ( ロ グ記録を有効に し て あれば) 。 ロ グ記録は下記の よ う に有
効にで き ます。
p.set_parameter("logging", "filename=private.log");
警告に関 し ては以下のアプ ロ ーチを推奨 し ます。
> 開発局面では警告の ロ グ記録を有効に し て、 その ロ グ フ ァ イ ル内のすべての警告 メ ッ
セージ を注意深 く 研究 し ます。 こ う し た警告は、 コ ー ド やデー タ にひそむ問題を示 し
てい る 可能性があ り ますか ら 、 その原因を理解ない し 除去す る よ う 努めなければな り
ません。
> 運用局面では警告の ロ グ記録を無効に し て、 問題が起 き た と き だけ再び有効に し ます。
3.1.2 PDFlib 仮想 フ ァ イ ルシ ス テム (PVF)
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの general/starter_pvf ト ピ ッ ク にあ り ます。
デ ィ ス ク 上の フ ァ イ ル と は別に、 ク ラ イ ア ン ト は、 PDFlib Virtual File System (PVF) と い
う し く みを利用す る こ と も で き ます。 こ れを用い る と 、 メ モ リ 内のデー タ を直接供給す る
こ と がで き る ので、 デ ィ ス ク のフ ァ イ ルを扱 う 必要が ま っ た く あ り ません。 こ れには速度
向上 と い う 利点があ り ます。 PVF はデー タ ベース か ら 取 り 出 し たデー タ 等の よ う に、 フ ァ
イ ル と し てデ ィ ス ク 上に存在 し ていない時に も 活用で き ます。 ま たそれ以外に も 、 ク ラ イ
ア ン ト の必要 と す る デー タ が、何 ら かの処理の結果 と し て メ モ リ 上にすでに存在 し てい る
場合に対 し て一般に有用です。
PVF の基本 コ ン セプ ト は、 仮想の読み取 り 専用フ ァ イ ルに名前を付けて、 それを通常
の フ ァ イ ル名 と ま っ た く 同 じ よ う に、あ ら ゆ る API 関数で使用で き る よ う にす る と い う も
のです。 UPR の設定フ ァ イ ルで も 使用す る こ と がで き ます。 仮想フ ァ イ ル名は、 ク ラ イ ア
ン ト が任意に名づけ る こ と がで き ます。 も ち ろん、 仮想フ ァ イ ル名は、 通常のデ ィ ス ク の
フ ァ イ ル と 名前衝突が起 こ ら ない よ う な も のに し なければな り ません。 そのため、 以下の
よ う な体系的な命名規則を推奨 し ます (filename は、 ク ラ イ ア ン ト が名づけ る 部分で、 各
カ テ ゴ リ 内で一意な名前です) 。 ま た、 フ ァ イ ル名の拡張子について も 、 標準に従 う こ と
を推奨 し ます。
> ラ ス タ 画像フ ァ イ ル : /pvf/image/filename
> フ ォ ン ト のア ウ ト ラ イ ンや メ ト リ ッ ク の フ ァ イ ル (実際の フ ォ ン ト 名を フ ァ イ ル名の
先頭部分 と し て用い る こ と を推奨) : /pvf/font/filename
> ICC プ ロ フ ァ イ ル : /pvf/iccprofile/filename
> エン コ ーデ ィ ン グ と コ ー ド ページ : /pvf/codepage/filename
> PDF 文書 : /pvf/pdf/filename
フ ァ イ ル名を指定 さ れて捜す時、 PDFlib は まず、 その指定 さ れた フ ァ イ ル名が既知の仮想
フ ァ イ ルのなかにあ る か ど う か を調べます。 その後に、 指定 さ れた フ ァ イ ルをデ ィ ス ク 上
で開 こ う と し ます。
仮想 フ ァ イルの継続期間 仮想フ ァ イ ルでデー タ が提供 さ れた と き には、 それをす ぐ に
消費す る 関数 も あ る で し ょ う し 、 そのフ ァ イ ルの一部分だけ を まず読んで、 残 り の部分は
後の時点で使 う と い う 関数 も あ る で し ょ う 。 そのため、 各仮想フ ァ イ ルの継続期間につい
ては細心の注意を払 う 必要があ り ます。 PDFlib は、 それぞれの仮想フ ァ イ ルに内部 ロ ッ ク
3.1 PDFlib プ ロ グ ラ ミ ングの一般的特徴
57
を かけてお き 、 その内容が も う 必要な く な っ た時には じ めて ロ ッ ク を外 し ます。 そのデー
タ を ただちに コ ピー し てお く よ う ク ラ イ ア ン ト が PDFlib に要求 し た場合 (PDF_create_
pvf( ) で copy オプシ ョ ン を指定) を除いては、 仮想フ ァ イ ルの内容を ク ラ イ ア ン ト が変
更・削除・解放す る こ と が許 さ れ る のは、PDFlib が ロ ッ ク が外 し た後に限 ら れます。PDFlib
は、 PDF_delete( ) が実行 さ れた と き には、 自動的にすべての仮想フ ァ イ ルを削除 し ます。
し か し 、 フ ァ イ ルの実際の内容 (仮想フ ァ イ ルの元デー タ ) はつねに ク ラ イ ア ン ト が解放
し なければいけ ません。
さ ま ざ ま な手法 PVF では、 仮想フ ァ イ ルのための必要 メ モ リ の管理手法は複数あ り え
ます。 ど の手法で も 考慮の対処 と す る べ き こ と は、 PDFlib は、 仮想フ ァ イ ル名を用いた
API 呼び出 し が終わっ た後で も ま だその仮想フ ァ イ ルの内容へのア ク セ ス を必要 と す る か
も し れない と い う こ と と 、 PDF_close( ) の後であれば も う ア ク セ ス を必要 と す る こ と は全
く ない と い う こ と です。留意す る 必要があ る のは、PDF_delete_pvf( ) を呼んで も 実際の フ ァ
イ ルの内容が解放 さ れ る わけではな く (copy オプシ ョ ン を指定 し た場合は例外) 、 その
PVF フ ァ イ ル名を管理 し ていたデー タ 構造が解放 さ れ る だけだ と い う こ と です。 よ っ て、
以下の よ う な方式があ り ます。
> メ モ リ 使用を最小にす る 手法 : API 呼び出 し で仮想フ ァ イ ル名を用いた ら 、 その直後に
PDF_delete_pvf( ) を呼ぶのが よ いで し ょ う 。そ し て、PDF_close( ) の後に ま た 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 生成を用い ます (63 ページ 「3.1.4 PDF 文書を メ モ リ 内に生
成」 参照)。
58
第 3 章 : PDFlib 文書を作成
3.1.3 リ ソ ース設定 と フ ァ イル検索
高度な応用アプ リ ケーシ ョ ンでは、PDFlib に さ ま ざ ま な リ ソ ース を利用 さ せ る 必要があ り
ます。 た と えばフ ォ ン ト フ ァ イ ル ・ エン コ ーデ ィ ン グ定義 ・ ICC カ ラ ープ ロ フ ァ イ ルな ど
です。 PDFlib の リ ソ ース管理を、 プ ラ ッ ト フ ォームに依存 し ない、 カ ス タ マ イ ズの容易な
も のにす る ためには、 設定フ ァ イ ルを作成 し てお く こ と がで き ます。 設定フ ァ イ ルの中に
は、利用可能な さ ま ざ ま な リ ソ ース と それぞれのデ ィ ス ク フ ァ イ ル名を記述 し てお く ので
す。 こ の よ う な静的な設定フ ァ イ ルだけではな く て、 PDF_set_parameter( ) に よ る リ ソ ー
ス の追加 を 用い た動的な実行時設定 を 行 う こ と も 可能です。 設定 フ ァ イ ルに関 し て は、
Unix PostScript Resource (UPR) と い う 簡単なテ キ ス ト 形式を採用 し ま し た。 こ の形式は、
Display PostScript の時代に生み出 さ れた も ので、 今で も い く つかのシ ス テ ム で使われてい
ます。 ただ し 元の UPR 形式を多少拡張 し ま し た。 こ の、 PDFlib で用い る 形の UPR フ ァ イ
ル形式については後述 し ま す。 makepsres と い う ユーテ ィ リ テ ィ も あ り ま す (X Window
System の一部 と し て頒布 さ れ る こ と が多い) 。 こ のユーテ ィ リ テ ィ を使 う と 、 PostScript
フ ォ ン ト フ ァ イ ル と メ ト リ ッ ク フ ァ イ ルか ら 自動的に UPR フ ァ イ ルを生成 さ せ る こ と が
で き ます。
リ ソ ースの カ テ ゴ リ PDFlib の対応 し てい る リ ソ ース カ テ ゴ リ を表 3.1 に挙げます。こ れ
以外の リ ソ ース カ テ ゴ リ は無視 さ れます。 その値は名前文字列 と し て扱われます。 すなわ
ち、 ASCII か UTF-8 (BOM つ き ) でエン コ ーデ ィ ン グする こ と がで き ます。 Unicode 値は、
HostFont リ ソ ース で各国語の フ ォ ン ト 名を指定す る のに有用で し ょ う 。
表 3.1 PDFlib で使え る リ ソ ース カ テ ゴ リ
カテゴ リ
形式
説明
SearchPath
値
デー タ フ ァ イルのあるデ ィ レ ク ト リ の相対または絶対パス名
CMap
キー = 値
日中韓エ ン コ ーデ ィ ン グのための CMap フ ァ イル
FontAFM
キー = 値
AFM 形式の PostScript フ ォ ン ト メ ト リ ッ ク フ ァ イル
FontPFM
キー = 値
PFM 形式の PostScript フ ォ ン ト メ ト リ ッ ク フ ァ イル
FontOutline
キー = 値
PostScript か TrueType か OpenType の フ ォ ン ト アウ ト ラ イ ン フ ァ イル
Encoding
キー = 値
8 ビ ッ ト エ ン コ ーデ ィ ン グま たは コ ー ド ページのテーブルを持っ た テ
キス ト フ ァ イル
HostFont
キー = 値
シ ス テムに イ ン ス ト ール さ れている フ ォ ン ト の名前
ICCProfile
キー = 値
ICC カ ラ ープ ロ フ ァ イル名
StandardOutputIntent
キー = 値
PDF/X の標準出力条件名 (PDFlib 内蔵のも のに加えて、 完全な一覧
は PDFlib API リ フ ァ レ ン ス を参照)
UPR フ ァ イル形式 UPR フ ァ イ ルはテ キ ス ト フ ァ イ ルであ り 、 その構造は非常に単純で、
テ キ ス ト エデ ィ タ で簡単に書 く こ と がで き ま す し 、 自動生成 さ せ る こ と も で き ま す。 ま
ず、 その文法を見てみま し ょ う 。
> それぞれの行は最大 1023 キ ャ ラ ク タ ま で。
> 行末のバ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ 「\」 は、 行終端を キ ャ ン セル し ます。 こ れは行を
延長 し たい と き に使え ます。
> パーセ ン ト 「%」 キ ャ ラ ク タ は、 行末ま での注釈を開始 さ せます。 行デー タ の一部であ
る (すなわち注釈を開始 さ せない) パーセ ン ト キ ャ ラ ク タ は、直前にバ ッ ク ス ラ ッ シ ュ
キ ャ ラ ク タ を付けて保護す る 必要があ り ます。
3.1 PDFlib プ ロ グ ラ ミ ングの一般的特徴
59
> 行終端 を 保護す る バ ッ ク ス ラ ッ シ ュ と 、 パーセ ン ト キ ャ ラ ク タ を 保護す る バ ッ ク ス
ラ ッ シ ュ キ ャ ラ ク タ と の直前のバ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ 群は、 行デー タ の一部で
あ る な ら 二重にす る 必要があ り ます。
> ピ リ オ ド 「.」 を単独で用い る と 、 セ ク シ ョ ンの終了を意味 し ます。
> すべての記述において、 大文字 ・ 小文字が区別 さ れます。
> スペースは、 リ ソ ース名中 と フ ァ イ ル名中をのぞ く あ ら ゆ る 箇所で無視 さ れます。
> リ ソ ース の名前を値は、 等号 「=」 を一切含んではいけ ません。
> 1 個の リ ソ ース が複数回定義 さ れた場合は、最後の定義がそれ以前の定義を上書 き し ま
す。
UPR フ ァ イ ルは以下の部分か ら 成っ てい ます。
> フ ァ イ ルの種類を示すおま じ ない行。 次の形を と り ます。
PS-Resources-1.0
> フ ァ イ ル中で記述 さ れ る すべての リ ソ ース カ テ ゴ リ を一覧に し たセ ク シ ョ ン。 省略可
能です。 各行に 1 つずつ リ ソ ース カ テ ゴ リ を記述 し ます。 こ の一覧は、 ピ リ オ ド 1 個
だけの行に よ っ て終了 し ます。 利用可能な リ ソ ース カ テ ゴ リ については後述 し ます。
こ の省略可能なセ ク シ ョ ンが存在 し ない場合であ っ て も 、1 個の ピ リ オ ド キ ャ ラ ク タ は
存在す る 必要があ り ます。
> フ ァ イ ルのは じ めに挙げ ら れた リ ソ ース カ テ ゴ リ それぞれについてセ ク シ ョ ンが 1 つ
ずつ。 各セ ク シ ョ ンは、 リ ソ ース カ テ ゴ リ を示す 1 行で始ま り 、 その後に、 利用可能
な リ ソ ース を記述す る 行が任意の行数つづ き ます。 こ の一覧は、 ピ リ オ ド 1 個だけの
行に よ っ て終了 し ます。 各 リ ソ ースデー タ 行には リ ソ ース の名前を書 き ます (等号は
ク ォー ト す る 必要があ り ます)。 その リ ソ ース がフ ァ イ ル名を必要 と する 場合には、 等
号の後に こ の名前を付け加え る 必要があ り ます。 リ ソ ース記述に挙げ ら れた フ ァ イ ル
を PDFlib が さ がす時には SearchPath (以下を参照) が適用 さ れます。
フ ァ イル検索 と SearchPath リ ソ ース カ テ ゴ リ PDFlib は さ ま ざ ま なデー タ ア イ テ ム を
デ ィ ス ク 上の フ ァ イ ルか ら 読み込みます。 た と えば ラ ス タ 画像 ・ フ ォ ン ト ア ウ ト ラ イ ン ・
フ ォ ン ト メ ト リ ッ ク 情報 ・ エン コ ーデ ィ ン グ定義 ・ PDF 文書 ・ ICC カ ラ ープ ロ フ ァ イ ルな
ど です。 相対パス名で も 絶対パス名で も ない、 パ ス指定を ま っ た く つけない フ ァ イ ル名を
用い る こ と も で き ます。 SearchPath リ ソ ース カ テ ゴ リ を使 う と 、 必要なデー タ フ ァ イ ルの
あ る デ ィ レ ク ト リ のパ ス名の一覧を指定す る こ と がで き ます。何か フ ァ イ ルを開かなけれ
ばな ら ない と き 、 PDFlib は、 まずその ま ま の フ ァ イ ル名で フ ァ イ ルを開 こ う と し ます。 こ
の試みが失敗す る と 、 PDFlib は、 SearchPath リ ソ ース カ テ ゴ リ で指定 さ れたデ ィ レ ク ト リ
群の中でその フ ァ イ ルが開けないか ど う か、 成功す る ま で一つ一つ試 し ます。 SearchPath
は複数指定す る こ と がで き 、 逆順に検索 さ れます (後の時点で設定 さ れたパ ス ほ ど、 も っ
と 早 く に設定 さ れた も の よ り も 先に検索 さ れ る )。こ の機能を使 う と 、PDFlib のアプ リ ケー
シ ョ ン を、 プ ラ ッ ト フ ォーム依存な フ ァ イ ルシ ス テ ム体系か ら 解 き 放つ こ と がで き ます。
検索パ ス項目は下記の よ う に設定で き ます。
p.set_parameter("SearchPath", "/パス/パス/ディレクトリ1");
p.set_parameter("SearchPath", "/パス/パス/ディレクトリ2");
こ の検索を無効にす る には、 フルパ ス に よ る 指定を PDFlib 関数の中に書 き ま す。 なお、
SearchPath リ ソ ー ス カ テ ゴ リ の機能は以下の よ う にプ ラ ッ ト フ ォ ーム依存にな っ てい ま
す。
60
第 3 章 : PDFlib 文書を作成
> Windows の場合、PDFlib は レ ジ ス ト リ 項目か ら 読み取っ た記述で SearchPath リ ソ ース カ
テ ゴ リ を初期化 し ます。 下記の レ ジ ス ト リ 項目にパ ス名の リ ス ト を セ ミ コ ロ ン 「;」 で
区切っ て指定す る こ と が可能です。 こ れ ら は下記の順序で検索 さ れます。
HKLM\SOFTWARE\PDFlib\PDFlib8\8.0.3\SearchPath
HKLM\SOFTWARE\PDFlib\PDFlib8\SearchPath
HKLM\SOFTWARE\PDFlib\SearchPath
> IBM iSeries では、 SearchPath リ ソ ース カ テ ゴ リ は以下の値で初期化 さ れます。
/PDFlib/PDFlib/8.0/resource/icc
/PDFlib/PDFlib/8.0/resource/fonts
/PDFlib/PDFlib/8.0/resource/cmap
/PDFlib/PDFlib/8.0
/PDFlib/PDFlib
/PDFlib
こ れ ら の項目の最後の も のは と く に、 複数の製品に対す る ラ イ セ ン ス フ ァ イ ルを格納
す る ために有用です。
> MVS つ き IBM zSeries シ ス テ ム群では、 SearchPath 機能には対応 し てい ません。
> OpenVMS では、 論理名を SearchPath と し て与え る こ と がで き ます。
サン プル UPR フ ァ イル
UPR 設定フ ァ イ ルの作成例を以下に挙げます。
PS-Resources-1.0
.
SearchPath
/usr/local/lib/fonts
C:/psfonts/pfm
C:/psfonts
/users/kurt/my_images
.
FontAFM
Code-128=Code_128.afm
.
FontPFM
Corporate-Bold=corpb___.pfm
Mistral=c:/psfonts/pfm/mist____.pfm
.
FontOutline
Code-128=Code_128.pfa
ArialMT=Arial.ttf
.
HostFont
Wingdings=Wingdings
.
Encoding
myencoding=myencoding.enc
.
ICCProfile
highspeedprinter=cmykhighspeed.icc
.
UPR リ ソ ース フ ァ イルの検索 組み込み リ ソ ース (た と えば PDF コ ア フ ォ ン ト ・ 組み込
みエン コ ーデ ィ ン グ ・ sRGB ICC プ ロ フ ァ イ ル) やシ ス テ ム リ ソ ース (た と えばホ ス ト フ ォ
3.1 PDFlib プ ロ グ ラ ミ ングの一般的特徴
61
ン ト ) だけが使われ る 場合には、 UPR 設定フ ァ イ ルは必要 と は さ れません。 なぜな ら 、 と
り たてて設定がな く て も 、 必要な リ ソ ース をすべて PDFlib が見つけ ら れ る か ら です。
それ以外の リ ソ ー ス を 使い た い場合は、 そ の リ ソ ー ス を 指定す る た め に、 PDF_set_
parameter( ) (後述) を呼び出すか、 UPR リ ソ ース フ ァ イ ルに記述 し ます。 こ の フ ァ イ ル
を、 PDFlib は、 最初の リ ソ ース が要求 さ れた時に自動的に読み込みます。 その過程は詳 し
く は下記の と お り です :
> Unix シ ス テ ム ・ Mac OS X シ ス テ ム ・ i5/iSeries では、 パ ス ・ デ ィ レ ク ト リ 名を一切指定
し な く て も 、 デフ ォ ル ト でい く つかのデ ィ レ ク ト リ で ラ イ セ ン ス ・ リ ソ ー ス フ ァ イ ル
が検索 さ れます。 UPR フ ァ イ ルを検索 し て読み取 る 前に、 下記のデ ィ レ ク ト リ が検索
さ れます ( こ の順に) :
<rootpath>/PDFlib/PDFlib/8.0/resource/icc
<rootpath>/PDFlib/PDFlib/8.0/resource/fonts
<rootpath>/PDFlib/PDFlib/8.0/resource/cmap
<rootpath>/PDFlib/PDFlib/8.0
<rootpath>/PDFlib/PDFlib
<rootpath>/PDFlib
Unix シ ス テ ム と Mac OS X では、 <rootpath> は、 まず /usr/local で、 ついで HOME デ ィ
レ ク ト リ で置 き 換え ら れます。 i5/iSeries では <rootpath> はは空です。 こ の機能を利用
すれば、 環境変数や ラ ン タ イ ム引数を一切指定せずに ラ イ セ ン ス フ ァ イ ル ・ UPR フ ァ
イ ル ・ リ ソ ース を取 り 扱 う こ と も で き ます。
> 環境変数 PDFLIBRESOURCE が定義 さ れていれば、その値を PDFlib は、読み込むべき UPR
フ ァ イ ルの名前 と し ます。 こ の フ ァ イ ルが読み込めない と き は例外が発生 し ます。
> 環境変数 PDFLIBRESOURCE が定義 さ れていない場合、PDFlib は下記の名前の フ ァ イ ルを
開 こ う と し ます :
upr (MVSの場合。データセットが期待される)
pdflib/<バージョン>/fonts/pdflib.upr (IBM i5/iSeriesの場合)
pdflib.upr (Windows・Unix・その他すべてのシステムの場合)
こ の フ ァ イ ルが読み込めない と き は例外は発生 し ません。
> Windows では上記以外に PDFlib は下記の レ ジ ス ト リ 項目を読み込 も う と し ます。下記の
順に検索 さ れます :
HKLM\Software\PDFlib\PDFlib8\8.0.3\resourcefile
HKLM\Software\PDFlib\PDFlib8\resourcefile
HKLM\Software\PDFlib\resourcefile
そ し て こ れ ら の項目の値を、 用い る べ き リ ソ ー ス フ ァ イ ルの名前 と し ます。 こ の フ ァ
イ ルが読み込めない と き は例外が発生 し ます。
64 ビ ッ ト Windows シ ス テ ム上で レ ジ ス ト リ を手作業で扱 う 際の注意点 : 通常どお り 、
64 ビ ッ ト の PDFlib バ イ ナ リ は Windows レ ジ ス ト リ の 64 ビ ッ ト ビ ュ ー と と も に動作 し 、
64 ビ ッ ト シ ス テ ム上で動作す る 32 ビ ッ ト の PDFlib バ イ ナ リ は レ ジ ス ト リ の 32 ビ ッ ト
ビ ュ ー と と も に動作 し ます。 32 ビ ッ ト 製品に対す る レ ジ ス ト リ キーを手作業で追加す
る 必要があ る と き は、 必ず 32 ビ ッ ト 版の regedit ツールを使用 し て く だ さ い。 こ れは
「ス タ ー ト 」 → 「フ ァ イル名を指定 し て実行 ...」 のダ イ ア ロ グか ら 下記に よ っ て起動す
る こ と がで き ます :
%systemroot%\syswow64\regedit
62
第 3 章 : PDFlib 文書を作成
注 64 ビ ッ ト Windows シ ス テム上で レ ジ ス ト リ を手作業で扱 う 際の注意点 : 通常どお り 、 64
ビ ッ ト の PDFlib バイ ナ リ は Windows レ ジ ス ト リ の 64 ビ ッ ト ビ ュ ー と と も に動作 し 、 64
ビ ッ ト シ ス テム上で動作する 32 ビ ッ ト の PDFlib バイ ナ リ はレ ジス ト リ の 32 ビ ッ ト ビ ュ ー
と と も に動作 し ます。 32 ビ ッ ト 製品に対する レ ジ ス ト リ キーを手作業で追加する必要が
ある と きは、 必ず 32 ビ ッ ト 版の regedit ツールを使用 し て く だ さ い。 こ れは 「ス タ ー ト 」
→ 「フ ァ イル名を指定 し て実行 ...」 のダ イ ア ロ グから下記によ っ て起動する こ と がで き ま
す:
> ク ラ イ ア ン ト 側で resourcefile パ ラ メ タ を明示的に設定す る こ と で リ ソ ース フ ァ イ ルを
PDFlib に実行時に読み込ませ る こ と も で き ます。 次の よ う に記述 し ます。
p.set_parameter("resourcefile", "/パス/パス/pdflib.upr");
こ の呼び出 し は任意の回数繰 り 返す こ と がで き ます。 その場合、 リ ソ ース記述が蓄積
さ れてい き ます。
リ ソ ース を実行時に設定 UPR フ ァ イ ルを使っ た設定だけではな く 、 ソ ース コ ー ド 中で
PDF_set_parameter( ) 関数を使っ て直接個々の リ ソ ース を設定す る こ と も で き ます。 こ の
関数はカ テ ゴ リ 名 と それに対す る リ ソ ース記述を と り ます。 リ ソ ース記述の部分は、 UPR
リ ソ ース フ ァ イ ルで こ のカ テ ゴ リ のセ ク シ ョ ンに書 く の と 同 じ よ う に書 き ます。た と えば
次の よ う にな り ます。
p.set_parameter("FontAFM", "Foobar-Bold=foobb___.afm");
p.set_parameter("FontOutline", "Foobar-Bold=foobb___.pfa");
注 フ ォ ン ト 設定の詳 し い説明は 128 ページ 「5.4.3 フ ォ ン ト を検索」 を参照 し て く だ さ い。
リ ソ ース値の取得
リ ソ ース項目は設定す る だけでな く 、 PDF_get_parameter( ) を使っ て
取得す る こ と も で き ます。 カ テ ゴ リ 名を キー と し て、 リ ス ト 内の番号を修飾子 と し て指定
し ます。 た と えば下記の呼び出 し
s = p.get_parameter("SearchPath", n);
は、 SearchPath リ ス ト 内の n 番目の項目を取得 し ます。 要求 さ れた カ テ ゴ リ に対 し て利用
可能な項目の数 よ り も n が大 き い と き は、 空文字列が返 さ れます。 返 さ れた文字列は、 何
ら かの API 関数が次に呼び出 さ れ る ま で有効です。
3.1.4 PDF 文書を メ モ リ 内に生成
フ ァ イ ル上に PDF 文書を生成す る だけではな く 、 PDFlib を使っ て メ モ リ 内に直接 PDF を
生成 さ せ る こ と も で き ます ( イ ン コ ア生成 と いい ます) 。 こ の技法は、 何 ら デ ィ ス ク ベー
ス の入出力が伴わ な い た めに速度の面で利点が あ り ま す し 、 PDF 文書 を た と えば直接
HTTP で流 し た り す る こ と も で き ます。 Web 管理者が聞いて特に喜びそ う なのは、 自分の
サーバにテ ン ポ ラ リ PDF フ ァ イ ルを散 ら か さ れずに済む と い う こ と で し ょ う 。
生成 さ れ る デー タ は、 定期的に少 し ずつ集め る こ と も で き ます し (た と えば各ページ
がで き る ご と に)、 最後に ま る ご と PDF 文書にな っ てか ら ひ と かた ま り で取 り 出す こ と も
で き ます (PDF_end_document( ) の後で) 。 PDF デー タ の細切れでの生成お よ び消費には
い く つかの利点があ り ます。 第一に、 デー タ 全体が メ モ リ 内に収ま る 必要がないので、 メ
モ リ 必要量が小 さ く て済みます。 第二に、 こ の方式では速度 も 上が る 可能性があ り ます。
なぜな ら 、 遅い接続でデー タ を伝送 し てい る 場合で も 、 最初の一切れを送 り 出 し てい る 間
3.1 PDFlib プ ロ グ ラ ミ ングの一般的特徴
63
に、 次の一切れが も う 生成中だか ら です。 ただ し 、 生成 さ れ る デー タ の総量は文書全体が
で き あが る ま でわか り ません。
createpvf オプシ ョ ン を用い る と 、PDF デー タ をデ ィ ス ク フ ァ イ ルへ書 き 込む こ と な く 、
メ モ リ 内へ生成 し 、 その後それを PDFlib に渡す こ と がで き ます (58 ページ 「PDF 出力を
仮想フ ァ イ ルに生成」 参照)。
能動 イ ン コ ア PDF 生成 イ ン タ フ ェ ース PDF デー タ を メ モ リ 内に生成す る には、 PDF_
begin_document( ) で空の フ ァ イ ル名を指定 し 、PDF_get_buffer( ) でデー タ を取 り 出 し ます。
p.begin_document("", "");
...文書を作成...
p.end_document("");
buf = p.get_buffer();
... バッファ内のPDFデータを利用 ...
p.delete();
注 バ ッ フ ァ 内の PDF デー タ はバイ ナ リ デー タ と し て扱 う 必要があ り ます。
こ れは 「能動」 モー ド と 捉え ら れます。 なぜな ら 、 バ ッ フ ァ 内容をいつ取 り 出 し たいかを
ク ラ イ ア ン ト 側で決めてい る か ら です。能動モー ド はすべての対応言語バ イ ンデ ィ ン グで
利用可能です。
注 C と C++ の ク ラ イ ア ン ト では、 返っ て き たバ ッ フ ァ を解放 し てはいけません。
受動 イ ン コ ア PDF 生成 イ ン タ フ ェ ース 「受動」 モー ド は、 C と C++ の言語バ イ ンデ ィ
ン グでのみ利用可能です。 こ の場合、 ユーザーは、 1 つの コ ールバ ッ ク 関数を イ ン ス ト ー
ル し ます (PDF_open_document_callback( ) を通 じ て)。 こ の関数は、 PDFlib に よ っ て、 予
測不可能な さ ま ざ ま な時点で呼ばれます。PDF デー タ が消費 さ れ る のを待っ てい る 時には
いつで も 呼ばれ る こ と にな り ます。 放出 ( ラ イ ブ ラ リ か ら ク ラ イ ア ン ト への PDF デー タ
の転送) に関す る タ イ ミ ン グ上の、 ひいてはバ ッ フ ァ 容量上の束縛条件は、 ク ラ イ ア ン ト
側で設定す る こ と がで き る ので、 柔軟性が非常に高 く な っ てい ます。 環境に よ っ て、 PDF
文書を ま る ご と 一度に取 り 出すのが好都合な場合 も あ る で し ょ う し 、複数のかた ま り に分
け る のが よ い場合 も あ る で し ょ う し 、た く さ んの コ マ切れに分けて PDFlib の内部文書バ ッ
フ ァ 量 を 抑え る の が望 ま し い場合 も あ る で し ょ う 。 放出の手法 を 設定す る には、 PDF_
open_document_callback( ) で flush オプシ ョ ンの値を指定 し ます。
3.1.5 大容量 PDF 文書
多 く のユーザーはギガバ イ ト 単位の PDF 文書を扱 う 必要には迫 ら れないで し ょ う が、 業
務アプ リ ケーシ ョ ンのなかには、大量の請求書や明細な ど を含む文書を作成 し た り 処理 し
た り す る 必要があ る も のがあ り ます。PDFlib 自体は生成す る 文書のサ イ ズにいかな る 制約
も 設けてい ませんが、 PDF Reference やい く つかの PDF 規格に よ っ て課せ ら れ る い く つか
の制限があ り ます :
> 2 GB フ ァ イ ルサ イ ズ制限:PDF/A-1 規格では、フ ァ イ ルサ イ ズ を 2 GB ま でに制限 し て
い ます。 1 文書が こ の制限 よ り も 大 き く な る と き は、 PDFlib は PDF/A-1 ・ PDF/X-4 ・
PDF/X-5 モー ド では例外を発生 さ せます。 それ以外の場合であれば 2 GB を超え る 文
書を作成で き ます。
> 10 GB フ ァ イ ルサ イ ズ制限:PDF 文書は伝統的に、相互参照テーブルに よ っ て内部的に、
10 進 10 桁すなわち 1010-1 バ イ ト ま でに制限 さ れて き ま し た。 こ れはお よ そ 9.3 GB に
64
第 3 章 : PDFlib 文書を作成
あ た り ます。 し か し 、 圧縮オブジ ェ ク ト ス ト リ ーム を用いれば こ の制約は超え る こ と
が で き ま す。 10 GB を 超 え る 出 力 文 書 を 作 成 し よ う と す る と き は、 PDF_begin_
document( ) で objectstreams={other} オプシ ョ ン を設定する 必要があ り ます。 こ れには
PDF 1.5 以上が必要です。圧縮オブジ ェ ク ト ス ト リ ームはいずれにせ よ フ ァ イ ル全体の
サ イ ズ を低減 さ せますが、 objectstreams 実装の一部であ る 圧縮相互参照ス ト リ ームは
も はや 10 進 10 桁の制限下には置かれず、 し たがっ て 10 GB を超え る PDF 文書の作成
を可能に し ます。
> オブジ ェ ク ト の数 : 一文書内のオブジ ェ ク ト の数は全般的には PDF に よ っ て制限 さ れ
てい ませんが、 PDF/A-1 ・ PDF/X-4 ・ PDF/X-5 規格では、 一文書内の間接オブジ ェ ク
ト の数を 8,388,607 個に制限 し てい ます。一文書が こ の制限を超え る オブジ ェ ク ト を必
要 と す る と き は、 PDFlib は PDF/A-1 ・ PDF/X-4 ・ PDF/X-5 モー ド では例外を発生 さ せ
ます。 それ以外の場合であれば も っ と オブジ ェ ク ト の多い文書を作成で き ます。 生成
さ れたオブジ ェ ク ト の数は PDFlib で直接取得する こ と はで き ませんが、 ク ラ イ ア ン ト
アプ リ ケーシ ョ ンは画像ハン ド ルを再利用 し 、 画像を ページ ス コ ープの外で読み込む
こ と に よ っ て、 い く ら かオブジ ェ ク ト を減 ら す こ と が可能です。 PDF 内のオブジ ェ ク
ト の数は、 ページ内容の複雑 さ や、 相互参照要素の数な ど に依存 し ます。 シ ン プルな
内容の大容量文書は通常ページ あ た り 4 ~ 10 個のオブジ ェ ク ト を持ち ますので、 100
~ 200 万ページ程度の文書であれば こ のオブジ ェ ク ト 制限を超えずに作成す る こ と が
で き ます。
3.1.6 PDFlib を EBCDIC ベースのプ ラ ッ ト フ ォ ームで利用
PDF フ ァ イ ル形式の中のオペレー タ と 制御構造は ASCII ベース であ り 、 z/OS ・ USS ・ MVS
オペレーテ ィ ン グ シ ス テ ム を搭載 し た IBM iSeries ・ zSeries と いっ た EBCDIC ベース のプ
ラ ッ ト フ ォームでは正 し く 動作 し ません (ただ し zLinux は ASCII ベース ですので こ の限
り ではあ り ません)。 し か し 、 特別な メ イ ン フ レームバージ ョ ンの PDFlib を利用すれば、
ASCII ベース の PDF オペレー タ と EBCDIC の (ま たはそれ以外の) テ キ ス ト 出力 と を混ぜ
る こ と がで き ます。 こ う し た EBCDIC セーフ なバージ ョ ンの PDFlib は、 さ ま ざ ま なオペ
レーテ ィ ン グ シ ス テ ムやマシ ン アーキ テ ク チ ャ で利用可能です。
PDFlib の さ ま ざ ま な機能を EBCDIC ベース のプ ラ ッ ト フ ォーム で活用す る ためには、
以下に挙げ る も のは EBCDIC テ キ ス ト 形式で与え ら れ る こ と が期待 さ れます( よ り 具体的
には、 iSeries では コ ー ド ページ 037 で、 zSeries では コ ー ド ページ 1047 で)。
> PFA フ ォ ン ト フ ァ イ ル ・ UPR 設定フ ァ イ ル ・ AFM フ ォ ン ト メ ト リ ッ ク フ ァ イ ル
> エン コ ーデ ィ ン グ フ ァ イ ル ・ コ ー ド ページ フ ァ イ ル
> PDFlib 関数の文字列引数
> 入出力フ ァ イ ル名
> 環境変数 (実行環境が対応 し てい る 場合)
> PDFlib のエ ラ ー メ ッ セージ も EBCDIC 形式で生成 さ れます (Java 以外)。
ASCII 形式の入力テ キ ス ト フ ァ イ ル (PFA ・ UPR ・ AFM ・ エン コ ーデ ィ ン グ) を使いたい
場合は、 asciifile パ ラ メ タ を true に設定 し ます (デフ ォ ル ト は false)。 す る と PDFlib は、
こ れ ら の フ ァ イ ルが ASCII エン コ ーデ ィ ン グで書かれてい る と 期待す る よ う にな り ます。
ただ し その場合で も 、文字列引数はやは り EBCDIC エン コ ーデ ィ ン グであ る と 期待 さ れま
す。
こ れに対 し 、 以下の も のはつねにバ イ ナ リ モー ド で取 り 扱 う 必要があ り ます (すなわ
ち、 いかな る 変換 も 行っ てはいけ ません)。
> PDF 入出力フ ァ イ ル
> PFB フ ォ ン ト ア ウ ト ラ イ ン フ ァ イ ル ・ PFM フ ォ ン ト メ ト リ ッ ク フ ァ イ ル
3.1 PDFlib プ ロ グ ラ ミ ングの一般的特徴
65
> TrueType ・ OpenType フ ォ ン ト フ ァ イ ル
> 画像フ ァ イ ル ・ ICC プ ロ フ ァ イ ル
66
第 3 章 : PDFlib 文書を作成
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_parameter("usercoordinates", "true");
リ ン ク ・ フ ィ ール ド の矩形 と し ては、 その縁がページの縁に平行な も のに し か PDF では
対応 し ていないので、 拡縮 ・ 回転 ・ 並行移動 ・ 斜形化に よ っ て座標系が変形 し てい る と き
には与え ら れた矩形は形を調整 し なければな り ません。 こ の よ う な場合、 PDFlib では、 そ
の四角形を含み、 かつ縁がページの縁 と 平行な最小の矩形を計算 し ます。 そ し て こ れをデ
フ ォ ル ト 座標に変換 し 、 その結果の値を、 与え ら れた座標のかわ り に用い ます。
要す る に大局的に言っ て ど んな効果があ る か と いえば、usercoordinates パ ラ メ タ が true
に設定 さ れていれば、ページ内容に対 し て も イ ン タ ラ ク テ ィ ブ要素に対 し て も 同 じ 座標系
が使え る と い う こ と です。
3.2 ページ記述
67
座標の表示 PDFlib のユーザーが PDF の座標系を扱 う のを支援する ために、PDFlib のデ ィ
ス ト リ ビ ュ ーシ ョ ンには grid.pdf と い う PDF フ ァ イ ルが含まれてい ます。 こ の PDF フ ァ
イ ルは、 よ く 使われ る い く つかのページサ イ ズの座標を表示す る も のです。 望みのサ イ ズ
のページ を何か透明な も のに印刷すれば、PDFlib での開発のために有用な道具にな る か も
し れません。
ページ座標は、 Acrobat では下記の よ う に し て表示で き ます :
> カー ソ ル座標を表示す る には下記を用い ます :
Acrobat X : 「表示」 → 「表示切 り 替え」 → 「カ ー ソル座標」
Acrobat 9 : 「表示」 → 「カ ー ソル座標」
Acrobat 8 : 「表示」 → 「ナビゲーシ ョ ンパネル」 → 「情報」
> 座標は、Acrobat で現在選択 さ れてい る 単位で表示 さ れます。表示単位を変更す る には、
Acrobat 8/9/X では次の よ う に操作 し ます : 「編集」 → 「環境設定」 (→ 「一般 ...」) →
「単位 と ガ イ ド 」 を選択 し て、 ポ イ ン ト ・ イ ンチ ・ ミ リ ・ パ イ カ ・ セ ンチ メ ー ト ルの う
ちのいずれか を選びます。
ただ し 、 表示 さ れ る 座標系はページの左上隅が原点であ り 、 PDF のデフ ォ ル ト であ る 左下
隅の原点 と は異な る ので注意が必要です。 Acrobat の座標表示 と 合わせた座標系を選ぶ方
法については 69 ページ 「下向 き 座標の利用」 を参照 し て く だ さ い。
PDF のプ リ ン ト ア ウ ト でページの縦横の長 さ が正 し く ない よ う に見え て も 惑わ さ れな
い よ う に し ま し ょ う 。 なぜ正 し く 出ないのか、 よ く あ る 原因は以下の と お り です。
> Acrobat の印刷ダ イ ア ロ グの 「ページの拡大 / 縮小 :」 オプシ ョ ンの設定が 「な し 」 以外
にな っ てい る ために、 印刷出力が拡縮 さ れてい る 。
> 非 PostScript プ リ ン タ ド ラ イ バの場合は、印刷す る も のの大 き さ が正確に再現 さ れ る と
は限 ら ない。
オ ブ ジ ェ ク ト の回転 重要な こ と は、 一度ページ上に描いた も のは変更がで き ない と い
う こ と です。 PDFlib には、 回転 ・ 並行移動 ・ 拡縮 ・ 斜形化の関数があ り ますが、 こ う し た
関数は、 すでに存在 し てい る も のに対 し ては効力を持たず、 それ以降に描かれ る も のに対
し てだけ効力があ り ます。
テ キ ス ト ・ 画像 ・ 取 り 込み PDF ページ を回転 さ せ る のは簡単で、 PDF_fit_textline( ) ・
PDF_fit_textflow( ) ・ PDF_fit_image( ) ・ PDF_fit_pdi_page( ) で rotate オプシ ョ ン を指定 し ま
す。 こ う し たオブジ ェ ク ト を それぞれのはめ込み枠内で 90 度の倍数だけ回転 さ せ る のは、
こ れ ら の関数の orientate オプシ ョ ン で可能です。 下記の例は傾き 45 度のテ キ ス ト を生成
し ます。
p.fit_textline("回転テキスト", 50.0, 700.0, "rotate=45");
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/rotated_text ト ピ ッ ク にあ り ます。
ベ ク ト ルグ ラ フ ィ ッ ク の回転は、 一般の変形関数 PDF_translate( ) ・ PDF_rotate( ) を利用す
れば可能です。 下記の例は、 左下隅を (200, 100) に持つ回転矩形を作成 し ます。 描 き たい
矩形の隅へ座標原点を変更 し 、 座標系を回転 さ せて、 矩形を (0, 0) に配置 し てい ます。 以
下の よ う に save と restore では さ む こ と に よ り 、 縦置き テ キ ス ト の作成を完了 し た後、 簡
単に元の座標系に戻っ てオブジ ェ ク ト の配置を継続で き ます。
p.save();
p.translate(200, 100);
p.rotate(45.0);
p.rect(0.0, 0.0, 75.0, 25.0);
68
第 3 章 : PDFlib 文書を作成
/* 原点を矩形の隅へ移動*/
/* 座標を回転させる */
/* 回転された矩形を描く */
p.stroke();
p.restore();
下向 き座標の利用 PDF の上向 き 座標系 と は違っ て、 グ ラ フ ィ ッ ク 環境のなかには下向
き 座標を用いてい る も の も あ る ので、 そち ら を採用 し たい開発者 も い る で し ょ う 。 その よ
う な座標系は PDFlib の変換関数で簡単に設定す る こ と がで き ます。 と こ ろが、 こ の変換
はテ キ ス ト 出力に対 し て も 効力を持つので (テ キ ス ト が簡単に上下ひっ く り 返 り ます) 、
テ キ ス ト が裏返 し にな っ て し ま わない よ う にす る には、ほかに も 何 ら かの呼び出 し を行 う
こ と が必要にな り ます。
下向き 座標が簡単に利用で き る よ う にす る ため、 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 イ ン タ プ
リ タ では も っ と 大 き なサ イ ズや も っ と 小 さ なサ イ ズの文書を扱 う こ と がで き た と し て も 、
3.2 ページ記述
69
何 も 怪 し むに足 ら ない と い う こ と です。 Acrobat のページサ イ ズ制限を表 3.2 に示 し ます。
PDF 1.6 以上では、 PDF_begin/end_page_ext( ) で userunit オプシ ョ ン を用いて、 ページに
対す る グ ロ ーバルな拡縮倍率を指定す る こ と も で き ます。
表 3.2 Acrobat の最小 ・ 最大ページサイ ズ
PDF 表示 ソ フ ト
最小ページサイ ズ
最大ページサイ ズ
Acrobat 4 以上
1/24" = 3 pt = 0.106 cm
200" = 14400 pt = 508 cm
Acrobat 7 以上で userunit
オプ シ ョ ン を指定
3 ユーザー単位
14 400 ユーザー単位
userunit の最大値は 75 000 なので、 可能なページサイ
ズは最大 14 400 × 75 000 = 1 080 000 000 ポ イ ン ト =
381 km
さ ま ざ ま なページサ イ ズボ ッ ク ス PDFlib の開発者の多 く は、 ページの幅 と 高 さ を指定
す る だけで済みますが、 なかには高度な アプ リ ケーシ ョ ンで ( と り わけプ リ プ レ ス業務で
は)、それ以外の PDF のボ ッ ク ス項目を記述 し たい と き も あ る で し ょ う 。PDFlib では、PDF
のすべてのボ ッ ク ス項目に対応 し てい ます。PDFlib の ク ラ イ ア ン ト で指定で き る 項目を以
下に挙げます (それぞれの定義は PDF リ フ ァ レ ン ス よ り )。 こ う し た項目はあ る 種の環境
で有用です。
> MediaBox: ページの幅 と 高 さ を指定す る ために用い ら れ、通常私達がページサ イ ズ と し
て と ら えてい る も のを記述 し ます。
> CropBox: ページの内容が切 り 抜かれ る 領域。Acrobat は こ のサ イ ズ を画面表示 と 印刷の
際に利用 し ます。
> TrimBox: 完成ページの領域を指定 (裁ち切 り 後の)。
> ArtBox: ページ上で意味のあ る 内容が占め る 領域。 こ れがアプ リ ケーシ ョ ン ソ フ ト ウ ェ
アで利用 さ れ る こ と は稀。
> BleedBox: 印刷所環境で出力 さ れ る と き にページの内容が切 り 抜かれ る 領域。印刷所工
程での裁ち切 り の不正確 さ を考えに入れて少 し ゆ と り を持たせて囲んで も よ い。
PDFlib では、 上記の ど の値 も 利用す る こ と はな く 、 ただ出力フ ァ イ ルに記録す る 機能を持
つだけです。 デフ ォ ル ト では PDFlib は、 ページの幅 と 高 さ の指定か ら MediaBox を生成 し
ますが、 それ以外の項目は一切生成 し ません。 以下の コ ー ド 抜粋は、 新 し いページ を開始
さ せた後、 CropBox の 4 つの値を設定す る も のです。
/* カスタムCropBoxを持つ新規ページを開始 */
p.begin_page_ext(595, 842, "cropbox={10 10 500 800}");
文書のページ数 PDFlib では、1 つの文書の中に生成す る ページの数については何 も 制限
はあ り ません。 PDFlib は、 何十万ページ あ る 文書で も Acrobat が効率的に表示 し ていけ る
よ う な PDF 構造を生成 し ます。
3.2.3 直接パス と パス オ ブ ジ ェ ク ト
パ ス と は、 任意の数の直線 ・ 矩形 ・ 円 ・ ベジエ曲線 ・ 楕円弧でで き た輪郭です。 パ ス は、
つなが っ ていない部分を複数含む こ と がで き ます。 こ う し た部分を サブパ ス と いい ます。
パ ス に対 し て実行で き る 操作を以下に挙げます。
> 描線。 パ ス に沿っ て線を描 き ます。 ク ラ イ ア ン ト が与え た、 描画に関す る 引数 (た と
えば色や線幅) を用い ます。
> 塗 り 。 パ ス で囲 ま れた領域全体を塗 り ます。 ク ラ イ ア ン ト が与え た、 塗 り に関す る 引
数を用い ます。
70
第 3 章 : PDFlib 文書を作成
> 切 り 抜 き 。 以後の描画の可視領域を限定 し ます。 具体的には、 カ レ ン ト 切 り 抜 き 領域
(デフ ォ ル ト では無限定) が、 カ レ ン ト 切 り 抜 き 領域 と パ ス で囲まれた領域 と の交差部
分に と っ て替わ ら れます。
> ただパス を終了。 見え ないパス がで き ます。 それで も PDF フ ァ イ ルの中には存在 し て
い ます。 こ れが有用な場合は稀です。
直接パス 関数 PDF_moveto( ) ・ PDF_lineto( ) ・ PDF_rect( ) 等を用いて、 カ レ ン ト ページや
その他の内容ス ト リ ーム (テ ンプ レー ト ・ Type 3 グ リ フ記述等) へただちに書かれ る 直接
パ ス を構築す る こ と も で き ます。パ ス を構築 し た直後に、それを PDF_stroke ( )・PDF_fill( )・
PDF_clip( ) のいずれか 1 つお よ び関連す る 関数で処理す る 必要があ り ます。 こ れ ら の関数
はパ ス を消費 し 削除 し ます。 パス を複数回使 う 唯一の方法は、 PDF_save( ) と PDF_restore( )
を用い る こ と です。
直接パ ス を作成 し ておいて上記の操作を何 も 適用 し ない と エ ラ ーにな り ます。 PDFlib
の ス コ ープ体系に従えば、 ク ラ イ ア ン ト は こ の制約に自然に従 う こ と にな り ます。 パ ス の
書式属性 (色 ・ 線幅等) を変えたい場合はかな ら ず、 描画操作の開始前に行 う 必要があ り
ます。 こ の規則を一言で言えば 「パ ス記述の途中で、 書式を変え てはいけ ません」。
パ ス を ただ作成 し ただけではページには何 も 現れ ません。 次の よ う に、 塗 り か描線を
パ ス に適用 し なければ目に見え る 結果は得 ら れません。
p.setcolor("stroke", "rgb", 1, 0, 0, 0);
p.moveto(100, 100);
p.lineto(200, 100);
p.stroke();
たいていのグ ラ フ ィ ッ ク 関数では、 カ レ ン ト 点 と い う 概念を利用 し てい ます。 こ れは、 描
画に用いてい る ペンの位置 と 捉え る こ と がで き ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの graphics/starter_graphics ト ピ ッ ク にあ り ます。
パス オ ブ ジ ェ ク ト パ ス オブジ ェ ク ト は、 直接パ ス よ り も 便利で強力な も のです。 パ ス
オブジ ェ ク ト は、 パ ス を構築す る ためのすべての描画操作を カプセル化 し ます。 パ ス オブ
ジ ェ ク ト は PDF_add_path_point( ) で作成す る こ と がで き 、 あ る いは、 画像 ク リ ッ ピ ン グ
パ ス を 含んでい る 画像 フ ァ イ ルか ら 抽出す る こ と も で き ま す (後述) 。 PDF_add_path_
point( ) では、 パ ス構築を実現す る ためのい く つかの便利なオプシ ョ ン を使 う こ と も で き
ます。パ ス オブジ ェ ク ト を作成 し た ら 、それは さ ま ざ ま な目的に利用する こ と が可能です:
> パス オブジ ェ ク ト を、PDF_draw_path( ) を用いてページ記述上で利用す る こ と がで き ま
す。 すなわち塗っ た り 、 描線 し た り 、 ク リ ッ ピ ン グパ ス と し て用いた り す る こ と がで
き ます。
> パ ス オブジ ェ ク ト を、 テ キ ス ト フ ロ ーの回 り こ み形状 と し て用い る こ と がで き ま す :
テ キ ス ト が任意の形状の内部 ま た は外部 を 回 り こ む よ う に組 ま れ ま す (222 ページ
「8.2.10 テ キ ス ト をパ ス ・ 画像に回 り 込み」 参照)。
> テ キ ス ト をパ ス上に配置す る こ と も で き ます。 すなわち、 キ ャ ラ ク タ 群がパ ス の直線
や曲線に沿っ て並べ ら れます (203 ページ 「8.1.7 パス上のテ キ ス ト 」 参照)。
> パス オブジ ェ ク ト を表セル内に配置す る こ と がで き ます。
直接パ ス と 異な り 、 パ ス オブジ ェ ク ト は PDF_delete_path( ) で明示的に削除 さ れ る ま で複
数回利用す る こ と がで き ます。 パ ス に関す る 情報は PDF_info_path( ) で取得で き ます。 下
記の コ ー ド は、 円を含む単純なパス形状を作成 し 、 それをページ上の異な る 2 箇所に描線
し 、 最後にそれを削除 し てい ます :
3.2 ページ記述
71
path = p.add_path_point( -1,
0, 100, "move", "");
path = p.add_path_point(path, 200, 100, "control", "");
path = p.add_path_point(path,
0, 100, "circular", "");
p.draw_path(path, 0, 0, "stroke");
p.draw_path(path, 400, 500, "stroke");
p.delete_path(path);
パ ス オブジ ェ ク ト をいちいち描画操作で作成する 方法のほかに、取 り 込み画像か ら ク リ ッ
ピ ン グパ ス を抽出す る 方法 も あ り ます :
image = p.load_image("auto", "image.tif", "clippingpathname={path 1}");
/* 画像のクリッピングパスからパスオブジェクトを作成 */
path = (int) p.info_image(image, "clippingpath", "");
if (path == -1)
throw new Exception("エラー : クリッピングパスが見つかりません!");
p.draw_path(path, 0, 0, "stroke");
3.2.4 テ ン プ レ ー ト
PDF 内のテ ン プ レ ー ト PDFlib では、 技術用語で フ ォ ーム XObject と 呼ばれ る PDF の機
能に対応 し てい ます。 し か し こ の用語は、 対話的な フ ォーム と ま ぎ ら わ し いため、 私達は
こ の機能を 「テ ンプ レー ト 」 と 呼びます。 PDFlib のテ ンプ レー ト は、 ページ外のバ ッ フ ァ
と 捉え る こ と がで き 、 そ こ ではテ キ ス ト ・ ベ ク ト ル ・ 画像の操作が行え ます (通常のペー
ジ上 と 同 じ よ う に) 。 テ ンプ レー ト がで き た後は、 ま る で ラ ス タ 画像の よ う に使 う こ と が
で き 、 任意の回数、 任意のページに貼 り 付け る こ と が可能です。 画像同様、 テ ンプ レー ト
には拡縮や斜形化な ど の幾何学的変形を施す こ と がで き ます。 1 つのテ ンプ レー ト を複数
のページで使っ た場合には(ない し は同 じ ページで複数回)、テ ンプ レー ト を構成す る PDF
オペレー タ は実際には PDF フ ァ イ ル中に 1 回 し か書かれていないので、 PDF 出力フ ァ イ
ルサ イ ズの節約にな り ます。 テ ンプ レー ト は、 複数のページに繰 り 返 し 現れ る も のに対 し
て活用す る と よ いで し ょ う 。 た と えば、 毎ページ同 じ 背景や、 企業 ロ ゴや、 CAD ソ フ ト ・
地図作成 ソ フ ト の吐 き 出す図記号な ど です。 こ れ以外に も テ ンプ レー ト の代表的な活用例
と し ては、 ト ン ボ ・ 商標 ・ 外字な ど があ り ます。
PDFlib で テ ン プ レ ー ト を利用 テ ン プ レ ー ト は、 ページ記述の外でのみ 「定義す る 」 こ
と がで き 、 そ し てページ記述の中で 「利用す る 」 こ と がで き ます。 ただ し 、 テ ンプ レー ト
は他のテ ンプ レー ト を内包す る こ と も 可能です。 も ち ろん、 テ ンプ レー ト を それ自体の定
義中で使 う こ と は不可能です。定義済みのテ ンプ レー ト をページ上か ら 参照する にはPDF_
fit_image( ) 関数を使えば よ く 、 画像をページ に貼 り 付け る の と ま っ た く 同 じ です (188
ページ 「7.3 画像 と 取 り 込み 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, "");
...いろいろなページ描画操作を追加...
72
第 3 章 : PDFlib 文書を作成
p.end_page();
...
p.close_image(template);
あ ら ゆ る テ キ ス ト ・ グ ラ フ ィ ッ ク ・ 色関数がテ ンプ レー ト 上では使え ます。 ただ し 、 次に
挙げ る 関数は、 テ ンプ レー ト を作成 し てい る 間には使っ てはいけ ません。
> PDF_load_image( ) : こ れは大 き な制約ではあ り ま せん。 なぜな ら 画像はテ ン プ レー ト
定義の外で開いておけば、 自由にテ ンプ レー ト の中で使え る か ら です (開 く 以外は)。
> すべての イ ン タ ラ ク テ ィ ブ関数。 なぜな ら こ れ ら は必ず、 配置 し たい文書ページ上で
定義 し なければな ら ず、 テ ンプ レー ト の一部 と し て生成す る こ と はで き ません。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの general/repeated_contents ト ピ ッ ク にあ り ます。
3.2.5 外部 PDF 文書内の参照ページ
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの pdfx/starter_pdfx5g ト ピ ッ ク にあ り ます。
PDF 文書は、 外部文書内のページへの参照を含む こ と がで き ます : こ の (拡縮や回転 さ れ
た) 参照ページは文書の一部ではあ り ませんが、 他のページ内容 と 全 く 同 じ よ う に表示 ・
印刷 さ れ ます。 こ れを利用す る と 、 再利用す る グ ラ フ ィ ッ ク 内容 ( ロ ゴ ・ 表紙ページ等)
を、 その PDF デー タ を含め る こ と な く 参照す る こ と がで き ます。 PDFlib は、 強い参照に、
すなわち、 参照ページが内部 メ タ デー タ を通 じ て同定 さ れ る 参照に対応 し てい ます。 参照
ページが得 ら れない と き や、 メ タ デー タ と 整合 し ない と き は、 参照ページではな く 代理画
像が表示 さ れます。
参照ページ (技術用語では参照 XObject) は、 PDF 1.4 (すなわち Acrobat 5 の フ ァ イ ル
形式) ですでに仕様に記載 さ れてい ま し たが、 それを正 し く 表示 ・ 印刷する には Acrobat 9
以上が必要です。 参照ページは PDF/X-5g ・ PDF/X-5pg の重要な要素で も あ り ます。 生成
さ れ る (新 し い) 文書を コ ン テナ文書 と いい、 参照ページがあ る 外部 PDF 文書を タ ーゲ ッ
ト フ ァ イ ル と いい ます。
参照ページ を Acrobat 9 か X で使 う には、 Acrobat を下記の よ う に正 し く 設定す る こ と
が重要です :
> 「編集」 → 「環境設定」 → 「一般 ...」 → 「ページ表示」 → 「参照 XObject タ ーゲ ッ ト を表
示」 : 「つねに」 に設定 (設定 「PDF-X/5 準拠の もののみ」 は、 Acrobat のバグのため動
作 し ません)。
> 「編集」 → 「環境設定」 → 「一般 ...」 → 「ページ表示」 → 「参照 さ れる フ ァ イルの場
所」 : タ ーゲ ッ ト フ ァ イ ルがあ る デ ィ レ ク ト リ の名前を入力。
> 「編集」 → 「環境設定」 → 「一般 ...」 → 「セキ ュ リ テ ィ (拡張)」 → 「セキ ュ リ テ ィ 特権
の場所」 → 「フ ォルダのパス を追加」 : コ ン テナ文書があ る デ ィ レ ク ト リ の名前を追加。
こ れは 「拡張セキ ュ リ テ ィ を有効にする」 の設定にかかわ ら ず行 う 必要があ り ます。
タ ーゲ ッ ト ページは、 コ ン テナ PDF 内部でその フ ァ イ ル名 と ページ番号が指定 さ れてお
り 、 下記の条件すべて を満たす と き にのみ代理でな く それが表示 さ れます :
> コ ン テナ文書が Acrobat の設定に よ り 信頼 さ れてい る 。
> 指定 さ れたデ ィ レ ク ト リ 内で タ ーゲ ッ ト フ ァ イ ルが見つか っ た。
> タ ーゲ ッ ト フ ァ イ ルがパス ワー ド を一切要求せず、 エ ラ ーな く 開 く こ と がで き る 。
> コ ン テナ文書内で指定 さ れた参照ページのページ番号が タ ーゲ ッ ト フ ァ イ ル内に存在
し てい る 。
> PDF/X-5 のみ: タ ーゲ ッ ト 内の ID と 特定の XMP メ タ デー タ 項目群が、コ ン テナ文書内
の対応す る 項目 と 整合す る 必要があ り ます。
3.2 ページ記述
73
こ れ ら の条件に 1 つで も 違反 し てい る と き は、 タ ーゲ ッ ト ページでな く 代理が表示 さ れま
す。 Acrobat はいかな る エ ラ ー メ ッ セージ も 出 し ません。
PDFlib は、 別の取 り 込みページ を代理 ( タ ーゲ ッ ト を単純化 し た も の等) と し て用い
る こ と も で き ます。 あ る いは、 テ ンプ レー ト を代理 と し て用いて、 た と えば単純な幾何学
形状を代理のプ レース ホルダ と す る こ と も 可能です :
proxy = p.begin_template_ext(0, 0,
"reference={filename=target.pdf pagenumber=1 strongref=true}");
if (proxy == -1 )
{
/* エラー */
}
74
第 3 章 : PDFlib 文書を作成
3.3 暗号化 PDF
3.3.1 PDF のセキ ュ リ テ ィ 機能
PDF は、 文書の内容を保護す る 助け と な る さ ま ざ ま なセ キ ュ リ テ ィ 機能に対応 し てい ま
す。 こ う し たセキ ュ リ テ ィ 機能は、 対称型暗号化を用い る Acrobat の標準の暗号化ハン ド
ラ に基づいてい ます。 Acrobat Reader と Acrobat 製品は下記のセキ ュ リ テ ィ 機能に対応 し
てい ます :
> 権限 : PDF 文書に対 し 、 印刷やテ キ ス ト 抽出 と い っ た特定の操作を制限 し ます。
> ユーザーパス ワー ド : フ ァ イ ルを開 く 際に要求 さ せ る こ と がで き ます。
> マ ス タ ーパ ス ワ ー ド : 権限 ・ ユーザーパ ス ワ ー ド ・ マ ス タ ーパ ス ワ ー ド の う ちのいず
れかのセ キ ュ リ テ ィ 設定 を 変更す る 際に要求 さ せ る こ と がで き ま す。 ユーザーパ ス
ワ ー ド と マ ス タ ーパ ス ワ ー ド を持つフ ァ イ ルは、 いずれかのパ ス ワ ー ド で閲覧 ・ 印刷
が可能にな り ます。
> (PDF 1.6) 保護 し ていない文書内で、 添付だけ を暗号化する こ と も で き ます。
フ ァ イ ルが、 ユーザーパ ス ワ ー ド かマ ス タ ーパ ス ワ ー ド か何 ら かの権限制限を持つ場合、
その フ ァ イ ルは暗号化 さ れます。
操作権限 「印刷 : 許可 し ない」 の よ う に、 何 ら かの操作権限を設定す る と 、 Acrobat では
その機能が無効にな り ます。 し か し こ れは必ず し も 、 サー ド パーテ ィ の PDF ビ ュ ーア等
の ソ フ ト ウ ェ アで も こ う な る と はかぎ り ません。 操作権限に従 う か ど う かは PDF ツール
の開発者次第なのです。 実際、 い く つかの PDF ツールは権限設定を全 く 無視す る こ と が
知 ら れてい ます し 、 商用の PDF ク ラ ッ キ ン グ ツールを使えば、 いかな る 操作制限を も 無
効化す る こ と が可能です。こ れは暗号化の ク ラ ッ キ ン グ と は関係のない話で、単純に、PDF
フ ァ イ ルが表示可能であ る かぎ り 、それを絶対印刷 さ れない よ う にす る こ と な ど で き る は
ずがないか ら です。こ の こ と は実際、Adobe 自身の PDF リ フ ァ レ ン ス に も 示 さ れてい ます:
There is nothing inherent in PDF encryption that enforces the document permissions
specified in the encryption dictionary. It is up to the implementors of PDF viewers to respect the
intent of the document creator by restricting user access to an encrypted PDF file according to
the permissions contained in the file. (PDF の暗号化には、 暗号化辞書で指定 さ れた文書権
限設定に関 し て、 本来的な強制力は何 も あ り ません。 暗号化 さ れてい る PDF フ ァ イ ルの、
ユーザーに よ る 利用を、 その フ ァ イ ルに含 ま れた権限設定に従っ て制限す る こ と に よ っ
て、 文書の作成者の意図を尊重す る か ど う かは、 PDF ビ ュ ーアの実装者次第です。)
Unicode パスワー ド PDF 1.7 拡張レベル 3 (Acrobat 9) は Unicode パ ス ワー ド に対応 し
てい ます。 それ以前のバージ ョ ンでは WinAnsi エン コ ーデ ィ ン グのキ ャ ラ ク タ に よ る パ ス
ワー ド に し か対応 し ていないのに対 し 、 PDF 1.7 拡張レベル 3 では任意の Unicode キ ャ ラ
ク タ を ユーザー ・ マ ス タ ーパ ス ワー ド で用い る こ と が可能です。
良いパスワー ド ・ 悪いパスワー ド PDF の暗号化の強度は、 暗号化の鍵長に よ っ てのみ
決 ま る のではな く 、 パ ス ワ ー ド の長 さ と 質に よ っ て も 決 ま り ま す。 よ く 知 ら れてい る の
は、 名前や普通の単語な ど をパ ス ワ ー ド と し て使 う べき ではない と い う こ と で、 なぜな ら
それ ら は簡単に推測がで き 、あ る いはいわゆ る 辞書攻撃を使っ て系統的に割 り 出 さ れて し
ま う か ら です。 さ ま ざ ま な調査が明 ら かに し てい る と こ ろ に よ れば、 かな り 多 く のパ ス
ワー ド は配偶者やペ ッ ト の名前、 ユーザーの誕生日、 子供の愛称な ど が選ばれてお り 、 容
易に推測が可能 と な っ てい ます。
PDF の暗号化は、 内部的には 40 ビ ッ ト か 128 ビ ッ ト の鍵で動作 し ますが、 ユーザーの
レベルでは、 PDF 1.7 以下ではパ ス ワ ー ド の 32 文字ま でが、 PDF 1.7 拡張レベル 3 では
3.3 暗号化 PDF
75
UTF-8 の 127 バ イ ト ま でが使われます。 PDF 文書を暗号化す る のに使われ る 内部鍵は、
ユーザーが与え たパ ス ワー ド に対 し て、 あ る 複雑な計算を行 う こ と で導 き 出 さ れます。 パ
ス ワー ド が も し も 弱ければ、鍵長にかかわ ら ず、結果 と し て保護 も 弱 く な り ます。128 ビ ッ
ト 鍵 も AES 暗号化 も 、 短いパ ス ワー ド を使えばあ ま り 安全ではあ り ません。
3.3.2 PDFlib に よ る文書保護
暗号化アルゴ リ ズム と 鍵長 保護 さ れた文書を生成す る と き 、 PDFlib は、 ク ラ イ ア ン ト
が選んだ PDF 互換レベルで利用可能な最 も 強い暗号化 と 鍵長を選びます :
> PDF 1.3 (Acrobat 4) では、 40 ビ ッ ト 鍵の RC4 が使われます。
> PDF 1.4 (Acrobat 5) では、 128 ビ ッ ト 鍵の RC4 が使われます。
> PDF 1.5 (Acrobat 6) では、128 ビ ッ ト 鍵の RC4 が使われます。 こ れは PDF 1.4 と 鍵長が
同 じ ですが、 暗号化方式は若干異な る も のが使われ る ので、 そのために Acrobat 6 が必
要です。
> PDF 1.6 (Acrobat 7) 以上では、 128 ビ ッ ト 鍵の AES (Advanced Encryption Standard) が
使われます。
> PDF 1.7 拡張レベル 3 (Acrobat 9) では、 256 ビ ッ ト 鍵の AES (Advanced Encryption
Standard) が使われ ます。 こ れ以前のアルゴ リ ズ ム では WinAnsi エ ン コ ーデ ィ ン グの
キ ャ ラ ク タ に よ る パ ス ワ ー ド に し か対応 し て い な いのに対 し 、 こ のバージ ョ ン では
Unicode パ ス ワー ド も 使え ます。
パスワー ド パ ス ワー ド は、 PDF_begin_document( ) の userpassword ・ masterpassword オ
プシ ョ ンで設定す る こ と がで き ます。 PDFlib は、 ク ラ イ ア ン ト が与えたパ ス ワー ド と 下記
の よ う に相互作用 し ます :
> ユーザーパ ス ワ ー ド と 権限 (後述) が与え ら れてい る のにマ ス タ ーパ ス ワ ー ド が与え
ら れていない場合は、 正規ユーザーがセキ ュ リ テ ィ 設定を変え る こ と がで き て し ま い
ます。 こ の理由か ら PDFlib は こ の場合をエ ラ ー と 見な し ます。
> ユーザーパ ス ワ ー ド と マ ス タ ーパ ス ワ ー ド が同 じ であ る 場合は、 フ ァ イ ルのユーザー
と 所有者 と の区別が不可能にな っ て し ま い ますので、 こ の場合 も 有効な保護は望め ま
せん。 PDFlib は こ の場合を エ ラ ー と 見な し ます。
> ユーザーパ ス ワー ド ・ マ ス タ ーパ ス ワー ド と も 、32 文字ま で許 さ れます。空のパ ス ワー
ド は許 さ れません。
与え ら れたパ ス ワー ド は、 その後に生成 さ れ る すべての文書に対 し て用い ら れます。
セキ ュ リ テ ィ 上の推奨事項 最大限のセ キ ュ リ テ ィ を得 る ために、 以下の こ と を推奨 し
ます。
> Acrobat 7 よ り 古い ビ ュ ーアに対応す る 必要がない限 り 、 AES 暗号化を使 う こ と 。
> マ ス タ ーパ ス ワ ー ド だけ を持ち、 ユーザーパ ス ワ ー ド を持た ない文書は、 必ず ク ラ ッ
ク 可能です。 ですので、 ユーザーパ ス ワ ー ド を かけ る こ と を考慮す る べ き です (ただ
し も ち ろ んそのユーザーパ ス ワ ー ド は、 文書の正当な利用者には渡 ら なければな り ま
せん)。
> パ ス ワー ド は最低で も 8 文字 と し 、アルフ ァ ベ ッ ト 以外の文字を混ぜ る こ と 。辞書にあ
る 言葉や人名 ・ 地名をパ ス ワー ド に使わない こ と 。
権限 操作制限は PDF_begin_document( ) の permissions オプシ ョ ンで設定す る こ と がで き
ます。 それは操作制限の入っ た文字列 (複数可) で構成 さ れ ます。 permissions オプシ ョ
ン を設定す る 際には masterpassword オプシ ョ ン も 設定 し なければな り ません。 なぜな ら
76
第 3 章 : PDFlib 文書を作成
そ う でなければ Acrobat ユーザーは簡単に権限設定を取 り 除 く こ と がで き て し ま う か ら で
す。 デフ ォ ル ト ではすべての操作が許可 さ れてい ます。 操作制限を指定する と Acrobat の
その機能は無効にな り ます。操作制限はユーザーパ ス ワー ド な し で適用す る こ と がで き ま
す。 下記の例の よ う に スペース で区切れば、 複数の制限キーワー ド を指定す る こ と も で き
ます :
p.begin_document(filename, "masterpassword=abcd1234 permissions={noprint nocopy}");
表 3.3 に、 使え る すべての操作制限キーワ ーを挙げます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの general/permission_settings ト ピ ッ ク にあ り ま
す。
表 3.3 PDF_begin_document( ) の permissions オプ シ ョ ンに対する操作制限キーワー ド 一覧
キーワー ド
解説
noprint
Acrobat が、 フ ァ イルの印刷を拒みます。
nomodify
Acrobat が、 ユーザーに よ る フ ォ ーム フ ィ ール ド の追加やその他あ ら ゆる変更を拒みます。
nocopy
Acrobat が、 テキス ト やグ ラ フ ィ ッ ク の コ ピーや抽出を拒み、 ア ク セシ ビ リ テ ィ イ ン タ
フ ェ ース を無効に し ます。
noannots
Acrobat が、 コ メ ン ト や フ ォ ーム フ ィ ール ド の追加 ・ 変更を拒みます。
noforms
(PDF 1.4。 nomodify ・ noannots を暗黙に前提 し ます) Acrobat が、 フ ォ ーム フ ィ ール ド への
記入を拒みます。
noaccessible
(PDF 1.4) Acrobat が、 ア ク セ シ ビ リ テ ィ を目的 と し たテキス ト やグ ラ フ ィ ッ クの抽出 (た
と えばス ク リ ーン リ ーダー ソ フ ト ) を拒みます。
noassemble
(PDF 1.4。 nomodify を暗黙に前提 し ます) Acrobat が、 ページの挿入 ・ 削除 ・ 回転や し お
り ・ サムネールの作成を拒みます。
nohiresprint
(PDF 1.4) Acrobat が、 高解像度印刷を拒みます。 noprint が指定 さ れていない場合は、 印
刷は 「画像 と し て印刷」 機能に制限 さ れます。 すなわち その場合、 ページが低解像度に変
換 さ れた ものを印刷する こ と し かで き ません。
plainmetadata
(PDF 1.5) 暗号化文書で も 、 文書の メ タ デー タ を暗号化 し ないま まに し ます。 こ れは XMP
メ タ デー タ にのみ影響 し 、 文書情報 フ ィ ール ド には影響 し ません。
注 PDF を ウ ェ ブ上で提供する場合には必ず、 ク ラ イ ア ン ト が自分のブ ラ ウザを使っ てその文
書のロー カル コ ピーを と る こ と がで き て し まいます。ユーザーがロー カルコ ピーを保存す
る こ と を PDF 側から 防ぐ方法はあ り ません。
添付 フ ァ イルの暗号化 PDF 1.6 以上では、 文書が保護 さ れていな く て も 、 添付フ ァ イ ル
だ け を 暗号化す る こ と も で き ま す。 こ れ を 実現す る に は、 PDF_begin_document( ) で
attachmentpassword オプシ ョ ン を与え ます。
3.3 暗号化 PDF
77
3.4 Web 最適化 (線形化) PDF
PDFlib は、 PDF 文書に線形化 と い う 処理を行 う こ と がで き ます (PDF の線形化は 「最適
化」 ・ 「Web 表示用に最適化」 と も いい ます)。 線形化は PDF フ ァ イ ルの中身を再配列 し 、
補足情報を追加 し ま す。 こ の情報が活用 さ れ る こ と で ア ク セ ス の高速化が可能にな り ま
す。
非線形化 PDF は ま る ご と ク ラ イ ア ン ト へ転送 し な ければな ら ないのに対 し 、 線形化
PDF は Web サーバか ら バ イ ト サービ ン グ と い う 処理を用いてページ ご と に転送す る こ と
が可能です。 こ れに よ り Acrobat (ブ ラ ウ ザのプ ラ グ イ ン と し て動作 し てい る ) は、 PDF
文書内の各部分を個別に取得で き ます。 ですので、 文書の先頭ページ を、 その文書がサー
バか ら 全部ダ ウ ン ロ ー ド さ れて く る ま でユーザーを待たせ る こ と な く 表示す る こ と がで
き ます。 こ れはユーザー体験の向上を も た ら し ます。
ブ ラ ウ ザへ PDF デー タ を ス ト リ ームする のは Web サーバであ っ て PDFlib ではない こ
と に留意 し て く だ さ い。 PDFlib がす る こ と は、 バ イ ト サービ ン グ可能な PDF フ ァ イ ルを
生成す る こ と です。 バ イ ト サービ ン グ PDF を活用す る には、 下記のすべての必要条件を
満たす必要があ り ます :
> PDF 文書が線形化 さ れてい る 必要があ り ます。 線形化は PDF_begin_document( ) の
linearize オプシ ョ ンで下記の よ う に行 う こ と がで き ます :
p.begin_document(outfilename, "linearize");
Acrobat で文書のプ ロ パテ ィ を見れば、その フ ァ イ ルが線形化 さ れてい る か ど う かを調
べ る こ と がで き ます (「Web 表示用に最適化」 : 「はい」)。
> Web サーバがバ イ ト サービ ン グに対応 し てい る 必要があ り ます。 その基礎であ る バ イ
ト レ ン ジプ ロ ト コ ルは HTTP 1.1 に含まれてい ますので、 現行のすべての Web サーバ
に実装 さ れてい ます。
> ユーザーはAcrobat をブ ラ ウ ザのプ ラ グ イ ン と し て使用す る と と も に、Acrobatでページ
ご と のダ ウ ン ロ ー ド を有効に し てお く 必要があ り ます (「編集」 → 「環境設定」 → (「一
般 ...」 →) 「イ ン タ ーネ ッ ト 」 → 「Web 表示用に最適化を許可」)。 なお、 こ れはデフ ォ
ル ト では有効にな っ てい ます。
PDF フ ァ イ ルが大 き い (ページ数か MB で数え て) ほ ど、 Web 上で転送 し た時の線形化の
効用は高ま り ます。
注 PDF 文書を線形化する と 、 フ ァ イルサイ ズが若干大き く な り ます。 こ れは、 線形化情報が
追加 さ れる ためです。
線形化に必要な一時領域 PDFlib では、 線形化を行 う には、 まずその文書全体の作成が
完了す る 必要があ り ます。 線形化処理は、 文書の作成が完了 し た後に別個の段階 と し て行
われ る のです。 こ のため、 PDFlib で最適化を行 う には、 追加の格納領域が必要にな り ま
す。 必要な一時領域はおお よ そ、 生成 さ れた文書 (線形化前の) と 同 じ 容量です。 PDFlib
は線形化デー タ を、 PDF_begin_document( ) の inmemory オプシ ョ ンに従っ て、 メ モ リ 内
か一時デ ィ ス ク フ ァ イ ルの ど ち ら かに格納 し ます。
78
第 3 章 : PDFlib 文書を作成
3.5 色 を扱 う
注 PDFlib API リ フ ァ レ ン スに、 対応 し ている色空間の一覧 と 説明があ り ます。
ク ッ ク ブ ッ ク 色の諸側面に関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ クの color カ テ ゴ リ にあ り ます。
色空間の使用の概要については、 ク ッ ク ブ ッ クの color/starter_color ト ピ ッ ク を参照 し
て く だ さ い。
3.5.1 パ タ ー ン と スムーズシ ェ ーデ ィ ン グ
単色の色のかわ り に、パ タ ーンやス ムーズシ ェーデ ィ ン グ を特殊な色 と し て利用す る こ と
も で き ます。 任意の物の描線や塗 り に使用で き ます。
パ タ ー ン パ タ ーンは、任意の数の塗 り 操作を 1 つの実体に ま と めた も のに よ っ て定義 さ
れます。 こ のグループは任意の他の物の塗 り や描線に用い る こ と がで き 、 塗 り の場合は全
域内に、 描線の場合はパ ス上にグループが複製 (縦横に並ぶ) さ れます。 パ タ ーン を使っ
た作業では次の手順を踏みます。
> まず、PDF_begin_pattern( ) と PDF_end_pattern( ) の間でパ タ ーン を定義 し なければな り
ません。 パ タ ーンの定義にはたいていの画像オペレー タ が利用で き ます。
> PDF_begin_pattern( )に よ っ て返 さ れたパ タ ーンハン ド ルは、PDF_setcolor( )を使用 し て、
パ タ ーン を カ レ ン ト 色 と し て設定す る ために用い る こ と がで き ます。
PDF_begin_pattern( ) の painttype 引数に よ っ て、 パ タ ーン定義がそれ自身の色指定を含む
こ と がで き る か ど う かが決ま り ます。 painttype が 1 の場合、 パ タ ーン定義はそれ自身の
色指定を含ま なければな ら ず、 つねに見た目が同 じ にな り ます。 painttype が 2 の場合、 パ
タ ーン定義は色指定を一切含んでいてはな り ません。そのパ タ ーンが塗 り や描線に使われ
る と き には、 カ レ ン ト の塗 り や描線の色が適用 さ れます。
注 パ タ ーンはスムーズシ ェ ーデ ィ ングに基づいて定義する こ と も で き ます (後述)。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの graphics/fill_pattern・images/tiling_pattern ト
ピ ッ ク にあ り ます。
スムーズシ ェ ーデ ィ ン グ ス ムーズ シ ェ ーデ ィ ン グは、 カ ラ ーブ レ ン ド やグ ラ デ ィ エ ン
ト と も いい、 あ る 色か ら 別の色へ連続的に遷移す る も のの こ と を言い ます。 2 つの色は同
じ 色空間で指定す る 必要があ り ます。 PDFlib は ス ムーズシ ェ ーデ ィ ン グについて、 次の 2
種類の方向に対応 し てい ます。
> 線形シ ェーデ ィ ン グ。 線に沿っ て定義 さ れます。
> 放射シ ェーデ ィ ン グ。 2 つの円の間に定義 さ れます。
シ ェーデ ィ ン グは 2 つの色の間の遷移 と し て定義 さ れます。 1 番目の色にはつねにカ レ ン
ト 塗 り 色が用い ら れます。 2 番目の色は PDF_shading( ) の c1 ・ c2 ・ c3 ・ c4 引数で与え ら れ
ます。 こ の数値は、 PDF_setcolor( ) の記述に従っ た 1 番目の色の色空間で解釈 さ れます。
PDF_shading( ) を呼び出す と 、 シ ェーデ ィ ン グオブジ ェ ク ト のハン ド ルが返 さ れます。
こ れは次の 2 つの方式のいずれかで利用す る こ と がで き ます。
> PDF_shfill( ) で領域を塗 り ます。 こ の メ ソ ッ ド を使 う こ と がで き る のは、 塗 り を適用 し
た い対象の形が シ ェ ーデ ィ ン グ の形 と 同 じ で あ る 場合です。 こ の関数はその名前 と
違っ て、 物の内部を塗 る だけではな く 、 その外部に対 し て も 効力を持ち ます。 こ の動
作は PDF_clip( ) で変更で き ます。
3.5 色を扱 う
79
> よ り 複雑な物の塗 り に用い る シ ェーデ ィ ン グパ タ ーン を定義 し ます。具体的には、PDF_
shading_pattern( ) を呼び出 し てシ ェーデ ィ ン グに基づいたパ タ ーン を作成 し 、 こ のパ
タ ーン を任意の物の塗 り や描線に用い ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの color/color_gradient ト ピ ッ ク にあ り ます。
3.5.2 Pantone ・ HKS ・ カ ス タ ムスポ ッ ト カ ラ ー
PDFlib は ス ポ ッ ト カ ラ ーに対応 し てい ます (技術的には、 PDF では特色 (Separation) 色
空間 と し て知 ら れてい る のですが、 通常、 separation と い う 用語はプ ロ セ ス カ ラ ーに対 し
て も 用い ら れます) 。 ス ポ ッ ト カ ラ ー と は、 プ ロ セ ス カ ラ ーの混色領域外にあ る カ ス タ ム
色の印刷に用い ら れ る も のです。 ス ポ ッ ト カ ラ ーは名前で指定 さ れ、 PDF ではつねに代替
色を伴い ます。 代替色は、 その ス ポ ッ ト カ ラ ーに近い色が選ばれますが、 ま っ た く 同 じ 色
ではあ り ません。 Acrobat では こ の代替色を用いて、 画面表示やス ポ ッ ト カ ラ ー非対応機
(事務用プ リ ン タ な ど) への印刷を行い ます。 印刷機では、 要求 さ れた ス ポ ッ ト カ ラ ーが
適用 さ れ、 文書内で用い ら れてい る その他すべてのプ ロ セ ス カ ラ ー と と も に印刷 さ れ ま
す。こ のために PDF フ ァ イ ルは、色分版 と い う 処理で後処理 さ れ る こ と が必要にな り ます。
PDFlib は、 さ ま ざ ま な組み込みス ポ ッ ト カ ラ ー ラ イ ブ ラ リ に も 対応 し てい ます し 、 カ
ス タ ム (ユーザー定義) ス ポ ッ ト カ ラ ーに も 対応 し てい ます。 ス ポ ッ ト カ ラ ー名が PDF_
makespotcolor( ) に よ っ て要求 さ れ る と 、 PDFlib は まず、 その要求 さ れた ス ポ ッ ト カ ラ ー
が PDFlib 組み込み ラ イ ブ ラ リ の う ちのいずれかの中で見つか る か ど う かを調べます。 も
し 見つかれば、 PDFlib は代替色に関 し て、 組み込ま れた値を用い ま す。 見つか ら ない場
合、 その ス ポ ッ ト カ ラ ーはユーザー定義色 と 見な さ れ る ので、 ク ラ イ ア ン ト 側でそれに対
し て適切な代替色値を与え る 必要があ り ます (カ レ ン ト 色を通 じ て) 。 ス ポ ッ ト カ ラ ーに
は濃度を指定す る こ と がで き ます。 すなわち、 0 か ら 1 ま でのパーセ ン ト 値 と と も に用い
る こ と がで き ます。
デフ ォ ル ト では、 組み込み ス ポ ッ ト カ ラ ーはカ ス タ ム代替値で再定義す る こ と はで き
ません。 し か し 、 こ の動作は spotcolorlookup パ ラ メ タ で変更す る こ と がで き ます。 こ れ
を使 う と 、古いアプ リ ケーシ ョ ンが異な る 色定義を用いてい る よ う な場合 と の互換性が と
れます し 、 ま た、 PANTONE カ ラ ーに対する PDFlib の Lab 代替値を扱 う こ と ので き ない
ワー ク フ ロ ーにおいて も 有用です。
PDFlib は、 PDF/X か PDF/A の準拠レベルが選択 さ れてい る と 、 自動的に適切な代替
色を生成 し ます (253 ページ 「10.3 PDF/X に よ る 印刷出力」 参照)。 カ ス タ ム ス ポ ッ ト カ
ラ ーに関 し ては、選択 さ れた PDF/X か PDF/A の準拠レベル と 互換の代替色を与え る のは
ユーザー側の役割 と な り ます。
注 組み込みスポ ッ ト カ ラ ーのデー タ と 各商標については、PDFlib ソ フ ト ウ ェ ア での使用のた
めの ラ イ セ ン ス を PDFlib GmbH は各商標権者から取得 し ています。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの color/spot_color ト ピ ッ ク にあ り ます。
PANTONE® カ ラ ー PANTONE カ ラ ーは世界的に有名で広 く 利
用 さ れ て い ま す。 PDFlib は、 Pantone Matching System® (ス
ウ ォ ッ チ総数 26,000 色) に加え て、 2008 年に導入 さ れた コ ー
ト 紙 / 上質紙用の追加 2058 色を持つ Pantone® Goe® System に
完全対応 し てい ます。表 3.4 に示すデジ タ ルカ ラ ー ラ イ ブ ラ リ
に あ る すべ て の カ ラ ー ス ウ ォ ッ チ名が利用で き ま す。 商用
PDFlib のお客様は、 PANTONE ス ポ ッ ト カ ラ ーの全一覧のテ キ
ス ト フ ァ イ ルを、 私達のサポー ト か ら 得 る こ と がで き ます。
80
第 3 章 : PDFlib 文書を作成
ス ポ ッ ト カ ラ ー名は大文字 ・ 小文字を区別 し ます。 上記の例 と 同様に大文字を使っ て
く だ さ い。 旧形式の色名接頭辞 CV ・ CVV ・ CVU ・ CVC ・ CVP も 使用す る こ と がで き ます。
こ れ ら は、 対応す る 新 し い色名に変換 さ れます。 ただ し 、 preserveoldpantonenames パ ラ
メ タ が true の場合には変換 さ れません。 PANTONE と い う 接頭辞は必ず、 例示 し た よ う に
ス ウ ォ ッ チ名につけ る 必要があ り ます。 一般に、 PANTONE カ ラ ー名は次の方式に従っ て
構成す る 必要があ り ます。
PANTONE <id> <paperstock>
こ こ で <id> は色の識別子であ り (た と えば 185)、<paperstock> は利用す る ペーパース ト ッ
ク の頭文字です (た と えば C は coated = コ ー ト 紙)。 ス ウ ォ ッ チ名を構成す る 各要素の間
には スペース を 1 つずつ入れ る 必要があ り ます。 PANTONE 接頭辞では じ ま る 名前の ス
ポ ッ ト カ ラ ーが要求 さ れたに も かかわ ら ず、その名前が有効な PANTONE カ ラ ーを表 し て
いなか っ た場合には、 関数は失敗 し ます。 次の コ ー ド は、 あ る PANTONE カ ラ ーを濃度値
70 パーセ ン ト で用いた例です。
spot = p.makespotcolor("PANTONE 281 U");
p.setcolor("fill", "spot", spot, 0.7, 0, 0);
注 こ こ で示 し た PANTONE® カ ラ ーは PANTONE の定義標準 と 一致 し ない こ と があ り ます。正
確な色については現在の PANTONE カ ラ ー発行物を参照 し て く だ さ い。 PANTONE® お よび
その他の Pantone, Inc. の諸商標は Pantone, Inc. の所有物です。 © Pantone, Inc., 2003.
注 PANTONE® カ ラ ーは PDF/X-1a モー ド では対応 し ていません。
表 3.4 PDFlib に内蔵の PANTONE スポ ッ ト カ ラ ー ラ イ ブ ラ リ 一覧
カ ラーラ イブ ラ リ名
色名の例
注
PANTONE ソ リ ッ ド / コ ー ト 紙
PANTONE 185 C
PANTONE ソ リ ッ ド /上質紙
PANTONE 185 U
PANTONE ソ リ ッ ド /マ ッ ト コ ー ト 紙
PANTONE 185 M
PANTONE プ ロ セ ス/ コ ー ト 紙
PANTONE DS 35-1
C
PANTONE プ ロ セ ス/上質紙
PANTONE DS 35-1
U
PANTONE プ ロ セ ス/ コ ー ト 紙 (EURO)
PANTONE DE 35-1
C
PANTONE プ ロ セ ス/上質紙 (EURO)
PANTONE DE 35-1
U
2006 年 5 月追加
PANTONE パス テル/ コ ー ト 紙
PANTONE 9461 C
2006 年追加分の新色を含む
PANTONE パス テル/上質紙
PANTONE 9461 U
2006 年追加分の新色を含む
PANTONE メ タ リ ッ ク / コ ー ト 紙
PANTONE 871 C
2006 年追加分の新色を含む
PANTONE カ ラ ーブ リ ッ ジ CMYK (PC)
PANTONE 185 PC
PANTONE ソ リ ッ ド を プ ロ セス/ コ ー ト 紙に置
き換え
PANTONE カ ラ ーブ リ ッ ジ CMYK
(EURO)
PANTONE 185 EC
PANTONE ソ リ ッ ド を プ ロ セス/ コ ー ト 紙
(EURO) に置き換え
PANTONE カ ラ ーブ リ ッ ジ/上質紙
PANTONE 185 UP
2006 年 7 月追加
3.5 色を扱 う
81
表 3.4 PDFlib に内蔵の PANTONE スポ ッ ト カ ラ ー ラ イ ブ ラ リ 一覧
カ ラーラ イ ブ ラ リ名
色名の例
注
PANTONE ヘキサク ローム/コ ー ト 紙
PANTONE H 305-1
C
非推奨。 廃止予定
PANTONE ヘキサク ローム/上質紙
PANTONE H 305-1
U
非推奨。 廃止予定
PANTONE ソ リ ッ ド イ ン ヘキサ ク ローム PANTONE 185 HC
/コー ト 紙
PANTONE ソ リ ッ ド ト ゥ プ ロ セス/ コ ー PANTONE 185 PC
ト紙
PANTONE カ ラ ーブ リ ッ ジ CMYK (PC) で置き
換え
PANTONE ソ リ ッ ド ト ゥ プ ロ セス/ コ ー PANTONE 185 EC
ト 紙 (EURO)
PANTONE カ ラ ーブ リ ッ ジ CMYK (EURO) で置
き換え
PANTONE Goe / コ ー ト 紙
PANTONE 42-1-1 C 2008 年追加の 2058 色
PANTONE Goe /上質紙
PANTONE 42-1-1 U 2008 年追加の 2058 色
HKS® カ ラ ー HKS カ ラ ーシ ス テ ムは ド イ ツ な ど の欧州諸国で
広 く 利用 さ れてい ます。 PDFlib は HKS カ ラ ーに完全対応 し て
い ま す。 以下のデジ タ ルカ ラ ー ラ イ ブ ラ リ (Farbfächer) に あ
る カ ラ ース ウ ォ ッ チ名がすべて利用可能です (カ ッ コ 内にサン
プルス ウ ォ ッ チ名を示 し ます)。
> HKS K (Kunstdruckpapier) 、グ ロ ス アー ト 紙用、88 色 (HKS 43
K)
> HKS N (Naturpapier)、 ナチ ュ ラ ル紙用、 86 色 (HKS 43 N)
> HKS E (Endlospapier)、 連続ス テーシ ョ ナ リ 用 / コ ー ト 、 88 色 (HKS 43 E)
> HKS Z (Zeitungspapier)、 ニ ュ ース プ リ ン ト 用、 50 色 (HKS 43 Z)
商用 PDFlib のお客様は、 HKS ス ポ ッ ト カ ラ ーの全一覧のテ キ ス ト フ ァ イ ルを、 私達のサ
ポー ト か ら 得 る こ と がで き ます。
ス ポ ッ ト カ ラ ー名は大文字 ・ 小文字を区別 し ます。 上記の例 と 同様に大文字を使っ て
く だ さ い。 HKS と い う 接頭辞は必ず、 例示 し た よ う に ス ウ ォ ッ チ名につけ る 必要があ り ま
す。一般に、HKS カ ラ ー名は次の方式の う ちのいずれかに従っ て構成す る 必要があ り ます。
HKS <id> <paperstock>
こ こ で <id> は色の識別子であ り (た と えば 43)、 <paperstock> は利用す る ペーパース ト ッ
ク の頭文字です(た と えば N は natural 紙)。ス ウ ォ ッ チ名を構成する HKS・<id>・<paperstock>
各要素の間には スペース を 1 つずつ入れ る 必要があ り ます。上記 2 番目の方式は ラ イ ブ ラ
リ か ラ イ ブ ラ リ の中の色に対 し てのみ用い る こ と がで き ます。HKS 接頭辞では じ ま る 名前
の ス ポ ッ ト カ ラ ーが要求 さ れたに も かかわ ら ず、 その名前が有効な HKS カ ラ ーを表 し て
いなか っ た場合には、 関数は失敗 し ます。 次の コ ー ド は、 あ る HKS カ ラ ーを濃度値 70
パーセ ン ト で用いた例です。
spot = p.makespotcolor("HKS 38 E");
p.setcolor("fill", "spot", spot, 0.7, 0, 0);
ユーザー定義スポ ッ ト カ ラ ー 上述の組み込みス ポ ッ ト カ ラ ーのほかに、 PDFlib ではカ
ス タ ム ス ポ ッ ト カ ラ ーに も 対応 し てい ま す。 カ ス タ ム ス ポ ッ ト カ ラ ーには任意の名前 と
(ただ し 組み込みの色 と かち合 う 名前は使え ません) 代替色を与え る こ と がで き ます。 こ
82
第 3 章 : PDFlib 文書を作成
の代替色は、 画面表示 と 低品位印刷に用い ら れますが、 高品位の色分版には用い ら れませ
ん。 カ ス タ ム ス ポ ッ ト カ ラ ーに適切な代替色を与え る のは ク ラ イ ア ン ト 側の役割です。
新規ス ポ ッ ト カ ラ ーに代替色を設定す る ための専用の PDFlib 関数 と い う も のはあ り ま
せん。 そのかわ り に、 カ レ ン ト 塗 り 色が用い ら れます。 代替色設定のために呼び出 し が 1
つ多 く 必要であ る と い う 点を除けば、 カ ス タ ム ス ポ ッ ト カ ラ ーの定義 と 利用は、 以下の よ
う に、 組み込みス ポ ッ ト カ ラ ーの利用 と 同様に行 う こ と がで き ます。
p.setcolor("fill", "cmyk", 0.2, 1.0, 0.2, 0);
spot = p.makespotcolor("CompanyLogo");
p.setcolor("fill", "spot", spot, 1, 0, 0);
/* 代替CMYK値を定義 */
/* そこからスポットカラーを作成 */
/* スポットカラーを設定 */
3.5.3 カ ラ ーマ ネ ジ メ ン ト と ICC プ ロ フ ァ イ ル
PDFlib は、 デバ イ ス独立色 ・ レ ン ダ リ ン グ イ ン テ ン ト ・ ICC プ ロ フ ァ イ ル と い っ た、 い く
つかのカ ラ ーマネジ メ ン ト の概念に対応 し てい ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの color/iccprofile_to_image ト ピ ッ ク にあ り ます。
デバ イ ス独立 CIE L*a*b* カ ラ ー
PDF_setcolor( ) に色空間名 lab を与えれば、 デバ イ ス独
* * *
立な色値を CIE 1976 L a b 色空間で指定す る こ と がで き ます。 L*a*b* 色空間の色は、 範
囲 0 ~ 100 の輝度値 1 個 と 、 範囲 -127 ~ 128 の色値 2 個 と で指定 さ れます。 lab 色空間に
用い ら れ る 光源は D50 です (日中光 5000 K、 2゜ 測定)。
レ ン ダ リ ン グ イ ン テ ン ト PDFlib ク ラ イ ア ン ト がデバ イ ス独立な色値を指定で き る と は
いっ て も 、 あ る 出力デバ イ ス がその要求 さ れた色を正確に再現で き る と は限 り ません。 そ
の よ う な場合には、 色域圧縮 と い う 処理に よ る 代替を行 う と い う 妥協が必要にな り ます。
色域圧縮 と は、 色の分布範囲を狭めて、 特定のデバ イ ス で再現で き る よ う な小 さ な範囲に
す る こ と です。 レ ン ダ リ ン グ イ ン テ ン ト は こ の処理を制御す る ために用い ら れます。 レ ン
ダ リ ン グ イ ン テ ン ト を 指定す る に は、 個々 の 画像 に 対 し て は、 PDF_load_image( ) に
renderingintent パ ラ メ タ ま たはオプシ ョ ン を与え ます。 ま た、 レ ン ダ リ ン グ イ ン テ ン ト は
テ キ ス ト やベ ク ト ルグ ラ フ ィ ッ ク に対 し て も 指定す る こ と がで き 、 その た めには PDF_
create_gstate( ) に renderingintent オプシ ョ ン を与え ます。
ICC プ ロ フ ァ イル
International Color Consortium (ICC)1 は、 入力デバ イ スや出力デバ イ
ス の色の特徴を指定す る ための フ ァ イ ル形式を定義 し ま し た。こ の ICC カ ラ ープ ロ フ ァ イ
ルは、 工業標準 と 捉え ら れてお り 、 すべての主要な カ ラ ーマネジ メ ン ト シ ス テ ム と アプ リ
ケーシ ョ ンのベン ダーが こ れに対応 し てい ます。 PDFlib は次の領域での ICC プ ロ フ ァ イ
ルに よ る カ ラ ーマネジ メ ン ト に対応 し てい ます。
> ページ上のテ キ ス ト と ベ ク ト ルグ ラ フ ィ ッ ク のための、 ICC ベース の色空間を定義。
> 取 り 込んだ画像フ ァ イ ルに埋め込まれてい る ICC プ ロ フ ァ イ ルを処理。
> 取 り 込んだ画像フ ァ イ ルに ICC プ ロ フ ァ イ ルを適用(画像に ICC プ ロ フ ァ イ ルが埋め込
まれていた場合は上書 き )。
> グ レース ケール・RGB・CMYK のデー タ を ICC ベース の色空間へ対応づけ る デフ ォ ル ト
色空間を定義。
> 外部 ICC プ ロ フ ァ イ ルを使用 し て PDF/X か PDF/A の出力 イ ン テ ン ト を定義。
カ ラ ーマネジ メ ン ト は色指定の中の要素数を変え ません (た と えば RGB か ら CMYK へ)。
1. www.color.org を参照。
3.5 色を扱 う
83
注 主要な印刷環境のための ICC カ ラ ープ ロ フ ァ イルは、 www.pdflib.com でダウン ロー ド で
き るほか、 その他の無料 ICC プ ロ フ ァ イルへの リ ン ク も掲載 し ています。
ICC プ ロ フ ァ イルの検索 PDFlib は、PDF_load_iccprofile( ) に与え ら れた profilename 引数
を用い、 次の手順を踏んで ICC プ ロ フ ァ イ ルを検索 し ます。
> profilename=sRGB な ら ば、 PDFlib はその内部 sRGB プ ロ フ ァ イ ル (後述) を用い、 検索
は打ち切 ら れます。
> ICCProfile リ ソ ース カ テ ゴ リ 内にprofilename と い う 名前の リ ソ ース があ る か ど う かを調
べ ます。 も し あれば、 その値を フ ァ イ ル名 と し て以下の手順で用い ます。 その よ う な
リ ソ ース がない場合は、 profilename を フ ァ イ ル名 と し て直接用い ます。
> 前の手順で決定 さ れた フ ァ イ ル名を用い、下記の組み合わせを 1 つずつ順に試 し てみ る
こ と に よ り 、 デ ィ ス ク 上の フ ァ イ ルを検索 し ます :
<ファイル名>
<ファイル名>.icc
<ファイル名>.icm
<colordir>/<ファイル名>
<colordir>/<ファイル名>.icc
<colordir>/<ファイル名>.icm
Windows では colordir は、オペレーテ ィ ン グ シ ス テ ムがデバ イ ス依存 ICC プ ロ フ ァ イ ル
を格納 し てい る デ ィ レ ク ト リ を示 し ます (C:\WINNT\system32\ spool\drivers\color が典
型的)。 Mac OS X では colordir と し て下記のパス が試み ら れます :
/System/Library/ColorSync/Profiles
/Library/ColorSync/Profiles
/Network/Library/ColorSync/Profiles
~/Library/ColorSync/Profiles
その他のシ ス テ ム では colordir を用い る 手順は省略 さ れます。
sRGB 色空間 と sRGB ICC プ ロ フ ァ イル PDFlib は、 sRGB (元 IEC 61966-2-1) と 呼ばれ
る 工業規格の RGB 色空間に対応 し てい ます。 sRGB は、 さ ま ざ ま な ソ フ ト ウ ェ アやハー ド
ウ ェ アのベン ダーが こ れに対応 し てお り 、デジ タ ルス チルカ メ ラ の よ う な消費者向け RGB
デバ イ スやカ ラ ープ リ ン タ ・ モニ タ の よ う な事務機器におけ る 簡単な カ ラ ーマネジ メ ン ト
のために広 く 利用 さ れてい ます。 PDFlib は sRGB 色空間に対応 し てお り 、 必要な ICC プ ロ
フ ァ イ ルデー タ を内蔵 し てい ます。 ですか ら sRGB プ ロ フ ァ イ ルを ク ラ イ ア ン ト が別途用
意す る 必要はな く 、 あ え て用意 し な く て も つねに利用可能です。 こ れ を 利用す る には、
PDF_load_iccprofile( ) を profilename=sRGB で呼び出 し ます。
画像に埋め込まれてい る プ ロ フ ァ イルの利用 (ICC タ グ付 き画像) 画像のなかには、 そ
の画像の色値の特徴を記述 し た ICC プ ロ フ ァ イ ルが埋め込まれてい る こ と があ り ます。た
と えば、埋め込まれた ICC プ ロ フ ァ イ ルは、画像デー タ の生成に用い ら れた ス キ ャ ナの色
特性を記述す る こ と がで き ます。 PDFlib では、 PNG ・ JPEG ・ TIFF 各画像フ ァ イ ル形式の
中に埋め込まれた ICC プ ロ フ ァ イ ルを扱 う こ と がで き ます。 honoriccprofile オプシ ョ ン ま
たはパ ラ メ タ が true に設定 さ れてい る 場合 (デフ ォ ル ト ではそ う な っ てい ます)、 画像内
に埋め込まれてい る ICC プ ロ フ ァ イ ルはその画像か ら 抽出 さ れ、 PDF 出力内に埋め込ま
れて、 Acrobat がその画像に適用で き る よ う に さ れます。 こ の処理は、 画像への ICC プ ロ
フ ァ イ ルの タ グ付け と 呼ばれ る こ と も あ り ます。PDFlib は画像の ピ ク セル値に変更は加え
ません。
84
第 3 章 : PDFlib 文書を作成
image:iccprofile パ ラ メ タ を使 う と 、 画像内に埋め込まれてい る プ ロ フ ァ イ ルに対す る
ICC プ ロ フ ァ イ ルハン ド ルを得 る こ と がで き ます。 こ れは、 同 じ プ ロ フ ァ イ ルを複数の画
像に適用 し たい場合に有用です。
未知の ICC プ ロ フ ァ イ ル内の色要素数を調べ る には icccomponents パ ラ メ タ を用い ま
す。
外部 ICC プ ロ フ ァ イ ルの画像への適用 ( タ グ付け) 画像に埋め込ま れてい る ICC プ ロ
フ ァ イ ルを使 う のではな く 、 外部プ ロ フ ァ イ ルを各画像に適用する こ と も で き ます。 その
ためには PDF_load_image( ) の iccprofile オプシ ョ ン でプ ロ フ ァ イ ルハン ド ルを与え ます。
ページ記述用の ICC ベースの色空間 テ キ ス ト やベ ク ト ルグ ラ フ ィ ッ ク の色値は、 プ ロ
フ ァ イ ルに よ っ て指定 さ れ る ICC ベース の色空間で直接指定す る こ と がで き ます。まずは
色空間を、 setcolor:iccprofilegray ・ setcolor:iccprofilergb ・ setcolor:iccprofilecmyk の う ちのい
ずれかのパ ラ メ タ の値 と し てICCプ ロ フ ァ イ ルハン ド ルを与え る こ と に よ っ て設定す る 必
要が あ り ま す。 つづいて次の よ う に、 ICC ベー ス の色値を、 iccbasedgray ・ iccbasedrgb ・
iccbasedcmyk の う ちのいずれかの色空間キー ワー ド と と も に、 PDF_setcolor( ) に与え る こ
と がで き ます。
p.set_parameter("errorpolicy", "return");
icchandle = p.load_iccprofile(...);
if (icchandle == -1)
{
return;
}
p.set_value("setcolor:iccprofilecmyk", icchandle);
p.setcolor("fill", "iccbasedcmyk", 0, 1, 0, 0);
ICC ベースのデ フ ォ ル ト 色空間へデバ イ ス カ ラ ー を対応づけ PDF には、 ページ記述中
のデバ イ ス依存な グ レー ・ RGB ・ CMYK の色をデバ イ ス独立色に対応づけ る 機能があ り ま
す。 こ れを利用す る と 、 その ま ま ではデバ イ ス依存な色値に対 し て、 正確な測色指定を与
え る こ と がで き ます。 こ の方式で色値を対応づけ さ せ る には、 DefaultGray ・ DefaultRGB ・
DefaultCMYK の う ちのいずれかの色空間定義を与え る 必要があ り ます。PDFlib で こ れを実
現す る には、 PDF_begin_page_ext( ) の defaultgray ・ defaultrgb ・ defaultcmyk オプシ ョ ン を
設定 し て、 ICC プ ロ フ ァ イ ルハン ド ルを その値 と し て与え ます。 下記の作成例では、 sRGB
色空間を、 テ キ ス ト ・ 画像 ・ ベ ク ト ルグ ラ フ ィ ッ ク のデフ ォ ル ト RGB 色空間 と し て設定
し てい ます :
/* sRGBはつねに利用できることが保証済 */
icchandle = p.load_iccprofile("sRGB", 0, "usage=iccbased");
p.begin_page_ext(595, 842, "defaultrgb=" + icchandle);
PDF/X ・ PDF/A のための出力 イ ン テ ン ト を定義 出力デバ イ ス (プ リ ン タ ) のプ ロ フ ァ イ
ルを用いて、 PDF/X のための出力条件を指定す る こ と がで き ます。 そのためには、 PDF_
load_iccprofile( ) への呼び出 し で usage=outputintent を指定 し ます。 PDF/A に対 し ては、
あ ら ゆ る 種類のプ ロ フ ァ イ ルを出力 イ ン テ ン ト と し て指定で き ます。詳 し く は 253 ページ
「10.3 PDF/X に よ る 印刷出力」 と 261 ページ 「10.4 PDF/A に よ る アーカ イ ビ ン グ」 を参
照 し て く だ さ い。
3.5 色を扱 う
85
3.6 さ ま ざ ま な イ ン タ ラ ク テ ィ ブ要素
ク ッ ク ブ ッ ク イ ン タ ラ ク テ ィ ブ要素を作成する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ クの interactive カ
テ ゴ リ にあ り ます。
3.6.1 リ ン ク ・ し お り ・ 注釈
こ の項では、 し お り ・ フ ォーム フ ィ ール ド ・ 注釈 と いっ た さ ま ざ ま な イ ン タ ラ ク テ ィ ブ要
素の作成方法を説明 し ます。 こ の項で作成す る つ も り の イ ン タ ラ ク テ ィ ブ要素がすべてで
き あがっ た完成文書を図 3.1 に示 し ます。 こ の文書には以下の イ ン タ ラ ク テ ィ ブ要素があ
り ます。
> 右上には、テ キ ス ト www.kraxi.com の所に、www.kraxi.com への非表示の Web リ ン ク が
あ り ます。 こ の領域を ク リ ッ ク す る と 、 指定 さ れた Web ページが表示 さ れます。
> 灰色の フ ォーム フ ィ ール ド が、 種類はテ キ ス ト で、 Web リ ン ク の下に作っ て あ り ます。
JavaScript を使っ て こ こ には今日の日付が自動的に記入 さ れます。
> 赤い押 し ピ ンは添付を持っ た注釈です。 ク リ ッ ク す る と フ ァ イ ル添付が開 き ます。
> 左下には フ ォーム フ ィ ール ド があ り 、 種類はボ タ ン で、 プ リ ン タ のア イ コ ン を表示 し
てい ます。 こ のボ タ ン を ク リ ッ ク す る と Acrobat の メ ニ ュ ー項目 「フ ァ イル」 → 「印
刷」 が実行 さ れます。
> ナビ ゲーシ ョ ンパネルには し お り 「Our Paper Planes Catalog」 があ り ます。 こ の し お り
を ク リ ッ ク す る と 、 別の PDF 文書のページが表示 さ れます。
以下、 こ う し た イ ン タ ラ ク テ ィ ブ要素を PDFlib で作成す る 方法を詳 し く 説明 し ます。
Web リ ン ク
まずは、 Web サ イ ト www.kraxi.com への リ ン ク を作 り ま し ょ う 。 こ れは 3
つの段階で達成で き ます。 まず、Web リ ン ク をつけたいテ キ ス ト を配置 し ます。 matchbox
オプシ ョ ンで name=kraxi を指定 し て、 テ キ ス ト のはめ込み枠を後で参照で き る よ う に し
てお き ます。
次に、 URI 型 (Acrobat では 「Web ページ を開 く 」) のア ク シ ョ ン を作成 し ます。 す る
と ア ク シ ョ ンハン ド ルが得 ら れます。 こ のア ク シ ョ ンハン ド ルは後で イ ン タ ラ ク テ ィ ブ要
素 (複数可) に割 り 当て る こ と がで き ます。
最後に、 リ ン ク を実際に作成 し ます。 PDF では リ ン ク は Link 型の注釈です。 リ ン ク に
対す る action オプシ ョ ン では、 イ ベン ト 名 activate を指定 し て ア ク シ ョ ン を ト リ ガ さ せ、
加え て上記で作成 し た act ハン ド ルを ア ク シ ョ ン内容 と し て与え ます。 デフ ォ ル ト では リ
図 3.1
い ろ い ろ なハイパーテキス
ト 要素を持つ文書
86
第 3 章 : PDFlib 文書を作成
ン ク は細い黒枠線がついて表示 さ れます。最初の う ちは こ のほ う が位置合わせを正確にで
き て便利ですが、 こ こ では linewidth=0 で枠線を非表示に し て あ り ます。
normalfont = p.load_font("Helvetica", "unicode", "");
p.begin_page_ext(pagewidth, pageheight, "topdown");
/* テキスト行「Kraxi Systems, Inc.」を配置。範囲枠を使用 */
String optlist =
"font=" + normalfont + " fontsize=8 position={left top} " +
"matchbox={name=kraxi} fillcolor={rgb 0 0 1} underline";
p.fit_textline("Kraxi Systems, Inc.", 2, 20, optlist);
/* URIアクションを作成 */
optlist = "url={http://www.kraxi.com}";
int act = p.create_action("URI", optlist);
/* 範囲枠「kraxi」上にLink注釈を作成 */
optlist = "action={activate " + act + "} linewidth=0 usematchbox={kraxi}";
/* 矩形座標の0は範囲枠の座標に置き換えられる */
p.create_annotation(0, 0, 0, 0, "Link", optlist);
p.end_page_ext("");
画像やテ キ ス ト フ ロ ーの一部への Web リ ン ク の作成例については 242 ページ 「8.4 範囲
枠」 を参照 し て く だ さ い。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの interactive/link_annotations ト ピ ッ ク にあ り ま
す。
別の フ ァ イルに移動す る し お り 今度は、別の PDF フ ァ イ ルに移動す る し お り 「Our Paper
Planes Catalog」 を作成 し ま し ょ う 。 フ ァ イ ル名は paper_planes_catalog.pdf であ る も の と
し ます。 まず、 GoToR 型のア ク シ ョ ン を作成 し ます。 こ のア ク シ ョ ンに対す る オプシ ョ ン
リ ス ト で、 移動先文書の名前を filename オプシ ョ ンで定義 し ます。 ま た destination オプ
シ ョ ンで、 拡大表示 さ せたいページ内の一部分を指定 し ます。 具体的には、 表示 さ れ る の
は文書の 2 ページ目で (page 2)、 位置 ・ 倍率指定表示で (type fixed)、 ページの中頃が表
示 さ れ (left 50 top 200)、 表示倍率 200% (zoom 2) と な り ます。
String
optlist =
"filename=paper_planes_catalog.pdf " +
"destination={page 2 type fixed left 50 top 200 zoom 2}";
goto_action = p.create_action("GoToR", optlist);
次の段階 と し て、 実際に し お り を作成 し ます。 こ の し お り に対す る action オプシ ョ ンで、
ア ク シ ョ ンの ト リ ガ と し て activate イ ベン ト を指定 し 、 起 こ し たいア ク シ ョ ン と し て上で
作成 し た goto_action ハン ド ルを指定 し ます。 fontstyle bold オプシ ョ ン で太字のテ キ ス ト
を指定 し 、textcolor {rgb 0 0 1} で し お り を青 く し ます。し お り のテ キ ス ト 「Our Paper Planes
Catalog」 は関数の引数 と し て与え ます。
String
optlist=
"action={activate " + goto_action + " } fontstyle=bold textcolor={rgb 0 0 1}";
catalog_bookmark = p.create_bookmark("Our Paper Planes Catalog", optlist);
3.6 さ ま ざ ま な イ ン タ ラ ク テ ィ ブ要素
87
こ の し お り を ク リ ッ ク す る と 、 移動先文書内のページの指定部分が表示 さ れます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの interactive/nested_bookmarks ト ピ ッ ク にあ り ま
す。
フ ァ イル添付に よ る注釈 次に、 フ ァ イ ル添付を作成 し ます。 まず FileAttachment 型の
注釈を作成 し ます。 filename オプシ ョ ン で添付の名前を指定 し 、 mimetype image/gif オプ
シ ョ ンでその種類を指定 し ます (MIME はフ ァ イ ル内容の分類のために広 く 使われてい る
記述方式) 。 こ の し お り は押 し ピ ン と し て 表示 さ れ (iconname pushpin) 、 色は 赤 で
(annotcolor {rgb 1 0 0})、 説明を持ち ます (contents {Get the Kraxi Paper Plane!})。 印刷 さ れ
ません (display noprint)。
String optlist =
"filename=kraxi_logo.gif mimetype=image/gif iconname=pushpin " +
"annotcolor={rgb 1 0 0} contents={Get the Kraxi Paper Plane!} display=noprint";
p.create_annotation(left_x, left_y, right_x, right_y, "FileAttachment", optlist);
なお、 iconname で定義 し た ア イ コ ンの大 き さ は変化 し ません。 ア イ コ ンはその標準サ イ
ズの ま ま、 指定 し た矩形の左上隅に表示 さ れます。
3.6.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 {rgb 1 1 0} オプ
シ ョ ンで背景を黄色に指定 し 、 bordercolor {rgb 0 0 0} で枠線を黒に指定 し ます。 オプシ ョ
ン 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_
88
第 3 章 : PDFlib 文書を作成
icon.jpg を テ ンプ レー ト と し てページ作成前に読み込みます。 icon オプシ ョ ン を用いてテ
ンプ レー ト ハン ド ル print_icon を ボ タ ン フ ィ ール ド に割 り 当てつつ、 上記の コ ー ド と 同様
に フ ォーム フ ィ ール ド を作成 し ます。
print_icon = p.load_image("auto", "print_icon.jpg", "template");
if (print_icon == -1)
{
/* エラー処理 */
return;
}
p.begin_page_ext(pagewidth, pageheight, "");
...
String optlist = "action={up " + print_action + "} icon=" + print_icon +
" tooltip={Print the document} font=" + button_font;
p.create_field(left_x, left_y, right_x, right_y, "print_button", "pushbutton", optlist);
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの interactive/form_pushbutton ト ピ ッ ク にあ り ま
す。
単純な テキス ト フ ィ ール ド 今度は、 テ キ ス ト フ ィ ール ド をページ右上隅付近に作成 し
ます。 ユーザーは今日の日付を こ のフ ィ ール ド に入力する こ と がで き ます。 フ ォ ン ト ハン
ド ルを取得 し 、 textfield 型の フ ォーム フ ィ ール ド を作成 し て名前を date、 背景を灰色 と し
ます。
textfield_font = p.load_font("Helvetica-Bold", "unicode", "");
String optlist = "backgroundcolor={gray 0.8} font=" + textfield_font;
p.create_field(left_x, left_y, right_x, right_y, "date", "textfield", optlist);
デフ ォ ル ト では文字サ イ ズは auto であ り 、 こ の場合フ ィ ール ド の高 さ がその ま ま初期の
文字サ イ ズ と な り ます。入力が フ ィ ール ド の終わ り ま で達す る と 文字サ イ ズは小 さ く な っ
て、 テ キ ス ト がつねに フ ィ ール ド に収ま る よ う 自動調整 さ れます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの
interactive/form_textfield_layout ・
interactive/form_textfield_height ト ピ ッ ク にあ り ます。
JavaScript を持つ テキス ト フ ィ ール ド 上で作成 し た テ キ ス ト フ ォ ー ム フ ィ ール ド を 改
良 し て、 ページ を開 く と 自動的に今日の日付が記入 さ れ る よ う に し ま し ょ う 。 第一段階 と
し て、 JavaScript 型 (Acrobat では 「JavaScript を実行」) のア ク シ ョ ン を作成 し ます。 こ の
ア ク シ ョ ンのオプシ ョ ン リ ス ト の中の script オプシ ョ ンで JavaScript ス ニペ ッ ト を定義 し
ます。 こ の ス ニペ ッ ト は、 今日の日付を date テ キ ス ト フ ィ ール ド に月日年形式で表示 し
ます。
String
optlist =
"script={var d = util.printd('mmm dd yyyy', new Date()); "
"var date = this.getField('date'); date.value = d;}"
show_date = p.create_action("JavaScript", optlist);
第二段階 と し て、 ページ を作成 し ます。 オプシ ョ ン リ ス ト で action オプシ ョ ン を与え、 そ
の中で、 上で作成 し た show_date ア ク シ ョ ン を ト リ ガ イ ベン ト open (Acrobat では 「ペー
ジ を開 く 」) に対 し て設定 し ます。
3.6 さ ま ざ ま な イ ン タ ラ ク テ ィ ブ要素
89
String optlist = "action={open " + show_date + "}";
p.begin_page_ext(pagewidth, pageheight, optlist);
最終段階 と し て、 上 と 同様にテ キ ス ト フ ィ ール ド を作成 し ます。 ページ を開 く たび、 こ こ
に自動的に今日の日付が記入 さ れます。
textfield_font = p.load_font("Helvetica-Bold", "winansi", "");
String optlist = "backgroundcolor={gray 0.8} font=" + textfield_font;
p.create_field(left_x, left_y, right_x, right_y, "date", "textfield", optlist);
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの interactive/form_textfield_fill_with_js ト ピ ッ
ク にあ り ます。
テキス ト フ ィ ール ド の さ ま ざ ま な フ ォ ーマ ッ ト オ プ シ ョ ン Acrobat で は、 テ キ ス ト
フ ィ ール ド に対 し て さ ま ざ ま なオプシ ョ ン を指定 し て内容を フ ォ ーマ ッ ト す る こ と が可
能です。 た と えば通貨 ・ 日付 ・ パーセ ン ト な ど です。 こ れは、 カ ス タ ムの JavaScript コ ー
ド を Acrobat が使用す る こ と に よ っ て実装 さ れてい ます。 こ う いっ た フ ォーマ ッ ト 機能は
PDF リ フ ァ レ ン ス には記載 さ れていない物ですか ら 、PDFlib は直接には こ れに対応を し て
い ません。 し か し なが ら 、 PDFlib ユーザーの便宜を図 る ため、 以下、 フ ォ ーマ ッ ト オプ
シ ョ ン を実現す る ための簡単な JavaSctipt コ ー ド を PDF_create_field( ) の action オプシ ョ
ンで与え る 方法について説明 し ます。
テ キ ス ト フ ィ ール ド が フ ォーマ ッ ト さ れ る よ う にす る には、 JavaScript ス ニペ ッ ト を テ
キ ス ト フ ィ ール ド の keystroke ・ format のア ク シ ョ ン と し て設定 し ます。 その JavaScript
コ ー ド か ら 何 ら かの内部 Acrobat 関数を呼び出 し 、 こ の関数の引数群で フ ォーマ ッ ト の詳
細を制御 し ます。
以下の作成例では、 keystroke ・ format の 2 つのア ク シ ョ ン を作成 し 、 こ れ ら を 1 つの
フ ォーム フ ィ ール ド に対 し て設定 し て、 フ ィ ール ド 内容の フ ォーマ ッ ト が小数点以下の桁
数 2 ・ 通貨記号 EUR と な る よ う に し てい ます。
keystroke_action = p.create_action("JavaScript",
"script={AFNumber_Keystroke(2, 0, 3, 0, \"EUR \", true); }");
format_action = p.create_action("JavaScript",
"script={AFNumber_Format(2, 0, 0, 0, \"EUR \", true); }");
String optlist = "font=" + font + "action={keystroke " + keystroke_action +
" format=" + format_action + "}";
p.create_field(50, 500, 250, 600, "price", "textfield", optlist);
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの interactive/form_textfield_input_format ト ピ ッ
ク にあ り ます。
Acrobat で対応 し てい る さ ま ざ ま な フ ォーマ ッ ト を指定す る には、 それぞれ適切な関数を
JavaScript コ ー ド 内で用い る 必要があ り ます。 対応 し てい る すべての フ ォーマ ッ ト につい
て、 それぞれ実現す る ために keystroke ・ format ア ク シ ョ ンで用い る べ き JavaScript 関数名
を表 3.5 に挙げます。 表 3.6 は 関数の引数の解説です。 こ れ ら の関数を、 上記の例 と 同様
に使用 し て く だ さ い。
90
第 3 章 : PDFlib 文書を作成
表 3.5 テキス ト フ ィ ール ド のための JavaScript フ ォ ーマ ッ ト 関数一覧
フ ォ ーマ ッ ト
keystroke ・ format ア ク シ ョ ン で用いるべき JavaScript 関数
数値
AFNumber_Keystroke(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend)
AFNumber_Format(nDec, sepStyle, negStyle, currStyle, strCurrency, bCurrencyPrepend)
パーセ ン ト
AFPercent_Keystroke(ndec, sepStyle), AFPercent_Format(ndec, sepStyle)
日付
AFDate_KeystrokeEx(cFormat), AFDate_FormatEx(cFormat)
時間
AFTime_Keystroke(tFormat), AFTime_FormatEx(cFormat)
特殊
AFSpecial_Keystroke(psf), AFSpecial_Format(psf)
表 3.6 JavaScript フ ォ ーマ ッ ト 関数に対するパ ラ メ タ 一覧
パラ メ タ
説明 ・ と り う る値
nDec
小数点以下の桁数
sepStyle
区切 り のス タ イル。
negStyle
0
1,234.56
1
1234.56
2
1.234,56
3
1234,56
負数の表記方法。
0
標準
1
赤い字にする
2
かっ こ で く く る
3
両方
strCurrency
通貨記号文字列。 例 : \u20AC でユーロ記号
bCurrencyPrepend
false
通貨記号を頭につけない
true
通貨記号を頭につける
cFormat
日付形式文字列。 以下の形式指定文字列を含む こ と がで き るほか、 後述の tFormat の時刻
形式を どれで も 含む こ と がで き る。
d
日
dd
日の頭にゼロ を適宜つけた も の
ddd
曜日の短縮形
m
月を数で表す
mm
月を数で表 し 頭にゼロ を適宜つけた もの
mmm
月名の短縮形
mmmm
月名の全体形
yyyy
年の 4 桁
yy
年の下 2 桁
3.6 さ ま ざ ま な イ ン タ ラ ク テ ィ ブ要素
91
表 3.6 JavaScript フ ォ ーマ ッ ト 関数に対するパラ メ タ 一覧
パラ メ タ
説明 ・ と り う る値
tFormat
時刻形式文字列。 以下の形式指定文字列を含む こ と がで き る。
psf
92
h
時 (0 ~ 12)
hh
時 (0 ~ 12) の頭にゼロ を適宜つけた もの
H
時 (0 ~ 24)
HH
時 (0 ~ 24) の頭にゼロ を適宜つけた もの
M
分
MM
分の頭にゼロ を適宜つけた もの
s
秒
ss
秒の頭にゼロ を適宜つけた もの
t
午前 「a」、 午後 「p」
tt
午前 「am」、 午後 「pm」
特殊オプ シ ョ ン。
0
ZIP コ ー ド
1
ZIP コ ー ド + 4
2
電話番号
3
社会保障番号
第 3 章 : PDFlib 文書を作成
3.7 地理空間 PDF
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの interactive/starter_geospatial ト ピ ッ ク にあ り
ます。
3.7.1 GeoPDF を Acrobat で使 う
PDF 1.7ext3 では、 地理空間参照情報 (世界座標) を PDF ページ内容に追加す る こ と がで
き る よ う に な っ て い ま す。 Acrobat 9 以上では、 地理空間参照付 き PDF 文書 (縮め て
GeoPDF) でい く つかの こ と がで き ます :
> マ ウ ス カー ソ ルの下の地図上の位置の座標を表示 : 「ツール」 → 「分析」 → 「地図位置
ツ ール」 (Acrobat X では、 「ツ ール」 ペーン の上端のボ タ ン を使っ て 「分析」 ツール
バーを表示 さ せ る 必要があ る か も し れません)。 マ ウ ス カー ソ ルの下の地図上の位置の
座標を、 右 ク リ ッ ク し て 「座標を ク リ ッ プボー ド に コ ピー」 を選択す る こ と で コ ピー
で き ます。
> 地図上の位置 を検索 : 「ツ ール」 → 「分析」 → 「地図位置ツ ール」 →右 ク リ ッ ク し て
「位置を検索」 を選択→求め る 座標を入力。
> 地図上の位置を マー ク : 「ツール」 → 「分析」 → 「地図位置ツール」 →右 ク リ ッ ク し て
「位置を マー ク」 を選択。
> 地図上の距離 ・ 周辺 ・ 面積を測定 : 「ツール」 → 「分析」 → 「もの さ し ツール」。
> 座標表示に用いたい座標系等、 地理空間測定の さ ま ざ ま な設定を、 「編集」 → 「環境設
定」 → 「一般 ...」 → 「 もの さ し (地図情報)」 で変更す る こ と がで き ます。
PDFlib の地理空間機能は下記の関数 と オプシ ョ ンで実装 さ れてい ます :
> 1 つのページに対 し て、 1 つない し 複数の地理参照付 き 領域を、 PDF_begin/end_page_
ext( ) の viewports オプシ ョ ン で割 り 当て る こ と がで き ます。 ビ ュ ーポー ト を使 う と 、
ページ上の別々の領域で別々の地理空間参照 (georeference オプシ ョ ンで指定) を用い
る こ と が可能にな り ます。 こ れはた と えば同一ページ上に複数の地図があ る と き な ど
に有用です。
> PDF_load_image( ) の georeference オプシ ョ ン を使 う と 、画像に地球ベース の座標を割 り
当て る こ と がで き ます。
> こ の georeference オプシ ョ ン を PDF_open_pdi_page( )・PDF_begin_template_ext( ) で も 提
供 し て、 取 り 込み PDF ページ ・ テ ンプ レー ト に も 地球ベース の座標を割 り 当て ら れ る
よ う にで き る と よ いのですが、 残念なが ら こ れは Acrobat 9 ・ Acrobat X で う ま く 動作
し ないので、 対応 し てい ません。
3.7.2 地理座標系 と 投影座標系
地理座標系は地球を地理座標で、 すなわち緯度 と 経度を度単位で表 し て記述 し ます。 投影
座標系は、 地理座標系の上に指定す る こ と がで き 、 地理座標系におけ る 点か ら 二次元 (投
影) 座標系への変換を記述 し ます。 こ こ か ら 算出 さ れ る 座標を Northing ・ Easting 値 と い
い、 投影座標系では角度は も はや不要です。 地理座標系が GPS な ど の全球的応用分野で
用い ら れてい る のに対 し て、投影はそれ よ り も あ る 程度局地的な地図製作な ど の応用分野
で必要 と な り ます。
歴史的 ・ 数学的理由に よ り 、 世界 じ ゅ う で さ ま ざ ま な座標系が用い ら れてい ます。 地
理座標系 ・ 投影座標系 と も 、 EPSG ・ WKT と い う 2 種類の普及 し た方式で記述す る こ と が
で き ます。
3.7 地理空間 PDF
93
EPSG EPSG は何千 も の座標系の集合で あ り 、 おのおのが数値 コ ー ド で参照 さ れ ま す。
EPSG は、 今はな き 欧州石油調査グループの略称であ り 、 現在は国際石油 ・ 天然ガ ス生産
者協会 (OGP) に よ っ て保守 さ れてい ます。
EPSG 参照 コ ー ド は、 EPSG デー タ ベース内の座標系群の う ちの 1 つを指 し 示 し ます。
EPSG デー タ ベース全体を、 下記の場所か ら ダ ウ ン ロ ー ド す る こ と がで き ます :
www.epsg.org
WKT (Well-known text) WKT (Well-Known Text) 系は記述的であ り 、 座標系のあ ら ゆ
る 関 連 パ ラ メ タ の テ キ ス ト 表記 か ら 成 っ て い ま す。 WKT の 仕 様 は 文 書 「OpenGIS®
Implementation Specification: Coordinate Transformation Services」 に示 さ れてお り 、 こ の文
書は Open Geospatial Consortium (OGC) に よ っ て Document 01-009 と し て発行 さ れてい
ます。 こ れは下記の場所で入手可能です :
www.opengeospatial.org/standards/ct
WKT は ISO 19125-1 で標準化 も さ れてい ます。 WKT ・ EPSG と も Acrobat で使用で き ます
(ま た、 PDFlib で も 対応 し てい ます) が、 Acrobat はすべての可能な EPSG コ ー ド を実装 し
てい る わけではあ り ません。 と く に、 地理座標系のための EPSG コ ー ド 群には Acrobat は
対応 し ていない よ う です。 その場合には WKT の使用を推奨 し ます。 下記の Web サ イ ト
で、 特定の EPSG コ ー ド に対応す る WKT を示 し てい ます :
www.spatialreference.org/ref/epsg
3.7.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 座標での利用に適 し た投影座標系を指定 し ます。
94
第 3 章 : PDFlib 文書を作成
中欧では、 ETRS89 UTM zone 32 N と い う 系が適用 さ れます。 こ れは広 く 利用 さ れてい
る UTM (国際 メ ルカ ト ル投影) を用いてお り 、 下記の よ う に georeference オプシ ョ ンの
worldsystem サブオプシ ョ ンで表現で き ます :
worldsystem={type=projected wkt={
PROJCS["ETRS_1989_UTM_Zone_32N",
GEOGCS["GCS_ETRS_1989",
DATUM["D_ETRS_1989", SPHEROID["GRS_1980", 6378137.0, 298.257222101],
TOWGS84[0, 0, 0, 0, 0, 0, 0]],
PRIMEM["Greenwich", 0.0],
UNIT["Degree", 0.0174532925199433]],
PROJECTION["Transverse_Mercator"],
PARAMETER["False_Easting", 500000.0],
PARAMETER["False_Northing", 0.0],
PARAMETER["Central_Meridian", 9.0],
PARAMETER["Scale_Factor", 0.9996],
PARAMETER["Latitude_Of_Origin", 0.0],
UNIT["Meter", 1.0]]
}}
こ の座標系に対応す る EPSG コ ー ド は 25832 です。WKT のかわ り に、上記の系はその EPSG
コ ー ド を通 じ て下記の よ う に指定す る こ と も で き ます :
worldsystem={type=projected epsg=25832}
3.7.4 Acrobat におけ る GeoPDF の制約
GeoPDF を Acrobat 9 ・ Acrobat X で扱 う なかで、 私たちは下記の難点に遭遇 し てい ます :
> EPSG コ ー ド は地理座標系に対 し ては ま っ た く 動作せず、投影系に対 し てのみ動作す る
よ う です。
回避策 : EPSG コ ー ド でな く 、 対応す る WKT を使 う こ と 。
> 地理空間デー タ をベ ク ト ルオブジ ェ ク ト に紐付けて も 動作 し ません。 PDF Reference に
よ れば こ れは理論上動作す る はずなのですが、 こ の理由か ら PDFlib では、 PDF_open_
pdi_page( ) ・ PDF_begin_template_ext( ) に対す る georeference オプシ ョ ンには対応 し て
い ません。
ベ ク ト ルベース の地図を作成す る ための回避策 : 地理空間デー タ をページに紐付け る
こ と はで き ます。すなわち、PDF_begin_page_ext( ) の viewports オプシ ョ ン を用い ます。
> 重な り 合っ た地図 : 同一ページ上に複数の画像ベース の地図を貼 り 付け る こ と がで き
ます。 複数の地図が重な り 合っ てい る と き 、 重な り 合っ てい る 領域内の点の座標を表
示 さ せる と 、 Acrobat は、 最後に貼 り 付け ら れた地図の座標を用い ます ( こ れがすなわ
ち見えてい る 地図で も あ り ますので こ れは理にかな っ てい ます)。 し か し 、 双方の画像
ハン ド ルが同一の (すなわち PDF_load_image( ) への 1 回の呼び出 し で取得 さ れた) 場
合には、 Acrobat は も はや さ ま ざ ま な画像の領域を考慮 し な く な り 、 1 番目の画像の座
標が誤っ て 2 番目の画像の領域へ拡張 さ れ、 誤っ た座標表示 と な っ て し ま い ます。
回避策:同一ページ上に同 じ 画像をベース に し た地図を複数枚貼 り 付けたい と き は、そ
の画像を複数回開 く こ と 。
> 面積 も の さ し ツールは地理座標系に対 し ては正 し く 動作せず、 投影系に対 し てのみ正
し く 動作 し ます。
3.7 地理空間 PDF
95
96
第 3 章 : PDFlib 文書を作成
4 Unicode と レ ガシエ ン コ ーデ ィ ング
こ の章では、 Unicode やその他のエン コ ーデ ィ ン グ方式に関す る 基礎的な情報を提供 し ま
す。 PDFlib におけ る テ キ ス ト 処理は Unicode 規格に大き く 依存 し てい ますが、 さ ま ざ ま な
レ ガシエン コ ーデ ィ ン グや特殊エン コ ーデ ィ ン グに も 対応 し てい ます。
4.1 Unicode の重要な概念
キ ャ ラ ク タ と グ リ フ テ キ ス ト を扱 う 際には、 次の概念を は っ き り 区別す る こ と が大切
です。
> キ ャ ラ ク タ は、 言語の中で情報を伝達す る 最小の単位です。 代表的な例は ラ テ ン アル
フ ァ ベ ッ ト の文字、 中国語の表意文字、 日本語の音節文字です。 キ ャ ラ ク タ は意味を
持ち ます。 すなわち キ ャ ラ ク タ は意味実体です。
> グ リ フは、 さ ま ざ ま な視覚表現で、 1 個ない し 複数のキ ャ ラ ク タ を表 し ます。 グ リ フは
外見を持ち ます。 すなわち グ リ フは表現実体です。
キ ャ ラ ク タ と グ リ フ の間に一対一の対応は存在 し ません。た と えば合字は 1 つのグ リ フ で
すが、 2 つ以上のキ ャ ラ ク タ で表現 さ れます。 か と 思えば、 1 つのグ リ フ が場面に よ っ て
別々のキ ャ ラ ク タ を表すのに使われ る こ と も あ り ます (キ ャ ラ ク タ には同 じ 形の も のがあ
り ます。 図 4.1 参照)。
BMP と PUA 下記の用語が Unicode ベース の環境では頻繁に登場 し ます :
> 基本多言語面 (BMP) : Unicode の範囲 U+0000 ~ U+FFFF 内の コ ー ド 点か ら 成 り ます。
Unicode 規格は こ のほかに も 多 く の コ ー ド 点を、 追加面群、 すなわち範囲 U+10000 ~
U+10FFFF 内に含んでい ます。
> 私用領域 (PUA):私用のために予約 さ れてい る い く つかの領域の 1 つです。PUA の コ ー
ド 点は一般的なや り と り には利用で き ません。 なぜな ら 、 Unicode 規格では こ の領域の
中にいかな る キ ャ ラ ク タ を も 指定 し ていないか ら です。基本多言語面は範囲 U+E000 ~
U+F8FF に PUA を含んでい ます。第 15 面 (U+F0000 ~ U+FFFFD) と 第 16 面(U+100000
~ U+10FFFD) は私用のためにすっか り 予約 さ れてい ます。
図 4.1
グ リ フ とキャ ラ ク タ
の関係
4.1 Unicode の重要な概念
97
Unicode エ ン コ ーデ ィ ン グ形式 (UTF 形式) Unicode 標準は各キ ャ ラ ク タ に数 ( コ ー ド
点) を割 り 当ててい ます。 こ の数を コ ン ピ ュ ー タ 処理で使 う には、 何 ら かの方式で表現 し
なければな り ません。 Unicode 標準では こ れを エン コ ーデ ィ ン グ形式 と 呼びます (旧称 :
変換形式)。 こ の用語はフ ォ ン ト のエン コ ーデ ィ ン グ と 混同 し てはいけ ません。 Unicode は
以下のエン コ ーデ ィ ン グ形式を定義 し てい ます。
> UTF-8: こ れは可変幅の形式で、 コ ー ド 点は 1 ~ 4 バ イ ト で表 さ れます。範囲 U+0000 ~
U+007F の ASCII キ ャ ラ ク タ は範囲 00 ~ 7F のシ ン グルバ イ ト で表 さ れます。 範囲
U+00A0 ~ U+00FF の Latin-1 キ ャ ラ ク タ は 2 バ イ ト で表 さ れ、 その第一バ イ ト はつね
に 0xC2 か 0xC3 にな り ます ( こ れ ら の値は Latin-1 で Â と Ã を表 し ます)。
> UTF-16 : 基本多言語面 (BMP) の コ ー ド 点は 1 つの 16 ビ ッ ト 値で表 さ れます。補助多言
語面の コ ー ド 点、すなわち範囲 U+10000 ~ U+10FFFF の コ ー ド 点は 16 ビ ッ ト 値の対で
表 さ れます。 こ の対をサ ロ ゲー ト ペア と 呼びます。 1 つのサ ロ ゲー ト 値は、 範囲 D800
~ DBFF の高位サ ロ ゲー ト 値 1 つ と 範囲 DC00 ~ DFFF の低位サ ロ ゲー ト 値 1 つか ら
成っ てい ます。 高位 と 低位のサ ロ ゲー ト 値はサ ロ ゲー ト ペアの中にのみ現れ、 他の場
面で使われ る こ と はあ り ません。
> UTF-32 : 各 コ ー ド 点は 1 つの 32 ビ ッ ト 値で表 さ れます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/process_utf8 ト ピ ッ ク にあ り ます。
Unicode エ ン コ ーデ ィ ン グ体系 と バ イ ト 順序マー ク (BOM) コ ン ピ ュ ー タ ア ー キ テ ク
チ ャ は種類に よ っ て、 バ イ ト の並べ方が違い ま す。 すなわちバ イ ト が よ り 大 き な値 (16
ビ ッ ト や 32 ビ ッ ト ) を構成す る と き 、 最上位バ イ ト を最初に格納す る 方式 (ビ ッ グエン
デ ィ ア ン) と 、 最下位バ イ ト を最初に格納す る 方式 ( リ ト ルエ ンデ ィ ア ン) があ り ます。
ビ ッ グエンデ ィ ア ン アーキ テ ク チ ャ の代表例は PowerPC であ り 、一方 x86 アーキ テ ク チ ャ
は リ ト ルエンデ ィ ア ンです。UTF-8 と UTF-16 はシ ン グルバ イ ト よ り 大 き な値を用いてい
ま すので、 やは り バ イ ト の並べ方を論 じ る 必要が出て き ま す。 エ ン コ ーデ ィ ン グ体系は
(上述のエン コ ーデ ィ ン グ形式 と は違 う ので注意)、エン コ ーデ ィ ン グ形式に加え てバ イ ト
順序を指定 し ます。 た と えば UTF-16BE は、 UTF-16 でバ イ ト 順序はビ ッ グエンデ ィ ア ン
と い う 意味です。 バ イ ト 順序があ ら か じ めわか ら ない と き は、 それを指定す る 手段 と し て
コ ー ド 点 U+FEFF があ り ま す。 こ れをバ イ ト 順序マー ク (BOM) と いい ます。 BOM は
UTF-8 では不要ですが、 存在 し ていて も よ く 、 それを利用 し てバ イ ト ス ト リ ーム を UTF8 と 同定す る こ と も で き ます。 さ ま ざ ま なエン コ ーデ ィ ン グ形式に対する BOM の表 し 方
を表 4.1 に示 し ます。
表 4.1 さ ま ざ ま な Unicode エ ン コ ーデ ィ ング形式に対するバイ ト 順序マー ク一覧
エ ン コ ーデ ィ ング形式
バイ ト 順序マー ク (16 進)
WinAnsi における視覚表現1
UTF-8
EF BB BF

UTF-16 ビ ッ グエ ンデ ィ ア ン
FE FF
þÿ
UTF-16 リ ト ルエ ンデ ィ ア ン
FF FE
ÿþ
UTF-32 ビ ッ グエ ンデ ィ ア ン
00 00 FE FF
■■þÿ
UTF-32 リ ト ルエ ンデ ィ ア ン
FF FE 00 00
ÿþ■■
1. 黒四角 ■ は null バイ ト を意味 し ます。
98
第 4 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング
4.2 シ ン グルバ イ ト (8 ビ ッ ト ) エ ン コ ーデ ィ ン グ
8 ビ ッ ト エン コ ーデ ィ ン グ (シ ン グルバ イ ト エン コーデ ィ ン グ と も いい ます) は、 バ イ ト
値 0x01 ~ 0xFF を それぞれ、 BMP (すなわち U+0000 ~ U+FFFF) 内の Unicode 値を持つ
1 つのキ ャ ラ ク タ に割 り 当て ます。 同時に使え る キ ャ ラ ク タ は 255 種類ま でです。 なぜな
ら コ ー ド 0 (ゼ ロ ) は .notdef キ ャ ラ ク タ U+0000 のために予約 さ れてい る か ら です。PDFlib
の定義済みエン コ ーデ ィ ン グ を表 4.2 に記 し ます。 普通の フ ォ ン ト では満たせない要求を
す る 用字系や言語 も あ る 、 と い う 認識が重要です。
注 PDFlib デ ィ ス ト リ ビ ュ ーシ ョ ンに同梱の作成例 「chartab」 を使 う と 、 任意のフ ォ ン ト と
エ ン コ ーデ ィ ングの組み合わせについて、 そのキ ャ ラ ク タ 一覧表を簡単に印刷で き ます。
表 4.2 PDFlib の定義済みエ ン コ ーデ ィ ング一覧
コ ー ド ページ
winansi
対応言語
macroman
Mac Roman エ ン コ ーデ ィ ング、 オ リ ジナル Macintosh キ ャ ラ ク タ セ ッ ト
macroman_apple
macroman と ほぼ同 じ 、 ただ し 通貨をユーロ で置き換え、 数学 / ギ リ シ ャ語記号を追加で含
みます
ebcdic
EBCDIC コ ー ド ページ 1047
ebcdic_37
EBCDIC コ ー ド ページ 037
pdfdoc
PDFDocEncoding
iso8859-1
(Latin-1) 西欧諸語
iso8859-2
(Latin-2) 中欧のス ラ ブ諸語
iso8859-3
(Latin-3) エ スペ ラ ン ト ・ マル タ 語
iso8859-4
(Latin-4) エ ス ト ニア語 ・ バル ト 諸語 ・ グ リ ーン ラ ン ド 語
iso8859-5
ブルガ リ ア語 ・ ロ シ ア語 ・ セルビ ア語
cp1252 (ISO8859-1 のスーパーセ ッ ト ) と 同 じ
iso8859-6
ア ラ ビ ア語
iso8859-7
現代ギ リ シ ャ 語
iso8859-8
ヘブ ラ イ語 ・ イ デ ィ ッ シ ュ語
iso8859-9
(Latin-5) 西欧諸語 ・ ト ル コ 語
iso8859-10
(Latin-6) 北欧諸語
iso8859-13
(Latin-7) バル ト 諸語
iso8859-14
(Latin-8) ケル ト 語
iso8859-15
(Latin-9) Latin-1 に、 ユーロ と フ ラ ン ス語 ・ フ ィ ン ラ ン ド 語キ ャ ラ ク タ を加えています
iso8859-16
(Latin-10) ハン ガ リ ー語 ・ ポー ラ ン ド 語 ・ ルーマニ ア語 ・ ス ロベニア語
cp1250
中欧諸語
cp1251
キ リ ル諸語
cp1252
西欧諸語 (winansi と 同 じ )
cp1253
ギ リ シ ャ語
cp1254
ト ルコ語
cp1255
ヘブ ラ イ語
cp1256
ア ラ ビ ア語
cp1257
バル ト 諸語
cp1258
ベ ト ナム語
4.2 シ ングルバイ ト (8 ビ ッ ト ) エ ン コ ーデ ィ ング
99
ホ ス ト エ ン コ ーデ ィ ン グ 特殊なエン コ ーデ ィ ン グ host は固定 し た意味を持たず、 環境
のプ ラ ッ ト フ ォームに よ っ て、 下記の 8 ビ ッ ト エン コ ーデ ィ ン グに対応づけ ら れます (表
4.2 参照) :
> MVS か USS を持つ IBM zSeries では ebcdic に対応づけ ら れます。
> IBM i5/iSeries では ebcdic_37 に対応づけ ら れます。
> Windows では winansi に対応づけ ら れます。
> それ以外のすべてのシ ス テ ム (Mac OS X を含む) では iso8859-1 に対応づけ ら れます。
ホ ス ト エン コ ーデ ィ ン グが有用なのは何 と いっ て も 、プ ラ ッ ト フ ォーム非依存のテ ス ト プ
ロ グ ラ ム (PDFlib デ ィ ス ト リ ビ ュ ーシ ョ ンの中にあ る よ う な) や、 その他の単純なプ ロ グ
ラ ム を書 く と き です。 製品版でのホ ス ト エン コ ーデ ィ ン グの使用は推奨 し ませんので、 何
ら かの適切なエン コ ーデ ィ ン グに置 き 換え る べ き です。
host エン コ ーデ ィ ン グは、 Unicode 非対応の言語バ イ ンデ ィ ン グでは、 名前文字列のデ
フ ォ ル ト エン コ ーデ ィ ン グ と し て用い ら れてい ます (107 ページ 「4.4.3 Unicode 非対応言
語バ イ ンデ ィ ン グの文字列」 参照) 。 なぜな ら こ れが フ ァ イ ル名な ど に一番適切だか ら で
す。
自動エ ン コ ーデ ィ ン グ PDFlib は、 特定の環境に対 し て も っ と も 自然なエ ン コ ーデ ィ ン
グ を手間な く 指定で き る し く みに対応 し てい ます。エン コ ーデ ィ ン グ名 と し て キーワー ド
auto を与え る と 、 プ ラ ッ ト フ ォームや環境に よ っ て、 以下のテ キ ス ト フ ォ ン ト 用 8 ビ ッ
ト エン コ ーデ ィ ン グ を指定 し た こ と にな り ます。
> Windows では : カ レ ン ト のシ ス テ ム コ ー ド ページ (詳 し く は後述)
> Unix・Mac OS X では:iso8859-1(ただ し Mac 上の LWFN PostScript フ ォ ン ト では auto は
macroman に対応)
> IBM i5/iSeries では : カ レ ン ト ジ ョ ブのエン コ ーデ ィ ン グ (IBMCCSID000000000000)
> IBM zSeries では : ebcdic (= コ ー ド ページ 1047)
記号フ ォ ン ト では、キー ワー ド auto は builtin エン コ ーデ ィ ン グに対応づけ ら れます (127
ページ 「5.4.2 記号フ ォ ン ト に対す る エン コ ーデ ィ ン グ を選ぶ」 参照)。 自動エン コ ーデ ィ
ン グは多 く の場面で便利ですが、 その半面、 こ の方式を用いた PDFlib ク ラ イ ア ン ト プ ロ
グ ラ ムは他の環境では使え な く な り ます。
シ ス テム コ ー ド ページの利用 PDFlib は、コ ー ド ページ定義を シ ス テ ムか ら 取得 し て、そ
れを内部利用のために適切に変換 さ せ る よ う にする こ と がで き ます。 こ の機能を利用すれ
ば、 コ ー ド ページの実装作業を し な く てすむので と て も 便利です。 組み込みエン コ ーデ ィ
ン グやユーザー定義エン コ ーデ ィ ン グの名前を PDF_load_font( ) に与え る のではな く 、 た
だ、 シ ス テ ムが知っ てい る エン コ ーデ ィ ン グ名を利用すれば よ いのです。 こ の機能が利用
で き る のはい く つかの限 ら れたプ ラ ッ ト フ ォーム上だけであ り 、そのエン コ ーデ ィ ン グ文
字列の文法は次の よ う にプ ラ ッ ト フ ォーム依存です。
> Windows では、エン コ ーデ ィ ン グ名は cp< 番号 > です。こ こ で < 番号 > は、シ ス テ ムに イ ン
ス ト ール さ れてい る 任意のシ ン グルバ イ ト コ ー ド ページの番号です (マルチバ イ ト の
Windows コ ー ド ページについては 171 ページ 「6.5.2 カ ス タ ム日中韓フ ォ ン ト 」 参照)。
font = p.load_font("Helvetica", "cp1250", "");
シ ン グルバ イ ト コ ー ド ページは内部の 8 ビ ッ ト エン コ ーデ ィ ン グに変換 さ れ る のに対
し 、 マルチバ イ ト コ ー ド ページは実行時に unicode に対応づけ ら れます。 テ キ ス ト は、
選んだ コ ー ド ページ と 互換の形式で与え る 必要があ り ます (た と えば cp932 に対 し て
は SJIS)。
100
第 4 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング
> IBM i5/iSeries では、 任意の Coded Character Set Identifier (CCSID) が使え ます。 CCSID
は文字列 と し て与え る 必要があ り 、PDFlib は、与え ら れた コ ー ド ページ番号に IBMCCSID
と い う 接頭辞をつけ ます。 ま た PDFlib は、 コ ー ド ページ番号が 5 文字に満た ない と き
には頭に 0 を補い ます。 コ ー ド ページ番号 と し て 0 (ゼ ロ ) を与え る と 、 カ レ ン ト ジ ョ
ブのエン コ ーデ ィ ン グが用い ら れ る こ と にな り ます。
font = p.load_font("Helvetica", "273", "");
> USS か MVS を持つ IBM zSeries では、任意の Coded Character Set Identifier(CCSID) が使
え ます。 CCSID は文字列 と し て与え る 必要があ り 、 PDFlib は、 与え ら れた コ ー ド ペー
ジ名に一切変更を加えずその ま ま シ ス テ ムに渡 し ます。
font = p.load_font("Helvetica", "IBM-273", "");
ユーザー定義 8 ビ ッ ト エ ン コ ーデ ィ ン グ 定義済みエン コ ーデ ィ ン グのほか、 PDFlib は
ユーザー定義 8 ビ ッ ト エン コ ーデ ィ ン グに も 対応 し てい ます。こ れを使いたいのは、PDFlib
の内部で得 ら れない何かのキ ャ ラ ク タ セ ッ ト を扱いたい と き です。 た と えば、 PDFlib 内部
で対応 し てい る の と は違 う EBCDIC キ ャ ラ ク タ セ ッ ト を扱 う こ と も で き ます。 PDFlib は、
PostScript グ リ フ名で定義 さ れたエン コ ーデ ィ ン グ テーブルに対応 し てい る ほか、 Unicode
値で定義 さ れた テーブルに も 対応 し てい ます。
ユーザー定義エン コ ーデ ィ ン グ を PDFlib プ ロ グ ラ ム内で利用で き る よ う にす る には、
以下 の 作業 を あ ら か じ め 行 う 必要 が あ り ま す (あ る い は エ ン コ ーデ ィ ン グ は、 PDF_
encoding_set_char( )) を使っ て実行時に構築す る こ と も で き ます)。
> エン コ ーデ ィ ン グの記述を単純なテ キ ス ト 形式で作成す る 。
> そのエン コ ーデ ィ ン グ を PDFlib リ ソ ース フ ァ イ ル内で (59 ページ 「3.1.3 リ ソ ース設定
と フ ァ イ ル検索」 参照)、 ま たは PDF_set_parameter( ) で設定す る 。
> エ ン コ ーデ ィ ン グが使 う すべてのキ ャ ラ ク タ に対応 し た フ ォ ン ト を与え る ( メ ト リ ッ
ク と 、 あ る いはア ウ ト ラ イ ン フ ァ イ ル も )。
エン コ ーデ ィ ン グ フ ァ イ ルは、 グ リ フ名 と 番号を 1 行ずつ単純に列挙 し た も のです。 エン
コ ーデ ィ ン グ定義の冒頭部分は次の よ う にな り ます。
% PDFlib用エンコーディング定義。グリフ名を使用
% 名前
コード Unicode(オプション)
space
32
0x0020
exclam
33
0x0021
...
Unicode 値が指定 さ れていない と き は、 PDFlib はその内部テーブルの中で適切な Unicode
値を さ が し ます。 グ リ フ なでな く Unicode 値を指定す る こ と も で き ます :
% PDFlib用コードページ定義。Unicode値を使用
% Unicode
コード
0x0020
32
0x0021
33
...
よ り 厳密に言えば、 エン コ ーデ ィ ン グか コ ー ド ページのフ ァ イ ルの内容は、 以下の規則に
従 う 必要があ り ます。
> 注釈はパーセ ン ト キ ャ ラ ク タ 「%」 で始ま り 、 行末で終わ り ます。
> 各行の先頭項目は、PostScript グ リ フ名か、ま たは 16 進 Unicode 値です。Unicode 値は、接
頭辞 0x と 16 進 4 桁 (大文字で も 小文字で も ) で構成 さ れます。 その後に、 空白キ ャ
4.2 シ ングルバイ ト (8 ビ ッ ト ) エ ン コ ーデ ィ ング
101
ラ ク タ と 、 16 進 (0x00 ~ 0xFF) か 10 進 (0 ~ 255) の文字 コ ー ド が続 き ます。 オプ
シ ョ ン と し て、 グ リ フ名に よ る エン コ ーデ ィ ン グ フ ァ イ ルの場合は、 対応す る Unicode
値を 3 列目に持つ こ と も で き ます。
> エ ン コ ーデ ィ ン グ フ ァ イ ル内で述べ ら れていない文字 コ ー ド には、 未定義 と 見な さ れ
ます。 あ る いは未定義位置に対 し ては、 Unicode 値 0x0000 かキ ャ ラ ク タ 名 .notdef を
与え る こ と も 可能です。
> エン コ ーデ ィ ン グか コ ー ド ページの フ ァ イ ルの中の Unicode値はすべて U+FFFF よ り も
小 さ く なければな り ません。
命名規則 と し ては、 グ リ フ 名に よ る テーブル を エ ン コ ーデ ィ ン グ フ ァ イ ル (*.enc) と 呼
び、Unicode に よ る テーブルを コ ー ド ページ フ ァ イ ル (*.cpg) と 呼びますが、 し か し PDFlib
は両者を同様に扱い ます。
102
第 4 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング
4.3 日本語 ・ 中国語 ・ 韓国語エ ン コ ーデ ィ ン グ
歴史的に、 非常に多 く の日中韓エン コ ーデ ィ ン グ方式が、 無数の規格化団体や企業に よ っ
て開発 さ れて き ま し た。幸い、普及 し てい る エン コ ーデ ィ ン グにはすべて、Acrobat や PDF
はデフ ォ ル ト 対応 し てい ます。 日中韓テ キ ス ト におけ る エン コ ーデ ィ ン グの概念は、 欧文
テ キ ス ト の場合 よ り は る かに複雑なので、単な る 8 ビ ッ ト エン コ ーデ ィ ン グでは も はや不
充分です。 そのかわ り と し て PostScript と PDF では、 キ ャ ラ ク タ コ レ ク シ ョ ン と キ ャ ラ ク
タ マ ッ プ (CMap) と い う 概念を用いて フ ォ ン ト 内のキ ャ ラ ク タ を組織化 し てい ます。
標準日中韓エ ン コ ーデ ィ ン グに対す る定義済み CMap 定義済みの日中韓 CMap を表 4.3
に示 し ます。 表か ら 見て取れ る よ う に、 Mac ・ Windows ・ Unix シ ス テ ム で使われ る 日中韓
エン コ ーデ ィ ン グの多 く に対応 し てい る ほか、ベン ダー独自エン コ ーデ ィ ン グに も い く つ
か対応 し てい ます。 た と えば日本語な ら Shift-JIS ・ EUC ・ ISO 2022、 中国語な ら GB ・ Big5、
韓国語な ら KSC な ど です。 Unicode に も すべての ロ ケールで対応 し てい ます。
表 4.3 日本語 ・ 中国語 ・ 韓国語テキス ト 用定義済み CMap 一覧 (PDF リ フ ァ レ ン ス よ り )
ロ ケール
CMap 名
文字セ ッ ト と テキス ト 形式
日本語
UniJIS-UCS2-H, -V
Adobe-Japan1 キ ャ ラ ク タ コ レ ク シ ョ ンの Unicode (UCS-2) エ ン コ ーデ ィ ン
グ
UniJIS-UCS2-HW-H UniJIS-UCS2-H と 同 じ だが、 プ ロポーシ ョ ナルの欧文文字が半角の形に置き
UniJIS-UCS2-HW-V 換わ っ ている
中国語
簡体字
中国語
繁体字
UniJIS-UTF16-H
UniJIS-UTF16-V
Adobe-Japan1 キ ャ ラ ク タ コ レ ク シ ョ ンの Unicode (UTF-16BE) エ ン コ ー
デ ィ ング。 JIS X 0213:1000 キ ャ ラ ク タ セ ッ ト の全キ ャ ラ ク タ への割 り 当て を
含む。
83pv-RKSJ-H
Mac、 JIS X 0208 キ ャ ラ ク タ セ ッ ト +漢字 Talk6 拡張、 Shift-JIS、 Script
Manager コ ー ド 1
90ms-RKSJ-H
90ms-RKSJ-V
Microsoft コ ー ド ページ 932 (charset 128)、 JIS X 0208 キ ャ ラ ク タ セ ッ ト +
NEC ・ IBM 拡張
90msp-RKSJ-H
90msp-RKSJ-V
90ms-RKSJ-H と 同 じ だが、 半角英字を プ ロポーシ ョ ナル形に替えた も の
90pv-RKSJ-H
Mac、 JIS X 0208 +漢字 Talk7 拡張、 Shift-JIS、 Script Manager コ ー ド 1
Add-RKSJ-H, -V
EUC- H, -V
JIS X 0208 キ ャ ラ ク タ セ ッ ト 、 EUC-JP エ ン コ ーデ ィ ング
JIS X 0208 キ ャ ラ ク タ セ ッ ト +富士通 FMR 拡張、 Shift-JIS エ ン コ ーデ ィ ング
Ext-RKSJ-H, -V
JIS C 6226 (JIS78) キ ャ ラ ク タ セ ッ ト + NEC 拡張、 Shift-JIS エ ン コ ーデ ィ
ング
H, V
JIS X 0208 キ ャ ラ ク タ セ ッ ト 、 ISO-2022-JP エ ン コ ーデ ィ ング
UniGB-UCS2-H
UniGB-UCS2-V
Adobe-GB1 キ ャ ラ ク タ コ レ ク シ ョ ンの Unicode (UCS-2) エ ン コ ーデ ィ ング
UniGB-UTF16-H
UniGB-UTF16-V
Adobe-GB1 キ ャ ラ ク タ コ レ ク シ ョ ンの Unicode (UTF-16BE) エ ン コ ーデ ィ ン
グ。 GB18030-2000 キ ャ ラ ク タ セ ッ ト の全キ ャ ラ ク タ への割 り 当て を含む。
GB-EUC-H
GB-EUC-V
Microsoft コ ー ド ページ 936 (charset 134)、 GB 2312-80 キ ャ ラ ク タ セ ッ ト 、
EUC-CN エ ン コ ーデ ィ ン グ
GBpc-EUC-H
GBpc-EUC-V
GBK- EUC- H, -V
Macintosh、 GB 2312-80 キ ャ ラ ク タ セ ッ ト 、 EUC-CN エ ン コ ーデ ィ ング、
Script Manager コ ー ド 2
GBKp-EUC-H
GBKp-EUC-V
GBK-EUC-H と 同 じ だが、 半角英字を プ ロポーシ ョ ナル形に替え、 コ ー ド
0x24 に元 (エ) のかわ り に ド ル ($) を割 り 当てた も の。
GBK2K-H, -V
GB 18030-2000 キ ャ ラ ク タ セ ッ ト 、 1 ・ 2 ・ 4 バイ ト 混在エ ン コ ーデ ィ ング
UniCNS-UCS2-H
UniCNS-UCS2-V
Adobe-CNS1 キ ャ ラ ク タ コ レ ク シ ョ ンの Unicode (UCS-2) エ ン コ ーデ ィ ン
グ
Microsoft コ ー ド ページ 936 (charset 134)、 GBK キ ャ ラ ク タ セ ッ ト 、 GBK エ
ン コ ーデ ィ ング
4.3 日本語 ・ 中国語 ・ 韓国語エ ン コ ーデ ィ ング
103
表 4.3 日本語 ・ 中国語 ・ 韓国語テキス ト 用定義済み CMap 一覧 (PDF リ フ ァ レ ン ス よ り )
ロ ケール
CMap 名
文字セ ッ ト と テキス ト 形式
UniCNS-UTF16-H
UniCNS-UTF16-V
Adobe-CNS1 キ ャ ラ ク タ コ レ ク シ ョ ンの Unicode (UTF-16BE) エ ン コ ーデ ィ
ン グ。 HKSCS-2001 (2 ・ 4 バイ ト 文字 コ ー ド ) の全キ ャ ラ ク タ への割 り 当て
を含む。
B5pc-H, -V
Macintosh、 Big Five キ ャ ラ ク タ セ ッ ト 、 Big Five エ ン コ ーデ ィ ング、 Script
Manager コ ー ド 2
HKscs-B5-H1
1
HKscs-B5-V
ETen-B5-H, -V
韓国語
Hong Kong SCS (Supplementary Character Set)、 Big Five のキ ャ ラ ク タ セ ッ ト
と エ ン コ ーデ ィ ングに対する拡張
Microsoft コ ー ド ページ 950 (charset 136)、 Big Five キ ャ ラ ク タ セ ッ ト + ETen
拡張
ETenms-B5-H
ETenms-B5-V
ETen-B5-H と 同 じ だが、 半角英字を プ ロポーシ ョ ナル形に替えた も の
CNS-EUC-H, -V
UniKS-UCS2-H, -V
CNS 11643-1992 キ ャ ラ ク タ セ ッ ト 、 EUC-TW エ ン コ ーデ ィ ング
Adobe-Korea1 キ ャ ラ ク タ コ レ ク シ ョ ンの Unicode (UCS-2) エ ン コ ーデ ィ ン
グ
UniKS-UTF16-H, -V Adobe-Korea1 キ ャ ラ ク タ コ レ ク シ ョ ンの Unicode (UTF-16BE) エ ン コ ー
デ ィ ング
KSC-EUC-H, -V
KS X 1001:1992 キ ャ ラ ク タ セ ッ ト 、 EUC-KR エ ン コ ーデ ィ ング
KSCms-UHC-H
KSCms-UHC-V
Microsoft コ ー ド ページ 949 (charset 129)、 KS X 1001:1992 キ ャ ラ ク タ セ ッ ト
にハングル 8822 種を加えた もの、 Unified Hangul Code (UHC) エ ン コ ーデ ィ
ング
KSCms-UHC-HW-H
KSCms-UHC-HW-V
KSCms-UHC-H と 同 じ だが、 プ ロポーシ ョ ナル形英字を半角に替えた も の
KSCpc-EUC-H
Mac、 KS X 1001:1992 キ ャ ラ ク タ セ ッ ト + Mac OS KH 拡張 ・ Script Manager
コー ド 3
注 Unicode 対応の言語バイ ンデ ィ ングは、 Unicode CMap (UCS2 か UTF16) にのみ対応 し て
います。 それ以外の CMap を使 っ てはいけません (107 ページ 「4.4.2 Unicode 対応言語バ
イ ンデ ィ ングの文字列」 参照)。
標準 CMap に対す る日中韓テキス ト のエ ン コ ーデ ィ ン グ 要求 さ れた CMap に対 し て、
それに合 う よ う エン コ ー ド さ れたテ キ ス ト を与え る のは ク ラ イ ア ン ト 側の役割です。与え
ら れたテ キ ス ト が、 要求 さ れた CMap に従っ てい る か ど う かを、 PDFlib はチ ェ ッ ク し て、
選ばれた CMap に従っ ていない誤っ たテ キ ス ト 入力に対 し ては例外を発生 さ せます。
CMap の設定 定義済み CMap の 1 つを用いて日本語 ・ 中国語 ・ 韓国語 (日中韓) テ キ ス
ト を生成す る には、 PDFlib は対応す る CMap フ ァ イ ルを必要 と し ます。 入っ て く る テ キ ス
ト を処理 し て、 日中韓エン コ ーデ ィ ン グ を Unicode に対応づけ る ためです。 CMap フ ァ イ
ルは別パ ッ ケージで入手で き ます。 以下の よ う に イ ン ス ト ールする 必要があ り ます。
> Windows では CMap フ ァ イ ルは、 PDFlib の イ ン ス ト レーシ ョ ンデ ィ レ ク ト リ 内の
resource/cmap デ ィ レ ク ト リ に置いておけば、 自動的に見つけ ら れます。
> それ以外のシ ス テ ム では CMap フ ァ イ ルは、任意の好都合なデ ィ レ ク ト リ に置 く こ と が
で き 、 実行時に SearchPath を下記の よ う に設定する こ と で、 CMap フ ァ イ ルを手動で
設定す る 必要があ り ます。
p.set_parameter("SearchPath", "/パス/パス/resource/cmap");
日中韓 CMap フ ァ イ ルの検索先を設定す る 方式のかわ り に、適切な SearchPath 定義を含む
UPR 設定フ ァ イ ルを指す よ う PDFLIBRESOURCEFILE 環境変数を設定する こ と も で き ます。
104
第 4 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング
注 MVS では CMap フ ァ イルは、短い フ ァ イル名の CMap を持つ別パ ッ ケージか ら イ ン ス ト ー
ルする必要があ り ます。
カ ス タ ム日中韓 フ ォ ン ト に対す る コ ー ド ページ Windows では PDFlib は、 シ ス テ ムに イ
ン ス ト ール さ れ て い る すべて の コ ー ド ペー ジ に対応 し て い ま す。 それ以外の プ ラ ッ ト
フ ォームでは、表 4.4 に示す コ ー ド ページが使え ます。 こ れ ら の コ ー ド ページは内部的に、
対応す る CMap に対応づけ ら れます (例 : cp932 を 90ms-RKSJ-H/V に対応づけ)。 こ の対
応づけのために、 適切な CMap を設定す る 必要があ る のです (上述)。 textformat パ ラ メ
タ は auto に設定す る 必要があ り 、 そ し てテ キ ス ト は、 選んだ コ ー ド ページ と 互換な形式
で与え る 必要があ り ます。
表 4.4 日中韓 コ ー ド ページ一覧 (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
4.3 日本語 ・ 中国語 ・ 韓国語エ ン コ ーデ ィ ング
105
4.4 PDFlib の文字列処理
4.4.1 内容文字列 ・ ハ イパーテキス ト 文字列 ・ 名前文字列
PDF と オペレーテ ィ ン グ シ ス テ ムの要請に よ り 、PDFlib での文字列の処理方式は、 その文
字列の使い道に よ っ て異な り ます。 PDFlib API は、 以下の文字列型を定義 し て用いてい ま
す。 PDFlib API リ フ ァ レ ン ス では、 すべての関連す る パ ラ メ タ ・ オプシ ョ ンには、 内容文
字列 ・ ハ イ パーテ キ ス ト 文字列 ・ 名前文字列 と 記 し て あ り ます。
内容文字列 ・ ハ イ パーテ キ ス ト 文字列 ・ 名前文字列は、 Unicode と 8 ビ ッ ト エン コ ー
デ ィ ン グで使え ます。 非 Unicode の日中韓 CMap は、 Unicode 非互換の言語バ イ ンデ ィ ン
グでのみ使え ます。文字列処理の実際は言語バ イ ンデ ィ ン グに よ っ て異な り ますので、107
ページ 「4.4.2 Unicode 対応言語バ イ ンデ ィ ン グの文字列」 と 107 ページ 「4.4.3 Unicode 非
対応言語バ イ ンデ ィ ン グの文字列」 で説明 し ます。
内容文字列 内容文字列は、ユーザーが特定の フ ォ ン ト で選んだエン コ ーデ ィ ン グに従っ
てページ本体内容 (ページ記述) を作成す る ために用い ら れます。 PDFlib API リ フ ァ レ ン
ス の中で、 ページ内容関数におけ る text と い う 名前の関数引数はすべて こ の種類に属 し
ます。 内容文字列は特定フ ォ ン ト 内のグ リ フ に よ っ て表現 さ れますので、 使用可能な キ ャ
ラ ク タ の範囲はフ ォ ン ト / エン コ ーデ ィ ン グの組み合わせに依存 し ます。
例:
PDF_show( ) ・ PDF_fit_textline( ) ・ PDF_add_textflow( ) の text 引数。
ハ イパーテキス ト 文字列 ハ イ パーテ キ ス ト 文字列は、 し お り や注釈な ど の イ ン タ ラ ク
テ ィ ブ機能のために用い ら れ る も のであ り 、 関数の説明では明示的に 「ハイパーテキス ト
文字列」 と 記 し て あ り ます。 イ ン タ ラ ク テ ィ ブ機能のための関数の多 く の引数やオプシ ョ
ンが こ の種類に属すほか、 それ以外に も 若干 こ の種類に属す る も のがあ り ます。 表示で き
る キ ャ ラ ク タ の範囲は、 Acrobat で利用可能な フ ォ ン ト やオペ レ ーテ ィ ン グ シ ス テ ム と
いっ た外部要因に依存 し ます。
例:
PDF_add_table_cell( ) の fieldname オプシ ョ ン
PDF_define_layer( ) の name オプシ ョ ン
PDF_create_action( ) の destname オプシ ョ ン
PDF_create_bookmark( ) の text 引数
名前文字列 名前文字列は、 外部フ ァ イ ル名 ・ フ ォ ン ト 名 ・ ブ ロ ッ ク 名な ど のために用い
ら れ る も のであ り 、 関数の説明では 「名前文字列」 と 記 し て あ り ます。 ハ イ パーテ キ ス ト
文字列 と わずかに違い ますが、 その違いが現れ る のは Unicode 非対応の言語においてのみ
です。
例:
PDF_begin_document( ) ・ PDF_create_pvf( ) の filename 引数
PDF_load_font( ) の fontname 引数
PDF_load_iccprofile( ) の profilename 引数
フ ァ イ ル名は特殊な ケース です : オプシ ョ ン filenamehandling は、 PDFlib が API に与え ら
れた フ ァ イ ル名を ロ ーカルフ ァ イ ルシ ス テ ムで使え る も のへ変換する 方法を指定 し ます。
106
第 4 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング
4.4.2 Unicode 対応言語バ イ ン デ ィ ン グの文字列
開発環境が文字列デー タ 型に対応 し ていて、 かつ内部的に Unicode を用いてお り 、 そ し て
対応す る PDFlib 言語 ラ ッ パがその言語の Unicode 文字列に対応 し てい る 場合に、 そのバ
イ ンデ ィ ン グ を Unicode 対応 と 呼ぶ こ と に し ます。 下記の PDFlib 言語バ イ ンデ ィ ン グは
Unicode 対応です :
> C++
> COM
> .NET
> Java
> Python
> REALbasic
> RPG
> Tcl
こ う し た環境での文字列処理は単純です : 文字列はすべて自動的に、 ネ イ テ ィ ブな UTF16 形式の Unicode 文字列 と し て PDFlib カーネルに与え ら れます。 こ う し た言語の ラ ッ パ
は、 ク ラ イ ア ン ト か ら 与え ら れ る Unicode 文字列を正 し く 取 り 扱 う こ と がで き 、 ま た、 い
く つかの PDFlib のパ ラ メ タ を自動的に設定 し ます。 こ の こ と か ら 下記の結果が生 じ ます :
> 必要な変換を PDFlib 言語 ラ ッ パがすべて行い、 ク ラ イ ア ン ト か ら 与え ら れたハ イ パー
テ キ ス ト 文字列がつねに utf16 形式の unicode エン コーデ ィ ン グで PDFlib に供給 さ れ
る よ う 動作 し ます。
> つねにUTF-16 を言語環境がPDFlibに供給する ため、UTF-8はUnicode対応言語では使用
で き ません。 あ ら か じ め UTF-16 に変換す る 必要があ り ます。
> ページの内容には unicode エン コ ーデ ィ ン グ を用い る こ と が、 エン コ ーデ ィ ン グ を
Unicode 対応言語で取 り 扱 う う えで も っ と も 簡単な方法です。ただ し 8 ビ ッ ト エン コ ー
デ ィ ン グや、 記号フ ォ ン ト のシ ン グルバ イ ト テ キ ス ト も 、 使いた ければ使 う こ と がで
き ます。
> 日中韓フ ォ ン ト に非 Unicode CMap を用い る こ と は (103 ページ 「4.3 日本語 ・ 中国語 ・
韓国語エ ン コ ーデ ィ ン グ」 参照) 避けな ければな り ま せん。 なぜな ら 、 ラ ッ パがつね
に Unicode を PDFlib コ アに与え る か ら です。 Unicode CMap のみが利用可能です。
要す る に基本的には、 ク ラ イ ア ン ト は生の Unicode 文字列を PDFlib 関数に与え る こ と が
で き 、 その際に別途設定やパ ラ メ タ 設定は必要ない と い う こ と です。 関数の説明に書いて
あ る 、 ハ イ パーテ キ ス ト 文字列 と 名前文字列の違いは、 Unicode 対応言語バ イ ンデ ィ ン グ
では関係があ り ません。
Unicode 変換関数 文字列を Unicode 以外のエン コ ーデ ィ ン グで扱わなければな ら ない場
合は、 それを PDFlib に渡す前には Unicode に変換す る 必要があ り ます。 29 ページ 「2 章
PDFlib の言語バ イ ンデ ィ ン グ」 の言語ご と の節に、 代表的な言語バ イ ンデ ィ ン グで提供 さ
れてい る 有用な Unicode 文字列変換方法を詳 し く 説明 し て あ り ます。
4.4.3 Unicode 非対応言語バ イ ン デ ィ ン グの文字列
下記の PDFlib 言語バ イ ンデ ィ ン グは Unicode 非対応です :
> C (ネ イ テ ィ ブな文字列デー タ 型な し )
> PDFlib 7 と の互換のための レ ガシ C++ バ イ ンデ ィ ン グ (設定に関す る 情報は 36 ページ
「2.5 C++ バ イ ンデ ィ ン グ」 参照)
> Cobol (ネ イ テ ィ ブな文字列デー タ 型な し )
4.4 PDFlib の文字列処理
107
> Perl
> PHP
> Ruby
ネ イ テ ィ ブな文字列デー タ 型に対応 し ていない言語バ イ ンデ ィ ン グ (すなわち C ・ Cobol)
では、 UTF-16 文字列の長 さ を別途 length 引数で与え る 必要があ り ます。 こ れ ら の言語で
も Unicode テ キ ス ト は使用で き ますが、 各種の文字列の処理は以下の よ う に若干複雑にな
り ます。
内容文字列 内容文字列 と は、 ページ内容の作成に使われ る 文字列です。 こ の種の文字列
の解釈は、 PDF_load_font( ) の textformat 引数 (後述) と encoding 引数に よ っ て制御 さ れ
ます。 textformat=auto な ら ば ( こ れがデフ ォ ル ト )、 unicode ・ glyphid エン コーデ ィ ン グ
と UCS-2 ・ UTF-16 CMap に対 し ては utf16 形式が用い ら れます。 それ以外のすべてのエ
ン コ ーデ ィ ン グに対 し ては形式は bytes にな り ます。 ネ イ テ ィ ブな文字列デー タ 型を持た
ない言語 (上記一覧参照) では、 UTF-16 文字列の長 さ を length 引数で別途与え る 必要が
あ り ます。
ハ イパーテキス ト 文字列 文字列の解釈は hypertextformat ・ hypertextencoding パ ラ メ タ
(後に詳述) に よ っ て制御 さ れます。 hypertextformat=auto な ら ば ( こ れがデフ ォ ル ト )、
hypertextencoding=unicode の場合には utf16 形式が用い ら れ、 それ以外の場合には bytes
が用い ら れ ます。 ネ イ テ ィ ブな文字列デー タ 型を持た ない言語 (上記 リ ス ト 参照) では、
UTF-16 文字列の長 さ を length 引数で別途与え る 必要があ り ます。
名前文字列 名前文字列は、 ページ記述文字列 と はやや異な る 方式で解釈 さ れ ま す。 デ
フ ォ ル ト では名前文字列は host エン コ ーデ ィ ン グで解釈 さ れます。 し か し 、 先頭に UTF8 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 非対応の言語バ イ ン
デ ィ ン グでは、 API 関数に length 引数はないので、 名前文字列はかな ら ず UTF-8 形式で
与え る 必要があ り ます。 こ の場合、 Unicode の名前文字列を作成する には、 PDF_utf16_to_
utf8( ) ユーテ ィ リ テ ィ 関数を用いて UTF-8 を作成する こ と が可能です (後述)。
Unicode 変換関数 Unicode 非対応の言語バ イ ンデ ィ ン グでは、 PDFlib は変換関数 PDF_
utf16_to_utf8( ) ・ PDF_utf8_to_utf16( ) ・ PDF_utf32_to_utf16( ) を提供 し てい る ので、 それを
使っ て UTF-8 や UTF-16 の文字列を作成 し て、 PDFlib に渡す こ と がで き ます。
29 ページ 「2 章 PDFlib の言語バ イ ンデ ィ ン グ」 の言語ご と の節に、 代表的な言語バ イ
ンデ ィ ン グで提供 さ れてい る 有用な Unicode 文字列変換方法を詳 し く 説明 し て あ り ます。
内容 ・ ハ イパーテキス ト 文字列のテキス ト 形式 PDFlib の Unicode 文字列は、 UTF-8 ・
UTF-16 ・ UTF-32 のいずれかの形式で、 任意のバ イ ト 順序で与え る こ と がで き ます。 形式
の選択は、 textformat パ ラ メ タ でページ記述の全テ キ ス ト に対 し て、 hypertextformat パ
ラ メ タ で イ ン タ ラ ク テ ィ ブ要素群に対 し て制御する こ と がで き ます。 こ の両パ ラ メ タ で対
108
第 4 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング
応 し てい る 値を表 4.5 に示 し ます。 [hyper]textformat パ ラ メ タ のデフ ォ ル ト は auto です。
名前文字列群に対 し て同 じ 動作を強制す る には usehypertextencoding パ ラ メ タ を用い ま
す。 hypertextencoding パ ラ メ タ のデフ ォ ル ト は auto です。
表 4.5 textformat ・ hypertextformat パラ メ タ に対する値一覧
[hyper]textformat
説明
bytes
文字列の 1 バイ ト が 1 キ ャ ラ ク タ に対応 し ます。 これは主に 8 ビ ッ ト エ ン コ ーデ ィ ング と
記号フ ォ ン ト で有用です。 文字列の先頭に UTF-8 BOM があ る と きは、 評価 さ れたのち除去
さ れます。
utf8
文字列は UTF-8 形式であ る と 期待 さ れます。 不正な UTF-8 列があ っ た と きは、
glyphcheck=error な ら 例外が発生 し 、 そ う で なければ削除 さ れます。
ebcdicutf8
文字列は、 EBCDIC コ ー ド さ れた UTF-8 形式である と 期待 さ れます (iSeries ・ zSeries の
み)。
utf16
文字列は UTF-16 形式であ る と 期待 さ れます。 文字列の先頭に Unicode バイ ト 順序マー ク
(BOM) がある と きは、 評価 さ れたのち除去 さ れます。 BOM がない と きは、 その文字列は
マ シ ンのネ イ テ ィ ブ なバイ ト 順序であ る と 期待 さ れます (Intel x86 アーキテ ク チ ャ ではネ
イ テ ィ ブ なバイ ト 順序は リ ト ルエ ンデ ィ ア ン で、 一方 Sparc ・ PowerPC シ ス テムではビ ッ
グエ ンデ ィ ア ン)。
utf16be
文字列は UTF-16 形式で、 バイ ト 順序はビ ッ グエ ンデ ィ ア ン である と 期待 さ れます。 バイ
ト 順序マー ク について特別な扱いはあ り ません。
utf16le
文字列は UTF-16 形式で、 バイ ト 順序は リ ト ルエ ンデ ィ ア ン である と 期待 さ れます。 バイ
ト 順序マー ク について特別な扱いはあ り ません。
auto
内容文字列 : 8 ビ ッ ト エ ン コ ーデ ィ ング と 非 Unicode CMap に対 し ては bytes と 等価で、 ワ
イ ド キ ャ ラ ク タ 指定 (unicode か glyphid、 または UCS2 か UTF16 の CMap) に対 し ては
utf16 と 等価です。
ハイパーテキス ト 文字列 : BOM つ きの UTF-8 ・ UTF-16 文字列は検知 さ れます (C では
UTF-16 文字列はダ ブル null で終了する必要があ り ます)。 文字列の先頭に BOM がない と き
は、 8 ビ ッ ト エ ン コ ーデ ィ ン グの文字列 と し て、hypertextencoding パラ メ タ に従 っ て解釈
さ れます。
こ の設定に し ておけば、 Unicode を ネ イ テ ィ ブに用いないたいていの環境で、 適切な テキス
ト 解釈がで き る よ う にな り ます。
textformat の設定はあ ら ゆ る エン コ ーデ ィ ン グに対 し て効果があ り ますが、 と り わけ
unicode エン コ ーデ ィ ン グに対 し て有用です。 エン コ ーデ ィ ン グ と textformat 設定の さ ま
ざ ま な組み合わせに対す る テ キ ス ト 文字列の解釈を表 4.6 で説明 し ます。 内容文字列内の
コ ー ド ま たは Unicode 値が、 選ばれた フ ォ ン ト 内の適切な グ リ フ で表現で き ない場合につ
いては、 オプシ ョ ン glyphcheck が PDFlib の動作を制御 し ます (123 ページ 「グ リ フ置換」
参照)。
表 4.6 エ ン コ ーデ ィ ング と テキス ト 形式の関係
[hypertext]encoding
textformat=bytes
textformat=utf8 ・ utf16 ・ utf16be ・ utf16le
すべての文字列種別 :
auto
unicode と UCS2 か
UTF16 の CMap
100 ページ 「自動エ ン コ ーデ ィ ング」 の項を参照
8 ビ ッ ト コ ー ド は U+0000 ~
U+00FF の Unicode 値
選ばれた テキス ト 形式に従 っ てエ ン コ ー ド さ れた任意
の Unicode 値 1
4.4 PDFlib の文字列処理
109
表 4.6 エ ン コ ーデ ィ ング と テキス ト 形式の関係
[hypertext]encoding
textformat=bytes
textformat=utf8 ・ utf16 ・ utf16be ・ utf16le
その他全 CMap
(非 Unicode ベース)
選ばれた CMap に従 う 任意のシ
ングル ・ マルチバイ ト コ ー ド
PDFlib は例外を発生 さ せます
8 ビ ッ ト と builtin
8 ビ ッ ト コー ド
選ばれたエ ン コ ーデ ィ ン グに従 っ て Unicode 値を 8
ビ ッ ト コ ー ド に変換 し ます1。 内容文字列でない と き
や、 フ ォ ン ト 内に 8 ビ ッ ト エ ン コ ーデ ィ ングが見つか
ら ない と きは、 PDFlib は例外を発生 さ せます (8 ビ ッ ト
エ ン コ ーデ ィ ングが得ら れるのは Type 1 ・ Type 3 フ ォ
ン ト )。
glyphid
8 ビ ッ ト コ ー ド は 0 ~ 255 のグ リ Unicode 値はグ リ フ ID と し て解釈 さ れます 2
フ ID
内容文字列のみ :
1. その Unicode キ ャ ラ ク タ が フ ォ ン ト 内で得 ら れない と きは、 PDFlib は glyphcheck オ プ シ ョ ン に従 っ て、 例外を発生 さ せる
か、 ま たはそれを置き換え ます。
2. そのグ リ フ ID が フ ォ ン ト 内で見つか ら ない と きは、 PDFlib は glyphcheck 設定に従 っ て、 例外を発生 さ せるか、 ま たはそれ
を グ リ フ ID 0 に置き換え ます。
オ プ シ ョ ン リ ス ト 内の文字列 オプシ ョ ン リ ス ト 内の文字列については、 特別な注意が
必要です。 なぜな ら Unicode 非対応の言語バ イ ンデ ィ ン グでは、 それは UTF-16 形式の
Unicode 文字列 と し て表現で き ず、 バ イ ト 文字列 と し て し か表現で き ないか ら です。 こ の
理由か ら 、 Unicode のオプシ ョ ンに対 し ては UTF-8 が用い ら れます。 PDFlib はオプシ ョ ン
の先頭の BOM を見 る こ と で、 それを ど う 解釈する か を決定 し ます。 BOM を用いて文字列
の形式が決定 さ れ、 そ し て文字列の種類 (上述の内容文字列 ・ ハ イ パーテ キ ス ト 文字列 ・
名前文字列) を用いて適切なエン コ ーデ ィ ン グが決定 さ れます。 具体的には、 文字列オプ
シ ョ ンの解釈は下記の よ う に動作 し ます :
> オプシ ョ ンの先頭に UTF-8 BOM (0xEF 0xBB 0xBF) があ る な ら 、 それは UTF-8 と し て
解釈 さ れます。 EBCDIC ベース のシ ス テ ムの場合 : オプシ ョ ンの先頭に EBCDIC UTF8 BOM (0x57 0x8B 0xAB) があ る な ら 、 それは EBCDIC UTF-8 と し て解釈 さ れます。
BOM が見つか ら ない と き は、 文字列の解釈は文字列の種類に依存 し ます。
> 内容文字列は、 適用可能な encoding オプシ ョ ンか、 あ る いは対応す る フ ォ ン ト のエン
コ ーデ ィ ン グ (ど ち ら か存在す る ほ う ) に従っ て解釈 さ れます。
> ハ イ パーテ キ ス ト 文字列は、 hypertextencoding パ ラ メ タ かオプシ ョ ンに従っ て解釈 さ
れます。
> 名前文字列は、 usehypertextencoding=true な ら hypertext の設定に従っ て、 そ う でなけ
れば host エン コ ーデ ィ ン グで解釈 さ れます。
なお、 キ ャ ラ ク タ { } はオプシ ョ ン リ ス ト 内の文字列内では特別な扱いを要 し 、 文字列オ
プシ ョ ン内で用い る と き はキ ャ ラ ク タ \ を前につけ る 必要があ り ます。 こ の要請は、ShiftJIS の よ う な レ ガシエン コ ーデ ィ ン グについて も 効いて き ます。 すなわち、 バ イ ト 値 0x7B
と 0x7D が出現す る と き は必ず、 前に 0x5C をつけなければな り ません。 こ の理由か ら 、
UTF-8 を オプシ ョ ンで使 う こ と を推奨 し ます (Shift-JIS 等の レ ガシエン コ ーデ ィ ン グでな
く )。
110
第 4 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング
4.5 キ ャ ラ ク タ を指定
環境に よ っ てはプ ロ グ ラ マーは、 ソ ース コ ー ド を 8 ビ ッ ト エン コ ーデ ィ ン グ (winansi ・
macroman ・ ebcdic 等) で書 く こ と を要求 さ れます。 こ の よ う な環境で Unicode キ ャ ラ ク
タ を用いたい と き は、テ キ ス ト の全キ ャ ラ ク タ を マルチバ イ ト エン コ ーデ ィ ン グに変え る
こ と は許 さ れないため、 その一部の Unicode キ ャ ラ ク タ だけ を 8 ビ ッ ト エン コ ーデ ィ ン グ
の ま ま のテ キ ス ト の中へ入れ込む、 な ど と い う こ と がで き る のか と 悩んで し ま い ます。 こ
の状況か ら 開発者を救 う ため、PDFlib では、テ キ ス ト を表す補助手段がい く つか使え ます。
4.5.1 エ ス ケープ シーケ ン ス
PDFlib は、 エスケープ シーケ ン ス ( こ れは実際には誤称です : バ ッ ク ス ラ ッ シ ュ置換 と い
う 用語のほ う が よ いで し ょ う ) と い う し く みを通 じ てテ キ ス ト 文字列内に任意の値を簡単
に入れ込め る 方式に対応 し てい ます。 た と えば、 テ キ ス ト ブ ロ ッ ク のデフ ォ ル ト テ キ ス ト
内で \t シーケ ン ス を使えば、 直接キーボー ド 入力では無理か も し れない タ ブキ ャ ラ ク タ
が入れ ら れます。 同様にエ ス ケープシーケ ン ス は、 記号フ ォ ン ト におけ る コ ー ド を表すに
も 便利です し 、エ ス ケープシーケ ン ス を持たない言語バ イ ンデ ィ ン グにおいては リ テ ラ ル
文字列を あ ら わすに も 便利です。
エ ス ケープシーケ ン ス は、 シーケ ン ス を 1 個のバ イ ト 値へ置換す る 命令です。 シーケ
ン ス は、 文字列のカ レ ン ト エ ン コ ーデ ィ ン グ内のバ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ 「\」 に対
す る コ ー ド で開始 し ます。 エ ス ケープシーケ ン ス の置換か ら 得 ら れ る バ イ ト 値を表 4.7 に
示 し ます。 ASCII と EBCDIC のプ ラ ッ ト フ ォーム では違 う も の も あ り ます。 エ ス ケープ
シーケ ン ス で表せ る のは、 0 ~ 255 のバ イ ト 値だけです。
い く つかのプ ロ グ ラ ミ ン グ言語 と 異な り 、 PDFlib のエ ス ケープシーケ ン ス はその種類
に応 じ てつねに固定長 と な り ます。ですのでシーケ ン ス の終了キ ャ ラ ク タ は必要あ り ませ
ん。
表 4.7 エ スケープ シーケ ン ス と バイ ト 値一覧
シーケ ン ス
長さ
Mac ・ Windows ・
Unix
EBCDIC プ ラ ッ ト
フ ォ ーム
広 く 知ら れる解釈
\f
2
0C
0C
フ ォ ーム フ ィ ー ド
\n
2
0A
15/25
ラインフ ィード
\r
2
0D
0D
キ ャ リ ッ ジ リ タ ーン
\t
2
09
05
水平 タ ブ
\v
2
0B
0B
ラインタブ
\\
2
5C
E0
バッ クスラ ッ シュ
\xNN
4
バイ ト 値を表す 16 進 2 桁。 例 : \xFF
\NNN
4
バイ ト 値を表す 8 進 3 桁。 例 : \377
エ ス ケープシーケ ン ス はデフ ォ ル ト では置換 さ れ ません。 エ ス ケープシーケ ン ス を文
字列において使いたいな ら 、 escapesequence パ ラ メ タ かオプシ ョ ン を明示的に true に設
定す る 必要があ り ます :
p.set_parameter("escapesequence", "true");
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの fonts/escape_sequences ト ピ ッ ク にあ り ます。
4.5 キ ャ ラ ク タ を指定
111
エ ス ケープシーケ ン ス はすべての内容文字列 ・ ハ イ パーテ キ ス ト 文字列 ・ 名前文字列内
で、BOM 検出の後に、 し か し タ ーゲ ッ ト 形式への変換の前に、評価 さ れます。textformat=
utf16le か utf16be な ら エ ス ケープシーケ ン スは、 選ばれた形式に従っ て 2 バ イ ト 値 と し て
表す必要があ り ます。 エ ス ケープシーケ ン ス内の各キ ャ ラ ク タ は 2 バ イ ト で表現 さ れ、 そ
の う ち 1 バ イ ト は値 0 にな り ます。 textformat=utf8 な ら 、 生成コ ー ド は UTF-8 に変換 さ
れません。
エ ス ケープシーケ ン ス が解決で き ない と き には (\x の後の 16 進数が不正等)、 例外が
発生 し ます。 内容文字列については こ の動作は、 glyphcheck ・ errorpolicy 設定で制御 さ れ
ます。
エ ス ケープシーケ ン ス を有効に し てい る と き は、 バ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ を含む
Windows のパ ス名に注意 し て く だ さ い。
4.5.2 文字参照
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの fonts/character_references ト ピ ッ ク にあ り ま
す。
文字参照は、 置換シーケ ン ス を Unicode 値で置換す る 命令です。 参照シーケ ン ス は、 カ レ
ン ト エン コ ーデ ィ ン グ内のア ンパサン ド キ ャ ラ ク タ 「&」 の コ ー ド で開始 し 、 セ ミ コ ロ ン
キ ャ ラ ク タ 「;」 の コ ー ド で終了 し ます。 タ ーゲ ッ ト Unicode 値を表現す る ためにい く つか
の方式が利用可能です :
HTML 文字参照 PDFlib は、 HTML 4.0 で定義 さ れてい る すべての文字実体参照に対応 し
てい ます。 数値文字参照は 10 進 ・ 16 進記法で与え る こ と がで き ます。 HTML 文字参照の
全一覧は下記の場所にあ り ます :
www.w3.org/TR/REC-html40/charset.html#h-5.3
例:
&shy;
&euro;
&lt;
&gt;
&amp;
&Alpha;
U+00AD
U+00AD
U+00AD
U+00AD
U+00AD
U+0391
ソフトハイフン
ユーログリフ (実体名)
小なり記号
大なり記号
アンパサンド記号
ギリシャ文字Α
数値文字参照 Unicode キ ャ ラ ク タ に対す る 数値文字参照 も HTML 4.0 で定義 さ れてい ま
す。 こ れはハ ッ シ ュ キ ャ ラ ク タ 「#」 と 10 進ま たは 16 進の数値を必要 と し 、 16 進数値の
は小文字か大文字の 「X」 キ ャ ラ ク タ を頭につけ ます。 例 :
&#173;
&#xAD;
&#229;
&#xE5;
&#Xe5;
&#x20AC;
&#8364;
U+00AD
U+00AD
U+00AD
U+00E5
U+00E5
U+20AC
U+20AC
ソフトハイフン
ソフトハイフン
文字aの上に小さな丸 (10進)
文字aの上に小さな丸 (16進、小文字x)
文字aの上に小さな丸 (16進、大文字X)
ユーログリフ (16進)
ユーログリフ (10進)
注 128 ~ 159 (10 進) すなわち 0x80 ~ 0x9F (16 進) のコ ー ド 点は、 winansi コ ー ド 点を参
照 し ません。 Unicode では こ れ らは、 印刷可能キ ャ ラ ク タ でな く 制御キ ャ ラ ク タ を参照 し
ます。
112
第 4 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング
PDFlib 独自の実体名 PDFlib では、 下記のグループの Unicode 制御キ ャ ラ ク タ に対 し て、
カ ス タ ムの文字実体参照を使 う こ と がで き ます :
> 表 6.4 に挙げ る デフ ォ ル ト シ ェーピ ン グ動作を上書 き す る 制御キ ャ ラ ク タ 群。
> 表 6.5 に挙げ る デフ ォ ル ト 双方向組版を上書 き す る 制御キ ャ ラ ク タ 群。
> 表 8.1 に挙げ る テ キ ス ト フ ロ ーの改行 と 組版のための制御キ ャ ラ ク タ 群。
例:
&linefeed;
&hortab;
&ZWNJ;
U+000A ラインフィード制御キャラクタ
U+0009 水平タブ
U+200C ゼロ幅非接合子
グ リ フ 名参照 グ リ フ名は下記の情報源か ら 導かれます :
> 代表的な グ リ フ名は内蔵 リ ス ト 内で検索 さ れます
> フ ォ ン ト 独自のグ リ フ名はカ レ ン ト フ ォ ン ト 内で検索 さ れ ます。 こ の種類の文字参照
は必ずフ ォ ン ト を必要 と す る ので、 内容文字列でのみ動作 し ます。
グ リ フ名参照を同定す る ために、 実際の名前はア ンパサン ド キ ャ ラ ク タ 「&」 の後に ピ リ
オ ド キ ャ ラ ク タ 「.」 を必要 と し ます。 例 :
&.three;
&.mapleleaf;
&.T.swash;
U+0033 数字3の代表的グリフ名
(PUA Unicode値)Cartaフォントにおけるカスタムグリフ名
(PUA Unicode値)2番目のピリオドキャラクタはグリフ名の一部です
グ リ フ名に よ る 文字参照は下記のシナ リ オで有用です :
> フ ォ ン ト 独自グ リ フ名に よ る 文字参照は、 内容文字列内で異体字 (ス ウ ォ ッ シ ュ キ ャ
ラ ク タ 等) や、 特定の Unicode セマ ン テ ィ ク ス を持たないグ リ フ (記号 ・ ア イ コ ン ・ 装
飾) を選ぶのに有用です。 ただ し 、 等幅数字をは じ め と す る 多 く の機能は、 OpenType
機能で も っ と 簡単に実装で き ます (154 ページ 「6.3 OpenType レ イ ア ウ ト 機能」 参照)。
> Adobe グ リ フ リ ス ト 内の名前 (uniXXXX ・ u1XXXX の形の も の も )、 お よ び特定の共通の
「名前誤 り 」 グ リ フ名は、 内容文字列 と ハ イ パーテ キ ス ト 文字列でつねに受け入れ ら れ
ます。
バ イ ト 値参照 数値を文字参照で与え る こ と も で き ます。こ れは記号フ ォ ン ト 内のグ リ フ
を指定す る のに有用で し ょ う 。 こ の方式では、 ハ ッ シ ュ キ ャ ラ ク タ 「#」 を加えた 10 進ま
たは 16 進数が必要です。 こ こ で 16 進数は小文字か大文字の 「X」 キ ャ ラ ク タ を頭に付け
ます。 例 (Wingdings フ ォ ン ト を前提) :
&.#x9F;
&.#159;
Wingdingsフォントのビュレット記号
Wingdingsフォントのビュレット記号
文字参照の利用 文字参照はデフ ォ ル ト では置換 さ れませんので、内容文字列内で文字参
照を使 う には、 charref パ ラ メ タ ま たはオプシ ョ ン を明示的に true に設定す る 必要があ り
ます。 例 :
p.set_parameter("charref", "true");
font = p.load_font("Helvetica", "winansi", "");
if (font == -1) { ... }
p.setfont(font, 24);
p.show_xy("Price: 500&euro;", 50, 500);
文字参照を使 う う えでのその他の注意点を挙げます :
4.5 キ ャ ラ ク タ を指定
113
> 文字参照は、 内容文字列 ・ ハ イ パーテ キ ス ト 文字列 ・ 名前文字列のいずれで も 使え ま
す。 例外 と し て、 フ ォ ン ト 独自グ リ フ名参照は上述の よ う に内容文字列でのみ動作 し
ます。
> 文字参照はbuiltin エン コ ーデ ィ ン グのテ キ ス ト 内では置換 さ れません。し か し 、unicode
エン コ ーデ ィ ン グ を用い る こ と に よ っ て記号フ ォ ン ト に対 し て文字参照を使 う こ と は
で き ます。
> 文字参照はオプシ ョ ン リ ス ト 内では置換 さ れません。 ただ し 、 Unichar デー タ 型のオプ
シ ョ ン内では認識 さ れます。 こ の場合、 「&」 ・ 「;」 修飾は外す必要があ り ます。 こ の認
識はつねに有効であ り 、 charref パ ラ メ タ ・ オプシ ョ ンには従い ません。
> Unicode 非対応言語バ イ ンデ ィ ン グでは、 textformat=utf16 ・ utf16be ・ utf16le の と き は
文字参照は 2 バ イ ト 値で表す必要があ り ます。encoding=unicode かつ textformat=bytes
の と き は文字参照は ASCII で表す必要があ り ます (EBCDIC ベース のプ ラ ッ ト フ ォー
ム で も )。
> 文字参照が解決で き ない と き (&# の後に無効な 10 進数があ る と き や、& の後に未知の
実 体 名 が あ る と き 等) は 例 外 が 発 生 し ま す。 内 容 文 字 列 に つ い て は こ の 動 作 は
glyphcheck ・ errorpolicy 設定で制御 さ れます。 glyphcheck=none の場合は、 参照シーケ
ン ス がその ま ま生成出力に現れます。
114
第 4 章 : Unicode と レ ガシ エ ン コ ーデ ィ ング
5 フ ォ ン ト 処理
5.1 さ ま ざ ま な フ ォ ン ト 形式
5.1.1 TrueType フ ォ ン ト
さ ま ざ ま な TrueType フ ォ ン ト 形式 PDFlib はベ ク ト ルベー ス の TrueType
フ ォ ン ト には対応 し てい ますが、 ビ ッ ト マ ッ プベース の TrueType フ ォ ン ト に
は対応 し てい ません。 TrueType フ ォ ン ト フ ァ イ ルは自己充足 し てい ます。 す
なわ ち 1 個の フ ァ イ ルの中に必要な情報がすべて入っ てい ま す。 PDFlib は
TrueType フ ォ ン ト について下記の フ ァ イ ル形式に対応 し てい ます :
> Windows の TrueType フ ォ ン ト (*.ttf)。 欧文 ・ 記号 ・ 日中韓フ ォ ン ト を含みます。
> TrueType コ レ ク シ ョ ン(*.ttc)。1 つの フ ァ イ ルの中に複数の フ ァ イ ルが入っ
てい ます。 TTC フ ァ イ ルは通常、 日中韓フ ォ ン ト を グループ化す る ために
用い ら れますが、 Apple は、 1 つの欧文フ ォ ン ト の複数の メ ンバを 1 個の
フ ァ イ ルにパ ッ ケージす る のに も こ れを用いてい ます。
> エン ド ユーザー定義キ ャ ラ ク タ (EUDC) フ ォ ン ト (*.tte) 。 Microsoft の
eudcedit.exe ツールで作 ら れます。
> Mac 上では、シ ス テ ムに イ ン ス ト ール さ れた TrueType フ ォ ン ト (.dfont を含めて) はす
べて PDFlib で も 使え ます。
TrueType フ ォ ン ト の名前 フ ォ ン ト フ ァ イ ルを扱 う 際には、 任意の別名を用い る こ と が
で き ます (128 ページ 「フ ォ ン ト デー タ の情報源」 参照)。 生成 さ れた PDF では、 TrueType
フ ォ ン ト の名前が PDFlib (や Windows) で用いていた名前 と 異な る こ と があ り ます。 こ れ
は正常であ り 、 PDF は TrueType の PostScript 名を用いてい る と い う 事実に よ る も のです。
PostScript 名は本当の TrueType と は異な り ます(例:TimesNewRomanPSMT に対 し て Times
New Roman)。
5.1.2 OpenType フ ォ ン ト
OpenType フ ォ ン ト 形式は、 PostScript と TrueType 技術を結合 し た も のです。
こ れは TrueType フ ァ イ ル形式の拡張 と し て実装 さ れてお り 、 統一形式を提供
し ます。 OpenType フ ォ ン ト は、 合字やス ウ ォ ッ シ ュ キ ャ ラ ク タ 等、 テ キ ス ト
出力の改善に利用で き る オプシ ョ ナルなテーブル (154 ページ 「6.3 OpenType
レ イ ア ウ ト 機能」 参照) のほか、 複雑用字系シ ェ ーピ ン グのためのテーブルを
含む こ と も で き ます (161 ページ 「6.4 複雑用字系出力」 参照)。
OpenType フ ォ ン ト は、すべてのプ ラ ッ ト フ ォーム上で動作す る 単一の コ ン テナ形式を
提供 し てい ますが、 OpenType には下記の よ う に さ ま ざ ま な種類があ り 、 こ れが混乱の元
にな る こ と も あ り ますので、 それを理解 し てお く こ と も 有用で し ょ う :
> ア ウ ト ラ イ ン形式:OpenType フ ォ ン ト は、TrueType と PostScript のいずれをベース と し
た グ リ フ記述 も 内容 と し て持つ こ と がで き ま す。 PostScript ベー ス のほ う は Compact
Font Format (CFF) や Type 2 と も 呼ばれ、 たいてい *.otf 接尾辞をつけて用い ら れま
す。 Windows Explorer は OpenType フ ォ ン ト をつねに 「O」 ロ ゴで表示 し ます。
> TrueType フ ォ ン ト と 、TrueType ア ウ ト ラ イ ン を持っ た OpenType フ ォ ン ト と は、と も に
*.ttf 接尾辞を用いてい る 可能性があ る ため、 容易には見分けがつ き ません。 こ の識別
5.1 さ ま ざ ま な フ ォ ン ト 形式
115
の難 し さ か ら 、 Windows Explorer は右記の基準で動作 し ます : .ttf フ ォ ン ト が電子署名
を含んでい る な ら ば、 それは 「O」 ロ ゴ で表示 さ れ、 そ う でな ければそれは 「TT」 ロ
ゴ で表示 さ れます。 し か し 、 電子署名は OpenType フ ォ ン ト において必須なわけでは
あ り ませんので、 こ れはプ レーン な旧来の TrueType フ ォ ン ト と OpenType フ ォ ン ト と
を見分け る 有用な基準 と し ては利用で き ません。
> CID (キ ャ ラ ク タ ID) アーキ テ ク チ ャ が日中韓フ ォ ン ト に対 し て用い ら れてい ます。 現
代の CID フ ォ ン ト は、 PostScript ア ウ ト ラ イ ン を持つ OpenType *.otf フ ォ ン ト と し て
パ ッ ケージ さ れてい ます。 実用的な観点か ら は、 こ れはプ レーン な OpenType フ ォ ン
ト と 見分けがつ き ません。 Windows Explorer は OpenType CID フ ォ ン ト をつねに 「O」
ロ ゴ で表示 し ます。
フ ァ イ ル名の接尾辞 も 、 Windows Explorer に よ っ て 表示 さ れ る ロ ゴ も 、 フ ォ ン ト 内に
OpenType レ イ ア ウ ト 機能があ る か ど う かについては何 も 語 ら ない こ と に留意 し て く だ さ
い。 詳 し く は 154 ページ 「6.3 OpenType レ イ ア ウ ト 機能」 を参照 し て く だ さ い。
5.1.3 PostScript Type 1 フ ォ ン ト
PostScript ア ウ ト ラ イ ン ・ メ ト リ ッ ク フ ァ イル形式 PostScript Type 1 フ ォ ン
ト はかな ら ず 2 つの部分に分かれてい ます。 すなわちア ウ ト ラ イ ンデー タ 本体
と メ ト リ ッ ク 情報です。PDFlib は、PostScript Type 1 のあ ら ゆ る プ ラ ッ ト フ ォー
ム上での ア ウ ト ラ イ ンデー タ と メ ト リ ッ ク デー タ のた めの下記の フ ァ イ ル形
式に対応 し てい ます :
> プ ラ ッ ト フ ォーム非依存な AFM (Adobe Font Metrics) 形式 と 、 Windows 固有の PFM
(Printer Font Metrics) フ ォ ン ト 形式。
> プ ラ ッ ト フ ォーム独立な PFA (Printer Font ASCII) 形式 と 、Windows 独自の PFB (Printer
Font Binary) 形式。 ど ち ら も PostScript Type 1 形式の フ ォ ン ト ア ウ ト ラ イ ン情報用の
形式です (「ATM フ ォ ン ト 」 と い う こ と も あ り ます)。
> Mac上では、リ ソ ース を利用 し たPostScript Type 1フ ォ ン ト 、すなわちLWFN(LaserWriter
Font) ア ウ ト ラ イ ン フ ォ ン ト に も 対応 し てい ます。 こ の種の フ ォ ン ト にはフ ォ ン ト スー
ツ ケース (FOND リ ソ ース。 FFIL と も い う ) がついてお り 、 その中に メ ト リ ッ ク デー
タ が入っ てい ま す (ス ク リ ーン フ ォ ン ト も 入っ てい ますが PDFlib はそれは無視 し ま
す)。
> PostScript ホ ス ト フ ォ ン ト を扱 う 際には、 LWFN はその フ ォ ン ト スーツ ケース と 同 じ
デ ィ レ ク ト リ に置かれてい る 必要があ り 、 かつ 5+3+3 規則に従っ て命名 さ れてい る 必
要があ り ます。
PostScript フ ォ ン ト の名前 フ ォ ン ト フ ァ イ ルを扱 う 際には、任意の別名を利用で き ます
(128 ページ 「フ ォ ン ト デー タ の情報源」 参照)。 フ ォ ン ト の内部名を知 り たい と き 、 それ
を取得で き る 方法はい く つかあ り ます。
> フ ォ ン ト ア ウ ト ラ イ ン フ ァ イ ル (*.pfa か *.pfb) を開いて /FontName 項目を見つけてそ
の右の文字列を見ます。最初のキ ャ ラ ク タ (\) を無視 し た残 り のキ ャ ラ ク タ を フ ォ ン ト
名 と し て使い ます。
> Windows と Mac OS X 以上では、 フ ォ ン ト フ ァ イ ルを ダブル ク リ ッ ク す る と 、 その フ ォ
ン ト のサンプルが現れて フ ォ ン ト の PostScript 名 も 表示 さ れます。
> AFM メ ト リ ッ ク フ ァ イ ルを開いて FontName項目を見つけてその右の文字列を見ます。
116
第 5 章 : フ ォ ン ト 処理
注 PostScript 名は Windows のフ ォ ン ト メ ニ ュ ー名 と はかな り 違 う こ と があ り ます。た と えば
「AvantGarde-Demi」 (PostScript 名) は 「AvantGarde, Bold」 (Windows のフ ォ ン ト メ ニ ュ ー
名) と な り ます。
5.1.4 SING フ ォ ン ト (グ リ フ レ ッ ト )
SING フ ォ ン ト (Smart Independent Glyphlets) は、 技術的には OpenType フ ァ イ ル形式の
拡張です。 SING フ ォ ン ト は、 日中韓テ キ ス ト におけ る 外字問題、 すなわち Unicode や広
く 用い ら れてい る 日中韓 レ ガ シエ ン コ ーデ ィ ン グ のいずれに も エ ン コ ー ド さ れていない
カ ス タ ム な グ リ フ に対す る 解決策 と し て開発 さ れた も のです。 SING アーキ テ ク チ ャ に関
す る 詳細を知 る には、Adobe Glyphlet Development Kit (GDK) for SING Gaiji Architecture を下
記の場所か ら ダ ウ ン ロ ー ド す る こ と がで き ます :
www.adobe.com/devnet/opentype/gdk/topic.html
SING フ ォ ン ト はたいてい、 1 個のグ リ フ だけ を内容 と し て持ち ます (あわせて縦書 き 字体
も 含む こ と も あ り ます)。 こ の 「 メ イ ン」 グ リ フ の Unicode 値は、 PDFlib で取得す る こ と
がで き 、 それにはグ リ フ ID を要求 し 、 ついで こ のグ リ フ ID に対す る Unicode 値を要求 し
ます :
maingid = (int) p.info_font(font, "maingid", "");
uv = (int) p.info_font(font, "unicode", "gid=" + maingid);
SING フ ォ ン ト を、 PDF_load_font( ) の fallbackfonts オプシ ョ ンの forcechars オプシ ョ ンの
gaiji サブオプシ ョ ン を用いて予備フ ォ ン ト と し て利用す る こ と を推奨 し ま す。 詳 し く は
172 ページ 「6.5.3 EUDC ・ SING フ ォ ン ト で外字キ ャ ラ ク タ を利用」 を参照 し て く だ さ い。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの fonts/starter_fallback ト ピ ッ ク にあ り ます。
廉価な FontLab SigMaker ツールを利用 し て、既存の画像や他フ ォ ン ト 内のグ リ フ をベース
に SING フ ォ ン ト を生成す る こ と も で き ます :
www.fontlab.com/font-utility/sigmaker/
5.1.5 Type 3 フ ォ ン ト
他のすべての フ ォ ン ト 形式 と は異な り 、Type 3 フ ォ ン ト はデ ィ ス ク フ ァ イ ルか ら 取得 さ れ
る のではな く 、 標準 PDFlib グ ラ フ ィ ッ ク 関数群を用いて実行時に定義 さ れ る 必要があ り
ます。 Type 3 フ ォ ン ト は下記の用途で有用です :
> ビ ッ ト マ ッ プフ ォ ン ト
> ロ ゴ等のカ ス タ ム グ ラ フ ィ ッ ク を、 シ ンプルなテ キ ス ト 操作命令で簡単に印刷可能
> いずれの定義済みの フ ォ ン ト やエ ン コ ーデ ィ ン グ で も 入手で き な い日本語の外字
(ユーザー定義キ ャ ラ ク タ )。
Type 3 フ ォ ン ト の定義の中では、 PDFlib のベ ク ト ルグ ラ フ ィ ッ ク ・ ラ ス タ 画像の機能が
すべて使え ます し 、 テ キ ス ト 出力の機能で さ えすべて使 う こ と がで き る ので、 Type 3 フ ォ
ン ト のキ ャ ラ ク タ の中身に関 し ては制約は何 も あ り ません。 PDF 取 り 込み ラ イ ブ ラ リ PDI
と 組み合わせれば、 さ ま ざ ま な描画の組み合わせを 1 枚の PDF のページ と し て取 り 込ん
で、 それを用いて Type 3 フ ォ ン ト のキ ャ ラ ク タ を定義す る こ と さ え可能です。 し か し 、
Type 3 フ ォ ン ト が最 も し ば し ば利用 さ れ る のはビ ッ ト マ ッ プグ リ フ のためであ り 、それは
こ れが PDF 内でグ リ フ に ラ ス タ 画像を使え る 唯一の フ ォ ン ト 形式だか ら です。
5.1 さ ま ざ ま な フ ォ ン ト 形式
117
Type 3 フ ォ ン ト はページの外で完全に定義す る 必要があ り ます ( よ り 厳密にいえば、 フ ォ
ン ト 定義は文書ス コ ープ中で行われなければな り ません)。 以下の作成例は、 単純な Type
3 フ ォ ン ト を定義 し てい ます。
p.begin_font("Fuzzyfont", 0.001, 0.0, 0.0, 0.001, 0.0, 0.0, "");
p.begin_glyph("circle", 1000, 0, 0, 1000, 1000);
p.arc(500, 500, 500, 0, 360);
p.fill();
p.end_glyph();
p.begin_glyph("ring", 400, 0, 0, 400, 400);
p.arc(200, 200, 200, 0, 360);
p.stroke();
p.end_glyph();
p.end_font();
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの
fonts/starter_type3font ・ fonts/type3_
bitmaptext ・ fonts/type3_rasterlogo ・ fonts/type3_vectorlogo ト ピ ッ ク にあ り ます。
こ う し た フ ォ ン ト は PDFlib の中に登録 さ れ、 その名前は PDF_load_font( ) に与え る こ と が
で き ます。 その際、 その Type 3 フ ォ ン ト の中のグ リ フ の名前を含むエン コ ーデ ィ ン グ も
一緒に指定す る 必要があ り ます。Type 3 フ ォ ン ト を扱 う 時は以下の こ と に留意 し て く だ さ
い。
> パ タ ーンやテ ン プ レー ト での場合 と 同様、 グ リ フ定義の中で画像を開 く こ と はで き ま
せん。 ただ し 、 グ リ フ定義開始前に開いておいた画像を グ リ フ定義内で貼 り 付け る こ
と は可能です。 あ る いは、 小 さ な ビ ッ ト マ ッ プの場合な ら イ ン ラ イ ン画像を用いて こ
の制約を克服す る こ と も で き ます。
> PDF 読み込み機能を持つ さ ま ざ ま な ソ フ ト ウ ェ アが持つ制約のため、 テ キ ス ト 出力内
で使われ る キ ャ ラ ク タ は、 すべて実際に フ ォ ン ト 中で定義 さ れていなければな り ませ
ん。具体的には、文字 コ ー ド x を任意のテ キ ス ト 出力関数で表示 し たい場合、 エン コ ー
デ ィ ン グの位置 x に glyphname があ る な ら ば、 その glyphname は PDF_begin_glyph( )
で定義 さ れていなければな り ません。
> PDF 読み込み機能を持つ ソ フ ト ウ ェ アのなかには、 対応す る グ リ フ名が フ ォ ン ト 中で
定義 さ れていない コ ー ド が用い ら れ る 場合、 .notdef と い う 名前のグ リ フ を必要 と す る
も のがあ り ます。 Acrobat 8 は、 .notdef グ リ フ がない と ク ラ ッ シ ュ す る こ と さ え あ り ま
す。.notdef グ リ フ があ り さ えすれば よ く 、 その中身は空のグ リ フ定義でか ま い ません。
> 普通の ビ ッ ト マ ッ プデー タ を用いて キ ャ ラ ク タ を定義す る 場合、 ビ ッ ト マ ッ プ中の使
われていない ピ ク セルは、 背景にかかわ ら ず白 く 印刷 さ れ ます。 こ れを避けて、 元の
背景色が透けて見え る よ う にす る には、ビ ッ ト マ ッ プ画像を作成する 際に mask パ ラ メ
タ を用い ます。
> 画像に対 し て interpolate オプシ ョ ン を指示す る と 、Type 3 ビ ッ ト マ ッ プ フ ォ ン ト の画面
上や印刷時の見栄え を向上 さ せ る のに有用です。
> Type 3 フ ォ ン ト には、 アセ ン ダやデ ィ セ ン ダな ど、 タ イ ポグ ラ フ ィ 的なプ ロ パテ ィ は
一切含まれてい ません。 し か し 、 PDF_load_font( ) のそれぞれ対応す る オプシ ョ ン を使
えば設定で き ます。
118
第 5 章 : フ ォ ン ト 処理
5.2 Unicode のキ ャ ラ ク タ と グ リ フ
5.2.1 グ リ フ ID
フ ォ ン ト はグ リ フ の集合であ り 、 各グ リ フ がその輪郭に よ っ て定義 さ れてい ます。 PDFlib
は、 フ ォ ン ト 内の各グ リ フ に番号を割 り 当て ます。 こ の番号を グ リ フ ID ま たは GID と い
い ま す。 GID 0 (ゼ ロ ) は、 すべての フ ォ ン ト 形式において .notdef グ リ フ を指 し ま す。
.notdef グ リ フ の見た目はフ ォ ン ト 形式やベン ダに よ っ て異な り ますが、 よ く あ る 実装は
空白グ リ フ か白四角か四角バ ッ テ ンです。 最高の GID は、 その フ ォ ン ト 内のグ リ フ数 よ
り 1 少ない数であ り 、 こ れは PDF_info_font( ) の numglyphs キーワー ド で取得す る こ と が
で き ます。
グ リ フ ID の割 り 当て方はフ ォ ン ト 形式に よ っ て異な り ます :
> TrueType・OpenType フ ォ ン ト はすでに内部 GID を含んでい ますので、PDFlib は こ の GID
を用い ます。
> CID キー付 き OpenType 日中韓フ ォ ン ト では、 CID が GID と し て用い ら れます。
> それ以外の フ ォ ン ト 種別については、 PDFlib がグ リ フ に、 フ ォ ン ト 内のそのア ウ ト ラ
イ ン記述の順番に従っ て付番 し ます。
PDFlib では、 Unicode な ど のエン コ ーデ ィ ン グではな く GID でグ リ フ を選ぶ こ と も で き ま
す (127 ページ 「グ リ フ ID エン コ ーデ ィ ン グ」 参照)。 直接 GID 指定は、 グ リ フ数を取得
し て全グ リ フ を なめ る こ と で フ ォ ン ト の概観表を印刷す る 等、 特殊な応用でのみ有用で
す。
5.2.2 グ リ フ に対す る Unicode マ ッ ピ ン グ
Unicode マ ッ ピ ン グ PDFlib は、 各 GID に一意な Unicode 値を割 り 当て ます。 こ のマ ッ
ピ ン グ処理はフ ォ ン ト 形式に よ っ て異な り ますので、対応 し てい る フ ォ ン ト 種別ご と に以
下の各項で解説 し てい ます。 各 GID には一意な Unicode 値が割 り 当て ら れますが、 その逆
は必ず し も 真ではあ り ません。 すなわち、 あ る 1 つのグ リ フ が複数の Unicode 値を表す こ
と も あ り ます。 多 く の TrueType ・ OpenType フ ォ ン ト で よ く あ る 例は、 空グ リ フ が U+0020
の空白 と U+00A0 の ノ ーブ レー ク スペース の両方を表す場合や、1 つのグ リ フ が U+2126 の
オーム記号 と U+03A9 のギ リ シ ャ 文字 Ω を表す場合です。 複数の Unicode 値が フ ォ ン ト
内の同一 の グ リ フ を 指 し て い る 場合、 PDFlib は そ の フ ォ ン ト 内で 最初に見つか っ た
Unicode 値を割 り 当て ます。
マ ッ プ な し グ リ フ と 私用領域 (PUA) 場 合 に よ っ て は、 あ る 特 定 の グ リ フ に 対 す る
Unicode 値を フ ォ ン ト が提供 し ていない こ と があ り ます。 こ の場合には、PDFlib は Unicode
私用領域 (97 ページ 「4.1 Unicode の重要な概念」 参照) 内の値を そのグ リ フ に割 り 振 り
ます。 こ の よ う な グ リ フ を マ ッ プ な し グ リ フ と いい ます。 フ ォ ン ト 内のマ ッ プな し グ リ フ
の数は、 PDF_info_font( ) の unmappedglyphs キー ワー ド で取得す る こ と がで き ます。 マ ッ
プな し グ リ フは、フ ォ ン ト の検索性 と テ キ ス ト 抽出を司 る ToUnicode CMap 内では Unicode
置換キ ャ ラ ク タ U+FFFD で表 さ れます。結果 と し てマ ッ プな し グ リ フは、生成 さ れた PDF
か ら テ キ ス ト と し て正 し く 抽出で き な く な り ます。
PDFlib が PUA 値を マ ッ プな し グ リ フ に割 り 振っ てい く 際には、 下記のプール内の若い
値か ら 順に用いてい き ます :
> 基本 と な る のは基本多言語面 (BMP) 内の Unicode PUA 領域、 すなわち範囲 U+E000 ~
U+F8FF です。 必要であれば こ れに加え、 第 15 面 (U+F0000 to U+FFFFD) 内の PUA
値 も 用い ら れます。
5.2 Unicode のキ ャ ラ ク タ と グ リ フ
119
> その フ ォ ン ト が内部的にすでに割 り 振っ てい る PUA 値は、新たな PUA 値を作成す る 際
には用い ら れません。
> Adobe 領域 U+F600 ~ F8FF 内の PUA 値は用い ら れません。
生成 さ れ る PUA 値は、1 つの フ ォ ン ト 内で一意です。 あ る フ ォ ン ト 内のグ リ フ に対 し て生
成 さ れ る PUA 値の割 り 振 り は、 他の フ ォ ン ト か ら は独立です。
TrueType ・ OpenType ・ SING フ ォ ン ト に対す る Unicode マ ッ ピ ン グ PDFlib は、 フ ォ ン
ト の cmap テーブルで見つかっ た Unicode マ ッ ピ ン グ を保持 し ます (cmap の選択は、PDF_
load_font( ) に与え る エン コ ーデ ィ ン グに依存 し ます)。 1 つのグ リ フ が複数の Unicode 値
に対 し て用い ら れてい る 場合、PDFlib はその フ ォ ン ト 内で見つかっ た最初の Unicode 値を
用い ます。
cmap が何の Unicode マ ッ ピ ン グ も 提供 し ていないグ リ フ については、PDFlib はそのグ
リ フ名を post テーブル (その フ ォ ン ト 内にあれば) 内でチ ェ ッ ク し 、 Type 1 フ ォ ン ト に
ついて後述す る よ う にそのグ リ フ名に基づいて Unicode マ ッ ピ ン グ を決定 し ます。
場合に よ っ ては、 cmap も post テーブル も その フ ォ ン ト 内のすべてのグ リ フ に対す る
Unicode 値を提供 し ていない こ と があ り ます。 こ れは Unicode 規格外の異体字 (ス ウ ォ ッ
シ ュ キ ャ ラ ク タ 等) ・拡張合字・非テ キ ス ト 記号について あ ては ま り ます。 こ の場合 PDFlib
は、 119 ページ 「マ ッ プな し グ リ フ と 私用領域 (PUA) 」 で述べた よ う に問題のグ リ フ に
PUA 値を割 り 当て ます。
Type 1 フ ォ ン ト に対す る Unicode マ ッ ピ ン グ Type 1 フ ォ ン ト は明示的な Unicode マ ッ
ピ ン グ を内蔵 し てお ら ず、 各グ リ フ に一意な名前を割 り 当ててい ます。 PDFlib は こ のグ リ
フ名に基づいて Unicode 値の割 り 当て を試みます。 そのためには内蔵の、 さ ま ざ ま な言語
や用字系に対 し て広 く 用い ら れ る 7,000 種を超すグ リ フ名に対す る Unicode マ ッ ピ ン グ を
内容 と し て持つマ ッ ピ ン グ テーブルが使われ ま す。 こ のマ ッ ピ ン グ テーブルには Adobe
Glyph List (AGL)1 内のお よ そ 4,200 種のグ リ フ名が含まれてい ます。 し か し 、 Type 1 フ ォ
ン ト は こ の内蔵マ ッ ピ ン グ テーブルに含ま れていないグ リ フ名を含んでい る こ と があ り 、
こ れは と り わけ記号フ ォ ン ト について顕著です。 こ の場合 PDFlib は、 119 ページ 「マ ッ プ
な し グ リ フ と 私用領域 (PUA)」 で述べた よ う に問題のグ リ フ に PUA 値を割 り 当て ます。
Type 1 フ ォ ン ト に対す る メ ト リ ッ ク が PFM フ ァ イ ルか ら 読み込まれ、PFB ま たは PFA
ア ウ ト ラ イ ン フ ァ イ ルが得 ら れない と き は、PDFlib はその フ ォ ン ト のグ リ フ名を知 る こ と
がで き ません。 こ の場合、 PDFlib は Unicode 値を PFM フ ァ イ ル内のエン コ ーデ ィ ン グ
(charset) 項目に基づいて割 り 当て ます。
Type 3 フ ォ ン ト に対す る Unicode マ ッ ピ ン グ Type 3 フ ォ ン ト も グ リ フ名に基づいてい
ますので、 Type 1 フ ォ ン ト と 同様に扱われます。 ただ し 重要な違いは、 Type 3 フ ォ ン ト
ではグ リ フ名はユーザーの制御下にあ る (PDF_begin_glyph( ) の glyphname 引数を通 じ て)
と い う こ と です。 ですので、 ユーザー定義 Type 3 フ ォ ン ト に対 し ては AGL 内の適切な グ
リ フ名を用い る こ と を強 く 推奨 し ます。 こ れに よ っ て、正 し い Unicode 値が PDFlib に よ っ
て自動的に正 し く 割 り 当て ら れ る よ う にな り 、 生成 さ れ る PDF 文書内でテ キ ス ト が検索
可能にな り ます。
5.2.3 Unicode 制御キ ャ ラ ク タ
制御キ ャ ラ ク タ は、 いかな る グ リ フ を も 表 さ ず、 何 ら かの組版情報の伝達に用い ら れ る
Unicode 値です。 PDFlib は、 下記のグループの Unicode 制御キ ャ ラ ク タ を処理 し ます :
1. AGL は partners.adobe.com/public/developer/en/opentype/glyphlist.txt にあ り ます。
120
第 5 章 : フ ォ ン ト 処理
> デフ ォ ル ト のシ ェーピ ン グ動作を上書 き す る ための制御キ ャ ラ ク タ (表 6.4 に挙げ る )
と 、 デフ ォ ル ト の双方向組版を上書 き す る ための制御キ ャ ラ ク タ (表 6.5 に挙げ る )
は、 テ キ ス ト 行 ・ テ キ ス ト フ ロ ー内の複雑用字系のシ ェーピ ン グ と OpenType レ イ ア
ウ ト 機能の処理を制御 し ます。 こ れ ら の制御キ ャ ラ ク タ は、 評価 さ れた後に削除 さ れ
ます。
> 表 8.1 に挙げ る 改行 と テ キ ス ト フ ロ ー組版のための組版制御キ ャ ラ ク タ 。こ れ ら の制御
キ ャ ラ ク タ は、 評価 さ れた後に削除 さ れます。
> こ れ以外の範囲 U+0001 ~ U+0019・U+007F ~ U+009F の Unicode 制御キ ャ ラ ク タ は置換
キ ャ ラ ク タ で置換 さ れます。
フ ォ ン ト が制御キ ャ ラ ク タ に対す る グ リ フ を含んでいた と し て も 、そのグ リ フは通常は視
覚化 さ れません。 なぜな ら PDFlib が制御キ ャ ラ ク タ を除去す る か ら です ( こ の規則の例
外 と し て &NBSP; と &SHY; は除去 さ れません)。 ただ し 、 encoding=glyphid の場合は制御
キ ャ ラ ク タ はテ キ ス ト 内に保持 さ れ、 視覚出力を生み出す こ と がで き ます。
5.2 Unicode のキ ャ ラ ク タ と グ リ フ
121
5.3 テキス ト 処理パ イ プ ラ イ ン
ク ラ イ ア ン ト アプ リ ケーシ ョ ンは、 ページ出力 し たいテ キ ス ト を PDFlib に与え ます。 こ
のテ キ ス ト は、 ア プ リ ケーシ ョ ン個別の何 ら かのエ ン コ ーデ ィ ン グ と 形式に従っ てエ ン
コ ー ド さ れてい ます。 し か し 、 PDFlib の内部処理は Unicode 規格に基づいてお り 、 ま た最
終テ キ ス ト 出力はフ ォ ン ト 固有のグ リ フ ID を必要 と し ます。 ですので PDFlib は、 ページ
内容のために与え ら れ る 文字列を テ キ ス ト 処理パ イ プ ラ イ ンの中で 3つの過程を経て処理
し ます :
> 入力 コ ー ド を Unicode 値へ正規化。こ の処理は選択 さ れてい る エン コ ーデ ィ ン グに よ り
制約を受け ます。
> Unicode 値を フ ォ ン ト 固有のグ リ フ ID へ変換。こ の処理はその フ ォ ン ト 内で利用可能な
グ リ フ に よ り 制約を受け ます。
> グ リ フ ID を転換。 こ の処理は出力エン コ ーデ ィ ン グに よ り 制約を受け ます。
テ キ ス ト 処理パ イ プ ラ イ ンの こ れ ら 3 つの過程は、 い く つかの下部処理を含んでお り 、 そ
れはオプシ ョ ンで制御す る こ と がで き ます。
5.3.1 入力文字列 を Unicode へ正規化
以下の ス テ ッ プは、 encoding=glyphid と 非 Unicode CMap 以外のすべてのエン コ ーデ ィ ン
グに対 し て実行 さ れます :
> Unicode 対応言語バ イ ンデ ィ ン グ : シ ン グルバ イ ト エン コ ーデ ィ ン グが指定 さ れてい る
と き は、UTF-16 テ キ ス ト は高次バ イ ト を捨て る こ と でシ ン グルバ イ ト テ キ ス ト へ変換
さ れます。
> Windows : マルチバ イ ト テ キ ス ト (cp932 等) を Unicode へ変換 し ます。
> エ ス ケープシーケ ン ス (111 ページ 「4.5.1 エ ス ケープシーケ ン ス」 参照) を、 対応す
る 数値へ置 き 換え ます。
> 文字参照を解決 し 、 それを対応す る Unicode 値へ置 き 換え ます (112 ページ 「4.5.2 文字
参照」 お よ び次項参照)。
> シ ン グルバ イ ト エ ン コ ーデ ィ ン グ : シ ン グルバ イ ト テ キ ス ト を、 指定 さ れたエ ン コ ー
デ ィ ン グに従っ て Unicode へ変換 し ます。
さ ま ざ ま な フ ォ ン ト 形式やキ ャ ラ ク タ の種別に対する Unicode の割 り 当てについて詳 し く
は、 119 ページ 「5.2.2 グ リ フ に対す る Unicode マ ッ ピ ン グ」 を参照 し て く だ さ い。
グ リ フ 名に よ る文字参照 フ ォ ン ト 内のグ リ フは、その対応す る Unicode 値を あ ら か じ め
知 る こ と がで き ない (PDFlib が実行時に PUA 値を割 り 振 る ので) も のがあ り 、 その よ う
な グ リ フは直接指定す る こ と がで き ません。 その よ う な グ リ フ を指定す る には、 グ リ フ名
に よ る 文字参照を使 う こ と がで き ます。 文法の解説は 112 ページ 「4.5.2 文字参照」 を参
照 し て く だ さ い。 こ の参照は、 対応す る Unicode 値へ置 き 換え ら れます。
文字参照が内容文字列内で用い ら れてい る と き は、 PDFlib はその指定 さ れた グ リ フ を
カ レ ン ト フ ォ ン ト 内で見つけ よ う と 試み、 そ し てその参照を そのグ リ フ の Unicode 値へ置
き 換え ます。 指定 さ れた グ リ フ が フ ォ ン ト 内で見つか ら ない と き は、 PDFlib は Unicode 値
を決定す る ためにその内蔵グ リ フ名テーブルを検索 し ます。 こ の Unicode 値は さ ら に、 適
切な グ リ フ が フ ォ ン ト 内で得 ら れ る か ど う かを調べる ために使われます。その よ う な グ リ
フ が見つか ら ない と き は、 動作は glyphcheck ・ errorpolicy 設定で制御 さ れます。 文字参照
は、 glyphid ・ builtin エン コ ーデ ィ ン グでは使 う こ と がで き ません。
122
第 5 章 : フ ォ ン ト 処理
5.3.2 Unicode 値 を グ リ フ ID へ変換
前項で決定 さ れた Unicode 値は、 い く つかの理由に よ り 変更が必要な場合があ り ます。 以
下の ス テ ッ プは、 下記の よ う に処理 さ れ る encoding=glyphid と 非 Unicode CMap 以外のす
べてのエン コ ーデ ィ ン グに対 し て実行 さ れます :
> 非 Unicode CMap の場合 : 無効な コ ー ド 列はつねに例外を発生 さ せます。
> encoding=glyphid の場合 : 無効な グ リ フ ID は、replacementchar (glyphcheck=replace の
と き ) かグ リ フ ID 0 (glyphcheck=none) へ置 き 換え ら れます。 glyphcheck=error の と
き は例外が発生 し ます。
予備 フ ォ ン ト 内の強制キ ャ ラ ク タ Unicode 値を、 fallbackfonts オプシ ョ ンの forcechars
サブオプシ ョ ン に従っ て置 き 換え て、 対応す る 予備フ ォ ン ト のグ リ フ ID を決定 し ます。
詳 し く は 135 ページ 「5.4.5 予備フ ォ ン ト 」 を参照 し て く だ さ い。
グ リ フ ID へ変換 残 り の Unicode 値を、 119 ページ 「5.2.2 グ リ フ に対す る Unicode マ ッ
ピ ン グ」 で決定 さ れ る マ ッ ピ ン グに従っ て グ リ フ ID へ変換 し ます。 Unicode 値に対応す る
グ リ フ ID が フ ォ ン ト 内に見つか ら ない と き は、 その次の ス テ ッ プは glyphcheck オプシ ョ
ンに よ っ て異な り ます :
> glyphcheck=none : グ リ フ ID 0 が用い ら れます。 こ れはすなわち、.notdef グ リ フ がテ キ
ス ト 出力内で用い ら れ る こ と を意味 し ます。 .notdef グ リ フ が視覚的形状を内容 と し て
持つ場合 (たいていは白四角か四角バ ッ テ ン) には、 問題の起 き た キ ャ ラ ク タ が PDF
ページ上で目に見え る よ う にな り ます。 それが望ま し いか ど う かは場合に よ る で し ょ
う。
> glyphcheck=replace ( こ れがデフ ォ ル ト ) : 警告 メ ッ セージが ロ グ記録 さ れ、 PDFlib は、
マ ッ プで き ない Unicode 値を後述のグ リ フ置換機構に よ っ て置 き 換え よ う と 試みます。
> glyphcheck=error : PDFlib はエ ラ ーを発生 さ せます。 errorpolicy=return の場合には、 こ
れはすな わ ち関数呼び出 し が テ キ ス ト 出力 を 一切生成せずに終了 さ れ る こ と を 意味
し 、 PDF_add/create_textflow( ) が -1 (PHP で は 0) を 返 す こ と を 意 味 し ま す。
errorpolicy=exception の場合は例外が発生 し ます。
グ リ フ 置換 glyphcheck=replace の場合は、 マ ッ プで き ない Unicode 値は再帰的に以下の
よ う に置 き 換え ら れます :
> マ ス タ ーフ ォ ン ト を読み込んだ際に指定 し た予備フ ォ ン ト の中で、その Unicode 値に対
す る グ リ フ が検索 さ れ ます。 各フ ォ ン ト に対 し て予備フ ォ ン ト は複数指定す る こ と も
で き る ので、 こ こ では任意の数の フ ォ ン ト が関わ る 可能性があ り ます。 予備フ ォ ン ト
の う ちの 1 つでグ リ フ が見つか っ た と き はそれが使われます。
> タ イ ポグ ラ フ ィ 的に類似のグ リ フ を、PDFlib の内蔵置換テーブル内の Unicode 値に従っ
て選びます。 こ の内蔵 リ ス ト か ら こ れ ら の置換のい く つか を以下に抜粋 し ます。 リ ス
ト 内の 1 番目のキ ャ ラ ク タ が フ ォ ン ト 内で見つか ら ない と き 、 それは 2 番目のキ ャ ラ
ク タ へ置き 換え ら れます :
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 (ギリシャ文字Ω)
5.3 テキス ト 処理パイ プ ラ イ ン
123
内蔵テーブルに加えて、 全角キ ャ ラ ク タ 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 オプ シ ョ ン が指定 さ れ て い な い と き ) は、
U+00A0 ( ノ ーブ レー ク スペース) と U+0020 (空白) が試 さ れます。 こ れ ら さ え も 得 ら れ
ない と き は、 グ リ フ ID 0 (グ リ フ な し 記号) が使われます。
PDF/A-1 ・ PDF/X-4 ・ PDF/X-5 では、 グ リ フ ID 0 へマ ッ プ さ れ る 入力 コ ー ド は ス キ ッ
プ さ れます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの fonts/glyph_replacement ト ピ ッ ク にあ り ます。
5.3.3 グ リ フ ID を転換
決定 さ れた グ リ フ ID はま だ最終的な も のではあ り ません。 なぜな ら 最終出力を生成す る
前に、 い く つかの転換を行わなければな ら ない可能性があ る か ら です。 具体的に ど の よ う
な転換が必要かは、 フ ォ ン ト やい く つかのオプシ ョ ンに よ っ て異な り ます。 以下の ス テ ッ
プは、 非 Unicode CMap で keepnative=true の場合を除 き 、 すべてのエン コ ーデ ィ ン グに対
し て行われます。
縦書 き グ リ フ 縦書 き モー ド の フ ォ ン ト では、い く つかのグ リ フは縦書 き 字体へ置 き 換わ
る 可能性があ り ます。 こ の置換は、 フ ォ ン ト 内に vert OpenType レ イ ア ウ ト 機能テーブル
が必要です。
OpenType レ イ ア ウ ト 機能 OpenType 機能は、 合字 ・ ス ウ ォ ッ シ ュ キ ャ ラ ク タ ・ ス モー
ルキ ャ ピ タ ルをは じ め と す る さ ま ざ ま な タ イ ポグ ラ フ ィ バ リ エーシ ョ ン を、 1 個ない し 複
数のグ リ フ ID を他の値へ置 き 換え る こ と に よ っ て作 り 出す こ と がで き ます。OpenType 機
能については 154 ページ 「6.3 OpenType レ イ ア ウ ト 機能」 で解説 し てい ます。 OpenType
レ イ ア ウ ト 機能は、 適切な フ ォ ン ト に対 し てのみ有効であ り (157 ページ 「OpenType レ
イ ア ウ ト 機能のための要件」 参照)、 かつ features オプシ ョ ンに従っ て適用 さ れます。
複雑用字系のシ ェ ー ピ ン グ シ ェ ー ピ ン グは、 テ キ ス ト の順序を替え、 ま た、 キ ャ ラ ク
タ の位置に よ っ て適切な字体の グ リ フ を決定 し ま す (例 : ア ラ ビ ア文字キ ャ ラ ク タ の頭
字 ・ 中字 ・ 尾字 ・ 単独形) 。 こ れは適切な フ ォ ン ト に対 し てのみ有効であ り (163 ページ
「シ ェーピ ン グのための要件」 参照)、 かつ shaping オプシ ョ ンに従っ て適用 さ れます。
124
第 5 章 : フ ォ ン ト 処理
5.4 フ ォ ン ト を読み込む
5.4.1 テキス ト フ ォ ン ト に対す る エ ン コ ーデ ィ ン グ を選ぶ
フ ォ ン ト は、 明示的に PDF_load_font( ) 関数で読み込む こ と も で き 、 あ る いは暗黙的に、
PDF_add/create_textflow( )やPDF_fill_textblock( ) と いっ た特定の関数にfontname・encoding
オプシ ョ ン を与え る こ と で読み込む こ と も で き ます。 ど の よ う な方式を用いて フ ォ ン ト を
読み込むのかにかかわ ら ず、 適切なエ ン コ ーデ ィ ン グ を指定す る 必要が あ り ま す。 エ ン
コ ーデ ィ ン グは下記を決定 し ます :
> PDFlib が与え ら れ る テ キ ス ト を ど のテ キ ス ト 形式であ る と 見なすか。
> フ ォ ン ト 内の ど のグ リ フ が使え る か。
> ページ上のテ キ ス ト と フ ォ ン ト 内のグ リ フデー タ が PDF 出力文書内に ど の よ う に格納
さ れ る か。
PDFlib のテ キ ス ト 処理は Unicode 規格1 に基づいてい ます。 こ れは ISO 10646 と ほぼ等価
です。 今ど き の開発環境の多 く が Unicode 規格に対応 し てい ますので、 Unicode 文字列を
使っ てで き る だけ簡単に PDF 出力を生成で き る よ う にす る こ と が私た ちの目標です。 た
だ し 、 Unicode を扱わない開発者はそのアプ リ ケーシ ョ ン を Unicode へ切 り 替え る 必要は
あ り ません。 レ ガシエン コ ーデ ィ ン グ も 使 う こ と がで き る か ら です。
ど のエ ン コ ーデ ィ ン グ を選ぶかは、 フ ォ ン ト や、 得 ら れ る テ キ ス ト デー タ や、 い く つ
かのプ ロ グ ラ ミ ン グ的側面に よ っ て決ま り ます。 以下 こ の項では、 さ ま ざ ま な分類のエン
コ ーデ ィ ン グの概観を示す こ と で、 適切なエン コ ーデ ィ ン グ を選ぶための助け と し ます。
Unicode エ ン コ ーデ ィ ン グ encoding=unicode と す る と 、Unicode 文字列を PDFlib に渡す
こ と がで き ます。 こ のエン コ ーデ ィ ン グはすべてのフ ォ ン ト 形式に対 し て使え ます。 利用
す る 言語バ イ ンデ ィ ン グに よ っ て、 そのプ ロ グ ラ ミ ン グ言語 (Java 等) が提供 し てい る
Unicode 文字列デー タ 型を利用で き る 場合 も あれば、 Unicode を UTF-8 ・ UTF-16 ・ UTF32 のいずれかの形式で リ ト ルエンデ ィ ア ン ・ ビ ッ グエ ンデ ィ ア ンのいずれかのバ イ ト 順
序で内容 と し て持つバ イ ト 配列を用い る 場合 も あ り ます (C 等)。
encoding=unicode では、フ ォ ン ト 内のすべてのグ リ フ が指定で き 、複雑用字系のシ ェー
ピ ン グ と OpenType レ イ ア ウ ト 機能を使 う こ と がで き ます。PDFlib は、要求 さ れた Unicode
値に対す る グ リ フ を フ ォ ン ト が含んでい る か ど う かを調べます。グ リ フ が得 ら れない と き
は、 代替グ リ フ を同一フ ォ ン ト か別フ ォ ン ト か ら 持っ て来る こ と がで き ます (135 ページ
「5.4.5 予備フ ォ ン ト 」 参照)。
Unicode 非対応の言語バ イ ンデ ィ ン グでは、 PDFlib はデフ ォ ル ト ではテ キ ス ト が UTF16 エン コ ー ド さ れてい る と 見な し ます。 し か し 、 textformat=bytes を指定すればシ ン グル
バ イ ト 文字列を与え る こ と がで き ます。 こ の場合、 こ のバ イ ト 値はキ ャ ラ ク タ U+0001 ~
U+00FF を、 すなわち基本欧文キ ャ ラ ク タ 群を持つ先頭 Unicode ブ ロ ッ ク (ISO 8859-1 と
等価) を表 し ます。 ただ し 、 文字参照を利用すれば、 こ の範囲の外の Unicode 値を シ ン グ
ルバ イ ト テ キ ス ト 内で指定す る こ と も 可能です。
PDF 内のい く つかの フ ォ ン ト 形式 (Type 1、 Type 3、 グ リ フ名に基づ く OpenType フ ォ
ン ト ) は、 シ ン グルバ イ ト テ キ ス ト にのみ対応 し てい ます。 し か し 、 PDFlib では こ う し た
種類の フ ォ ン ト で も 255 種類を超え る キ ャ ラ ク タ を扱え る よ う 工夫 し てい ます。
encoding=unicode の難点は、 昔な が ら の シ ン グ ルバ イ ト やマルチバ イ ト のエ ン コ ー
デ ィ ン グのテ キ ス ト を用い る こ と がで き ない (ISO 8859-1 を除 き ) こ と です。
1. www.unicode.org を参照。
5.4 フ ォ ン ト を読み込む
125
シ ン グルバ イ ト エ ン コ ーデ ィ ン グ 8 ビ ッ ト エン コ ーデ ィ ン グ (シ ン グルバ イ ト エン コー
デ ィ ン グ と も い う ) は、 テ キ ス ト 文字列内の各バ イ ト を 1 個のキ ャ ラ ク タ へマ ッ プ し ます
ので、 同時に扱え る キ ャ ラ ク タ は 255 種類ま でに制限 さ れます (値 0 は利用で き ません)。
こ の種類のエン コ ーデ ィ ン グはすべての フ ォ ン ト 形式に対 し て使え ます。 PDFlib は、 選ば
れたエン コ ーデ ィ ン グに合っ た グ リ フ を フ ォ ン ト が含んでい る か ど う か を調べます。使え
る グ リ フ の数が最低限の数に届かない と き は、 PDFlib は警告 メ ッ セージ を ロ グ記録 し ま
す。選ばれたエン コ ーデ ィ ン グに対 し て使え る グ リ フ が フ ォ ン ト 内で ま っ た く 得 ら れない
と き は、 フ ォ ン ト 読み込みは 「font doesn't support encoding」 と い う メ ッ セージ を出 し て
失敗 し ます。 PDFlib は、 要求 さ れた入力値に対す る グ リ フ を フ ォ ン ト が含んでい る か ど う
かを調べます。 グ リ フ が得 ら れない と き は、 代替グ リ フ を同一フ ォ ン ト か別フ ォ ン ト か ら
持っ て来 る こ と がで き ます (135 ページ 「5.4.5 予備フ ォ ン ト 」 参照)。
Unicode 非対応の言語バ イ ンデ ィ ン グでは、PDFlib はデフ ォ ル ト ではテ キ ス ト がシ ン グ
ルバ イ ト エン コ ー ド さ れてい る と 見な し ます。 し か し 、 textformat=utf8 か utf16 を指定す
れば UTF-8 か UTF-16 文字列を与え る こ と がで き ます。
8 ビ ッ ト エン コ ーデ ィ ン グについて詳 し く は 99 ページ 「4.2 シ ン グルバ イ ト (8 ビ ッ
ト ) エン コ ーデ ィ ン グ」 で解説 し てい ます。 こ れは さ ま ざ ま な情報源か ら 持っ て来 る こ と
がで き ます :
> 表 4.2 に従っ た大量の定義済みエン コ ーデ ィ ン グ。 こ れは さ ま ざ ま なシ ス テ ム、 さ ま ざ
ま な ロ ケールで現在利用 さ れて い る 最 も 重要な エ ン コ ーデ ィ ン グ群 を 網羅 し て い ま
す。
> ユーザー定義エ ン コ ーデ ィ ン グ。 こ れは、 外部フ ァ イ ルで与え る か、 ま たは実行時に
PDF_encoding_set_char( ) で動的に構築す る こ と がで き ます。こ のエン コ ーデ ィ ン グは、
グ リ フ名か Unicode 値に基づ く こ と がで き ます。
> オペレーテ ィ ン グ シ ス テ ム か ら 持っ て き たエ ン コ ーデ ィ ン グ。 シ ス テムエ ン コ ーデ ィ
ン グ と も いい ます。 こ の機能は、 Windows と IBM iSeries ・ zSeries で利用可能です。
シ ン グルバ イ ト エン コ ーデ ィ ン グの難点は、キ ャ ラ ク タ やグ リ フ の数に限 り があ る こ と で
す。 こ の理由か ら 、 複雑用字系のシ ェーピ ン グ と OpenType レ イ ア ウ ト 機能はシ ン グルバ
イ ト エン コ ーデ ィ ン グに対 し ては使え ません。
ビル ト イ ン エ ン コ ーデ ィ ン グ
encoding=builtin を指定 し て、 記号フ ォ ン ト 内の非テ キ ス
ト グ リ フ に対す る シ ン グルバ イ ト コ ー ド を使 う と い う 方法 も あ り ます。フ ォ ン ト の内部エ
ン コ ーデ ィ ン グの形式はフ ォ ン ト の種類に よ っ て異な り ます :
> TrueType:エン コ ーデ ィ ン グは、フ ォ ン ト のシ ン ボ リ ッ ク cmap に、すなわち cmap テー
ブル内の (3, 0) 項目に基づいて作 ら れます。
> OpenType フ ォ ン ト はエン コ ーデ ィ ン グ を CFF テーブル内に含んでい る こ と があ り ま
す。
> PostScript Type 1 フ ォ ン ト はつねにエン コ ーデ ィ ン グ を含んでい ます。
> Type 3 の場合、エン コ ーデ ィ ン グはフ ォ ン ト の先頭 255 グ リ フ に よ っ て定義 さ れます。
フ ォ ン ト が ビル ト イ ンエン コ ーデ ィ ン グ を何 ら 含んでいない と き は、フ ォ ン ト 読み込みは
失敗 し ます (OpenType 日中韓フ ォ ン ト 等)。 PDF_info_font( ) で symbolfont キーを用い る
こ と も で き ます。 こ れが false を返 し た な ら 、 その フ ォ ン ト はテ キ ス ト フ ォ ン ト であ り 、
広 く 利用 さ れてい る シ ン グルバ イ ト エ ン コ ーデ ィ ン グのいずれかで読み込む こ と も で き
ます。 symbolfont キーが true を返 し た な ら それはで き ません。 その よ う な記号フ ォ ン ト
内のグ リ フは、各グ リ フ に対す る コ ー ド がわか っ てい る 場合にのみ利用す る こ と が可能で
す (127 ページ 「5.4.2 記号フ ォ ン ト に対す る エン コ ーデ ィ ン グ を選ぶ」 参照)。
126
第 5 章 : フ ォ ン ト 処理
Unicode 非対応の言語バ イ ンデ ィ ン グでは、PDFlib はデフ ォ ル ト ではテ キ ス ト がシ ン グ
ルバ イ ト 形式であ る と 見な し ます。 こ れは、 い く つかの記号フ ォ ン ト での指定に伝統的に
使われてい る シ ン グルバ イ ト 値を使え る と い う 利点があ り ます。 こ れは他のエン コ ーデ ィ
ン グでは不可能です。 し か し 、 textformat=utf16 等を指定すればテ キ ス ト を Unicode 形式
で与え る こ と がで き ます。
encoding=builtin の難点は、 シ ン グルバ イ ト エン コ ー ド さ れた テ キ ス ト 内では文字参照
が使え ない こ と です。
マルチバ イ ト エ ン コ ーデ ィ ン グ こ の種類のエ ン コ ーデ ィ ン グは日中韓フ ォ ン ト に、 す
なわち日本語 ・ 中国語 ・ 韓国語のキ ャ ラ ク タ 群を持つ TrueType ・ OpenType CID フ ォ ン ト
に対 し て使え ます。 こ れ ら の用字系で使 う ために さ ま ざ ま なエン コ ーデ ィ ン グ方式が開発
さ れて き ま し た。 日本語では Shift-JIS ・ EUC、 中国語では GB ・ Big5、 韓国語では KSC 等
です。マルチバ イ ト エン コ ーデ ィ ン グは Adobe CMap か Windows コ ー ド ページで定義 さ れ
てい ます (103 ページ 「4.3 日本語 ・ 中国語 ・ 韓国語エン コ ーデ ィ ン グ」 参照)。
こ れ ら の伝統的エン コ ーデ ィ ン グは、encoding=unicode と 等価であ る Unicode CMap を
除 き 、 Unicode 非対応言語バ イ ンデ ィ ン グでのみ使 う こ と がで き ます。
Unicode 非対応の言語バ イ ンデ ィ ン グでは、 PDFlib はデフ ォ ル ト (textformat=bytes)
ではテ キ ス ト がマルチバ イ ト バ イ ト エン コ ー ド さ れてい る と 見な し ます。
マルチバ イ ト エン コ ーデ ィ ン グでは、 keepnative オプシ ョ ン true がな ら ば、 テ キ ス ト
はユーザーか ら 与え ら れた も のがその ま ま PDF 出力へ書 き 込まれます。
マルチバ イ ト エン コ ーデ ィ ン グの難点は、 PDFlib は入力テ キ ス ト について文法的有効
性のみを検査 し 、与え ら れたテ キ ス ト に対す る グ リ フ が フ ォ ン ト 内で得 ら れ る か ど う かは
検査 し ない点です。 ま た、 Unicode テ キ ス ト を与え る こ と も で き ません。 なぜな ら PDFlib
は Unicode 値を それに対応す る マルチバ イ ト 列へ変換す る こ と がで き ないか ら です。かつ、
文字参照、 OpenType レ イ ア ウ ト 機能、 複雑用字系のシ ェーピ ン グ も 利用で き ません。
グ リ フ ID エ ン コ ーデ ィ ン グ PDFlib では encoding=glyphid をすべての フ ォ ン ト 形式に対
し て使え ます。 こ のエン コ ーデ ィ ン グでは、 119 ページ 「5.2.1 グ リ フ ID」 で解説す る 付
番方式を用いて、 フ ォ ン ト 内のすべてのグ リ フ が指定で き ます。 数値グ リ フ ID は 0 か ら
始ま り 、 理論上の最大値は 65,565 です (その よ う な大量のグ リ フ を持つフ ォ ン ト はあ り
ませんが)。 最大グ リ フ ID 値は PDF_info_font( ) で maxcode キーを用いて取得で き ます。
Unicode 非対応の言語バ イ ンデ ィ ン グでは、 PDFlib はデフ ォ ル ト (textformat=utf16)
ではテ キ ス ト がダブルバ イ ト バ イ ト エン コ ー ド さ れてい る と 見な し ます。
PDFlib は、 与え ら れた グ リ フ ID が フ ォ ン ト 内で有効であ る か ど う か を調べます。 複雑
用字系のシ ェーピ ン グ と OpenType レ イ ア ウ ト 機能が使え ます。
グ リ フ ID は特定の フ ォ ン ト に固有の も のであ り 、 場合に よ っ ては PDFlib に よ っ て生
成 さ れ る こ と す ら あ る ので、 encoding=glyphid は一般に通常のテ キ ス ト 出力には適 し ませ
ん。 こ のエン コ ーデ ィ ン グの主な用途は、 フ ォ ン ト の全グ リ フ一覧を印刷す る こ と です。
5.4.2 記号 フ ォ ン ト に対す る エ ン コ ーデ ィ ン グ を選ぶ
記号フ ォ ン ト は、 記号 ・ ロ ゴ ・ ピ ク ト グ ラ ム な ど の非テ キ ス ト グ リ フ群を内容 と し て持つ
フ ォ ン ト です。 こ れは、 テ キ ス ト フ ォ ン ト にはないい く つかの問題を提起 し ます。 背景に
あ る 問題は、Unicode 規格は一般にあ えて記号グ リ フ をエン コ ー ド し ていない こ と です(広
く 利用 さ れてい る ZapfDingbats フ ォ ン ト 内のグ リ フ等、 こ の規則には例外 も あ り ますが)。
記号 フ ォ ン ト を Unicode 指向 ワ ー ク フ ロ ー に 適合 し て 利用 で き る よ う に す る た め、
TrueType ・ OpenType フ ォ ン ト はたいていそのグ リ フ に私用領域 (PUA) 内の Unicode 値
を割 り 当ててい ます。 Unicode マ ッ ピ ン グ テーブルがない こ と か ら 、 PostScript Type 1 は
5.4 フ ォ ン ト を読み込む
127
こ れを行えず、 一般にそのグ リ フ を選ぶのに欧文キ ャ ラ ク タ の コ ー ド を用いてい ます。 す
べての フ ォ ン ト 形式において、 記号グ リ フ はたいてい カ ス タ ム の グ リ フ名を持っ てい ま
す。
こ う し た状況か ら 、 記号フ ォ ン ト 内のグ リ フ の選択に関 し て下記の よ う な結果が生 じ
ます :
> 記号 TrueType・OpenType フ ォ ン ト は encoding=unicode で最 も 良 く 読み込め ます。グ リ
フ に割 り 当て ら れてい る PUA 値がわかっ てい る 場合には、 記号グ リ フ を選ぶためにテ
キ ス ト 内で こ の値を与え る こ と がで き ます。 そのためにはその フ ォ ン ト 内の PUA 割 り
当てがあ ら か じ めわか っ てい る 必要があ り ます。
> PDFlib は記号 PostScript Type 1 フ ォ ン ト に対 し て PUA 値を内部的に割 り 振 り ますので、
こ の PUA 値は事前にはわか り ません。
> 記号フ ォ ン ト 内のグ リ フ を 8 ビ ッ ト コ ー ド を使っ て指定 し たい場合には、 フ ォ ン ト を
encoding=builtin で読み込んで、テ キ ス ト 内で 8 ビ ッ ト コ ー ド を与え る こ と がで き ます。
た と えば、 数字 4 ( コ ー ド 0x34) は ZapfDingbats フ ォ ン ト 内でチ ェ ッ ク マー ク 記号を
選びます。
記号フ ォ ン ト を encoding=unicode で使 う ためには、適切な Unicode 値を テ キ ス ト で用い る
必要があ り ます :
> Symbol フ ォ ン ト 内のキ ャ ラ ク タ はすべて正 し い Unicode 値を持っ てい ます。
> ZapfDingbats フ ォ ン ト 内のキ ャ ラ ク タ は範囲 U+2007 ~ U+27BF の Unicode 値を持っ てい
ます。
> Wingdings ・ Webdings 等の Microsoft の記号フ ォ ン ト は、範囲 U+F020 ~ U+F0FF の PUA
Unicode 値を用いてい ます (charmap アプ リ ケーシ ョ ンは こ れを シ ン グルバ イ ト コ ー ド
で表 し ますが)。
> それ以外の フ ォ ン ト については、フ ォ ン ト 内の個々のグ リ フ に対す る Unicode 値を あ ら
か じ め知っ てお く か、 ま たは実行時に PDF_info_font( ) で (例 : PostScript Type 1 フ ォ
ン ト の場合はグ リ フ名を与え て) 決定す る 必要があ り ます。
制御キ ャ ラ ク タ 表 8.1 に挙げ る 範囲 U+0001 ~ U+001F の Unicode 制御キ ャ ラ ク タ は、
encoding=builtin で も テ キ ス ト フ ロ ー内で使え ます。 0x20 未満の コ ー ド は、 記号フ ォ ン ト
がその コ ー ド に対す る グ リ フ を持たないな ら ば、 制御キ ャ ラ ク タ と し て解釈 さ れます。 こ
れは大多数の記号フ ォ ン ト にあ ては ま り ます。
ラ イ ン フ ィ ー ド キ ャ ラ ク タ に対す る コ ー ド は ASCII と EBCDIC と で異な っ てい ますの
で、 EBCDIC シ ス テ ム上で リ テ ラ ルな キ ャ ラ ク タ 0x0A を使 う こ と は避け、 オプシ ョ ン
escapesequence=true を用いて PDFlib のエ ス ケープシーケ ン ス \n を使 う こ と を推奨 し ま
す。 こ の \n は PDFlib API ま で届 く 必要があ る こ と に留意 し て く だ さ い。 た と えば C では
\\n と 書 く 必要があ り ます。
文字参照 文字参照は記号フ ォ ン ト に対 し て使 う こ と がで き ます。し か し 記号フ ォ ン ト は
一般に、 文字参照を開始す る ア ンパサン ド キ ャ ラ ク タ U+0026 「&」 に対す る グ リ フ を含ん
でい ません。 コ ー ド 0x26 も 、 フ ォ ン ト 内の既存のグ リ フへマ ッ プで き ないので使え ませ
ん。 ですので記号フ ォ ン ト は、 文字参照を使 う 必要があ る と き は、 encoding=unicode で読
み込む必要があ り ます。 文字参照は encoding=builtin では動作 し ません。
5.4.3 フ ォ ン ト を検索
フ ォ ン ト デー タ の情報源 先述の よ う に、 フ ォ ン ト は明示的に PDF_load_font( ) 関数で読
み込む こ と も で き ます し 、 あ る いは暗黙的に、 さ ま ざ ま なテ キ ス ト 出力関数に fontname ・
128
第 5 章 : フ ォ ン ト 処理
encoding オプシ ョ ン を与え て読み込む こ と も で き ます。フ ォ ン ト のネ イ テ ィ ブな名前を使
う こ と も で き ます し 、 フ ォ ン ト デー タ の場所を決定す る ために用い ら れ る 任意のカ ス タ ム
名 を 扱 う こ と も で き ま す。 カ ス タ ム フ ォ ン ト 名は文書内で一意で あ る 必要が あ り ま す。
PDF_info_font( ) で、 こ の フ ォ ン ト 名は apiname キーで取得す る こ と がで き ます。
PDF_load_font( ) を続けて呼び出す と 、 すべてのオプシ ョ ンが こ の関数を最初に呼び出
し た際に与えた も の と 等 し ければ、 同 じ フ ォ ン ト ハン ド ルが返 さ れます (扱いが異な る オ
プシ ョ ンが若干あ り ますので、 詳 し く は PDFlib API リ フ ァ レ ン ス を参照)。 そ う でなけれ
ば、 同 じ フ ォ ン ト 名に対 し て新規の フ ォ ン ト ハン ド ルが作成 さ れます。 PDFlib ではフ ォ ン
ト デー タ の情報源 と し て下記に対応 し てい ます :
> デ ィ ス ク ベース ま たは仮想の フ ォ ン ト フ ァ イ ル
> Windows ま たは Mac オペレーテ ィ ン グ シ ス テ ムか ら 持っ て来た フ ォ ン ト (ホ ス ト フ ォ ン
ト)
> PDF 標準フ ォ ン ト : こ れ ら は、 よ く 知 ら れた名前の少数の欧文 ・ 日中韓フ ォ ン ト です
> PDF_begin_font( ) お よ び関連関数群で定義 さ れた Type 3 フ ォ ン ト
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの fonts/font_resources ト ピ ッ ク にあ り ます。
フ ォ ン ト の検索順序 PDFlib に与え ら れ る フ ォ ン ト 名は名前文字列です。 PDFlib は与え
ら れた フ ォ ン ト 名を使っ て、 さ ま ざ ま な種類のフ ォ ン ト を以下の順序で探 し ます。 こ の検
索処理は、 使え る フ ォ ン ト が ス テ ッ プの 1 つで見つか る と と も に終わ り ます :
> フ ォ ン ト 名が標準日中韓フ ォ ン ト の名前 と 一致 し 、 指定 さ れたエ ン コ ーデ ィ ン グが定
義済み CMap の名前であ る (169 ページ 「6.5.1 標準日中韓フ ォ ン ト 」 参照)。
> フ ォ ン ト 名が、こ れ以前に同一文書内で PDF_begin_font( ) で作成 さ れた Type 3 フ ォ ン ト
の名前 と 一致する (117 ページ 「5.1.5 Type 3 フ ォ ン ト 」 参照)。
> フ ォ ン ト 名が、 フ ォ ン ト 名を TrueType ・ OpenType フ ォ ン ト フ ァ イ ルの名前 と 紐づけ る
FontOutline リ ソ ース内の名前 と 一致す る 。
> フ ォ ン ト 名が、フ ォ ン ト 名を PostScript Type 1 フ ォ ン ト の メ ト リ ッ ク フ ァ イ ルの名前 と
紐づけ る FontAFM ま たは FontPFM リ ソ ース内の名前 と 一致する 。
> フ ォ ン ト 名が、 フ ォ ン ト 名を シ ス テ ム に イ ン ス ト ール さ れてい る フ ォ ン ト の名前 と 紐
づけ る HostFont リ ソ ース内の名前 と 一致す る 。
> フ ォ ン ト 名が欧文 コ ア フ ォ ン ト の名前 と 一致す る (131 ページ 「欧文 コ ア フ ォ ン ト 」 参
照)。
> フ ォ ン ト 名が、 シ ス テ ム に イ ン ス ト ール さ れてい る ホ ス ト フ ォ ン ト の名前 と 一致す る
(133 ページ 「5.4.4 Windows ・ Mac OS X 上のホ ス ト フ ォ ン ト 」 参照)。
> フ ォ ン ト 名が フ ォ ン ト フ ァ イ ルのベース名 (すなわち フ ァ イ ル名接尾辞を除いた名前)
と 一致す る 。
フ ォ ン ト が見つか ら なか っ た と き は、 フ ォ ン ト 読み込みは下記のエ ラ ー メ ッ セージ を出 し
て止ま り ます :
Font file (AFM, PFM, TTF, OTF etc.) or host font not found
さ ま ざ ま な リ ソ ース カ テ ゴ リ について詳 し く は 59 ページ 「3.1.3 リ ソ ース設定 と フ ァ イ ル
検索」 を参照 し て く だ さ い。 以下の各項では、 さ ま ざ ま な分類の フ ォ ン ト に対す る フ ォ ン
ト 読み込みについて さ ら に詳 し く 解説 し てい き ます。
5.4 フ ォ ン ト を読み込む
129
TrueType ・ OpenType フ ォ ン ト フ ォ ン ト 名は、使いたい フ ォ ン ト
フ ァ イ ルの名前に対 し て、 FontOutline リ ソ ース を通 じ て紐づけ る
必要があ り ます :
p.set_parameter("FontOutline", "Arial=/usr/fonts/Arial.ttf");
font = p.load_font("Arial", "unicode", "embedding");
等号の左側の フ ォ ン ト 別名は任意に選べます :
p.set_parameter("FontOutline", "f1=/usr/fonts/Arial.ttf");
font = p.load_font("f1", "unicode", "embedding");
実行時に PDF_set_parameter( ) で設定す る のでな く 、UPR フ ァ イ ル内で FontOutline リ ソ ー
ス を設定す る こ と も で き ます (59 ページ 「3.1.3 リ ソ ース設定 と フ ァ イ ル検索」 参照)。 絶
対フ ァ イ ル名を避け る ため、 SearchPath リ ソ ース カ テ ゴ リ を用い る こ と も で き ます ( こ の
場合 も 、SearchPath リ ソ ース カ テ ゴ リ を UPR フ ァ イ ル内で設定す る こ と も 可能です)。例:
p.set_parameter("SearchPath", "/usr/fonts");
p.set_parameter("FontOutline", "f1=Arial.ttf");
font = p.load_font("f1", "unicode", "");
TrueType コ レ ク シ ョ ン TrueType コ レ ク シ ョ ン (TTC、 171 ページ 「6.5.2 カ
ス タ ム日中韓フ ォ ン ト 」 参照) フ ァ イ ル内に含 ま れてい る フ ォ ン ト を選ぶに
は、 その フ ォ ン ト の名前を直接指定 し ます :
p.set_parameter("FontOutline", "MS-Gothic=msgothic.ttc");
font = p.load_font("MS-Gothic", "unicode", "embedding");
フ ォ ン ト 名は、 TTC フ ァ イ ル内のすべての フ ォ ン ト の名前 と 照合 さ れ ま す。 あ る いは、
TTC フ ァ イ ル内の n 番目の フ ォ ン ト を選ぶには、フ ォ ン ト 名の後に コ ロ ン をつけて番号 n
を指定す る こ と がで き ます。 こ の場合は、 等号の左側の フ ォ ン ト 別名は任意に選べます :
p.set_parameter("FontOutline", "f1=msgothic.ttc");
font = p.load_font("f1:0", "unicode", "");
PostScript Type 1 フ ォ ン ト フ ォ ン ト 名は、 使い た い フ ォ ン ト の メ ト リ ッ ク
フ ァ イ ルの名前に対 し て、その メ ト リ ッ ク フ ァ イ ルの種類に応 じ て、FontAFM・
FontPFM リ ソ ース カ テ ゴ リ のいずれか を通 じ て紐づけ る 必要があ り ます :
p.set_parameter("FontPFM", "lucidux=LuciduxSans.pfm");
font = p.load_font("lucidux", "unicode", "embedding");
PostScript フ ォ ン ト を埋め込む必要があ る と き は、 その名前を、 その フ ォ ン ト ア ウ ト ラ イ
ン フ ァ イ ル (PFA ま たは PFB) に対 し て、 FontOutline リ ソ ース カ テ ゴ リ を通 じ て紐づけ
る 必要があ り ます :
p.set_parameter("FontPFM", "lucidux=LuciduxSans.pfm");
p.set_parameter("FontOutline", "lucidux=LuciduxSans.pfa");
font = p.load_font("lucidux", "unicode", "");
PostScript Type 1 フ ォ ン ト に対 し ては、FontOutline リ ソ ース だけでは充分でない こ と に留
意 し て く だ さ い。 必ず メ ト リ ッ ク フ ァ イ ルが必要ですので、 フ ォ ン ト を読み込むためには
AFM ま たは PFM フ ァ イ ルが得 ら れ る 必要があ り ます。
130
第 5 章 : フ ォ ン ト 処理
フ ォ ン ト メ ト リ ッ ク ・ ア ウ ト ラ イ ン フ ァ イ ルが検索 さ れ る デ ィ レ ク ト リ は、 SearchPath
リ ソ ース カ テ ゴ リ を通 じ て指定す る こ と がで き ます。
欧文 コ ア フ ォ ン ト PDF ビ ュ ーアは、 つねに利用可能 と 見な さ れ る フ ォ ン ト 14 種の コ ア
セ ッ ト に対応 し てい ます。 コ ア フ ォ ン ト の完全な メ ト リ ッ ク 情報はすでに PDFlib に内蔵
さ れてい ますので、 追加デー タ は必要あ り ません (フ ォ ン ト を埋め込みたい場合を除 き )。
コ ア フ ォ ン ト は下記の名前を持ち ます :
Courier ・ Courier-Bold ・ Courier-Oblique ・ Courier-BoldOblique ・
Helvetica ・ Helvetica-Bold ・ Helvetica-Oblique ・ Helvetica-BoldOblique ・
Times-Roman ・ Times-Bold ・ Times-Italic ・ Times-BoldItalic ・
Symbol ・ ZapfDingbats
フ ォ ン ト 名が リ ソ ー ス を 通 じ て い か な る フ ァ イ ル名へ も 紐づ け ら れ て い な い と き は、
PDFlib は そ の フ ォ ン ト を 欧文 コ ア フ ォ ン ト の リ ス ト 内で探 し ま す。 こ の ス テ ッ プ は、
embedding オプシ ョ ンが指定 さ れてい る 場合、ま たはその フ ォ ン ト 名に対 し て FontOutline
リ ソ ース が得 ら れ る 場合には ス キ ッ プ さ れます。 下記の コ ー ド は、 コ ア フ ォ ン ト の 1 つを
何の設定 も な し に要求 し ます :
font = p.load_font("Times-Roman", "unicode", "");
内部 リ ス ト で見つか っ た コ ア フ ォ ン ト は決 し て埋め込まれません。 こ れ ら の フ ォ ン ト のい
ずれか を埋め込むためには、 フ ォ ン ト ア ウ ト ラ イ ン フ ァ イ ルを設定す る 必要があ り ます。
ホ ス ト フ ォ ン ト フ ォ ン ト 名が リ ソ ー ス を通 じ ていかな る フ ァ イ ル名へ も 紐づけ ら れて
いない と き は、PDFlib はその フ ォ ン ト を、Windows ま たは Mac シ ス テ ムに イ ン ス ト ール さ
れてい る フ ォ ン ト の リ ス ト 内で探 し ます。シ ス テ ムに イ ン ス ト ール さ れてい る フ ォ ン ト を
ホス ト フ ォ ン ト と いい ます。 ホ ス ト フ ォ ン ト の名前は ASCII でエン コ ー ド さ れてい る 必要
があ り ます。Windows では Unicode も 使え ます。ホ ス ト フ ォ ン ト について詳 し く は 133 ペー
ジ 「5.4.4 Windows ・ Mac OS X 上のホ ス ト フ ォ ン ト 」 を参照 し て く だ さ い。 例 :
font = p.load_font("Verdana", "unicode", "");
Windows では、 フ ォ ン ト 名の後にカ ン マ をつけて フ ォ ン ト ス タ イ ルを追加す る こ と も で き
ます :
font = p.load_font("Verdana,Bold", "unicode", "");
コ ア フ ォ ン ト のいずれかの名前で ホ ス ト フ ォ ン ト を読み込むためには、 その フ ォ ン ト 名
を、 ほ し いホ ス ト フ ォ ン ト の名前に対 し て、 HostFont リ ソ ース カ テ ゴ リ を通 じ て紐づけ る
必要があ り ます。 下記の コ ー ド は、 内蔵 コ ア フ ォ ン ト デー タ を使 う のでな く 、 Symbol フ ォ
ン ト の メ ト リ ッ ク ・ ア ウ ト ラ イ ンデー タ がホ ス ト シ ス テ ムか ら 持っ て来 ら れ る よ う に し て
い ます :
p.set_parameter("HostFont", "Symbol=Symbol");
font = p.load_font("Symbol", "unicode", "embedding");
等号の左側の フ ォ ン ト 別名は任意に選べますが、 こ こ ではホ ス ト フ ォ ン ト の名前を その ま
ま使い ま し た。
フ ォ ン ト フ ァ イル を拡張子に基づいて検索 Type 3 以外のすべて の種類の フ ォ ン ト は、
指定 さ れた フ ォ ン ト 名を フ ォ ン ト メ ト リ ッ ク ・ ア ウ ト ラ イ ン フ ァ イ ルのベース名 (フ ァ イ
5.4 フ ォ ン ト を読み込む
131
ル接尾辞の一切ない名前) と し て用いて検索する こ と がで き ます。 PDFlib は、 指定 さ れた
名前の フ ォ ン ト が見つか ら なかっ た と き は、SearchPath リ ソ ース カ テ ゴ リ 内のすべての項
目を なめなが ら 、 与え ら れた フ ァ イ ル名に対 し て、 知 ら れてい る すべての フ ァ イ ル名接尾
辞を付加す る こ と に よ っ て、 フ ォ ン ト メ ト リ ッ ク ・ ア ウ ト ラ イ ンデー タ を見つけ よ う と 試
みます。 こ の拡張子に基づ く 検索は具体的には以下の よ う な アルゴ リ ズ ムです :
> 下記の接尾辞を フ ォ ン ト 名に付加 し 、 で き た フ ァ イ ル名の フ ォ ン ト メ ト リ ッ ク (お よ
び TrueType ・ OpenType フ ォ ン ト の場合はア ウ ト ラ イ ン) があ る か ど う かを順番に調
べてみます :
.tte .ttf .otf .gai .afm .pfm .ttc
.TTE .TTF .OTF .GAI .AFM .PFM .TTC
> PostScript フ ォ ン ト の埋め込みが要求 さ れてい る 場合は、下記の接尾辞を フ ォ ン ト 名に
付加 し 、 その名前の フ ォ ン ト ア ウ ト ラ イ ン フ ァ イ ルがあ る か ど う か を順番に調べてみ
ます :
.pfa .pfb
.PFA .PFB
フ ォ ン ト フ ァ イ ルが見つか ら なか っ た と き は、 フ ォ ン ト 読み込みは下記のエ ラ ー メ ッ
セージ を出 し て止ま り ます :
Font cannot be embedded (PFA or PFB font file not found)
> 上述の候補フ ァ イ ル名群を 「あ り の ま ま に」 検索 し 、 ついで、 SearchPath リ ソ ース カ テ
ゴ リ 内で設定 さ れてい る すべてのデ ィ レ ク ト リ 名を前につけて検索 し ます。
こ れはすなわち、 手作業で一切設定を し な く て も 、 フ ォ ン ト の種類に従っ た標準的な フ ァ
イ ル名接尾辞 を フ ォ ン ト 名 に付加 し た 名前 を フ ォ ン ト フ ァ イ ル が 持 っ て お り 、 か つ
SearchPath デ ィ レ ク ト リ のいずれかの中に置かれてい る な ら ば、PDFlib はその フ ォ ン ト を
発見す る と い う こ と を意味 し ます。
下記の 2 つの コ ー ド は、 フ ォ ン ト ア ウ ト ラ イ ン フ ァ イ ルを見つけ る う えで同等の効力
を持ち ます :
p.set_parameter("FontOutline", "Arial=/usr/fonts/Arial.ttf");
font = p.load_font("Arial", "unicode", "");
と
p.set_parameter("SearchPath", "/usr/fonts");
font = p.load_font("Arial", "unicode", "");
標準日中韓 フ ォ ン ト Acrobat は、 日中韓テ キ ス ト のための さ ま ざ ま な標準フ ォ ン ト に対
応 し てい ます。 詳細 と フ ォ ン ト 名一覧は 169 ページ 「6.5.1 標準日中韓フ ォ ン ト 」 を参照
し て く だ さ い。 PDFlib は標準日中韓フ ォ ン ト を、 下記の要件が満た さ れ る な ら ば、 フ ォ ン
ト 検索処理のいちばん最初の段階で発見 し ます :
> 指定 さ れた フ ォ ン ト 名が標準日中韓フ ォ ン ト の名前 と 一致す る 。
> 指定 さ れたエン コ ーデ ィ ン グが、 定義済み CMap のいずれか 1 つの名前であ る 。
> embedding オプシ ョ ンが指定 さ れなか っ た。
こ れ ら の要件のいずれかに反す る と き は、 フ ォ ン ト 検索は継続 さ れます。 内部 リ ス ト で見
つかっ た標準日中韓フ ォ ン ト は決 し て埋め込まれません。 こ れ ら のいずれかを埋め込むた
めには、 フ ォ ン ト ア ウ ト ラ イ ン フ ァ イ ルを設定する 必要があ り ます。 例 :
font = p.load_font("KozGoPro-Medium", "90msp-RKSJ-H", "");
132
第 5 章 : フ ォ ン ト 処理
Type 3 フ ォ ン ト Type 3 フ ォ ン ト は、 実行時に、 標準 PDFlib グ ラ フ ィ ッ ク 関数群でグ リ
フ を定義す る こ と に よ っ て定義す る 必要があ り ます (117 ページ 「5.1.5 Type 3 フ ォ ン ト 」
参照)。 PDF_begin_font( ) に与え ら れた フ ォ ン ト 名が、 PDF_load_font( ) で要求 さ れた フ ォ
ン ト 名 と 一致す る と き は、 そのフ ォ ン ト がフ ォ ン ト 検索の最初の段階で選ばれます (その
フ ォ ン ト 名が標準日中韓フ ォ ン ト の名前 と 一致 し なかっ た と い う 前提で)。 例 :
p.begin_font("PDFlibLogoFont", 0.001, 0.0, 0.0, 0.001, 0.0, 0.0, "");
...
p.end_font();
...
font = p.load_font("PDFlibLogoFont", "logoencoding", "");
5.4.4 Windows ・ Mac OS X 上のホ ス ト フ ォ ン ト
Mac ・ Windows シ ス テ ム では PDFlib は、 オペレーテ ィ ン グ シ ス テ ムに イ ン ス ト ール さ れて
い る TrueType ・ OpenType ・ PostScript フ ォ ン ト を利用する こ と がで き ます。 こ う し た フ ォ
ン ト を ホ ス ト フ ォ ン ト と いい ま す。 手作業で フ ォ ン ト フ ァ イ ル を設定 し な く て も 、 その
フ ォ ン ト を単純にシ ス テ ムに イ ン ス ト ール (たいていは、 適切なデ ィ レ ク ト リ へそれを ド
ロ ッ プす る こ と に よ っ て) すれば、 PDFlib はそれを う ま く 利用 し ます。
ホ ス ト フ ォ ン ト を扱 う 際には、 その正確な (大文字 ・ 小文字を区別 し た) フ ォ ン ト 名
を用い る こ と が重要です。 フ ォ ン ト 名は重要ですので、 フ ォ ン ト 名決定のためのい く つか
のプ ラ ッ ト フ ォーム ご と の方式を以下に述べます。 フ ォ ン ト 名については さ ら に詳 し い情
報が 116 ページ 「5.1.3 PostScript Type 1 フ ォ ン ト 」 にあ り ます。
Windows 上のホ ス ト フ ォ ン ト 名 を知 る イ ン ス ト ール さ れてい る フ ォ ン ト の名前は、 そ
の フ ォ ン ト フ ァ イ ルを ダブル ク リ ッ ク し て、現れ る ウ ィ ン ド ウ の 1 行目に表示 さ れ る 完全
フ ォ ン ト 名を見れば簡単に知 る こ と がで き ます。フ ォ ン ト に よ っ ては、使っ てい る Windows
のバージ ョ ンに従っ てその名前の一部が ロ ーカ ラ イ ズ さ れてい る こ と も あ り ます。た と え
ば、 フ ォ ン ト 名の一部 と し て広 く 使われてい る Bold は、 ド イ ツ語シ ス テ ム上では翻訳 さ
れた単語 Fett と し て表示 さ れ る こ と があ り ます。 Windows シ ス テ ムか ら ホ ス ト フ ォ ン ト
デー タ を取得す る には、 変換 さ れた形の フ ォ ン ト 名 (Arial Fett 等) を PDFlib で用い る か、
あ る いはフ ォ ン ト ス タ イ ル名 (後述) を用い る 必要があ り ます。 し か し 、 フ ォ ン ト デー タ
を フ ァ イ ルか ら 直接取得す る には、 正規の ( ロ ーカ ラ イ ズ さ れていない) 形の フ ォ ン ト 名
(Arial Bold 等) を用い る 必要があ り ます。
注 こ の国際化の問題は、 ロー カ ラ イ ズ さ れた形のフ ォ ン ト 名を用いるのでな く 、 フ ォ ン ト ス
タ イル名 (「,Bold」 等、 後述) を付加する こ と によ っ て回避する こ と がで き ます。
TrueType フ ォ ン ト を も っ と 詳 し く 調べたい と き は、 Microsoft の無償の 「Font properties
extension」1 を見てみま し ょ う 。 フ ォ ン ト の TrueType テーブルの さ ま ざ ま な項目が、 人間
に読め る 形で表示 さ れます。
Windows の フ ォ ン ト ス タ イル名 Windows オペレーテ ィ ン グ シ ス テ ムか ら ホ ス ト フ ォ ン
ト を読み込む際には、 PDFlib ユーザーは、 Windows の フ ォ ン ト 選択機構が提供す る 機能を
利用す る こ と がで き ます : 太 さ と 斜体について ス タ イ ル名を与え る こ と がで き ます。 例 :
font = p.load_font("Verdana,Bold", "unicode", "");
1. www.microsoft.com/typography/TrueTypeProperty21.mspx を参照。
5.4 フ ォ ン ト を読み込む
133
こ れは 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 の フ ォ ン ト に対する ス タ イル名は、 ロー カ ラ イ ズ さ れた フ ォ ン ト 名を扱 う 必要
がある と き には有用で し ょ う 。 なぜな ら こ れは、 フ ォ ン ト バ リ エーシ ョ ンのロー カ ラ イ ズ
さ れた名前にかかわ ら ずそれを指定する ための汎用的な方式を提供するから です。
注 Windows のス タ イル名の命名方式は、 fontstyle オプ シ ョ ン と 混同 し てはいけません。 両
者は一見似ていますが、 ま っ た く 異な る動作をする も のです。
Windows 上のホ ス ト フ ォ ン ト 指定で起 こ り う る問題 Windows 上の フ ォ ン ト イ ン ス ト ー
ルに関 し て起 こ り う る 問題についてユーザーに注意を喚起 し ま す。 フ ォ ン ト を 「フ ァ イ
ル」 → 「新 し い フ ォ ン ト のイ ン ス ト ール ...」 メ ニ ュ ー項目で イ ン ス ト ールす る (フ ォ ン ト
を Fonts デ ィ レ ク ト リ へ ド ラ ッ グす る のではな く ) 場合、 チ ェ ッ ク ボ ッ ク ス 「フ ォ ン ト
フ ォ ルダに フ ォ ン ト を コ ピ ーす る」 が あ り ま す。 こ のボ ッ ク ス のチ ェ ッ ク を外 し てい る
と 、 Windows は元の フ ォ ン ト フ ァ イ ルへのシ ョ ー ト カ ッ ト ( リ ン ク ) を フ ォ ン ト フ ォ ルダ
内に置 く だけです。 こ の場合は元のフ ォ ン ト フ ァ イ ルは、 PDFlib を使っ てい る アプ リ ケー
シ ョ ン か ら 利用可能なデ ィ レ ク ト リ 内に置いて あ る 必要が あ り ま す。 特に、 Windows の
Fonts デ ィ レ ク ト リ 外の フ ォ ン ト フ ァ イ ルは IIS か ら はデフ ォ ル ト のセキ ュ リ テ ィ 設定では
利用で き ません。 解決策 : フ ォ ン ト フ ァ イ ルを Fonts デ ィ レ ク ト リ へ コ ピーす る か、 あ る
いは元の フ ォ ン ト フ ァ イ ルを IIS が読み取 り 権限を持つデ ィ レ ク ト リ 内に置 き ます。
Adobe Type Manager (ATM) で フ ォ ン ト を イ ン ス ト ールす る 際に 「フ ァ イルを コ ピー
せずに追加」 オプシ ョ ン をチ ェ ッ ク し ていた場合 も 、 同様の問題が起 こ る 可能性があ り ま
す。
134
第 5 章 : フ ォ ン ト 処理
Mac 上のホ ス ト フ ォ ン ト 名 Mac OS X に入っ てい る Font Book ユーテ ィ リ テ ィ を利用す
れば、 イ ン ス ト ール さ れてい る ホ ス ト フ ォ ン ト の名前を知 る こ と がで き ます。 プ ロ グ ラ ム
的にホ ス ト フ ォ ン ト の リ ス ト を作成す る には、Apple の無償提供 し てい る Font Tools1 を推
奨 し ます。 こ の コ マ ン ド ラ イ ンユーテ ィ リ テ ィ の ス イ ー ト には ftxinstalledfonts と い う プ
ロ グ ラ ムが含まれてお り 、 こ れは イ ン ス ト ール さ れてい る すべての フ ォ ン ト の正確な名前
を知 る ために有用です。PDFlib はホ ス ト フ ォ ン ト の名前 と し てい く つかの種類に対応 し て
い ます :
> QuickDraw フ ォ ン ト 名 : こ れは Mac OS 上で長い間使われて き た、 し か し も う 昔の も の
で あ る と 考え ら れてい る 旧式の フ ォ ン ト 名です。 QuickDraw フ ォ ン ト 名を知 る には、
タ ー ミ ナル ウ ィ ン ド ウ で下記の コ マ ン ド を実行 し ます :
ftxinstalledfonts -q
> 「一意」 フ ォ ン ト 名: こ れは新 し い フ ォ ン ト 名であ り (Mac OS では新 し い ATS フ ォ ン ト
関数で使え ます)、 東ア ジア フ ォ ン ト 等に対 し て Unicode でエン コ ー ド す る こ と も で き
ます。 一意フ ォ ン ト 名を知 る には、 タ ー ミ ナル ウ ィ ン ド ウ で下記の コ マ ン ド を実行 し
ます ( 「:」 を含む項目が出力に含まれ る こ と があ り ますが、 こ れは除去す る 必要があ
り ます) :
ftxinstalledfonts -u
> PostScript フ ォ ン ト 名。PostScript フ ォ ン ト 名を知 る には、タ ー ミ ナル ウ ィ ン ド ウ で下記
の コ マ ン ド を実行 し ます :
ftxinstalledfonts -p
注 PDFlib の Leopard ビル ド (Mac OS X 10.5 以上用) は、 上記 3 種類のホス ト フ ォ ン ト 名すべ
てに対応 し ています。 非 Leopard ビル ド では QuickDraw フ ォ ン ト 名 し か使え ません。
Mac 上で ホ ス ト フ ォ ン ト を利用す る際に起 こ り う る問題 私た ちのテ ス ト に よ れば、 新
規に イ ン ス ト ール さ れた フ ォ ン ト は、 ユーザーが コ ン ソ ールか ら ロ グ ア ウ ト し て、 再び ロ
グ イ ンす る ま で、 PDFlib の よ う な UI な し アプ リ ケーシ ョ ンか ら は利用で き ない こ と があ
り ます。
Mac OS X 10.5 (Leopard) では、 ホ ス ト フ ォ ン ト は、 リ モー ト コ ン ピ ュ ー タ か ら の タ ー
ミ ナルセ ッ シ ョ ン内で動作 し てい る プ ロ グ ラ ムか ら は利用で き ません。 こ れは PDFlib の
制約ではな く 、Font Tools な ど他のプ ロ グ ラ ムに も あ ては ま り ます。 こ の問題は Mac OS X
10.5.6 では修正 さ れてい ます。
5.4.5 予備 フ ォ ン ト
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/starter_fallback ト ピ ッ ク にあ り ま
す。
予備フ ォ ン ト は、 フ ォ ン ト と エン コ ーデ ィ ン グの不足な点を扱 う 強力な し く みを提供 し ま
す。 必要な フ ォ ン ト 変更が PDFlib に よ っ て自動的に行われますので、 こ れは さ ま ざ ま な
場面でテ キ ス ト 出力の実現に活用す る こ と がで き ま す。 こ の し く みは、 所与の フ ォ ン ト
(ベース フ ォ ン ト と いい ます) を、 他の 1 つない し 複数の フ ォ ン ト 内のグ リ フ を こ のベー
ス フ ォ ン ト に連結す る こ と に よ っ て強化す る も のです。 よ り 正確には : フ ォ ン ト は実際に
は変更 さ れないのですが、 PDFlib が PDF ページ記述内の必要な フ ォ ン ト 変更をすべて自
動的に行い ます。 予備フ ォ ン ト は下記の機能を提供 し ます :
1. developer.apple.com/textfonts/download を参照。
5.4 フ ォ ン ト を読み込む
135
> ベース フ ォ ン ト 内で得 ら れないグ リ フは自動的に、1 つない し 複数の予備フ ォ ン ト 内で
検索 さ れ ます。 言い換えれば、 フ ォ ン ト にグ リ フ を追加す る こ と が可能です。 複数の
予備フ ォ ン ト をベース フ ォ ン ト に対 し て紐付け る こ と が可能ですので、 少な く と も 1
つの フ ォ ン ト が適切な グ リ フ を含んでい る Unicode キ ャ ラ ク タ をすべて有効に使 う こ
と がで き ます。
> あ る 特定の予備フ ォ ン ト 内のグ リ フ を用いて、 ベース フ ォ ン ト 内のグ リ フ を上書 き す
る こ と がで き ます。 すなわち、 フ ォ ン ト 内のグ リ フ を置 き 換え る こ と が可能です。 1 つ
な い し 複数の個別の グ リ フ を 置 き 換え る こ と も で き ま す し 、 あ る いは置 き 換え た い
Unicode キ ャ ラ ク タ 群の範囲を 1 つない し 複数指定す る こ と も で き ます。
予備 フ ォ ン ト か ら の グ リ フ のサ イ ズ と 縦位置は、 ベー ス フ ォ ン ト に合 う よ う 調整で き ま
す。 ち ょ っ と 驚 く こ と には、 ベース フ ォ ン ト それ自身 も 予備フ ォ ン ト と し て使 う こ と が可
能です (同一の、 ま たは異な る エン コ ーデ ィ ン グで) 。 こ れを利用す る と 下記の ト リ ッ ク
が実装で き ます :
> ベース フ ォ ン ト それ自身を予備フ ォ ン ト と し て使 う こ と に よ っ て、 フ ォ ン ト 内のグ リ
フ群の一部ない し 全部のサ イ ズ ま たは位置を調節す る こ と がで き ます。
> ベース フ ォ ン ト の実際のエン コ ーデ ィ ン グ外のキ ャ ラ ク タ を追加で き ます。
予備フ ォ ン ト 機構は、 fallbackfonts フ ォ ン ト 読み込みオプシ ョ ンに よ っ て司 ら れ、 すべて
のテ キ ス ト 出力関数に対 し て効力を持ち ます。あ ら ゆ る フ ォ ン ト 読み込みオプシ ョ ン と 同
様に、 fallbackfonts オプシ ョ ンは PDF_load_font( ) への明示的な呼び出 し で与え る こ と も
で き ます し 、あ る いは暗黙的フ ォ ン ト 読み込みのためのオプシ ョ ン リ ス ト 内で与え る こ と
も で き ます。 1 つのベース フ ォ ン ト に対 し ては複数の予備フ ォ ン ト を指定す る こ と も 可能
な こ と か ら 、 fallbackfonts オプシ ョ ン は値 と し て オプ シ ョ ン リ ス ト の リ ス ト を と り ま す
(すなわち、 中括弧がその分必要です)。
PDF_info_font( ) を 利用す る と 、 予備 フ ォ ン ト 機構の結果 を取得す る こ と がで き ま す
(Section 5.12.2, ?Querying Codepage Coverage and Fallback Fonts? 参照)。
注意 予備フ ォ ン ト を扱 う 際には下記に留意 し て く だ さ い :
> フ ォ ン ト の組み合わせは必ず し も 、 タ イ ポ グ ラ フ ィ 的に美 し い結果を生み出すわけで
はあ り ません。 ベース フ ォ ン ト のグ リ フデザ イ ン に整合す る グ リ フデザ イ ン を持つ予
備フ ォ ン ト だけ を使 う よ う 注意を払 う 必要があ り ます。
> 予備フ ォ ン ト に対す る フ ォ ン ト 読み込みオプシ ョ ンは、fallbackfonts オプシ ョ ン リ ス ト
内で別途指定す る 必要があ り ます。 た と えば、 ベース フ ォ ン ト に対 し て埋め込みを指
定 し ていて も 、 予備フ ォ ン ト は自動的には埋め込まれません。
> 予備フ ォ ン ト は、その フ ォ ン ト が正 し い Unicode 情報を含んでい る 場合にのみ動作 し ま
す。 置換グ リ フは、 被置換グ リ フ と 同 じ Unicode 値を持っ てい る 必要があ り ます。
> 用字系固有のシ ェーピ ン グ (オプシ ョ ン shaping ・ script ・ locale) と OpenType 機能 (オ
プシ ョ ン features ・ script ・ language) は、 同一フ ォ ン ト 内のグ リ フ群に対 し てのみ適
用 さ れ、 ベース フ ォ ン ト と 1 つない し 複数の予備フ ォ ン ト と にわた る グ リ フ群に対 し
ては適用 さ れません。
> 下線 / 上線 / 取 り 消 し 線機能は、予備フ ォ ン ト を扱 う 際には注意 し て使 う 必要があ り ま
す。 ア セ ン ダ等の タ イ ポ グ ラ フ ィ 値について も 同様です。 ベース フ ォ ン ト 内で決定 さ
れ る 下線の太 さ ・ 位置は、 予備フ ォ ン ト 内の値 と は一致 し ない可能性があ り ます。 そ
の場合、 下線の位置 ま たは太 さ が見苦 し く ガ タ つ く こ と にな り ます。 こ の問題に対す
る 単純な回避策は、 統一的な値 を、 PDF_fit_textline( ) ・ PDF_add/create_textflow( ) の
underlineposition ・ underlinewidth オプシ ョ ンで指定す る こ と です。 こ の値は、 ベース
フ ォ ン ト と すべての予備フ ォ ン ト において う ま く い く よ う に選ぶ必要があ り ます。
136
第 5 章 : フ ォ ン ト 処理
以下の各項で、 予備フ ォ ン ト の重要な用途をい く つか解説 し 、 それを実現す る オプシ ョ ン
リ ス ト を示 し ます。
テキス ト フ ォ ン ト に数学キ ャ ラ ク タ を追加 数学グ リ フ がない と き の非常に荒っぽい解
決法 と し て、 fallbackfonts オプシ ョ ンに対 し て下記の フ ォ ン ト 読み込みオプシ ョ ン を用い
て、 Symbol フ ォ ン ト 内の数学グ リ フ を テ キ ス ト フ ォ ン ト に追加す る こ と がで き ます :
fallbackfonts={{fontname=Symbol encoding=unicode}}
複数の用字系で使え る よ う フ ォ ン ト を合体 場合に よ っ ては、 入力テ キ ス ト デー タ の用
字系が事前にわか ら ない こ と が あ り ま す。 た と えば、 デー タ ベー ス が欧文 ・ ギ リ シ ャ 文
字 ・ キ リ ル文字のテ キ ス ト を含んでい る のに、 得 ら れ る フ ォ ン ト は こ れ ら の用字系の う ち
の 1 つ し か同時に網羅 し ていない と い う 場合があ る か も し れません。用字系を決定 し て適
切な フ ォ ン ト を選ぶのではな く 、 い く つかの フ ォ ン ト を結びつけた フ ォ ン ト を構築 し て、
実質的にすべての用字系の スーパーセ ッ ト を網羅す る こ と が可能です。 fallbackfonts オプ
シ ョ ンに対 し て下記の フ ォ ン ト 読み込みオプシ ョ ン を用いて、ギ リ シ ャ 文字フ ォ ン ト と キ
リ ル文字フ ォ ン ト を欧文フ ォ ン ト に追加す る こ と がで き ます :
fallbackfonts={
{fontname=Times-Greek encoding=unicode embedding forcechars={U+0391-U+03F5}}
{fontname=Times-Cyrillic encoding=unicode embedding forcechars={U+0401-U+0490}}
}
8 ビ ッ ト エ ン コ ーデ ィ ン グ を拡張 入力デー タ が レ ガシ8ビ ッ ト エン コ ーデ ィ ン グに限 ら
れていた と し て も 、 こ のエ ン コ ーデ ィ ン グ外のキ ャ ラ ク タ を使 う こ と がで き ま す。 予備
フ ォ ン ト を利用 し て ( こ こ ではベース フ ォ ン ト それ自身を予備フ ォ ン ト と し ます)、 かつ、
PDFlib の文字参照の し く みを用いてエ ン コ ーデ ィ ン グ外のキ ャ ラ ク タ を指定すれば よ い
のです。 Helvetica フ ォ ン ト を encoding=iso8859-1 ( こ のエン コ ーデ ィ ン グはユー ロ グ リ フ
を含んでい ません) で読み込んだ と す る と 、 fallbackfonts オプシ ョ ンに対 し て下記の フ ォ
ン ト 読み込みオプシ ョ ン を用いて、 ユー ロ グ リ フ を フ ォ ン ト に追加する こ と がで き ます :
fallbackfonts={{fontname=Helvetica encoding=unicode forcechars=euro}}
入力エン コ ーデ ィ ン グはユー ロ キ ャ ラ ク タ を含んでい ませんので、それを 8 ビ ッ ト 値で指
定す る こ と はで き ません。 こ の制約を回避す る には文字参照かグ リ フ名参照 (&euro; 等)
を用い ます (112 ページ 「4.5.2 文字参照」 参照)。
別 フ ォ ン ト か ら のユー ロ グ リ フ を使 う 上記 と ほ と ん ど同 じ ですが、 ベー ス フ ォ ン ト が
ユー ロ グ リ フ を含んでいない場合 を考え ま す。 fallbackfonts オプ シ ョ ン に対 し て下記の
フ ォ ン ト 読み込みオプシ ョ ン を用いて、ユー ロ グ リ フ を別の フ ォ ン ト か ら 持っ て来 る こ と
がで き ます :
fallbackfonts={{fontname=Helvetica encoding=unicode forcechars=euro textrise=-5%}}}
textrise サブオプシ ョ ン を用いて、 ユー ロ グ リ フ を若干下へ下げま し た。
フ ォ ン ト 内の一部ない し 全部のグ リ フ を大 き く す る 予備 フ ォ ン ト を使 う と 、 フ ォ ン ト
内の一部ない し すべてのグ リ フ を、 文字サ イ ズ を変えずに大き く する こ と がで き ます。 こ
の場合 も 、 ベース フ ォ ン ト それ自身を予備フ ォ ン ト と し て用い ます。 こ の機能は、 さ ま ざ
ま な フ ォ ン ト のデザ イ ン を、 コ ー ド 内で文字サ イ ズ を調整せずに見た目上協調 さ せ る のに
5.4 フ ォ ン ト を読み込む
137
有用です。fallbackfonts オプシ ョ ンに対 し て下記の フ ォ ン ト 読み込みオプシ ョ ン を用いて、
指定 し た範囲内のすべてのグ リ フ を 120% へ大 き く す る こ と がで き ます :
fallbackfonts={
{fontname=Times-Italic encoding=unicode forcechars={U+0020-U+00FF} fontsize=120%}
}
拡大 し た ピ ク ト グ ラ ム を追加 fallbackfonts オプ シ ョ ン に対 し て下記の フ ォ ン ト 読み込
みオプシ ョ ン を用いて、 ZapfDingbats フ ォ ン ト か ら 記号を持っ て来 る こ と がで き ます :
fallbackfonts={
{fontname=ZapfDingbats encoding=unicode forcechars=.a12 fontsize=150% textrise=-15%}
}
こ の場合 も 、 fontsize ・ textrise サブオプ シ ョ ン を用い て、 記号のサ イ ズ と 位置をベー ス
フ ォ ン ト に合わせてい ます。
日中韓 フ ォ ン ト 内のグ リ フ を置 き換え fallbackfonts オプシ ョ ン に対 し て下記の フ ォ ン
ト 読み込みオプシ ョ ン を用いて、 ASCII 範囲内の欧文キ ャ ラ ク タ を別フ ォ ン ト か ら の も の
に置 き 換え る こ と がで き ます :
fallbackfonts={
{fontname=Courier-Bold encoding=unicode forcechars={U+0020-U+007E}}
}
ア ラ ビ ア文字 フ ォ ン ト に欧文キ ャ ラ ク タ を追加
文字テ キ ス ト 組版」 で解説 し てい ます。
こ の用途は 167 ページ 「6.4.5 ア ラ ビ ア
足 り ないグ リ フ を知 る 無償提供 さ れてい る フ ォ ン ト Unicode BMP Fallback SIL は、 実際
のグ リ フ でな く 各 Unicode 値の 16 進値を表示 し ます。 こ の フ ォ ン ト は、 ワー ク フ ロ ーに
おけ る フ ォ ン ト 関連の問題を診断す る のに非常に有用な と き があ り ます。 fallbackfonts オ
プシ ョ ンに対 し て下記の フ ォ ン ト 読み込みオプシ ョ ン を用いて、 任意の フ ォ ン ト を、 足 り
ないキ ャ ラ ク タ が可視化 さ れ る よ う こ の特殊な予備フ ォ ン ト で強化する こ と がで き ます :
fallbackfonts={{fontname={Unicode BMP Fallback SIL} encoding=unicode}}
外字キ ャ ラ ク タ を フ ォ ン ト に追加 こ の用途は 172 ページ 「6.5.3 EUDC ・ SING フ ォ ン ト
で外字キ ャ ラ ク タ を利用」 で解説 し てい ます。
138
第 5 章 : フ ォ ン ト 処理
5.5 フ ォ ン ト の埋め込み ・ サブ セ ッ ト 化
5.5.1 フ ォ ン ト の埋め込み
Acrobat におけ る PDF の フ ォ ン ト 埋め込み と フ ォ ン ト 置換 PDF 文書は、 正 し いテ キ ス
ト 表示を確保す る ために、 フ ォ ン ト デー タ を さ ま ざ ま な形式で含む こ と がで き ます。 あ る
いは、 キ ャ ラ ク タ の メ ト リ ッ ク と い く つかの一般的な フ ォ ン ト 情報だけ を含む (グ リ フ の
ア ウ ト ラ イ ン本体を含 ま ない) フ ォ ン ト 記述子を埋め込む こ と も で き ま す。 フ ォ ン ト が
PDF 文書に埋め込まれていない場合、 Acrobat はそれが タ ーゲ ッ ト シ ス テ ム で得 ら れれば
それを取 り (「ロー カル フ ォ ン ト を用いる」)、 あ る いはフ ォ ン ト 記述子に従っ て代替フ ォ
ン ト を組み立て よ う と 試みます。代替フ ォ ン ト が使われ る こ と に よ っ てテ キ ス ト は読め る
よ う にな り ますが、 そのグ リ フは元のフ ォ ン ト と は異な る 可能性があ り ます。 よ り 重要な
こ と は、 Acrobat の代替フ ォ ン ト (AdobeSansMM ・ AdobeSerifMM) は欧文テ キ ス ト に対
し てのみ働 き 、 それ以外の用字系や記号グ リ フ に対 し ては一切働かない と い う こ と です。
同様に、 代替フ ォ ン ト は、 複雑用字系のシ ェーピ ン グか OpenType レ イ ア ウ ト 機能が使わ
れてい る と き には働 き ません。 こ う し た理由か ら 、 一般にはフ ォ ン ト の埋め込みを推奨 し
ます。 ただ し 、 文書が フ ォ ン ト を埋め込んでいな く て も タ ーゲ ッ ト シ ス テ ム上での表示が
許容範囲内にな る と わか っ てい る 場合は例外です。 その よ う な PDF フ ァ イ ルは本質的に
非可搬ですが、すべての ワー ク ス テーシ ョ ン上で必要フ ォ ン ト が得 ら れ る と わか っ てい る
企業ネ ッ ト ワー ク な ど の制御 さ れた環境においては役に立つか も し れません。
PDFlib で フ ォ ン ト を埋め込み フ ォ ン ト の 埋 め 込 み は、 フ ォ ン ト を 読 み 込 む 際 に
embedding オプシ ョ ンで司 ら れます (ただ し 場合に よ っ ては PDFlib はフ ォ ン ト を強制的
に埋め込みます) :
font = p.load_font("WarnockPro", "winansi", "embedding");
表 5.1 に挙げ る よ う に、 使用フ ォ ン ト ご と に PDFlib が必要 と す る フ ォ ン ト ・ メ ト リ ッ ク
フ ァ イ ルは使用フ ォ ン ト ご と に異な り ます。 表 5.1 に挙げ る 要請に加え て、 (標準ま たは
カ ス タ ムの) 日中韓フ ォ ン ト をいずれかの標準 CMap で使 う には、 その CMap フ ァ イ ルが
(場合に よ っ てはその文字集合に対す る Adobe-Japan1-UCS2 等の Unicode マ ッ ピ ン グ CMap
も ) 得 ら れ る 必要があ り ます。
不可視テ キ ス ト (主に OCR 出力に有用) にのみ使われ る フ ォ ン ト に対す る フ ォ ン ト 埋
め込みは、 フ ォ ン ト を読み込む際に optimizeinvisible オプシ ョ ン で制御す る こ と がで き ま
す。
表 5.1 さ ま ざ ま な フ ォ ン ト 使用状況 と 必要フ ァ イル
使用 フ ォ ン ト
フ ォ ン ト の メ ト リ ッ ク フ ァ フ ォ ン ト のアウ ト ラ イ ン
イルが必要か
フ ァ イルが必要か
14 コ ア フ ォ ン ト のいずれか
×
embedding=true の場合の
み
Mac か Windows シ ス テムに イ ン ス ト ール さ れて
いる TrueType ・ OpenType ・ PostScript Type 1 ホ
ス ト フォン ト
×
×
非 コ ア PostScript フ ォ ン ト
○
embedding=true の場合の
み
5.5 フ ォ ン ト の埋め込み ・ サブ セ ッ ト 化
139
表 5.1 さ ま ざ ま な フ ォ ン ト 使用状況 と 必要フ ァ イル
使用フ ォ ン ト
フ ォ ン ト の メ ト リ ッ ク フ ァ フ ォ ン ト のアウ ト ラ イ ン
イルが必要か
フ ァ イルが必要か
TrueType フ ォ ン ト
n/a
○
n/a
○
×
×
OpenType ・ SING フ ォ ン ト
標準日中韓フ ォ ン ト
1
1. 日中韓 フ ォ ン ト に関 し て詳 し く は 169 ページ 「6.5 日本語 ・ 中国語 ・ 韓国語テキス ト 出力」 を参照。
フ ォ ン ト 埋め込みの法的側面 留意 し ておかな ければな ら ない重要な こ と は、 あ る フ ォ
ン ト フ ァ イ ルを持っ てい る と い う 理由だけでは、 その フ ォ ン ト を PDF に埋め込んで も よ
い と い う 正当化はで き ない と い う こ と です。た と え合法な フ ォ ン ト ラ イ セ ン ス を保持 し て
いて も 同様です。 多 く の フ ォ ン ト ベン ダーが、 自社の フ ォ ン ト の埋め込みには制限を加え
てい ます。 さ ま ざ ま な書体工房のなかには、 PDF の フ ォ ン ト 埋め込みを完全に禁止 し てい
る と こ ろ も あ り ます し 、自社の フ ォ ン ト に対す る 特別なオン ラ イ ン ラ イ セ ン スや埋め込み
ラ イ セ ン ス を提示 し てい る と こ ろ も あ り ます し 、 ま た、 フ ォ ン ト にサブセ ッ ト 化を施す限
り において フ ォ ン ト 埋め込みを許 し てい る と こ ろ も あ り ます。 フ ォ ン ト を PDFlib で埋め
込んでみ よ う と 試み る 前に、 まず、 その フ ォ ン ト の埋め込みが法的にはど の よ う な こ と に
な る のか調べて く だ さ い。TrueType フ ォ ン ト や OpenType フ ォ ン ト の中では埋め込み制限
を指定 し てお く こ と がで き る ので、 PDFlib はその指定に従い ます。 TrueType フ ォ ン ト の
中の埋め込みフ ラ グが “埋め込み不可” に設定 さ れてい る 場合1、 PDFlib はフ ォ ン ト ベン
ダーの要請に従い、 その フ ォ ン ト を埋め込 も う と する あ ら ゆ る 試みを拒否 し ます。
5.5.2 フ ォ ン ト のサブ セ ッ ト 化
PDF 出力のサ イ ズ を減 ら すために、PDFlib は、 あ る フ ォ ン ト の中で実際にその文書の中で
使われてい る グ リ フ だけ を埋め込む こ と がで き ます。 こ の処理を フ ォ ン ト のサブセ ッ ト 化
と いい ます。 サブセ ッ ト 化を行 う と 新 し い フ ォ ン ト が作成 さ れ、 その中ではグ リ フ の数が
元の フ ォ ン ト よ り も 少な く 、 PDF の表示に必要ない フ ォ ン ト 情報 も 省略 さ れてい ます。 た
だ し 、 Acrobat の TouchUp テ キ ス ト ツールは、 サブセ ッ ト フ ォ ン ト のテ キ ス ト では動作 し
て く れません。 フ ォ ン ト のサブセ ッ ト 化は特に日中韓フ ォ ン ト において重要です。 PDFlib
は次の種類の フ ォ ン ト のサブセ ッ ト 化に対応 し てい ます。
> TrueType フ ォ ン ト 。
> PostScript か TrueType のア ウ ト ラ イ ン を持つ OpenType フ ォ ン ト 。
> Type 3 フ ォ ン ト (特別な扱いが必要、 141 ページ 「Type 3 フ ォ ン ト のサブセ ッ ト 化」 を
参照)
サブセ ッ ト 化を要求 さ れてい る フ ォ ン ト が文書内で使われてい る 場合、PDFlib は実際にテ
キ ス ト 出力に使われてい る キ ャ ラ ク タ を調べます。サブセ ッ ト 化の動作を制御す る にはい
く つかの方法があ り ます (autosubsetting は指定 し ていない と し て) :
> デフ ォ ル ト のサブセ ッ ト 化の動作は autosubsetting パ ラ メ タ で制御 さ れます。も し こ の
パ ラ メ タ が true な ら ば、 サブセ ッ ト 化可能なすべての フ ォ ン ト に対 し てサブセ ッ ト 化
が有効にな り ます (特別な扱いが必要な Type 3 フ ォ ン ト の場合を除 き ます、 後述)。 デ
フ ォ ル ト 値は true です。
> autosubsetting=true の場合:subsetlimit パ ラ メ タ はパーセ ン ト 値を持ち ます。文書内で
用い ら れてい る 、あ る フ ォ ン ト 内のグ リ フ の数が こ の割合を超え る 場合には、その フ ォ
1. も っ と 明確に言えば、 その フ ォ ン ト の OS/2 テーブル内の fsType フ ラ グが値 2 を持つ場合。
140
第 5 章 : フ ォ ン ト 処理
ン ト のサブセ ッ ト 化は無効 と な り 、 かわ り に フ ォ ン ト 全体が埋め込ま れ ます。 こ れに
よ っ て処理時間があ る 程度短縮で き ますが、 そのかわ り に出力フ ァ イ ルの容量は大 き
く な り ます。
p.set_value("subsetlimit", 75); /* サブセットの限界を75%に設定 */
subsetlimit のデフ ォ ル ト 値は 100 パーセ ン ト です。 言い換えれば、 ク ラ イ ア ン ト が明
示的に 100 パーセ ン ト 未満の限界値を要求 し ない限 り 、 PDF_load_font( ) で要求 さ れ る
サブセ ッ ト 化オプシ ョ ンは効力を持ち ます。
> autosubsetting=true の場合:subsetminsize パ ラ メ タ を用い る と 、容量の小 さ な フ ォ ン ト
のサブセ ッ ト 化を完全に無効にす る こ と がで き ます。 元の フ ォ ン ト フ ァ イ ルの容量が
subsetminsize の値 よ り も KB 単位で小 さ い場合、 その フ ォ ン ト のサブセ ッ ト 化は無効
にな り ます。
TrueType フ ォ ン ト の埋め込み と サブ セ ッ ト 化 あ る TrueType フ ォ ン ト が、 winansi か
macroman 以外のエン コ ーデ ィ ン グで使用 さ れ る フ ォ ン ト であ る 場合、 デフ ォ ル ト ではそ
の フ ォ ン ト は PDF 出力の際に CID フ ォ ン ト に変換 さ れます。 Adobe グ リ フ リ ス ト (AGL)
の中にあ る キ ャ ラ ク タ だけ を含むエ ン コ ーデ ィ ン グの場合には、 autocidfont パ ラ メ タ を
false に設定すれば こ の変換は行われません。
初期 フ ォ ン ト サブ セ ッ ト を指定 フ ォ ン ト サブセ ッ ト は、 文書内で使われてい る すべて
のグ リ フ のア ウ ト ラ イ ン記述を含んでい ます。 こ れはすなわち、 生成 さ れ る 文書サブセ ッ
ト は文書ご と に変化す る こ と を意味 し ます。 なぜな ら 一般に、 各文書内ではそれぞれ異な
る キ ャ ラ ク タ (ひいてはグ リ フ) のセ ッ ト が用い ら れてい る か ら です。 フ ォ ン ト サブセ ッ
ト を埋め込んだた く さ んの小 さ な文書を大 き な文書へ連結す る 際には、 フ ォ ン ト サブセ ッ
ト がそれぞれま ち ま ちであ る こ と は厄介です:埋め込まれてい る サブセ ッ ト は全部互いに
異な る ため、 除去で き ないのです。
こ う し た場合のために、PDFlib では、PDF_load_font( ) の initialsubset オプシ ョ ンで フ ォ
ン ト サブセ ッ ト の初期内容を指定す る こ と が可能です。PDFlib がデフ ォ ル ト では空のサブ
セ ッ ト か ら 開始 し 、生成 さ れ る テ キ ス ト 出力か ら の要請に応 じ て グ リ フ を追加 し てい く の
に対 し て、initialsubset オプシ ョ ン を利用す る と 、空でないサブセ ッ ト を指定す る こ と がで
き ます。 た と えば、 Latin-1 テ キ ス ト 出力のみが生成 さ れ る と わか っ てい る 場合に、 フ ォ
ン ト がその他のグ リ フ も た く さ ん含んでい る な ら ば、 先頭 Unicode ブ ロ ッ ク を初期サブ
セ ッ ト と し て指定す る こ と がで き ます :
initialsubset={U+0020-U+00FF}
こ れはすなわち、 指定 し た範囲内のすべての Unicode キ ャ ラ ク タ に対す る グ リ フ がサブ
セ ッ ト 内に入れ込まれ る こ と を意味 し ます。 こ の範囲を、 生成 さ れ る 文書内のすべてのテ
キ ス ト を網羅す る よ う に選んでおいた な ら ば、生成 さ れ る フ ォ ン ト サブセ ッ ト はすべての
文書内で等 し く な る で し ょ う 。 そ う すれば、 こ の よ う な文書群を あ と で 1 個の PDF へ連
結す る 際に、 等 し い フ ォ ン ト サブセ ッ ト 群は PDF_begin_document( ) の optimize オプシ ョ
ンで除去す る こ と が可能にな り ます。
Type 3 フ ォ ン ト のサブ セ ッ ト 化 Type 3 フ ォ ン ト を文書で使え る よ う にす る には、 その
前に まず (グ リ フ の幅が必要なので) それを定義 し なければな ら ず、 ひいては埋め込ま な
ければな り ません。 と こ ろがその一方でサブセ ッ ト 化は、 すべてのページ を作成 し た後で
は じ めて可能にな る も のです (正 し いサブセ ッ ト を決定する には、 ど のグ リ フ が文書内で
使われたか を知 る 必要があ る ので)。 こ の矛盾を避け る ために PDFlib は、 幅オン リ ー Type
5.5 フ ォ ン ト の埋め込み ・ サブ セ ッ ト 化
141
3 フ ォ ン ト に対応 し てい ます。 Type 3 フ ォ ン ト についてサブセ ッ ト 化が必要な と き は、 以
下の 2 回に分けて フ ォ ン ト を定義す る 必要があ り ます。
> 1 回目は、 フ ォ ン ト を使 う 前に、PDF_begin_font( ) で widthsonly オプシ ョ ン を指定 し て
行 う 必要があ り ます。 こ こ ではフ ォ ン ト と グ リ フ の メ ト リ ッ ク (幅) だけ を定義 し ま
す。 PDF_begin_font( ) の フ ォ ン ト マ ト リ ッ ク ス と 、 PDF_begin_glyph( ) の wx と グ リ フ
外接枠を与え る 必要があ り 、 かつ実際のグ リ フ の メ ト リ ッ ク を正確に記述す る 必要が
あ り ます。 グ リ フ ご と に PDF_begin_glyph( ) と PDF_end_glyph( ) だけが必要であ り 、 そ
れ以外に実際のグ リ フ の形を定義す る 呼び出 し は一切不要です。 グ リ フ定義の開始 と
終了の間で他の関数を呼び出 し た場合、 それは PDF 出力に対 し て何 ら 効力を持たず、
例外 も 一切発生 し ません。
> 2 回目は、 こ の フ ォ ン ト のテ キ ス ト をすべて作成 し た後に行 う 必要があ り 、実際のグ リ
フ のア ウ ト ラ イ ンか ビ ッ ト マ ッ プ を定義 し ます。 フ ォ ン ト と グ リ フ の メ ト リ ッ ク は、 1
回目ですでにわか っ てい る ので無視 さ れ ま す。 最後のページが作成 さ れた後、 PDFlib
は ど のグ リ フ が文書内で使われてい る か も 知っ てい る ので、 必要な グ リ フ定義だけ を
埋め込んで フ ォ ン ト サブセ ッ ト を構成 し ます。
1 回目 と 2 回目では、 同 じ グ リ フ群を与えなければな り ません。 サブセ ッ ト 化を伴 う Type
3 フ ォ ン ト は、 PDF_load_font( ) で 1 回だけ読み込む こ と がで き ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの fonts/type3_subsetting ト ピ ッ ク にあ り ます。
142
第 5 章 : フ ォ ン ト 処理
5.6 フ ォ ン ト 情報 を取得
PDF_info_font( ) を利用す る と 、 フ ォ ン ト ・ エン コ ーデ ィ ン グ ・ Unicode ・ グ リ フ に関 し て
有用な情報を取得す る こ と がで き ます。 取得 し たい情報の種類に よ っ ては、 有効な フ ォ ン
ト ハン ド ルが こ の関数の引数 と し て必要な場合 も あ り ます。 以下すべての例で、 表 5.2 に
挙げ る 変数を用い る こ と に し ます。
表 5.2 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_parameter("string", gn_idx);
String enc;
エ ン コ ーデ ィ ング名
int font;
PDF_load_font( ) で取得 し た有効な フ ォ ン ト ハン ド ル
求め ら れた キー ワ ー ド と オプシ ョ ン (群) の組み合わせが得 ら れない と き は、 PDF_info_
font( ) は -1 を返 し ます。 こ れは、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン側でチ ェ ッ ク す る 必要
があ り 、 ま た こ れを用いて、 求め る グ リ フ が フ ォ ン ト 内にあ る か ど う か をチ ェ ッ ク す る こ
と がで き ます。
以下のサ ン プル コ ー ド 行は、 互いに依存 し てい ませんので、 独立に抜 き 出 し て利用す
る こ と がで き ます。
5.6.1 フ ォ ン ト 非依存のエ ン コ ーデ ィ ン グ ・ Unicode ・ グ リ フ 名取得
エ ン コ ーデ ィ ン グ取得 エ ン コ ーデ ィ ン グの取得には、 有効な フ ォ ン ト ハン ド ルは必要
ではあ り ません。 すなわち、 PDF_info_font( ) の font 引数に値 -1 (PHP では 0) を与え る
こ と がで き ます。 gn には、 PDFlib が内部的に知っ てい る グ リ フ名だけ を与え る こ と がで
き 、 フ ォ ン ト 独自のグ リ フ名を与え る こ と はで き ません。
Unicode キ ャ ラ ク タ 、指名 し た グ リ フ の 8 ビ ッ ト エン コ ーデ ィ ン グ内の 8 ビ ッ ト コ ー ド
を取得 :
c = (int) p.info_font(-1, "code", "unicode=" + uv + " encoding=" + enc);
c = (int) p.info_font(-1, "code", "glyphname=" + gn + " encoding=" + enc);
8 ビ ッ ト コ ー ド 、 指名 し た グ リ フ の 8 ビ ッ ト エン コ ーデ ィ ン グ内の Unicode 値を取得 :
uv = (int) p.info_font(-1, "unicode", "code=" + c + " encoding=" + enc);
uv = (int) p.info_font(-1, "unicode", "glyphname=" + gn + " encoding=" + enc);
8 ビ ッ ト コ ー ド 、Unicode 値の 8 ビ ッ ト エン コ ーデ ィ ン グ内の登録 さ れた グ リ フ名を取得 :
5.6 フ ォ ン ト 情報を取得
143
gn_idx = (int) p.info_font(-1, "glyphname", "code=" + c + " encoding=" + enc);
gn_idx = (int) p.info_font(-1, "glyphname", "unicode=" + uv + " encoding=" + enc);
/* 文字列番号を用いて実際のグリフ名を取得 */
gn = p.get_parameter("string", gn_idx);
Unicode ・ グ リ フ 名取得 PDF_info_font( ) を利用する と 、特定の 8 ビ ッ ト エン コ ーデ ィ ン
グに依存せず、Unicode 値 と PDFlib が内部的に知っ てい る 名前 と の関係にかかわ る 情報取
得を行 う こ と も 可能です。 こ れ ら の情報取得はいかな る フ ォ ン ト に も 依存 し ませんので、
有効な フ ォ ン ト ハン ド ルは必要ではあ り ません。
内部的に知 ら れてい る グ リ フ名の Unicode 値を取得 :
uv = (int) p.info_font(-1, "unicode", "glyphname=" + gn + " encoding=unicode");
Unicode 値の内部グ リ フ名を取得 :
gn_idx = (int) p.info_font(-1, "glyphname", "unicode=" + uv + " encoding=unicode");
/* 文字列番号を用いて実際のグリフ名を取得 */
gn = p.get_parameter("string", gn_idx);
5.6.2 フ ォ ン ト 依存のエ ン コ ーデ ィ ン グ ・ Unicode ・ グ リ フ 名取得
以下の情報取得は、 特定の フ ォ ン ト にかかわ る も のですので、 有効な フ ォ ン ト ハン ド ルで
フ ォ ン ト を指定す る 必要があ り ます。 gn 変数を用いて、 内部的に知 ら れてい る グ リ フ だ
けでな く 、 フ ォ ン ト 独自のグ リ フ名を与え る こ と も で き ます。 以下すべての例において、
戻 り 値 -1 は、 求めた グ リ フ を その フ ォ ン ト が含んでいない こ と を意味 し ます。
8 ビ ッ ト エン コ ーデ ィ ン グで読み込んだ フ ォ ン ト 内の Unicode 値、 グ リ フ ID、 指名 し
た グ リ フ、 CID に対す る 8 ビ ッ ト コ ー ド を取得 :
c
c
c
c
=
=
=
=
(int)
(int)
(int)
(int)
p.info_font(font,
p.info_font(font,
p.info_font(font,
p.info_font(font,
"code",
"code",
"code",
"code",
"unicode=" + uv);
"glyphid=" + gid);
"glyphname=" + gn);
"cid=" + cid);
フ ォ ン ト 内の コ ー ド 、 グ リ フ ID、 指名 し た グ リ フ、 CID に対する Unicode 値を取得 :
uv
uv
uv
uv
=
=
=
=
(int)
(int)
(int)
(int)
p.info_font(font,
p.info_font(font,
p.info_font(font,
p.info_font(font,
"unicode",
"unicode",
"unicode",
"unicode",
"code=" + c);
"glyphid=" + gid);
"glyphname=" + gn);
"cid=" + cid);
フ ォ ン ト 内の コ ー ド 、 Unicode 値、 指名 し た グ リ フ、 CID に対す る グ リ フ ID を取得 :
gid
gid
gid
gid
=
=
=
=
(int)
(int)
(int)
(int)
p.info_font(font,
p.info_font(font,
p.info_font(font,
p.info_font(font,
"glyphid",
"glyphid",
"glyphid",
"glyphid",
"code=" + c);
"unicode=" + uv);
"glyphname=" + gn);
"cid=" + cid);
任意の 8 ビ ッ ト エン コ ーデ ィ ン グにおけ る フ ォ ン ト 内の コ ー ド 、 Unicode 値、 指名 し た グ
リ フ に対す る グ リ フ ID を取得 :
gid = (int) p.info_font(font, "glyphid", "code=" + c + " encoding" + enc);
gid = (int) p.info_font(font, "glyphid", "unicode=" + uv + " encoding=" + enc);
gid = (int) p.info_font(font, "glyphid", "glyphname=" + gn + " encoding=" + enc);
144
第 5 章 : フ ォ ン ト 処理
コ ー ド ・ Unicode 値 ・ CID で指定 し た グ リ フ の フ ォ ン ト 独自の名前を取得 :
gn_idx
gn_idx
gn_idx
gn_idx
=
=
=
=
(int)
(int)
(int)
(int)
p.info_font(font,
p.info_font(font,
p.info_font(font,
p.info_font(font,
"glyphname",
"glyphname",
"glyphname",
"glyphname",
"code=" + c);
"unicode=" + uv);
"glyphid=" + gid);
"cid=" + cid);
/* 文字列番号を用いて実際のグリフ名を取得 */
gn = p.get_parameter("string", gn_idx);
グ リ フ 互換性 を調べ る PDF_info_font( ) を利用す る と 、 自分のアプ リ ケーシ ョ ン で必要
な グ リ フ を あ る 特定の フ ォ ン ト が含んでい る か ど う か を調べ る こ と がで き ま す。 た と え
ば、 下記の コ ー ド はユー ロ グ リ フ が フ ォ ン ト 内に含まれてい る か ど う かを調べます :
/* "unicode=U+20AC"でもよい */
if (p.info_font(font, "code", "unicode=euro") == -1)
{
/* ユーログリフに対するグリフがフォント内で得られない */
}
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの fonts/glyph_availability ト ピ ッ ク にあ り ます。
あ る いは PDF_info_textline( ) を使っ て、 所与のテ キ ス ト 文字列におけ る マ ッ プな し キ ャ ラ
ク タ の数を、 すなわち文字列内の、 フ ォ ン ト 内で適当な グ リ フ が得 ら れないキ ャ ラ ク タ の
数を調べ る こ と も で き ま す。 下記の コ ー ド では、 ユー ロ キ ャ ラ ク タ (グ リ フ名参照で表
現) 1 個だけ を内容 と す る 文字列についての結果を取得 し てい ま す。 も し も マ ッ プ な し
キ ャ ラ ク タ が 1 個見つかれば、 こ れはすなわちその フ ォ ン ト がユー ロ 記号に対す る グ リ フ
を一切含んでいない こ と を意味 し ます :
String optlist = "font=" + font + " charref";
if (p.info_textline("&euro;", "unmappedchars", optlist) == 1)
{
/* ユーロ記号に対するグリフはフォント内で得られない */
}
5.6.3 コ ー ド ページ網羅性 と 予備 フ ォ ン ト を取得
PDF_info_font( ) を利用す る と 、あ る 特定の言語ない し 用字系のテ キ ス ト 出力を生成す る の
に フ ォ ン ト が適 し てい る か ど う か を調べ る こ と も で き ます。 そのためには、 そのテ キ ス ト
で ど の コ ー ド ページ が必要かがわか っ て い る 必要が あ り ま す。 コ ー ド ページ網羅性は、
フ ォ ン ト の OS/2 テーブル内にエン コ ー ド さ れてい ます。 ただ し 、 フ ォ ン ト があ る 特定の
コ ー ド ページに対応 し てい る と は正確には何を意味す る のかは、 フ ォ ン ト デザ イ ナーの考
え方一つで決ま り ます。 フ ォ ン ト があ る 特定の コ ー ド ページに対応 し てい る と 言っ てい る
か ら と いっ て、必ず し も それがその コ ー ド ページ内のすべてのキ ャ ラ ク タ に対す る グ リ フ
を含んでい る と は限 り ません。 よ り 正確な網羅性情報が必要な場合は、 144 ページ 「5.6.2
フ ォ ン ト 依存のエ ン コ ーデ ィ ン グ ・ Unicode ・ グ リ フ名取得」 で示 し た よ う に し てすべて
の必要な キ ャ ラ ク タ の入手可能性を取得す る こ と がで き ます。
フ ォ ン ト が コ ー ド ページ に対応 し てい るかど う か を調べ る 下記の コ ー ド では、 フ ォ ン
ト があ る 特定の コ ー ド ページに対応 し てい る か ど う かを調べてい ます :
String cp="cp1254";
5.6 フ ォ ン ト 情報を取得
145
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_parameter("string", cp_idx));
}
こ れは、 広 く 用い ら れてい る Arial フ ォ ン ト に対 し ては下記の リ ス ト を生成 し ます :
cp1252 cp1250 cp1251 cp1253 cp1254 cp1255 cp1256 cp1257 cp1258 cp874 cp932 cp936 cp949
cp950 cp1361
予備 フ ォ ン ト を取得 PDF_info_font( ) を利用す る と 、 予備フ ォ ン ト 機構の結果を取得す
る こ と がで き ます (予備フ ォ ン ト について詳 し く は 135 ページ 「5.4.5 予備フ ォ ン ト 」 を
参照)。 下記の コ ー ド では、 指定 し た 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_parameter("string", idx);
}
146
第 5 章 : フ ォ ン ト 処理
6 テキス ト 出力
6.1 さ ま ざ ま な テキス ト 出力方式
PDFlib は、 テ キ ス ト 出力にい く つかの レベルで対応 し てい ます :
> PDF_show( ) や類似の関数群に よ る 低レベルテ キ ス ト 出力。
> PDF_fit_textline( ) に よ る 一行に組まれたテ キ ス ト 出力。こ の関数はパ ス上のテ キ ス ト に
も 対応 し てい ます。
> テ キ ス ト フ ロ ーに よ る 複数行テ キ ス ト 組版出力 (PDF_fit_textflow( ) お よ び関連す る 関
数群)。 テ キ ス ト フ ロ ー組版機能は、 ベ ク ト ルベース の形状の内側ま たは外側にテ キ ス
ト を回 り こ ませる こ と も で き ます。
> 表内のテ キ ス ト 。 表組版機能は、 表セル内のテ キ ス ト 行 ・ テ キ ス ト フ ロ ー内容に対応
し てい ます。
低 レ ベルテキス ト 出力 PDF_show( ) の よ う な関数群を使 う と 、 テ キ ス ト をページ上のあ
る 特定の場所に、 いかな る 組版支援を も 利用せずに配置する こ と がで き ます。 こ れは、 非
常に基本的な出力要請を持つアプ リ ケーシ ョ ン (プ レーン テ キ ス ト フ ァ イ ルを PDF へ変
換す る 等) 、 あ る いはすでに完全なテ キ ス ト 配置情報を持っ てい る アプ リ ケーシ ョ ンの場
合にのみ推奨 し ます (別形式のページ を PDF へ変換する ド ラ イ バ等)。
下記の コ ー ド は低レベル関数群でテ キ ス ト 出力を生成 し ます :
font = p.load_font("Helvetica", "unicode", "");
p.setfont(font, 12);
p.set_text_pos(50, 700);
p.show("Hello world!");
p.continue_text("(says Java)");
テキス ト 行で組まれた一行テキス ト 出力 PDF_fit_textline( ) は、 一行だけのテ キ ス ト 出
力を生成 し 、 さ ま ざ ま な組版機能を提供 し ます。 ただ し 、 テ キ ス ト 行ご と の位置は ク ラ イ
ア ン ト アプ リ ケーシ ョ ンが決定す る 必要があ り ます。
下記の コ ー ド はテ キ ス ト 行でテ キ ス ト 出力を生成 し ます。 フ ォ ン ト ・ エ ン コ ーデ ィ ン
グ ・ 文字サ イ ズはオプシ ョ ン と し て指定で き ますので、 こ れに先立っ て PDF_load_font( )
を呼び出 し てお く 必要はあ り ません :
p.fit_textline(text, x, y, "fontname=Helvetica encoding=unicode fontsize=12");
テ キ ス ト 行について詳 し く は 197 ページ 「8.1 テ キ ス ト 行の配置 と はめ込み」 を参照 し て
く だ さ い。
テキス ト フ ロ ーに よ る複数行テキス ト 出力 PDF_fit_textflow( ) は、 任意の行数のテ キ ス
ト 出力を生成 し 、 ま た、 テ キ ス ト を複数の段組みま たはページにわた ら せ る こ と も で き ま
す。 テ キ ス ト フ ロ ー組版機能はた く さ んの組版機能に対応 し てい ます。
下記の コ ー ド はテ キ ス ト フ ロ ーでテ キ ス ト 出力を生成 し ます :
tf = p.add_textflow(tf, text, optlist);
result = p.fit_textflow(tf, llx, lly, urx, ury, optlist);
p.delete_textflow(tf);
6.1 さ ま ざ ま な テキス ト 出力方式
147
テ キ ス ト フ ロ ーについて詳 し く は 205 ページ 「8.2 複数行のテ キ ス ト フ ロ ー」 を参照 し て
く だ さ い。
表内のテキス ト テ キ ス ト 行 と テ キ ス ト フ ロ ーを使っ て、表セル内にテ キ ス ト を配置す る
こ と も で き ます。表機能について詳 し く は Section 8.3, ?Table Formatting?, page 209 を参照
し て く だ さ い。
148
第 6 章 : テキス ト 出力
6.2 フ ォ ン ト メ ト リ ッ ク と テキス ト バ リ エーシ ョ ン
6.2.1 フ ォ ン ト と グ リ フ の メ ト リ ッ ク
テキス ト 位置 PDFlib はテ キ ス ト 位置を、 グ ラ フ ィ ッ ク 描画のカ レ ン ト 点 と は独立に保
持 し ます。 前者は textx/texty パ ラ メ タ で取得で き 、 後者は currentx/currenty で取得で き
ます。
グ リ フ の メ ト リ ッ ク PDFlib では、PostScript や PDF で用い ら れてい る グ リ フ と フ ォ ン ト
の メ ト リ ッ ク の体系を用いてい ます。 こ こ で簡単に説明 し てお き ま し ょ う 。
PDFlib のユーザーが指定す る 必要のあ る 文字サ イ ズ と い う のは、 テ キ ス ト の行 と 行の
間で文字が重な り あわないために必要な最小間隔の こ と です。文字サ イ ズは一般に フ ォ ン
ト 内の各文字 よ り も 大 き く な っ てい ます。なぜな ら その中にはベース ラ イ ン よ り 上の部分
も 下の部分 も 含んでい る か ら であ り 、 ま た、 それに加え て行 と 行の間の間隔を も っ と 広 く
と っ てい る こ と も あ る か ら です。
leading (行送 り ) は、 テ キ ス ト の 1 つの行のベース ラ イ ン と 次の行のベース ラ イ ン と
の間の縦の間隔を指定 し ます。デフ ォ ル ト では こ れは文字サ イ ズ と 同 じ 値に設定 さ れてい
ます。 capheight (キ ャ ッ プハ イ ト ) は、 多 く の欧文フ ォ ン ト では T や H の よ う な大文字
の高 さ です。 xheight (x ハ イ ト ) は、 多 く の欧文フ ォ ン ト では x の よ う な小文字の高 さ で
す。 ascender (アセ ン ダ) は、 多 く の欧文フ ォ ン ト では f や d の よ う な小文字の高 さ です。
descender (デ ィ セ ン ダ) は、 多 く の欧文フ ォ ン ト では、 ベース ラ イ ンか ら j や p の よ う な
小文字の下端 ま で の間隔です。 デ ィ セ ン ダ はふつ う 負の値です。 xheight ・ capheight ・
ascender ・ descender の値は文字サ イ ズに対す る 割合 と し て表 さ れてい る ので、 必要な文
字サ イ ズ を掛けてか ら 用い る 必要があ り ます。
gaplen プ ロ パテ ィ は TrueType・OpenType フ ォ ン ト でのみ得 ら れます (それ以外の フ ォ
ン ト では算出 さ れます)。 gaplen 値はフ ォ ン ト フ ァ イ ルか ら 読み出 さ れ、 ベース ラ イ ン間
の推奨間隔 と アセ ン ダ+デ ィ セ ン ダ と の差を示 し ます。
PDFlib は、 こ れ ら の値の う ちの 1 つない し 複数を、 推算で求めなければな ら ない場合
も あ り ます。 なぜな ら こ れ ら の値は、 フ ォ ン ト や メ ト リ ッ ク フ ァ イ ルの中に存在 し てい る
と い う 保証がないためです。 用い ら れてい る 値が本当の値なのか、 それ と も 推測値なのか
を知 る には、 PDF_info_font( ) を呼び出 し てオプシ ョ ン faked で xheight を取得 し ます。 あ
る フ ォ ン ト のキ ャ ラ ク タ メ ト リ ッ ク を PDFlib で取得す る には下記の よ う に記述 し ます :
font = p.load_font("Times-Roman", "unicode", "");
capheight = p.info_font(font, "capheight", "");
図 6.1 フ ォ ン ト と キ ャ ラ ク タ の メ ト リ ッ ク
ascender
capheight
font size
baseline
descender
6.2 フ ォ ン ト メ ト リ ッ ク と テキス ト バ リ エーシ ョ ン
149
ascender = p.info_font(font, "ascender", "");
descender = p.info_font(font, "descender", "");
xheight = p.info_font(font, "xheight", "");
注 上付き ・ 下付きの位置 と サイ ズは PDFlib では取得で き ません。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの fonts/font_metrics_info ト ピ ッ ク にあ り ます。
CPI の計算 多 く の フ ォ ン ト は可変の字幅を持っ てい ますが、 等幅フ ォ ン ト と い う 種類の
フ ォ ン ト ではすべての文字に対 し て等 し い幅を用い ます。 PDF の フ ォ ン ト メ ト リ ッ ク と 、
高速印刷環境で よ く 用い ら れ る characters per inch (CPI) 表記 と の関係を理解す る には、
等幅の Courier フ ォ ン ト での計算例が役に立つのではないで し ょ う か。 Courier では、 文字
矩形の全幅がポ イ ン ト あ た り 1000 単位であ る のに対 し て、 すべての文字は 600 単位の幅
を持っ てい ます( こ の値はそれぞれのAFM メ ト リ ッ ク フ ァ イ ルか ら 得 る こ と がで き ます)。
た と えば 12 ポ イ ン ト のテ キ ス ト では、 すべての文字の実際の幅は次の よ う にな り ます。
12 ポイント ×(600 ÷ 1000)= 7.2 ポイント
最適行送 り が 12 ポ イ ン ト です。 1 イ ンチは 72 ポ イ ン ト ですので、 Courier 12 ポ イ ン ト の
文字は 1 イ ンチの中にち ょ う ど 10 個収ま る こ と にな り ます。つま り 、12 ポ イ ン ト の Courier
は 10 cpi フ ォ ン ト であ る と い う こ と にな り ます。 10 ポ イ ン ト のテ キ ス ト の場合は、 字幅
は 6 ポ イ ン ト ですので、 すなわち 72 ÷ 6 = 12 cpi フ ォ ン ト と な り ます。 同様に、 8 ポ イ
ン ト の Courier は 15 cpi と な り ます。
6.2.2 カ ーニ ン グ
さ ま ざ ま な文字の組み合わせのなかには、望ま し く ない見ばえにな っ て し ま う も のがあ り
ます。 た と えば、 2 つの V が隣 り 合 う と W の よ う に見え て し ま い ます し 、 T と e の間の間
隔は縮めない と 広 く あ き すぎ て不恰好にな っ て し ま い ます。 こ の よ う な補正の こ と を カー
ニ ン グ と いい ます。 多 く の フ ォ ン ト が、 問題 と な る 文字の組み合わせそれぞれに対す る 間
隔調整を指定 し た包括的な カーニ ン グ情報を持っ てい ます。 PDFlib は、 下記の情報源か ら
のカーニ ン グデー タ を使用 し ます :
> TrueType ・ OpenType フ ォ ン ト : kern テーブルで指定 さ れた カーニ ン グ対。
> OpenType フ ォ ン ト :kern機能 と GPOS テーブルを通 じ て指定 さ れた対ベース と 分類ベー
ス のカーニ ン グデー タ 。
> PostScript Type 1 フ ォ ン ト : AFM ・ PFM フ ァ イ ルで指定 さ れた カーニ ン グ対。
> PDF コ ア フ ォ ン ト に対す る カーニ ン グ対は PDF に よ っ て内部的に提供 さ れます。
PDFlib には、 カーニ ン グの動作を制御す る 方式が次の 2 種類あ り ます :
> デフ ォ ル ト では、 フ ォ ン ト 内のカーニ ン グ情報はその フ ォ ン ト を読み込む際に読み取
ら れます。 カーニ ン グが必要でない場合は、 PDF_load_font( ) で readkerning オプシ ョ
ン を false に設定 し ます。
> テ キ ス ト 出力に対す る カーニ ン グは、テ キ ス ト 出力関数群が対応 し てい る kerning テ キ
ス ト 書式オプシ ョ ン で有効にす る 必要があ り ます。
一時的にカーニ ン グ を無効にす る こ と がた と えばど んな と き に有用か と い う と 、数表を組
みたい と き に、カーニ ン グデー タ が数字ど う し の組み合わせを含んでい る 場合 と い う のが
挙げ ら れます。 カーニ ン グ さ れた数字は表内で き れいに並ばないか ら です。 なお、 今ど き
の TrueType ・ OpenType フ ォ ン ト は こ の目的のための特殊な数字を含んでお り 、 こ れは等
幅数字レ イ ア ウ ト 機能 と オプシ ョ ン features={tnum} で利用で き ます。
150
第 6 章 : テキス ト 出力
カーニ ン グは、 ど の よ う な字間 ・ 単語間隔 ・ 横倍率が指定 さ れていた と し て も 、 それ
に加え て適用す る こ と がで き ます。 PDFlib では、 1 つの フ ォ ン ト 内のカーニ ン グ対の数に
ついてはま っ た く 無制限です。
6.2.3 テキス ト バ リ エーシ ョ ン
擬似 フ ォ ン ト ス タ イル フ ォ ン ト のボール ド 体や イ タ リ ッ ク 体は通常、 適切な フ ォ ン ト
を選ぶ こ と に よ っ て印字す る べ き も のです。 それ以外の方法 と し て、 PDFlib は擬似フ ォ ン
ト ス タ イ ルに も 対応 し てい ます。 こ れは、 レ ギ ュ ラ ーフ ォ ン ト に基づいて、 Acrobat が、
ベー ス フ ォ ン ト を太 く し た り 斜体に し た り す る こ と に よ っ て ボール ド 体や イ タ リ ッ ク 体
やボール ド イ タ リ ッ ク 体を擬似的に実現す る も のです。擬似フ ォ ン ト ス タ イ ルの美的な質
は、 フ ォ ン ト デザ イ ナーが作 り 込んだ本当のボール ド フ ォ ン ト や イ タ リ ッ ク フ ォ ン ト にか
な う も のではあ り ません。 し か し 、 あ る フ ォ ン ト ス タ イ ルを直接利用す る こ と がで き ない
場面においては、 擬似ス タ イ ルがその代用 と し て活用で き ます。 と り わけ擬似フ ォ ン ト ス
タ イ ルは標準日中韓フ ォ ン ト に対 し て有用です。標準日中韓フ ォ ン ト には ノ ーマルフ ォ ン
ト し かな く 、 ボール ド 体や イ タ リ ッ ク 体が一切ないか ら です。
注 フ ォ ン ト ス タ イ ル機能を標準日中韓 フ ォ ン ト 以外の フ ォ ン ト に対 し て用い る こ と は推奨
し ません。 また、 フ ォ ン ト ス タ イル機能は Adobe Acrobat 以外の PDF ビ ュ ーア では動作 し
ない こ と に も留意 し て く だ さ い。
Adobe Acrobat が持つ制約のため、 擬似フ ォ ン ト ス タ イ ルは、 以下のすべての条件がみた
さ れた時にのみ動作 し ます。
> ベース フ ォ ン ト が TrueType フ ォ ン ト か OpenType フ ォ ン ト であ る こ と 。標準ま たはカ ス
タ ムの日中韓フ ォ ン ト を含みます。 ベース フ ォ ン ト が PDF コ ア フ ォ ン ト の う ちのいず
れかであ っ てはな り ません(131 ページ「欧文 コ ア フ ォ ン ト 」参照)。TrueType Collections
(TTC) にはフ ォ ン ト ス タ イ ルは適用で き ません。
> エン コ ーデ ィ ン グが winansi であ る か、macroman であ る か、ま たは、表 4.3 に挙げ る 定
義済み日中韓 CMap の う ちのいずれかであ る こ と (なぜな ら そ う でない場合 PDFlib は
強制的に フ ォ ン ト を埋め込むので)。
> embedding オプシ ョ ンは false に設定 し てい る 必要があ り ます。
図 6.2 カ ーニ ング
ࠞ࡯࠾ࡦࠣߥߒ
ࠞ࡯࠾ࡦࠣㆡ↪
ࠞ࡯࠾ࡦࠣߦࠃࠆᢥሼ⒖േ
6.2 フ ォ ン ト メ ト リ ッ ク と テキス ト バ リ エーシ ョ ン
151
> PDF の表示 さ れ る 相手先のシ ス テ ムにベース フ ォ ン ト が イ ン ス ト ール さ れてい る 必要
があ り ます。
PDFlib は最初の 3 つの条件はチ ェ ッ ク し ますが、最後の条件をみたす こ と はユーザー側の
役割 と な り ます。
擬似フ ォ ン ト ス タ イ ルを使 う には、 次の よ う に、 PDF_load_font( ) の fontstyle オプシ ョ
ンに normal (ベース フ ォ ン ト その ま ま) ・ bold ・ italic ・ bolditalic のいずれかのキーワー ド
を用い ます。
font = p.load_font("HeiseiKakuGo-W5", "UniJIS-UCS2-H", "fontstyle bold");
fontstyle 機能は、 Windows の フ ォ ン ト ス タ イ ル名 と 一見似た概念ですが、 混同 し てはいけ
ません。 フ ォ ン ト ス タ イ ルが上記の条件の も と でのみ動作 し 、 擬似フ ォ ン ト ス タ イ ルの実
現は Acrobat に依存 し てい る のに対 し て、 Windows の ス タ イ ル名は完全に Windows の フ ォ
ン ト 選択エン ジ ンに基づいてお り 、存在 し ない ス タ イ ルを こ れで実現す る こ と はで き ませ
ん。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの fonts/artificial_fontstyles ト ピ ッ ク にあ り ま
す。
擬似ボール ド フ ォ ン ト fontstyle 機能が フ ォ ン ト に作用する のに対 し て、 PDFlib は、 個
別のテ キ ス ト 文字列を擬似的なボール ド テ キ ス ト にする 代用機能に も 対応 し てい ます。 こ
れは fakebold パ ラ メ タ かオプシ ョ ンで制御 さ れます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの fonts/simulated_fontstyles ト ピ ッ ク にあ り ま
す。
擬似斜体 フ ォ ン ト fontstyle 機能のかわ り に italicangle パ ラ メ タ ま たはオプシ ョ ン を使っ
て、 レ ギ ュ ラ ーフ ォ ン ト し か利用で き ない と き に イ タ リ ッ ク フ ォ ン ト の よ う な効果を出す
こ と も で き ます。 こ の方式は偽 イ タ リ ッ ク フ ォ ン ト を作 り 出すために レ ギ ュ ラ ーフ ォ ン ト
を ユーザーか ら 与え ら れた角度だけ傾け る も のであ り 、フ ォ ン ト ス タ イ ルに関す る 上述の
制約には縛 ら れません。 負の値でテ キ ス ト は右に傾き ます。 も ち ろん、 本物の イ タ リ ッ ク
や斜体フ ォ ン ト を使っ たほ う がは る かに き れいな出力が得 ら れ る こ と を忘れてはいけ ま
せん。 し か し イ タ リ ッ ク フ ォ ン ト が入手で き ない と き に italicangle パ ラ メ タ かオプシ ョ ン
を使えば、 簡単にそれに似た効果を出す こ と がで き ます。 こ の機能は特に日中韓フ ォ ン ト
で便利です。 italicangle パ ラ メ タ かオプシ ョ ンの値は普通 -12 か ら -15 度の範囲です。
注 italicangle パラ メ タ ・ オプ シ ョ ンは縦書き では使え ません。
注 PDFlib はグ リ フ 幅を、 斜体化 し たグ リ フ の新 し い外接枠には合わせません。 た と えばテキ
ス ト を均等配置す る と き、 斜体化 し たグ リ フ ははめ こ み枠か ら はみ出す可能性があ り ま
す。
影付 き テキス ト PDFlib は、 同 じ テ キ ス ト を場所を少 し ずつず ら し て複数個印字す る こ
と に よ っ て影付 き 効果を生み出す こ と がで き ます。影付 き テ キ ス ト は PDF_fit_textline( ) の
shadow オプシ ョ ンで生成で き ます。 影の色や、 その主テ キ ス ト に対す る 相対位置、 グ ラ
フ ィ ッ ク 状態パ ラ メ タ 群は、 サブオプシ ョ ンで指定で き ます。
テキス ト の下線 ・ 上線 ・ 取 り 消 し 線 PDFlib では、 テ キ ス ト の下や上や中央に線をひ く
こ と がで き ます。 線幅やベース ラ イ ンか ら の間隔は、 フ ォ ン ト の メ ト リ ッ ク 情報に基づい
て計算 さ れます。 ま た、 横倍率やテ キ ス ト マ ト リ ッ ク ス のカ レ ン ト 値 も 線幅の計算には加
152
第 6 章 : テキス ト 出力
味 さ れ ま す。 下線 ・ 上線 ・ 取 り 消 し 線 の 有無 を 切 り 替 え る に は、 そ れ ぞ れ PDF_set_
parameter( ) で underline ・ overline ・ strikeout パ ラ メ タ を、 ま たはテ キ ス ト 出力関数群で同
名のオプシ ョ ン を オンオ フ し ます。underlineposition ・ underlinewidth パ ラ メ タ かオプシ ョ
ン を使っ て微調整 も で き ます。
線の色にはカ レ ン ト 描線色が用い ら れます。 し か し 、 カ レ ン ト の linecap ・ dash パ ラ メ
タ は無視 さ れます。 体裁上の注意 : 多 く の フ ォ ン ト では、 下線は文字のベース ラ イ ン よ り
下の部分 と ぶつか っ て し ま い、ま た、上線は文字の上の付加記号 と ぶつか っ て し ま い ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/starter_textline ト ピ ッ ク にあ り ま
す。
テキス ト 表現モー ド PDFlib は、 テ キ ス ト の見栄え を変更す る 表現モー ド にい く つか対
応 し てい ます。 こ れを用い る と 、 テ キ ス ト の輪郭を描いた り 、 テ キ ス ト を ク リ ッ ピ ン グパ
ス と し て利用 し た り す る こ と がで き ます。 ま た、 テ キ ス ト を不可視にする こ と も で き 、 こ
れはた と えば、 ス キ ャ ン画像の上にテ キ ス ト を乗せてテ キ ス ト 検索や索引生成を可能に し
つつ、 テ キ ス ト 自体は隠す、 と いっ た活用がで き る で し ょ う 。 表現モー ド の一覧は PDFlib
API リ フ ァ レ ン スに挙げて あ り ます。 表現モー ド は、 textrendering パ ラ メ タ かオプシ ョ ン
で設定す る こ と がで き ます。
テ キ ス ト を描線す る と 、 線幅や色 と い っ た グ ラ フ ィ ッ ク 状態のパ ラ メ タ 群がグ リ フ の
輪郭に適用 さ れます。 表現モー ド は、 Type 3 フ ォ ン ト を用いて印字 さ れ る テ キ ス ト には何
の効果 も 持ち ません。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの
text_output/text_as_clipping_path ・ text_
output/invisible_text ト ピ ッ ク にあ り ます。
テキス ト の色 テ キ ス ト は通常、カ レ ン ト 塗 り 色で印字 さ れます。塗 り 色は PDF_setcolor( )
を用いて設定で き ます。 ただ し 、 表現モー ド で 0 以外が選択 さ れてい る 時は、 その選択 さ
れてい る 表現モー ド に よ っ て、描線色 と 塗 り 色はど ち ら も テ キ ス ト に対 し て効力を持つ可
能性があ り ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/starter_textline ト ピ ッ ク にあ り ま
す。
6.2 フ ォ ン ト メ ト リ ッ ク と テキス ト バ リ エーシ ョ ン
153
6.3 OpenType レ イ ア ウ ト 機能
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/starter_opentype ト ピ ッ ク にあ り ま
す。
6.3.1 対応 し てい る OpenType レ イ アウ ト 機能
PDFlib は、い く つかの フ ォ ン ト 内の追加情報に従っ た高度なテ キ ス ト 出力に対応 し てい ま
す。 こ れ ら の フ ォ ン ト 拡張を OpenType レ イ ア ウ ト 機能 と いい ます。 た と えば、 フ ォ ン ト
が liga 機能を含んでい る か も し れません。 こ の機能は、 f ・ f ・ i グ リ フは結合 し て合字を
形作れ る と い う 情報を含んでい ます。 他に よ く 利用 さ れ る 例 と し ては、 smcp 機能に よ る
ス モールキ ャ ピ タ ル、 すなわち通常の大文字キ ャ ラ ク タ よ り も 小 さ な大文字キ ャ ラ ク タ
や、 onum 機能に よ る オール ド ス タ イ ル数字、 すなわち アセ ン ダ と デ ィ セ ン ダ を持つ数字
(ベース ラ イ ン上にすべて配置 さ れ る 横並びの数字 と は異な る ) な ど が挙げ ら れ ます。 合
字は非常に広 く 利用 さ れ る OpenType 機能ではあ り ますが、 可能な何ダース も の機能の う
ちの 1 つにすぎ ません。 OpenType 形式 と OpenType 機能テーブルに関す る あ ら ま し は下
記にあ り ます :
www.microsoft.com/typography/developers/opentype/default.htm
PDFlib は下記のグループの OpenType 機能に対応 し てい ます :
> 表 6.1 に挙げ る 欧文 タ イ ポグ ラ フ ィ のための OpenType 機能群。 こ れ ら は features オプ
シ ョ ン で司 ら れます。
> 表 6.7 に挙げ る 日本語 ・ 中国語 ・ 韓国語テ キ ス ト のための OpenType 機能群。 こ れ ら も
features オプシ ョ ンで司 ら れますが、 詳 し く は 173 ページ 「6.5.4 OpenType レ イ ア ウ ト
機能 と 高度な日中韓テ キ ス ト 出力」 で解説 し ます。
> 複雑用字系のシ ェーピ ン グ と 縦書 き テ キ ス ト 出力のための OpenType 機能群。こ れ ら は
shaping ・ script オプシ ョ ンに従っ て自動的に評価 さ れます (161 ページ 「6.4 複雑用字
系出力」 を参照)。 こ の vert 機能は vertical フ ォ ン ト オプシ ョ ンで司 ら れます。
> カーニ ン グのための OpenType機能テーブル群。ただ し 、PDFlib は kerning を OpenType機
能 と し ては扱い ません。 なぜな ら カーニ ン グデー タ は OpenType 機能テーブル以外の
手 段 で も 表 現 す る こ と が で き る か ら で す。 カ ー ニ ン グ を 制 御 す る の で は な く 、
readkerning フ ォ ン ト オプシ ョ ン と kerning テ キ ス ト オプシ ョ ン を用いて く だ さ い (150
ページ 「6.2.2 カーニ ン グ」 を参照)。
OpenType レ イ ア ウ ト 機能について詳 し い解説は下記にあ り ます :
www.microsoft.com/typography/otspec/featuretags.htm
OpenType 機能 を見つけ る OpenType 機能テーブルを見つけ る には下記の ツールが使え
ます :
> FontLab フ ォ ン ト エデ ィ タ はフ ォ ン ト を作成 ・ 編集す る ためのアプ リ ケーシ ョ ンです。
その無償デモ版 (www.fontlab.com) は OpenType 機能を表示 ・ プ レ ビ ュ ー し ます。
> DTL OTMaster Light (www.fonttools.org) はフ ォ ン ト を表示 ・ 分析す る ための無償ア
プ リ ケーシ ョ ン であ り 、 OpenType 機能テーブル も 表示 ・ 分析で き ます。
> Microsoft の無償の「font properties extension」1 は、フ ォ ン ト 内で得 ら れ る OpenType 機能
の リ ス ト を表示 し ます (図 6.3 参照)。
1. www.microsoft.com/typography/TrueTypeProperty21.mspx を参照。
154
第 6 章 : テキス ト 出力
> PDFlib の PDF_info_font( ) イ ン タ フ ェ ース を使っ て、対応 し てい る OpenType 機能を取得
す る こ と も で き ます (160 ページ 「OpenType 機能をプ ロ グ ラ ム的に取得」 を参照)。
6.3 OpenType レ イ アウ ト 機能
155
表 6.1 欧文 タ イ ポグ ラ フ ィ のための対応 OpenType 機能一覧 (日中韓テキス ト のための OpenType 機能は表 6.7 に
挙げます)
キー
ワー
ド
名前
説明
_none
全機能無効
表 6.1 ・ 表 6.7 に挙げるすべての OpenType 機能を無効に。
afrc
別形式分数
ス ラ ッ シ ュ で区切られた数字群を別形式へ置き換え。
c2pc
大文字からのプ
テ ィ ッ ト キャ ピ タ
ル
大文字キ ャ ラ ク タ を プ テ ィ ッ ト キ ャ ピ タ ルに変え ます。
c2sc
大文字からのス
モールキ ャ ピ タ ル
大文字キ ャ ラ ク タ を ス モールキ ャ ピ タ ルに変え ます。
case
ケースセ ン シ テ ィ
ブ字体
さ ま ざ ま な句読点を上へず ら し て、 全大文字シーケ ン スや横並び数字のセ ッ ト と の
調和を高めます。 ま た、 オール ド ス タ イル数字を横並び数字に変え ます。
dlig
随意合字
複数グ リ フのシーケ ン ス を、 タ イ ポグ ラ フ ィ 的観点から よ り 好ま し い 1 個のグ リ フ
へ置き換え
dnom
分母
ス ラ ッ シ ュの直後の数字を分母数字へ置き換え
frac
分数
ス ラ ッ シ ュ で区切られた数字群を、 「通用の」 (斜め線に よ る) 分数へ置き換え
hist
歴史的字体
デ フ ォル ト の (現行の) 字体を歴史的字体へ置き換え。 い く つかの字の字体は過去
には広 く 用い ら れていま し たが、 現在では時代遅れに見え ます。
hlig
歴史的合字
こ の機能はデ フ ォ ル ト の (現行の) 合字を歴史的合字へ置き換え ます。
liga
標準合字
複数グ リ フのシーケ ン ス を、 タ イ ポグ ラ フ ィ 的観点から よ り 好ま し い 1 個のグ リ フ
へ置き換え
lnum
横並び数字
数字を オール ド ス タ イルから デ フ ォ ル ト の横並び字体へ変え ます。
locl
ロー カ ラ イ ズ字体
グ リ フのデ フ ォ ル ト 字体から ロー カ ラ イ ズ字体への置換を有効に し ます。 こ の機能
は script ・ language オプ シ ョ ン を必要 と し ます。
mgrk
数学ギ リ シ ャ 文字
ギ リ シ ャ 文字グ リ フの標準 タ イ ポグ ラ フ ィ 字体を、 広 く 用い ら れている数学的表記
へ置き換え。
numr
分子
スウ ォ ッ シ ュの直前の数字を分子数字へ置き換え、 タ イ ポグ ラ フ ィ ス ラ ッ シ ュ を分
数ス ラ ッ シ ュへ置き換え。
onum
オール ド ス タ イル
数字
数字を、 デ フ ォ ル ト の横並び形式か ら オール ド ス タ イル字体に変え ます。
ordn
序数
デ フ ォル ト のアルフ ァ ベ ッ ト グ リ フ を、 数字の後に用いる ための、 対応する序数字
体へ置き換え。 概 し て Numero (U+2116) キ ャ ラ ク タ も生成 し ます。
ornm
飾 り 文字
ビ ュ レ ッ ト キ ャ ラ ク タ と ASCII キ ャ ラ ク タ 群を飾 り 文字へ置き換え。
pcap
プテ ィ ッ ト キャ ピ
タル
小文字キ ャ ラ ク タ を プ テ ィ ッ ト キ ャ ピ タ ルに、 すなわち通常のス モールキ ャ ッ プ よ
り 背の低い大文字に変え ます。
pnum
プ ロポーシ ョ ナル
数字
等幅 (表形式) 数字を、 プ ロポーシ ョ ナル幅を持つ数字へ置き換え。
salt
ス タ イ リ ステ ィ ッ
ク字体
デ フ ォル ト 字体を ス タ イ リ ス テ ィ ッ ク字体へ置き換え。 こ れら の異体字は、 ス
ウ ォ ッ シ ュや歴史的 と い っ た決ま っ た分類には必ず し も あてはま り ません。
sinf
科学的下付き
横並びまたはオール ド ス タ イル数字を、 主に化学や数学表記用の下付き数字 (よ り
小 さ なグ リ フ) へ置き換え。
156
第 6 章 : テキス ト 出力
表 6.1 欧文 タ イ ポグ ラ フ ィ のための対応 OpenType 機能一覧 (日中韓テキス ト のための OpenType 機能は表 6.7 に
挙げます)
キー
ワー
ド
名前
説明
smcp
ス モールキ ャ ピ タ
ル
小文字キ ャ ラ ク タ を スモールキ ャ ピ タ ルに変え ます。
ss01
...
ss20
ス タ イ リ ステ ィ ッ
ク イ セ ッ ト 1 ~ 20
個々のグ リ フのス タ イ リ ス テ ィ ッ ク字体 (salt 機能を参照) に加えて、 あ るいは
それに替えて、 フ ォ ン ト によ っ ては、 その文字セ ッ ト の一部 (複数可) に対応する
ス タ イ リ ス テ ィ ッ クバ リ ア ン ト グ リ フ群のセ ッ ト を含んでいる ものがあ り ます。
例 : 欧文フ ォ ン ト 内の小文字に対 し て複数のバ リ ア ン ト 。
subs
下付き
デ フ ォル ト グ リ フ を下付き グ リ フへ置き換え。
sups
上付き
横並びま たはオール ド ス タ イル数字を上付き数字へ置き換え (主に脚注表示用)、
小文字を上付き文字へ置き換え (主に フ ラ ン ス語敬称の省略形用)。
swsh
スウ ォ ッ シ ュ
デ フ ォル ト グ リ フ を、 対応する スウ ォ ッ シ ュ グ リ フへ置き換え。
titl
見出 し 化
デ フ ォル ト グ リ フ を、 見出 し 用にデザイ ン さ れた、 対応する字体へ置き換え。
tnum
等幅数字
プ ロポーシ ョ ナル数字を等幅 (表形式) 数字へ置き換え。
unic
ユニケース
大文字 と 小文字を、 小文字 と ス モールキ ャ ピ タ ル字体の混在する セ ッ ト へマ ッ プ し
て、 高 さ 一定のアルフ ァ ベ ッ ト に し ます。
zero
ス ラ ッ シ ュ付きゼ
ロ
数字ゼロに対するグ リ フ を、 中空部に斜め線を引いた字体へ置き換え。
6.3.2 テキス ト 行 ・ テキス ト フ ロ ーで OpenType レ イ ア ウ ト 機能
PDFlib は、 テ キ ス ト 行 ・ テ キ ス ト フ ロ ー関数群では OpenType レ イ ア ウ ト 機能に対応 し て
い ますが、 低レベルテ キ ス ト 出力関数群 (PDF_show( ) 等) では対応 し てい ません。
OpenType レ イ ア ウ ト 機能のための要件 OpenType レ イ ア ウ ト 機能 と と も に使 う フ ォ ン
ト は、 下記の要件を満たす必要があ り ます :
> フ ォ ン ト は、 TrueType (*.ttf) ・ OpenType (*.otf) ・ TrueType コ レ ク シ ョ ン (*.ttc) フ ォ
ン ト のいずれかであ る 必要があ り ます。 標準日中韓フ ォ ン ト については、 その フ ォ ン
ト フ ァ イ ルが得 ら れ る 必要があ り ます。
> フ ォ ン ト フ ァ イ ルは、テ キ ス ト 内で使いたい OpenType 機能に対す る 対応ル ッ ク ア ッ プ
を持つ GSUB テーブルを含んでい る 必要があ り ます (後述)。
> フ ォ ン ト は、encoding=unicode か glyphid で、ま たは Unicode CMap を指定 し て読み込む
必要があ り ます。
> PDF_load_font( ) の readfeatures オプシ ョ ンは false に設定す る 必要があ り ます。
> PDF_load_font( ) の fallbackfonts オプシ ョ ン を用いてい る 場合は、1 つのテ キ ス ト 区間内
のテ キ ス ト は、 ベー ス フ ォ ン ト か ら のグ リ フ と 予備フ ォ ン ト か ら のグ リ フ を (ま たは
複数の予備フ ォ ン ト か ら のグ リ フ を) 同時に含んではいけ ません。
注 PDFlib は、 GSUB ル ッ ク ア ッ プ種別 1 (一対一置換) と 4 (多対一置換) を持つ OpenType
機能に対応 し ています。 カ ーニ ング を除き、 PDFlib は、 GPOS テーブルに基づ く OpenType
レ イ アウ ト 機能には対応 し ていません。
注意
OpenType 機能を扱 う 際には下記に留意 し て く だ さ い :
6.3 OpenType レ イ アウ ト 機能
157
図 6.3
Microsoft の font property extension は フ ォ
ン ト 内の OpenType 機能一覧を表示 し ます
> OpenType 機能 (オプシ ョ ン features ・ script ・ language) は、 同一フ ォ ン ト 内のグ リ フ
群に対 し てのみ適用 さ れ ますので、 予備フ ォ ン ト を指定 し てい る 場合は、 ベース フ ォ
ン ト と 1 個ない し 複数の予備フ ォ ン ト と にわた る グ リ フ群には適用 さ れません。
> 必ず、 必要な場面でそのつど各機能を有効 ・ 無効を切 り 替え て く だ さ い。 OpenType 機
能を う っ か り 全テ キ ス ト に対 し て有効な ま ま に し てお く と 、 予期 し ない結果が生 じ る
こ と があ り ます。
OpenType 機能の有効 ・ 無効 を切 り 替え る テ キ ス ト の部分部分に対 し て、必要に応 じ て
OpenType 機能 の 有効 と 無効 を 切 り 替 え る こ と が で き ま す。 機能 を 有効 に す る に は、
features テ キ ス ト オプシ ョ ン を用いてその名前を与え ます。 機能名の頭に no をつけ る と
それを無効にで き ます。 た と えば、 テ キ ス ト フ ロ ーに対す る イ ン ラ イ ンオプシ ョ ン リ ス ト
では機能制御は下記の よ う にな り ます :
<features={liga}>ffi<features={noliga}
テ キ ス ト 行に対 し ては OpenType 機能を下記の よ う に有効にで き ます :
p.fit_textline("ffi", x, y, "features={liga}");
OpenType 機能は、 PDFlib Personalization Server (PPS) で利用す る ためのブ ロ ッ ク プ ロ パ
テ ィ と し て有効にす る こ と も 可能です。
複数の機能 を 同一テ キ ス ト に対 し て適用す る こ と も 可能ですが、 フ ォ ン ト 内の機能
テーブル群が こ の状況に対 し て整備 さ れてい る 必要があ り 、対応す る 機能ル ッ ク ア ッ プを
正 し い順序で含んでい る 必要があ り ます。 た と えば、 単語 office に対 し て合字機能 (liga)
と ス モールキ ャ ピ タ ル機能 (smcp) を適用す る 場合を考え ま す。 両方の機能を有効にす
る 場合 (対応す る 機能エン ト リ 群が フ ォ ン ト に含まれてい る 前提で) 、 ス モールキ ャ ピ タ
158
第 6 章 : テキス ト 出力
ル機能が適用 さ れ、 合字機能は適用 さ れない こ と を期待する と 思い ます。 こ れが フ ォ ン ト
のテーブル内に正 し く 実装 さ れてい る 場合は、 PDFlib は期待どお り の出力を生成 し ます。
すなわち合字な し で ス モールキ ャ ピ タ ルを適用 し ます。
制御キ ャ ラ ク タ で合字 を無効に 言語に よ っ ては、 あ る 特定の状況では合字を使っ ては
いけない も のがあ り ます。 ド イ ツ語な ど の言語におけ る タ イ ポグ ラ フ ィ 規則では、 複合語
の境界を ま た ぐ合字の使用を禁 じ てい ます。 た と えば f+i の組み合わせは、 単語 Schilfinsel
内では合字へ置 き 換え てはいけ ません。合成 さ れた 2 つの単語の境界を ま たいでい る か ら
です。
先述の よ う に、 合字な ど の OpenType 機能の処理は、 features オプシ ョ ンで有効 ・ 無効
を切 り 替え る こ と がで き ます。上記の よ う な例外的場合のたびに合字を オプシ ョ ンで無効
に し てい く のは面倒です。 シ ンプルな合字制御を提供する ために、 テ キ ス ト 内の制御キ ャ
ラ ク タ で合字を無効にす る 機能があ り ますので、 こ れを利用すれば、 機能の有効 ・ 無効を
た く さ んのオプシ ョ ンで切 り 替え る 必要はな く な り ます。連続す る キ ャ ラ ク タ の間にゼロ
幅非接合子 (U+200C、 &zwnj。 表 6.4 も 参照) キ ャ ラ ク タ を挿入すれば、 合字が features
オプ シ ョ ン で有効に し て あ っ て も 、 その箇所は合字へ置 き 換わ ら な く な り ま す。 た と え
ば、 下記の コ ー ド は f+i 合字を生成 し ません :
<features={liga charref=true}>Schilf&zwnj;insel
用字系 ・ 言語固有の OpenType レ イ ア ウ ト 機能
OpenType 機能は、 あ ら ゆ る 場面で適用
さ れ る も の も あ り ます し 、 あ る 特定の用字系に対 し て実装 さ れてい る も の も あ り ます。 あ
る 特定の用字系 と 言語 と の組み合わせに対 し て実装 さ れてい る も の も あ り ま す。 こ のた
め、 features オプシ ョ ンに加え て script ・ language テ キ ス ト オプシ ョ ン を与え る こ と が可
能です。 こ れ ら が実効性を持つのは、 その機能が フ ォ ン ト 内で用字系ま たは言語に固有な
形で実装 さ れてい る 場合のみです。
た と えば、 f ・ i グ リ フ に対す る 合字は、 い く つかの フ ォ ン ト においては、 ト ル コ 語が
選ばれてい る と き には得 ら れません (なぜな ら ト ル コ 語では点のない i が頻出す る ため、 i
の合字形はそれ と 混同 し やすいか ら です) 。 その よ う な フ ォ ン ト を用いてい る 場合に、 下
記のテ キ ス ト フ ロ ーオプシ ョ ンは、用字系 / 言語を一切指定 し ていないので合字を生成 し
ます :
<features={liga}>fi
し か し 、 下記のテ キ ス ト フ ロ ーオプシ ョ ン リ ス ト は、 ト ル コ 語オプシ ョ ンがあ る ので合字
を生成 し ません :
<script=latn language=TRK features={liga}>fi
locl 機能は、 明示的に言語固有のキ ャ ラ ク タ 字体を選択 し ます。 liga 機能は、 言語固有の
合字を含んでい ます。 言語固有機能のい く つかの例 :
セルビア語用キャラクタ字体:
<features={locl} script=cyrl language=SRB charref>&#x0431;
ウルドゥー語用数字字体:
<features={locl} script=arab language=URD charref>&#x0662;&#x0663;&#x0664;&#x0665;
使え る 言語 ・ 用字系キー ワー ド については 163 ページ 「6.4.2 用字系 と 言語」 を参照 し て
く だ さ い。
6.3 OpenType レ イ アウ ト 機能
159
OpenType 機能 と シ ェ ー ピ ン グ を組み合わせ 複雑用字系の シ ェ ー ピ ン グ (161 ページ
「6.4 複雑用字系出力」 を参照) は、 自動的に選ばれ る OpenType フ ォ ン ト 機能に大 き く 依
存 し てい ま す。 し か し 、 フ ォ ン ト に よ っ ては、 シ ェ ー ピ ン グ のために自動的に選ばれ る
OpenType 機能を、 ク ラ イ ア ン ト アプ リ ケーシ ョ ンが選んだ OpenType 機能 と 組み合わせ
る こ と が意味を持つ場合があ り ます。 PDFlib は、 まずユーザーが選んだ OpenType 機能を
適用 し (オプシ ョ ン features)、 ついでシ ェ ーピ ン グ関連の機能を自動的に適用 し ます (オ
プシ ョ ン shaping ・ script ・ language)。
OpenType 機能 を プ ロ グ ラ ム的に取得 フ ォ ン ト 内の OpenType 機能を PDF_info_font( ) で
取得す る こ と がで き ます。 下記の コ ー ド では、 フ ォ ン ト 内で得 ら れ る 、 かつ PDFlib が対
応 し てい る すべての OpenType 機能を カ ン マで区切っ た リ ス ト を取得 し てい ます :
result = (int) p.info_font(font, "featurelist", "");
if (result != -1)
{
/* スペース区切りされた機能リストを内容として持つ文字列を取得 */
featurelist = p.get_parameter("string", result);
}
else
{
/* 対応機能は全く見つからなかった */
}
あ る 特定の機能に PDFlib と 対象フ ォ ン ト が対応 し てい る か ど う か を調べ る には下記の
コ ー ド を用い ます。 こ の場合は合字 (liga) :
result = (int) p.info_font(font, "feature", "name=liga");
if (result == 1)
{
/* 機能にフォントとPDFlibが対応している */
}
160
第 6 章 : テキス ト 出力
6.4 複雑用字系出力
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの scripts/starter_shaping ト ピ ッ ク にあ り ます。
6.4.1 複雑用字系
欧文用字系では基本的に左か ら 右へ、 1 つのキ ャ ラ ク タ の後に次のキ ャ ラ ク タ を置いてい
き ます。 それ以外の書記系では、 正 し いテ キ ス ト 出力のためには追加の要請があ り ます。
こ の よ う な書記系を複雑用字系 と 呼ぶ こ と に し ます。 PDFlib は、 表 6.2 に挙げ る も のを含
む さ ま ざ ま な用字系に対 し て、 複雑用字系のためのテ キ ス ト 処理を実行 し ます。
こ の項では、 複雑用字系におけ る シ ェ ーピ ン グについて詳 し く 解説 し ます。 西洋の諸
言語の多 く は単純に左か ら 右へ1つのキ ャ ラ ク タ の後に次のキ ャ ラ ク タ を置いていけば書
け る のに対 し 、 書記系 (用字系) に よ っ ては追加の処理を必要 と す る も のがあ り ます :
> ア ラ ビ ア文字 と ヘブ ラ イ 文字の用字系では、テ キ ス ト を右か ら 左へ置いてい き ます。混
合テ キ ス ト (ア ラ ビ ア文の中に欧文がは さ ま っ た) は、 右書 き の部分 と 左書 き の部分
の両方を含みます。 こ れ ら の部分は並べ替えの必要があ り 、 こ れを双方向 (Bidi) 問題
と いい ます。
> い く つかの用字系、 と り わけア ラ ビ ア文字では、 キ ャ ラ ク タ の位置 (単独、 語頭 / 語中
/ 語尾) に よ っ て異な る キ ャ ラ ク タ 形状を用い ます。
> キ ャ ラ ク タ 列を必須合字へ置 き 換え ます。
> グ リ フ の位置を縦 ・ 横へ調整す る 必要があ り ます。
> イ ン ド 系用字系では、 い く つかのキ ャ ラ ク タ の並べ替えが必要です。 すなわち、 キ ャ
ラ ク タ はテ キ ス ト 内での位置が変わ る こ と があ り ます。
> い く つかの用字系には、 特殊な単語境界 ・ 均等配置規則が適用 さ れます。
こ れ ら の処理ス テ ッ プ を 1 つない し 複数必要 と す る 用字系を複雑用字系 と 呼びます。入力
さ れた論理テ キ ス ト か ら 正 し い表記を作 り 上げ る 処理を シ ェーピ ン グ と いい ます ( こ の用
語は並べ替え と 双方向処理を も 含んでい ます) 。 ユーザーはつねに、 シ ェーピ ン グ さ れて
いない形で論理的順序のテ キ ス ト を与え、 それに対 し て PDFlib が、 必要なシ ェーピ ン グ
を実行 し てか ら PDF 出力を生成 し ます。
複雑用字系のシ ェーピ ン グは、 shaping テ キ ス ト オプシ ョ ンで有効にで き ます。 こ のオ
プシ ョ ンは script オプシ ョ ン を必要 と し 、 ま た、 language オプシ ョ ン を あわせて指定す る
こ と も で き ま す。 下記のオプシ ョ ン リ ス ト はア ラ ビ ア文字のシ ェ ー ピ ン グ ( と 双方向処
理) を可能に し ます :
shaping script=arab
注意 複雑用字系のシ ェーピ ン グ を扱 う 際には下記に留意 し て く だ さ い :
> PDFlib は shaping・script オプシ ョ ン を自動的には設定せず、ユーザーがそれ ら を与え る
と 前提 し てい ます。
> 用字系固有のシ ェーピ ン グ (オプシ ョ ン shaping ・ script ・ language) は、 同一フ ォ ン ト
か ら のグ リ フ群に対 し てのみ適用 さ れ、 複数の フ ォ ン ト にわた る グ リ フ群には適用 さ
れ ません。 予備フ ォ ン ト を使っ てい る 場合は、 シ ェ ーピ ン グは同一 (ベース ま たは予
備) フ ォ ン ト のテ キ ス ト 区間内でのみ適用 さ れます。
> シ ェ ーピ ン グはテ キ ス ト 内のキ ャ ラ ク タ の順番を変え る こ と があ り ますので、 単語内
の属性変更については注意を払 う 必要があ り ます。 た と えば、 テ キ ス ト フ ロ ー内で イ
ン ラ イ ンオプシ ョ ン を用いて単語内の 2 番目のキ ャ ラ ク タ に色をつけ よ う と し てい る
場合に、シ ェーピ ン グが 1 番目 と 2 番目のキ ャ ラ ク タ を入れ替えた ら ど う な る ので し ょ
6.4 複雑用字系出力
161
表 6.2 複雑用字系 と script オプ シ ョ ンのキーワー ド 一覧
用字系の名前
用字系指定な し
-
用字系自動検出
-
こ のキーワー ド は、 テキス ト 内のキ ャ ラ ク タ の
多数が属する用字系を選択 し ます。 その際、
_latn ・ _none は無視 さ れます。
_auto
欧州アル フ ァ ベ ッ
ト
欧文
多 く の欧州な どの諸語
latn
ギ リ シ ャ文字
ギ リ シ ャ語
grek
キ リ ル文字
ロ シ ア語な ど多 く のス ラ ブ諸語
cyrl
ア ラ ビ ア文字
ア ラ ビ ア語 ・ ペルシ ャ語 ( フ ァ ールシー) ・ ウル arab
ド ゥ ー語 ・ パシ ュ ト ー語な ど
ヘブ ラ イ文字
ヘブ ラ イ語 ・ イ デ ィ ッ シ ュ語な ど
hebr
シ リ ア文字
シ リ ア正教会 ・ マ ロ ン派 ・ ア ッ シ リ ア教会
syrc
タ ーナ文字
デ ィ ベ ヒ 語 / モルデ ィ ブ
thaa
デーヴ ァ ナーガ
リー
ヒ ンデ ィ ー ・ 古典サン ス ク リ ッ ト
deva
ベン ガル文字
ベン ガル語 ・ ア ッ サム語
beng
グルムキー文字
パン ジ ャ ーブ語
guru
グジ ャ ラ ー ト 文字
グジ ャ ラ ー ト 語
gujr
オ リ ヤー文字
オ リ ヤー語 / オ リ ッ サ
orya
タ ミ ル文字
タ ミ ル語 / タ ミ ルナー ド ゥ ・ ス リ ラ ン カ
taml
テルグ文字
テルグ語 / アーン ド ラ プ ラ デーシ ュ
telu
カ ンナダ文字
カ ンナダ語 / カルナー タ カ
knda
マ ラ ヤー ラ ム文字
マ ラ ヤー ラ ム語 / ケー ラ ラ
mlym
タ イ文字
タ イ語
thai
ラ ーオ文字
ラ ーオ語
ク メ ール文字
ク メ ール語 (カ ンボジ ア語)
khmr
漢字
中国語 ・ 日本語 ・ 韓国語
hani
ひ らがな
日本語
hira
カ タ カナ
日本語
kana
ハングル
韓国語
hang
中東
南ア ジ ア (イ ン ド )
東南ア ジ ア
東ア ジ ア
その他
言語 / 地域 (不完全な リ ス ト )
スク リ プ ト
キーワー ド
書記系
_none
「lao 」1
OpenType 仕様に従っ たその他の 4 文字 コ ー ド も働き ますが、 対応 し ていません。 全一覧は
下記にあ り ます。
www.microsoft.com/typography/developers/OpenType/scripttags.aspx
1. 末尾の空白キャラクタに注意。
う か。 こ の理由か ら 、 書式の変更は単語の途中では行わずに、 単語の境界でのみ行 う
必要があ り ます。
162
第 6 章 : テキス ト 出力
シ ェ ー ピ ン グのための要件 複雑用字系のシ ェ ーピ ン グ と と も に用い る ための フ ォ ン ト
は、 対象用字系のグ リ フ群を含んでい る と い う こ と に加え て、 下記の要件を満た し てい る
必要があ り ます :
> GDEF・GSUB・GPOS 機能テーブルを持ち、かつ、対象用字系に適合 し た正 し い Unicode
マ ッ ピ ン グ を持つ TrueType ま たは OpenType フ ォ ン ト であ る 必要があ り ます。 あ る い
は こ う し た OpenType テーブルを持たずに、 ア ラ ビ ア文字 ・ ヘブ ラ イ 文字の場合は、
フ ォ ン ト が Unicode の表示形を含んでい る こ と も で き ます (Arabic Apple フ ォ ン ト 等は
こ の方式で構築 さ れてい ます)。 こ の場合は内部テーブルがシ ェーピ ン グ処理に使われ
ま す。 タ イ 文字テ キ ス ト については、 Microsoft ・ Apple ・ Monotype Worldtype (い く つ
かの IBM 製品等で用い ら れてい ます) の タ イ 文字用規則に従っ た コ ン テ キ ス ト 依存字
体を フ ォ ン ト が含んでい る 必要があ り ます。
> 標準日中韓フ ォ ン ト を使 う 場合は、 その フ ォ ン ト フ ァ イ ルが得 ら れ る 必要があ り ます。
> フ ォ ン ト を encoding=unicode か glyphid で読み込む必要があ り ます。
> PDF_load_font( ) の monospace ・ vertical オプシ ョ ンは用いてはいけ ません。 ま た、
readshaping オプシ ョ ン を false に設定 し てはいけ ません。
> PDF_load_font( ) の fallbackfonts オプシ ョ ンが用い ら れた場合は、1 つのテ キ ス ト 区間内
のテ キ ス ト が予備フ ォ ン ト か ら のグ リ フ を含んではいけ ません。
6.4.2 用字系 と 言語
用字系 と 言語は、 以下に挙げ る 機能面での役割を果た し ます。 こ れ ら は以下のオプシ ョ ン
で制御で き ます :
> script テ キ ス ト オプシ ョ ンは対象用字系 (書記系) を指定 し ます。表 6.2 に挙げた 4 文字
のキー ワー ド を使え ます。 例 :
script=latn
script=cyrl
script=arab
script=hebr
script=deva
script={lao }
script=_auto にす る と 、 PDFlib は、 テ キ ス ト 内のキ ャ ラ ク タ の多数が属す る 用字系を自
動的に割 り 当て ます。 欧文テ キ ス ト はシ ェ ーピ ン グ を必要 と し ませんので、 こ の用字
系を自動的に決定す る 際には考慮 さ れません。
PDF_info_textline( ) の scriptlist キー ワー ド を使 う と 、テ キ ス ト に対 し て用い ら れてい る
用字系を取得す る こ と がで き ます。
> language オプシ ョ ンは、テ キ ス ト が書かれてい る 自然言語を指定 し ます。表 6.2 に挙げ
る 3 キ ャ ラ ク タ のキーワ ー ド が使え ます。 例 :
language=ARA
language=URD
language=ZHS
language=HIN
複雑用字系処理 複雑用字系処理 (オプシ ョ ン shaping) には script オプシ ョ ンが必要で
す。 language オプシ ョ ン を追加で与え る こ と も で き ます。 こ れはシ ェ ーピ ン グの言語固
有の側面を制御 し ます。 た と えばア ラ ビ ア語 と ウ ル ド ゥ ー語で数字が別にな り ます。 し か
し 、 言語固有用字系シ ェ ーピ ン グ テーブルを含むフ ォ ン ト はわずかですので、 多 く の場合
6.4 複雑用字系出力
163
は script オプシ ョ ン を指定すれば充分であ り 、language オプシ ョ ン を指定 し て も シ ェーピ
ン グは改善で き ません。
OpenType レ イ ア ウ ト 機能
フ ォ ン ト は、 OpenType レ イ ア ウ ト 機能を言語固有なや り 方
で実装す る こ と がで き ます (159 ページ 「用字系 ・ 言語固有の OpenType レ イ ア ウ ト 機能」
を参照)。 若干の機能は、 script ・ language オプシ ョ ンに従っ て動作が変わ る こ と があ り ま
すが、 こ れ ら のオプシ ョ ン な し で も 使え る のに対 し (liga 等)、 locl 機能は script ・ language
オプシ ョ ン と 組み合わせてのみ意味を持ち ます。
注 テキス ト フ ローにおける高度な改行 (221 ページ 「8.2.9 高度な用字系固有の改行」 を参照)
で も、 言語固有の処理が行われますが、 こ れは language オプ シ ョ ンによ っ て司 られるの
ではな く 、 locale オ プ シ ョ ン に よ っ て司 ら れます。 locale オプ シ ョ ンは言語だけで な く 、
国 と 地域を も特定する ものです。
6.4.3 複雑用字系のシ ェ ー ピ ン グ
シ ェーピ ン グ処理は、 キ ャ ラ ク タ が単語の先頭 ・ 途中 ・ 末尾ま たは単独位置のいずれにあ
る かに よ っ て適切な グ リ フ字体を選択 し ます。シ ェ ーピ ン グは、ア ラ ビ ア文字・ ヒ ンデ ィ ー
文字テ キ ス ト 処理の不可欠な要素です。 シ ェ ーピ ン グは、 2 個以上のキ ャ ラ ク タ 列を適切
な合字へ置 き 換え る こ と も あ り ます。シ ェーピ ン グ処理は適切な キ ャ ラ ク タ 字体を自動的
に決定 し ますので、 明示的な合字 と Unicode の表示形 (U+FB50 のア ラ ビ ア文字表示形 A
等) を入力キ ャ ラ ク タ と し て用いてはいけ ません。
複雑用字系は、1 つのキ ャ ラ ク タ に対 し て複数の異な る グ リ フ字体を必要 と し 、 かつ こ
れ ら のグ リ フ を選択 し 配置す る ための追加の規則を要する こ と か ら 、複雑用字系のシ ェー
ピ ン グはあ ら ゆ る 種類の フ ォ ン ト で働 く わけではな く 、必要な情報を含んだ適当な フ ォ ン
ト が必要です。 シ ェ ーピ ン グは、 必要な機能テーブルを含む TrueType ・ OpenType フ ォ ン
ト で働 き ます (要件の詳細は 163 ページ 「シ ェーピ ン グのための要件」 を参照)。
シ ェーピ ン グは、同一フ ォ ン ト 内のキ ャ ラ ク タ 群に対 し てのみ行 う こ と がで き ます。な
ぜな ら シ ェーピ ン グ情報は特定の フ ォ ン ト に固有の も のだか ら です。 た と えば、 複数の異
な る フ ォ ン ト にわた る 合字を形成す る こ と は意味があ り ませんので、複雑用字系のシ ェー
ピ ン グは、複数の異な る フ ォ ン ト か ら のキ ャ ラ ク タ を含む単語には適用す る こ と がで き ま
せん。
シ ェ ー ピ ン グ動作 を上書 き 場合に よ っ ては、 ユーザーがデ フ ォ ル ト のシ ェ ーピ ン グ動
作を上書 き し たい こ と も あ り ます。 PDFlib は こ の目的のためにい く つかの Unicode 組版
キ ャ ラ ク タ に対応 し てい ます。 利用の便宜のため、 こ れ ら の組版キ ャ ラ ク タ は実体で指定
す る こ と も 可能です (表 6.4 参照)。
6.4.4 双方向組版
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クのcomplex_scripts/bidi_formatting ト ピ ッ ク にあ り
ます。
右書 き のテ キ ス ト (ア ラ ビ ア文字 ・ ヘブ ラ イ 文字をは じ め と す る さ ま ざ ま な用字系) にお
いては、 ア ド レ スや別言語に よ る 引用等で、 左書 き の欧文テ キ ス ト 列が入れ子にな る こ と
が非常に頻繁にあ り ます。 こ の よ う な混在テ キ ス ト 列では双方向 (Bidi) 組版が必要にな
り ます。 数字はつねに左書 き さ れますので、 双方向問題は、 全 く ア ラ ビ ア文字 ・ ヘブ ラ イ
文字だけで書かれたテ キ ス ト に も 生 じ ます。PDFlib は双方向テ キ ス ト 並べ替え を、Unicode
規格付録 #91 に示 さ れた Unicode 双方向アルゴ リ ズ ムに従っ て実装 し てい ます。 双方向処
164
第 6 章 : テキス ト 出力
表 6.3 language オプ シ ョ ンのキーワー ド 一覧
キー
ワー
ド
キー
ワー
ド
言語
キー
ワー
ド
言語
_none 言語指定な し
FIN
フ ィ ンラン ド語
NEP
ネパール語
AFK
ア フ リ カ ーン ス
FRA
フ ラ ン ス語
ORI
オ リ ヤー語
SQI
アルバニア語
GAE
ゲール語
PAS
パシ ュ ト ー語
ARA
ア ラ ビ ア語
DEU
ド イ ツ語
PLK
ポー ラ ン ド 語
HYE
アル メ ニア語
ELL
ギ リ シ ャ語
PTG
ポル ト ガル語
ASM
ア ッ サム語
GUJ
グジ ャ ラ ー ト 語
ROM
ルーマニ ア語
EUQ
バス ク語
HAU
ハウサ語
RUS
ロ シ ア語
BEL
ベ ラ ルーシ語
IWR
ヘブ ラ イ語
SAN
サン ス ク リ ッ ト
BEN
ベン ガル語
HIN
ヒ ンデ ィ ー
SRB
セルビ ア語
BGR
ブルガ リ ア語
HUN
ハン ガ リ ー語
SND
シン ド語
CAT
カ タ ルーニ ャ語
IND
イ ン ド ネシ ア語
SNH
シ ンハラ 語
CHE
チ ェ チ ェ ン語
ITA
イ タ リ ア語
SKY
ス ロバキア語
ZHP
中国語注音符号
JAN
日本語
SLV
ス ロベニ ア語
ZHS
中国語簡体字
KAN
カ ンナダ語
ESP
スペ イ ン語
ZHT
中国語繁体字
KSH
カ シ ミ ール語
SVE
スウ ェ ーデン語
COP
コプ ト語
KHM
ク メ ール語
SYR
シ リ ア語
HRV
ク ロ アチア語
KOK
コ ン カ ニ語
TAM
タ ミ ル語
CSY
チ ェ コ語
KOR
韓国語
TEL
テルグ語
DAN
デン マー ク語
MLR
改正マ ラ ヤー ラ ム語
THA
タ イ語
NLD
オ ラ ン ダ語
MAL
伝統マ ラ ヤー ラ ム語
TIB
チベ ッ ト 語
DZN
ゾンカ
MTS
マル タ 語
TRK
ト ル コ語1
ENG
英語
MNI
マニ プ リ 語
URD
ウル ド ゥ ー語
ETI
エ ス ト ニア語
MAR
マ ラ ーテ ィ ー語
WEL
ウ ェ ールズ語
FAR
ペルシ ア語
MNG
モ ン ゴル語
JII
イ デ ィ ッ シ ュ語
言語
1. い く つかの フ ォ ン ト は ト ル コ 語に対 し て誤 っ て TUR を用いていますので、 PDFlib は こ の タ グ を TRK と 等価 と し て
扱います。
表 6.4 デ フ ォル ト シ ェ ーピ ン グ動作を上書き する ための Unicode 制御キ ャ ラ ク タ 一覧
組版
キャ ラ ク タ
実体名
Unicode 名
機能
U+200C
ZWNJ
ゼロ幅非接合子
隣 り 合 う 2 個のキ ャ ラ ク タ が続け字にな
ら ないよ う に し ます
U+200D
ZWJ
ゼロ幅接合子
隣 り 合 う 2 個のキ ャ ラ ク タ が続け字にな
る よ う に し ます
1. www.unicode.org/unicode/reports/tr9/ を参照。
6.4 複雑用字系出力
165
理は、 オプシ ョ ンで有効にす る 必要はな く 、 右書 き のテ キ ス ト が適切な script オプシ ョ ン
と と も に現れた際には、 シ ェーピ ン グ処理の一環 と し て自動的に適用 さ れます。
注 双方向処理は現在の と こ ろ、 複数行テキス ト フ ローでは対応 し てお ら ず、 テキス ト 行 (す
なわち一行テキス ト 出力) でのみ対応 し ています。
双方向アルゴ リ ズム を上書 き 自動双方向処理は多 く の場合において適切な結果を与え
ますが、 場合に よ っ ては明示的なユーザー制御が必要な こ と も あ り ます。 PDFlib では こ の
目的のためにい く つかの方向組版 コ ー ド に対応 し てい ます。 利用の便宜のため、 こ れ ら の
組版キ ャ ラ ク タ は実体で指定す る こ と も 可能です (表 6.5 参照)。 こ れ ら の双方向組版 コ ー
ド は、 下記の よ う な場合にデフ ォ ル ト の双方向アルゴ リ ズ ム を上書 き す る のに有用です :
> 右書 き の段落が左書 き のキ ャ ラ ク タ 群で始ま る 場合。
> 混在テ キ ス ト 列が入れ子にな っ てい る 場合。
> 左書 き テ キ ス ト と 右書 き テ キ ス ト と の間の境界に、 句読点等の弱いキ ャ ラ ク タ 群があ
る 場合。
> 混在テ キ ス ト を含む製品番号等の場合。
表 6.5 双方向アルゴ リ ズムを上書き する ための方向組版 コ ー ド 一覧
組版コ ー ド
実体名
Unicode 名
機能
U+202A
LRE
左書き埋め込み (LRE)
埋め込み左書き列を開始 し ます
U+202B
RLE
右書き埋め込み (RLE)
埋め込み右書き列を開始 し ます
U+200E
LRM
左書き マー ク (LRM)
左書きのゼロ幅キ ャ ラ ク タ
U+200F
RLM
右書き マー ク (RLM)
右書きのゼロ幅キ ャ ラ ク タ
U+202D
LRO
左書き上書き (LRO)
キ ャ ラ ク タ 群を強い左書き キ ャ ラ ク タ 群
と し て扱 う よ う 強制
U+202E
RLO
右書き上書き (RLO)
キ ャ ラ ク タ 群を強い右書き キ ャ ラ ク タ 群
と し て扱 う よ う 強制
U+202C
PDF
方向組版ポ ッ プ (PDF)
直前の LRE ・ RLE ・ RLO ・ LRO の前の双
方向状態へ復帰
右書 き文書処理の向上のためのオ プ シ ョ ン さ ま ざ ま な組版オプシ ョ ンや Acrobat の動
作のデフ ォ ル ト 設定は、 左書 き テ キ ス ト 出力に合わせて設定 さ れてい ます。 右書 き のテ キ
ス ト 組版 と 文書表示のためには、 下記のオプシ ョ ン を用い ます :
> テ キ ス ト 行を、 下記のはめ込みオプシ ョ ン で右揃えで配置 し ます :
position={right center}
> リ ーダ を、 テ キ ス ト と 左枠の間に生成 し ます :
leader={alignment=left text=.}
> PDF_begin/end_document( ) の下記のオプシ ョ ン を用いて、 Acrobat での右書き 文書 ・
ページ表示を改善 し ます :
viewerpreferences={direction=r2l}
コ ー ド 内で双方向テキス ト を扱 う 双方向テ キ ス ト を扱 う 際には下記 も 有用で し ょ う :
> PDF_info_textline( ) の startx/starty・endx/endy キーワ ー ド を用い る と 、それぞれ論理的
開始 ・ 終了キ ャ ラ ク タ の座標を知 る こ と がで き ます。
166
第 6 章 : テキス ト 出力
> PDF_info_textline( ) の writingdirx キー ワー ド を用い る と 、テ キ ス ト の主流な書記方向を
知 る こ と がで き ます。 こ の方向は、 テ キ ス ト の先頭キ ャ ラ ク タ 群か ら 、 ま たは表 6.5 に
従っ た方向組版 コ ー ド (テ キ ス ト 内にあれば) か ら 推定 さ れます。
> PDF_info_textline( ) の position オプシ ョ ンで auto キーワー ド を用い る と 、自動的にア ラ
ビ ア文字ま たはヘブ ラ イ 文字のテ キ ス ト は右枠へ、 欧文テ キ ス ト は左枠へ寄せ ら れ ま
す。 た と えば下記のテ キ ス ト 行オプシ ョ ンは、 テ キ ス ト をベース ラ イ ン上に右寄せま
たは左寄せ し ます :
boxsize={width 0} position={auto bottom}
6.4.5 ア ラ ビ ア文字テキス ト 組版
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの complex_scripts/arabic_formatting ト ピ ッ ク にあ
り ます。
上述の双方向組版 と テ キ ス ト のシ ェーピ ン グに加え、ア ラ ビ ア用字系のテ キ ス ト 出力の生
成に関 し ては、 ほかに も 組版上の側面がい く つかあ り ます。
ア ラ ビ ア合字 ア ラ ビ ア用字系は合字を多用 し ます。多 く のア ラ ビ ア文字フ ォ ン ト は 2 種
類の合字を含んでお り 、 それぞれ PDFlib では異な る 扱いを受け ます :
> 必須合字 (rlig 機能) はつねに適用す る 必要があ り ます。 ラ ーム - ア リ フお よ びその派
生形等が こ れにあ た り ます。 必須合字は、 script=arab で shaping オプシ ョ ン を有効に
し てい る 場合に用い ら れます。
> 任意ア ラ ビ ア合字 (liga ・ dlig 機能) は自動的には用い ら れず、 他のユーザー制御の
OpenType 機能 と 同様に、 features={liga} で有効にす る こ と がで き ます。 任意ア ラ ビ ア
合字は、 複雑用字系処理 と シ ェーピ ン グの後に適用 さ れます。
ア ラ ビ ア文字テキス ト 内の欧文合字 テ キ ス ト 行では、 OpenType 機能の用字系固有処理
は予期 し ない結果を生み出す こ と があ り ます。 た と えば、 欧文合字は同一テ キ ス ト 行内で
ア ラ ビ ア文字テ キ ス ト と 混在す る と 働 き ません。 その原因は、 テ キ ス ト 行の内容に対 し て
は script オプシ ョ ン を一度 し か与え る こ と がで き ず、 それが shaping ・ feature オプシ ョ ン
の両方に効力を持つか ら です :
shaping script=arab features={liga}
誤り。多くのフォントでは働きません!
し か し 、 ア ラ ビ ア文字フ ォ ン ト は通常、 欧文合字を、 ア ラ ビ ア用字系指定に対 し ては含ん
でお ら ず、 デフ ォ ル ト ま たは欧文用字系に対 し てのみ含んでお り 、 し か し 1 つのテ キ ス ト
行の中で script オプシ ョ ンは変え る こ と がで き ません。 こ のため、 PDFlib は欧文合字を一
切見つけ る こ と がで き ずに、 プ レーン な キ ャ ラ ク タ を出力 し ます。
合字 を さ せない あ る 種の略称等、場合に よ っ ては、隣 り 合 う キ ャ ラ ク タ を合字に さ せた
く ない こ と があ り ます。 こ の場合には、 表 6.4 に挙げた組版キ ャ ラ ク タ を用いて、 合字を
強制 し た り 禁止 し た り す る こ と がで き ま す。 た と えば、 下記の例のゼ ロ 幅非結合子は、
キ ャ ラ ク タ が合字を形成す る こ と を禁止 し て、 正 し い略称表記を生成 し てい ます :
&#x0623;&#x064A;&ZWNJ;&#x0628;&#x064A;&ZWNJ;&#x0625;&#x0645;
ア ラ ビ ア文字テキス ト におけ る タ ト ウ ィ ール タ ト ウ ィ ールキ ャ ラ ク タ U+0640 (カ シー
ダ と も い う ) を 1 個ない し 複数挿入す る こ と に よ っ て、 ア ラ ビ ア単語を引 き 伸ばす こ と が
で き ます。PDFlib は自動的に タ ト ウ ィ ールキ ャ ラ ク タ を挿入す る こ と に よ る テ キ ス ト の均
6.4 複雑用字系出力
167
等揃えは行い ませんが、 こ のキ ャ ラ ク タ を自分で入力テ キ ス ト 内に挿入 し て単語を引 き 伸
ばす こ と はで き ます。
ア ラ ビ ア文字 フ ォ ン ト に欧文キ ャ ラ ク タ を追加 い く つか の ア ラ ビ ア 文字 フ ォ ン ト は、
欧文キ ャ ラ ク タ に対す る グ リ フ を一切含んでい ません。Apple Mac OS X に同梱 し てい る ア
ラ ビ ア文字フ ォ ン ト 等が こ れにあ た り ます。 こ の場合は fallbackfonts オプシ ョ ン を使っ
て、 欧文キ ャ ラ ク タ を ア ラ ビ ア文字フ ォ ン ト に連結する こ と がで き ます。 PDFlib は、 欧文
ま たはア ラ ビ ア文字のテ キ ス ト 入力に従っ て自動的に両フ ォ ン ト を切 り 替え ます。すなわ
ち、 アプ リ ケーシ ョ ン側で フ ォ ン ト を切 り 替え る 必要はな く 、 欧文 と ア ラ ビ ア文字が混在
す る テ キ ス ト を 1 個の フ ォ ン ト 指定で与え る こ と がで き ます。
fallbackfonts オプシ ョ ン に対 し て下記の フ ォ ン ト 読み込みオプシ ョ ン リ ス ト を用い る
と 、 読み込んだア ラ ビ ア文字フ ォ ン ト へ Helvetica フ ォ ン ト か ら 欧文キ ャ ラ ク タ を追加す
る こ と がで き ます :
fallbackfonts={
{fontname=Helvetica encoding=unicode forcechars={U+0021-U+00FF}}
}
168
第 6 章 : テキス ト 出力
6.5 日本語 ・ 中国語 ・ 韓国語テキス ト 出力
6.5.1 標準日中韓 フ ォ ン ト
Acrobat は、日中韓フ ォ ン ト 用の さ ま ざ ま な標準フ ォ ン ト に対応 し てい ます。こ う し た フ ォ
ン ト は、 Acrobat の イ ン ス ト ール と と も に (ま たは Asian FontPack で) 提供 さ れますので、
PDF フ ァ イ ルに埋め込む必要があ り ません。 こ の よ う な フ ォ ン ト は、 よ く 利用 さ れ る エン
コ ーデ ィ ン グに必要な キ ャ ラ ク タ をすべて含んでお り 、 ま た、 縦書 き に も 横書 き に も 対応
し てい ます。 標準フ ォ ン ト の一覧を、 適用可能な CMap と と も に表 6.6 に示 し ます (日中
韓CMapについての詳細は103ページ「4.3 日本語・中国語・韓国語エン コ ーデ ィ ン グ」参照)。
注 カ ス タ ム日中韓 フ ォ ン ト に対 し ては、 Unicode
encoding=unicode の使用を推奨 し ます。
CMap (UCS2 または UTF16) ではな く 、
注 Acrobat の標準日中韓 フ ォ ン ト はボール ド 体 と イ タ リ ッ ク 体に対応 し ていません。し か し 、
擬似 フ ォ ン ト ス タ イル機能で擬似的に印字 さ せる こ と はで き ます (151 ページ 「6.2.3 テキ
ス ト バ リ エーシ ョ ン」 参照)。
表 6.6 日本語 ・ 中国語 ・ 韓国語テキス ト 用の Acrobat 標準フ ォ ン ト ・ CMap (エ ン コ ーデ ィ ング) 一覧
ロ ケール
フォン ト名
印字例
1
対応 CMap (エ ン コ ーデ ィ ング)
日本語
KozMinPro-Regular-Acro
KozGoPro-Medium2
KozMinProVI-Regular2
中国語
簡体字
AdobeSongStd-Light2
GB-EUC-H, GB-EUC-V, GBpc-EUC-H, GBpcEUC-V, GBK- EUC- H, GBK-EUC-V, GBKp-EUC-H,
GBKp-EUC-V, GBK2K-H, GBK2K-V, UniGBUCS2-H, UniGB-UCS2-V, UniGB-UTF16-H3,
UniGB-UTF16-V3
中国語
繁体字
AdobeMingStd-Light2
B5pc-H, B5pc-V, HKscs-B5-H, HKscs-B5-V,
ETen-B5-H, ETen-B5-V, ETenms-B5-H, ETenmsB5-V, CNS-EUC-H, CNS-EUC-V, UniCNS-UCS2H, UniCNS-UCS2-V, UniCNS-UTF16-H3, UniCNSUTF16-V3
韓国語
AdobeMyungjoStd-Medium2
KSC-EUC-H, KSC-EUC-V, KSCms-UHC-H,
KSCms-UHC-V, KSCms-UHC-HW-H, KSCmsUHC-HW-V, KSCpc-EUC-H, UniKS-UCS2-H,
UniKS-UCS2-V, UniKS-UTF16-H3, UniKS-UTF16V3
83pv-RKSJ-H, 90ms-RKSJ-H, 90ms-RKSJ-V,
90msp-RKSJ-H, 90msp-RKSJ-V, 90pv-RKSJ-H,
Add-RKSJ-H, Add-RKSJ-V, EUC- H, EUC-V, ExtRKSJ-H, Ext-RKSJ-V, H, V, UniJIS-UCS2-H,
UniJIS-UCS2-V, UniJIS-UCS2-HW-H1, UniJISUCS2-HW-V1, UniJIS-UTF16-H3 , UniJIS-UTF16V3
1. HW CMap 群は、 KozMinPro-Regular-Acro ・ KozGoPro-Medium-Acro フ ォ ン ト に対 し ては用いる こ と はで き ません。 なぜな ら
こ れ ら の フ ォ ン ト にはプ ロ ポーシ ョ ナル ASCII キ ャ ラ ク タ し かな く 、 半角文字がないためです。
2. PDF 1.6 以上を生成する と きのみ利用可能
3. PDF 1.5 以上を生成する と きのみ利用可能
ネ イ テ ィ ブ な日中韓 レ ガ シ コ ー ド を保持 keepnative=true の場合には、選択 さ れた CMap
に従っ たネ イ テ ィ ブな レ ガシ キ ャ ラ ク タ コ ー ド (Shift-JIS 等) が PDF 出力へ書 き 込まれま
す。 そ う でなければテ キ ス ト は Unicode へ変換 さ れます。 keepnative=true の利点は、 その
よ う な フ ォ ン ト は埋め込みな し で フ ォーム フ ィ ール ド で使え る こ と です (keepnative フ ォ
6.5 日本語 ・ 中国語 ・ 韓国語テキス ト 出力
169
ン ト 読み込み オ プ シ ョ ン の 説明 は PDFlib API リ フ ァ レ ン ス を 参照 し て く だ さ い) 。
keepnative=false の場合には、 レ ガシ コ ー ド は CID 値へ変換 さ れた う えで PDF 出力へ書 き
込まれます。 その利点は、 OpenType 機能が利用で き る こ と と 、 テ キ ス ト フ ロ ー組版機能
が利用で き る こ と です。 見た目はど ち ら の場合 も 同等です。
横書 き と 縦書 き PDFlib は、 横書 き に も 縦書 き に も 対応 し てい ます。 縦書 き は さ ま ざ ま
な方法で要求で き ます (ただ し Type 1 フ ォ ン ト では縦書 き には対応 し てい ません) :
> 標準日中韓フ ォ ン ト ・ CMap については、 横書 き か縦書 き かは、 適切な CMap 名を選ぶ
こ と に よ っ てエン コ ーデ ィ ン グ と と も に選択 さ れます。 CMap 名の末尾が -H な ら 横書
き が選択 さ れ、 -V な ら 縦書 き が選択 さ れます。
> CMap以外のエン コ ーデ ィ ン グ を持つフ ォ ン ト の場合は、vertical オプシ ョ ン を与えれば
縦書 き で利用で き ます。
> 「@」 キ ャ ラ ク タ で始ま る フ ォ ン ト 名はつねに縦書 き で処理 さ れます。
注 字間は縦書き では負の値でなければな り ません。 こ れは、 文字を 1 個ずつ印字 し ては戻る
ためです。
標準日中韓 フ ォ ン ト の利用例
標準日中韓フ ォ ン ト を選択す る には、 PDF_load_font( ) イ
ン タ フ ェース を用いて、 CMap 名を encoding パ ラ メ タ と し て与え ます。 し か し 、 あ る 1 つ
の日中韓フ ォ ン ト はあ る 特定の CMap のセ ッ ト に し か対応 し てい ません し (表 6.6 参照)、
Unicode 利用可能な言語バ イ ンデ ィ ン グは UCS2 互換の CMap に し か対応 し ていない こ と
を考慮す る 必要があ り ます。 表 6.6 にあ る KozMinPro-Regular-Acro の印字例は下記の コ ー
ド で生成す る こ と がで き ます :
font = p.load_font("KozMinPro-Regular-Acro", "UniJIS-UCS2-H", "");
if (font == -1) { ... }
p.setfont(font, 24);
p.set_text_pos(50, 500);
p.show("\u65E5\u672C\u8A9E");
上記の命令群は日本語の標準フ ォ ン ト の 1 つを特定 し 、 Shift-JIS 互換の CMap (Ext-RKSJ)
と 横書 き (H) を選びます。 fontname 引数はフ ォ ン ト の正確な名前でなければな ら ず、 エ
ン コ ーデ ィ ン グや縦書 き 横書 き を表す接尾辞は一切つけてはいけ ません。encoding 引数は
対応 CMap の う ちのいずれかの名前であ り (どれを選ぶかはフ ォ ン ト に よ り ます)、 縦書
き か横書 き か も その中で表 さ れます (上述)。 PDFlib は、 Acrobat のすべてのデフ ォ ル ト
CMap に対応 し てお り 、 要求 さ れた フ ォ ン ト と CMap と が合わない こ と を発見 し た と き に
はその こ と を知 ら せて き ます。 た と えば、 韓国語フ ォ ン ト を日本語エン コ ーデ ィ ン グで使
用す る よ う 要求 さ れて も PDFlib は拒否 し ます。
等幅 フ ォ ン ト を強制 ア プ リ ケーシ ョ ン のなかには、 プ ロ ポーシ ョ ナルな日中韓 フ ォ ン
ト を取 り 扱 う 仕組みを持たず、テ キ ス ト 幅の計算を固定グ リ フ幅×グ リ フ数で済ませて し
ま う も の も あ り ます。 PDFlib では、 グ リ フ の幅が通常一定でない フ ォ ン ト に対 し て も 、 等
幅のグ リ フ を強制 さ せ る こ と が可能です。 PDF_load_font( ) で monospace オプシ ョ ン を用
いて、 すべてのグ リ フ に対 し て と ら せたい幅を指定 し ます。 標準日中韓フ ォ ン ト に対 し て
は、 下記の よ う に値 1000 を指定すれば満足で き る 結果が得 ら れます :
font = p.load_font("KozMinPro-Regular-Acro", "UniJIS-UCS2-H", "monospace=1000");
こ の monospace オプシ ョ ンは、 標準日中韓フ ォ ン ト に対 し てのみ推奨 さ れます。
170
第 6 章 : テキス ト 出力
6.5.2 カ ス タ ム日中韓 フ ォ ン ト
注 PDFlib GmbH では、 MS ゴ シ ッ ク ・ MS 明朝フ ォ ン ト を www.pdflib.com で無償ダウン ロー
ド 提供 し ています。 PDFlib の ラ イ セ ン ス を お持ちの方は これらのフ ォ ン ト を、 別途フ ォ ン
ト ラ イ セ ン ス を得る必要な く 利用する権利を有 し ます。
Acrobat の標準日中韓フ ォ ン ト のほかに、 PDFlib は、 TrueType 形式 (TrueType Collections
= TTC を含む) や OpenType 形式のカ ス タ ム日中韓フ ォ ン ト (表 6.6 の一覧にない フ ォ ン
ト ) に も 対応 し てい ます。 カ ス タ ム日中韓フ ォ ン ト は次の よ う に処理 さ れます。
> embedding オプシ ョ ンが true な ら ば、フ ォ ン ト は CID フ ォ ン ト に変換 さ れて、PDF 出力
に埋め込まれます。
> Windows上の日中韓ホ ス ト フ ォ ン ト 名は、先頭に BOM のついた UTF-8形式か UTF-16形
式で PDF_load_font( ) に与え る こ と がで き ます。 し か し 、 Mac では非欧文ホ ス ト フ ォ ン
ト 名に対応 し てい ません。
> keepnative オプシ ョ ンはデフ ォ ル ト で false です。Acrobat での面倒な問題を避け る ため、
フ ォ ン ト 埋め込み を し な く て よ い な ら keepnative=false に設定す る こ と を、 ま た、
keepnative=true に し たいな ら embedding=true に設定す る こ と を推奨 し ます。
日本語 Shift-JIS テキス ト での カ ス タ ム日中韓 フ ォ ン ト の利用例 下記の例は、 MS 明朝
フ ォ ン ト を用いて、 Windows コ ー ド ページ 932 に従っ て Shift-JIS 形式で与え ら れた日本語
テ キ ス ト を表示す る も のです :
font = PDF_load_font(p, "MS Mincho", 0, "cp932", "");
if (font == -1) { ... }
PDF_setfont(p, font, 24);
PDF_set_text_pos(p, 50, 500);
PDF_show2(p, "\x82\xA9\x82\xC8\x8A\xBF\x8E\x9A", 8);
中国語 Unicode テキス ト での カ ス タ ム日中韓 フ ォ ン ト の利用例 下記の例では、 中国語
テ キ ス ト を ArialUnicodeMS フ ォ ン ト で印字 し てい ます。 フ ォ ン ト は、 シ ス テ ムに イ ン ス
ト ール さ れてい る か、 あ る いは 128 ページ 「5.4.3 フ ォ ン ト を検索」 に従っ て設定 さ れて
い る 必要があ り ます :
font = p.load_font("Arial Unicode MS", "unicode", "");
p.setfont(font, 24);
p.set_text_pos(50, 500);
p.show("\u4e00\u500b\u4eba");
TrueType Collection (TTC) 内の個々の フ ォ ン ト を利用 TTCフ ァ イ ルは、複
数の別々の フ ォ ン ト を持っ てい ます。 各フ ォ ン ト を利用す る にはその適切な
名前を与え ます。 ただ し 、 TTC フ ァ イ ル内が ど の フ ォ ン ト を持っ てい る かを
知 ら ない場合には、 各フ ォ ン ト を番号で指定す る こ と も 可能です。 具体的に
は、 コ ロ ン と フ ォ ン ト 番号 (0 か ら 始 ま る ) を追加す る こ と に よ り 指定 し ま
す。 番号が 0 の場合には省略可能です。 た と えば、 TTC フ ァ イ ル msgothic.ttc は複数の
フ ォ ン ト を持っ てお り 、 PDF_load_font( ) で下記の よ う に指定す る こ と がで き ます (各行
内の フ ォ ン ト 名は等価) :
6.5 日本語 ・ 中国語 ・ 韓国語テキス ト 出力
171
msgothic:0
msgothic:1
msgothic:2
MS Gothic
MS PGothic
MS UI Gothic
msgothic:
ただ し 、 msgothic (接尾辞をつけない) はフ ォ ン ト 名 と し ては扱われません。 なぜな ら そ
れではフ ォ ン ト を一意に特定で き ないか ら です。 フ ォ ン ト 名の別名 (128 ページ 「フ ォ ン
ト デー タ の情報源」 参照) を TTC 番号 と 組み合わせて用い る こ と も 可能です。 指定 さ れ
た番号の フ ォ ン ト が見つか ら ない と き には、 関数呼び出 し は失敗 し ます。
TTC フ ォ ン ト フ ァ イ ルは 1 回のみ設定 し なければな り ません。 TTC フ ァ イ ル内のすべ
ての番号づけ ら れた フ ォ ン ト は自動的に発見 さ れます。 以下に、 msgothic.ttc 内のすべて
の番号づけ ら れた フ ォ ン ト を設定す る ために充分な コ ー ド を示 し ます (128 ページ 「5.4.3
フ ォ ン ト を検索」 参照) :
p.set_parameter("FontOutline", "msgothic=msgothic.ttc");
6.5.3 EUDC ・ SING フ ォ ン ト で外字キ ャ ラ ク タ を利用
PDFlib は、日中韓テ キ ス ト のためのカ ス タ ム外字キ ャ ラ ク タ を利用で き る Windows EUDC
(エン ド ユーザー定義キ ャ ラ ク タ 、 *.tte) ・ SING フ ォ ン ト (*.gai) に対応 し てい ます。 最 も
便利なのは、カ ス タ ム キ ャ ラ ク タ を持っ た フ ォ ン ト を予備フ ォ ン ト 機構で他の フ ォ ン ト へ
統合す る こ と で し ょ う 。 外字キ ャ ラ ク タ は多 く の場合、 EUDC ま たは SING フ ォ ン ト で提
供 さ れます。 あ る いは、 外字キ ャ ラ ク タ を Type 3 フ ォ ン ト と し て与え る こ と も で き ます
が、 こ れにはプ ロ グ ラ ミ ン グ工数が よ り 多 く 必要にな り ます。
予備 フ ォ ン ト で外字キ ャ ラ ク タ を利用 通常、 外字キ ャ ラ ク タ は Windows EUDC ま たは
SING グ リ フ レ ッ ト か ら 持っ て来ますが、fallbackfonts オプシ ョ ンはあ ら ゆ る 種類の フ ォ ン
ト を受け付け ます。 ですので こ の方法は外字キ ャ ラ ク タ に限 ら ず、 あ ら ゆ る 種類の記号に
対 し て利用す る こ と がで き ます (例 : 企業 ロ ゴが別フ ォ ン ト 内にあ る 場合)。 fallbackfonts
オプシ ョ ンに対 し て下記の フ ォ ン ト 読み込みオプシ ョ ン を用いれば、読み込んだ フ ォ ン ト
に対 し て、 EUDC フ ォ ン ト か ら のユーザー定義 (外字) キ ャ ラ ク タ を追加す る こ と がで き
ます :
fallbackfonts={
{fontname=EUDC encoding=unicode forcechars=U+E000 fontsize=140% textrise=-20%}
}
ベース フ ォ ン ト をひ と たび こ の予備フ ォ ン ト 設定で読み込めば、テ キ ス ト 内の EUDC キ ャ
ラ ク タ は、 フ ォ ン ト を変え る 必要な く 使 う こ と がで き ます。
SING フ ォ ン ト の場合、 Unicode 値は PDFlib に よ っ て自動的に決定 さ れますので、 与え
る 必要はあ り ません :
fallbackfonts={
{fontname=PDFlibWing encoding=unicode forcechars=gaiji}
}
EUDC フ ォ ン ト を用意 Windows で得 ら れ る EUDC エデ ィ タ を利用する と 、PDFlib で使 う
カ ス タ ム キ ャ ラ ク タ を作成す る こ と がで き ます。 以下の よ う に操作 し ます :
> eudcedit.exe を使っ て、1 個ない し 複数のカ ス タ ム キ ャ ラ ク タ を、望む Unicode 位置に作
成 し ます。
> デ ィ レ ク ト リ \Windows\fonts 内で EUDC.TTE フ ァ イ ルを見つけ、それを ど こ か別のデ ィ
レ ク ト リ へ複製 し ます。 こ の フ ァ イ ルは Windows Explorer では不可視ですので、 DOS
172
第 6 章 : テキス ト 出力
ボ ッ ク ス内で dir ・ copy コ マ ン ド を用いて フ ァ イ ルを見つけ ます。 そ し て こ の フ ォ ン ト
を PDFlib で利用で き る よ う 、 128 ページ 「5.4.3 フ ォ ン ト を検索」 で示 し た方式のいず
れかで設定 し ます :
p.set_parameter("FontOutline", "EUDC=EUDC.TTE");
p.set_parameter("SearchPath", "...ディレクトリ名...");
ま たは EUDC.TTE を カ レ ン ト デ ィ レ ク ト リ 内に置 き ます。
あ る いは、 こ の よ う に明示的に フ ォ ン ト フ ァ イ ル設定をす る のではな く 、 下記の関数
呼び出 し を用いて、 Windows デ ィ レ ク ト リ か ら 直接フ ォ ン ト フ ァ イ ルを設定す る こ と
も で き ます。 こ う す る と 、 Windows 内で用い ら れてい る カ レ ン ト EUDC フ ォ ン ト をつ
ねに利用す る こ と にな り ます :
p.set_parameter("FontOutline", "EUDC=C:\Windows\fonts\EUDC.TTE");
> EUDC フ ォ ン ト を、任意のベース フ ォ ン ト に対 し て、先述の よ う にfallbackfontsオプシ ョ
ン を用いて統合 し ます。 フ ォ ン ト を直接利用 し たい場合は、 下記の呼び出 し を用いて
フ ォ ン ト を通常どお り に PDFlib へ読み込みます :
font = p.load_font("EUDC", "unicode", "");
そ し て最初の ス テ ッ プで選んだ Unicode 値を与えて キ ャ ラ ク タ を出力 し ます。
6.5.4 OpenType レ イ ア ウ ト 機能 と 高度な日中韓テキス ト 出力
154 ページ 「6.3 OpenType レ イ ア ウ ト 機能」 で解説 し た よ う に、 PDFlib は OpenType ・
TrueType フ ォ ン ト 内の高度な タ イ ポグ ラ フ ィ レ イ ア ウ ト テーブルに対応 し てい ます。 た
と えば、 OpenType 機能を用いて、 欧文グ リ フ のプ ロ ポーシ ョ ナル幅か半角かいずれかの
字体を選択 し た り 、 異体字を選択 し た り す る こ と が可能です。 表 6.7 に、 日中韓テ キ ス ト
出力のための OpenType 機能を挙げます。
vert 機能 (縦書 き ) は、 縦書 き の フ ォ ン ト (すなわち、 PDF_load_font( ) に vertical オ
プシ ョ ン を与え ていた場合) に対 し ては自動的に有効にな り 、 横書 き の フ ォ ン ト に対 し て
は無効にな り ます。
表 6.7 日本語 ・ 中国語 ・ 韓国語テキス ト 用対応 OpenType レ イ アウ ト 機能一覧 ( こ れに加え て表 6.1 に、 一般的利
用のための OpenType レ イ アウ ト 機能を挙げています)
キー
ワー
ド
名前
説明
expt
エキスパー ト 字形
JIS78 字 と 同様、 こ の機能は、 標準の和文字形を、 対応する、 タ イ ポグ ラ フ ァ ーが
望む字形へ置き換え ます。
fwid
全角
他の幅に設定 さ れたグ リ フ を、 全角 (たいていは em) に設定 さ れたグ リ フ へ置き
換え。 これは欧文キ ャ ラ ク タ や さ ま ざ ま な記号を含む可能性があ り ます。
hkna
横組み用仮名
標準の仮名を、 横書き専用に特にデザイ ン さ れた字形へ置き換え。
hngl
ハングル
韓文漢字キ ャ ラ ク タ を、 対応するハングル (音素) キ ャ ラ ク タ へ置き換え。
hojo
補助漢字字形 (JIS
X 0212-1990)
JIS X 0213:2004 字形がデ フ ォル ト と し て エ ン コ ー ド さ れている場合に、 JIS X 02121990 字形 (「補助漢字」 と も いいます) を利用。
hwid
半角
プ ロポーシ ョ ナル幅の、 または em の半分以外の等幅のグ リ フ を、 em の半分 (en)
の幅のグ リ フへ置き換え。
ital
イタリック
ローマ ン体のグ リ フ を、 対応する イ タ リ ッ ク体のグ リ フ へ置き換え。
6.5 日本語 ・ 中国語 ・ 韓国語テキス ト 出力
173
表 6.7 日本語 ・ 中国語 ・ 韓国語テキス ト 用対応 OpenType レ イ アウ ト 機能一覧 ( こ れに加え て表 6.1 に、 一般的利
用のための OpenType レ イ アウ ト 機能を挙げています)
キー
ワー
ド
名前
説明
jp04
JIS2004 字形
(nlck 機能のサブ セ ッ ト ) JIS X 0213:2004 グ リ フ を利用。
jp78
JIS78 字形
デ フ ォル ト (JIS90) の和文グ リ フ を、 対応する JIS C 6226-1978 (JIS78) の字形へ
置き換え。
jp83
JIS83 字形
デ フ ォル ト (JIS90) の和文グ リ フ を、 対応する JIS X 0208-1983 (JIS83) の字形へ
置き換え。
jp90
JIS90 字形
JIS78 または JIS83 の和文グ リ フ を、 対応する JIS X 0208-1990 (JIS90) の字形へ
置き換え。
locl
ロー カ ラ イ ズ字形
グ リ フのロー カ ラ イ ズ さ れた字形で、 デ フ ォ ル ト 字形を置き換え る こ と を可能に し
ます。 こ の機能は script ・ language オプ シ ョ ン を必要 と し ます。
nalt
修飾字形
デ フ ォル ト のグ リ フ を、 さ ま ざ ま な表記字形へ置き換え (白丸囲み ・ 黒丸囲み ・ 四
角囲み ・ 括弧付き ・ 菱形囲み ・ 角丸四角囲み等)。
nlck
国語審議会漢字字
形
日本の国語審議会 (NLC) が多 く の JIS キ ャ ラ ク タ に対 し て 2000 年に制定 し た新
たなグ リ フ形状を利用。
pkna
プ ロポーシ ョ ナル
仮名
等幅 (半角ま たは全角) に設定 さ れた仮名および仮名関連のグ リ フ を、 プ ロポー
シ ョ ナルなグ リ フへ置き換え。
pwid
プ ロポーシ ョ ナル
グリ フ
等幅 (通常、 全角ま たは em の半分) に設定 さ れたグ リ フ を、 プ ロポーシ ョ ナルな
字送 り のグ リ フ へ置き換え。
qwid
4 分の 1 幅
他の幅のグ リ フ を、 em の 4 分の 1 (en の半分) の幅に設定 さ れたグ リ フへ置き換
え。
ruby
ルビ表記字形
デ フ ォル ト の仮名グ リ フ を、 (通常、 上付き に さ れた) ルビ用にデザイ ン さ れた、
よ り 小 さ いグ リ フへ置き換え。
smpl
簡体字
和文漢字または中文繁体字を、 対応する簡体字へ置き換え。
tnam
名前旧字体
和文新字体を、 対応する旧字体へ置き換え。 これは trad 機能 と 等価ですが、 ただ
し 個人の名前における使用が適切である と 認め ら れる旧字体に限られます。
trad
旧字体
和文漢字または中文簡体字を、 対応する旧字体 / 繁体字へ置き換え。
twid
3 分の 1 幅
他の幅のグ リ フ を、 em の 3 分の 1 の幅に設定 さ れたグ リ フへ置き換え。
vert
縦組み
デ フ ォル ト の字形を、 縦書き用に調整 さ れた異体字へ置き換え。
vkna
縦組み用仮名
標準の仮名を、 縦書き専用に特にデザイ ン さ れた字形へ置き換え。
vrt2
縦組み異体字 ・ 回
転
(vrt2 機能のサブ セ ッ ト である vert 機能を上書き し ます) 等幅 (半角 ・ 全角 ・ 4 分
の 1 幅のいずれか) またはプ ロポーシ ョ ナル幅 (多 く は欧文またはカ タ カ ナ) のグ
リ フ を、 縦書き に適 し た字形へ置き換え (すなわち、 90°時計回 り に回転)。
174
第 6 章 : テキス ト 出力
7 画像 ・ PDF ページの取 り 込み
PDFlib は、 ラ ス タ 画像や既存 PDF 文書内ページ を取 り 込んでページ上に配置す る ための
さ ま ざ ま な機能を提供 し ます。 こ の章では、 ラ ス タ 画像の取 り 扱いや既存 PDF 文書内ペー
ジの取 り 込みに関す る 詳細を解説 し ます。 ま た、 画像や PDF ページ を出力ページ上に配
置す る 方法については 188 ページ 「7.3 画像 と 取 り 込み PDF ページの配置」 を参照 し て く
だ さ い。
ク ッ ク ブ ッ ク 画像の諸側面に関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ クの images カ テ ゴ リ にあ り ま
す。
7.1 ラ ス タ 画像の取 り 込み
7.1.1 基本的な画像処理
PDFlib で ラ ス タ 画像を貼 り 付け る のは簡単です。 まず、 画像パ ラ メ タ 群の簡単な解析を行
う PDFlib 関数で画像を開 く 必要があ り ます。 その 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( ) の最後の引数は、 画像の位置 ・ 縮尺 ・ 回転を指定で き る さ ま ざ ま なオプ
シ ョ ン を持たせ る こ と ので き る オプシ ョ ン リ ス ト です。 こ のオプシ ョ ン群については 188
ページ 「7.3 画像 と 取 り 込み PDF ページの配置」 で詳 し く 説明 し ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの images/starter_image ト ピ ッ ク にあ り ます。
画像デー タ の再利用 ラ ス タ 画像の反復利用のための重要な PDF 最適化技法に PDFlib は
対応 し てい ます。 複数のページに同 じ ロ ゴや背景を使 う レ イ ア ウ ト を考え てみま し ょ う 。
その よ う な場合には画像デー タ 本体は一度 し か PDF 内に取 り 込まずに、 その画像を使 う
各ページか ら そ こ への参照だけ を生成す る こ と が可能です。画像フ ァ イ ルを一度読み込ん
でおいて、 各ページに ロ ゴや背景を配置す る たびに PDF_fit_image( ) を呼び出せば よ いの
です。 複数のページにその画像を配置 し た り 、 同 じ 画像で も 貼 り 付け る たびに縮尺を変え
た り す る こ と も で き ます (画像を閉 じ ていない限 り ) 。 画像の容量や使用回数に よ っ ては
こ の技法は顕著な容量節減を も た ら すで し ょ う 。
拡縮 と dpi 計算 取 り 込んだ画像のピ ク セル数を PDFlib が変え る こ と はあ り ません。 拡
縮す る と 画像の ピ ク セルは膨 ら んだ り 縮んだ り し ますが、ダ ウ ンサンプ リ ン グが行われ る
こ と はあ り ません (画像の ピ ク セル数はいつ も 同 じ ま ま です)。 縮尺が 1 な ら ば 1 ピ ク セ
ルの大 き さ はユーザー座標の 1 単位 と 同 じ にな り ます。 いいかえれば、 ユーザー座標系が
拡縮 さ れていなければ画像はその元の解像度で (その画像が解像度情報を持っ ていなけれ
ば 72 dpi で) 取 り 込まれます (デフ ォ ル ト では 1 イ ンチが 72 単位なので)。
7.1 ラ ス タ 画像の取 り 込み
175
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの images/image_dimensions ト ピ ッ ク にあ り ます。そ
こ に、 画像の寸法を得る方法や、 それを さ ま ざ ま な大き さ で貼る方法を示 し てあ り ます。
取 り 込み画像の色空間 PDF_load_image( ) で与え ら れたオプシ ョ ン に従っ て ICC プ ロ
フ ァ イ ルの追加 ・ 削除を し た り ス ポ ッ ト カ ラ ーを適用 し た り する 場合を除いて、 PDFlib は
一般に、 取 り 込んだ画像の元の色空間を保持 し よ う と し ます。 し か し 、 まれに こ れが不可
能な組み合わせがあ り ます。その一例 と し て、TIFFにおけ る YCbCrはRGBに変換 さ れます。
PDFlib は、 RGB と CMYK と の間の変換は一切行い ません。 その よ う な変換が必要な と
き は、 画像を PDFlib に取 り 込む前にその画像デー タ に適用 し てお く 必要があ り ます。
複数ページ画像 PDFlib は、 複数の画像を持つ GIF ・ TIFF ・ JBIG2 画像に対応 し てい ま
す。 こ れを複数ページ画像フ ァ イ ル と も いい ます。 複数ページ画像を利用す る には、 PDF_
load_image( ) で page オプシ ョ ン を用い ます :
image = p.load_image("tiff", filename, "page=2");
こ の page オプシ ョ ンは、 複数画像フ ァ イ ルが利用 さ れ る こ と を示 し 、 利用 し たい画像の
番号を指定 し ます。 先頭画像の番号は 1 です。 こ のオプシ ョ ンは、 PDF_load_image( ) が
フ ァ イ ル内で も う 画像が得 ら れない こ と を示す -1 を返すま で値を増や し てい く こ と がで
き ます。
ク ッ ク ブ ッ ク 複数画像TIFF フ ァ イル内のすべての画像を複数ページ PDF フ ァ イルへ変換する完全な コ ー
ド サン プルが ク ッ ク ブ ッ クの images/multi_page_tiff ト ピ ッ ク にあ り ます。
イ ン ラ イ ン画像 再利用可能画像は Image XObject と し て PDF 出力へ書 き 出 さ れますが、
こ れに対 し て イ ン ラ イ ン画像は各 コ ン テ ン ト ス ト リ ーム (ページかパ タ ーンかテ ンプ レー
ト かグ リ フ定義) の中に直接書 き 込ま れ ます。 こ れに よ り 若干の容量が節約で き ますが、
PDF リ フ ァ レ ン ス中の推奨に従い、 容量の小 さ な画像デー タ (4 KB ま で) での利用に留
め る べ き です。 イ ン ラ イ ン画像の主用途は Type 3 フ ォ ン ト のビ ッ ト マ ッ プグ リ フ定義で
す。
イ ン ラ イ ン画像を生成す る には PDF_load_image( ) イ ン タ フ ェース で inline オプシ ョ ン
を与え ます。 イ ン ラ イ ン画像の再利用はで き ません。 すなわちそのハン ド ルを画像ハン ド
ル と し て呼び出 し に与え てはいけ ま せん。 そのため、 inline オプ シ ョ ン が与え ら れ る と
PDF_load_image( ) の内部動作は以下 と 等価にな り ます。
p.fit_image(image, 0, 0, "");
p.close_image(image);
イ ン ラ イ ン画像は、 imagetype=ccitt ・ jpeg ・ raw でのみ対応 し てい ます。 他の種類の画像
では、 inline オプシ ョ ンは静かに無視 さ れます。
OPI 対応 画像を読み込む際には、 OPI (Open Prepress Interface) バージ ョ ン 1.3 ま たは
2.0 に従 っ た追加の情報 を、 PDF_load_image( ) への呼び出 し で与え る こ と がで き ま す。
PDFlib は、 すべての標準 OPI 1.3 ま たは 2.0 PostScript コ メ ン ト (対応す る PDF キーワー
ド ではあ り ません!) をオプシ ョ ン と し て受け付け、 その与え ら れた OPI 情報を、 一切変
更を加えずに生成 PDF 出力へパス スルー し ます。 下記の例では、 OPI 情報を画像に添付
し てい ます :
String optlist13 =
"OPI-1.3 { ALDImageFilename bigfile.tif " +
176
第 7 章 : 画像 ・ PDF ページの取 り 込み
"ALDImageDimensions {400 561} " +
"ALDImageCropRect {10 10 390 550} " +
"ALDImagePosition {10 10 10 540 390 540
390 10} }";
image = p.load_image("tiff", filename, optlist13);
注 Helios EtherShare に内蔵 さ れている ものな どい く つかの OPI サーバは、PDF の画像 XObject
に対する OPI 処理を正 し く 実装 し ていません。 PDFlib はデ フ ォル ト では画像 XObject を生
成 し ますが、 このよ う な場合には、 PDF_load_image( ) に template オプ シ ョ ン を与え る こ
と で フ ォ ーム XObject の生成を強制する こ と がで き ます。
画像内の XMP メ タ デー タ 画像フ ァ イ ルは XMP メ タ デー タ を含んでい る こ と があ り ま
す。 PDFlib はデフ ォ ル ト で、 TIFF ・ JPEG ・ JPEG 2000 形式の画像に対す る 画像 メ タ デー
タ に対応 し ます。 こ の XMP メ タ デー タ は、 出力 PDF 文書内の生成画像に添付あれます。
画像の メ タ デー タ は通常、 保持 し てお く こ と が推奨 さ れ ますが、 出力フ ァ イ ルサ イ ズ
を抑え る ために無効化す る こ と も 可能です。 PDF_load_image( ) の下記のオプシ ョ ン を用
い る と 、 取 り 込み画像内に XMP メ タ デー タ があ っ た と き にはそれを破棄 し ます :
metadata={keepxmp=false}
無効な XMP があ る と 画像は読み込まれませんので、 上記のオプシ ョ ン リ ス ト は、 無効な
XMP を回避す る ために利用す る こ と も で き ます。
7.1.2 対応画像 フ ァ イル形式
以下に述べ る 画像フ ァ イ ル形式を PDFlib は取 り 扱い ます。 デフ ォ ル ト では PDFlib は、 圧
縮 さ れた画像デー タ については可能な限 り 無変更の ま ま PDF 出力に送 り ます。 なぜな ら 、
よ く 利用 さ れ る 画像フ ァ イ ル形式で用い ら れ る 圧縮方式の多 く に PDF は標準対応 し てい
る か ら です。 こ の技法 (以下の解説では 「パススルーモー ド 」 と 呼びます) では画像デー
タ を展開 し て ま た再圧縮す る 必要がないため、 画像の取 り 込みが非常に速 く な り ます。 し
か し こ のモー ド では圧縮画像デー タ の整合性を PDFlib が検査す る こ と はで き ません。 画
像デー タ が不完全だっ た り 壊れていた り す る と 、 PDF 文書を Acrobat で利用す る 時にエ
ラ ーや警告の メ ッ セージが出ます (た と えば 「Read less image data than expected」)。 パ ス
スルーモー ド は、PDF_load_image( ) の passthrough オプシ ョ ン で制御す る こ と がで き ます。
画像フ ァ イ ルの取 り 込みが不成功の時は PDF_load_image( ) はエ ラ ー コ ー ド を返 し ま
す。 その画像の失敗について も っ と 詳 し く 知 る 必要があ る 場合には、 get_errmsg( ) を呼び
出 し て詳 し いエ ラ ー メ ッ セージ を取得 し ます。
PNG 画像 あ ら ゆ る 種類の PNG 画像 (ISO 15948) に PDFlib は対応 し てい ます。 PNG 画
像は多 く の場合パ ス ス ルーモー ド で処理 さ れ ます。 PNG 画像が透過情報を持っ てい る 場
合、 その透過は生成 PDF 内で保たれます (180 ページ 「7.1.4 画像マ ス ク と 透過」 参照)。
JPEG 画像 JPEG 画像 (ISO 10918-1) は決 し て圧縮 さ れ ません。 ただ し その種類に よ っ
ては、 Acrobat におけ る 適切な表示のために変換が必要な場合があ り ます。 PDFlib は、 あ
る 種の JPEG 画像に対 し て自動的に変換を適用 し ます。 し か し 変換の制御は、 PDF_load_
image( ) の passthrough オプシ ョ ン で行 う こ と も で き ます。 変換は、 ピ ク セルの数ま たは
画像の色を変えず、 かつ、 圧縮 / 解凍 さ れた と い う 不自然 さ を見た目に一切 も た ら し ませ
ん。 以下の種類の JPEG 画像圧縮に PDFlib は対応 し てい ます。
> グ レース ケール ・ RGB (通常は YCbCr エン コ ー ド さ れてい る ) ・ CMYK カ ラ ー。
7.1 ラ ス タ 画像の取 り 込み
177
> ベース ラ イ ン JPEG 圧縮。 JPEG 画像の圧倒的大多数は こ の種類です。
> プ ロ グ レ ッ シブ JPEG 圧縮。
JPEG 画像は何種類かの フ ァ イ ル形式に納め る こ と がで き ます。 よ く 利用 さ れ る あ ら ゆ る
JPEG フ ァ イ ル形式に PDFlib は対応 し てお り 、 ま た、 以下の種類の中か ら 解像度情報を読
み取 り ます。
> JFIF。 さ ま ざ ま な画像処理アプ リ ケーシ ョ ンに よ っ て生成 さ れます。
> Adobe Photoshop な ど の Adobe アプ リ ケーシ ョ ンに よ っ て出力 さ れ る JPEG フ ァ イ ル。
Photoshop 由来の CMYK の JPEG フ ァ イ ルについては、正 し く 処理す る ために必要な特
別の動作を PDFlib は行い ます。 ま た PDFlib は、 Adobe Photoshop で作成 さ れた JPEG
画像か ら ク リ ッ ピ ン グパ ス を読み取 り ます。
多 く のデジ タ ルカ メ ラ が生成す る EXIF 形式の JPEG 画像は、sRGB 画像 と し て扱われます
ので、画像には sRGB ICC プ ロ フ ァ イ ルが添付 さ れます。 ただ し 、honoriccprofile オプシ ョ
ン を false に し てい る か、 あ る いは画像に iccprofile オプシ ョ ンで他の ICC プ ロ フ ァ イ ルを
割 り 当ててい る 場合は こ の限 り ではあ り ません。
JPEG 2000 画像 JPEG 2000 画像 (ISO 15444-2) には PDF 1.5 以上が必要で、 つねにパ
ス スルーモー ド で処理 さ れます。PDFlib に よ る JPEG 2000 画像への対応は以下の と お り で
す。
> JP2・JPX ベース ラ イ ン画像 (通常 *.jp2 ま たは *.jpf) に対応 し てい ます。ただ し 下記の色
空間条件に従 う 必要があ り ます。 すべての有効な色深度値に対応 し てい ます。
次の色空間に対応 し てい ま す : sRGB ・ sRGB グ レー ・ ROMM-RGB ・ sYCC ・ e-sRGB ・
e-sYCC ・ CIELab ・ ICC ベース の色空間群 (制限 さ れた、 ま たは完全な ICC プ ロ フ ァ イ
ル) ・ CMYK。 PDFlib は、 JPEG 2000 画像フ ァ イ ル内の元の色空間に変更を加え ません。
> ソ フ ト マ ス ク を持つ画像は、 mask オプシ ョ ン を用いて、 他の画像にそのマ ス ク を適用
さ せ る こ と がで き ます。
> 外部 ICC プ ロ フ ァ イ ルは JPEG 2000 画像には適用で き ません。すなわち、iccprofile オプ
シ ョ ンは用い る こ と がで き ません。 JPEG 2000 画像が持つ ICC プ ロ フ ァ イ ルはつねに
保持 さ れます。 すなわち、 honoriccprofile オプシ ョ ンはつねに true です。
JBIG2 画像 PDFlib は、 単ページ ・ 複数ページの JBIG2 画像 (ISO 14492) に対応 し てい
ます。 JBIG2 画像はつねに単色ピ ク セルデー タ を内容 と し て持ち、 PDF 1.4 以上を必要 と
し ます。
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( ) に対 し て下記のオ
プシ ョ ン リ ス ト を用い ます :
178
第 7 章 : 画像 ・ PDF ページの取 り 込み
page=2 imagehandle=<N>
ク ラ イ ア ン ト アプ リ ケーシ ョ ン側では必ず、同一 JBIG2 画像ス ト リ ームか ら 抽出 さ れた複
数ページに対 し てのみ こ の copyglobals/imagehandle 機構が適用 さ れ る よ う にす る 必要が
あ り ます。 copyglobals オプシ ョ ンがない場合は、 PDFlib は自動的にカ レ ン ト ページに対
す る 必要デー タ をすべて複製 し ます。
GIF 画像 PDFlib は、 ピ ク セルデー タ が イ ン タ レース さ れてい る も の と さ れていない も の
の両方の、 あ ら ゆ る パレ ッ ト サ イ ズの、 あ ら ゆ る 種類の GIF (具体的には GIF 87a ・ 89a)
に対応 し てい ます。 GIF 画像はつねに Flate 圧縮で再圧縮 さ れます。
TIFF 画像 PDFlib は、 ほ と ん どすべての種類の TIFF 画像を取 り 込みます :
> 圧縮方式 : 非圧縮 ・ CCITT (グループ 3 ・ グループ 4 ・ RLE) ・ ZIP (= Flate) ・ PackBits
(= RunLength) ・ LZW ・ 新旧方式 JPEG に加え、 い く つかの まれな圧縮方式。
> 色空間 : 単色 ・ グ レース ケール ・ RGB ・ CMYK ・ CIELab ・ YCbCr 画像。
> 色深度は、 色要素あ た り 1 ・ 2 ・ 4 ・ 8 ・ 16 ビ ッ ト のいずれかでなければな り ません。 16
ビ ッ ト 画像は PDF 1.5 を必要 と し ます。
画像を取 り 込む際、 下記の TIFF 機能は処理 さ れます :
> 複数の画像を含んだ TIFF フ ァ イ ル (176 ページ 「 複数ページ画像」 参照)。TIFF フ ァ イ
ル内の画像を選ぶには page オプシ ョ ン を用い ます。
> アルフ ァ チ ャ ン ネルま たはマ ス ク (180 ページ 「7.1.4 画像マ ス ク と 透過」 参照) に、
ignoremask オプシ ョ ンが設定 さ れていない限 り 従い ます。alphachannelname オプシ ョ
ンで明示的にアルフ ァ チ ャ ン ネルを選ぶ こ と も で き ます。
> PDFlib は、Adobe Photoshop や互換プ ロ グ ラ ム で作成 さ れた TIFF 画像内の ク リ ッ ピ ン グ
パス に、 ignoreclippingpath オプシ ョ ンが設定 さ れていない限 り 従い ます。
> PDFlib は、TIFF 画像内の ICC プ ロ フ ァ イ ルに、honoriccprofile オプシ ョ ンが false に設定
さ れていない限 り 従い ます。
> 画像の望ま し い向 き を指定 し た Orientation タ グに従い ます。こ れを無視す る (多 く のア
プ リ ケーシ ョ ン同様) には ignoreorientation オプシ ョ ン を用い ます。
い く つかの TIFF 機能 (ス ポ ッ ト カ ラ ーな ど) や複数機能の組み合わせには対応 し てい ま
せん。
BMP 画像 BMP 画像はパ ス スルーモー ド では処理で き ません。以下の種類の BMP 画像に
PDFlib は対応 し てい ます。
> BMP バージ ョ ン 2 ・ 3。
> 色深度は コ ン ポーネ ン ト あ た り 1・4・8 ビ ッ ト 。3 × 8 = 24 ビ ッ ト の TrueColor を含みま
す。 16 ビ ッ ト 画像は 5+5+5 プ ラ ス未使用 1 ビ ッ ト と し て扱われます。 32 ビ ッ ト 画像は
3 × 8 ビ ッ ト 画像 と し て扱われます (残 り の 8 ビ ッ ト は無視 さ れます)。
> 単色か RGB カ ラ ー ( イ ンデ ッ ク ス ・ 直接)。
> 非圧縮 と 4 ビ ッ ト ・ 8 ビ ッ ト RLE 圧縮。
> ピ ク セルがボ ト ム ア ッ プ順で格納 さ れてい る 場合 PDFlib は画像を反転 さ せません ( こ
の BMP の機能はめっ たに使われず、 アプ リ ケーシ ョ ンに よ っ て異な っ た解釈を さ れま
す)。
CCITT 画像 グループ 3 ・ グループ 4 の FAX 圧縮 さ れた画像デー タ はつねにパ ス スルー
モー ド で処理 さ れます。 こ の形式は実は生の CCITT 圧縮 さ れた画像デー タ と い う 意味で
7.1 ラ ス タ 画像の取 り 込み
179
あ り 、 CCITT 圧縮を用いた TIFF フ ァ イ ル と い う 意味ではない こ と に注意 し て く だ さ い。
生の CCITT 圧縮画像フ ァ イ ルはエン ド ユーザーアプ リ ケーシ ョ ンではふつ う 対応 し てお
ら ず、 こ れを生成で き る のは FAX 関係の ソ フ ト ウ ェ アだけです。 PDFlib は CCITT 画像を
分析す る 能力を持たないので、 すべての画像関連パ ラ メ タ は ク ラ イ ア ン ト か ら PDF_load_
image( ) に渡す必要があ り ます。
RAW デー タ 非圧縮の (RAW) 画像デー タ はい く つかの特殊な応用では有用で し ょ う 。
画像の種類は色要素の数か ら 推測で き ます。 1 要素な ら グ レース ケール画像、 3 要素な ら
RGB 画像、 4 要素な ら CMYK 画像であ る こ と を それぞれ示唆 し てい ます。
7.1.3 ク リ ッ ピ ン グパス
PDFlib は、 Adobe Photoshop で作成 さ れた TIFF ・ JPEG 画像の中の ク リ ッ ピ ン グパ ス に対
応 し てい ます。1 つの画像フ ァ イ ルには、複数の名前付 き パ ス を含む場合があ り ます。PDF_
load_image( ) の clippingpathname オプシ ョ ン を使えば、 名前付き パス の う ちの 1 つを選
ぶ こ と がで き 、 それが ク リ ッ ピ ン グパス と し て使われます。 す る と 画像は、 ク リ ッ ピ ン グ
パ ス の内部だけが可視 と な り 、 それ以外の部分は不可視にな り ます。 こ れは背景 と 前景を
分離 し た り 、 画像の不要部分を除去 し た り する のに有用です。
あ る いは、画像フ ァ イ ルはデフ ォ ル ト ク リ ッ ピ ン グパス を含む場合があ り ます。PDFlib
は、 画像フ ァ イ ル内に ク リ ッ ピ ン グパス を見つけた場合、 それを自動的に画像に適用 し ま
す (図 7.1 参照)。デフ ォ ル ト ク リ ッ ピ ン グパ ス が適用 さ れない よ う にす る には、PDF_load_
image( ) で honorclippingpath オプシ ョ ン を false に設定 し ます。 同 じ 画像の イ ン ス タ ン ス
が複数あ っ て、 し か も その う ち一部の イ ン ス タ ン ス に し か ク リ ッ ピ ン グパ ス を適用 し た く
ない と き は、 PDF_fit_image( ) に ignoreclippingpath オプシ ョ ン を与え て ク リ ッ ピ ン グパ ス
を無効にす る こ と がで き ます。 ク リ ッ ピ ン グパス が適用 さ れ る と 、 画像の配置やはめ込み
に関す る すべての計算は、 切 り 抜かれた画像の外接枠を も と に行われます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クのimages/integrated_clipping_path ト ピ ッ ク にあ り
ます。
7.1.4 画像マ ス ク と 透過
3 種類の画像内透過情報に PDFlib は対応 し てい ます : アルフ ァ チ ャ ン ネルに よ る 内在透
過、 外在透過、 画像マ ス ク です。
図 7.1
ク リ ッ ピ ングパス を利用 し て
前景 と 背景を分離
180
第 7 章 : 画像 ・ PDF ページの取 り 込み
アル フ ァ チ ャ ン ネルに よ る内在透過 ラ ス タ 画像は、 部分的に透明にす る こ と も で き ま
す。 すなわち、 画像を透か し て背景が見え る よ う にす る こ と が可能です。 こ れはた と え
ば、 画像の背景を無視 し て、 前景の人物や物体だけ を見せたい と き に有用です。 透過情報
は、 別途の アル フ ァ チ ャ ン ネル内に、 あ る いは (パ レ ッ ト ベー ス の画像の場合) 透過パ
レ ッ ト 項目 と し て格納で き ます。 透過画像は、 PDF/A-1 ・ PDF/X-1 ・ PDF/X-3 では許 さ
れてい ません。 PDFlib は、 下記の画像形式の透過情報を処理 し ます :
> GIF 画像フ ァ イ ルは、 1 個の透過色値 (パレ ッ ト 項目) を持つ こ と がで き 、 PDFlib はそ
れに従い ます。
> TIFF 画像は、1 個の関連づけ ら れた アルフ ァ チ ャ ン ネルを含む こ と がで き 、PDFlib はそ
れに従い ます。 あ る いは TIFF 画像は、 関連づけ ら れていない、 名前で指定 さ れ る チ ャ
ン ネルを任意の数含む こ と も で き ます。 こ れ ら のチ ャ ン ネルは、 透過な ど の情報を伝
達する ために利用す る こ と がで き ます。関連づけ ら れていないチ ャ ン ネルが TIFF 画像
内に見つか っ た と き は、 PDFlib はデフ ォ ル ト では先頭チ ャ ン ネルを アルフ ァ チ ャ ン ネ
ル と し て用い ます。 し か し 、 関連づけ ら れていないアルフ ァ チ ャ ン ネルを、 その名前
を与え る こ と で明示的に選択す る こ と も 可能です :
image = p.load_image("tiff", filename, "alphachannelname={apple}");
> PNG 画像は、1 個の関連づけ ら れた アルフ ァ チ ャ ン ネルを含む こ と がで き 、PDFlib はそ
れを自動的に用い ます。
> PNG 画像は、 完全なアルフ ァ チ ャ ン ネルではな く 、 1 個の透過色値を持つ こ と も で き 、
PDFlib はそれに従い ます。複数の色値がアルフ ァ 値つき で与え ら れてい る 場合、50 パー
セ ン ト 未満のアルフ ァ 値を持つ も のの う ちの初めの 1 個が用い ら れます。
注 Photoshop では、 完全なアルフ ァ チ ャ ン ネルに加えて、 固有形式で透過背景を作成する こ
と がで き ます。 し か し PDFlib は こ の形式を理解 し ません。 こ のよ う な透過画像を PDFlib
で利用するには、 Photoshop で こ れを TIFF フ ァ イル形式で保存 し 、 その際に 「TIFF オプ
シ ョ ン」 ダ イ ア ログボ ッ ク スで 「透明部分を保持」 を選択 し ます。
場合に よ っ ては、 暗黙的な透過が画像フ ァ イ ルに含まれていて も 、 それをすべて無視 し た
い こ と も あ り ます。 PDFlib の透過対応は、 画像を読み込む際に ignoremask オプシ ョ ンで
無効化す る こ と が可能です :
image = p.load_image("tiff", filename, "ignoremask");
外在透過 外在の場合には、 2 つの段階が必要で、 ど ち ら も 画像操作を伴い ます。 第一に、
マ ス ク と し て後で使 う ためのグ レース ケール画像を 1 つ用意す る 必要があ り ます。そのた
めにはマ ス ク 画像を読み込みます。 マ ス ク を構築する には、 下記の種類の画像を使 う こ と
がで き ます :
> PNG 画像
> TIFF 画像:マルチ ス ト リ ッ プ画像を避け る ため、PDF_load_image( ) で nopassthrough オ
プシ ョ ン を推奨 し ます。
> RAW 画像デー タ
マ ス ク 内で ピ ク セル値が 0 (ゼ ロ ) の部分の画像は塗 ら れ、 ピ ク セル値が 0 でない部分は
背景が透けて見え ます。 ピ ク セルあ た り のビ ッ ト 数が 1 よ り 大き い場合、 中間値は前景画
像を背景にブ レ ン ド さ せて透過効果を生みます。
第二段階 と し て、 そのマ ス ク を別の画像に masked オプシ ョ ン で適用 し ます :
mask = p.load_image("png", maskfilename, "");
if (mask == -1)
throw new Exception("エラー:" + p.get_errmsg());
7.1 ラ ス タ 画像の取 り 込み
181
String optlist = "masked=" + mask;
image = p.load_image(type, filename, optlist)
if (image == -1)
throw new Exception("エラー:" + p.get_errmsg());
p.fit_image(image, x, y, "");
画像 と マ ス ク は縦横の ピ ク セル数が違っ てい る 可能性 も あ り ます。 マ ス ク は画像サ イ
ズに合わせて自動的に拡縮 さ れます。
注 場合によ っ ては PDFlib は、 マルチス ト リ ッ プの TIFF 画像を PDF 上の複数の画像に変換す
り こ と があ り 、 その場合、 マス クはその各画像に対 し て独立にかかる こ と にな り ます。 通
常 このよ う な こ と は意図 さ れていないので、 この種の画像はマス ク と し て も マス ク対象画
像 と し て も拒否 さ れます。 また、 内在の場合 と 外在の場合 と を互いに混在 さ せない こ と が
重要です。 つま り 、 透過色値を持つ画像を マス ク と し て使っ てはいけません。
注 マ ス ク は、 背景画像 と 同 じ 向き を持つ必要があ り ます。 そ う で ない と それは拒否 さ れま
す。 向きは画像フ ァ イル形式やその他の要因に依存 し ますので、 検出が困難です。 このた
め、 マス ク と 画像の両方について、 同 じ フ ァ イル形式 と 作成ソ フ ト ウ ェ ア を用いる こ と を
推奨 し ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの images/image_mask ト ピ ッ ク にあ り ます。
画像マ ス ク と ソ フ ト マ ス ク 画像マ ス ク と はビ ッ ト 深度が 1 の画像 (ビ ッ ト マ ッ プ) で
あ り 、 ゼ ロ のビ ッ ト が透過 と し て扱われます。 ページの既存内容が画像内の透過部分を通
し て見え ます。 1 のビ ッ ト の ピ ク セルはカ レ ン ト 塗 り 色で着色 さ れます。
ソ フ ト マ ス ク は、画像マ ス ク の概念を、複数ビ ッ ト のマ ス ク へ一般化 し た も のです。 こ
れは画像を、 何 ら かの既存の背景に溶け込ませます。 PDFlib は、 あ ら ゆ る 種類のシ ン グル
チ ャ ン ネル (グ レース ケール) 画像を ソ フ ト マ ス ク と し て受け付け ます。 なお、 マ ス ク と
し て使え る のは真の グ レ ー ス ケールの画像だけで あ り 、 イ ンデ ッ ク ス 付 き の (パ レ ッ ト
ベース の) 色は使え ません。 こ れは画像マ ス ク と 同 じ よ う に利用で き ます。 画像マ ス ク と
し て使え る のは以下の種類の画像です :
> PNG 画像
> TIFF 画像 (シ ン グルス ト リ ッ プで も マルチ ス ト リ ッ プで も )
> JPEG 画像 ( ソ フ ト マ ス ク と し てのみ。 後述)
> BMP。BMP 画像は他の種類の画像 と 向き が違 う こ と に注意 し て く だ さ い。そのため BMP
画像はマ ス ク と し て使 う には まず x 軸を軸 と し て反転 さ せ る 必要があ り ます。
> RAW 画像デー タ
画像マ ス ク はただ mask オプシ ョ ン をつければ開 く こ と がで き 、 希望の塗 り 色を設定 し た
後にページ上に配置す る こ と がで き ます。
mask = p.load_image("tiff", maskfilename, "mask");
p.setcolor("fill", "rgb", 1.0, 0.0, 0.0, 0.0);
if (mask != -1)
{
p.fit_image(mask, x, y, "");
}
ゼ ロ の ビ ッ ト の ピ ク セルを透過にせずに画像を着色 し たい場合は colorize オプシ ョ ン を使
う 必要があ り ます (183 ページ 「7.1.5 画像の着色」 参照)。
182
第 7 章 : 画像 ・ PDF ページの取 り 込み
7.1.5 画像の着色
画像マ ス ク では画像の不透明部分が着色 さ れますが、類似機能 と し て ス ポ ッ ト カ ラ ーに よ
る 画像の着色に PDFlib は対応 し てい ます。 こ の機能は、 単色かグ レース ケールの画像で
動作 し ます。
RGB パレ ッ ト を持つ画像に関 し ては、 着色が意味を持つのは、 そのパレ ッ ト がグ レー
値だけ を持ち、 パ レ ッ ト イ ンデ ッ ク ス がグ レー値 と 等価な場合だけです。 し か し PDFlib
は こ の条件に関す る 検査は行い ません。
画像を ス ポ ッ ト カ ラ ーで着色す る には、画像を読み込む時に colorize オプシ ョ ン を与え
る 必要が あ り 、 それ と と も にその ス ポ ッ ト カ ラ ーハン ド ル を与え る 必要が あ り ま す。 ス
ポ ッ ト カ ラ ーハン ド ルはあ ら か じ めPDF_makespotcolor( )で取得 し てお く 必要があ り ます。
p.setcolor("fillstroke", "cmyk", 1, .79, 0, 0);
spot = p.makespotcolor("PANTONE Reflex Blue CV");
String optlist = "colorize=" + spot;
image = p.load_image("tiff", "image.tif", optlist);
if (image != -1)
{
p.fit_image(image, x, y, "");
}
7.1 ラ ス タ 画像の取 り 込み
183
7.2 PDI で PDF ページ を取 り 込み
注 この節で解説するすべての関数は PDFlib+PDI を必要 と し ます。 PDF 取 り 込みラ イ ブ ラ リ
(PDI) は PDFlib 基本製品には含まれていません。PDI は PDFlib のすべての コ ンパイル済み
版に内蔵 さ れていますが、 それを利用するには PDI (または PPS。 PPS は PDI を含んでい
ます) のための ラ イ セ ン スキーが必要です。
7.2.1 PDI の機能 と 用途
PDFlib+PDI ラ イ ブ ラ リ を利用す る こ と で、 既存 PDF 文書内のページ を取 り 込む こ と がで
き ます。 PDI は PDF フ ァ イ ル形式に対す る パーサを持っ ていて、 既存 PDF 文書内のペー
ジ を PDFlib で簡単に利用で き る よ う に し ます。 概念的に、 取 り 込まれた PDF ページは取
り 込まれた TIFF や PNG の よ う な ラ ス タ 画像 と 同様に扱われます。 すなわち、 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 文書の任意のプ ロ パテ ィ を取得 (247 ページ 「9 章
pCOS イ ン タ フ ェース」 参照)。
PDF の背景ページ を配置 し てそ こ に動的なデー タ を入れ込みたい場合には(た と えば メ ー
ルのマージや、 Web 上のパー ソ ナ ラ イ ズ さ れた PDF 文書や、 フ ォーム記入な ど)、 PDI を
PDFlib ブ ロ ッ ク と あわせて利用 さ れ る こ と をおすすめ し ます (279 ページ 「11 章 PPS と
PDFlib Block Plugin」 参照)。
7.2.2 PDFlib で PDI 関数 を利用
ク ッ ク ブ ッ ク PDF 取 り 込みの諸側面に関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ ク の pdf_import カ テ ゴ
リ にあ り ます。
一般的考察 重要な注意点 と し て、 PDI は実際のページ内容だけ を取 り 込みますので、 取
り 込む PDF 文書内に存在 し てい る か も し れない イ ン タ ラ ク テ ィ ブ機能 (た と えばサ ウ ン
ド ・ ムービー ・ フ ァ イ ル添付 ・ ハ イ パーテ キ ス ト リ ン ク ・ フ ォーム フ ィ ール ド ・ JavaScript ・
し お り ・ サム ネール ・ ノ ー ト ) は一切取 り 込みません。 こ う し た イ ン タ ラ ク テ ィ ブ機能は
各 PDFlib 関数で生成す る こ と がで き ます。 PDFlib ブ ロ ッ ク も ページ取 り 込み時には無視
さ れます。 タ グ付 き PDF 内の文書構造 も 、 文書を取 り 込む際には失われます。
184
第 7 章 : 画像 ・ PDF ページの取 り 込み
取 り 込んだページ内の個々の要素を他の PDFlib 関数で再利用す る こ と はで き ません。
た と えば、取 り 込んだ文書内の フ ォ ン ト を他の何 ら かの内容のために再利用す る こ と は不
可能です。 必要な フ ォ ン ト はすべて PDFlib 内で設定す る 必要があ り ます。 取 り 込んだ複
数の文書が同 じ フ ォ ン ト の埋め込みフ ォ ン ト デー タ を それぞれ持っ ていた と し て も 、 フ ォ
ン ト デー タ の重複を PDI は解消 さ せません。 他方、 取 り 込んだ PDF 内で欠けてい る フ ォ
ン ト があれば、 生成 さ れ る PDF 出力フ ァ イ ル内で も その フ ォ ン ト は欠けた ま ま です。 最
適な方法 と し ては、 取 り 込む文書はな る べ く 開いた ま ま に し ておいたほ う が、 同 じ フ ォ ン
ト が何度 も 出力文書内に埋め込まれずにすみます。
取 り 込んだ PDF 文書内の色に対 し て PDFlib+PDI はま っ た く 変更を加え ません。た と え
ば、 PDF が ICC カ ラ ープ ロ フ ァ イ ルを持っ ていればそれは出力文書内で も 保持 さ れます。
取 り 込んだ PDF のページ を出力ページ上に配置す る ために PDFlib+PDI はテ ンプ レー ト
機能 (フ ォーム XObject) を利用 し ます。 他の PDF 文書か ら 取 り 込まれたページ を含む文
書を さ ら に PDFlib+PDI で処理す る こ と も で き ます。
PDF ページ取 り 込みのための コ ー ド 既存 PDF 文書内のページの取 り 込みは非常に単純
な コ ー ド 構造で実現可能です。 次の コ ー ド は、 既存文書のページ を開き 、 そのページ内容
を出力 PDF 文書内に コ ピー し ます (出力 PDF 文書はあ ら か じ め開いてい る 必要があ り ま
す)。
int
String
doc, page, pageno = 1;
filename = "input.pdf";
if (p.begin_document(outfilename, "") == -1) {...}
...
doc = p.open_pdi_document(infilename, "");
if (doc == -1)
throw new Exception("エラー:" + p.get_errmsg());
page = p.open_pdi_page(doc, pageno, "");
if (page == -1)
throw new Exception("エラー:" + p.get_errmsg());
/* ダミーのページサイズ。この後adjustpageオプションによって変更される */
p.begin_page_ext(20, 20, "");
p.fit_pdi_page(page, 0, 0, "adjustpage");
p.close_pdi_page(page);
...ページに内容を追加するPDFlib関数群...
p.end_page_ext("");
p.close_pdi_document(doc);
PDF_fit_pdi_page( ) の最後の引数は、 取 り 込むページの位置指定 ・ 拡縮 ・ 回転を指示す る
さ ま ざ ま なオプシ ョ ン を持ち う る オプシ ョ ン リ ス ト です。 こ のオプシ ョ ンについては詳 し
く は 188 ページ 「7.3 画像 と 取 り 込み PDF ページの配置」 で解説 し てい ます。
取 り 込んだ PDF ページの寸法 取 り 込んだ PDF ページは取 り 込んだ ラ ス タ 画像 と 同様に
扱われ、 PDF_fit_pdi_page( ) を用いて出力ページ上に配置す る こ と がで き ます。 デフ ォ ル
ト では、 Acrobat での表示 と ま っ た く 同 じ 形で PDI はページ を取 り 込みます。 と り わけ次
の よ う な動作を し ます :
> ク ロ ッ ピ ン グは保持 さ れます (技術的にいえば、 CropBox が存在する 場合には、 PDI は
MediaBox よ り も CropBox を優先採用 し ます。 69 ページ 「3.2.2 ページサ イ ズ」 参照)。
> ページに適用 さ れてい る 回転は保持 さ れます。
7.2 PDI で PDF ページ を取 り 込み
185
cloneboxes オプシ ョ ンは PDFlib+PDI に対 し て、 取 り 込みページのすべてのページ枠を生
成出力ページへ複製す る よ う 指示 し 、 その結果、 すべてのページサ イ ズ情報を複製 さ れま
す。
あ る いは、 pdiusebox オプ シ ョ ン を用い て明示的に、 ページの MediaBox ・ CropBox ・
TrimBox ・ ArtBox 項目の う ちのいずれか を ( も し あれば) 用いて取 り 込みページのサ イ ズ
を決め る よ う PDI に指示す る こ と も で き ます。
レ イ ヤー を持つ PDF ページの取 り 込み Acrobat 6 (PDF 1.5) ではレ イ ヤー機能が導入 さ
れま し た (技術的には 「オプシ ョ ナル コ ン テ ン ト 」 と いい ます) 。 フ ァ イ ルに存在 し てい
る か も し れない レ イ ヤー情報を PDI は一切無視 し ます。取 り 込んだページ内のすべての レ
イ ヤーは、 不可視レ イ ヤーを含めて、 生成出力内では可視にな り ます。
GeoPDF を PDI で取 り 込み GeoPDF を PDI で取 り 込む際には、 地理空間情報は、 それが
下記のいずれかの方式で作成 さ れていれば保持 さ れます (画像ベース の地理空間参照) :
> PDFlib で PDF_load_image( ) の georeference オプシ ョ ンで
> Acrobat で地理空間情報を持つ画像を取 り 込んで。
地理空間情報はページ を取 り 込んだ後、それが下記のいずれかの方式で作成 さ れていた場
合には失われます (ページベース の地理空間参照) :
> PDFlib で PDF_begin/end_page_ext( ) の viewports オプシ ョ ンで
> Acrobat で手作業で PDF ページ を地理登録 し て。
OPI 情報 を持つ PDF ページの取 り 込み
さ れない ま ま保持 さ れます。
入力 PDF 内の存在す る OPI 情報は出力内で変更
複数の取 り 込み文書間での最適化 PDFlib 自体は、 高度に最適化 し た PDF 出力を生成 し
ますが、 取 り 込んだ PDF には も し かす る と 冗長なデー タ 構造があ っ て、 最適化の余地が
あ る か も し れません。 さ ら に、 取 り 込む PDF が も し 複数であれば、 その複数の フ ァ イ ル
が等価な リ ソ ース (フ ァ イ ル等) を含む場合には、 出力す る フ ァ イ ルのサ イ ズはふ く れあ
が る 可能性があ り ます。こ の よ う な場面では、PDF_begin_document( ) の optimize オプシ ョ
ン を使 う こ と がで き ま す。 こ れは取 り 込んだ フ ァ イ ル内の冗長なオブジ ェ ク ト を検知 し
て、 生成す る 出力の体裁や品質を そ こ な う こ と な く そ う し たオブジ ェ ク ト を削除 し ます。
7.2.3 受け入れ可能な PDF 文書
一般に、Acrobat で開 く こ と ので き る あ ら ゆ る 種類の PDF 文書を PDI は適切に処理で き ま
す。 PDF のバージ ョ ン番号や、 フ ァ イ ル内で使用 さ れてい る 機能には左右 さ れません。 暗
号化文書 (すなわち権限設定やパス ワー ド を持つフ ァ イ ル) 内のページ を取 り 込むにはそ
のマ ス タ ーパ ス ワー ド を与え る 必要があ り ます。
PDI は破損 PDF のための修復モー ド を実装 し てお り 、 あ る 種の破損文書 も 開 く こ と が
で き ます。 し か し 、 まれに PDF 文書や文書内の特定ページが PDI に よ っ て拒否 さ れ る こ
と があ り ます。
PDF 文書やページが う ま く 取 り 込めなか っ た場合 PDF_open_pdi_document( ) と PDF_
open_pdi_page( ) はエ ラ ー コ ー ド を返 し ます。 失敗について も っ と 詳 し く 知 り たい場合に
は、 PDF_get_errmsg( ) で原因を取得す る こ と がで き ます。 ま たは、 errorpolicy オプシ ョ ン
かパ ラ メ タ を true に設定 し ておけば、 文書が開けなかっ た と き に例外が発生す る よ う に
な り ます。
186
第 7 章 : 画像 ・ PDF ページの取 り 込み
下記の種類の PDF 文書は、 デフ ォ ル ト では拒絶 さ れますが、 infomode オプシ ョ ン を
true に設定すれば、 pCOS で情報を取得す る ために開 く こ と はで き ます。
> カ レ ン ト で生成中の PDF 出力文書 よ り も 高い PDF バージ ョ ン番号を用いてい る PDF 文
書は、 PDI で取 り 込め ません。 理由は、 高いバージ ョ ン番号の PDF を取 り 込んだ後で
は、 求め ら れてい る PDF バージ ョ ンに出力が本当に準拠す る か ど う か、 も はや PDFlib
は確信を持てないか ら です。 解決策 : 出力 PDF のバージ ョ ン を PDF_begin_document( )
の compatibility オプシ ョ ン を使っ て必要な水準に設定 し ます。
PDF 1.7ext 3 (Acrobat 9) ・ PDF 1.7ext8 (Acrobat X) 文書は、 PDI に関す る 限 り PDF 1.7
と 互換です (ただ し Acrobat X の暗号化には ま だ対応 し てい ません)。
PDF/A モー ド では、 PDF バージ ョ ンヘ ッ ダは PDF/A 内では無視 さ れなければな ら な
いので、 入力 PDF バージ ョ ン番号は無視 さ れます。
> 暗号化 さ れた PDF 文書でそのパ ス ワー ド がない も の (infomode 規則に対する 例外 :
Distiller の設定 「オブジ ェ ク ト レベルの圧縮 : 最高」 を用いて作成 さ れた PDF 1.6 文書。
こ れは情報モー ド で も 開 く こ と がで き ません)。
> タ グ付 き PDF で PDF_begin_document( ) の tagged オプシ ョ ンが true の場合。
> カ レ ン ト 出力文書の PDF/A か PDF/X の レベル と 非互換な PDF/A か PDF/X の文書(例:
PDF/A-1a を PDF/A-1b 文書へ取 り 込 も う と し た)。 詳 し く は 258 ページ 「10.3.4 PDI
に よ る PDF/X 文書の取 り 込み」 ・ 265 ページ 「10.4.3 PDF/A 文書を PDI で取 り 込み」 を
参照 し て く だ さ い。
7.2 PDI で PDF ページ を取 り 込み
187
7.3 画像 と 取 り 込み PDF ページの配置
ラ ス タ 画像 と テ ンプ レー ト を配置す る ための関数 PDF_fit_image( ) と 、 取 り 込み PDF ペー
ジ を配置す る ための PDF_fit_pdi_page( ) は、 ページ上への配置を制御す る ための さ ま ざ ま
なオプシ ョ ン を提供 し てい ます。 こ の節では、 い く つかの代表的な応用作業を見てみ る こ
と に よ っ て、 も っ と も 重要ない く つかのオプシ ョ ンの動作を示 し ます。 すべてのオプシ ョ
ンの完全な一覧 と 説明については、 PDFlib API リ フ ァ レ ン ス を参照 し て く だ さ い。
ラ ス タ 画像の埋め込みは、PDFlib な ら 簡単に実現で き ます。画像フ ァ イ ルは まず、PDF_
load_image( ) で読み込む必要があ り ま す。 こ の関数は画像ハン ド ルを返すので、 それを
PDF_fit_image( ) の位置合わせや拡大縮小のオプシ ョ ン と と も に使 う こ と がで き ます。
取 り 込み PDF ページの埋め込みについて も 、 こ れ と 同様に動作 し ます。 PDF ページ を
PDF_open_pdi_page( ) で開いてページハン ド ルを取得 し 、 それを PDF_fit_pdi_page( ) で使
う 必要があ り ます。 位置合わせや拡大縮小のオプシ ョ ンは、 ラ ス タ 画像の も の と 同 じ も の
が使え ます。
こ の節に載せ る 作成例はすべて、 ラ ス タ 画像で も テ ンプ レー ト で も 取 り 込み PDF ペー
ジで も 、 同 じ く 動作 し ま す。 コ ー ド の作成例は ラ ス タ 画像のための も の し か載せ ま せん
が、 オブジ ェ ク ト 一般の配置方法を そ こ では語っ てい る のです。 あ ら ゆ る fit 関数はすべ
て、 それを呼び出す前にはかな ら ず、 PDF_load_image( ) か PDF_open_pdi_document( ) と
PDF_open_pdi_page( ) への呼び出 し を行 う 必要があ り ます。 簡潔のため、 こ れ ら の呼び出
し は こ こ ではあ ら ためて示 し ません。
ク ッ ク ブ ッ ク 画像 と 取 り 込み PDF ページに関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ クの images・pdf_
import カ テ ゴ リ にあ り ます。
7.3.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 ト ピ ッ ク にあ り ます。
188
第 7 章 : 画像 ・ PDF ページの取 り 込み
7.3.2 オ ブ ジ ェ ク ト を枠内に置 く
オブジ ェ ク ト を置 く ためには、あ ら か じ め定義 し た幅 と 高 さ の枠を あわせて使 う こ と も で
き ます。 図 7.2 に、 以下のい く つかの例の出力を示 し ます。 なお、 青い枠 と 線は、 枠の大
き さ が見 ら れ る よ う に描 き 足 し て あ る だけで、 実際の出力にはあ り ません。
画像 を枠内に置 く 枠を定義 し て、 画像を その枠の右上に配置 し ま し ょ う 。 枠は幅 70 単
位、 高 さ 45 単位で、 参照点 (0, 0) に配置 し ます。 画像は こ の枠の右上に配置 し ます (図
7.2a 参照)。 同様に、 画像を下端中央に配置す る こ と も で き ます。 こ れを図示 し たのが図
7.2b です。 なお、 画像が枠 よ り 大 き い場合は枠か ら はみ出 し ます。
図 7.2 さ ま ざ ま な位置合わせオプ シ ョ ン に従っ て画像を枠内に配置
生成 さ れる出力
PDF_fit_image に与え る オプ シ ョ ン リ ス ト
a)
boxsize={70 45} position={right top}
b)
boxsize={70 45} position={center bottom}
適切なはめ込み方式 を用い る 次に、 さ ま ざ ま なはめ込み方式を使っ て、 オブジ ェ ク ト
を枠にはめ込みま し ょ う 。 まずはデフ ォ ル ト 、 すなわちはめ込み方式を使わず、 切 り 抜 き
や拡大縮小 も 行わない場合か ら 始め ま し ょ う 。 画像は幅 70 ・ 高 さ 45 単位の枠の中央に配
置 し ます。その枠は参照点 (0, 0) に配置 し ます。図 7.3a にその単純な ケース を図示 し ます。
枠の幅を 70 か ら 35 単位に縮めて も 、 出力には何の影響 も あ り ません。 画像は元の大
き さ を保ち、 枠か ら ははみ出 し ます (図 7.3b 参照)。
画像 を枠の中央にはめ込み あ ら か じ め定義 し た矩形の中央に画像 を 置 き た い と き は、
自 分 で 計 算 を す る 必 要 は 全 く な く 、 適 切 な オ プ シ ョ ン を 使 え ば 実 現 で き ま す。
position=center を使っ て、 幅 70 ・ 高 さ 45 単位の枠 (boxsize={70 45}) の中央に画像を配
置 し ま し ょ う 。 fitmethod=meet を使 う と 、 画像は縦横比を保ちつつ、 その上下が枠に収
ま り き る ま で拡大縮小 さ れます (図 7.3c 参照)。
枠の幅を 70 か ら 35 単位に縮め る と 、 画像はその左右が枠に収ま り き る ま で縮小 さ れ
ます (図 7.3d 参照)。
こ れは画像配置で も っ と も よ く 使われ る 方式です。 fitmethod=meet では、 画像がつぶ
さ れない こ と が保証 さ れ る と と も に、 必ず枠内に、 で き る だけ大 き く 配置 さ れます。
画像 を枠全体にはめ込み 画像を も っ と 枠に合わせて、 枠全体を画像が埋め る よ う にす
る こ と も で き ます。 こ れは fitmethod=entire で実現で き ます。 し か し 、 こ の組み合わせは
画像をつぶす こ と が多いので、 有用な場合は まれで し ょ う (図 7.3e 参照)。
画像 を枠にはめ込む際に切 り 抜 き 別のはめ込み方式 (fitmethod=clip) を使 う と 、 オブ
ジ ェ ク ト がはめ込んだ枠か ら はみ出 し た と き に、そのオブジ ェ ク ト を切 り 抜 く こ と がで き
ます。 枠の大 き さ を縦横 と も 30 単位に縮めて、 画像を その枠の中央に元の大 き さ の ま ま
置いてみま し ょ う (図 7.3f 参照)。
7.3 画像 と 取 り 込み PDF ページの配置
189
画像 を枠の中央に置 く こ と に よ っ て、 画像はすべての端が均等に切 り 落 と さ れ ま す。
同様に、画像の右上部分をすべて見せたいな ら ば、position={right top} で置けば よ いで し ょ
う (図 7.3g 参照)。
図 7.3 さ ま ざ ま なはめ込み方式に従っ て画像を枠にはめ込み
生成 さ れる出力
PDF_fit_image に与え るオプ シ ョ ン リ ス ト
a)
boxsize={70 45} position=center
b)
boxsize={35 45} position=center
c)
boxsize={70 45} position=center fitmethod=meet
d)
boxsize={35 45} position=center fitmethod=meet
e)
boxsize={70 45} position=center fitmethod=entire
f)
boxsize={30 30} position=center fitmethod=clip
g)
boxsize={30 30} position={right top} fitmethod=clip
オ ブ ジ ェ ク ト を ページに合わせ る 与え ら れたページサ イ ズにオブジ ェ ク ト を合わせた
い と き は、オブジ ェ ク ト を配置す る はめ込み枠 と し てそのページ を選べば簡単に実現で き
ます。 下記の命令は、 縦横 595 × 842 の A4 サ イ ズのページ を使っ てい ます。
p.fit_image(image, 0, 0, "boxsize={595 842} position={left bottom} fitmethod=slice");
こ の コ ー ド では、 ページの左下隅に 1 つの枠を配置 し てい ます。 その枠の大き さ は、 A4
ページの大 き さ と 同 じ です。 オブジ ェ ク ト は こ の枠の左下隅に配置 さ れ、 縦横比を保つ
つ、 枠全体を覆 う ま で拡大縮小 さ れ ま すので、 ひいてはページ全体を覆 う こ と にな り ま
す。 オブジ ェ ク ト が枠か ら はみ出す場合は切 り 落 と さ れます。 fitmethod=slice はオブジ ェ
ク ト の拡大縮小を伴 う のです (fitmethod=clip がオブジ ェ ク ト を拡大縮小 し ないの と 異な
り )。 も ち ろん こ の例で も 、 position や fitmethod オプシ ョ ンは変え て も か ま い ません。
190
第 7 章 : 画像 ・ PDF ページの取 り 込み
図 7.5
orientate オプ シ ョ ン
図 7.4
rotate オプ シ ョ ン
7.3.3 オ ブ ジ ェ ク ト の向 き を変え る
画像の向 き を変え て配置 今度の例 と し ては、 画像の向 き を西向 き に変え てみ ま し ょ う
(orientate=west)。 こ れはすなわち、 画像が 90°反時計回 り に回転 さ れ、 その回転後のオ
ブジ ェ ク ト の左下隅が参照点 (0, 0) へ並行移動 さ れ る こ と を意味 し ます。 画像はその場で
回転 し ます (図 7.6a 参照)。 はめ込み方式を指定 し ていないので、 画像は元の大 き さ の ま
ま出力 さ れて、 枠か ら はみ出 し ます。
画像の向 き を変え て縦横比 を保 ち つつ枠 ち ょ う ど にはめ込み 今度は、 画像を西に向け
た う えで、 あ ら か じ め定義 し た大 き さ にす る こ と に挑戦 し てみま し ょ う 。 求め る 大 き さ の
枠を定義 し て、 画像の縦横比を変えずにその枠にはめ込みます (fitmethod=meet) 。 向 き
は orientate=west と 指定 し ます。 デフ ォ ル ト では、 画像は枠の左下隅に配置 さ れます (図
7.6b 参照)。 東に向けた画像を図 7.6c に、 南向 き を図 7.6d に示 し ます。
orientate オプシ ョ ンは、 図 7.5 に示す と お り 、 向 き のキー ワー ド と し て north ・ east ・
west ・ south に対応 し てい ます。
なお、orientate オプシ ョ ンは、座標系全体にはいっ さ い影響せずに、配置す る オブジ ェ
ク ト にだけ影響を及ぼ し ます。
図 7.6 画像の向き を変え る
生成 さ れる出力
PDF_fit_image に与え る オプ シ ョ ン リ ス ト
a)
boxsize={70 45} orientate=west
b)
boxsize={70 45} orientate=west fitmethod=meet
c)
boxsize={70 45} orientate=east fitmethod=meet
7.3 画像 と 取 り 込み PDF ページの配置
191
生成 さ れる出力
PDF_fit_image に与え るオプ シ ョ ン リ ス ト
d)
boxsize={70 45} orientate=south fitmethod=meet
e)
boxsize={70 45} position={center bottom} orientate=east
fitmethod=clip
向 き を変え た画像 を枠にはめ込んで切 り 抜 き 画像を東に向けて (orientate=east)、枠の
下端中央に位置を合わせま し ょ う (position={center bottom}) 。 さ ら に、 画像を元の大 き
さ の ま ま 配置 し 、 も し 画像が枠か ら はみ出 し た ら 切 り 落 と し ま す (fitmethod=clip) (図
7.6e 参照)。
7.3.4 オ ブ ジ ェ ク ト を回転
オブジ ェ ク ト の回転は、 向 き の変更 と 同 じ よ う に動作 し ます。 し か し 、 配置す る オブジ ェ
ク ト だけでな く 、 座標系全体に影響を与え ます。
画像 を回転 さ せて配置 まずは じ めに、 画像を 90°反時計回 り に回転 さ せ る こ と に挑戦
し てみま し ょ う 。 オブジ ェ ク ト を配置す る 前に、 座標系は参照点 (50, 0) で 90°反時計回
り に回転 さ れます。 回転後のオブジ ェ ク ト の右下隅 (回転前のオブジ ェ ク ト の左下隅だっ
た所) が、 最終的に参照点の位置にな り ます。 こ の場合を示 し たのが図 7.7a です。
回転は座標系全体に影響す る ので、 枠の回転 さ れます。 同様に、 画像を 30°反時計回
り に回転す る こ と がで き ます (図 7.7b 参照)。 図 7.4 に、 rotate オプシ ョ ンの一般的な動
作を図示 し ます。
画像 を回転 し てはめ込み 今度は、 画像を 90°反時計回 り に回転 さ せて、 縦横比を保ち
つつ枠にはめ込む こ と に挑戦 し てみま し ょ う 。 こ れは fitmethod=meet を使えば実現で き
ます (図 7.7c 参照)。 同様に、 画像を 30°反時計回 り に回転 さ せて、 その画像を縦横比を
保ちつつ枠にはめ込む こ と がで き ます (図 7.7d 参照)。
図 7.7 画像を回転
生成 さ れる出力
PDF_fit_image に与え るオプ シ ョ ン リ ス ト
a)
boxsize={70 45} rotate=90
(x, y)
boxsize={70 45} rotate=30
b)
(x, y)
192
第 7 章 : 画像 ・ PDF ページの取 り 込み
生成 さ れる出力
PDF_fit_image に与え るオプ シ ョ ン リ ス ト
c)
boxsize={70 45} rotate=90 fitmethod=meet
(x, y)
boxsize={70 45} rotate=30 fitmethod=meet
d)
(x, y)
図 7.8
ページサイ ズの調
整。 左から 、 ち ょ
う ど ・ 大きめ ・ 小
さめ
7.3.5 ページサ イ ズの調整
ページサ イ ズ を画像に合わせ る 今度の例 と し ては、 ページの大 き さ を オブジ ェ ク ト の
大 き さ に自動的に合わせま し ょ う 。 こ れはた と えば、 さ ま ざ ま な画像を PDF 形式でアー
カ イ ブ し てお き たい と き な ど に有用です。 参照点 (x, y) を使えば、 ページ を オブジ ェ ク ト
のサ イ ズ と ち ょ う ど同 じ にす る か、 それ と も 多少大き めや小 さ めにする か を、 指定す る こ
と がで き ます。 ページサ イ ズ を大 き めにす る と (図 7.8 参照)、 画像の ま わ り にふちが残
り ま す。 ページサ イ ズ を画像 よ り 小 さ く す る と 、 画像の一部は切 り 落 と さ れ ま す。 ま ず
は、 ページサ イ ズ を オブジ ェ ク ト の大 き さ と ち ょ う ど同 じ に し ま し ょ う 。
p.fit_image(image, 0, 0, "adjustpage");
次の コ ー ド は、 ページサ イ ズ を x ・ y 方向に 40 単位ずつ増や し てい ますので、 オブジ ェ ク
ト の ま わ り に白ふちがで き ます。
p.fit_image(image, 40, 40, "adjustpage");
次の コ ー ド は、 ページサ イ ズ を x ・ y 方向に 40 単位ずつ減 ら し てい ます。 オブジ ェ ク ト は
ページの端で切 り 落 と さ れますので、 オブジ ェ ク ト の一部 (幅 40 単位の) は見え な く な
り ます。
p.fit_image(image, -40, -40, "adjustpage");
x ・ y 座標を手段 と し て配置す る 方法 (ページの端、 ま たは一般には座標軸か ら の、 オブ
ジ ェ ク ト ま での間隔を指定す る 方法) のほかに、 はめ込み枠を指定す る 方法 も あ り ます。
こ れは、 さ ま ざ ま な組版規則に従っ てオブジ ェ ク ト が配置 さ れ る 矩形の領域です。 こ の組
版規則は、 boxsize ・ fitmethod ・ position オプシ ョ ンで制御する こ と がで き ます。
7.3 画像 と 取 り 込み PDF ページの配置
193
取 り 込み PDF ページのページ枠 を複製 取 り 込み PDF ペー ジ の、 関連す る ペー ジ 枠
(MediaBox ・ CropBox 等) すべ て を、 カ レ ン ト 出力ペー ジ へ複製す る こ と が で き ま す。
cloneboxesオプシ ョ ン を、すべての関連す る 枠の値を読み取 る ためにPDF_open_pdi_page( )
に与え る 必要があ り 、 そ し てその枠の値を カ レ ン ト ページに適用す る ために PDF_fit_pdi_
page( ) に も 与え る 必要があ り ます :
/* ページを開き、ページ枠項目群を複製 */
inpage = p.open_pdi_page(indoc, 1, "cloneboxes");
...
/* 出力ページをダミーページサイズで開く */
p.begin_page_ext(10, 10, "");
...
/*
* 取り込みページを出力ページ上に配置し、入力ページ内にある
* すべてのページ枠を複製。これは、begin_page_ext()で用いた
* ダミーサイズを上書きします。
*/
p.fit_pdi_page(inpage, 0, 0, "cloneboxes");
こ の技法を活用す る と 、 生成 PDF のページサ イ ズや裁ち落 と し 等が必ず入力文書のペー
ジ と 同 じ にな る よ う にす る こ と がで き ま す。 こ れは特にプ リ プ レ ス 分野において重要で
す。
7.3.6 配置画像 ・ PDF ページ に関す る情報 を取得
配置画像に関す る情報 PDF_info_image( ) 関数を使っ て画像情報を取得で き ます。 こ の
関数で使え る キー ワー ド は、 一般的な画像情報 (例 : 幅 ・ 高 さ を ピ ク セル単位で) のみな
ら ず、 その画像の出力ページ上への配置に関する 情報 も 網羅 し てい ます (例 : はめ込み計
算実行後の幅 ・ 高 さ を絶対値で)。
下記の コ ー ド は、 ピ ク セルサ イ ズ と 、 あ る 特定のはめ込みオプシ ョ ン に よ り 画像を配
置 し た後の絶対サ イ ズの両方を取得 し てい ます :
String optlist = "boxsize={300 400} fitmethod=meet orientate=west";
p.fit_image(image, 0.0, 0.0, optlist);
imagewidth = (int) p.info_image(image, "imagewidth", optlist);
imageheight = (int) p.info_image(image, "imageheight", optlist);
System.err.println("画像サイズ(ピクセル単位): " + imagewidth + " x " + imageheight);
width = p.info_image(image, "width", optlist);
height = p.info_image(image, "height", optlist);
System.err.println("画像サイズ(ポイント単位): " + width + " x " + height);
配置 PDF ページ に関す る情報 PDF_info_pdi_page( ) 関数を使っ て、配置 PDF ページに関
す る 情報を取得で き ます。 こ の関数で使え る キーワー ド は、元のページに関す る 情報 (例:
その幅 ・ 高 さ ) のみな ら ず、 その取 り 込み PDF の出力ページ上への配置に関す る 情報 も
網羅 し てい ます (例 : はめ込み計算実行後の幅 ・ 高 さ )。
下記の コ ー ド は、 取 り 込みページの元のサ イ ズ と 、 あ る 特定のはめ込みオプシ ョ ン に
よ り そのページ を配置 し た後のサ イ ズの両方を取得 し てい ます :
String optlist = "boxsize={400 500} fitmethod=meet";
p.fit_pdi_page(page, 0, 0, optlist);
194
第 7 章 : 画像 ・ PDF ページの取 り 込み
pagewidth = p.info_pdi_page(page, "pagewidth", optlist);
pageheight = p.info_pdi_page(page, "pageheight", optlist);
System.err.println("元のページサイズ: " + pagewidth + " x " + pageheight);
width = p.info_pdi_page(page, "width", optlist);
height = p.info_pdi_page(page, "height", optlist);
System.err.println("配置ページサイズ: " + width + " x " + height);
7.3 画像 と 取 り 込み PDF ページの配置
195
196
第 7 章 : 画像 ・ PDF ページの取 り 込み
8 テキス ト ・ 表組版
8.1 テキス ト 行の配置 と はめ込み
一行のテ キ ス ト をページ上に配置す る ための関数PDF_fit_textline( )には さ ま ざ ま な組版オ
プシ ョ ンがあ り ます。 こ の節では も っ と も 重要なオプシ ョ ン をい く つか よ く 使われ る 応用
例を用いて解説 し ます。 こ う し たオプシ ョ ンの完全な説明は PDFlib API リ フ ァ レ ン スにあ
り ます。 PDF_fit_textline( ) のオプシ ョ ンの多 く は PDF_fit_image( ) のオプシ ョ ン と 同 じ で
す。ですので こ こ ではテ キ ス ト 関連の利用例のみを示 し ます。画像の組版については、188
ページ 「7.3 画像 と 取 り 込み PDF ページの配置」 にあ る 作成例を参照す る よ う 推奨 し ます。
以下の利用例では PDF_fit_textline( ) への呼び出 し のみを示 し ます。 必要な フ ォ ン ト は
すでに読み込まれて希望の文字サ イ ズに設定 さ れてい る も の と し ます。
PDF_fit_textline( ) は、 仮想的な テ キ ス ト 枠を用いてテ キ ス ト の位置合わせを決めてい
ま す。 テ キ ス ト 枠の幅はテ キ ス ト の幅 と 同 じ であ り 、 枠の高 さ は フ ォ ン ト の大文字の高
さ と 同 じ です。 テ キ ス ト 枠は、 テ キ ス ト 枠を定義する matchbox オプシ ョ ン で変更す る こ
と がで き ます。
以下の作成例では、 参照点の座標は PDF_fit_textline( ) の x ・ y 引数 と し て与え ら れま
す。 テ キ ス ト 行に対す る はめ込み枠は、 テ キ ス ト が配置 さ れ る 領域です。 それは PDF_fit_
textline( ) の x ・ y 引数 と 適切なオプシ ョ ン (boxsize ・ position ・ rotate) で指定 さ れ る 矩形
領域 と し て定義 さ れます。 はめ こ み枠は、 margin オプシ ョ ン を用いて、 左 / 右ま たは上
/ 下へ縮め る こ と も で き ます。
ク ッ ク ブ ッ ク テキス ト 出力の諸側面に関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ クの text_output カ テ
ゴ リ にあ り ます。
8.1.1 単純な テキス ト 行配置
テキス ト を参照点に置 く デフ ォ ル ト では、 テ キ ス ト は左下隅を参照点に合わせて配置
さ れ ま す。 し か し こ の例では、 テ キ ス ト の下端中央を参照点に合わせて配置 し たいので
す。 下記の コ ー ド は、 テ キ ス ト 枠の下端中央を参照点 (30, 20) に合わせて配置 し ます。
p.fit_textline(text, 30, 20, "position={center bottom}");
図 8.1
テキス ト の
中央揃え
y
Kraxi
x
y
Kraxi
図 8.1 に、 中央揃えのテ キ ス ト 配置の様子を図示 し ます。 同様に、 キーワ ー ド left ・ right ・
center ・ top ・ bottom の組み合わせを変えた position オプシ ョ ン を使っ て、 参照点にテ キ
ス ト を配置す る こ と がで き ます。
図 8.2
西向きの
単純な テキス ト
x
8.1 テキス ト 行の配置 と はめ込み
197
ᨒߩฝ਄ߦ࠹ࠠࠬ࠻
Kraxi ᨒߩ᏷50࡮㜞ߐ22
20
30
Kraxi
20
ᨒߩਅ┵ਛᄩߦ࠹ࠠࠬ࠻
ᨒߩ᏷50࡮㜞ߐ0
20
図 8.3 テキス ト を枠内に置 く
テキス ト の向 き を変え て配置 次は、 テ キ ス ト を回転 さ せて、 その左下隅 (回転後の) を
参照点に合わせて配置 し てみま し ょ う 。 下記の コ ー ド は、 テ キ ス ト を西 (90˚ 反時計回 り )
に向けた後、 その回転 し たテ キ ス ト の左下隅を参照点 (0, 0) へ並行移動 さ せます。
p.fit_textline(text, 0, 0, "orientate=west");
図 8.2 に、 単純なテ キ ス ト の向 き を変えて配置 し た様子を図示 し ます。
8.1.2 テキス ト を枠内に置 く
テ キ ス ト を置 く には、 幅 と 高 さ を あ ら か じ め定義 し た枠を あわせて使 う こ と も で き 、 テ キ
ス ト はその場合枠に対 し て相対的な位置に置 く こ と が可能です。 図 8.3 に、 その一般的な
はた ら き を図示 し ます。
テキス ト を枠内に置 く 矩形の枠 を 定義 し て、 こ の枠内の右上に テ キ ス ト を 配置 し ま
し ょ う 。 コ ー ド 上で、 幅 50 単位 ・ 高 さ 22 単位の枠を、 参照点 (30, 20) に定義 し ます。 図
8.4a の よ う に、 テ キ ス ト は枠の右上に配置 さ れます。
同様に、 下端中央にテ キ ス ト を配置す る こ と も で き ます。 こ の場合を図示 し たのが図
8.4b です。
枠 と テ キ ス ト の間に間隔を あ け る には、 margin オプシ ョ ン を付け加え ます (図 8.4c 参
照)。
なお、 図中の青い矩形や線は、 枠のサ イ ズ を見せ る ために描いた も ので、 実際の出力
には現れません。
図 8.4 さ ま ざ ま な位置合わせオプ シ ョ ンに従 っ て テキス ト を枠内に配置
生成 さ れる出力
a)
b)
c)
d)
198
Kraxi
Kraxi
Kraxi
Kraxi
第 8 章 : テキス ト ・ 表組版
PDF_fit_textline( ) に与え るオプ シ ョ ン リ ス ト
boxsize={50 22} position={right top}
boxsize={50 22} position={center bottom}
boxsize={50 22} position={center bottom} margin={0 3}
boxsize={50 0} position={center bottom}
e)
Kraxi
生成 さ れる出力
PDF_fit_textline( ) に与え る オプ シ ョ ン リ ス ト
boxsize={0 35} position={left center} orientate=west
テキス ト を横線や縦線で整列 さ せ る テ キ ス ト の位置合わせを、 横線や縦線 (すなわち
高 さ や幅がゼ ロ の枠) に沿っ て行 う と い う のは、 若干極端な ケース ではあ り ますが、 有用
な場合 も あ り ます。 図 8.4d は、 テ キ ス ト を枠に対 し て下端中央揃えで配置 し た も のです。
幅を 50、 高 さ を 0 と し た こ と で、 枠は ま る で横線の よ う にな っ てい ます。
テ キ ス ト を縦線に沿っ て中央揃えす る ためには、 西向 き に し て、 枠に対 し て左端中央
に置 き ま し ょ う 。 こ の場合を図 8.4e に示 し ます。
8.1.3 テキス ト を枠にはめ込み
こ の項では、 さ ま ざ ま なはめ込み方式を用いて、 テ キ ス ト を枠にはめ込みま し ょ う 。 カ レ
ン ト の フ ォ ン ト と 文字サ イ ズはど の例で も 同 じ と し てお き 、 さ ま ざ ま なはめ込み方式に と
も な っ て文字サ イ ズな ど のプ ロ パテ ィ が変わ る 様子がわか る よ う に し ます。
デフ ォ ル ト の場合か ら 始め ま し ょ う 。 すなわち、 何のはめ込み方式 も 用いないで、 切
り 落 と し も 拡縮 も 一切 さ れない よ う にす る 場合です。 テ キ ス ト は、 幅 100 単位 ・ 高 さ 35
単位の枠の中央に配置 さ れます (図 8.5a 参照)。
枠の幅を 100 か ら 50 単位に縮めて も 、 出力には全 く 影響を与え ません。 テ キ ス ト は元
の文字サ イ ズ を保ち、 枠か ら はみ出 し ます (図 8.5b 参照)。
テキス ト を小 さ な枠につめ込み それでは、 テ キ ス ト 全体を枠の中に、 体裁を保ち なが
ら つめ込んでみま し ょ う 。 こ れは fitmethod=auto オプシ ョ ンで実現で き ます。 図 8.5c で
は、 枠の幅が充分広いので、 テ キ ス ト は ま っ た く 元の大 き さ の ま ま、 変わ ら ずに枠に収
ま っ てい ます。
枠の幅を 100 か ら 58 に縮小す る と 、 テ キ ス ト は長すぎ て収ま り き ら な く な り ます。 は
め込み方式 auto はテ キ ス ト に長体を、 shrinklimit オプシ ョ ン (デフ ォ ル ト : 0.75) を限度
と し てかけ よ う と し ます。 図 8.5d は、 テ キ ス ト が元の長 さ の 75 パーセ ン ト ま で圧縮 さ れ
た様子を示 し ます。
枠の幅を さ ら に 30 単位ま で縮め る と 、 テ キ ス ト は長体をかけて も 収ま り き ら な く な り
ます。 す る と 、 meet 方式が適用 さ れます。 meet 方式は、 テ キ ス ト 全体が枠に収ま る ま で
文字サ イ ズ を下げます。 こ の場合を示 し たのが図 8.5e です。
テキス ト の文字サ イ ズ を上げて枠にはめ込み テ キ ス ト を枠の幅 (ま たは高 さ ) い っぱ
いに拡げて、 ただ し 縦横比は保っ た ま ま、 はめ込みたい時があ る か も し れません。 テ キ ス
ト よ り 大 き い枠に対 し て fitmethod=meet を用い る と 、 テ キ ス ト の幅が枠の幅 と 一致す る
ま でテ キ ス ト が大 き く な り ます。 こ の場合を図示 し たのが図 8.5f です。
テキス ト を枠い っ ぱいにはめ込み さ ら に、 テ キ ス ト が枠の中を埋めつ く す よ う にはめ
込む こ と も 可能です。 こ の場合は、 fitmethod=entire を使い ます。 し か し こ の設定は、 テ
キ ス ト をほぼ確実にゆがめて し ま う ので、 使 う こ と はめっ たにないで し ょ う (図 8.5g 参
照)。
テキス ト を枠で切 り 落 と し てはめ込み こ れ も レ ア な ケー ス ですが、 テ キ ス ト を元のサ
イ ズの ま ま はめ込んで、 も し も 枠か ら はみ出た部分は切 り 落 と し たい時 も あ る か も し れま
8.1 テキス ト 行の配置 と はめ込み
199
せん。 その場合は fitmethod=clip が使え ます。 図 8.5h では、 テ キ ス ト を枠の左端に配置 し
てい ますが、 枠の幅が足 り ません。 テ キ ス ト は右側が切 り 落 と さ れます。
図 8.5 さ ま ざ ま なオプ シ ョ ンに従 っ て テキス ト をページ上の枠にはめ込み
生成 さ れる出力
PDF_fit_textline( ) に与え る オプ シ ョ ン リ ス ト
a)
Kraxi Systems
boxsize={100 35} position=center fontsize=12
b)
Kraxi Systems
boxsize={50 35} position=center fontsize=12
c)
Kraxi Systems
boxsize={100 35} position=center fontsize=12
fitmethod=auto
d)
Kraxi Systems
boxsize={58 35} position=center fontsize=12
fitmethod=auto
e)
Kraxi Systems
boxsize={30 35} position=center fontsize=12
fitmethod=auto
f)
Kraxi Systems
boxsize={100 35} position=center fontsize=12
fitmethod=meet
g)
Kraxi Systems
h)
Kraxi Sys
boxsize={100 35} position=center fontsize=12
fitmethod=entire
boxsize={50 35} position={left center}
fontsize=12 fitmethod=clip
テキス ト の縦中央揃え PDF_fit_textline( ) におけ る テ キ ス ト の高 さ は、 デフ ォ ル ト では
キ ャ ッ プハ イ ト 、 すなわち大文字の H の高 さ です。 テ キ ス ト を枠の中央に置 く と 、 縦方向
にはそのキ ャ ッ プハ イ ト に も と づいて中央揃え さ れます (図 8.6a 参照)。
それ以外の高 さ を テ キ ス ト 枠に対 し て指定す る には、範囲枠機能を使い ます (242 ペー
ジ 「8.4 範囲枠」 も 参照)。 PDF_fit_textline( ) の matchbox オプシ ョ ンは、 テ キ ス ト 行の高
さ を定義 し てお り 、与え ら れた文字サ イ ズのキ ャ ッ プハ イ ト がそのデフ ォ ル ト にな っ てい
ます。 こ の範囲枠の高 さ は、 その boxheight サブオプシ ョ ンに も と づいて算出 さ れます。
boxheight サブオプシ ョ ンは、 ベース ラ イ ンか ら テ キ ス ト 上端 ・ 下端ま での距離を決定 し
ます。 デフ ォ ル ト の設定は matchbox={boxheight={capheight none}}、 すなわち範囲枠の上
200
第 8 章 : テキス ト ・ 表組版
端はベース ラ イ ン よ り 上にあ っ て キ ャ ッ プハ イ ト に一致 し 、範囲枠の下端はベース ラ イ ン
を下へ越え ません。
範囲枠の大 き さ を図示す る ため、 こ こ では赤 く 色を塗 り ま し ょ う (図 8.6b 参照)。 図
8.6c では、 テ キ ス ト が xheight に も と づいて縦中央揃え さ れ る よ う に、 その高 さ の範囲枠
を定義 し てい ます。
図 8.6d ~ f に、 有用な さ ま ざ ま な boxheight 設定の範囲枠 (赤) と 、 それの決め る 高
さ に も と づいて枠 (青) の中で中央揃え さ れた テ キ ス ト を示 し ます。
図 8.6 さ ま ざ ま な範囲枠高 さ に従っ て テキス ト を枠にはめ込み
生成 さ れる出力
PDF_fit_textline( ) に与え るオプ シ ョ ン リ ス ト
a)
Kraxi Systems
boxsize={80 20} position=center fitmethod=auto
b)
Kraxi Systems
boxsize={80 20} position=center fitmethod=auto
matchbox={boxheight={capheight none}
fillcolor={rgb 1 0.8 0.8}}
c)
Kraxi Systems
boxsize={80 20} position=center fitmethod=auto
matchbox={boxheight={xheight none}
fillcolor={rgb 1 0.8 0.8}}
d)
Kraxi Systems
boxsize={80 20} position=center fitmethod=auto
matchbox={boxheight={ascender none}
fillcolor={rgb 1 0.8 0.8}}
e)
Kraxi Systems
boxsize={80 20} position=center fitmethod=auto
matchbox={boxheight={ascender descender}
fillcolor={rgb 1 0.8 0.8}}
f)
Kraxi Systems
boxsize={80 20} position=center fitmethod=auto
matchbox={boxheight={fontsize none}
fillcolor={rgb 1 0.8 0.8}}
8.1.4 テキス ト を文字で整列 さ せる
テキス ト を文字で整列 さ せ る テ キ ス ト を、 あ る 特定の文字で整列 さ せたい場合があ る
か も し れません。 た と えば数値の小数点揃え な ど です。 図 8.7a に示す よ う に、 テ キ ス ト
ははめ込み枠の中央に置かれてい ます。 PDF_fit_textline( ) で alignchar=. オプシ ョ ン を用
い る こ と で、 数値が点で揃い ます。
点を枠の中央に配置 し てい る position オプシ ョ ン を省 く こ と も で き ます。 そ う すれば、
デフ ォ ル ト の position={left bottom} が用い ら れ る ので、 点は参照点に配置 さ れます (図
8.7b 参照)。 一般に、 整列文字はその右下隅が参照点に配置 さ れます。
図 8.7 テキス ト 行を点で整列 さ せる
生成 さ れる出力
PDF_fit_textline( ) に与え る オプ シ ョ ン リ ス ト
a)
127.123
12.01
123.0
4025.20
boxsize={70 8} position={center bottom} alignchar=.
b)
127.123
12.01
123.0
4025.20
boxsize={70 8} position={left bottom} alignchar=.
8.1 テキス ト 行の配置 と はめ込み
201
8.1.5 ス タ ン プ を配置
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/simple_stamp ト ピ ッ ク にあ り ます。
テ キ ス ト の回転を指定 し な く て も 、 ス タ ンプ と い う 便利な機能を使えば、 テ キ ス ト を枠内
に対角線に沿っ て配置す る こ と がで き ます。 ス タ ン プ機能は洗練 さ れた自動計算を行い、
テ キ ス ト が枠内いっぱいに拡が る よ う 文字サ イ ズ と 回転角を決定 し ます。対角線ス タ ンプ
を、 た と えばページの背景な ど に配置す る には、 PDF_fit_textline( ) で stamp オプシ ョ ン を
指定 し ます。 stamp=ll2ur を指定す る と 、 テ キ ス ト ははめ込み枠の左下隅か ら 右上隅へ配
置 さ れます。 こ れに対 し 、 stamp=ul2lr を指定す る と 、 テ キ ス ト ははめ込み枠の左上隅か
ら 右下隅へ配置 さ れます。 図 8.8 では、 showborder=true を用いてはめ込み枠 と ス タ ンプ
の外接枠を図示 し てい ます。
図 8.8 左下から右上へのス タ ン プのよ う にテキス ト 行をはめ込み
生成 さ れる出力
PDF_fit_textline( ) に与え るオプ シ ョ ン リ ス ト
ng
Giant Wi
fontsize=8 boxsize={160 50} stamp=ll2ur showborder=true
8.1.6 リ ーダ を利用
リ ーダ を使 う と 、 はめ込み枠の端 と テ キ ス ト と の間の余白を埋め る こ と がで き ます。 た と
えば点 リ ーダは、目次の各項目 と そのページ番号をつないで見やすい よ う に よ く 利用 さ れ
ます。
目次の リ ーダ PDF_fit_textline( ) で leader オプシ ョ ン と alignment={none right} サブオプ
シ ョ ン を用い る と 、 テ キ ス ト 行の右に リ ーダが付加 さ れて、 テ キ ス ト 枠の右端ま で繰 り 返
さ れます。 リ ーダ右端 と 右枠 と の間隔は一定ですが、 テ キ ス ト と リ ーダ左端 と の間隔は変
動の可能性があ り ます (図 8.9a 参照)。
ク ッ ク ブ ッ ク テ キ ス ト 行の中 での点 リ ーダの使用例 を 示す完全な コ ー ド サ ン プ ルが ク ッ ク ブ ッ ク の
text_output/leaders_in_textline ト ピ ッ ク にあ り ます。
ク ッ ク ブ ッ ク テキス ト フ ロ ーの中での点 リ ーダの使用例を示す完全な コ ー ド サン プルが ク ッ ク ブ ッ ク
の text_output/dot_leaders_with_tabs ト ピ ッ ク にあ り ます。
ニ ュ ース電光掲示板の リ ーダ 別の用例 と し ては、 ニ ュ ー ス 電光掲示板ふ う に し たい場
合 も あ る か も し れません。 こ こ ではプ ラ ス と スペース 「+ 」 を リ ーダに使い ま し ょ う 。 テ
キ ス ト 行 は 中 央 に 配 置 し、 リ ー ダ は そ の テ キ ス ト 行 の 前 と 後 に 印 字 さ せ ま す
(alignment={left right}) 。 リ ーダの左右端は左右の枠に揃い、 テ キ ス ト と の間隔は変動の
可能性があ り ます (図 8.96b 参照)。
202
第 8 章 : テキス ト ・ 表組版
図 8.9 リ ーダ を使 っ た テキス ト 行をはめ込み
生成 さ れる出力
PDF_fit_textline( ) に与え る オプ シ ョ ン リ
スト
Features of Giant Wing ....................................................
a)
boxsize={200 10}
leader={alignment={none right}}
Description of Long Distance Glider.................................
Benefits of Cone Head Rocket .........................................
boxsize={200 10}
position={center bottom}
leader={alignment={left right}
text={+ }}
+ + + + + + + + + Giant Wing in purple! + + + + + + + + +
b)
++
Long Distance Glider with sensational range! + +
+ + + + + Cone Head Rocket incredibly fast! + + + + +
8.1.7 パス上のテキス ト
テ キ ス ト を 直線上に配置す る の で は な く 、 任意の パ ス 上に配置す る こ と も で き ま す。
PDFlib は個々のキ ャ ラ ク タ をパ ス上に、テ キ ス ト がそのパ ス の曲線に沿 う よ う に配置 し ま
す。 パ ス上のテ キ ス ト を作成す る には PDF_fit_textline( ) の textpath オプシ ョ ン を用い ま
す。 パ ス はそれ以前に作成済みであ る 必要があ り 、 パス ハン ド ルで表 し ます。 パ スハン ド
ルは、PDF_add_path_point( ) お よ び関連す る パ ス オブジ ェ ク ト 関数群で明示的にパ ス を構
築す る か、あ る いは既存の ラ ス タ 画像内の ク リ ッ ピ ン グパ ス に対す る ハン ド ルを取得す る
こ と に よ っ て作成で き ます。 下記の コ ー ド は、 1 個のパ ス を作成 し 、 テ キ ス ト を そのパ ス
上に配置 し ます (図 8.10 参照) :
/* パスを原点に定義 */
path = p.add_path_point( -1, 0,
0, "move", "");
path = p.add_path_point(path, 100, 100, "control", "");
path = p.add_path_point(path, 200,
0, "circular", "");
/* テキストをパス上に配置 */
p.fit_textline("Long Distance Glider with sensational range!", x, y,
"textpath={path=" + path + "} position={center bottom}");
/* 例ですのでパスも描いてみせましょう */
p.draw_path(path, x, y, "stroke");
Dis
t
er with sen
sa
tio
図 8.10
パス上のテキス ト
l ra
nge !
Long
Glid
e
nc
na
a
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/text_on_a_path ト ピ ッ ク にあ り ま
す。
8.1 テキス ト 行の配置 と はめ込み
203
画像の ク リ ッ ピ ン グパス を用いて テキス ト を配置 パ ス関数群でパ ス オブジ ェ ク ト を手
作業で構築す る のではな く 、 画像か ら ク リ ッ ピ ン グパス を抽出 し て、 そのパ ス上にテ キ ス
ト を配置す る こ と も で き ます。 こ の画像は honorclippingpath オプシ ョ ン と と も に読み込
んであ る 必要があ り 、 かつ、 求め る パ ス がその画像のデフ ォ ル ト の ク リ ッ ピ ン グパ ス でな
い場合には clippingpathname も PDF_load_image( ) に与え る 必要があ り ます :
image = p.load_image("auto", "image.tif", "clippingpathname={path 1}");
/* 画像のクリッピングパスからパスオブジェクトを作成 */
path = (int) p.info_image(image, "clippingpath", "");
if (path == -1)
throw new Exception("エラー : クリッピングパスが見つかりません!");
/* テキストをパス上に配置 */
p.fit_textline("Long Distance Glider with sensational range!", x, y,
"textpath={path=" + path + "} position={center bottom}");
パス と テキス ト の間 を あけ る デフ ォ ル ト では、 PDFlib は個々のキ ャ ラ ク タ をパ ス上に
配置 し ますので、 グ リ フ と パス の間にはあ き はあ り ません。 パ ス と テ キ ス ト の間を あ けた
い と き は、 単純にキ ャ ラ ク タ 枠を延長す る こ と がで き ます。 こ れは、 matchbox オプシ ョ
ンの boxheight サブオプシ ョ ンでキ ャ ラ ク タ 枠の縦延長を指定す る こ と で簡単に実現で き
ます。 下記のオプシ ョ ン リ ス ト はデ ィ セ ン ダ を考慮に入れてい ます (図 8.11 参照) :
Long
第 8 章 : テキス ト ・ 表組版
sa
図 8.11
パス上のテキス ト で、 パス と テ
キス ト の間を あけた
ti o
nge!
204
e r w it h s e n
l ra
Di s
nc
li d
G
e
na
ta
p.fit_textline("Long Distance Glider with sensational range!", x, y,
"textpath={path=" + path + "} position={center bottom} " +
"matchbox={boxheight={capheight descender}}");
8.2 複数行のテキス ト フ ロ ー
1 行のテ キ ス ト をページ上に配置す る 機能だけでな く 、 PDFlib は、 任意の長 さ のテ キ ス ト
を配置で き る テ キ ス ト フ ロ ー と い う 機能に も 対応 し てい ます。 テ キ ス ト は何行に も 、 何段
に も 、 あ る いは何ページに も わた る こ と がで き 、 ま たその見ばえは さ ま ざ ま なオプシ ョ ン
で制御す る こ と がで き ます。 フ ォ ン ト ・ サ イ ズ ・ 色 と いっ た文字属性を、 テ キ ス ト の ど の
部分にで も 適用す る こ と がで き ます。 テ キ ス ト の両端揃え ・ 片端揃えや、 段落の イ ンデン
ト や、 タ ブ位置 と い っ たテ キ ス ト フ ロ ー属性を指定で き ます。 テ キ ス ト の中に ソ フ ト ハ イ
フ ンで示 し た改行機会が考慮 さ れます。 図 8.12 ・ 図 8.13 は、 請求書の さ ま ざ ま な部分が
ページ上にテ キ ス ト フ ロ ー機能を用いて配置で き てい る さ ま を例示 し た も のです。 こ う し
た出力を制御す る ためのオプシ ョ ンについて、 以下の項で詳 し く 説明 し ます。
図 8.12
テキス ト フ ロー
の組版
Kraxi Systems, Inc.
Paper Planes
17, Aviation Road
Paperfield
Phone 7079-4301
Fax 7079-4302
Kraxi Systems, Inc.
17, Aviation Road
[email protected]
www.kraxi.com
Paperfield
John Q. Doe
255 Customer Lane
Suite B
12345 User Town
Everland
INVOICE
hortabmethod
tabalignment
ruler
ruler
right
30
left
45
ITEM
1
2
3
4
5
6
7
DESCRIPTION
Super Kite
Turbo Flyer
Giga Trash
Bare Bone Kit
Nitty Gritty
Pretty Dark Flyer
Free Gift
14.03.2004
right
275
right
375
right
475
QUANTITY
2
5
1
3
10
1
1
PRICE
20,00
40,00
180,00
50,00
20,00
75,00
0,00
AMOUNT
40,00
200,00
180,00
150,00
200,00
75,00
0,00
845,00
leftindent
= 55
Terms of payment: 30 days net. 30 days warranty starting at the day of sale. This
warranty covers defects in workmanship only. Kraxi Systems, Inc., at its option, repairs or
replaces the product under warranty. This warranty is not transferable. Returns or
exchanges are not possible for wet products.
parindent
= 7%
Have a look at our new paper plane models!
Our paper planes are the ideal way of passing the time. We offer revolutionary
new developments of the traditional common paper planes. If your lesson,
conference, or lecture turn out to be deadly boring, you can have a wonderful time
with our planes. All our models are folded from one paper sheet.
They are exclusively folded without using any adhesive. Several models are
equipped with a folded landing gear enabling a safe landing on the intended location
provided that you have aimed well. Other models are able to fly loops or cover long
distances. Let them start from a vista point in the mountains and see where they
touch the ground.
leading
= 140%
leftindent = 75
1.
Long Distance Glider
With this paper rocket you can send all your messages even when
sitting in a hall or in the cinema pretty near the back.
2.
Giant Wing
An unbelievable sailplane! It is amazingly robust and can even do
leftindent = 105
alignment
= left
alignment
= justify
rightindent
= 60
minlinecount
=2
8.2 複数行のテキス ト フ ロー
205
複数行のテ キ ス ト フ ロ ーは、 1 つの矩形 (はめ込み枠 と い う ) 内に も 複数の矩形内に も
配置す る こ と がで き ます。 こ のはめ込み枠は 1 ページ上にあ っ て も 複数ページ上にあ っ て
も か ま い ません。テ キ ス ト フ ロ ーをページ上に配置す る には以下の手順を踏む必要があ り
ます。
> 関数 PDF_add_textflow( ) が、テ キ ス ト を一部分ずつ、その組版オプシ ョ ン と と も に受け
入れて、そ し て 1 つのテ キ ス ト フ ロ ーオブジ ェ ク ト を作成 し てハン ド ルを返 し ます。ま
たは関数 PDF_create_textflow( ) が、 組版制御のための イ ン ラ イ ンオプシ ョ ン を含む こ
と ので き る テ キ ス ト の全体を、 一度の呼び出 し で分析 し ます。 こ れ ら の関数ではペー
ジ上にテ キ ス ト は配置 さ れません。
> 関数 PDF_fit_textflow( ) が、 こ のテ キ ス ト フ ロ ーの全部ない し 一部を、 与え ら れたはめ
込み枠内に配置 し ます。 すべてのテ キ ス ト を配置す る には、 こ の段階を数回繰 り 返す
必要があ る か も し れ ません。 その場合は こ の関数を呼び出すたびに新 し いはめ込み枠
を与え る 必要があ る で し ょ う 。 こ のはめ込み枠は同 じ ページにあ っ て も 別のページに
あ っ て も か ま い ません。
> 関数 PDF_delete_textflow( ) が、テ キ ス ト フ ロ ーを文書内に配置 し た後に、こ のテ キ ス ト
フ ロ ーオブジ ェ ク ト を削除 し ます。
テ キ ス ト フ ロ ーを作成す る ための関数 PDF_add/create_textflow( ) は、組版処理を制御す る
ための さ ま ざ ま なオプシ ョ ンに対応 し てい ます。 こ のオプシ ョ ンは関数のオプシ ョ ン リ ス
ト で与え る こ と も で き ます し 、あ る いは PDF_create_textflow( ) を使 う と き はテ キ ス ト 内に
「イ ン ラ イ ン」 オプシ ョ ン と し て入れ込む こ と も で き ます。 PDF_info_textflow( ) を使 う と 、
組版の結果や、 その他テ キ ス ト フ ロ ーに関す る た く さ んの詳細を取得す る こ と がで き ま
す。 以下、 テ キ ス ト フ ロ ーの配置について、 い く つかの よ く あ る 応用を例に し て説明 し ま
す。 テ キ ス ト フ ロ ーオプシ ョ ンの完全な一覧は PDFlib API リ フ ァ レ ン スにあ り ます。
PDF_add/create_textflow( ) で対応 し てい る オプシ ョ ンの中には PDF_fit_textline( ) と 同
様の も のがた く さ んあ り ます。 ですか ら 197 ページ 「8.1 テ キ ス ト 行の配置 と はめ込み」
の例を あわせて よ く 把握 し てお く と よ いで し ょ う 。 以下の項では、 複数行テ キ ス ト に関係
のあ る オプシ ョ ンだけ を解説 し ます。
ク ッ ク ブ ッ ク テキス ト 出力の諸側面に関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ クの text_output カ テ
ゴ リ にあ り ます。
fillcolor, charspacing,
fontsize, fontname
aerobatics. But it is best suited to gliding.
206
3.
C one H ea d R oc ke t
This paper arrow can be thrown with big swing. We launched it from
the roof of a hotel. It stayed in the air a long time and covered a
considerable distance.
4.
Super Dart
The super dart can fly giant loops with a radius of 4 or 5 meters and
cover very long distances. Its heavy cone point is slightly bowed
upwards to get the lift required for loops.
5.
German Bi-Plane
Brand-new and ready for take-off. If you have lessons in the history of
aviation you can show your interest by letting it land on your teacher's
desk.
第 8 章 : テキス ト ・ 表組版
図 8.13
テキス ト フ ロー
の組版
8.2.1 テキス ト フ ロ ー をはめ込み枠に配置
テ キ ス ト 枠に対す る はめ込み枠は、 テ キ ス ト が配置 さ れ る 領域です。 そ れは PDF_fit_
textflow( ) の llx ・ lly ・ urx ・ ury 引数で指定 さ れ る 矩形領域 と し て定義 さ れます。
テキス ト を 1 つのはめ込み枠に配置 簡単な例か ら 始め ま し ょ う 。下記の コ ー ド は、PDF_
add_textflow( ) への呼び出 し を 2 回使っ て、 ボール ド テ キ ス ト の部分 と 標準テ キ ス ト の部
分を く っつけてい ます。 フ ォ ン ト ・ 文字サ イ ズ ・ エン コ ーデ ィ ン グ を明示的に指定 し てい
ます。 1 回目の PDF_add_textflow( ) への呼び出 し では、 -1 を与えれば、 テ キ ス ト フ ロ ーハ
ン ド ルが返っ て き ますので、その後に も し ま た PDF_add_textflow( ) を呼び出す と き があ る
な ら それが使え ます。 text1 ・ text2 には、 印字 し たい実際のテ キ ス ト が入っ てい る も の と
し ます。
PDF_fit_textflow( ) を使っ て、で き あがっ たテ キ ス ト フ ロ ーをページ上のはめ込み枠に、
デフ ォ ル ト の組版オプシ ョ ン を用いて配置 し ます。
/* テキストをボールドフォントで追加 */
tf = p.add_textflow(-1, text1, "fontname=Helvetica-Bold fontsize=9 encoding=unicode");
if (tf == -1)
throw new Exception("エラー:" + p.get_errmsg());
/* テキストを標準フォントで追加 */
tf = p.add_textflow(tf, text2, "fontname=Helvetica fontsize=9 encoding=unicode");
if (tf == -1)
throw new Exception("エラー:" + p.get_errmsg());
/* Place all text */
result = p.fit_textflow(tf, left_x, left_y, right_x, right_y, "");
if (!result.equals("_stop"))
{ /* ... */}
p.delete_textflow(tf);
テキス ト を複数ページ上の 2 つのはめ込み枠に配置 PDF_fit_textflow( ) で配置 し た テ キ
ス ト がはめ込み枠内に収 ま り き ら な か っ た と き は、 出力は中断 さ れ て関数は文字列 _
boxfull を返 し ます。 PDFlib はすでに配置 し たテ キ ス ト の量を記憶 し ていて、 こ の関数が
再び呼ばれた時には残 り のテ キ ス ト を引 き 続 き 配置 し ます。 こ の他に、 新規ページ を作成
す る 必要 も あ る か も し れません。 次の コ ー ド は、 1 つない し 複数のページ上の、 ページ あ
た り 2 つのはめ込み枠に、 1 つのテ キ ス ト フ ロ ーを、 テ キ ス ト をすべて配置 し おわ る ま で
配置す る 方法を例示 し た も のです (図 8.14 参照)。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/starter_textflow ト ピ ッ ク にあ り ま
す。
/* テキスト全部が配置されるまで回る。配置するべきテキストがまだあるなら新規ページを作成。
* 全ページに2段組を作成。
*/
do
{
String optlist = "verticalalign=justify linespreadlimit=120%";
p.begin_page_ext(0, 0, "width=a4.width height=a4.height");
/* 1段目に流し込み */
8.2 複数行のテキス ト フ ロー
207
result = p.fit_textflow(tf, llx1, lly1, urx1, ury1, optlist);
/* まだテキストがあるなら2段目に流し込み */
if (!result.equals("_stop"))
result = p.fit_textflow(tf, llx2, lly2, urx2, ury2, optlist);
p.end_page_ext("");
/* 「_boxfull」ならまだテキストがあるので続ける必要がある。
* 「_nextpage」は「新規段組を開始」と解釈
*/
} while (result.equals("_boxfull") || result.equals("_nextpage"));
/* エラーをチェック */
if (!result.equals("_stop"))
{
/* 枠がとても小さくてテキストが全然入らないときは「_boxempty」が起こる。
*/
if (result.equals( "_boxempty"))
throw new Exception("エラー:" + p.get_errmsg());
else
{
/* それ以外の戻り値は「return」オプションによるユーザー終了。
* これを扱うにはそのためのコードが必要。
*/
}
}
p.delete_textflow(tf);
8.2.2 段落の組版のオ プ シ ョ ン
上の例では段落に、 デフ ォ ル ト の設定を用い ま し た。 デフ ォ ル ト は左揃え、 行送 り 100%
(文字サ イ ズその ま ま)、 な ど と な っ てい ます。
段落の組版を調整 し たいな ら 、 PDF_add_textflow( ) にオプシ ョ ン を追加で き ます。 た
と えばテ キ ス ト を左余白か ら 15 単位、 右余白か ら 10 単位、 イ ンデン ト し たい と し ます。
各段落の先頭行は さ ら に 20 単位 イ ンデン ト し ま し ょ う 。 テ キ ス ト を両端揃え と し 、 行送
はめ込み枠 1
ページ 1
1 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 2 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
3 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 4 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
5 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 6 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
7 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
208
はめ込み枠 2
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 8 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
9 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 10 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
11 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 12 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
13 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 14 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
第 8 章 : テキス ト ・ 表組版
はめ込み枠 3
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
15 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 16 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
17 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 18 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
19 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 20 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
はめ込み枠 4
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
ページ 2
21 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 22 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
23 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 24 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
25 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 26 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
27 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
図 8.14
テキス ト フ ローを
2 つのはめ込み枠
に配置
leftindent = 15
parindent = 2 0
leading = 140%
図 8.15
オプ シ ョ ン を用いて
テキス ト フ ローを配置
Have a look at our new paper plane models! Our paper planes
are the ideal way of passing the time. We offer revolutionary new
developments of the traditional common paper planes.
If your lesson, conference, or lecture turn out to be deadly boring,
you can have a wonderful time with our planes. All our models are
folded from one paper sheet.
They are exclusively folded without using any adhesive. Several
models are equipped with a folded landing gear enabling a safe landing
on the intended location provided that you have aimed well. Other
models are able to fly loops or cover long distances. Let them start
from a vista point in the mountains and see where they touch the
ground.
rightindent = 1 0
alignment =
justify
り は 140% に拡げま し ょ う 。 そ し て文字サ イ ズ を 8 ポ イ ン ト に下げます。 こ れを実現す る
には、PDF_add_textflow( ) のオプシ ョ ン リ ス ト を下記の と お り 拡張 し ます (図 8.15 参照)。
String
optlist =
"leftindent=15 rightindent=10 parindent=20 alignment=justify " +
"leading=140% fontname=Helvetica fontsize=8 encoding=unicode";
8.2.3 イ ン ラ イ ン オ プ シ ョ ン リ ス ト と マ ク ロ
図 8.15 のテ キ ス ト は ま だ完璧ではあ り ません。 見出 し 「Have a look at our new paper plane
models!」 を独立 し た行に し て、 フ ォ ン ト も も っ と 大 き く し て、 そ し て中央揃えに し ま し ょ
う 。 こ れを実現す る にはい く つかの方法があ り ます。
PDF_create_textflow( ) に イ ン ラ イ ン オ プ シ ョ ン リ ス ト を与え る こ こ ま で は 組 版 オ プ
シ ョ ンは、 関数に直接与え る オプシ ョ ン リ ス ト 内で指定 し て き ま し た。 今回 も こ れ と 同 じ
や り 方を続け る な ら ば、 テ キ ス ト を分割 し て二度の呼び出 し に分け る 必要があ り ます。 一
度目で見出 し を、 二度目で残 り のテ キ ス ト を配置す る わけです。 ですが、 場合に よ っ て
は、 た と えば書式変更箇所が多い と き な どは、 こ の方法は少々面倒か も し れません。
それな ら ば、PDF_add_texflow( ) のかわ り に PDF_create_textflow( ) を使 う こ と がで き ま
す。 PDF_create_textflow( ) はテ キ ス ト と 、 テ キ ス ト の中に直接入れ込まれた イ ン ラ イ ンオ
プシ ョ ン と い う も のを解釈 し ます。 こ れは単純にオプシ ョ ン を テ キ ス ト 内に入れ込む と い
う こ と です。 イ ン ラ イ ンオプシ ョ ン リ ス ト はテ キ ス ト 本体の一部 と し て与え ら れます。 デ
フ ォ ル ト では、 イ ン ラ イ ンオプシ ョ ンはキ ャ ラ ク タ 「<」 と 「>」 では さ みます。 それでは
次の よ う に、見出 し と 残 り の段落に対す る オプシ ョ ン を テ キ ス ト 本体の中に入れ込んでみ
まし ょ う。
注 以下作成例ではすべて、 イ ン ラ イ ン オプ シ ョ ン リ ス ト に色をつけて示 し ます。 改段落キ ャ
ラ ク タ は矢印で図示 し ます。
<leftindent=15 rightindent=10 alignment=center fontname=Helvetica fontsize=12
encoding=winansi>Have a look at our new paper plane models!
<alignment=justify fontname=Helvetica leading=140% fontsize=8 encoding=winansi>
Our paper planes are the ideal way of passing the time. We offer
revolutionary new developments of the traditional common paper planes.
<parindent=20>If your lesson, conference, or lecture
turn out to be deadly boring, you can have a wonderful time
with our planes. All our models are folded from one paper sheet.
They are exclusively folded without using any adhesive. Several
models are equipped with a folded landing gear enabling a safe
8.2 複数行のテキス ト フ ロー
209
landing on the intended location provided that you have aimed well.
Other models are able to fly loops or cover long distances. Let them
start from a vista point in the mountains and see
where they touch the ground.
オプシ ョ ン リ ス ト をは さ むキ ャ ラ ク タ は begoptlistchar ・ endoptlistchar オプシ ョ ンで再定
義す る こ と がで き ます。begoptlistchar オプシ ョ ンにキーワー ド none を与え る と オプシ ョ
ン リ ス ト の検出は完全に無効にな り ます。 こ れは、 テ キ ス ト が イ ン ラ イ ンオプシ ョ ン リ ス
ト を ま っ た く 含ま ない場合に、 「<」 ・ 「>」 を確実に通常のキ ャ ラ ク タ と し て処理 さ せたい
と き に有用です。
記号キ ャ ラ ク タ と イ ン ラ イ ン オ プ シ ョ ン リ ス ト 記号キ ャ ラ ク タ はテ キ ス ト フ ロ ーにお
いて、 イ ン ラ イ ンオプシ ョ ン リ ス ト と 組み合わせ も 使 う こ と がで き ます。 イ ン ラ イ ンオプ
シ ョ ン リ ス ト を開始す る キ ャ ラ ク タ に対す る コ ー ド (デフ ォ ル ト では 「<」 U+003C) は、
encoding=builtin に よ る フ ォ ン ト に対す る テ キ ス ト 内では記号 コ ー ド と し て解釈 さ れませ
ん。 こ れ と 同 じ コ ー ド の記号グ リ フ を選択す る には、 テ キ ス ト フ ォ ン ト に対 し て利用可能
な回避策がその ま ま使え ます。 すなわち、 開始キ ャ ラ ク タ を begoptlistchar オプシ ョ ンで
再定義す る か、 あ る いは textlen オプシ ョ ン を用いて記号グ リ フ の数を指定 し ます。 なお、
先述の理由に よ り 、 文字参照 (&lt; 等) は回避策 と し ては使え ません。
マ ク ロ 上記のテ キ ス ト はい く つかの種類の段落でで き てい ます。すなわち見出 し と 本文
であ り 、 本文には さ ら に イ ンデン ト のあ る も の と ない も の と があ り ます。 こ う し た各種の
段落を それぞれの形に組版 し てい く わけですが、 し か し テ キ ス ト フ ロ ーが も っ と 長ければ
同 じ 指定を何度 も し なければな り ません。段落替えのたびに同 じ イ ン ラ イ ンオプシ ョ ン群
を何度 も 書かな く て も すむ よ う にす る には、 イ ン ラ イ ンオプシ ョ ン群を マ ク ロ に ま と めれ
ば、 テ キ ス ト 内か ら そのマ ク ロ を名前で参照す る こ と がで き ます。 図 8.16 に示す よ う な 3
つのマ ク ロ を定義 し ま し ょ う 。 H1 は見出 し 用、 Body は本文段落用、 Body_indented は イ
ンデン ト す る 段落用です。 マ ク ロ を利用す る には、 キ ャ ラ ク タ & を マ ク ロ 名の前につけ
た も のを オプシ ョ ン リ ス ト に書 き ます。 次の コ ー ド では、 上で用いた イ ン ラ イ ンオプシ ョ
ン群に従っ て 3 つのマ ク ロ を定義 し 、 それを テ キ ス ト 内で利用 し てい ます。
<macro {
H1 {leftindent=15 rightindent=10 alignment=center
fontname=Helvetica fontsize=12 encoding=winansi}
Body {leftindent=15 rightindent=10 alignment=justify leading=140%
H1
Body
Body_indented
図 8.16
イ ン ラ イ ン オプ シ ョ
ン と マ ク ロの併用
210
Have a look at our new paper plane models!
Our paper planes are the ideal way of passing the time. We offer
revolutionary new developments of the traditional common paper
planes.
If your lesson, conference, or lecture turn out to be deadly boring,
you can have a wonderful time with our planes. All our models are
folded from one paper sheet.
They are exclusively folded without using any adhesive. Several
models are equipped with a folded landing gear enabling a safe landing
on the intended location provided that you have aimed well. Other
models are able to fly loops or cover long distances. Let them start
from a vista point in the mountains and see where they touch the
ground.
第 8 章 : テキス ト ・ 表組版
fontname=Helvetica fontsize=8 encoding=winansi}
Body_indented {parindent=20 leftindent=15 rightindent=10 alignment=justify
leading=140% fontname=Helvetica fontsize=8 encoding=winansi}
}>
<&H1>Have a look at our new paper plane models!
<&Body>Our paper planes are the ideal way of passing the time. We offer
revolutionary new developments of the traditional common paper planes.
<&Body_indented>If your lesson, conference, or lecture
turn out to be deadly boring, you can have a wonderful time
with our planes. All our models are folded from one paper sheet.
They are exclusively folded without using any adhesive. Several
models are equipped with a folded landing gear enabling a safe
landing on the intended location provided that you have aimed well.
Other models are able to fly loops or cover long distances. Let them
start from a vista point in the mountains and see
where they touch the ground.
オ プ シ ョ ンの明示的設定 注意 し な ければな ら ないのは、 マ ク ロ の中で設定 し なか っ た
オプシ ョ ン ではすべて前の値が保持 さ れ る と い う こ と です。 オプシ ョ ン が勝手に 「継承」
さ れておか し な副作用を起 こ さ ない よ う に し たければ、そのマ ク ロ が必要 と す る 設定をす
べて明示的に指定す る 必要があ り ます。そ う すればそのマ ク ロ が他のオプシ ョ ン リ ス ト と
の順序や組み合わせにかかわ ら ずいつ も 確実に同 じ よ う に動作す る よ う にす る こ と がで
き ます。
あ る いは、 こ の動作を逆に利用 し て、 あ る 特定の設定群についてはあ え て明示的に与
えずに、それぞれの利用箇所におけ る 設定が保持 さ れ る よ う にす る と い う 方式 も あ り え ま
す。 た と えば、 フ ォ ン ト 名は指定す る けれど も fontsize オプシ ョ ンは与え ない と い う マ ク
ロ を作っ て も よ いのです。 す る と 、 文字サ イ ズ をつねに前のテ キ ス ト と 同 じ にす る こ と が
で き ます。
イ ン ラ イ ン オ プ シ ョ ンか、 関数の引数 と し て オ プ シ ョ ン を渡すか テ キ ス ト フ ロ ーを利
用す る 際には、 テ キ ス ト がプ ロ グ ラ ム コ ー ド 内に リ テ ラ ルに書かれてい る か、 それ と も ど
こ か外部の情報源か ら 来 る か と い う のは重大な違いです。 ま た、 組版指示がテ キ ス ト と は
別に あ る か、 それ と も テ キ ス ト 内に あ る か と い う の も 重大です。 たいていのア プ リ ケー
シ ョ ンではテ キ ス ト はデー タ ベース の よ う な何 ら かの外部情報源か ら 来 る で し ょ う 。現実
的には次の 2 通 り の状況が考え ら れます。
> テ キ ス ト 内容が外部情報源か ら 来て、 組版オプシ ョ ンはプ ロ グ ラ ム内にあ る 場合 : 実
行時に、 外部情報源か ら 来 る 短いテ キ ス ト 群を プ ロ グ ラ ム内で合成 し 、 それを組版オ
プシ ョ ン群 と (関数呼び出 し の所で) 組み合わせます。
> テ キ ス ト 内容 も 組版オプシ ョ ン も 外部情報源か ら 来 る 場合 : 大量のテ キ ス ト が組版オ
プシ ョ ン群を含んだ状態で外部情報源か ら 来ます。 組版はテ キ ス ト 内の イ ン ラ イ ン オ
プシ ョ ン群に よ っ て与え ら れ ます。 イ ン ラ イ ン オプシ ョ ンは単純なオプシ ョ ン と し て
書かれてい る こ と も あれば、 マ ク ロ と し て書かれてい る こ と も あ り え ます。 マ ク ロ に
関 し ては、 マ ク ロ 定義 と マ ク ロ 呼び出 し と を区別 し て考え る 必要があ り ます。 そ う す
る と 、 面白い中間的形態が作 り 出せます。 すなわち、 テ キ ス ト 内容は外部情報源か ら
来て組版のためのマ ク ロ 呼び出 し も その中に含んでい る のですが、 マ ク ロ 定義は別に
用意 し ておいて実行時には じ めて与え る よ う にす る のです。 こ の方式の利点は、 外部
のテ キ ス ト に手を加えずに組版を簡単に変更で き る こ と です。 た と えばグ リ ーテ ィ ン
グ カー ド を作 る 際な ど、 さ ま ざ ま な ス タ イ ルを マ ク ロ で定義 し ておけば、 カー ド の雰
囲気を ロ マ ンチ ッ ク に し た り 、 テ ク ニ カルに し た り 、 その他 さ ま ざ ま に変え る こ と が
でき るでし ょ う 。
8.2 複数行のテキス ト フ ロー
211
hortabmethod ruler
tabalignment left
ruler 30
図 8.17
テキス ト を
表 と し て配置
ITEM
1
2
3
DESCRIPTION
Super Kite
Turbo Flyer
Giga Trash
right
150
right
250
right
350
QUANTITY
2
5
1
PRICE
20.00
40.00
180.00
AMOUNT
40.00
200.00
180.00
TOTAL 420.00
8.2.4 タ ブ位置
次の例では タ ブキ ャ ラ ク タ を用いて左寄せ ・ 右寄せの列のあ る 簡単な表を配置 し ます。 表
は次の よ う な複数行のテ キ ス ト を持ち、 各項目が互いに タ ブキ ャ ラ ク タ (矢印で示す) で
区切っ て あ り ます。
ITEM
DESCRIPTION
1
Super Kite
2
Turbo Flyer
3
Giga Trash
TOTAL
QUANTITY
2
20.00
5
1
PRICE
AMOUNT
40.00
40.00
200.00
180.00
180.00
420.00
こ の簡単な表を配置す る には、 PDF__add/create_textflow( ) で以下のオプシ ョ ン リ ス ト を
用い ます。 ruler オプシ ョ ンが タ ブ位置を定義 し てお り 、 tabalignment が タ ブ位置の整列
方向を指定 し てお り 、 hortabmethod オプシ ョ ンが タ ブ位置の処理方式を指定 し てい ます
(出力を図 8.17 に示 し ます)。
String optlist =
"ruler={30
150
250 350} " +
"tabalignment={left right right right} " +
"hortabmethod=ruler leading=120% fontname=Helvetica fontsize=9 encoding=winansi";
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/tabstops_in_textflow ト ピ ッ ク にあ
り ます。
注 複雑な表を作るには PDFlib の表機能を推奨 し ます (226 ページ 「8.3 表の組版」 参照)。
8.2.5 番号 リ ス ト と 段落間隔
イ ン ラ イ ンオプシ ョ ン leftindent を用いて番号 リ ス ト を組む方法を下記に示 し ます(図8.19
参照)。
1.<leftindent 10>Long Distance Glider: With this paper rocket you can send all
your messages even when sitting in a hall or in the cinema pretty near the back.
<leftindent 0>2.<leftindent 10>Giant Wing: An unbelievable sailplane! It is amazingly
robust and can even do aerobatics. But it is best suited to gliding.
<leftindent 0>3.<leftindent 10>Cone Head Rocket: This paper arrow can be thrown with big
swing. We launched it from the roof of a hotel. It stayed in the air a long time and
covered a considerable distance.
212
第 8 章 : テキス ト ・ 表組版
ク ッ ク ブ ッ ク 箇条書き リ ス ト と 番号 リ ス ト の完全な コ ー ド サン プルがク ッ ク ブ ッ クの
bulleted_list ・ text_output/numbered_list ト ピ ッ ク にあ り ます。
text_output/
イ ンデン ト 値を設定 し た り 取 り 消 し た り し なければな ら ないのが面倒です。 し か も 各段落
ご と に行わなければな ら ないのですか ら なお さ ら です。 も っ と エ レ ガ ン ト な解決法 と し て
は 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 に合わせた タ ブ位置を指定
はめ込み枠 1
ページ 1
1 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 2 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
3 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 4 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
5 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 6 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
7 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
はめ込み枠 2
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 8 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
9 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 10 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
11 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 12 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
13 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 14 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
はめ込み枠 3
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
15 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 16 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
17 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 18 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
19 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 20 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
はめ込み枠 4
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
21 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 22 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
23 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 24 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
25 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex
ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident,
sunt in culpa qui officia deserunt mollit anim
id est laborum. 26 Lorem ipsum dolor sit
amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim
veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu fugiat
nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui
officia deserunt mollit anim id est laborum.
27 Lorem ipsum dolor sit amet, consectetur
adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua.
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.
ページ 2
図 8.18
テキス ト フ ローを
2 つのはめ込み枠
に配置
図 8.19
番号 リ ス ト
8.2 複数行のテキス ト フ ロー
213
leftindent = &indent
parindent = – &indent 1.
2.
図 8.20
マ ク ロによ る
番号 リ ス ト
3.
Long Distance Glider: With this paper rocket you can send all your
messages even when sitting in a hall or in the cinema pretty near
the back.
Giant Wing: An unbelievable sailplane! It is amazingly robust and
can even do aerobatics. But it is best suited to gliding.
Cone Head Rocket: This paper arrow can be thrown with big swing.
We launched it from the roof of a hotel. It stayed in the air a long
time and covered a considerable distance.
し てい ます。 こ れに よ っ て、 番号の後のテ キ ス ト は、 leftindent で指定 し た分だけ イ ンデ
ン ト さ れ る よ う にな り ます。図 8.20 に parindent・leftindent オプシ ョ ンの作用を示 し ます。
ニつの段落の間隔 を設定 多 く の場合、 と な り あ っ た段落の間隔は、 段落の中の行間 よ
り も 、 広 く と り た い も のです。 こ れ を実現す る には、 空の行 を挿入 し て (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.
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/distance_between_paragraphs ト ピ ッ
ク にあ り ます。
8.2.6 制御キ ャ ラ ク タ と キ ャ ラ ク タ マ ッ ピ ン グ
テキス ト フ ロ ー内で制御キ ャ ラ ク タ テ キ ス ト フ ロ ーの中では さ ま ざ ま な キ ャ ラ ク タ が
特別な扱いを受け ます。 PDFlib はシ ン ボ リ ッ ク キ ャ ラ ク タ 名に対応 し てお り 、 こ れはその
文字 コ ー ド のかわ り と し て charmapping オプシ ョ ン (テ キ ス ト を処理す る 前にその中の
キ ャ ラ ク タ を置換で き る オプシ ョ ン。 後述) 内で用い る こ と がで き ます。 表 8.1 に、 テ キ
ス ト フ ロ ー関数群が評価す る すべての制御キ ャ ラ ク タ を、それぞれのシ ン ボ リ ッ ク 名 と 意
味説明 と と も に挙げて あ り ます。 1 つのオプシ ョ ン リ ス ト の中で同 じ オプシ ョ ン を複数回
使 う こ と はで き ませんが、 複数のオプシ ョ ン リ ス ト を連続 し て与え る こ と は可能です。 た
と えば次の並びは空行を作成 し ます。
<nextline><nextline>
キ ャ ラ ク タ ・ 連続キ ャ ラ ク タ のマ ッ ピ ン グ / 除去 charmapping オプシ ョ ン を使 う と 、テ
キ ス ト 内のキ ャ ラ ク タ を別のキ ャ ラ ク タ にマ ッ プ し た り 除去 し た り す る こ と がで き ます。
まずは簡単な場合か ら 始め る こ と に し て、テ キ ス ト 内のすべての タ ブを スペース にマ ッ プ
し てみま し ょ う 。 こ れを行 う には charmapping オプシ ョ ン を次の よ う に し ます。
charmapping={hortab space}
こ の コ マ ン ド ではシ ン ボ リ ッ ク キ ャ ラ ク タ 名 hortab ・ space を用いてい ま す。 すべての
キ ャ ラ ク タ 名の一覧を PDFlib API リ フ ァ レ ン スに挙げて あ り ます。 複数のマ ッ ピ ン グ を一
214
第 8 章 : テキス ト ・ 表組版
表 8.1 テキス ト フ ロー内の制御キ ャ ラ ク タ と その意味
Unicode キ ャ ラ ク タ 実体名
等価な テキ
ス ト フ ロー
オプ シ ョ ン
テキス ト フ ロー内における意味
U+0020
SP, space
space
単語揃え ・ 改行
U+00A0
NBSP, nbsp
(な し )
(no-break space) 改行 し ない空白文字
U+0009
HT, hortab
(な し )
水平 タ ブ。 ruler ・ tabalignchar ・ tabalignment オプ シ ョ ンに
従 っ て処理 さ れます
U+002D
HY, hyphen
(な し )
単語のハイ フ ネーシ ョ ンのための区切 り 文字
U+00AD
SHY, shy
(な し )
(soft hyphen) ハイ フ ネーシ ョ ン機会。 改行箇所でのみ表示 さ
れる
U+000B
U+2028
VT, verttab
LS, linesep
nextline
(next line) 次の行へ移る
U+000A
U+000D
U+000D ・
U+000A
U+0085
U+2029
LF, linefeed
CR, return
CRLF
NEL, newline
PS, parasep
nextparagrap (next paragraph) nextline と 同効果。 それに加え、 parindent
h
オプ シ ョ ンが次の行に影響 し ます
U+000C
FF, formfeed
return
PDF_fit_textflow( ) 関数が中断 し て文字列 _nextpage を返 し ま
す。
度に行 う には、 次の コ マ ン ド の よ う にすれば、 すべての タ ブ と 改行キ ャ ラ ク タ 列を スペー
ス に置換す る こ と がで き ます。
charmapping={hortab space
CRLF space
LF space
CR space}
次の コ マ ン ド はすべての ソ フ ト ハ イ フ ン を削除 し ます。
charmapping={shy {shy 0}}
次の コ マ ン ド は タ ブ 1 つにつ き スペース 4 つに置換 し ます。
charmapping={hortab {space 4}}
次の コ マ ン ド は任意長の連続linefeed キ ャ ラ ク タ 列を 1個のlinefeed キ ャ ラ ク タ に縮め ます。
charmapping={linefeed {linefeed -1}}
次の コ マ ン ド は CRLF キ ャ ラ ク タ 列を それぞれ 1 個の スペース に置換 し ます。
charmapping={CRLF {space -1}}
こ の最後の例について も う 少 し 詳 し く 見てみま し ょ う 。た と えばど こ かか ら テ キ ス ト を受
け取っ た時、何か他の ソ フ ト ウ ェ アのせいで行の途中に改行がブ ツブ ツ入っ ていた と し た
ら 、 その ま ま では適切に組版がで き ません。 適切にはめ込み枠内での組版が行え る よ う に
す る には、 こ れ ら の改行を スペース に置換 し たい と こ ろです。 こ れを行 う ため、 任意長の
連続改行を 1 個の スペース に置換 し ま し ょ う 。は じ めのテ キ ス ト は次の よ う な も のだ と し
ます。
8.2 複数行のテキス ト フ ロー
215
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.
To fold the famous rocket looper proceed as follows: Take a sheet of
paper. Fold it lengthwise in the middle. Then, fold down the upper
corners. Fold the long sides inwards that the points A and B meet on
the central fold.
図 8.21
上 : 無駄な改行のある テキス ト
下 : charmapping オプ シ ョ ン で
改行を置換 し た も の
To fold the famous rocket looper proceed as follows:
Take a sheet of paper. Fold it
lengthwise in the middle.
Then, fold down the upper corners. Fold the
long sides inwards
that the points A and B meet on the central fold.
次の コ ー ド は、無駄な改行キ ャ ラ ク タ を置換 し た う えでで き た テ キ ス ト を組版す る 方法を
例示す る も のです。
/* オプションリストを作成 */
String optlist = "fontname=Helvetica fontsize=9 encoding=winansi alignment=justify "
"charmapping {CRLF {space -1}}"
/* テキストフローをはめ込み枠に配置 */
textflow = p.add_textflow(-1, text, optlist);
if (textflow == -1)
throw new Exception("エラー:" + p.get_errmsg());
result = p.fit_textflow(textflow, left_x, left_y, right_x, right_y, "");
if (!result.equals("_stop"))
{ /* ... */ }
p.delete_textflow(textflow);
図 8.21 に、 処置前のテ キ ス ト のテ キ ス ト フ ロ ー出力 と 、 charmapping オプシ ョ ンに よ る
改善後の出力 と を示 し ます。
8.2.7 ハ イ フ ネーシ ョ ン
PDFlib は自動的にテ キ ス ト のハ イ フ ネーシ ョ ン を行 う 能力は持ち ませんが、テ キ ス ト 内で
ソ フ ト ハ イ フ ン キ ャ ラ ク タ に よ っ て明示的にハ イ フ ネーシ ョ ン機会が示 さ れてい る 場合
にはそ こ で単語を分割す る こ と がで き ます。 ソ フ ト ハ イ フ ン キ ャ ラ ク タ は Unicode では位
置 U+00AD にあ り ますが、非 Unicode 環境で ソ フ ト ハ イ フ ン を指定 し たい場合に も 以下の
よ う ない く つかの方式が利用可能です。
> cp1250 ~ cp1258(winansi を含む) と iso8859-1 ~ iso8859-16 のすべてのエン コ ーデ ィ ン グ
では ソ フ ト ハ イ フ ンは 10 進で 173、 8 進で 255、 16 進で 0xAD にあ り ます。
> ebcdic エン コ ーデ ィ ン グでは ソ フ ト ハ イ フ ンは 10進で 202、8進で 312、16進で 0xCA にあ
り ます。
216
第 8 章 : テキス ト ・ 表組版
Our paper planes are the ideal way of
passing the time. We offer revolutionary brand new developments of the
traditional common paper planes. If
your lesson, conference, or lecture turn
out to be deadly boring, you can have
a wonderful time with our planes. All
our models are folded from one paper
sheet. They are exclusively folded
without using any adhesive. Several
models are equipped with a folded
landing gear enabling a safe landing
on the intended location provided that
you have aimed well. Other models are
able to fly loops or cover long distances. Let them start from a vista point
in the mountains and see where they
touch the ground.
Our paper planes are the ideal way of
passing the time. We offer revolutionary
brand new developments of the
traditional common paper planes. If
your lesson, conference, or lecture turn
out to be deadly boring, you can have
a wonderful time with our planes. All
our models are folded from one paper
sheet. They are exclusively folded
without using any adhesive. Several
models are equipped with a folded
landing gear enabling a safe landing
on the intended location provided that
you have aimed well. Other models are
able to fly loops or cover long
distances. Let them start from a vista
point in the mountains and see where
they touch the ground.
図 8.22
テキス ト 両端揃えで ソ フ ト ハイ フ ン あ り 。
デ フ ォル ト 設定 と 広いはめ込み枠を使用。
図 8.23
テキス ト 両端揃えで ソ フ ト ハイ フ ン な し 。
デ フ ォ ル ト 設定 と 広いはめ込み枠を使用。
> エ ン コ ーデ ィ ン グ が ソ フ ト ハ イ フ ン キ ャ ラ ク タ を 含ん で い な い場合は (た と え ば
macroman)、 &shy; を用い る こ と がで き ます。
U+002D がハ イ フ ン キ ャ ラ ク タ と し て使われます。 ソ フ ト ハ イ フ ン で示 さ れたハ イ フ ネー
シ ョ ン機会でな く て も 、 単語は強制的にハ イ フ ネーシ ョ ン さ れ る こ と があ り ます。 こ れは
単語間隔伸縮や長体な ど、 他の調整手段が う ま く いかなかっ た極端な場合に起 こ り ます。
テキス ト 両端揃え でハ イ フ ン キ ャ ラ ク タ があ る場合 と ない場合 次の例では、 次のテ キ
ス ト を両端揃えで印字 さ せます。テ キ ス ト には ソ フ ト ハ イ フ ン キ ャ ラ ク タ を適宜入れて あ
り ます (ダ ッ シ ュ で示 し ます)。
Our paper planes are the ideal way of pas
sing the time. We offer revolu
brand new dev
tional common paper planes. If your lesson,
confe
elop
ments of the tradi
tionary
rence, or lecture turn out to be deadly boring, you can have a wonder
ful time
with our planes. All our models are folded from one paper sheet. They are exclu
folded without using any adhe
landing gear enab
sive. Several models are equip
ling a safe landing on the intended loca
tion provided that you
have aimed well. Other models are able to fly loops or cover long dist
start from a vista point in the mount
sively
ped with a folded
ances. Let them
ains and see where they touch the ground.
図 8.22 に、テ キ ス ト 両端揃えのデフ ォ ル ト 設定で生成 さ れたテ キ ス ト 出力を示 し ます。完
璧な見ばえ と な っ てい ます。 なぜな ら 条件が最適だか ら です。 すなわちはめ込み枠枠が充
分広 く て、 し か も 、 明示的なハ イ フ ネーシ ョ ン機会を ソ フ ト ハ イ フ ン キ ャ ラ ク タ で指定 し
て あ る か ら です。 図 8.23 を見 る と 、 明示的 ソ フ ト ハ イ フ ンがない場合で も 出力はおおむ
ね良好です。 オプシ ョ ン リ ス ト はど ち ら の場合 も 次の よ う にな り ます。
fontname=Helvetica fontsize=9 encoding=winansi alignment=justify
8.2.8 標準改行アルゴ リ ズムの制御
PDFlib は洗練 さ れた改行アルゴ リ ズ ム を実装 し てい ます。改行アルゴ リ ズ ム を制御す る テ
キ ス ト フ ロ ーオプシ ョ ン を表 8.2 に挙げます
8.2 複数行のテキス ト フ ロー
217
改行規則 1 つの単語、 ない し 両端を スペース キ ャ ラ ク タ で挟ま れた一連のテ キ ス ト が、
1 つの行に収ま り き ら ない場合、 次の行へ送 る 必要が出て き ます。 こ の よ う な状況で改行
アルゴ リ ズ ムは、 ど のキ ャ ラ ク タ の後で改行が可能か を決定 し ます。
た と えば、 -12+235/8*45 の よ う な数式は絶対に途中で改行 さ れませんが、 一方、 文字列
PDF-345+LIBRARY はマ イ ナ ス の所で次行に送 ら れ る 可能性があ り ます。 テ キ ス ト が ソ フ ト
ハ イ フ ン キ ャ ラ ク タ を含んでいればその う ちのいずれかの後で改行 さ れ る 可能性 も あ り
ます。
括弧 と 引用符については、 開 く 所 と 閉 じ る 所 と で規則が異な り ます。 括弧や引用符が
開 く 所では改行機会は一切与え ら れません。 引用符については、 どれが開いて どれが閉 じ
てい る のかを判定す る 手段 と し て、 引用符を 2 つずつ数え てい く 仕組みにな っ てい ます。
表 8.2 改行アルゴ リ ズム制御用オプ シ ョ ン一覧
オプ シ ョ ン
説明
adjustmethod
(キーワー ド ) minspacing ・ maxspacing オプ シ ョ ン で指定 さ れた制限内で単語間を詰めた り 拡げた
り し て も テキス ト が 1 行に収ま り き ら ない時に行の調整に用いる方式。 デ フ ォル ト : auto。
auto
shrink ・ spread ・ nofit ・ split 方式を順に適用。
clip
nofit (後述) と 同 じ 。 ただ し 、 はめ込み枠の右端 (rightindent オプ シ ョ ン を考慮)
か らはみ出 し た部分を切 り 落 と し 。
nofit
最後の単語を次行へ送る。 ただ し 、 残 さ れる (短い) 行が、 nofitlimit オプ シ ョ ン で
指定 さ れたパーセ ン ト 値よ り も短 く な ら ない場合に限る。 均等配置の段落で も若干がた
ついて見え る場合あ り 。
shrink
単語が行内に収ま ら ない と き、 収ま る ま で テキス ト を圧縮。 ただ し shrinklimit の制限
に従い、 それで収ま り き ら なければ nofit 方式を適用。
split
最後の単語を次行へ送 ら ず、 強制的にハイ フ ネーシ ョ ンする。 テキス ト フ ォ ン ト の場合
はハイ フ ンキ ャ ラ ク タ を挿入 し 、 記号フ ォ ン ト の場合は し ない。
最後の単語を次行へ送 り 、 残 さ れた (短い) 行を均等配置する よ う 単語内の字間を拡げ
る。 ただ し spreadlimit の制限に従い、 それで均等配置で き なければ nofit 方式を適
用。
spread
advancedlinebreak
(論理値) 複雑用字系で必要な高度な改行アルゴ リ ズムを有効に し ます。 これは タ イ文字等、 単語
境界を示すのに空白キ ャ ラ ク タ を使わない用字系で改行を行 う ために必要です。 オプ シ ョ ン
locale ・ script に従います。 デ フ ォ ル ト : false
avoidbreak
(論理値) true な ら、 avoidbreak が false に再設定 さ れる ま で一切改行 し ない。 デ フ ォル ト :
false。
charclass
(対の リ ス ト 。 こ こ で対の 1 番目の要素はキーワー ド であ り 、 2 番目の要素は Unichar または
Unichar の リ ス ト ) 指定 さ れた Unichar が、 指定 さ れたキーワー ド に分類 さ れます。 キーワー ド は、
そのキ ャ ラ ク タ の改行時動作を下記のよ う に決定 し ます。
letter
文字 (a B 等) と 同様に動作
punct
句読点文字 (+ / ; : 等) と 同様に動作
open
開きかっ こ ([ 等) と 同様に動作
close
閉 じ かっ こ (] 等) と 同様に動作
default
すべてのキ ャ ラ ク タ 分類を PDFlib 内蔵のデ フ ォ ル ト に リ セ ッ ト
例 : charclass={ close » open « letter {/ : =} punct & }
hyphenchar
218
(Unichar ま たはキーワー ド ) 改行箇所で ソ フ ト ハイ フ ンに置き換わるべきキ ャ ラ ク タ の Unicode
値。 デ フ ォル ト : U+00AD (SOFT HYPHEN)、 ただ し それがフ ォ ン ト 内になければ U+002D
(HYPHEN-MINUS)。
第 8 章 : テキス ト ・ 表組版
表 8.2 改行アルゴ リ ズム制御用オプ シ ョ ン一覧
オプ シ ョ ン
説明
locale
(キーワー ド ) advancedlinebreak= true の場合に、 ロー カ ラ イ ズ さ れた改行方式のために用い ら
れる ロ ケール。 キーワー ド は 1 個ない し 複数の構成要素から 成っ てお り 、 その中でオプ シ ョ ナル
な コ ンポーネ ン ト は下線キ ャ ラ ク タ 「_」 で区切られます (その文法は NLS/POSIX ロ ケール ID と
は若干異な っ ています。) :
> 必須の、ISO 639-2 に従っ た 2 文字か 3 文字の小文字の言語 コ ー ド (www.loc.gov/standards/iso6392 を参照)。 例 : en (英語) ・ de ( ド イ ツ語) ・ ja (日本語)。 これは language オプ シ ョ ン と は異
な り ます。
> オプ シ ョ ナルな、 ISO 15924 に従っ た 4 文字の用字系 コ ー ド (www.unicode.org/iso15924/iso15924codes.html を参照)。 例 : Hira (ひ らがな) ・ Hebr (ヘブ ラ イ文字) ・ Thai ( タ イ文字)。
> オプ シ ョ ナルな、 ISO 3166 に従 っ た 2 文字の大文字の国 コ ー ド (www.iso.org/iso/country_codes/
iso_3166_code_lists を参照)。 例 : DE ( ド イ ツ) ・ CH (ス イ ス) ・ GB (イ ギ リ ス)
キーワー ド _none は、 ロ ケール固有の処理が一切行われない こ と を指定 し ます。
ロケールを指定する こ と は、 タ イ文字等い く つかの用字系では高度な改行のために必須です。 デ
フ ォ ル ト : _none
例 : Thai ・ de_DE ・ en_US ・ en_GB
maxspacing
minspacing
(float またはパーセ ン ト 値) 単語間の最大間隔 ・ 最小間隔 (ユーザー座標で表すか、 スペースキ ャ
ラ ク タ の幅に対するパーセ ン ト 値で指定)。 単語間隔の算出時は こ の値を限度 と する (ただ し
wordspacing オプ シ ョ ンが加算 さ れる)。 デ フ ォル ト : minspacing=50%、 maxspacing=500%。
nofitlimit
(float またはパーセ ン ト 値) nofit 方式における行の長 さ の下限 (ユーザー座標で表すか、 収める
はめ込み枠の幅に対するパーセ ン ト 値で指定)。 デ フ ォル ト : 75%。
shrinklimit
(パーセ ン ト 値) shrink 方式における テキス ト 圧縮の下限。 縮小率の算出時は こ の値を限度 と す
る。 ただ し 、 horizscaling オプ シ ョ ンの値を掛け算 さ れる。 デ フ ォ ル ト : 85%。
spreadlimit
(float またはパーセ ン ト 値) spread 方式における 2 文字間の間隔の上限 (ユーザー座標で表すか、
文字サイ ズに対するパーセ ン ト 値で指定)。 計算 さ れる文字間は charspacing オプ シ ョ ンの値に加
算 さ れる。 デ フ ォル ト : 0。
イ ン ラ イ ン オプシ ョ ン リ ス ト は通常は改行機会を生 じ ません。 それは単語内でのオプ
シ ョ ン変更を可能にす る ためです。 ただ し 、 オプシ ョ ン リ ス ト が スペース キ ャ ラ ク タ で挟
まれてい る 場合はオプシ ョ ン リ ス ト の開始位置に改行機会があ り ます。 も し そのオプシ ョ
ン リ ス ト で改行が起 き て し か も alignment=justify の場合、オプシ ョ ン リ ス ト の前にあ る ス
ペース群は破棄 さ れます。 オプシ ョ ン リ ス ト の後の スペース群は保持 さ れ、 次行先頭に表
れます。
改行 を防 ぐ charclass オプシ ョ ン を使 う と 、 テ キ ス ト フ ロ ーが特定のキ ャ ラ ク タ の後で
改行 さ れ る のを防 ぐ こ と がで き ます。 た と えば、 下記のオプシ ョ ンはキ ャ ラ ク タ / の直後
での改行を防ぎ ます。
charclass={letter /}
ひ と つなが り のテ キ ス ト が複数行に泣 き 別れて し ま う のを防ぐ には、それを avoidbreak ~
noavoidbreak で く く る と い う 方法があ り ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/avoid_linebreaking ト ピ ッ ク にあ り
ます。
8.2 複数行のテキス ト フ ロー
219
Our paper planes
are the ideal way of
passing the time.We
offer revolutionary
brand new developments of the traditional
common paper planes.
If your lesson, conference, or lecture
turn out to be deadly
boring, you can have
a wonderful time
with our planes. All
図 8.24 狭いはめ込み枠で テキス ト 両端揃え。 デ フ ォル ト 設定を用いています
単語間ツ メ (minspacing オプ シ ョ ン)
行に長体 (shrink 方式 ・ shrinklimit オプ シ ョ ン)
強制ハイ フ ネーシ ョ ン (split 方式)
単語間アケ (spread 方式 ・ maxspacing オプ シ ョ ン)
日中韓テキス ト の組版 テ キ ス ト フ ロ ーエ ン ジ ン は、 日中韓テ キ ス ト を扱え る よ う に作
ら れてい る ので、 Unicode 標準の通 り 、 日中韓キ ャ ラ ク タ を表意文字 と し て適切に取 り 扱
い ます。 その結果、 日中韓テ キ ス ト はけ っ し てハ イ フ ネーシ ョ ン さ れません。 組版の品質
を高め る ため、 日中韓テ キ ス ト でテ キ ス ト フ ロ ーを使 う と き は、 下記の組版オプシ ョ ン を
推奨 し ます。 こ う す る と 、 欧文テ キ ス ト が混在 し ていて も そ こ でハ イ フ ネーシ ョ ンが行わ
れな く な り 、 ま た、 均等に間隔を あ けたテ キ ス ト 出力が生成 さ れます。
hyphenchar=none
alignment=justify
shrinklimit=100%
spreadlimit=100%
縦書 き はテ キ ス ト フ ロ ーでは対応 し てい ません。
狭いはめ込み枠で テキス ト 両端揃え はめ込み枠が狭ければ狭いほ ど、 両端揃えのテ キ
ス ト を制御す る ためのオプシ ョ ンが重要にな っ てい き ます。 図 8.24 は、 狭いはめ込み枠
でテ キ ス ト が さ ま ざ ま な方式で両端揃え さ れた出力結果を例示 し てい ます。 図 8.24 のオ
プシ ョ ン設定は基本的におおむね良好ですが、 ただ、 maxspacing がやや広すぎ る 単語間
隔を与え てい る のが気にな り ます。 と はいえ、 狭いはめ込み枠に対 し ては こ れは こ の ま ま
に し てお く こ と を推奨 し ます。 でない と 、 split 方式に よ る 見苦 し い強制ハ イ フ ネーシ ョ ン
の発生頻度が高ま る で し ょ う 。
はめ込み枠が狭すぎ る ために不適切な箇所が強制ハ イ フ ネーシ ョ ン さ れて し ま う 場合
は、 対処を考慮 し て、 ソ フ ト ハ イ フ ン を入れ る な り 、 テ キ ス ト 両端揃え を制御す る オプ
シ ョ ン を変え る な り す る 必要があ る で し ょ う 。
テキス ト 両端揃え で shrinklimit オ プ シ ョ ン 見た 目に も っ と も 受け入れやすい解決策
は shrinklimit オプシ ョ ン を小 さ く す る こ と で し ょ う 。 こ のオプシ ョ ンは、 shrink 方式でか
か る 長体の割合の下限を指定す る も のです。 図 8.25a は、 テ キ ス ト に shrinklimit=50% ま
で長体を かけ る こ と で強制ハ イ フ ネーシ ョ ン を防いでい る 様子を示 し てい ます。
テキス ト 両端揃え で spreadlimit オ プ シ ョ ン 字間 を 拡げ る こ と で改行 を 制御す る の も
一つの方法です。 こ れは spread 方式で行われ、 spreadlimit オプシ ョ ンで制御 さ れます。 し
か し こ の方式は美 し く ないのでめっ たに使われないで し ょ う 。 図 8.25b は、 spreadlimit=5
を使っ て、 字間の最大を非常に広 く 5 単位 と し た例です。
220
第 8 章 : テキス ト ・ 表組版
図 8.25 狭いはめ込み枠内の両端揃え テキス ト のためのオプ シ ョ ン
生成 さ れる出力
PDF_fit_textline( ) に与え るオプ シ ョ ン リ ス ト
a)
passing the time.We
offer revolutionary
brand new developments
of the traditional
common paper planes.
If your lesson, conference,
or lecture turn out to
alignment=justify shrinklimit=50%
b)
Our paper planes
are the ideal way of
passing the time.We
offer revolutionary
b r a n d n e w
developments of the
alignment=justify spreadlimit=5
c)
ments of the traditional
common paper planes.
If your lesson,
conference, or lecture
turn out to be deadly
boring, you can have
alignment=justify nofitlimit=50
テキス ト 両端揃え で nofitlimit オ プ シ ョ ン
nofitlimit オプシ ョ ンは、 nofit 方式が適用 さ
れた と き の行の最小の幅を制御す る も のです。 はめ込み枠が非常に狭い場合は、 こ れをデ
フ ォ ル ト 値 75% か ら 下げたほ う が強制ハ イ フ ネーシ ョ ン よ り は ま し です。 図 8.25c は、 行
の最小幅 50% を指定 し た場合の出力結果を示 し てい ます。
8.2.9 高度な用字系固有の改行
PDFlib は、 標準の改行アルゴ リ ズ ム に加え て、 追加の改行アルゴ リ ズ ム を実装 し てい ま
す。 こ の高度な改行アルゴ リ ズ ムは、 い く つかの用字系では必須であ り 、 ま た、 必須でな
いその他の用字系 / ロ ケールの組み合わせのなかに も 、 こ れに よ り 改行動作が改善 さ れ る
も のがあ り ます。 こ れは advancedlinebreak オプシ ョ ン で有効にす る こ と がで き ます。 改
行はテ キ ス ト の言語に依存 し ますので、 高度な改行アルゴ リ ズ ムは script オプシ ョ ン (表
6.2 参照) と locale オプシ ョ ン (PDFlib API リ フ ァ レ ン ス参照) に従い ます。 高度な改行
は、 下記の状況において正 し い改行機会を決定 し ます :
> タ イ 文字等、 テ キ ス ト 内の空白キ ャ ラ ク タ の存在に改行が依拠 し ない用字系に対 し て。
下記のテ キ ス ト フ ロ ーオプシ ョ ンは、 タ イ 文字に対 し て高度な改行を有効に し ます :
<advancedlinebreak script=thai locale=THA>
> 仏文テ キ ス ト 内で引用符 と し て用い ら れ る «» ギユ メ キ ャ ラ ク タ 等、 あ る 特定の句読点
キ ャ ラ ク タ の特別な扱い を必要 と す る 用字系 / ロ ケールの組み合わせにおいて。 下記
のテ キ ス ト フ ロ ーオプシ ョ ンは、仏文テ キ ス ト に対 し て高度な改行を有効に し ます。そ
の結果、 単語を囲 う ギユ メ キ ャ ラ ク タ が行末で単語 と 泣 き 別れ し な く な り ます :
<advancedlinebreak script=latn locale=fr>
locale テ キ ス ト フ ロ ーオプシ ョ ンは language テ キ ス ト オプシ ョ ン (表 6.3 参照) と 違 う こ
と に留意 し て く だ さ い : locale オプシ ョ ンは同 じ 3 文字の言語識別子で始ま る こ と がで き
ますが、1 個ない し 2 個の追加部分を任意に含む こ と も で き ます。ただ し 、こ れ ら が PDFlib
で必要にな る こ と は まれです。
8.2 複数行のテキス ト フ ロー
221
8.2.10 テキス ト をパス ・ 画像に回 り 込み
回 り 込み機能を利用す る と 、 任意の形状にテ キ ス ト を入れた り 、 テ キ ス ト をパ ス に回 り 込
ませ る こ と がで き ます。 範囲枠、 明示的な矩形 / 多角形 / 円 / 曲線、 パ ス オブジ ェ ク ト の
いずれかを用いて、 テ キ ス ト フ ロ ーに対す る 回 り 込み領域を指定す る こ と がで き ます。 画
像が ク リ ッ ピ ン グパ ス を内蔵 し てい る 場合には、テ キ ス ト を その画像の ク リ ッ ピ ン グパ ス
に自動的に回 り 込ませ る こ と も 可能です。
範囲枠 を使 っ た テキス ト の画像回 り 込み 最初の作成例 と し て、 テ キ ス ト フ ロ ーの中に
画像を配置 し て、 テ キ ス ト を その画像全体の ま わ り に回 り 込ませてみま し ょ う 。 まず画像
を読み込み、 枠内の希望の位置に配置 し ます。 こ の画像を後で名前で参照す る ために、 下
記の よ う にオプシ ョ ン リ ス ト matchbox={name=img margin=-5} で、 画像をはめ込む際に
img と い う 範囲枠を定義 し 、 5 単位の余白を指定 し ま し ょ う :
result = p.fit_image(image, 50, 35,
"boxsize={80 46} fitmethod=meet position=center matchbox={name=img margin=-5}");
テ キ ス ト フ ロ ーを追加 し ます。 そ し てそれを、 次の よ う に、 画像のはめ込み枠 img を回 り
込むべ き 領域 と し て wrap オプシ ョ ン を使っ て配置 し ま し ょ う (図 8.26 参照)。
result = p.fit_textflow(textflow, left_x, left_y, right_x, right_y,
"wrap={usematchboxes={{img}}}");
テ キ ス ト を配置す る 前に、同 じ 範囲枠名を使っ て さ ら にほかの画像をはめ込んでい く こ と
も で き ます。 その場合、 テ キ ス ト はすべての画像を回 り 込みます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/wrap_text_around_images ト ピ ッ ク に
あ り ます。
テキス ト を任意のパスに回 り 込み パ ス オブジ ェ ク ト を作成 し て (70 ページ 「3.2.3 直接
パ ス と パ ス オブジ ェ ク ト 」 参照) 、 それを回 り 込み形状 と し て用い る こ と も で き ます。 下
記の コ ー ド は、 単純な形状 (1 個の円) のパ ス オブ ジ ェ ク ト を構築 し 、 それ を PDF_fit_
textflow( ) の wrap オプシ ョ ンに与え てい ます。 パ ス を配置す る 参照点は、 はめ込み枠の
幅 と 高 さ に対す る パーセ ン ト 値 と し て表現 さ れてい ます :
path = p.add_path_point( -1,
0, 100, "move", "");
path = p.add_path_point(path, 200, 100, "control", "");
path = p.add_path_point(path,
0, 100, "circular", "");
/* パスを目に見えるようにしたければそうする */
p.draw_path(path, x, y, "stroke");
図 8.26
範囲枠を使 っ た テキス ト の画像回 り 込み
Have a look at our new paper plane models! Our
paper planes are the ideal way of passing the time.
We offer
revolutionary new
developments of the traditional common paper planes.
If your lesson, conference,
or lecture
turn out to be
deadly boring, you can
have a wonderful time with our planes. All our
models are folded from one paper sheet. They are
exclusively folded without using any adhesive.
222
第 8 章 : テキス ト ・ 表組版
図 8.27
テキス ト を三角形のまわ り に回 り 込み
Our paper planes are50%
the ideal
way of passing the time.
80%
We offer a lot of revolutionary brand-new developments
of the traditional common paper planes. If your
lesson, conference, or
lecture turn out to be
deadly boring, you
can have a wonderful
time with our planes.
All our models are
folded from one
paper sheet. They
are exclusively
folded without
using
any
adhesive.
80% 30%
20% 30%
Several models are equipped with a folded landing gear.
enabling a safe landing on the intended location provided
that you have aimed well. Other models are able to fly
loops or cover long distances.
result = p.fit_textflow(tf, llx1, lly1, urx1, ury1,
"wrap={paths={" +
"{path=" + path + " refpoint={100% 50%} }" +
"}}");
p.delete_path(path);
inversefill オプシ ョ ン を用い る と 、 テ キ ス ト をパ ス の外側に回 り こ ませ る のではな く 、 パ ス
の内側に回 り こ ませ る こ と が可能です (すなわち、 パ ス はテ キ ス ト フ ロ ー内に穴を あ け る
のではな く 、 テ キ ス ト の入れ物 と し て機能 し ます) :
result = p.fit_textflow(tf, llx1, lly1, urx1, ury1,
"wrap={inversefill paths={" +
"{path=" + path + " refpoint={100% 50%} }" +
"}}");
テキス ト を画像の ク リ ッ ピ ン グパスに回 り 込ませ る TIFF ・ JPEG 画像は、 ク リ ッ ピ ン グ
パ ス を内蔵す る こ と がで き ます。 こ のパ ス は、 画像処理アプ リ ケーシ ョ ン で作成 さ れてい
る 必要があ り 、 PDFlib は こ れを評価 し ます。 デフ ォ ル ト ク リ ッ ピ ン グパ ス が画像内で見つ
かればそれが使われ ますが、 画像内の他の任意の ク リ ッ ピ ン グパ ス を PDF_load_image( )
の clippingpathname オプシ ョ ン で指定す る こ と も で き ます。 画像が ク リ ッ ピ ン グパ ス と
と も に読み込まれていれば、 そのパ ス を抽出 し て先述の よ う に PDF_fit_textflow( ) の wrap
オプシ ョ ンに与え る こ と がで き ます。取 り 込んだ画像の ク リ ッ ピ ン グパ ス を拡大す る ため
に scale オプシ ョ ン も 与え ます :
image = p.load_image("auto", "image.tif", "clippingpathname={path 1}");
/* 画像のクリッピングパスからパスオブジェクトを作成 */
path = (int) p.info_image(image, "clippingpath", "");
if (path == -1)
throw new Exception("エラー : クリッピングパスが見つかりません!");
result = p.fit_textflow(tf, llx1, lly1, urx1, ury1,
"wrap={paths={{path=" + path + " refpoint={50% 50%} scale=2}}}");
p.delete_path(path);
画像 を配置 し て テキス ト を それに回 り 込ませ る 前の項では画像の ク リ ッ ピ ン グパ ス だ
け を使い ま し た (画像自体ではな く ) が、 今度は画像をはめ込み枠の中に配置 し て、 テ キ
ス ト を そ れ に 回 り 込 ま せ て み ま し ょ う 。 こ れ を 実 現 す る に は、 今 度 も 画 像 を
clippingpathname オプシ ョ ン をつけて読み込んで、 それを PDF_fit_image( ) でページ上に
配置す る 必要があ り ます。テ キ ス ト を回 り 込ませ る のに適切なパ ス オブジ ェ ク ト を作成す
る ために、 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);
8.2 複数行のテキス ト フ ロー
223
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 オプシ ョ ン を与え る こ と も で き ます。
こ れは多段組等、配置 さ れた画像が複数のテ キ ス ト フ ロ ーはめ込み枠に重な っ てい る と き
に有用です。
テキス ト を非矩形形状に回 り 込ませ る テ キ ス ト は、 範囲枠で指定 さ れ る 矩形を回 り 込
ませ る だけでな く 、任意のグ ラ フ ィ ッ ク 要素を回 り 込み輪郭 と し て定義す る こ と も で き ま
す。 た と えば下記のオプシ ョ ン リ ス ト は、 三角形の ま わ り にテ キ ス ト を回 り 込 ま せ ま す
(図 8.27 参照) :
wrap={ polygons={ {50% 80%
20% 30%
80% 30%
50% 80%} } }
なお、 showborder=true オプシ ョ ン を使っ て輪郭を図示 し て あ り ます。 wrap オプシ ョ ンは
複数の輪郭を持つ こ と も で き ます。 下記のオプシ ョ ン リ ス ト は、 2 つの三角形の ま わ り に
テ キ ス ト を回 り 込ませます。
wrap={ polygons={ {50% 80%
{20% 90%
20% 30%
10% 70%
80% 30%
30% 70%
50% 80%}
20% 90%} } }
パーセ ン ト 値 (はめ込み枠内におけ る 相対座標) のかわ り に、 ページ上の絶対座標を使 う
こ と も で き ます。
注 水平で も垂直で も ない向きの線分を持つ輪郭を使 う と きは、 fixedleading=true に設定する
こ と を推奨 し ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/wrap_text_around_polygons ト ピ ッ ク
にあ り ます。
非矩形の輪郭へ流 し 込み 回 り 込み機能を使えば、 任意の輪郭の領域の中にテ キ ス ト フ
ロ ーを配置す る こ と も で き ます。 こ れを実現す る には、 wrap オプシ ョ ン で addfitbox ま た
は inversefill サブオプシ ョ ン を使い ます。 テ キ ス ト は指定 さ れた輪郭の ま わ り に回 り 込む
のではな く 、 輪郭 (複数可) の中にテ キ ス ト が配置 さ れます。 下記のオプシ ョ ン リ ス ト を
使えば、 ひ し 形の中へテ キ ス ト を流 し 込む¥ こ と がで き ます。 こ こ で座標は、 はめ込み枠
の矩形に対す る パーセ ン ト 値 と し て与え てい ます (図 8.27 参照)。
wrap={ addfitbox polygons={ {50% 100%
10% 50%
50% 0%
90% 50%
50% 100%} } }
なお、 こ こ で も showborder=true オ プ シ ョ ン を 使 っ て輪郭 を 図示 し て あ り ま す。 も し
addfitbox オプシ ョ ン をつけなければ、 ひ し 形は空の ま ま、 その ま わ り にテ キ ス ト が回 り
込む こ と にな り ます。
重な り 合 う 輪郭へ流 し 込み 次の例 と し て、 重な り 合 う 2 つの多角形か ら 成 る 輪郭へ流
し 込みを行な っ てみま し ょ う 。 た と えば六角形の中に四角形が入っ た輪郭です。 addfitbox
オプシ ョ ン を使えば、 はめ込み枠自体は流 し 込みの範囲か ら 除外 さ れ、 その後の リ ス ト の
中の多角形は、 重な り 合っ てい る 領域を除いて流 し 込みが行われます (図 8.28 参照)。
224
第 8 章 : テキス ト ・ 表組版
図 8.28
重な り 合 う 輪郭へ流 し 込み
50% 100%
図 8.27
ひ し 形へテキス ト
を流 し 込み
10% 50%
Our
paper
planes are
the ideal way
of passing the
time. We offer a lot
of revolutionary brandnew developments of the
traditional common paper
planes. If your lesson, conference, or lecture turn
out to be deadly boring, you can have
a wonderful
time with
our planes.
90% 50%
Our paper planes are
the ideal way of passing the time. We offer
revolutionary new developments of
the traditional common paper planes.
If your lesson, conference, or
lecture turn
out to be
deadly
boring,
you can have a wonderful
time with our planes. All
our models are folded
from one paper sheet.
50% 0%
wrap={ addfitbox polygons=
{ {20% 10%
80% 10%
{35% 35%
65% 35%
100% 50%
65% 65%
80% 90%
35% 65%
20% 90%
0% 50%
35% 35%} } }
20% 10%}
も し addfitbox オプシ ョ ン をつけなければ、 こ れ と 反対の効果を得ます。 すなわち、 さ っ
き 流 し 込ま れた領域は空の ま ま と な り 、 さ っ き 空だ っ た領域へテ キ ス ト が流 し 込ま れ る こ
と にな り ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/fill_polygons_with_text ト ピ ッ ク に
あ り ます。
8.2 複数行のテキス ト フ ロー
225
8.3 表の組版
表組版機能を使 う と 、 複雑な表を自動組版する こ と がで き ます。 表のセルには、 一行ない
し 複数行のテ キ ス ト や、 画像、 PDF グ ラ フ ィ ッ ク を入れ る こ と がで き ます。 表は 1 個のは
め込み枠に収ま ら な く て も よ く 、 複数のページにわた る こ と が可能です。
ク ッ ク ブ ッ ク 表の諸側面に関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ クの tables カ テ ゴ リ にあ り ます。
表のあ ら ま し 表整形機能の説明は、 以下の概念 と 用語に も と づ き ます (図 8.29 参照)。
> 表は、 矩形の輪郭を持つ仮想のオブジ ェ ク ト です。 横方向の表行 と 縦方向の列でで き
てい ます。
> 単純セルは、 表内の矩形の領域であ り 、 表行 と 列の交差 と し て定義 さ れ ます。 連結セ
ルは、 複数の列か複数の表行、 ない し 両方にわた っ てい ます。 セル と い う 用語を用い
る と き は、 単純セル と 連結セルの両方を指す も の と し ます。
> 表は、1 つのはめ込み枠に収ま り き る こ と も あ り ます し 、複数のはめ込み枠が必要にな
る こ と も あ り ます。1 つのはめ込み枠に配置 さ れた表行群は、 表イ ン ス タ ン ス を構成 し
ます。 PDF_fit_table( ) は、 1 回呼び出 さ れ る ご と に、 1 つのはめ込み枠に 1 つの表 イ ン
ス タ ン ス を配置 し ます (236 ページ 「8.3.5 表 イ ン ス タ ン ス」 参照)。
> ヘ ッ ダ と フ ッ タ は、 表の最初か最後にあ る 表行 (複数可) のかた ま り であ り 、 すべて
の表 イ ン ス タ ン ス の上端か下端に繰 り 返 し 現れ ます。 ヘ ッ ダに も フ ッ タ に も 属 さ ない
表行は本体表行 と 呼びます。
ヘッダ
Our Paper Plane Models
3 列連結セル
1 Giant Wing
単純セル
Material
Benefit
Offset print paper 220g/sqm
It is amazingly robust and
can even do aerobatics. But
it is best suited to gliding.
Amazingly robust!
2 Long Distance Glider
セルにテキ
ス ト フ ロー
Material
Drawing paper 180g/sqm
Benefit
With this paper rocket you
can send all your messages
even when sitting in the
cinema pretty near the back.
セルに画像 と
テキス ト 行
3 行連結セル
3 Cone Head Rocket
Material
Kent paper 200g/sqm
Benefit
This paper arrow can be
thrown with big swing. It
stays in the air a long time.
フッタ
With big swing!
図 8.29
表の例
例 と し て、 図 8.29 の表のすべての要素の作 り 方を説明 し てい き ます。 表組版オプシ ョ ン
の完全な説明については PDFlib API リ フ ァ レ ン ス を参照 し て く だ さ い。 表の作成は まず、
各表セルの内容 と 視覚的プ ロ パテ ィ を PDF_add_table_cell( ) で定義 し てい く こ と か ら 始ま
り ます。 それか ら 、 PDF_fit_table( ) を 1 回ない し 複数回呼び出 し て、 その表を配置 し ます。
表を配置す る 際には、 そのはめ込み枠の大 き さ と 、 その表行や列の罫線 と 塗 り 分け を
指定す る こ と も で き ます。 セルご と の塗 り 分けな ど の細かい指定には、 範囲枠機能を使っ
て く だ さ い (詳 し く は 242 ページ 「8.4 範囲枠」 参照)。
226
第 8 章 : テキス ト ・ 表組版
こ の節では、 表セルの定義 と 表のはめ込みに必要な、 も っ と も 重要なオプシ ョ ン のみ
を解説 し ます。いずれの例において も 、そのための PDF_add_table_cell( ) と PDF_fit_table( )
への呼び出 し だけ を示 し ま すが、 必要な フ ォ ン ト はすでに読み込 ま れてい る も の と し ま
す。
注 表の処理は、 カ レ ン ト グ ラ フ ィ ッ ク 状態から は独立です。 表セルの定義は文書ス コ ープ で
も で き ますが、 実際に表を配置するのはページス コ ープ で行 う 必要があ り ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの tables/starter_table ト ピ ッ ク にあ り ます。
8.3.1 単純な表 を配置
表の概念を さ ら に詳 し く 説明す る 前に、 単純な表作成の例を示 し ます。 表には 6 つのセル
があ り 、 3 表行 ・ 2 列に配 さ れてい ます。 4 つのセルにはテ キ ス ト 行があ り 、 1 つのセルに
は複数行のテ キ ス ト フ ロ ーがあ り ます。 セルの内容はすべて、 余白を 1 単位 と っ て横方向
に左寄せ、 縦方向に中央揃えにな っ てい ます。
こ の表を作成す る ために、 まずはテ キ ス ト 行セルに対す る オプシ ョ ン リ ス ト を作 る た
めに、 その fittextline サブオプシ ョ ン リ ス ト で、 必要なオプシ ョ ン font ・ fontsize と 位置
{left center} を定義 し ま し ょ う 。 さ ら に、 1 単位のセル余白を定義 し ま し ょ う 。 そ し て、 テ
キ ス ト 行セルを 1 つずつそれぞれの列 ・ 表行に追加 し 、 その際に中身のテ キ ス ト も 、 PDF_
add_table_cell( ) への呼び出 し に直接与え ます。
次に、 テ キ ス ト フ ロ ーを作成 し 、 そのテ キ ス ト フ ロ ーのハン ド ルを使っ て テ キ ス ト フ
ロ ー表セルに対す る オプシ ョ ン リ ス ト を構築 し た後、 そのセルを表に追加 し ま し ょ う 。
最後に、 PDF_fit_table( ) を使っ て表を配置 し 、 その際に、 表の外枠 と セルの各辺に黒
い罫線をつけ ま し ょ う 。 列の幅は一切与え ませんで し たので、 与えた テ キ ス ト 行 と 余白か
ら 自動的に計算 さ れます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの tables/vertical_text_alignment ト ピ ッ ク にあ り
ます。
下記の コ ー ド は、 こ の単純な表の作 り 方を示 し ます。 結果を図 8.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;
/* フォントを読み込む */
font = p.load_font("Helvetica", "unicode", "");
if (font == -1)
throw new Exception("エラー:" + p.get_errmsg());
/* 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);
if (tbl == -1)
8.3 表の組版
227
throw new Exception("エラー:" + p.get_errmsg());
/* 列1表行2にテキスト行セルを追加 */
tbl = p.add_table_cell(tbl, 1, 2, "Material", optlist);
if (tbl == -1)
throw new Exception("エラー:" + p.get_errmsg());
/* 列1表行3にテキスト行セルを追加 */
tbl = p.add_table_cell(tbl, 1, 3, "Benefit", optlist);
if (tbl == -1)
throw new Exception("エラー:" + p.get_errmsg());
/* 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);
if (tbl == -1)
throw new Exception("エラー:" + p.get_errmsg());
/* テキストフローを追加 */
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);
if (tbl == -1)
throw new Exception("エラー:" + p.get_errmsg());
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);
/* 結果を調べる。「_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, "");
228
第 8 章 : テキス ト ・ 表組版
セルの内容の縦位置 を調整す る 表セルの縦方向中央に さ ま ざ ま な種類の内容を配置す
る と 、 その辺か ら の距離は ま ち ま ちにな り ます。 図 8.30a において、 4 つのテ キ ス ト 行セ
ルは次のオプシ ョ ン リ ス ト で配置 さ れてい ます。
optlist = "fittextline={position={left center} font=" + font +
" fontsize=8} colwidth=80 margin=4";
テ キ ス ト フ ロ ーセルは特殊なオプシ ョ ン を一切使わずに追加 さ れてい ます。テ キ ス ト 行を
縦方向中央に配置 し たために、 Benefit の行がテ キ ス ト フ ロ ーの分だけ下へずれます。
図 8.30 テキス ト 行 と テキス ト フ ローを表セル内で整列 さ せる
生成 さ れる出力
Our Paper Planes
Material
Offset print paper 220g/sqm
Benefit
It is amazingly robust and can
even do aerobatics. But it is
best suited to gliding.
a)
Our Paper Planes
b)
Material
Offset print paper 220g/sqm
Benefit
It is amazingly robust and can
even do aerobatics. But it is
best suited to gliding.
図 8.30b に示 し た よ う に、 セルの辺か ら セルの中身 ま での縦間隔は、 それがテ キ ス ト フ
ロ ーであ る かテ キ ス ト 行であ る かにかかわ ら ず、 すべて同 じ に し たい も のです。 こ れを実
現す る ために、 まずテ キ ス ト 行のためのオプシ ョ ン リ ス ト を用意 し ま し ょ う 。 表行の高 さ
を固定値 14 ポ イ ン ト 、テ キ ス ト 行の位置を左上で余白 4 ポ イ ン ト と し て定義 し ま し ょ う 。
さ き に与えたオプシ ョ ン fontsize=8 は、 文字の高 さ を正確には表 し てお ら ず、 上下に
い く ら かあ き がで き てい ます。 で も 、 大文字の高 さ はフ ォ ン ト の capheight 値で正確に表
さ れます。 ですので、 fontsize={capheight=6} を用いれば、 文字サ イ ズが結果的にほぼ 8 ポ
イ ン ト にな り 、 ま た (margin=4 と あわせて) 高 さ の合計が 14 ポ イ ン ト と な っ て rowheight
オプシ ョ ン と 合い ます。 ですので全体 と し ては、 テ キ ス ト 行セルに対す る PDF_add_table_
cell( ) のオプシ ョ ン リ ス ト は次の よ う に し ま し ょ う 。
/* テキスト行セルに用いるオプションリスト */
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%";
8.3 表の組版
229
さ ら に、 テ キ ス ト Benefit のベース ラ イ ンは、 テ キ ス ト フ ロ ーの 1 行目に整列 さ せたい も
のです。 と 同時に、 テ キ ス ト Benefit のセル上端か ら の間隔は、 テ キ ス ト Material と 同 じ
にな る べ き です。 上端に余白を生 じ さ せないために、 テ キ ス ト フ ロ ーセルの追加にあ た っ
ては fittextflow={firstlinedist=capheight} を用い ま し ょ う 。 そ し てテ キ ス ト 行 と 同 じ く 、 余
白 4 ポ イ ン ト を追加 し ま し ょ う 。
/* テキストフローセルの追加に用いるオプションリスト */
optlist = "textflow=" + tf + " fittextflow={firstlinedist=capheight} "
"colwidth=120 margin=4";
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの tables/vertical_text_alignment ト ピ ッ ク にあ り
ます。
8.3.2 表セルの さ ま ざ ま な内容
PDF_add_table_cell( ) で表にセルを追加す る と き は、 さ ま ざ ま な種類のセル内容を指定す
る こ と がで き ます。 表セルは、 同時に複数の種類の内容を含む こ と も で き ます。 罫線 ・ 塗
り の追加 も 可能なほか、 範囲枠を使っ て表セル内に追加の内容を配置す る こ と も で き ま
す。
た と えば紙飛行機の表には、 図 8.31 に示す要素があ り ます。
࠹ࠠࠬ࠻ⴕ
࠹ࠠࠬ࠻ⴕ
࠹ࠠࠬ࠻ⴕ
࠹ࠠࠬ࠻ⴕ
࠹ࠠࠬ࠻ⴕ
࠹ࠠࠬ࠻ࡈࡠ࡯ ....................
..............................................
..............................................
࠹ࠠࠬ࠻ⴕ
図 8.31
表セルの さ ま ざ ま
な内容
テキス ト 行に よ る一行テキス ト テ キ ス ト は、 PDF_add_table_cell( ) の text 引数で与え ま
す。 fittextline オプシ ョ ンで、 PDF_fit_textline( ) の組版オプシ ョ ンのすべて を与え る こ と
がで き ます。 デフ ォ ル ト のはめ込み方式は fitmethod=nofit です。 テ キ ス ト がセルに収ま
り き ら ない と き は、 セルが大 き く な り ま す。 こ れを避け る には、 fitmethod=auto を使え
ば、 shrinklimit オプシ ョ ン の範囲内でテ キ ス ト が縮 ま り ま す。 表行の高 さ が指定 さ れな
かっ た場合は、 組版機能はテ キ ス ト サ イ ズの 2 倍を表セルの高 さ と し ます ( よ り 正確にい
う と boxheight の 2 倍。 こ れは、 別途指定 さ れない限 り デフ ォ ル ト 値 {capheight none} を
持ち ます)。 テ キ ス ト が回転 さ せて あ る と き の表行の幅について も 同 じ です。
テキス ト フ ロ ーに よ る複数行テキス ト テ キ ス ト フ ロ ーは、 表関数の外で用意 し ておい
て、 PDF_add_table_cell( ) を呼び出す前に PDF_create_textflow( ) か PDF_add_textflow( ) で
作成 し てお く 必要があ り ます。 そのテ キ ス ト フ ロ ーのハン ド ルは、 textflow オプシ ョ ンで
与え ます。 fittextflow オプシ ョ ンで、 PDF_fit_textflow( ) の組版オプシ ョ ンのすべて を与え
る こ と がで き ます。
デフ ォ ル ト のはめ込み方式は fitmethod=clip です。すなわち次の よ う に動作 し ます。 ま
ず、 テ キ ス ト がセルに収ま り き る か ど う かが試 さ れます。 セルの大 き さ が充分でない と き
は、 その高 さ が増や さ れます。 それで も テ キ ス ト が収ま り き ら ない場合は、 末尾が切 り 落
と さ れます。 こ れを避け る には、 fitmethod=auto を使えば、 minfontsize オプシ ョ ンの範
囲内でテ キ ス ト が縮ま り ます。
230
第 8 章 : テキス ト ・ 表組版
セルが狭すぎ る と き は、1 つの単語を好ま し く ない箇所で分割 さ せ る よ う 、 テ キ ス ト フ
ロ ーに強制す る こ と も で き ます。 checkwordsplitting オプシ ョ ンが true の場合は、 単語が
分割 さ れな く な る ま でセル幅が拡が り ます。
画像 と テ ン プ レ ー ト 画像は、PDF_add_table_cell( ) を呼び出す前に PDF_load_image( ) で
読み込んでお く 必要があ り ます。 テ ンプ レー ト は、 PDF_begin_template_ext( ) で作成す る
必要があ り ます。 その画像やテ ンプ レー ト のハン ド ルは、 image オプシ ョ ンで与え ます。
fitimage オプシ ョ ンで、PDF_fit_image( ) の組版オプシ ョ ンのすべて を与え る こ と がで き ま
す。 デフ ォ ル ト のはめ込み方式は fitmethod=meet です。 すなわち画像 / テ ンプ レー ト は、
縦横比を変え ない ま ま、 セル内に収ま り き る よ う 配置 さ れます。 セルの大 き さ が、 画像 /
テ ンプ レー ト の大 き さ に し たがっ て変わ る こ と はあ り ません。
取 り 込み PDF 文書のページ PDI ページは、 PDF_add_table_cell( ) を呼び出す前に PDF_
open_pdi_page( ) で開いてお く 必要があ り ます。その PDI ページのハン ド ルは、pdipage オ
プシ ョ ンで与え ます。fitpdipage オプシ ョ ン で、PDF_fit_pdi_page( ) の組版オプシ ョ ンのす
べて を与え る こ と がで き ます。 デフ ォ ル ト のはめ込み方式は fitmethod=meet です。 すな
わち PDI ページは、 縦横比を変え ない ま ま、 セル内に収ま り き る よ う 配置 さ れます。 セル
の大 き さ が、 PDI ページの大 き さ に し たがっ て変わ る こ と はあ り ません。
パス オ ブ ジ ェ ク ト パ ス オブジ ェ ク ト は、PDF_add_table_cell( ) を呼び出す前に PDF_add_
path_point( ) で作成 さ れてい る 必要があ り ます。 そのパ スハン ド ルは path オプシ ョ ンで
与え ら れます。 fitpath オプシ ョ ンでは、 PDF_draw_path( ) のすべての組版オプシ ョ ン を指
定可能です。 パ ス の外接枠が表セル内に配置 さ れます。 セル内枠の左下隅が、 パ ス を配置
す る ための参照点 と し て用い ら れます。
注釈 表セル内の注釈は、 PDF_create_annotation( ) の type 引数 (ただ し こ の関数を呼び
出す必要はあ り ません) に対応す る PDF_add_table_cell( ) の annotationtype オプシ ョ ンで
作成す る こ と がで き ます。 fitannotation オプシ ョ ンでは、 PDF_create_annotation( ) のすべ
てのオプシ ョ ン を指定可能です。 セル枠が注釈矩形 と し て用い ら れます。
フ ォ ーム フ ィ ール ド 表セル内の フ ォ ーム フ ィ ール ド は、 PDF_create_field( ) の name ・
type 引数 (ただ し こ の関数を呼び出す必要はあ り ません) に対応す る PDF_add_table_cell( )
の fieldname ・ fieldtype オプシ ョ ンで作成す る こ と がで き ます。 fitfield オプシ ョ ンでは、
PDF_create_field( ) のすべてのオプシ ョ ン を指定可能です。セル枠が フ ィ ール ド 矩形 と し て
用い ら れます。
セル内枠内でのセル内容の位置合わせ デ フ ォ ル ト では、 セル内容の位置は、 セル枠に
合わせて決ま り ます。 PDF_add_table_cell( ) で margin オプシ ョ ン を使えば、 セルの端 と の
間に間隔を指定す る こ と がで き ます。 その結果で き る 矩形を、 セル内枠 と 呼びます。 余白
が 1 つで も 定義 さ れていれば、 セル内容はセル内枠に合わせて配置 さ れます (図 8.32 参
照)。 余白が 1 つ も 定義 さ れていない と き は、 セル内枠はセル枠 と 同 じ です。
8.3 表の組版
231
こ れ と あわせて、 セルの内容は、 内容依存のはめ込みオプシ ョ ン で与え たオプシ ョ ン
に も 従 う こ と があ り ます。 233 ページ 「8.3.4 さ ま ざ ま な種類の内容を持っ た表」 で説明 し
ます。
਄૛⊕
࠮࡞ౝᨒ
Ꮐ૛⊕
ฝ૛⊕
図 8.32
内容を セル内枠に
はめ込み
࠮࡞ᨒ
ਅ૛⊕
8.3.3 表 と 列の幅
セルを表に追加す る 際には、 そのセルが ま たが る 列か表行、 ま たは両方の数を、 colspan ・
rowspan オプシ ョ ン で定義 し ます。 デフ ォ ル ト ではセルの列は 1 つ、 表行 も 1 つです。 表
の列 と 表行の総数は、 セルを追加す る ご と に、 それぞれの値だけ自動的に加算 さ れ ます。
図 8.33 に、 3 列 ・ 4 表行の表の例を示 し ます。
1
1
1
2
1
3
1
4
3 2
㧞ߟߩ ...... ೉ߦ ...... ࠊߚࠆ ...... ࠮࡞
ⴕ2
ⴕ3
ⴕ4
図 8.33
単純セル と 、 複数の表行や
列を連結 し たセル
㧟ߟߩ ............ ೉ߦ ............ ࠊߚࠆ ............ ࠮࡞
ⴕ1
න⚐࠮࡞
2 3
㧟ߟߩ ....
න⚐࠮࡞
.... ⴕߦ ....
න⚐࠮࡞
න⚐࠮࡞
.... ࠊߚࠆ࠮࡞
೉1
೉2
2 4
೉3
さ ら に、 colwidth オプシ ョ ン を使っ て、 セルが ま たが る 最初の列の幅を明示的に与え る こ
と も で き ます。 各セルご と に、 その最初の列の幅を決めて与え る と 、 それ ら の幅の値はす
べて、 表全体の幅に自動的に加算 さ れてい き ます。 図 8.34 に例を示 し ます。
1
1
1
2
1
3
1
4
colspan=3
colwidth=50
colspan=2
colwidth=50
colspan=1
colwidth=50
図 8.34
列幅を足 し 合わせる
と 表全体の幅に
3 2
2 3
rowspan=3
colwidth=90
colspan=1
colwidth=100
2 4
colspan=1
colwidth=50
colspan=1
colwidth=100
50
100
90
⴫ߩో᏷ 240
ま たは適当で あれば、 列幅を パーセ ン ト 値で指定す る こ と も で き ま す。 その場合 こ の値
は、 表のはめ込み枠の幅に対す る 割合にな り ま す。 パーセ ン ト 値に よ る 指定を行 う 場合
は、 すべての列に対 し て行 う 必要があ り ます。 でなければ一切 し てはいけ ません。
232
第 8 章 : テキス ト ・ 表組版
PDF_add_table_cell( ) の colscalegroup オプシ ョ ン を使っ て、 い く つかの列を列伸縮グ
ループ と し て ま と めて あ る 場合、 それ ら の幅は、 グループ内で も っ と も 幅の広い列 と 同 じ
にな り ます (図 8.35 参照)。
Max. Load
Range
Weight
Speed
೉᜛ᄢ❗ዊࠣ࡞࡯ࡊ
Giant Wing
12g
18m
14g
8m/s
Long Distance Glider
5g
30m
11.2g
5m/s
Cone Head Rocket
7g
7m
12.4g
6m/s
図 8.35
1 番目の表行の右 4 セルは、 同 じ 列伸縮
グループに属 し ているので、 同 じ 幅にな
り ます。
絶対座標が使われてい る 場合 (パーセ ン ト 値でな く ) 、 列幅を定義 さ れていないセルがあ
る と き は、 その未決定の幅は以下の よ う に し て算定 さ れます。 まず、 テ キ ス ト 行を含む各
セルについて、 列幅かテ キ ス ト の幅 (回転 さ れてい る テ キ ス ト の場合はテ キ ス ト の高 さ )
に も と づいて、 実際の幅が算出 さ れます。 それか ら 、 残 り の表幅が、 ま だ決定 し ていない
列幅に均等に分配 さ れます。
8.3.4 さ ま ざ ま な種類の内容 を持 っ た表
以下のい く つかの項では、 図 8.36 に示す よ う な、 さ ま ざ ま な種類の内容を持っ た表の例
を、 一歩ずつ作成 し てい き ま し ょ う 。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの tables/mixed_table_contents ト ピ ッ ク にあ り ま
す。
前準備 と し て、 2 つの フ ォ ン ト を読み込む必要があ り ます。 表のはめ込み枠の大 き さ を、
その左下隅 と 右上隅の座標に よ っ て定義 し 、 3 つの表列の幅を指定 し ま し ょ う 。 そ し て、
新規ページ を A4 サ イ ズで開始 し ま し ょ う 。
double llx = 100, lly = 500, urx = 360, ury = 600; // 表の座標
int c1 = 50, c2 = 120, c3 = 90; // 3つの表列の幅
boldfont = p.load_font("Helvetica-Bold", "unicode", "");
normalfont = p.load_font("Helvetica", "unicode", "");
p.begin_page_ext(0, 0, "width=a4.width height=a4.height");
手順 1 : 最初のセル を追加 まずは、表の最初のセルか ら 始め ま し ょ う 。 こ のセルは 1 行
目の 1 列目に配置 し 、 3 つの列にわた ら せます。 1 列目の幅は 50 ポ イ ン ト です。 テ キ ス ト
行は縦横の中央に置 き 、 すべての端で余白を 4 ポ イ ン ト と り ます。 下記の コ ー ド に、 最初
のセルを追加す る 方法を示 し ます。
optlist = "fittextline={font=" + boldfont + " fontsize=12 position=center} " +
"margin=4 colspan=3 colwidth=" + c1;
tbl = p.add_table_cell(tbl, 1, 1, "Our Paper Plane Models", optlist);
if (tbl == -1)
throw new Exception("エラー:" + p.get_errmsg());
8.3 表の組版
233
手順 2 : 2 列に ま たが る セル を追加 次の手順 と し て、 テ キ ス ト 行 1 Giant Wing を持つ
セルを追加 し ま し ょ う 。 こ れは 2 行目の 1 列目に配置 し 、 2 つの列にわた ら せます。 1 列
目の幅は 50 ポ イ ン ト です。 行の高 さ は 14 ポ イ ン ト です。 テ キ ス ト 行は左上に置 き 、 すべ
ての端で余白を 4 ポ イ ン ト と り ます。 229 ページ 「セルの内容の縦位置を調整す る 」 で述
べたの と 同様に、 fontsize={capheight=6} を用いて、 テ キ ス ト の縦揃え を統一 し ま し ょ う 。
こ の見出 し Giant Wing のセルは、 行全体でな く 3 列中 2 列 し か連結 し ないので、 行
ベース の塗 り 分けオプシ ョ ンでは色がつけ ら れません。 かわ り に範囲枠機能を使っ て、 セ
ルが覆 う 矩形を灰色の背景色で塗 り ま し ょ う (範囲枠機能については 242 ページ 「8.4 範
囲枠」 を参照)。 下記の コ ー ド に、 見出 し Giant Wing のセルを追加す る 方法を示 し ます。
optlist = "fittextline={position={left top} font=" + boldfont +
" fontsize={capheight=6}} rowheight=14 colwidth=" + c1 +
" margin=4 colspan=2 matchbox={fillcolor={gray .92}}";
tbl = p.add_table_cell(tbl, 1, 2, "1 Giant Wing", optlist);
if (tbl == -1)
throw new Exception("エラー:" + p.get_errmsg());
図 8.36 さ ま ざ ま な内容の表セルを一歩ずつ追加
生成 さ れる表
生成手順
Our Paper Plane Models
手順 2 : 2 列にまたがる セルを追加
1 Giant Wing
Material
Offset print paper 220g/sqm
Benefit
It is amazingly robust and can
even do aerobatics. But it is
best suited to gliding.
手順 1 : 3 列にまたがる セルを追加
手順 3 : さ ら にテキス ト 行セル 3 つ追加
Amazingly robust!
手順 4 : テキス ト フ ローセル追加
手順 5 : テキス ト 行つ き画像セル追加
手順 6 : 表をはめ込む
手順 3 : さ ら に 3 つのテキス ト 行セル を追加 下記の コ ー ド は、Material・Benefit・ Offset
print paper…のセルを追加 し ます。Offset print paper…のセルは 2 列目で始ま る ので、同時
に 120 ポ イ ン ト の列幅を定義 し ます。 セルの内容は左上に置き 、 すべての端で余白を 4 ポ
イ ン ト と り ます。
optlist = "fittextline={position={left top} font=" + normalfont +
" fontsize={capheight=6}} rowheight=14 colwidth=" + c1 + " margin=4";
tbl = p.add_table_cell(tbl, 1, 3, "Material", optlist);
if (tbl == -1)
throw new Exception("エラー:" + p.get_errmsg());
tbl = p.add_table_cell(tbl, 1, 4, "Benefit", optlist);
if (tbl == -1)
throw new Exception("エラー:" + p.get_errmsg());
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);
if (tbl == -1)
throw new Exception("エラー:" + p.get_errmsg());
234
第 8 章 : テキス ト ・ 表組版
手順 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);
if (tf == -1)
throw new Exception("Error: " + p.get_errmsg());
取得 し た テ キ ス ト フ ロ ーハン ド ルは、 表セルを追加する 時に使い ます。 テ キ ス ト フ ロ ーの
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);
if (tbl == -1)
throw new Exception("エラー:" + p.get_errmsg());
手順 5 : テキス ト 行の入 っ た画像セル を追加 5 番目の手順 と し て、Giant Wing 紙飛行機
の画像 と テ キ ス ト 行 Amazingly robust! の入っ たセルを追加 し ま し ょ う 。 こ のセルは 2 行
目の 3 列目で始ま り 、 3 つの行に ま たが り ます。 列幅は 90 ポ イ ン ト です。 セルの余白は 4
ポ イ ン ト に設定 し ます。 1 つ目の例 と し ては TIFF 画像を セル内に配置 し てみま し ょ う 。
image = p.load_image("auto", "kraxi_logo.tif", "");
if (image == -1)
throw new Exception("エラー:" + p.get_errmsg());
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);
if (tbl == -1)
throw new Exception("エラー:" + p.get_errmsg());
あ る いは、 画像は PDF ページ と し て取 り 込む こ と も で き ます。 PDI ページ を閉 じ る のは必
ず、 PDF_fit_table( ) を呼び出 し た後に し て く だ さ い。
int doc = p.open_pdi("kraxi_logo.pdf", "", 0);
if (tbl == -1)
throw new Exception("エラー:" + p.get_errmsg());
page = p.open_pdi_page(doc, pageno, "");
if (tbl == -1)
throw new Exception("エラー:" + p.get_errmsg());
8.3 表の組版
235
optlist = "fittextline={font=" + boldfont + " fontsize=9} pdipage=" + page +
" colwidth=" + c3 + " rrowspan=3 margin=4";
tbl = p.add_table_cell(tbl, 3, 2, "Amazingly robust!", optlist);
if (tbl == -1)
throw new Exception("エラー:" + p.get_errmsg());
手順 6 : 表 をはめ込む 最後 の 手順 と し て、 表 を PDF_fit_table( ) で 配置 し ま し ょ う 。
header=1 を用い る と 、 1 行目が表のヘ ッ ダにな り ます。 fill オプシ ョ ン と area=header ・
fillcolor={rgb 0.8 0.8 0.87} サブオプシ ョ ンは、 与え た色でヘ ッ ダ行を塗 る よ う 指定 し てい
ます。 stroke オプシ ョ ン と line=frame linewidth=0.8 サブオプシ ョ ン を用いて、 表の外枠の
線幅を 0.8 と し て定義 し ま し ょ う 。 line=other linewidth=0.3 を用い る と 、 すべてのセルの
罫が線幅 0.3 と し て指定 さ れます。
optlist = "header=1 fill={{area=header fillcolor={rgb 0.8 0.8 0.87}}} " +
"stroke={{line=frame linewidth=0.8} {line=other linewidth=0.3}}";
result = p.fit_table(tbl, llx, lly, urx, ury, optlist);
if (result.equals("_error"))
throw new Exception("エラー:" + p.get_errmsg());
p.end_page_ext("");
8.3.5 表 イ ン ス タ ン ス
1 つのはめ込み枠に配置 さ れた表行群は、 表 イ ン ス タ ン ス を構成 し ます。 表全体を表現す
る には、 複数の表 イ ン ス タ ン ス が必要な こ と も あ り ます。 PDF_fit_table( ) は、 1 回呼び出
さ れ る ご と に、 1 つのはめ込み枠に 1 つの表 イ ン ス タ ン ス を配置 し ます。 こ れ ら のはめ込
み枠は、 同 じ ページに多段組レ イ ア ウ ト 等で配置 し てお く こ と も 、 ま たは複数のページに
配置 し てお く こ と も で き ます。
236
第 8 章 : テキス ト ・ 表組版
図 8.37 の表は、 3 つのページにわた っ てい ます。 各ページに 1 つずつあ る はめ込み枠
に、 各表 イ ン ス タ ン ス が 1 つずつ配置 さ れます。 PDF_fit_table( ) を呼び出すたびに、 最初
の行はヘ ッ ダ と し て定義 さ れ、 最後の行はフ ッ タ と し て定義 さ れます。
図 8.37
表は複数の表イ ン ス タ
ン スに分解 さ れ、 各は
め込み枠に 1 つずつ配
置 さ れます。
Our Paper Plane Models
3 Cone Head Rocket
Material
BenefitOur
Kent paper 200g/sqm
Paper
Plane
Models
This paper
arrow can
be
With big swing!
thrown with big swing. It
2 Long Distance Glider
stays in the air a long time.
Drawing paper 180g/sqm
Material
⴫ࠗࡦࠬ࠲ࡦࠬ
ࡋ࠶࠳
ⴕㅪേ
ࠣ࡞࡯ࡊ
Models
Benefit Our Paper
With this Plane
paper rocket
you
can send all your messages
even when sitting in the
Material
Offset print
paper pretty
220g/sqm
cinema
near the back.
Amazingly robust!
Benefit
It is amazingly robust and
can even do aerobatics. But
it is best suited to gliding.
1 Giant Wing
ࡍ࡯ࠫ3
ࡈ࠶࠲
ࡍ࡯ࠫ2
⴫ߩߪ߼ㄟߺᨒ
ࡍ࡯ࠫ1
下記の コ ー ド は、 表を配置 し き る ま で表 イ ン ス タ ン ス をはめ込みつづけ る ための、 一般的
なループ を示 し ます。 配置す る べ き 表 イ ン ス タ ン ス があ る 限 り 、 そのつど新規ページ を作
成 し ます。
do {
/* 新規ページを作成 */
p.begin_page_ext(0, 0, "width=a4.width height=a4.height");
/* 最初の行をヘッダとして使い、すべての表セルに線をひく */
optlist = "header=1 stroke={{line=other}}";
/* 表インスタンスを配置 */
result = p.fit_table(tbl, llx, lly, urx, ury, optlist);
if (result.equals("_error"))
throw new Exception("エラー:" + p.get_errmsg());
p.end_page_ext("");
} while (result.equals("_boxfull"));
/* 結果を調べる。「_stop」ならすべてOKを意味する。*/
if (!result.equals("_stop")) {
if (result.equals( "_error"))
throw new Exception("エラー:" + p.get_errmsg());
else {
/* これ以外の戻り値はすべて「return」オプションによるユーザー終了。
* これを扱うには専用のコードが必要。*/
throw new Exception ("テキストフロー内でユーザーリターンを検出しました");
}
}
8.3 表の組版
237
/* 表内で使ったテキストフローハンドルも削除される */
p.delete_table(tbl, "");
ヘ ッ ダ ・ フ ッ タ PDF_fit_table( ) で header ・ footer オプシ ョ ン を使えば、 表の最初か最後
の行の数を定義 し て、それが各表 イ ン ス タ ン ス の上端か下端に配置 さ れ る よ う にす る こ と
がで き ます。 fill オプシ ョ ンで area=header か area=footer を使 う と 、 ヘ ッ ダ ・ フ ッ タ を別
の色で塗 る こ と がで き ます。 ヘ ッ ダ行群は表定義の最初の n 行か ら 成 り 、 フ ッ タ 行群は最
後の m 行か ら 成っ てい ます。
ヘ ッ ダ と フ ッ タ は、 PDF_fit_table( ) で表 イ ン ス タ ン ス ご と に指定 し ます。 結果 と し て、
表 イ ン ス タ ン ス ご と に異な る も のに も な り え ます。 すなわち、 ヘ ッ ダ / フ ッ タ をつけた表
イ ン ス タ ン ス と 省いた表 イ ン ス タ ン ス を混在 さ せ る 、 と いっ た こ と も 可能です。 それに よ
り た と えば、 最後の表 イ ン ス タ ン ス で特別な行を指定す る 、 と いっ た こ と も 可能にな り ま
す。
表行の連動 い く つ か の 表 行 を 必 ず 同 じ 表 イ ン ス タ ン ス に 入 れ さ せ た い と き は、
rowjoingroup オプシ ョ ン を使っ て、それ ら を同 じ 表行連動グループに割 り 当て る こ と がで
き ます。 表行連動グループは、 連続す る 複数の表行を持ち ます。 こ のグループの表行はす
べて、 複数の表 イ ン ス タ ン ス に別れ さ せ ら れ る こ と がな く な り ます。
セルで複数表行を連結 し て も 、 それ ら の表行は自動的に連動グループにはな り ません。
はめ込み枠が低すぎ る はめ込み枠が低すぎ て、 必要なヘ ッ ダ ・ フ ッ タ 行 と 、 最低 1 つ
の本体表行ない し 行連動グループが入 ら ない と き は、 表がはめ込み枠に収ま る ま で、 行の
高 さ が一律に縮め ら れます。 ただ し 必要な縮小率が、 vertshrinklimit で設定 し た限界 よ り
も 小 さ い と き は、 縮小は行われずに、 PDF_fit_table( ) は文字列 _error、 ま たはそれぞれの
エ ラ ー メ ッ セージ を返 し ます。 縮小を一切 さ せた く ない と き は、 vertshrinklimit=100% を
使い ます。
はめ込み枠が狭すぎ る 表のはめ込み枠の座標は、PDF_fit_table( ) を呼び出す際に明示的
に与え ます。 与え た列幅を合計 し た実際の表幅が、 その表のはめ込み枠を超え た と き は、
表 が は め 込 み枠 に 収 ま る ま で すべ て の 列 が 縮 め ら れ ま す。 た だ し 必 要 な 縮小 率 が、
horshrinklimit で設定 し た限界 よ り も 小 さ い と き は、 縮小は行われずに、 PDF_fit_table( ) は
文字列 _error、 ま たはそれぞれのエ ラ ー メ ッ セージ を返 し ます。 縮小を一切 さ せた く ない
と き は、 horshrinklimit=100% を使い ます。
セルの分割 セルが行を連結 し てい る 場合、後のほ う の行がはめ込み枠に収ま ら ない と き
は、 そのセルは分割 さ れます。 画像 ・ PDI ページ ・ テ キ ス ト 行セルの場合は、 セル内容は
次の表 イ ン ス タ ン ス で も 繰 り 返 さ れます。 テ キ ス ト フ ロ ーセルの場合は、 セル内容は後の
表行のセルに続 き ます。
238
第 8 章 : テキス ト ・ 表組版
図 8.38 に、 テ キ ス ト フ ロ ーセルが分割 さ れて テ キ ス ト フ ロ ーが次の表行に続いてい る
様子を示 し ます。 図 8.39 に、 画像セルが次の表 イ ン ス タ ン ス の最初の行で繰 り 返 さ れ る
様子を示 し ます。
Material
Offset print paper 220g/sqm
Our paper planes are the
ideal way of passing the
time. We offer revolutionary
Benefit
It is amazingly robust and
can even do aerobatics. But
it is best suited to gliding.
new developments of the
traditional common paper
planes.
1 Giant Wing
⴫ࠗࡦࠬ
࠲ࡦࠬ1
⴫ࠗࡦࠬ
࠲ࡦࠬ2
図 8.38
セルの分割
表行の分割 表のはめ込み枠に最後の本体行が収ま り き ら ない と き 、それは普通は分割 さ
れません。 こ の動作は PDF_fit_table( ) の minrowheight オプシ ョ ン で制御 さ れ、 デフ ォ ル
ト 値は 100% です。 こ のデフ ォ ル ト 設定では、 表行は分割 さ れず、 ま る ご と 次の表 イ ン ス
タ ン スへ配置 さ れます。
minrowheight 値を減 ら せば、 最後の本体行を分割 さ せて、 表行の内容の う ち指定 し た
割合を 1 つ目の部分に、 残 り を次の部分に配置す る こ と がで き ます。
図 8.39 に、 テ キ ス ト フ ロ ー It's amazingly robust…が分割 さ れ、 次の表 イ ン ス タ ン ス の
最初の本体行へテ キ ス ト フ ロ ーが続 く 様子を示 し ます。複数行にわた る 画像セルが分割 さ
れ、 画像は繰 り 返 さ れます。 テ キ ス ト 行 Benefit も 繰 り 返 さ れます。
図 8.39
表行の分割
1 Giant Wing
⴫ࠗࡦࠬ
࠲ࡦࠬ1
⴫ࠗࡦࠬ
࠲ࡦࠬ2
Material
Offset print paper 220g/sqm
Benefit
It is amazingly robust and
can even do aerobatics. But
Benefit
it is best suited to gliding.
8.3.6 表組版のアルゴ リ ズム
こ の項では、 表組版機能が表を配置す る 際に行 う ス テ ッ プ を詳説 し ます。 以下、 横書 き テ
キ ス ト の場合について述べます。 し か し 、 「表行高 さ 」 と 「列幅」 と い う 言葉を互いに入
れ替えれば、 縦書 き や回転テ キ ス ト に も あ ては ま り ます。
PDF_fit_table( ) へ の 最 初 の 呼 び 出 し の 際 に は、 オ プ シ ョ ン colwidth ・ rowheight ・
fittextline ・ fittextflow がすべてのセルについて吟味 さ れ、 表全体の幅 と 高 さ が、 列幅 ・ 表
行高 さ ・ テ キ ス ト 内容に基づいて算出 さ れます。
テキス ト 行 を持つ表セルの高 さ と 幅 を算出 表組版機能は ま ず、 テ キ ス ト 行を持つ表セ
ルの う ち、 colwidth ま たは rowheight のない表列ま たは表行にわた る も のすべてのサ イ ズ
を決定 し ます。 こ れを実現す る ために、 fittextline オプシ ョ ンに従っ てテ キ ス ト 行の、 ひ
いては表セルの幅を算出 し ます。 テ キ ス ト サ イ ズの 2 倍を表セルの高 さ と 見な し ます ( よ
り 正確にい う と boxheight の 2 倍。こ れは、別途指定 さ れない限 り デフ ォ ル ト 値 {capheight
none} を持ち ます) 。 縦書 き テ キ ス ト については、 も っ と も 幅の広いキ ャ ラ ク タ の幅がセ
ル幅 と し て用い ら れます。 西向 き ま たは東向 き のテ キ ス ト については、 テ キ ス ト 高 さ の 2
倍がセル幅 と し て用い ら れます。
8.3 表の組版
239
こ の求め ら れた表セルの幅 と 高 さ が、 そのあ と 、 その表セルがわた る 表列 ま たは表行
の う ち、colwidth ま たは rowheight が指定 さ れていない も のすべてに均等に按分 さ れます。
仮の表サ イ ズ を算出 次の ス テ ッ プ と し て組版機能は、 表の仮の幅 と 高 さ を、 それぞれ
列幅 ・ 表行高 さ すべての合計 と し て算出 し ます。 パーセ ン ト 値で指定 さ れてい る 列幅 と 表
行高 さ は、 先頭はめ込み枠の幅 と 高 さ に基づいて絶対値へ変換 さ れます。 colwidth ま たは
rowheight を持た ない列ま たは表行が ま だあ る 場合には、 仮の表サ イ ズが先頭はめ込み枠
に等 し く な る ま で、 残 り の余白が均等に按分 さ れます。
ですので各表セルに対 し て少な く と も 最小 rowheight は指定 し ておいたほ う が よ いで
し ょ う 。 でない と 表は自動的にはめ込み枠の高 さ に合わせて調整 さ れ る か ら です。
小 さ すぎ る セル を拡大 こ こ で組版機能はすべてのセル内枠を決定 し ます(図8.32参照)。
余白の合計がセルの幅ま たは高 さ よ り 小 さ い と き は、 そのセル枠は、 そのセルに属す る す
べての列 と 表行を均等に拡大す る こ と に よ っ て適切に拡大 さ れます。
テキス ト 行の横方向 をはめ込む 組版機能は、 テ キ ス ト 行を持つすべてのセルの幅を拡
げて、 テ キ ス ト 行が文字サ イ ズ を下げな く て も セルにはめ込め る よ う に し ます。 こ れが可
能でない と き は、 テ キ ス ト 行は自動的に fitmethod=auto で配置 さ れます。 こ れに よ っ て、
テ キ ス ト 行がセル内枠か ら はみ出 さ な い こ と が保証 さ れ ま す。 fittextline オプ シ ョ ン で
fitmethod=auto に設定す る と 、 セル幅が拡が る のを防ぐ こ と がで き ます。
colscalegroup オプシ ョ ン を用い る と 、 同一の列伸縮グループに属す る すべての列が必
ず等 し い幅に伸縮 さ れ る よ う に、 すなわち こ れ ら の幅が統一 さ れて、 グループ内で最 も 広
い幅に合わせ ら れ る よ う にす る こ と がで き ます (図 8.35 参照)。
強制ハ イ フ ネーシ ョ ン を避け る 算出 さ れた表幅がはめ込み枠 よ り 小 さ い と き は、 組版
機能はテ キ ス ト フ ロ ーセルの幅を拡げて、テ キ ス ト が強制ハ イ フ ネーシ ョ ン な し にはめ込
め る よ う に し ます。 こ れはオプシ ョ ン checkwordsplitting=false で回避す る こ と も で き ま
す。 こ の よ う なセルの幅は、 表幅がはめ込み枠の幅に等 し く な る ま で拡げ ら れます。
PDF_info_table( ) の horboxgap キーを用いて、表幅 と はめ込み枠幅の差を取得で き ます。
テキス ト の縦方向 をはめ込む 組版機能は、 すべてのテ キ ス ト 行 ・ テ キ ス ト フ ロ ーセル
の高 さ を拡げて、テ キ ス ト 行ま たはテ キ ス ト フ ロ ーが文字サ イ ズ を下げずにセル内枠には
め込め る よ う 試みます。 ただ し 、 テ キ ス ト 行ま たはテ キ ス ト フ ロ ーに対 し てサブオプシ ョ
ン fitmethod=auto が設定 さ れてい る 場合、 ま たはテ キ ス ト フ ロ ーが continuetextflow オ
プシ ョ ンで他のセルに続いてい る 場合には、 セル高 さ は拡が り ません。
こ のセル高 さ を拡げ る 処理は、 テ キ ス ト 行ま たはテ キ ス ト フ ロ ーを内容 と し て持つセ
ルに対 し てのみ適用 さ れ、 それ以外の種類のセル内容、 すなわち画像 ・ PDI ページ ・ パ ス
オブジ ェ ク ト ・ 注釈 ・ フ ィ ール ド に対 し ては適用 さ れません。
rowscalegroup オプシ ョ ン を用い る と 、 同一の表行伸縮グループに属す る すべての表行
が必ず等 し い高 さ に伸縮 さ れ る よ う にす る こ と がで き ます。
表 を次のはめ込み枠に続け る 算出 さ れた表全体の高 さ がはめ込み枠 よ り も 大 き い (す
なわち、 すべての表セルをはめ込み枠に収め る こ と がで き ない) と き は、 組版機能は、 そ
のはめ込み枠に収ま ら ない初めての表行に出会 う 前に、そのはめ込み枠内に表行を配置す
る こ と を止め ます。
1 つのセルが複数行にわた り 、 そのすべての行がはめ込み枠に収ま ら ない と き は、 こ の
セルは分割 さ れます。 セルが画像 ・ PDI ページ ・ パ ス オブジ ェ ク ト ・ 注釈 ・ フ ォーム フ ィ ー
ル ド を内容 と し て持つ と き は、 repeatcontent=false が指定 さ れていない限 り 、 そのセル内
240
第 8 章 : テキス ト ・ 表組版
容は次のはめ込み枠内で繰 り 返 さ れます。 し か し テ キ ス ト フ ロ ーは、 セルがわた る 後続の
表行に続 き ます (図 8.38 参照)。
rowjoingroup オプシ ョ ン を用い る と 、 1 つの表行連動グループに属す る すべての表行
が必ず 1 つのはめ込み枠内に現れ る よ う にす る こ と がで き ます。ヘ ッ ダ ま たはフ ッ タ に属
す る すべての表行 と 1 つの本体行は、 自動的に表行連動グループ を形成 し ます。 ですので
組版機能は、はめ込み枠に収ま ら ない初めての行に出会 う 前に表行を配置す る こ と を止め
ます (図 8.37 参照)。
return オプシ ョ ン を用い る と 、 対象行を配置 し た後にその表 イ ン ス タ ン ス内に絶対 も
う 表行が配置 さ れない よ う にす る こ と がで き ます。
表行 を分割 表行は、 非常に高い と き 、 ま たは 1 個の本体行 し かない と き には、 分割 さ れ
る こ と があ り ます。 末尾の本体行が表のはめ込み枠に完全に収ま ら ない と き は、 それはま
る ご と 次のはめ込み枠へ移動 さ れます。 こ の動作は PDF_fit_table( ) の minrowheight オプ
シ ョ ン で制御す る こ と がで き ま す。 こ のオプ シ ョ ン のデフ ォ ル ト 値は 100% です。 こ の
minrowheight 値を小 さ く す る と 、 末尾本体行の内容の う ち指定 し た割合がカ レ ン ト はめ
込み枠に配置 さ れ、 その行の残 り は次のはめ込み枠に配置 さ れます (図 8.39 参照)。
PDF_info_table( ) の rowsplit キーを用い る と 、 表行が分割 さ れてい る か ど う か を調べ る
こ と がで き ます。
算出 さ れた表幅 を調節 算出 さ れ る 表幅は、 テ キ ス ト 行の横方向をはめ込んだ後な ど、決
定ス テ ッ プのいずれかの後に、 はめ込み枠 よ り も 大き く な る こ と があ り ます。 こ の場合に
は、 表幅がはめ込み枠の幅に等 し く な る ま で、 すべての列幅が均等に縮め ら れます。 こ の
縮小処理は horshrinklimit オプシ ョ ンに よ っ て制限 さ れます。
PDF_info_table( ) の horshrinking キーを用い る と 、 横縮小倍率を取得す る こ と がで き ま
す。
horshrinklimit の閾値を超え る と 、 下記のエ ラ ー メ ッ セージが現れます :
Calculated table width $1 is too large (> $2, shrinking $3)")
こ こ で $1 は算出 さ れた表幅を示 し 、 $2 は可能な最大の幅、 $3 は horshrinklimit 値です。
表のサ イ ズ を小 さ いはめ込み枠に合わせて調整 直前のはめ込み枠に対 し て算出 さ れた
表幅が、 カ レ ン ト はめ込み枠に対 し て大 き すぎ る と き は、 組版機能は、 表幅がカ レ ン ト は
め込み枠の幅に等 し く な る ま ですべての列を縮め ま す。 ただ し セル内容は調整 さ れ ま せ
ん。 表幅を改めて計算 し なおすには、 PDF_fit_table( ) を rewind=1 をつけて呼び出 し ます。
8.3 表の組版
241
8.4 範囲枠
範囲枠を使 う と 、PDFlib がページ上に何 ら かの内容を配置 し た と き に算出 し た座標を利用
す る こ と がで き ま す。 範囲枠を定義す る には、 そのための専用の関数が あ る わけではな
く 、 実内容を配置す る PDF_fit_textline( ) や PDF_fit_image( ) な ど の関数で matchbox オプ
シ ョ ン を指定 し ます。 範囲枠は さ ま ざ ま な目的に使え ます。
> 範囲枠は装飾で き ます。 例 : 色を塗 る 、 枠線で囲む。
> 範囲枠を使っ て、 注釈 (複数可) を 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 リ フ ァ レ ン ス を参照 し て く だ
さ い。
8.4.1 テキス ト 行 を装飾
テ キ ス ト 行の範囲枠か ら 話を始め ま し ょ う 。 PDF_fit_textline( ) においては範囲枠は、 与え
ら れたテ キ ス ト のテ キ ス ト 枠 と 同 じ にな り ます。 デフ ォ ル ト では、 テ キ ス ト 枠の幅はテ キ
ス ト の幅に等 し く 、 高 さ は、 与え ら れた文字サ イ ズのキ ャ ッ プハ イ ト に等 し く な り ます。
範囲枠の大 き さ を図示す る ために、下記の コ ー ド では範囲枠を青の背景色で塗っ てい ます
(図 8.40a 参照)。
String optlist =
"font=" + normalfont + " fontsize=8 position={left top} " +
"matchbox={fillcolor={rgb 0.8 0.8 0.87} boxheight={capheight none}}";
p.fit_textline("Giant Wing Paper Plane", 2, 20, optlist);
boxheight オプシ ョ ンは、 boxheight={capheight none} がデフ ォ ル ト 設定なので、 省略 し て
も か ま い ません。 boxheight オプシ ョ ンで枠の高 さ を も っ と 増や し てデ ィ セ ン ダ ま で覆 う
よ う にすれば、 よ り 美 し く な り ます (図 8.40b 参照)。
242
第 8 章 : テキス ト ・ 表組版
枠の高 さ を増や し て文字サ イ ズに一致 さ せたい と き は、 boxheight={fontsize descender}
が使え ます (図 8.40c 参照)。
次の ス テ ッ プ と し ては、 範囲枠の左 ・ 右 ・ 下へ変位を加え て拡げ、 枠のすべての端を
テ キ ス ト と 均等な間隔に し てみま し ょ う 。 さ ら に枠線幅を指定 し て、 範囲枠の ま わ り に矩
形を描 き ま し ょ う (図 8.40d 参照)。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/text_on_color ト ピ ッ ク にあ り ます。
図 8.40 さ ま ざ ま なサブオプ シ ョ ンの範囲枠を使 っ て テキス ト 行を装飾
生成 さ れる出力
PDF_fit_textline( ) の matchbox オプ シ ョ ンのサブオプ
ション
a)
Giant Wing Paper Plane
boxheight={capheight none}
b)
Giant Wing Paper Plane
boxheight={ascender descender}
c)
Giant Wing Paper Plane
boxheight={fontsize descender}
d)
Giant Wing Paper Plane
boxheight={fontsize descender} borderwidth=0.3
offsetleft=-2 offsetright=2 offsetbottom=-2
8.4.2 テキス ト フ ロ ーで範囲枠 を利用
テキス ト フ ロ ーの一部分 を装飾 こ の項では、 テ キ ス ト フ ロ ー内の一部のテ キ ス ト を装
飾 し ま し ょ う 。 very dangerous と い う 言葉を マーカーペンの よ う に目立たせま し ょ う 。 こ
れを実現す る には、 言葉を matchbox イ ン ラ イ ンオプシ ョ ン と matchbox=end イ ン ラ イ ン
オプシ ョ ンで挟みます (図 8.41 参照)。
図 8.41 matchbox イ ン ラ イ ンオプ シ ョ ン を含んだテキス ト フ ロー
生成 さ れる出力
It is very dangerous to fly
the Giant Wing in a
thunderstorm.
PDF_create_textflow( ) に対する テキス ト と イ ン ラ イ ン
オプ シ ョ ン
It is <matchbox={fillcolor={rgb 1 0 0}
boxheight={ascender descender}}>very dangerous
<matchbox=end> to fly the Giant Wing in a
thunderstorm.
テキス ト フ ロ ーの範囲枠に Web リ ン ク を追加 今度は、テ キ ス ト フ ロ ーの一部分に Web
リ ン ク を追加 し ま し ょ う 。 1 番目の手順 と し て、 リ ン ク をつけたい部分のテ キ ス ト を示す
kraxi と い う 範囲枠を含んだテ キ ス ト フ ロ ーを作成 し ま し ょ う 。 2 番目に、 URL を開 く ア
ク シ ョ ン を作成 し ま し ょ う 。 3 番目に、 枠が不可視の Link 型の注釈を作成 し ま し ょ う 。 そ
のオプシ ョ ン リ ス ト の中で、 範囲枠 kraxi を参照 し て リ ン ク の矩形 と し て使い ま し ょ う
(PDF_create_annotation( ) の矩形の座標は無視 さ れます)。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの text_output/weblink_in_textflow ト ピ ッ ク にあ り
ます。
/* 範囲枠「kraxi」を含んだテキストフローを作成してはめ込み */
String tftext =
"For more information about the Giant Wing Paper Plane see the Web site of " +
"<underline=true matchbox={name=kraxi boxheight={fontsize descender}}>" +
"Kraxi Systems, Inc.<matchbox=end underline=false>";
8.4 範囲枠
243
String optlist = "font=" + normalfont + " fontsize=8 leading=110%";
tflow = p.create_textflow(tftext, optlist);
if (tflow == -1)
throw new Exception("エラー:" + p.get_errmsg());
result = p.fit_textflow(tflow, 0, 0, 50, 70, "fitmethod=auto");
if (!result.equals("_stop"))
{ /* ... */ }
/* URIアクションを作成 */
optlist = "url={http://www.kraxi.com}";
act = p.create_action("URI", optlist);
/* 範囲枠「kraxi」上にLink注釈を作成 */
optlist = "action={activate " + act + "} linewidth=0 usematchbox={kraxi}";
p.create_annotation(0, 0, 0, 0, "Link", optlist);
テ キ ス ト が複数の行にわた る 場合で も 、 1 回 PDF_create_annotation( ) を呼び出すだけで、
適切な数の リ ン ク 注釈が自動的に作成 さ れます。 結果を図 8.42 に示 し ます。
For information about
Giant Wing Paper
Planes see the Web
site of Kraxi Systems,
Inc.
図 8.42
テキス ト フ ローの一部分に
Web リ ン ク を追加
8.4.3 範囲枠 と 画像
画像に リ ン ク を追加 画像で覆われた領域に Web リ ン ク を追加す る には、 画像の範囲枠
が使え ます。 コ ー ド は先述の 243 ページ 「テ キ ス ト フ ロ ーの範囲枠に Web リ ン ク を追加」
と 同 じ です。 ただ し 、 テ キ ス ト フ ロ ーを配置す る のでな く 、 画像を次のオプシ ョ ン リ ス ト
を使っ てはめ込みます。
String optlist = "boxsize={130 130} fitmethod=meet matchbox={name=kraxi}";
p.fit_image(image, 10, 10, optlist);
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの interactive/link_annotations ト ピ ッ ク にあ り ま
す。
画像にふ ち を つけ る こ の例では、 画像の範囲枠を使っ て、 画像の ま わ り にふち をつけ
ま し ょ う 。 画像に fitmethod=meet を使っ て、 縦横比を保ちつつま る ご と 、 与え ら れた枠
に収め ま し ょ う 。borderwidth サブオプシ ョ ン を使っ た matchbox オプシ ョ ン を使っ て、画
像の ま わ り に太い枠を描 き ま し ょ う 。strokecolor サブオプシ ョ ンで枠の色を決め、linecap・
linejoin サブオプシ ョ ン を使っ て角を丸め ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの images/frame_around_image ト ピ ッ ク にあ り ます。
範囲枠はつねに画像 よ り 前の時点で描かれ る ので、 一部が画像で隠 さ れて し ま い ます。 こ
れを避け る ために、 枠の幅の 50 パーセ ン ト の offset サブオプシ ョ ン群を使っ て、 画像が
覆 う 領域 よ り も ふち を大 き く し ま し ょ う 。 あ る いは、 枠を その分太 く す る と い う 方法 も あ
244
第 8 章 : テキス ト ・ 表組版
り ます。 図 8.43 に、 ふち をつけ る ために PDF_fit_image( ) で使 う オプシ ョ ン リ ス ト を示 し
ます。
図 8.43 画像の範囲枠を使っ て画像にふち をつける
生成 さ れる出力
PDF_fit_image( ) に対する オプ シ ョ ン リ ス ト
boxsize={60 60} position={center} fitmethod=meet
matchbox={name=kraxi borderwidth=4 offsetleft=-2 offsetright=2
offsetbottom=-2 offsettop=2 linecap=round linejoin=round
strokecolor {rgb 0.0 0.3 0.3}}
テキス ト を画像に整列 さ せ る 以下の コ ー ド は、 縦方向のテ キ ス ト を、 画像の右余白に
合わせ る 方法を示 し てい ます。 画像ははめ込み方式 meet を用いて、 与え ら れた枠に縦横
比を保っ てはめ込まれてい ます。 はめ込み枠の具体的な座標は PDF_info_matchbox( ) で取
得 さ れ、 縦方向のテ キ ス ト ははめ込み枠の右下隅 (x2, y2) に合わせて配置 さ れてい ます。
範囲枠の辺は描線 さ れてい ます (図 8.44 参照)。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの images/align_text_at_image ト ピ ッ ク にあ り ま
す。
/* このオプションリストを使って画像を読み込んではめ込む */
String optlist = "boxsize={300 200} position={center} fitmethod=meet " +
"matchbox={name=giantwing borderwidth=3 strokecolor={rgb 0.85 0.83 0.85}}";
/* 画像を読み込んではめ込む */
/* 範囲枠の右下(第二)隅の座標を取得 */
if ((int) p.info_matchbox("giantwing", 1, "exists") == 1)
{
x1 = p.info_matchbox("giantwing", 1, "x2");
y1 = p.info_matchbox("giantwing", 1, "y2");
}
/* その隅から2だけ間隔をあけてテキスト行を開始 */
p.fit_textline("Foto: Kraxi", x2+2, y2+2, "font=" + font + " fontsize=8 orientate=west");
図 8.44 画像の範囲枠の座標を使っ て テキス ト 行をはめ込む
生成 さ れる出力
生成手順
Foto: Kraxi
手順 1 : 画像を範囲枠 と と も にはめ込み
(x2, y2)
手順 2 : 範囲枠情報を得て座標 (x2, y2) を取得
手順 3 : 取得 し た座標 (x2, y2) か ら orientate=west オプ シ ョ ン で テ
キス ト 行を開始
8.4 範囲枠
245
246
第 8 章 : テキス ト ・ 表組版
9 pCOS イ ン タ フ ェ ース
pCOS (PDFlib Comprehensive Object Syntax) イ ン タ フ ェース は、 PDF 文書のページ内容記
述以外のすべてのセ ク シ ョ ン、 すなわちページサ イ ズ ・ メ タ デー タ ・ イ ン タ ラ ク テ ィ ブ要
素な ど か ら 任意の情報を取得で き る 簡単でエ レ ガ ン ト な機能を提供 し ます。
pCOS イ ン タ フ ェース の利用例 と 、 pCOS パ ス文法の説明は、 別文書 と し て入手可能な
pCOS パス リ フ ァ レ ン ス にあ り ます。 さ ら な る 作成例が下記の pCOS ク ッ ク ブ ッ ク にあ り
ます :
www.pdflib.com/pcos-cookbook/
247
248
第 9 章 : pCOS イ ン タ フ ェ ース (COM ・ .NET ・ REALbasic エデ ィ シ ョ ン)
10 PDF のバージ ョ ン と 規格
10.1 Acrobat ・ PDF のバージ ョ ン
ユーザー側での選択に従い、PDFlib は下記の PDF バージ ョ ンに従っ た出力を生成 し ます:
> PDF 1.3 (Acrobat 4)
> PDF 1.4 (Acrobat 5)
> PDF 1.5 (Acrobat 6)
> PDF 1.6 (Acrobat 7)
> PDF 1.7 (Acrobat 8)。 技術的には ISO 32 000-1 と 同等
> PDF 1.7 Adobe 拡張レベル 3 (Acrobat 9)
> PDF 1.7 Adobe 拡張レベル 8 (Acrobat X)
PDF 出力のバージ ョ ンは、 PDF_begin_document( ) の compatibility オプシ ョ ン で制御す る
こ と がで き ます。 それぞれの PDF 互換モー ド においては、 それ よ り も 高い レベルのため
の PDFlib 機能は利用で き ません (表 10.1 参照)。 その よ う な機能を利用 し よ う と す る と 例
外が発生 し ます。
PDI で取 り 込む文書の PDF バージ ョ ン ど の互換モー ド において も 、PDI で取 り 込め る の
はそれ以下の PDF バージ ョ ンの PDF 文書だけです。 それ よ り 新 し い PDF バージ ョ ンの
PDF を取 り 込む必要があ る 場合は、 それに合っ た compatibility オプシ ョ ン を設定す る 必
要があ り ます (186 ページ 「7.2.3 受け入れ可能な PDF 文書」 参照)。 ただ し こ の上位 PDF
バージ ョ ン取 り 込み不可ルールの例外 と し て、PDF 1.7 拡張レベル 3 (Acrobat 9) ・ PDF 1.7
拡張レベル 8 (Acrobat X) に従っ た文書は PDF 1.7 文書へ も 取 り 込む こ と が可能です。
文書の PDF バージ ョ ン を変更 あ る 特定の PDF バージ ョ ンに従っ て出力を生成す る 必要
があ る に も かかわ ら ず、 それ よ り も 高い PDF バージ ョ ン を用いた PDF を取 り 込む必要が
あ る 場合には、 その文書を PDI で取 り 込む前に まず、 出力 し たい PDF バージ ョ ンに下げ
る 変換を行 う 必要があ り ます。 Acrobat 7/8/9 Professional で メ ニ ュ ー項目 「ア ド バン ス ト 」
→ 「PDF の最適化」 → 「互換性」 を、 あ る いは Acrobat X で 「フ ァ イル」 → 「名前を付け
て保存 ...」 → 「最適化 さ れた PDF...」 を用いれば、 PDF バージ ョ ン を下記の よ う に変え る
こ と がで き ます :
> Acrobat 7 : PDF 1.3 ~ PDF 1.6
> Acrobat 8 : PDF 1.3 ~ PDF 1.7
> Acrobat 9 : PDF 1.3 ~ PDF 1.7 拡張レベル 3
> Acrobat X : PDF 1.3 ~ PDF 1.7 拡張レベル 8
表 10.1 特定の PDF 互換モー ド を要する PDFlib 機能一覧
機能
PDFlib API 関数 ・ オプ シ ョ ン
PDF 1.7 拡張レ ベル 8 (Acrobat X) を要する機能
PDF/X-4:2010 でのレ イ ヤーの直
接使用 (レ イ ヤーバ リ ア ン ト な
し)
PDF_set_layer_dependency( ) : オプ シ ョ ン createorderlist
10.1 Acrobat ・ PDF のバージ ョ ン
249
表 10.1 特定の PDF 互換モー ド を要する PDFlib 機能一覧
機能
PDFlib API 関数 ・ オプ シ ョ ン
PDF 1.7 拡張レ ベル 3 (Acrobat 9) を要する機能
地理空間 PDF
PDF_begin_document( ) : オプ シ ョ ン viewports
PDF_load_image( ) : オプ シ ョ ン georeference
フ ォ ルダのある PDF ポー ト フ ォ
リオ
PDF_add_portfolio_folder( )
256 ビ ッ ト キーに よ る AES 暗号化 PDF_begin_document( ) : 256 ビ ッ ト に よ る AES 暗号化は、
compatibility=1.7ext3 の場合、 masterpassword ・ userpassword ・
attachmentpassword ・ permissions オプ シ ョ ンのいずれかが与え られている
と きは自動的に用い ら れます。
レ イ ヤーバ リ ア ン ト
PDF_set_layer_dependency( ) : 依存種別 Variant
( こ の機能は PDF 1.7 ext 3 を要 し ませんが、 Acrobat 9 で し か動作 し ません)
参照 PDF
PDF_open_pdi_page( ) ・ PDF_begin_template_ext( ) の reference オプ シ ョ ン
( こ の機能は PDF 1.7 ext 3 を要 し ませんが、 Acrobat 9 で し か動作 し ません)
PRC 形式の 3D モデルの埋め込み
PDF_load_3ddata( ) : オプ シ ョ ン type=PRC
バー コ ー ド フ ィ ール ド
PDF_create_field( ) ・ PDF_create_fieldgroup( ) : オプ シ ョ ン barcode
PDF 1.7 (Acrobat 8) を要する機能
PDF ポー ト フ ォ リ オ
PDF_begin_document( ) : オプ シ ョ ン portfolio
PDF_add_portfolio_file( )
添付に Unicode フ ァ イル名
PDF_begin/end_document( ) : オプ シ ョ ン attachments、 サブオプ シ ョ ン
filename
PDF 1.6 (Acrobat 7) を要する機能
ユーザー単位
PDF_begin/end_document( ) : オプ シ ョ ン userunit
印刷の拡縮
PDF_begin/end_document( ) : viewerpreferences オプ シ ョ ン に対するサブオ
プ シ ョ ン printscaling
文書を開 く モー ド
PDF_begin/end_document( ) : オプ シ ョ ン openmode=attachments
128 ビ ッ ト キーに よ る AES 暗号化 PDF_begin_document( ) : AES 暗号化は、 compatibility=1.6 ま たは 1.7 の場
合、 masterpassword ・ userpassword ・ attachmentpassword ・ permissions オ
プ シ ョ ンのいずれかが与え ら れている と きは自動的に用い られます。
フ ァ イル添付のみを暗号化
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 1.5 (Acrobat 6) を要する機能
さ ま ざ ま な フ ィ ール ド オプ シ ョ ン
PDF_create_field( ) ・ PDF_create_fieldgroup( )
ページ レ イ アウ ト
PDF_begin/end_document( ) : オプ シ ョ ン pagelayout=twopageleft/right
さ ま ざ ま な注釈オプ シ ョ ン
PDF_create_annotation( )
拡張権限設定
PDF_begin_document( ) で permissions=plainmetadata、 表 3.3 参照
250
第 10 章 : PDF のバージ ョ ン と 規格
表 10.1 特定の PDF 互換モー ド を要する PDFlib 機能一覧
機能
PDFlib API 関数 ・ オプ シ ョ ン
日中韓フ ォ ン ト に対する さ ま ざ ま
な CMap
PDF_load_font( )、 表 4.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 が設定 さ れていなければ自動的に生
成 さ れます。
PDF 1.4 (Acrobat 5) を要する機能
スムーズシ ェ ーデ ィ ング (カ ラ ー PDF_shading_pattern( ) ・ PDF_shfill( ) ・ PDF_shading( )
ブレン ド)
ソ フ ト マス ク
1 ビ ッ ト 以上のピ ク セル深度を持つ画像に対 し て masked オプ シ ョ ン をつけ
て PDF_load_image( )
JBIG2 画像
PDF_load_image( ) で imagetype=jbig2
128 ビ ッ ト 暗号化
userpassword ・ masterpassword ・ permissions オプ シ ョ ン をつけて PDF_
begin_document( )
拡張権限設定
permissions オプ シ ョ ン をつけて PDF_begin_document( )、 表 3.3 参照
日中韓フ ォ ン ト に対する さ ま ざ ま
な CMap
PDF_load_font( )、 表 4.3 参照
透過な どのグ ラ フ ィ ッ ク 状態オプ
ション
オプ シ ョ ン alphaisshape ・ blendmode ・ opacityfill ・ opacitystroke ・
textknockout をつけて PDF_create_gstate( )
ア ク シ ョ ン に対する さ ま ざ ま なオ PDF_create_action( )
プシ ョ ン
注釈に対する さ ま ざ ま なオプ シ ョ
ン
PDF_create_annotation( )
さ ま ざ ま な フ ィ ール ド オプ シ ョ ン
PDF_create_field( ) ・ PDF_create_fieldgroup( )
タ グ付き PDF
PDF_begin_document( ) で tagged オプ シ ョ ン
参照 PDF
PDF_open_pdi_page( ) ・ PDF_begin_template_ext( ) で reference オプ シ ョ ン (た
だ し 、 この機能は正 し く 表示 / 印刷 さ れるには Acrobat 9 を要 し ます)
10.1 Acrobat ・ PDF のバージ ョ ン
251
10.2 ISO 32000
PDF 1.7 は、 ISO 32000-1 と し て 標準化 さ れ て い ま す。 こ の国際標準の技術的内容は、
Acrobat 8 に フ ァ イ ル形式であ る Adobe の PDF 1.7 と 等価です。PDFlib は Adobe の PDF リ
フ ァ レ ン ス に忠実に準拠 し てい ますので、 ひいては ISO 32000-1 に も 忠実に準拠 し てい ま
す。 ただ し 、 現在の と こ ろ ISO 32000-1 準拠をチ ェ ッ ク す る 検証 ソ フ ト ウ ェ アは得 ら れま
せん。
執筆時点で、 こ の ISO 規格の次のバージ ョ ンが、 ISO 32000-2 の名の も と に用意 さ れつ
つあ り ます。 こ の規格は、 GeoPDF、 ヒ エ ラ ルキー構造のポー ト フ ォ リ オ、 AES-25 暗号化
と いっ た Acrobat 9 の機能 (詳 し い一覧は表 10.1 を参照) を取 り 込んだ も ので、 PDFlib は
compatibility=pdf1.7ext3 設定で こ れに現時点で対応 し てい ます。
252
第 10 章 : PDF のバージ ョ ン と 規格
10.3 PDF/X に よ る印刷出力
10.3.1 PDF/X 規格 フ ァ ミ リ
PDF/X 形式群は、 ISO 15930 規格フ ァ ミ リ で記述 さ れ、 商業印刷に適 し たデー タ の受け渡
し に利用で き る 一貫 し た堅牢な PDF のサブ セ ッ ト を 提供す る た めに努力 し て い ま す。
PDFlib は、 以下に説明す る 種類の PDF/X に準拠 し た出力を生成 し 入力を処理す る こ と が
で き ます。
PDF/X-1a:2001 (ISO 15930-1 で定義)
こ の 「ブ ラ イ ン ド 交換」 (事前の技術的す り 合わせ
を一切必要 と し ない印刷デー タ のや り 取 り ) 用規格は PDF 1.3 に基づいてお り 、 CMYK ・
ス ポ ッ ト カ ラ ーデー タ に対応 し てい ます。 RGB ・ デバ イ ス独立 (ICC ベース ・ Lab) 色は
明示的に禁止 さ れてい ます。 PDF/X-1a:2001 は、 出版広告のや り 取 り やその他の応用に広
く 利用 さ れてい ます (特に北米で)。
PDF/X-1a:2003 (ISO 15930-4 で定義)
こ の規格は PDF/X-1a:2001 の後継です。 PDF 1.4
に基づいてお り 、 い く つかの機能 (透過な ど) が禁止 さ れてい ま す。 PDF/X-1a:2003 は
PDF/X-3:2003 の厳密なサブセ ッ ト であ り 、 CMYK ・ ス ポ ッ ト カ ラ ー ・ CMYK 出力デバ イ
ス に対応 し てい ます。
注 PANTONE® カ ラ ーは PDF/X-1a モー ド では使え ません。
PDF/X-3:2002 (ISO 15930-3 で定義)
こ の規格は PDF 1.3 に基づいてお り 、グ レース ケー
ル ・ CMYK ・ ス ポ ッ ト カ ラ ーだけでな く デバ イ ス独立色に基づ く 現在の ワー ク フ ロ ーに対
応 し てい ます。 特に ヨ ー ロ ッ パの国々で広 く 利用 さ れてい ます。 出力デバ イ ス と し ては単
色 ・ RGB ・ CMYK のいずれか を使 う こ と がで き ます。
PDF/X-3:2003 (ISO 15930-6 で定義)
こ の規格は PDF/X-3:2002 の後継です。 PDF 1.4 に
基づいてお り 、 い く つかの機能 (透過な ど) が禁止 さ れてい ます。
PDF/X-4 ( ISO 15930-7 で定義)
こ の規格は、PDF/X-1a と PDF/X-3 の後継 と と ら え る こ
と がで き ます。 PDF 1.6 に基づいてお り 、 下記の種類か ら 成 り ます :
> PDF/X-4 では、 透過 と レ イ ヤーは許 さ れますが (い く つかの制限の も と に)、 それ以外
のい く つかの PDF 1.6 の機能は依然禁止 さ れてい ます。
> PDF/X-4p では、出力 イ ン テ ン ト ICC プ ロ フ ァ イ ルを、容量を抑え る ために PDF 文書の
外に置 く こ と が許 さ れます。
PDFlib は、 PDF/X-4 規格の 15930-7:2010 バージ ョ ン を実装 し てい ます。 こ の 2010 バー
ジ ョ ンでは、 レ イ ヤーの取 り 扱いに関 し てい く つかの変更が加え ら れてい ます。 こ の 2010
の機能は、PDF_set_layer_dependency( ) の createorderlist オプシ ョ ン で指定す る こ と がで き
ます。 こ のオプシ ョ ンは PDF/X-4:2008 に対 し ては用い る べ き ではあ り ません。
PDF/X-5 (ISO 15930-8 で定義)
こ の規格は 「部分的交換」 のための も のです。 部分的交
換を行 う には、フ ァ イ ルの作 り 手 と 受け手の間で事前の協議が必要です。PDF/X-4 と PDF/
X-4p の拡張 と と ら え る こ と がで き (すなわち PDF 1.6 に基づいてお り )、 下記の種類か ら
成 り ます :
> PDF/X-5g では、 グ ラ フ ィ ッ ク 内容を PDF 文書の外に許 し てい ます。 こ れは、文書の送
り 手 と 受け手 と の間で何 ら かの コ ミ ュ ニ ケーシ ョ ンが必要です。
10.3 PDF/X によ る印刷出力
253
> PDF/X-5pgでは、外部グ ラ フ ィ ッ ク 内容 と 外部出力 イ ン テ ン ト ICCプ ロ フ ァ イ ルを許 し
ます。
> PDF/X-5n では、n- 顔料の印刷特性に対す る 外部出力 イ ン テ ン ト ICC プ ロ フ ァ イ ルに対
応 し てい ます。 こ の種類は PDFlib では対応 し てい ません。
PDF/X-5 特有の機能を何 も 要 し ない場合は、 文書は PDF/X-4 か PDF/X-4p に従っ て作成
す る べ き です。 なぜな ら こ ち ら のほ う が一般的な規格だか ら です。
ISO 15930-8:2008 規格は、 外部参照グ ラ フ ィ ッ ク に対する XMP 指定項目に関 し て、 い
く つか誤 り を含んでい ます。こ の規格の修正バージ ョ ン ISO 15930-8:2010 が こ の 2008 バー
ジ ョ ン を置 き 換え ます。 PDFlib は、 PDF/X-5 の こ の 2010 バージ ョ ン を実装 し てい ます。
注 PDF/X-5g の検証は、 Acrobat 9 のプ リ フ ラ イ ト では、 外部ページ を参照 し ている場合には
失敗 し ます。 この問題は Acrobat X では修正 さ れています。
10.3.2 PDF/X 準拠出力の生成
ク ッ ク ブ ッ ク PDF/X を生成する ための コ ー ド サン プルが PDFlib ク ッ ク ブ ッ クの pdfx カ テ ゴ リ にあ り ま
す。
PDF/X 準拠出力を PDFlib で作成す る には次の よ う な方法を用い ます。
> PDFlib では、PDF/X のい く つかの形式上の設定は自動的に行われます。PDF バージ ョ ン
番号や PDF/X 準拠キーの設定な ど です。
> PDFlib ク ラ イ ア ン ト では、 あ る 種の関数呼び出 し やオプシ ョ ンは明示的に行 う 必要が
あ り ます。 こ れにあ ては ま る も のを表 10.2 に詳述 し ます。
> PDFlib ク ラ イ ア ン ト では、 あ る 種の関数呼び出 し やオプシ ョ ンは用いない よ う にす る
必要があ り ます。 こ れにあ てはま る も のを表 10.3 に詳述 し ます。
> 既存の PDF/X 準拠文書か ら ページ を取 り 込む際には、上記以外に も 適用 さ れ る 規則が
あ り ます (258 ページ 「10.3.4 PDI に よ る PDF/X 文書の取 り 込み」 参照)。
必要な操作 表 10.2 に、 PDF/X 準拠出力の生成に必要な操作をすべて挙げます。 ど の項
目 も 、 特記な き 限 り 、 すべての PDF/X 準拠レベルにあ ては ま り ます。 PDF/X モー ド の時
に、 必要な関数の う ちのいずれか 1 つで も 呼ばなかっ た場合には、 例外が発生 し ます。
表 10.2 PDF/X 互換のために必要な操作一覧
項目
PDF/X 互換のために必要な PDFlib 関数 ・ オプ シ ョ ン
準拠レ ベル
PDF_begin_document( ) の pdfx オプ シ ョ ン を、 望みの PDF/X 準拠レ ベルに設定する必要が
あ り ます。
出力条件 (出力イ
ンテン ト )
PDF_begin_document( ) の直後に、 PDF_load_iccprofile( ) で usage=outputintent を指定する
か、 または PDF_process_pdi( ) で action=copyoutputintent を指定 し て (ただ し 両方式の併
用は不可) 呼び出す必要があ り ます。 HKS スポ ッ ト カ ラ ー ・ Pantone スポ ッ ト カ ラ ー ・ ICC
ベースのカ ラ ー ・ Lab カ ラ ーの う ちのいずれかが用い られている場合は、 出力デバイ スの
ICC プ ロ フ ァ イルを埋め込む必要があ り ます。 こ の場合、 標準出力条件は許 さ れません。
PDF/X-1a の場合 : 出力デバイ スは、 単色か CMYK のデバイ ス であ る必要があ り ます。
PDF/X-3/4/5 の場合 : 出力デバイ スは、 単色 ・ RGB ・ CMYK いずれかのデバイ ス であ る必
要があ り ます。
フ ォ ン ト 埋め込み
PDF_load_font( ) の embedding オプ シ ョ ン を true に設定 し て ( こ のオプ シ ョ ン を受け取る他
の関数で も 同様) フ ォ ン ト 埋め込みを可能に し ます。 PDF コ ア フ ォ ン ト について も埋め込
みが必要な こ と に注意 し て く だ さ い。
254
第 10 章 : PDF のバージ ョ ン と 規格
表 10.2 PDF/X 互換のために必要な操作一覧
項目
PDF/X 互換のために必要な PDFlib 関数 ・ オプ シ ョ ン
ページ枠
ページボ ッ ク スは、 cropbox ・ bleedbox ・ trimbox ・ artbox オプ シ ョ ン で設定可能ですが、
以下のすべての必要条件を満たす必要があ り ます。
> TrimBox か ArtBox を設定 し なければな り ません。 ただ し 、 両方のボ ッ ク ス項目を設定 し て
はな り ません。 TrimBox も ArtBox も ない場合は PDFlib は CropBox を ( も し あれば)
TrimBox と し て採用 し 、 CropBox も なければ MediaBox を採用 し ます。
> BleedBox が存在する場合、 それは ArtBox と TrimBox の中に収ま っ ていなければな り ませ
ん。
> CropBox が存在する場合、それは ArtBox と TrimBox の中に収ま っ ていなければな り ません。
グ レースケールカ
ラー
PDF/X-3/4/5 : グ レースケール画像 と 、 PDF_setcolor( ) でのグ レー色空間指定は、 出力条件
がグ レースケールまたは CMYK デバイ スの場合か、 あるいは PDF_begin_page_ext( ) で
defaultgray オプ シ ョ ン を設定 し ていた場合にのみ用いる こ と がで き ます。
RGBカ ラ ー
PDF/X-3/4/5 : RGB 画像 と 、 PDF_setcolor( ) での RGB 色空間指定は、 出力条件が RGB デバ
イ スの場合か、 あるいは PDF_begin_page_ext( ) で defaultrgb オプ シ ョ ン を設定 し ていた場
合にのみ用いる こ と がで き ます。
CMYKカ ラ ー
PDF/X-3/4/5 : CMYK 画像 と 、 PDF_setcolor( ) での CMYK 色空間指定は、 出力条件が CMYK
デバイ スの場合か、 あるいは PDF_begin_page_ext( ) で defaultcmyk オプ シ ョ ン を設定 し てい
た場合にのみ用いる こ と がで き ます。
文書情報キー
Creator 情報キー と Title 情報キーを、 PDF_set_info( ) で、 または (PDF/X-4 ・ PDF/X-5
で) PDF_begin/end_document( ) の metadata オプ シ ョ ン で CreatorTool ・ dc:title XMP プ
ロパテ ィ で、 空でない値に設定する必要があ り ます。
禁 じ ら れた操作 表 10.3 に、 PDF/X 準拠出力の生成時には禁 じ ら れてい る 操作をすべて
挙げます。 ど の項目 も 、 特記な き 限 り 、 すべての PDF/X 準拠レベルにあ ては ま り ます。
PDF/X モー ド の時に、 禁 じ ら れた関数の う ちのいずれか 1 つで も 呼んだ場合には、 例外
が発生 し ます。 同様に、 取 り 込まれた PDF ページがカ レ ン ト の PDF/X 準拠レベルに合わ
ない場合、 その PDI 呼び出 し は失敗 し ます。
表 10.3 PDF/X 互換のために禁止ま たは制約 さ れる操作一覧
項目
PDF/X 互換のために禁止ま たは制約 さ れる PDFlib 関数 ・ オプ シ ョ ン
グ レースケールカ
ラー
PDF/X-1a : PDF_begin_page_ext( ) の defaultgray オプ シ ョ ンは避ける必要があ り ます。
RGBカ ラ ー
PDF/X-1a : RGB 画像 と PDF_begin_page_ext( ) の defaultrgb オプ シ ョ ンは避ける必要があ り
ます。
CMYKカ ラ ー
PDF/X-1a : PDF_begin_page_ext( ) の defaultcmyk オプ シ ョ ンは避ける必要があ り ます。
ICCベース カ ラ ー
PDF/X-1a : PDF_setcolor( ) での iccbasedgray/rgb/cmyk 色空間、 および、
setcolor:iccprofilegray/rgb/cmyk パラ メ タ は避ける必要があ り ます。
Labカ ラ ー
PDF/X-1a : PDF_setcolor( ) での Lab 色空間は避ける必要があ り ます。
注釈 ・ フ ォ ーム
フ ィ ール ド
BleedBox (BleedBox が存在 し ない場合は TrimBox か ArtBox ) 内での注釈は避ける必要があ
り ます : PDF_create_annotation( ) ・ PDF_create_field( )。
アクシ ョ ン ・
JavaScript
JavaScript を含むすべてのア ク シ ョ ンは避ける必要があ り ます : PDF_create_action( )。
10.3 PDF/X によ る印刷出力
255
表 10.3 PDF/X 互換のために禁止または制約 さ れる操作一覧
項目
PDF/X 互換のために禁止または制約 さ れる PDFlib 関数 ・ オプ シ ョ ン
画像
PDF/X-1a : RGB ・ ICC-based ・ YCbCr ・ Lab カ ラ ーの画像は避ける必要があ り ます。 着色 さ
れた画像で用い ら れる スポ ッ ト カ ラ ーの代替色も こ れ と 同 じ 条件を満たす必要があ り ます。
PDF/X-1 ・ PDF/X-3 : JBIG2 画像は避ける必要があ り ます。
PDF_load_image( ) の OPI-1.3 ・ OPI-2.0 オプ シ ョ ンは避ける必要があ り ます。
透過画像 ・ グ ラ
フィ ック
PDF/X-1 ・ PDF/X-3 : 画像に対 し て ソ フ ト マ ス クは避ける必要があ り ます。 PDF_load_
image( ) の masked オプ シ ョ ンは、 そのマス ク が 1 ビ ッ ト 画像を参照する場合を除き、 避け
る必要があ り ます。 暗黙的透過 (アル フ ァ チ ャ ン ネル) を持つ画像は許 さ れませんので、
それ らは PDF_load_image( ) の ignoremask オプ シ ョ ン で読み込む必要があ り ます。 PDF_
create_gstate( ) の opacityfill ・ opacitystroke オプ シ ョ ンは、 それらが値 1 を持つ場合を
除き、 避ける必要があ り ます。
透過画像 ・ グ ラ フ ィ ッ ク は PDF/X-4 ・ PDF/X-5 では許 さ れています。
透過グループ
PDF_begin/end_page_ext( ) ・ PDF_begin_template_ext( ) ・ PDF_open_pdi_page( ) の
transparencygroup オプ シ ョ ンは、 PDF/X-1 ・ PDF/X-3 では許 さ れず、 PDF/X-4 ・ PDF/X-5
でのみ許 さ れます。
transparencygroup を用いる場合、 colorspace サブオプ シ ョ ンの値は下記の要件に従 う 必
要があ り ます :
> DeviceGray : PDF/X 出力条件はグ レースケールまたは CMYK デバイ スである必要があ り ま
す。 生成ページについては (テ ン プ レー ト と 取 り 込みページ では不可)、 かわ り に PDF_
begin_page_ext( ) で defaultgray オプ シ ョ ン を設定する こ と も で き ます。
> DeviceRGB : PDF/X 出力条件は RGB デバイ スである必要があ り ます。生成ページについて
は (テ ン プ レー ト と 取 り 込みページ では不可)、 かわ り に PDF_begin_page_ext( ) で
defaultrgb オプ シ ョ ン を設定する こ と も で き ます。
> DeviceCMYK : PDF/X 出力条件は CMYK デバイ スである必要があ り ます。 生成ページにつ
いては (テ ン プ レー ト と 取 り 込みページ では不可)、 かわ り に PDF_begin_page_ext( ) で
defaultcmyk オプ シ ョ ン を設定する こ と も で き ます。
表示設定、 表示 ・
印刷領域
PDF_begin/end_document( ) で viewerpreferences オプ シ ョ ンに対 し て viewarea ・
viewclip ・ printarea ・ printclip サブオプ シ ョ ン を用いる際には、 media ・ bleed 以外の値
は避ける必要があ り ます。
文書情報キー
PDF_set_info( ) で、 Trapped 情報キーに対 し て、 ま たは対応する XMP プ ロパテ ィ
pdf:Trapped に対 し て、 True か False 以外の値は避ける必要があ り ます。
セキ ュ リ テ ィ
PDF_begin_document( ) で userpassword ・ masterpassword ・ permissions オプ シ ョ ンは避け
る必要があ り ます。
PDFバージ ョ ン ・ 互 PDF/X-1a:2001 ・ PDF/X-3:2002 は PDF 1.3 に基づいています。 PDF 1.4 以上を必要 と する操
作 (透過設定やソ フ ト マス ク な ど) は避ける必要があ り ます。
換性
PDF/X-1a:2003 ・ PDF/X-3:2003 は PDF 1.4 に基づいています。 PDF 1.5 以上を必要 と する操
作は避ける必要があ り ます。
PDF/X-4 ・ PDF/X-5 は PDF 1.6 に基づいています。 PDF 1.7 以上を必要 と する操作は避ける
必要があ り ます。
PDF取 り 込み (PDI)
256
取 り 込まれる文書は、 表 10.5 に従っ た互換 PDF/X レ ベルに準拠 し ている必要があ り 、 同 じ
出力イ ン テ ン ト に従っ て作られている必要があ り ます。
第 10 章 : PDF のバージ ョ ン と 規格
表 10.3 PDF/X 互換のために禁止ま たは制約 さ れる操作一覧
項目
PDF/X 互換のために禁止ま たは制約 さ れる PDFlib 関数 ・ オプ シ ョ ン
外部グ ラ フ ィ ッ ク
内容 (参照)
PDF/X-1/3/4 : PDF_begin_template_ext( ) ・ PDF_open_pdi_page( ) で reference オプ シ ョ ンは避
ける必要があ り ます。
PDF/X-5g ・ PDF/X-5pg : PDF_begin_template_ext( ) ・ PDF_open_pdi_page( ) で reference オプ
シ ョ ン で与え る タ ーゲ ッ ト は、 右記の規格のいずれかに準拠 し ている必要があ り ます :
PDF/X-1a:2003 ・ PDF/X-3:2003 ・ PDF/X-4 ・ PDF/X-4p ・ PDF/X-5g ・ PDF/X-5pg。 かつ、 同
じ 出力イ ン テ ン ト に対 し て作成 さ れている必要があ り ます。 特定の XMP メ タ デー タ 項目が
タ ーゲ ッ ト 内に必要ですので、 あ ら ゆる PDF/X 文書が タ ーゲ ッ ト と し て受け入れ可能なわ
けではあ り ません。 PDFlib 8 で生成 さ れた PDF/X 文書は タ ーゲ ッ ト と し て利用可能です。
reference オプ シ ョ ン と 、 必要な Acrobat 設定について詳 し く は、 73 ページ 「3.2.5 外部 PDF
文書内の参照ページ」 を参照 し て く だ さ い。
レ イ ヤー
PDF/X-1 ・ PDF/X-3 : レ イ ヤーは PDF 1.5 を必要 と し ますので、 使用で き ません。
PDF/X-4 ・ PDF/X-5 : レ イ ヤーは使用で き ますが、 特定の PDF/X の規則に従 う 必要があ り
ます :
> レ イ ヤーの可視性は、 個々のレ イ ヤーに対 し て ビ ュ ーア制御を与え るのではな く 、 文書
バ リ ア ン ト で制御する必要があ り ます。 バ リ ア ン ト は、 PDF_set_layer_dependency( )、 引
数 type=variant、 およびバ リ ア ン ト に対する さ ま ざ ま なオプ シ ョ ン で作成で き ます。 残
念なが ら、 レ イヤーバ リ ア ン ト の一覧は Acrobat 9 でのみ表示 さ れ、 Acrobat X では表示
さ れません。
> PDF_define_layer( ) ・ PDF_set_layer_dependency( ) の さ ま ざ ま なオプ シ ョ ンは避ける必要があ
り ます。
> PDF/X-4:2010 : PDF_set_layer_dependency( ) の createorderlist オプ シ ョ ンは許 さ れます。
こ れは、 Acrobat X で レ イ ヤーの一覧を表示 さ せる ために必要です。
フ ァ イルサイ ズ
PDF/X-4 ・ PDF/X-5 : 生成 PDF 文書のフ ァ イルサイ ズは 2 GB を超え てはな ら ず、 PDF オ
ブ ジ ェ ク ト の数は 8,388,607 個未満でなければな り ません。 こ れらの制限について詳 し く は
64 ページ 「3.1.5 大容量 PDF 文書」 を参照 し て く だ さ い。
10.3.3 出力 イ ン テ ン ト と 標準出力条件
出力 イ ン テ ン ト (出力条件 と も いい ます) は、 意図 さ れ る 対象デバ イ ス を定義 し ます。 こ
れは主に、 校正の信頼性を得 る ために有用です。 出力 イ ン テ ン ト は、 名前 と し て指定す る
こ と も で き ます し (標準出力 イ ン テ ン ト と いい ます)、 ICC カ ラ ープ ロ フ ァ イ ルで指定す
る こ と も で き ます。 詳細は PDF/X の種類に よ っ て異な り ます :
> PDF/X-1/3/4 ・ PDF/X-5g : 出力 イ ン テ ン ト に対す る ICC プ ロ フ ァ イ ルを埋め込み こ と
に よ っ て。
> PDF/X-1 ・ PDF/X-3 : 標準出力 イ ン テ ン ト の名前を与え る こ と に よ っ て。 標準出力 イ
ン テ ン ト は、 PDFlib に内部的に知 ら れてい ます。 標準出力 イ ン テ ン ト 名 と 、 それに対
応す る 出力条件の説明の全一覧は、 PDFlib API リ フ ァ レ ン ス を参照 し て く だ さ い。 こ
れ ら の出力 イ ン テ ン ト に対する ICC プ ロ フ ァ イ ルは、 ロ ーカルに得 ら れ る 必要はあ り
ません。追加の標準出力 イ ン テ ン ト を、StandardOutputIntent リ ソ ース カ テ ゴ リ を用い
て定義する こ と も で き ます (59 ページ 「3.1.3 リ ソ ース設定 と フ ァ イ ル検索」 参照) 。
PDF/X 処理 ソ フ ト ウ ェ アに よ っ て認識 さ れ る であ ろ う 標準出力 イ ン テ ン ト の名前だけ
を与え る こ と はユーザー側の役割です。 標準出力 イ ン テ ン ト は下記の よ う に参照で き
ます :
if (p.load_iccprofile("CGATS TR 001", "usage=outputintent") == -1)
{
/* エラー */
}
10.3 PDF/X によ る印刷出力
257
PDF/X-3 出力を生成す る 場合、 HKS ・ PANTONE ・ ICC ベース ・ Lab カ ラ ーのいずれか
を使用す る 際には、 標準出力 イ ン テ ン ト の名前を参照す る だけでは充分ではな く 、 そ
の出力デバ イ ス の ICC プ ロ フ ァ イ ルを埋め込む必要があ り ます。
> PDF/X-4p ・ PDF/X-5pg : 出力 イ ン テ ン ト に対する 外部 ICC プ ロ フ ァ イ ルを参照す る こ
と に よ っ て (規格の名前の中の p は、 外部プ ロ フ ァ イ ルが参照 さ れ る こ と を意味 し て
い ます)。 標準出力 イ ン テ ン ト と 異な り 、 出力 イ ン テ ン ト ICC プ ロ フ ァ イ ルは名前に
よ っ て参照 さ れ る だけではな く 、 文書が生成 さ れ る 際に ICC プ ロ フ ァ イ ルが ロ ーカル
に得 ら れ る 必要があ る 強い参照が作成 さ れます。 こ の ICC プ ロ フ ァ イ ルは PDF 出力に
埋め込まれませんが、 それで も 強い参照を作成する ために こ れは PDF 生成時に得 ら れ
る 必要があ り ます。 urls オプシ ョ ンで、 ICC プ ロ フ ァ イ ルが見つか る 1 個ない し 複数の
URL を与え る 必要があ り ます :
if (p.load_iccprofile("CGATS TR 001",
"usage=outputintent urls={http://www.color.org}") == -1)
{
/* エラー */
}
適切な PDF/X 出力 イ ン テ ン ト を選ぶ PDF/X 出力 イ ン テ ン ト の選択は通常、 印刷出力を
と り し き る 印刷業者 と の話 し 合いで決ま り ます。出力 イ ン テ ン ト の選択に関す る 情報が印
刷所側か ら 出て こ ない と き は、 表 10.4 に挙げ る 標準出力 イ ン テ ン ト を たた き 台 と し て使
用す る こ と も で き ます (PDF/X FAQ よ り 引用)。
表 10.4 代表的な出力条件のための適切な PDF/X 出力イ ン テ ン ト
欧州
北米
雑誌広告
FOGRA28
CGATS TR 00
新聞広告
IFRA26
IFRA30
枚葉オ フ セ ッ ト
用紙に依存 :
用紙に依存 :
タ イ プ 1 ・ 2 ( コ ー ト ) : FOGRA27
グ レー ド 1 ・ 2 (プ レ ミ アム コ ー ト ) :
FOGRA27
タ イ プ 3 (LWC) : FOGRA28
タ イ プ 4 (非 コ ー ト ) : FOGRA29
グ レー ド 5 : CGATS TR 001
非 コ ー ト : FOGRA29
輪転オ フ セ ッ ト
用紙に依存 :
用紙に依存 :
タ イ プ 1 ・ 2 ( コ ー ト ) : FOGRA28
グ レー ド 5 : CGATS TR 001
タ イ プ 4 (非 コ ー ト ・ 白) : FOGRA29
非 コ ー ト (白) : FOGRA29
タ イ プ 5 (非 コ ー ト ・ 黄味) : FOGRA30
非 コ ー ト (黄味) : FOGRA30
10.3.4 PDI に よ る PDF/X 文書の取 り 込み
既存の PDF 文書のページ を PDF-X 準拠の出力文書へ取 り 込む場合には、 特別な規則が適
用 さ れます (詳 し く は 184 ページ 「7.2 PDI で PDF ページ を取 り 込み」 参照)。 取 り 込ま
れ る 文書はすべて、 表 10.5 に従っ た互換 PDF/X 準拠レベルに準拠 し てい る 必要があ り ま
す。 一般則 と し ては、 入力文書が生成出力文書 と 同 じ PDF/X 準拠レベルに準拠 し てい る
場合、 ない し 同 じ レベルの古いバージ ョ ンに準拠 し てい る 場合には利用可能です。 こ れに
加え、 あ る 種の組み合わせ も 利用可能です。 あ る 特定の PDF/X 準拠レベルが PDFlib で設
定 さ れていて、 かつ、 取 り 込まれた文書 も その互換レベルのいずれかを遵守 し てい る な ら
ば、 生成出力はその選択 さ れた PDF/X 準拠レベルに準拠 し てい る こ と が保証 さ れ ます。
取 り 込まれた文書で、 選ばれた PDF/X レベルを遵守 し ていない も のは拒否 さ れます。
258
第 10 章 : PDF のバージ ョ ン と 規格
表 10.5 さ ま ざ ま な PDF/X 出力レ ベルに対する互換 PDF/X 入力レ ベル一覧
PDF/X-4
PDF/X-4p
PDF/X-5g
PDF/X-5pg
可
PDF/X-1a:2003
可
PDF/X-3:2002
可
PDF/X-3:2003
可
可
可
可
PDF/X-4
可
可
可
可
可
可
PDF/X-4p
可
可
可
可
可
可1
PDF/X-5g
可
可
可
可
可
可
可2
可2
PDF/X-5pg
可
可
可
可
可
可1
可2
可 1,2
PDF/X-3:2003
PDF/X-1a:2001
PDF/X-3:2002
PDF/X 出力レ ベル
PDF/X-1a:2001
PDF/X-1a:2003
取 り 込む文書の PDF/X レ ベル
可
可
1. PDF_process_pdi( ) で action=copyoutputintent を指定する と 、 参照が外部出力イ ン テ ン ト ICC プ ロ フ ァ イルへ複製 さ
れます。
2. 取 り 込んだページが参照 XObject を含んでい る と きは、 PDF_open_pdi_page( ) は代理 と 参照の両方を タ ーゲ ッ ト へ コ
ピー し ます。
複数の PDF/X 文書を取 り 込む場合は、 それ ら はすべて同一の出力条件に対 し て作成 さ
れてい る 必要があ り ます。た と えば、CMYK 出力 イ ン テ ン ト を持つ文書だけが、同 じ CMYK
出力 イ ン テ ン ト を用いてい る 文書へ取 り 込む こ と がで き ます。
PDFlib は、 い く つか特定の項目を修正す る こ と はで き ますが、 完全な PDF/X 検証動作
を行っ た り 、 取 り 込み文書に完全な PDF/X 互換を強制 し た り す る よ う には も と も と 作 ら
れてい ません。 た と えば PDFlib は、 取 り 込んだ PDF ページに欠けてい る フ ォ ン ト を埋め
込んだ り は し ません し 、 取 り 込んだページに対 し て色補正な ど も 一切行い ません。
ページ を取 り 込んだ結果 と し てで き る PDF 出力文書が、 入力文書 (1 つま たは複数)
と 同 じ PDF/X 準拠レベル と 出力条件に準拠す る よ う に し たい場合は、 次の よ う に、 取 り
込まれた PDF の PDF/X 状態を取得す る こ と がで き ます。
pdfxlevel = p.pcos_get_string(doc, "pdfx");
こ の ス テー ト メ ン ト は、 取 り 込まれた文書が ISO PDF/X レベルに準拠 し てい る 場合には、
PDF/X 準拠レベルを表す文字列を得ます。 そ う でない場合には none を得ます。 こ の返っ
て き た文字列を用いれば、 PDF_begin_document( ) の pdfx オプシ ョ ン を用いて出力文書の
PDF/X 準拠レベルを適切に設定す る こ と がで き ます。
取 り 込み文書か ら PDF/X 出力 イ ン テ ン ト を コ ピ ー
PDF/X 準拠レベルの取得の他に も 、
次の よ う に、取 り 込まれた文書か ら PDF/X 出力 イ ン テ ン ト を コ ピーす る こ と も で き ます。
ret = p.process_pdi(doc, -1, "action=copyoutputintent");
こ の方法は、 PDF_load_iccprofile( ) に よ る 出力 イ ン テ ン ト 設定のかわ り に利用す る こ と が
で き 、 取 り 込み文書の出力 イ ン テ ン ト を、 生成す る 文書に コ ピー し ます。 こ の出力 イ ン テ
ン ト は、標準名 と ICC プ ロ フ ァ イ ルの ど ち ら で定義 さ れた も ので も か ま い ません。出力 イ
ン テ ン ト を コ ピーす る 方法は、取 り 込まれた PDF/A と PDF/X の文書に対 し て通用 し ます。
10.3 PDF/X によ る印刷出力
259
生成す る 文書の出力 イ ン テ ン ト は、取 り 込み文書の出力 イ ン テ ン ト を コ ピーす る か、あ
る いは明示的に PDF_load_iccprofile( ) で usage=outputintent に し て設定する か、 その ど ち
ら かの方法で必ず一度だけ設定す る 必要があ り ます。
260
第 10 章 : PDF のバージ ョ ン と 規格
10.4 PDF/A に よ る アー カ イ ビ ン グ
10.4.1 各種の PDF/A 規格
ISO 19005 標準で定め ら れた各種の PDF/A 形式は、長期間にわた っ て安全にアーカ イ ブで
き る 、 あ る いは企業や政府の環境において信頼性を持っ たデー タ 交換に利用で き る 、 首尾
一貫、 かつ堅牢な PDF のサブセ ッ ト を提供す る こ と を目的 と し てい ます。
PDF/A 技術セ ン タ ー PDFlib GmbH は PDF/A
技術セ ン タ ー (PDF/A Competence Center) の
創立 メ ン バ ー で す。 こ の 組織 の 目的 は、 ISO
19005 に従っ た長期アーカ イ ビ ン グの分野にお
け る 情報 と 経験の交換の促進です。PDF/A 技術
セ ン タ ーの メ ンバーは、PDF/A 標準 と その実装
に関連す る 情報を積極的に交換 し てお り 、 こ の
テーマ に関す る セ ミ ナーや カ ン フ ァ レ ン ス を
開いてい ます。 詳 し く は PDF/A 技術セ ン タ ー
の ウ ェ ブサ イ ト www.pdfa.org を参照 し て く だ
さ い。
Member of…
ISO 19005-1 で定義 さ れた PDF/A-1a:2005 ・ PDF/A-1b:2005 PDF/A の目的は、 電子文書
の確実な長期保存です。 その規格は PDF 1.4 をベース に、 色 ・ フ ォ ン ト ・ 注釈な ど の要素
の使用にい く つかの制約を課 し てい ます。 下記の 2 種類の PDF/A-1 があ り 、 ど ち ら も
PDFlib で作成 ・ 処理が可能です。
> 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-1a 対応は、 タ グ付 き PDF を制作す る
ための機能に も と づいてい ます (270 ページ 「10.5 タ グ付 き PDF」 参照)。
以下、 PDF/A-1 と 言 う と き (準拠レベルをつけずに) は、 両方の準拠レベルを指す も の
と し ます。
実装根拠 下記の規格 ・ 文書が、 PDFlib の PDF/A-1 の実装根拠を構成 し てい ます :
> PDF/A 規格 (ISO 19005-1:2005)
> 技術正誤表 1 (ISO 19005-1:2005/Cor 1:2007)。
> 技術正誤表 2 (ISO 19005-1:2005/Cor.2:2011)。
> PDF/A 技術セ ン タ ーが発行 し たすべての関連 TechNote。
10.4.2 PDF/A 準拠の出力 を生成
ク ッ ク ブ ッ ク PDF/A を生成する ための コ ー ド サン プルが PDFlib ク ッ ク ブ ッ ク の pdfa カ テ ゴ リ にあ り ま
す。
10.4 PDF/A によ る アー カ イ ビ ング
261
PDFlib に よ る PDF/A 準拠出力の作成は、 以下の手段で実現 さ れます。
> PDF のバージ ョ ン番号や、 PDF/A 準拠キーな ど、 PDF/A のための形式設定のい く つか
は、 PDFlib が自動的に行い ます。
> PDFlib の ク ラ イ ア ン ト プ ロ グ ラ ムにおいて、 表 10.6 に示す特定の関数呼び出 し やオプ
シ ョ ン を明示的に使用す る 必要があ り ます。
> PDFlib の ク ラ イ ア ン ト プ ロ グ ラ ムにおいて、 表 10.7 に示す特定の関数呼び出 し やオプ
シ ョ ン設定を避け る 必要があ り ます。
> 既存の PDF/A 準拠の文書か ら ぺー じ を取 り 込む と き は、 ほかに も 従 う べ き 規則があ り
ます (265 ページ 「10.4.3 PDF/A 文書を PDI で取 り 込み」 参照)。
PDFlib の ク ラ イ ア ン ト プ ロ グ ラ ムが こ れ ら の規則に従 う な ら 、 有効な PDF/A 出力が保証
さ れます。 PDF/A 作成の規則違反を検出 し た と き は、 PDFlib は例外を発生 さ せ る ので、 ア
プ リ ケーシ ョ ン側でそれを処理す る 必要があ り ます。 エ ラ ーが起き る と PDF 出力は作成
さ れません。
PDF/A-1b に必要な操作 PDF/A 準拠の出力 を生成す る た めに必要なすべて の操作 を 表
10.6 に示 し ます。 各項目は、 別記ない限 り 両方の PDF/A 準拠レベルにあ ては ま り ます。
PDF/A モー ド にい る と き に、 必要な関数を も し 1 つで も 呼び出 さ なかっ た場合は、 例外
が発生 し ます。
表 10.6 PDF/A-1 レ ベル A ・ B 準拠のために行 う べき操作一覧
項目
PDF/A 互換のために必要な PDFlib 関数 ・ オプ シ ョ ン
準拠レ ベル
PDF_begin_document( ) の pdfa オプ シ ョ ン に、 求める PDF/A 準拠レ ベル、 すなわち PDF/A1a:2005 か PDF/A-1b:2005 を設定する必要があ り ます。
出力条件 (出力イ
ンテン ト )
デバイ ス依存色空間のグ レ ー ・ RGB ・ CMYK のいずれかが文書で使われている と きは、
PDF_begin_document( ) の直後に、 PDF_load_iccprofile( ) を usage=outputintent に し て呼び出
すか、 または PDF_process_pdi( ) を action=copyoutputintent に し て呼び出す必要があ り ま
す (ただ し 両方式の併用は不可)。 出力イ ン テ ン ト を使 う と きは、 ICC プ ロ フ ァ イルを埋め
込む必要があ り ます (PDF/X と 違っ て PDF/A では、 標準出力条件では不十分です)。 標準
出力条件のためのプ ロ フ ァ イルを埋め込むには、 PDF_load_iccprofile( ) で embedprofile オプ
シ ョ ン を使います。
フォン ト
PDF_load_font( ) で embedding オプ シ ョ ン を true にする必要があ り ます ( こ のオプ シ ョ ン を
受け取る他の関数で も同様)。 PDF コ ア フ ォ ン ト も 埋め込む必要があるので注意 し て く だ さ
い。 ただ し 不可視テキス ト (主に OCR の結果のために有用です) でのみ使われている フ ォ
ン ト は例外で、 埋め込みの必要はあ り ません。 こ れは optimizeinvisible オプ シ ョ ン で制
御で き ます。
グ レースケールカ
ラー
グ レースケール画像 と 、 グ レー色空間によ る PDF_setcolor( ) は、 出力条件がグ レースケー
ル ・ RGB ・ CMYK デバイ スのいずれかであ る場合か、 あ るいは PDF_begin_page_ext( ) で
defaultgray オプ シ ョ ン を設定 し ている場合にのみ用いる こ と がで き ます。
RGBカ ラ ー
RGB 画像 と 、 RGB 色空間に よ る PDF_setcolor( ) は、 出力条件が RGB デバイ スである場合
か、 あ るいは PDF_begin_page_ext( ) で defaultrgb オプ シ ョ ン を設定 し ている場合にのみ用
いる こ と がで き ます。
CMYKカ ラ ー
CMYK 画像 と 、 CMYK 色空間に よ る PDF_setcolor( ) は、 出力条件が CMYK デバイ ス であ る場
合か、 あるいは PDF_begin_page_ext( ) で defaultcmyk オプ シ ョ ン を設定 し ている場合にのみ
用いる こ と がで き ます。
禁止 ・ 制限 さ れ る操作 PDF/A 準拠の出力を生成す る 際に禁止 さ れ る すべての操作を表
10.7 に示 し ます。 各項目は、 別記ない限 り 両方の PDF/A 準拠レベルにあ ては ま り ます。
262
第 10 章 : PDF のバージ ョ ン と 規格
PDF/A モー ド にい る と き に、 禁止 さ れた関数を も し 1 つで も 呼び出 し た場合は、 例外が
発生 し ます。 同様に、 取 り 込んだ PDF 文書がカ レ ン ト の PDF/A 出力レベルに準拠 し てい
なか っ た と き も 、 その PDI 呼び出 し は失敗 し ます。
表 10.7 PDF/A 互換のために禁止 ・ 制限 さ れる操作一覧
項目
PDF/A 互換のために禁止 さ れる PDFlib 関数 ・ オプ シ ョ ン
注釈
PDF_create_annotation( ) : type=FileAttachment の注釈は不可。 テキス ト 注釈の場合には、
zoom ・ rotate オプ シ ョ ン を true に設定 し てはいけません。 annotcolor ・ interiorcolor オ
プ シ ョ ンは、 RGB の出力イ ン テ ン ト が指定 さ れている と き にのみ使 う 必要があ り ます。
fillcolor オプ シ ョ ンは、 RGB か CMYK の出力イ ン テ ン ト が指定 さ れている と き にのみ使
う 必要があ り 、 それぞれ rgb か cmyk 色空間を使 う 必要があ り ます。
フ ォ ーム フ ィ ール
ド
PDF_create_field( ) ・ PDF_create_fieldgroup( ) によ る フ ォ ーム フ ィ ール ド の作成は不可。
アクシ ョ ン ・
JavaScript
PDF_create_action( ) : type=Hide ・ Launch ・ ResetForm ・ ImportData ・ JavaScript のア ク
シ ョ ンは不可。 type=name については NextPage ・ PrevPage ・ FirstPage ・ LastPage のみ可。
画像
PDF_load_image( ) で OPI-1.3 ・ OPI-2.0 オプ シ ョ ン と interpolate=true オプ シ ョ ンは不可。
ICCプ ロ フ ァ イル
PDF_load_iccprofile( ) で明示的に、 あるいは PDF_load_image( ) と ICC タ グ付き画像で暗黙的
に読み込まれる ICC プ ロ フ ァ イルは、 ICC 仕様 ICC.1:1998-09 と 、 その補遺 ICC.1A:1999-04
(内部プ ロ フ ァ イルバージ ョ ン 2.x) に準拠 し ている必要があ り ます。
ページサイ ズ
PDF/A には、 厳格なページサイ ズ制限はあ り ません。 し か し 、 Acrobat での問題を避ける
ため、 ページサイ ズ (幅 ・ 高 さ 、 すべての枠項目) は 3 ~ 14400 ポ イ ン ト (508 cm) の範
囲内に収める こ と を推奨 し ます。
テ ン プ レー ト
PDF_begin_template_ext( ) で OPI-1.3 ・ OPI-2.0 オプ シ ョ ンは不可。
透過
画像に ソ フ ト マ ス ク は不可。 PDF_load_image( ) で masked オプ シ ョ ンは、 マ ス クが 1 ビ ッ ト
画像を参照する場合以外は不可。 暗黙的な透過 (アル フ ァ チ ャ ン ネル) を持つ画像は不可
ですので、 それらは PDF_load_image( ) の ignoremask オプ シ ョ ン で読み込む必要があ り ま
す。
PDF_create_gstate( ) で opacityfill ・ opacitystroke オプ シ ョ ンは、 値 1 以外は不可。
blendmode を使 う 場合は Normal にする こ と 。
PDF_create_annotation( ) で opacity オプ シ ョ ンは不可。
透過グループ
PDF_begin/end_page_ext( ) ・ PDF_begin_template_ext( ) ・ PDF_open_pdi_page( ) の
transparencygroup オプ シ ョ ンは不可。
セキ ュ リ テ ィ
PDF_begin_document( ) で userpassword ・ masterpassword ・ permissions オプ シ ョ ンは不可。
PDFバージ ョ ン/互
換性
PDF/A は PDF 1.4 をベースに し ています。 PDF 1.5 以上を要する操作 (レ イ ヤー等) は不
可。
PDF取 り 込み (PDI)
取 り 込む文書は、 出力文書 と 互換な PDF/A レ ベルに準拠 し ている必要があ り 、 かつ、 互換
な出力イ ン テ ン ト に従っ て作成 さ れている必要があ り ます (表 10.10 参照)。
メ タ デー タ
定義済みの XMP スキーマ (PDFlib API リ フ ァ レ ン ス参照) はすべて使え ます。 それ以外の
スキーマ (拡張スキーマ) を使いたい と きは、 そのスキーマ自体が、 PDF/A 拡張スキーマ
コ ン テナスキーマ を使っ て包含 さ れている必要があ り ます。
外部内容
PDF_begin_template_ext( ) ・ PDF_open_pdi_page( ) で reference オプ シ ョ ンは不可。
フ ァ イルサイ ズ
生成 PDF 文書のフ ァ イルサイ ズは 2 GB を超え てはな ら ず、 PDF オブ ジ ェ ク ト の数は
8,388,607 個未満でなければな り ません。 こ れらの制限について詳 し く は 64 ページ 「3.1.5
大容量 PDF 文書」 を参照 し て く だ さ い。
10.4 PDF/A によ る アー カ イ ビ ング
263
PDF/A-1a で加わる要請 と 制限 PDF/A-1a を作成する と き は、 270 ページ 「10.5 タ グ付 き
PDF」 で述べ る 、 タ グ付 き PDF の出力作成のための要請をすべて守 る 必要があ り ます。 そ
の他に も い く つかの操作が禁止ま たは制約 さ れますので、 それを表 10.9 に示 し ます。
構造情報の適切な作成はユーザー側の役割であ り 、 PDFlib は意味上の制限を検証 も 強
制 も し ません。文書のテ キ ス ト 全体を 1 個の構造要素に入れた ら 、技術的には正 し い PDF/
A-1a ですが、 意味の忠実再生 と い う 目標に反 し てい ますので、 ひいては PDF/A-1a の精
神に も 反 し ます。
表 10.8 PDF/A-1a 準拠のための追加要請一覧
項目
PDF/A-1a 準拠のために必要な PDFlib 関数 ・ オプ シ ョ ン
タ グ付きPDF
タ グ付き PDF に対する要請はすべて守る必要があ り ます (270 ページ 「10.5 タ グ付き PDF」
参照)。
下記を強 く 推奨 し ます。
> デ フ ォ ル ト 文書言語を指定する ためにPDF_begin/end_document( ) で Lang オプ シ ョ ン を与え
るべき です。
> 文書のデ フ ォ ル ト の言語 と 異な る内容項目に対 し てはすべて、 その PDF_begin_item( ) で
Lang オプ シ ョ ン を適切に設定する必要があ り ます。
> 画像な どの非テキス ト の内容項目は、PDF_begin_item( ) で Alt オプ シ ョ ン を使 っ て代替テキ
ス ト 記述を与え る必要があ り ます。
> ロ ゴや記号な どの非 Unicode のテキス ト は、 それを内容項目 と し て包含する PDF_begin_
item( ) で ActualText オプ シ ョ ンに適切な代替テキス ト を与え る必要があ り ます。
> 略語や頭字語は、それを内容項目 と し て包含する PDF_begin_item( ) で E オプ シ ョ ンに適切な
展開テキス ト を与え る必要があ り ます。
注釈
PDF_create_annotation( ) : contents オプ シ ョ ン には、 空でない文字列を与え る必要があ り ま
す。
表 10.9 PDF/A-1a 準拠のために追加で禁止または制約 さ れる操作一覧
項目
PDF/A-1a 準拠のために禁止または制約 さ れる PDFlib 関数 ・ オプ シ ョ ン
フォン ト
PDF_load_font( ) で monospace オプ シ ョ ン と unicodemap=false ・ autocidfont=false は不可
( こ れら のオプ シ ョ ン を受け取る他の関数について も同様)。
PDF取 り 込み (PDI)
取 り 込む文書は、 出力文書 と 互換な PDF/A レ ベルに準拠 し ている必要があ り (表 10.10 参
照)、 かつ、 同 じ 出力イ ン テ ン ト に従っ て作成 さ れている必要があ り ます。
出力 イ ン テ ン ト 出力条件は、 意図す る 対象デバ イ ス を定義 し ま す。 こ れは一貫 し た カ
ラ ーレ ン ダ リ ン グのために重要です。 PDF/X の場合、 出力 イ ン テ ン ト は厳格に必要です
が、 それ と 違っ て PDF/A では、 出力 イ ン テ ン ト は指定す る こ と も で き ますが、 必須では
あ り ません。 出力 イ ン テ ン ト が必要なのは、 デバ イ ス依存色が文書で使われてい る 場合だ
けです。 出力 イ ン テ ン ト は、 ICC プ ロ フ ァ イ ルを使っ て指定する こ と がで き ます。 出力 イ
ン テ ン ト は下記の よ う に指定で き ます。
icc = p.load_iccprofile("sRGB", "usage=outputintent");
ICC プ ロ フ ァ イ ルを読み込む方法のほかに、 出力 イ ン テ ン ト は、 取 り 込んだ PDF/A 文書
か ら コ ピーす る こ と も で き ます。 それには PDF_process_pdi( ) で action=copyoutputintent
オプシ ョ ン を指定 し ます。
264
第 10 章 : PDF のバージ ョ ン と 規格
PDF/A と PDF/X を同時に作成 PDF/A-1 文書は、同時に PDF/X-1a:2003・PDF/X-3:2003・
PDF/X-4 のいずれかに も 準拠 さ せ る こ と が可能です (ただ し PDF/X-4p ・ PDF/X-5 は不
可)。その よ う な コ ン ボ フ ァ イ ルを作成す る には、PDF_begin_document( ) で pdfa オプシ ョ
ン と pdfx オプシ ョ ンに適切な値を与え ます。 例 :
ret = p.begin_document("combo.pdf", "pdfx=PDF/X-4 pdfa=PDF/A-1b:2005");
出力 イ ン テ ン ト は、 PDF/A と PDF/X に対 し て同 じ にす る 必要があ り 、 かつ、 出力デバ イ
ス の ICC プ ロ フ ァ イ ル と し て指定す る 必要があ り ます。 PDF/X の標準出力条件が使え る
のは、 embedprofile オプシ ョ ン と 組み合わせた場合だけにな り ます。
10.4.3 PDF/A 文書を PDI で取 り 込み
PDF/A 準拠の出力文書に既存の PDF 文書を取 り 込む と き は、 特別な規則が適用 さ れます
(PDI について詳 し く は 184 ページ 「7.2 PDI で PDF ページ を取 り 込み」 を参照)。 あ ら ゆ
る 取 り 込み文書は、 表 10.10 に従っ た カ レ ン ト の PDF/A モー ド と 互換な PDF/A 準拠レベ
ルに準拠 し てい る 必要があ り ます。
注 PDFlib は、 入力 PDF 文書の PDF/A 準拠に関する検証は行わず、 また、 任意の入力 PDF か
ら有効な PDF/A を生成する こ と も で き ません。
あ る 特定の PDF/A 準拠レベルが PDFlib で設定 さ れていて、 かつ、 取 り 込んだ文書がそれ
と 互換な レベルを厳守 し てい る な ら ば、 生成 さ れ る 出力は、 選ばれた PDF/A 準拠レベル
に準拠す る こ と が保証 さ れます。 カ レ ン ト の PDF/A レベル と 非互換の文書は PDF_open_
pdi_document( ) で拒絶 さ れます。
表 10.10 各 PDF/A 出力レ ベルに互換な PDF/A 入力レ ベル
取 り 込む文書の PDF/A レ ベル
PDF/A 出力レ ベル
PDF/A-1a:2005
PDF/A-1b:2005
PDF/A-1a:2005
-
可
PDF/A-1b:2005
-
可
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの pdfa/import_pdfa ト ピ ッ ク にあ り ます。
1 個ない し 複数の PDF/A 文書を取 り 込む と き は、そのすべてが表 10.11 に従っ た互換な出
力条件で作成 さ れてい る 必要があ り ます。すべての取 り 込み文書の出力 イ ン テ ン ト は同一
か互換であ る 必要があ り 、 こ の条件を満たす よ う 手配す る のはユーザー側の役割です。
表 10.11 PDF/A 文書を取 り 込む際の出力イ ン テ ン ト の互換性
取 り 込む文書の出力イ ン テ ン ト
生成する文書の出力イ ン テ ン ト
なし
グ レース
ケール
RGB
CMYK
なし
有
-
-
-
グ レースケールの ICC プ ロ フ ァ イル
有
1
有
-
RGB の ICC プ ロ フ ァ イル
有
-
有
CMYK の ICC プ ロ フ ァ イル
有
-
-
-
1
-
有1
1. 取 り 込む文書の出力イ ン テ ン ト と 、 生成する文書の出力イ ン テ ン ト が、 同一であ る必要があ り ます。
10.4 PDF/A によ る アー カ イ ビ ング
265
PDFlib は、 い く つか特定の項目を修正す る こ と はで き ますが、 PDF/A の完全検証に利用
さ れ る よ う に も 、 ま た、 取 り 込んだ文書に完全な PDF/A 準拠を強制す る よ う に も 作 ら れ
てい ません。 た と えば取 り 込んだ PDF のページに足 り ない フ ォ ン ト があ っ て も 、 PDFlib
はそれの埋め込みは し ません。
取 り 込んだページ を連結す る 際に、 で き あが る PDF 出力文書が入力文書 (群) と 同 じ
PDF/A 準拠レベル ・ 出力条件に準拠す る よ う に し たければ、 取 り 込んだ PDF の PDF/A 状
況を下記の よ う に取得す る こ と がで き ます。
pdfalevel = p.pcos_get_string(doc, "pdfa");
こ の命令は、取 り 込んだ文書が PDF/A レベルに準拠 し ていればその PDF/A 準拠レベルを
示す文字列を取得 し 、 そ う でなければ none を返 し ます。 こ の返 さ れた文字列を使えば、
PDF_begin_document( ) で pdfa オプシ ョ ン を使っ て、 出力文書の PDF/A 準拠レベルを適
切に設定す る こ と がで き ます。
取 り 込んだ文書か ら PDF/A 出力 イ ン テ ン ト を コ ピ ー PDF/A準拠レベルを取得す る 以外
の方法 と し て、 PDF/A 出力 イ ン テ ン ト は、 取 り 込んだ文書か ら コ ピーす る こ と も で き ま
す。 PDF/A 文書には必ず し も 出力 イ ン テ ン ト があ る と はかぎ ら ないので (出力 イ ン テ ン
ト が必須な PDF/X と は違い ます)、 それを コ ピー し よ う と する 前に、 まず pCOS を使っ て
出力 イ ン テ ン ト の存在を確かめ る 必要があ り ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの pdfa/import_pdfa ト ピ ッ ク にあ り ます。
こ れは、 PDF_load_iccprofile( ) を使っ て出力 イ ン テ ン ト を設定す る 方法のかわ り に使 う こ
と がで き 、 取 り 込んだ文書の出力 イ ン テ ン ト を、 生成す る 出力文書へ コ ピー し ます。 出力
イ ン テ ン ト の コ ピーは、 取 り 込んだ PDF/A と PDF/X の文書で動作 し ます。
生成す る 出力文書の出力 イ ン テ ン ト は、 取 り 込んだ文書の出力 イ ン テ ン ト を コ ピーす
る か、 あ る いは PDF_load_iccprofile( ) の usage オプシ ョ ンに outputintent を設定 し て明示
的に設定す る か、 そのいずれかの方法で 1 回だけ設定する 必要があ り ます。 出力 イ ン テ ン
ト の設定は、 PDF_begin_document( ) の直後に行 う 必要があ り ます。
10.4.4 PDF/A 作成のための カ ラ ー戦略
PDF/A の色処理に関す る 要請は、 わか り に く い こ と があ る か も し れません。 PDF/A の利
用設計にあ た っ ては、 表 10.12 に ま と めた カ ラ ー戦略が役立つで し ょ う 。 多 く の場面で う
ま く い く 最 も 簡単な アプ ロ ーチは、sRGB 出力 イ ン テ ン ト プ ロ フ ァ イ ルを使 う こ と であ り 、
なぜな ら それは CMYK 以外の代表的な多 く の色空間に対応 し てい る か ら です。 それに加
え て、 sRGB は PDFlib で内部的に既知なので、 外部プ ロ フ ァ イ ルデー タ や設定が一切必要
あ り ません。 色空間の供給元 と し て あ り え る のは以下の と お り です。
> PDF_load_image( ) で取 り 込んだ画像
> PDF_setcolor( ) を使っ た明示的な色指定
> テ キ ス ト フ ロ ー内な ど でのオプシ ョ ン リ ス ト に よ る 色指定
> イ ン タ ラ ク テ ィ ブ要素では枠色の指定が可能
表 10.12 PDF/A のカ ラ ー戦略
文書で使え る色空間
出力イ ン テ ン ト
なし
266
CIELab
可
第 10 章 : PDF のバージ ョ ン と 規格
1
ICC ベース
グ レース
ケール2
RGB2
CMYK2
可
-
-
-
表 10.12 PDF/A のカ ラ ー戦略
文書で使え る色空間
出力イ ン テ ン ト
CIELab
1
ICC ベース
グ レース
ケール2
RGB2
CMYK2
グ レースケールのICCプ ロ
フ ァ イル
可
可
可
-
-
RGBのICCプ ロ フ ァ イル。
例 : sRGB
可
可
可
可
-
CMYKのICCプ ロ フ ァ イル
可
可
可
-
可
1. CIELab カ ラ ーの LZW 圧縮 さ れた TIFF 画像は RGB に変換 さ れます。
2. ICC プ ロ フ ァ イルのないデバイ ス色空間
黒のテ キ ス ト 出力を、 出力 イ ン テ ン ト プ ロ フ ァ イ ルを一切必要 と せずに作成 し たい と き
は、 CIELab 色空間が使え ます。 Lab カ ラ ー値 (0, 0, 0) はデバ イ ス独立な様式で純黒を指定
し 、 出力 イ ン テ ン ト プ ロ フ ァ イ ル一切な し で PDF/A 準拠です (出力 イ ン テ ン ト プ ロ フ ァ
イ ルを必要 と す る DeviceGray と は異な り )。 PDFlib は各ページの冒頭で自動的に、 カ レ ン
ト 色を黒に初期化 し ます。 ICC 出力 イ ン テ ン ト が指定 さ れてい る かいないかに よ っ て、 黒
を選択す る ために DeviceGray と Lab の ど ち ら の色空間が使われ る かが決ま り ます。 手動
で Lab の黒色に設定す る には、 下記の呼び出 し を使い ます。
p.setcolor("fillstroke", "lab", 0, 0, 0, 0);
表 10.12 に挙げた色空間以外に も 、 ス ポ ッ ト カ ラ ーが、 その対応す る 代替色空間に従っ て
使え ます。 PDFlib は内蔵の HKS と PANTONE の ス ポ ッ ト カ ラ ーについては CIELab を代替
色に使っ てい ますので、 こ れ ら はかな ら ず PDF/A で利用可能です。 カ ス タ ムの ス ポ ッ ト
カ ラ ーについては、 PDF/A の出力 イ ン テ ン ト と 互換にな る よ う に代替色空間を選ぶ必要
があ り ます。
注 PDF/A と 色空間に関 し て さ ら に詳 し い情報は、 www.pdfa.org の PDF/A 技術セ ン タ ーの
Technical Note 0002 にあ り ます。
10.4.5 PDF/A のための XMP 文書 メ タ デー タ
PDF/A-1 は、 PDF 文書に メ タ デー タ を埋め込むために、 XMP 形式に強 く 依存 し てい ます。
ISO 19005-1 は XMP 2004 仕様を参照 し てお り 1、 それ よ り 前や後の XMP 仕様には対応 し
てい ません。 PDF/A-1 では、 2 つの種類の文書レベル メ タ デー タ に対応 し てい ます。 1 つ
は、 よ く 知 ら れた メ タ デー タ ス キーマ を集めた も ので、 定義済み ス キーマ と 呼ばれてお
り 、 も う 1 つはカ ス タ ム拡張ス キーマです。 PDFlib は、 XMP の中の必須の PDF/A 準拠項
目群 を 自動的 に 作成す る ほ か、 い く つ か の よ く 使 わ れ る 項目 も 自動的 に 作成 し ま す
(CreationDate 等)。
ユーザーが作成 し た文書 メ タ デー タ は、 PDF_begin/end_document( ) の metadata オプ
シ ョ ンで与え る こ と がで き ます。 PDF/A モー ド では、 PDFlib は、 ユーザーが与え た XMP
文書 メ タ デー タ が PDF/A の要請に準拠 し てい る か ど う か を検証 し ます。 コ ン ポーネ ン ト
レベル (ページ ・ 画像等) の メ タ デー タ については、 PDF/A の要請はあ り ません。
取 り 込み PDF 文書の中の XMP メ タ デー タ は、 pCOS パ ス /Root/Metadata を用いて入
力 PDF か ら 抽出する こ と がで き ます。
1. www.aiim.org/documents/standards/xmpspecification.pdf 参照
10.4 PDF/A によ る アー カ イ ビ ング
267
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クのinterchange/import_xmp_from_pdf ト ピ ッ ク にあ り
ます。
定義済み XMP スキーマ PDF/A-1 では、 XMP 2004 の中のすべての ス キーマに対応 し て
い ます。 こ れ ら は定義済みス キーマ と 呼ばれます。 こ れを表 10.13 に列挙 し 、 あわせてそ
の名前空間 URI と 、 望ま し い名前空間接頭辞を示 し ます。 XMP 2004 の中で列挙 さ れてい
る 定義済みス キーマのプ ロ パテ ィ だけ を使 う 必要があ り ます。 PDF/A-1 のための定義済
み XMP ス キーマの中のすべてのプ ロ パテ ィ の完全な一覧は、 PDF/A 技術セ ン タ ーか ら 得
る こ と がで き ます。
表 10.13 PDF/A-1 のための定義済み XMP スキーマ
スキーマの名称 と 説明
(詳 し く は XMP 2004 を参照)
名前空間 URI
望ま し い
名前空間接頭辞
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
XMP 拡張スキーマ 自分が必要 と す る メ タ デー タ が、 定義済みス キーマに含ま れていな
い と き は、XMP 拡張ス キーマ を定義す る こ と も で き ます。PDF/A-1 では、 カ ス タ ム ス キー
マ を PDF/A 文書に埋め込む際に用いな ければな ら ない拡張方式を記述 し てい ま す。 表
10.14 に、 1 個ない し 複数の拡張ス キーマ を記述す る ために用いなければな ら ない ス キー
マ を ま と め、 あわせてその名前空間 URI と 、 必要な名前空間接頭辞を示 し ます。 名前空間
接頭辞の、 必要な、 と い う 点に注意 し て く だ さ い (定義済みス キーマで示 し た名前空間接
頭辞 と は異な り 、 単に こ う つけ る のが望ま し い と い う だけではな く 、 それぞれ こ の通 り に
つけ る 必要があ り ます)。
PDF/A-1 で使 う XMP 拡張ス キーマ を ど う 構築す る か と い う 詳細は、 こ の説明書の対
象範囲を超え てい ます。 詳 し い方法説明は、 PDF/A 技術セ ン タ ーか ら 得 ら れます。
XMP 文書 メ タ デー タ パ ッ ケージは、 PDF_begin_document( ) か PDF_end_document( ) ま
たはその両方の metadata オプシ ョ ンに与え る こ と がで き ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プル と XMP 作成例がク ッ ク ブ ッ ク の pdfa/pdfa_extension_schema・pdfa/
pdfa_extension_schema_with_type ト ピ ッ ク にあ り ます。
268
第 10 章 : PDF のバージ ョ ン と 規格
表 10.14 PDF/A-1 拡張スキーマ コ ン テナスキーマ と 補助スキーマ
スキーマの名称 と 説明
名前空間 URI1
必要な
名前空間接頭辞
PDF/A 拡張スキーマ コ ン テナスキーマ :
あ ら ゆる拡張スキーマ記述を埋め込むた
めの コ ン テナ
http://www.aiim.org/pdfa/ns/extension/
pdfaExtension
PDF/A スキーマ値種別 : 1 個の拡張ス
キーマが任意個数のプ ロパテ ィ を持つの
を記述
http://www.aiim.org/pdfa/ns/schema#
pdfaSchema
PDF/A プ ロパテ ィ 値種別 : 1 個のプ ロパ
テ ィ を記述
http://www.aiim.org/pdfa/ns/property#
pdfaProperty
PDF/A ValueType 値種別 : 拡張スキーマ
プ ロパテ ィ で用いる カ ス タ ム値種別を記
述。 XMP 2004 の種別一覧にない種別を
使いたい と き にのみ必要 と な り ます。
http://www.aiim.org/pdfa/ns/type#
pdfaType
PDF/A フ ィ ール ド 種別スキーマ : 種別が http://www.aiim.org/pdfa/ns/field#
構造化 さ れている場合に、 その中の
フ ィ ール ド を記述
pdfaField
1. 名前空間 URI は、 ISO 19005-1 では誤 っ て列挙 さ れてお り 、 技術正誤表 1 で修正 さ れま し た。
10.4 PDF/A によ る アー カ イ ビ ング
269
10.5 タ グ付 き PDF
タ グ付 き PDF と はあ る 種の改良 PDF であ り 、 PDF ビ ュ ーアで追加の機能を利用す る こ と
がで き ます。 た と えばア ク セシ ビ リ テ ィ 対応や、 テ キ ス ト の折 り 返 し 表示、 正 し いテ キ ス
ト 抽出、 他の文書形式への変換な ど です。 他の文書形式 と し ては RTF ・ XML な ど が選べ
ます。
PDFlib は タ グ付 き PDF の生成に対応 し てい ます。 ただ し 、 タ グ付き PDF を作成す る
には、 ク ラ イ ア ン ト がその文書の内部構造に関 し て情報を提供 し 、 PDF 出力生成の際にあ
る 種の規則に従 う 必要があ り ます。 PDFlib は、 標準 タ グ名 (標準 タ グの一覧は PDFlib API
リ フ ァ レ ン ス にあ り ます) だけでな く 、 カ ス タ ム タ グに も 対応 し てい ます。 カ ス タ ム タ グ
は、各カ ス タ ム タ グ を標準 タ グ名のいずれか 1 つへマ ッ プす る ロ ールマ ッ プを必要 と し ま
す。
ク ッ ク ブ ッ ク タ グ付き PDF の諸側面に関する コ ー ド サン プルが PDFlib ク ッ ク ブ ッ ク の document_
interchange カ テ ゴ リ にあ り ます。
10.5.1 PDFlib で タ グ付 き PDF を生成
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの document_interchange/starter_tagged ト ピ ッ ク に
あ り ます。
必要な操作 タ グ付 き PDF 出力の生成に必要なすべての操作を表 10.15 に挙げます。 タ
グ付 き PDF モー ド において、 必要な関数を 1 つで も 呼び出 さ なかっ た場合は例外が発生
し ます。
表 10.15 タ グ付き PDF 生成のために行 う べき操作一覧
項目
タ グ付き PDF 互換のために必要な PDFlib 関数 ・ オプ シ ョ ン
タ グ付きPDF出力
PDF_begin_document( ) の tagged オプ シ ョ ン を true に設定する必要があ り ます。
文書言語
PDF_begin_document( ) の lang オプ シ ョ ン を指定 し て文書の自然言語を指定するべき です。
は じ めは文書全体に対 し て設定するべき ですが、 後から任意の構造レ ベルの項目について
それぞれ上書き設定する こ と も 可能です。
構造情報
構造情報 と アーテ ィ フ ァ ク ト はそのよ う に識別指定する必要があ り ます。 内容生成のため
の API 関数はいずれも PDF_begin_item( ) と PDF_end_item( ) と で挟んでい く こ と にな り ます。
Unicode マ ッ ピ ン グ タ グ付 き PDF 内のすべてのテ キ ス ト 内容は、 その文書が必ずア ク
セシブル (た と えば ソ フ ト ウ ェ アで読み上げ可能) にな る よ う に、 正 し い Unicode マ ッ ピ
ン グ を持つ必要があ り ます。PDFlib はほ と ん どすべての フ ォ ン ト / エン コ ーデ ィ ン グの組
み合わせに対 し て内部的に Unicode マ ッ ピ ン グ を生成 し ますので、 PDF 出力は技術的に
Unicode マ ッ ピ ン グ を持ち ます。 し か し 、 い く つかの記号に対 し て生成 さ れ る PUA 値は、
再生可能なテ キ ス ト にはな り ません。 テ キ ス ト の検索性を改善す る ために、 内容の代替テ
キ ス ト を、 PDF_begin_item( ) で ActualText ま たは Alt オプシ ョ ンで与え る こ と を推奨 し ま
す。 タ グ な し PDF モー ド では、 こ れは PDF_begin_mc( ) の ActualText オプシ ョ ンで実現で
き ます。
ページ内容の順序 ページ内容を定義す る テ キ ス ト ・ グ ラ フ ィ ッ ク ・ 画像オペ レ ー タ 群
の順序の こ と を内容ス ト リ ーム順序 と いい ます。 こ れに対 し 、 論理構造ツ リ ーに よ っ て定
義 さ れ る 内容順序の こ と を論理順序 と いい ます。 タ グ付き PDF の生成の際には、 ク ラ イ
ア ン ト は内容順序に関 し て あ る 種の規則に従 う こ と が必要にな り ます。
270
第 10 章 : PDF のバージ ョ ン と 規格
自然でかつ推奨す る 方式は、1 つの構造要素の中の各部分を順番に連続的にすべて生成
し て、 その後に次の要素へ と 次々進んでい く と い う や り 方です。 技術用語でいえば、 構造
ツ リ ーを 1 回の深 さ 優先巡回だけで作成 し よ う と い う こ と です。
も う 1 つの方式は、 避け る べ き 方式ではあ り ますが、 最初の要素を一部分だけ出力 し 、
次の要素へ移っ て ま た一部分だけ出力 し た後、 最初の要素へ戻 り 、 等 と い う や り 方です。
こ の方式では構造ツ リ ーは複数の巡回で作成 さ れ、その一回一回の巡回では 1 つの要素の
一部分 し か生成 さ れません。
PDF に よ る ページ取 り 込み タ グ付 き PDF 文書や、 その他構造情報を含んだ PDF 文書の
中のページは タ グ付 き PDF モー ド では取 り 込む こ と がで き ません。 なぜな ら 取 り 込まれ
た文書構造が、 生成 さ れ る 文書構造 と ぶつかっ て し ま う ためです。
逆に、 構造のない文書の中のページは取 り 込む こ と がで き ます。 ただ し そ う し たペー
ジは、 適切な ActualText で タ グ付け さ れていない限 り 、 Acrobat のア ク セシ ビ リ テ ィ 機能
では 「あ る が ま ま」 に扱われます。
アーテ ィ フ ァ ク ト 著者の書い た も と の内容以外の グ ラ フ ィ ッ ク や テ キ ス ト の こ と を
アーテ ィ フ ァ ク ト と いい ます。 アーテ ィ フ ァ ク ト は Artifact 擬似 タ グ を用いてその よ う に
識別指定す る 必要があ り 、 ま た、 以下のいずれかの種類に分類す る 必要があ り ます。
> ページネーシ ョ ン : 柱や ノ ンブルの よ う な機能。
> レ イ アウ ト : 罫線、 表の影の よ う な組版 ・ デザ イ ン要素。
> ページ : ト ン ボやカ ラ ーバーの よ う な印刷工程補助。
アーテ ィ フ ァ ク ト の識別指定は厳密に必須ではあ り ませんが、テ キ ス ト の折 り 返 し やア ク
セシ ビ リ テ ィ を う ま く 動作 さ せ る には強 く 推奨 し ます。
イ ン ラ イ ン ア イ テム PDF は ブ ロ ッ ク レ ベル構造要素 (BLSE = block-level structure
element) と イ ン ラ イ ン レベル構造要素 (ILSE = inline-level structure element) を定義 し ま
す (厳密な定義は PDFlib API リ フ ァ レ ン ス参照)。 BLSE は他の BLSE を含む こ と も 内容本
体を含む こ と も で き ますが、 ILSE は必ず内容を直接含みます。 こ の他に、 PDFlib では以
下の違いがあ り ます。
表 10.16 通常ア イ テム と イ ン ラ イ ン ア イ テム
通常ア イ テム
イ ン ラ イ ン ア イ テム
対象
すべてのグループ化要素 と すべての ILSE と 非構造 タ
BLSE
グ (擬似 タ グ)
通常かイ ン ラ イ ンかの設定を換え ら れる
×
ASpan ア イ テムだけ可
文書の構造ツ リ ーの一部であ る
○
×
複数ページにわた る こ と がで き る
○
×
他のア イ テムで中断で き る
○
×
一時停止 ・ ア ク テ ィ ブ化で き る
○
×
任意の深 さ に入れ子で き る
○
他のイ ン ラ イ ン ア イ テムに
よ る入れ子のみ
ASpan ア イ テ ム を通常にす る か イ ン ラ イ ンにす る かは ク ラ イ ア ン ト 側で PDF_begin_item( )
の inline オプシ ョ ンで制御 し ます。 た と えば段落が複数ページにわた っ ていた り 複数言語
を 含 ん で い た り す る と き な ど は、 そ の 段落 に 対す る ア ク セ シ ビ リ テ ィ ス パ ン を 通常
10.5 タ グ付き PDF
271
(inline=false) に設定す る こ と を推奨 し ます。 ま たは、 ア イ テ ム を い っ たん閉 じ て、 次の
ページで ま た新 し いア イ テ ム を始めて も よ いで し ょ う 。 イ ン ラ イ ン ア イ テ ムは、 それを開
いたページ上で閉 じ なければな り ません。
推奨操作 タ グ付 き PDF 出力を生成す る 際に必須ではないが推奨 さ れ る すべての操作を
表 10.17 に挙げます。 こ れ ら の機能は厳密に必須ではあ り ませんが、 生成 さ れ る タ グ付 き
PDF 出力の品質を向上 さ せますので、 推奨 し ます。
表 10.17 タ グ付き PDF 生成のために推奨 さ れる操作一覧
項目
タ グ付き PDF 互換のために推奨 さ れる PDFlib 関数 ・ オプ シ ョ ン
ハイ フ ネーシ ョ ン
ワー ド ブ レー ク (単語を行末で二分する) をハー ド ハイ フ ン (U+002D) でな く ソ フ ト ハイ
フ ン (U+00A0) で表現 し ます。
単語間区切 り
単語の間を スペース (U+0020) で区切 り ます。 位置合わせ上厳密に必須でない場合に も 、
そ う する こ と 。 autospace パラ メ タ を使 う と 、 show 関数群の う ちのいずれかを呼び出すた
びにスペースが自動生成 さ れます。
アーテ ィ フ ァ ク ト
純粋な内容を ページ アーテ ィ フ ァ ク ト から区別する ために、 PDF_begin_item( ) で
tag=Artifact を指定 し てアーテ ィ フ ァ ク ト を そのよ う に識別指定 し ます。
Type 3フ ォ ン ト のプ タ グ付き PDF 文書で使われている Type 3 フ ォ ン ト についてはすべて、 PDF_begin_font( ) で
familyname ・ stretch ・ weight オプ シ ョ ンに適切な値を与え る必要があ り ます。
ロパテ ィ
インタ ラ クテ ィ ブ
要素
リ ン ク な どのイ ン タ ラ ク テ ィ ブ要素は、 文書構造に組み込む必要があ り 、 かつ必要に応 じ
て、 代替テキス ト を与え る な ど し て ア ク セシ ブルにする必要があ り ます。 イ ン タ ラ ク テ ィ
ブ要素の タ ブ順は、 PDF_begin/end_document( ) の taborder オプ シ ョ ン で指定で き ます (イ
ン タ ラ ク テ ィ ブ要素が文書構造に適切に組み込んである な ら、 こ れは必須ではあ り ませ
ん)。
10.5.2 直接テキス ト 出力 ・ テキス ト フ ロ ーに よ る タ グ付 き PDF の作成
最小限の タ グ付 き PDF の作成例 次の作成例コ ー ド は非常にシ ンプルな タ グ付 き PDF 文
書を作成す る も のです。 その構造ツ リ ーはただ 1 個の P 要素だけ を含んでい ます。 こ の
コ ー ド では autospace 機能を用いて、 テ キ ス ト 部分ど う し の間に自動的に スペース を生成
さ せてい ます。
if (p.begin_document("hello-tagged.pdf", "tagged=true") == -1)
throw new Exception("エラー:" + p.get_errmsg());
/* テキスト部分どうしの間にスペースを自動作成 */
p.set_parameter("autospace", "true");
/* 最初の構造要素を文書構造ルート(=0)の子として開く */
id = p.begin_item("P", "Title={Simple Paragraph}");
p.begin_page_ext(0, 0, "width=a4.width height=a4.height");
font = p.load_font("Helvetica-Bold", "unicode", "");
p.setfont(font, 24);
p.show_xy("Hello, Tagged PDF!", 50, 700);
p.continue_text("This PDF has a very simple");
p.continue_text("document structure.");
p.end_page_ext("");
272
第 10 章 : PDF のバージ ョ ン と 規格
p.end_item(id);
p.end_document("");
テキス ト フ ロ ーに よ る タ グ付 き PDF の生成 テ キ ス ト フ ロ ー機能 (205 ページ 「8.2 複数
行のテ キ ス ト フ ロ ー」 参照) は、 テ キ ス ト 組版のための さ ま ざ ま な強力な機能を提供 し ま
す。 そ こ ではテ キ ス ト の各部分は も はや ク ラ イ ア ン ト の制御下にはな く 、 PDFlib に よ っ て
自動的に組版 さ れ る ので、 テ キ ス ト フ ロ ーに よ る タ グ付 き PDF の生成の際には以下の よ
う な特別な注意を払 う 必要があ り ます。
> テ キ ス ト フ ロ ーの中で構造要素を入れ る こ と はで き ませんが、1 つのテ キ ス ト フ ロ ーは
め込み枠の内容を ま る ご と 、 1 つの構造要素の中に入れ る こ と はで き ます。
> 1 つのテ キ ス ト フ ロ ーの中のすべての部分(あ る 1 つのテ キ ス ト フ ロ ーハン ド ルに よ る
PDF_fit_textflow( ) に対す る すべての呼び出 し ) は、 ただ 1 つの構造要素の中に入れな
ければな り ません。
> 1 つのテ キ ス ト フ ロ ーの中の各部分は複数のページにわた る 可能性があ り 、その各ペー
ジには他の構造要素が含 ま れ る 可能性があ る ので、 適切な親ア イ テ ム を選ぶ よ う 注意
を払 う 必要があ り ます (親パ ラ メ タ と し て -1 を用い る のは、 間違っ た親要素を指 し 示
し て し ま う か も し れないので、 避け る べ き です)。
> 範囲枠機能を使っ て テ キ ス ト フ ロ ー内に リ ン ク な ど の注釈を作成す る 場合は、 構造ツ
リ ー内におけ る 注釈の位置に対す る 制御を保つ こ と は困難です。
10.5.3 複雑な レ イ ア ウ ト におけ る ア イ テムのア ク テ ィ ブ化
上か ら 下へ素直に流れない複雑な レ イ ア ウ ト におけ る 構造情報の作成を容易にす る ため、
PDFlib はア イ テ ムのア ク テ ィ ブ化 と い う 機能に対応 し てい ます。 こ の機能を利用す る と 、
以前に作成 し た構造要素を ア ク テ ィ ブ化す る こ と がで き ます。 こ の機能は、 開発者が複数
の構造の枝を同時に並行 し て処理 し ていかな ければな ら ない よ う な状況において活用す
る こ と がで き ます。 その際、 それぞれの枝は複数のページにわた っ て も か ま い ません。 こ
の技法が役立つ典型的状況は以下の通 り です。
> 多段組のページ
> 本文の途中に挿入す る 内容。 要約や挿入 コ ラ ム な ど。
> 段組の途中に配置す る 表 ・ イ ラ ス ト 。
ア ク テ ィ ブ化機能を利用す る と 、論理構造の複数の枝ど う し の間を行っ た り 来た り す る こ
と がで き る よ う にな る ので、上記の よ う な状況でページ内容を生成す る こ と が容易にな り
ます。 こ れは、 それぞれの枝を 1 つずつ完了 さ せてい く よ り も ずっ と 効率的です。 ア ク
テ ィ ブ化機能の具体的な利用例 と し て、 図 10.1 に示すページ レ イ ア ウ ト を例に挙げて見
てみま し ょ う 。 こ のページ レ イ ア ウ ト には本文の段組が 2 つあ り 、 その途中に表が 1 つ
と 、 注釈 コ ラ ムの枠線 (背景が影) が 1 つあ っ て、 さ ら にヘ ッ ダ と フ ッ タ も ついてい ます。
ページ内容 を論理順序で生成 論理構造の観点か ら いえばページ内容は次の順序で作成
す る べ き です。 左の段組、 右の段組 (ページの右下部分)、 表、 コ ラ ム、 ヘ ッ ダ ・ フ ッ タ 。
次の擬似 コ ー ド は こ の順序を実装 し てい ます。
/* ページレイアウトを論理構造順序で作成 */
id_art = p.begin_item("Art", "Title=Article");
id_sect1 = p.begin_item("Sect", "Title={First Section}");
/* 1 左の段組の上の部分を作成 */
p.set_text_pos(x1_left, y1_left_top);
...
10.5 タ グ付き PDF
273
図 10.1
複雑なページ レ イ ア
ウ ト を論理構造順序
で作成 し た もの (左)
と 視覚順序で作成 し
た もの (右)。 右側で
は 1 番目の項に対 し て
ア イ テムのア ク テ ィ
ブ化を用いてから 4
と 6 の部分を続けて
いる。
7
1
1
2
6
5
3
2
8
3
4
/* 2 左の段組の下の部分を作成 */
p.set_text_pos(x1_left, y1_left_bottom);
...
/* 3 右の段組の上の部分を作成 */
p.set_text_pos(x1_right, y1_right_top);
...
p.end_item(id_sect1);
id_sect2 = p.begin_item("Sect", "Title={Second Section}");
/* 4 右の段組の下の部分を作成 */
p.set_text_pos(x2_right, y2_right);
...
/* 2番目の項は次ページへ続く可能性あり */
p.end_item(id_sect2);
String optlist = "Title=Table parent=" + id_art;
id_table = p.begin_item("Table", optlist);
/* 5 表の構造と内容を作成 */
p.set_text_pos(x_start_table, y_start_table);
...
p.end_item(id_table);
optlist = "Title=Insert parent=" + id_art;
id_insert = p.begin_item("P", optlist);
/* 6 挿入構造と内容を作成 */
p.set_text_pos(x_start_table, y_start_table);
...
p.end_item(id_insert);
id_artifact = p.begin_item("Artifact", "");
/* 7+8 ヘッダ・フッタを作成 */
p.set_text_pos(x_header, y_header);
...
p.set_text_pos(x_footer, y_footer);
274
5
第 10 章 : PDF のバージ ョ ン と 規格
4
8
6
7
...
p.end_item(id_artifact);
/* 記事は次のページへ続く可能性あり */
...
p.end_item(id_art);
ページ内容 を視覚順序で作成 「論理順序」 式では、 作成者はページ内容を必ず論理順序
で構築 し なければな り ません。 し か し 物に よ っ ては、 次の よ う な視覚順序で作成す る ほ う
が簡単な場合 も あ る で し ょ う 。 ヘ ッ ダ、 左の段組の上の部分、 表、 左の段組の下の部分、
コ ラ ム、 右の段組、 フ ッ タ 。 PDF_activate_item( ) を使えば、 こ の順序を次の よ う に実装す
る こ と がで き ます。
/* ページレイアウトを視覚順序で作成 */
id_header = p.begin_item("Artifact", "");
/* 1 ヘッダを作成 */
p.set_text_pos(x_header, y_header);
...
p.end_item(id_header);
id_art = p.begin_item("Art", "Title=Article");
id_sect1 = p.begin_item("Sect", "Title = {First Section}");
/* 2 左の段組の上の部分を作成 */
p.set_text_pos(x1_left, y1_left_top);
...
String optlist = "Title=Table parent=" + id_art;
id_table = p.begin_item("Table", optlist);
/* 3 表の構造と中身を作成 */
p.set_text_pos(x_start_table, y_start_table);
...
p.end_item(id_table);
/* 1番目の項のつづき */
p.activate_item(id_sect1);
/* 4 左の段組の下の部分を作成 */
p.set_text_pos(x1_left, y1_left_bottom);
...
optlist = "Title=Insert parent=" + id_art;
id_insert = p.begin_item("P", optlist);
/* 5 挿入構造と内容を作成 */
p.set_text_pos(x_start_table, y_start_table);
...
p.end_item(id_insert);
/* 1番目の項のさらにつづき */
p.activate_item(id_sect1);
/* 6 右の段組の上の部分を作成 */
p.set_text_pos(x1_right, y1_right_top);
...
p.end_item(id_sect1);
id_sect2 = p.begin_item("Sect", "Title={Second Section}");
10.5 タ グ付き PDF
275
/* 7 右の段組の下の部分を作成 */
p.set_text_pos(x2_right, y2_right);
...
/* 2番目の項は次ページへ続く可能性あり */
p.end_item(id_sect2);
id_footer = p.begin_item("Artifact", "");
/* 8 フッタを作成 */
p.set_text_pos(x_footer, y_footer);
...
p.end_item(id_footer);
/* 記事は次のページへ続く可能性あり */
...
p.end_item(id_art);
構造要素を こ の順序で処理す る と 、 本文 (1 段半にわた る ) は表 と コ ラ ムで二度中断 さ れ
ます。 そのため、 PDF_activate_item( ) を用いた本文のア ク テ ィ ブ化 も 二度行 う 必要があ り
ます。
こ れ と 同 じ 技法は内容が複数ページにわた る 場合に も 使え ます。 た と えば、 ヘ ッ ダや
その他 コ ラ ム等を まず作成 し たのち、ページの本文要素をふたたびア ク テ ィ ブ化 さ せ る と
よ いで し ょ う 。
10.5.4 Acrobat におけ る タ グ付 き PDF の利用
こ の項では、私達が タ グ付 き PDF 出力を Adobe Acrobat 8/9/X で試験 し てい く なかで得た
知見を述べます。 以下の知見は主 と し て、 Acrobat のバグや動作不安定に関す る も のです。
こ れ ら の知見は、 別記ない限 り Acrobat 8 ・ 9 ・ X にあ ては ま り ます。 回避法を見出 し た も
のについては併せて記載 し てい ます。
Acrobat の折 り 返 し 機能
Acrobat は タ グ付 き PDF 文書を折 り 返す こ と がで き ます。 すな
わち、 ページ内容を その時点の ウ ィ ン ド ウ サ イ ズに合わせて表示 さ せ る こ と が可能です。
タ グ付 き PDF を試験 し てい く なかで私達は Acrobat の折 り 返 し 機能に関 し て以下の よ う な
い く つかの知見を得ま し た。
> ページ上の内容の順序は、 望ま し い折 り 返 し の順序に従 う 必要があ り ます。
> 記号(非 Unicode フ ォ ン ト )は、Acrobat 8 では折 り 返 し を ク ラ ッ シ ュ さ せ る こ と があ り 、
Acrobat 9 では折 り 返 し を無効化す る こ と があ り ます。 こ のため、 そ う し た テ キ ス ト を
Figure 要素の中に入れ る こ と を推奨 し ます。 こ の問題は Acrobat X では修正 さ れてい ま
す。
> BLSE は子要素 と 直接内容の両方を含む こ と がで き ます。 折 り 返 し 機能 (ア ク セシ ビ リ
テ ィ チ ェ ッ カ と 読み上げ も ) を正 し く 動作 さ せ る には、 最初の子要素の前に直接内容
を入れ る こ と を推奨 し ます。
子の種類が混在 し た (すなわち、 ページ内容シーケ ン ス と 非 イ ン ラ イ ン構造要素の両
方) 構造要素は、 リ フ ロ ー失敗の原因 と な る こ と があ り ますので、 避け る べ き です。
> 表 と イ ラ ス ト には BBox オプシ ョ ン を与え る 必要があ り ます。BBox は正確でなければな
り ません。ただ し 、表については左下隅だけが正確に設定 さ れていれば充分です。BBox
項目を与え る かわ り に、 グ ラ フ ィ ッ ク を P ・ H な ど の BLSE タ グの中に作成す る こ と も
で き ます。 し か し 、 折 り 返 し を有効に し た時にベ ク ト ルグ ラ フ ィ ッ ク が表示 さ れな く
な り ます。 ク ラ イ ア ン ト が BBox オプシ ョ ン を与え ない (すなわち自動 BBox 生成に依
276
第 10 章 : PDF のバージ ョ ン と 規格
存す る ) 場合は、 セル枠線な ど のすべての表グ ラ フ ィ ッ ク はその表要素の外で描 く 必
要があ り ます。
> 表要素はその子要素 と し て表関連要素 (TR ・ TD ・ TH ・ THead ・ TBody な ど) だけ を含ま
なければな ら ず、それ以外の要素を一切含んではいけ ません。た と えば、表内で Caption
要素を用い る こ と は タ グ付 き PDF と し ては正 し い と し て も 、 折 り 返 し には問題を生 じ
ます。
> Acrobat 8 ・ 9 : Private タ グの中の内容は他の形式へ書 き 出 さ れません。 し か し 折 り 返 し
と 読み上げの対象にはな る ので、 Private タ グの中の イ ラ ス ト は代替テ キ ス ト を持つ必
要があ り ます。
> topdownオプシ ョ ンで生成 し たPDF文書については折 り 返 し には問題があ る よ う です。
> ア ク テ ィ ブ化 し た ア イ テ ムが内容だけ を含み、 子要素を含ま ない場合には、 折 り 返 し
は失敗す る こ と があ り ます。 特にそのア イ テ ム が別のページでア ク テ ィ ブ化 さ れた場
合に顕著です。 こ の問題は、 ア ク テ ィ ブ化 し た ア イ テ ム を非 イ ン ラ イ ン Span タ グで
ラ ッ プす る こ と で避け る こ と がで き ます。
> Acrobat は、 フ ォーム フ ィ ール ド (電子署名フ ィ ール ド を含む) を持つページ を折 り 返
し で き ず、 その場合は警告が表示 さ れます。
> Acrobat 8 : 折 り 返 し で問題があ る たび、 リ フ ロ ー機能は無効化 さ れ、 その メ ニ ュ ー項
目は無効にな り ます。
Acrobat のア ク セ シ ビ リ テ ィ チ ェ ッ カ Acrobat のア ク セシ ビ リ テ ィ チ ェ ッ カ を利用す る
と 、 ス ク リ ーン リ ーダの よ う な支援技術に対す る タ グ付 き PDF 文書の適合性を調べ る こ
と がで き ます。 い く つかの ヒ ン ト を挙げます :
> も っ と も 重要な こ と と し て、 すべてのページ内容に タ グが付いてい る 必要があ り ます。
タ グ 構造外の内容は ア ク セ シ ブルに な り ま せんの で、 Acrobat の ア ク セ シ ビ リ テ ィ
チ ェ ッ カに よ っ て フ ラ グ さ れます。
> フ ォ ー ム フ ィ ー ル ド を ア ク セ シ ブ ル に す る に は、 PDF_create_field( ) ・ PDF_create_
fieldgroup( ) で tooltip オプシ ョ ン を使い ます。
> ページに注釈があ る と 、 Acrobat は 「 タ ブ順が構造順 と 整合 し ない可能性があ る 」 と 表
示 し ます。
> Alt タ グは Figure タ グについて無視 さ れます。
Acrobat に よ る他の形式への書 き出 し タ グ付 き PDF を利用す る と 、PDF 文書を Acrobat
で XML や RTF な ど の形式で保存す る と き 、 結果が飛躍的に向上 し ます。
> Acrobat 8/9:取 り 込んだ PDF ページが Form タ グ を持っ てい る 場合、ActualText オプシ ョ
ンで与えたテ キ ス ト は Acrobat で他の形式へ書 き 出 さ れますが、 Alt タ グで与えた テ キ
ス ト は無視 さ れます。 し か し 、 読み上げ機能はど ち ら のオプシ ョ ンで も 動作 し ます。
> Acrobat X は内容を 「あ り の ま ま に」 抽出 し ます : Alt ・ ActualText オプシ ョ ンは無視 さ
れます し 、 Private ・ NonStruct タ グ も 無視 さ れます。
> Acrobat 8/9 のみ:NonStruct タ グの内容は HTML 4.01 CSS 1.0 には書 き 出 さ れません( し
か し HTML 3.2 書 き 出 し には用い ら れます)。
> ILSE (た と えば Code ・ Quote ・ Reference) には代替テ キ ス ト を与え る 必要があ り ます。
Alt オプシ ョ ン を用いた場合、 読み上げ機能ではその与え たテ キ ス ト が読まれますが、
他の形式へ書 き 出 さ れ る のは実際の内容にな り ます。ActualText オプシ ョ ン を用いた場
合、 その与えたテ キ ス ト は読み上げ と 書 き 出 し の両方に用い ら れます。
Acrobat の読み上げ機能
タ グ付 き PDF は、 Acrobat の読み上げ機能を改善 し ます。
10.5 タ グ付き PDF
277
> Alt・ActualText を与え る 際にはその先頭に スペース を入れ る と 有用です。そ う し てお く
と 、読み上げ機能はテ キ ス ト を直前の文か ら 区別する こ と がで き ます。同 じ 理由で、末
尾に ピ リ オ ド キ ャ ラ ク タ 「.」 を入れ る の も 有用です。 そ う でない と 、 読み上げ機能は、
前の文の最後の単語 と 、 代替テ キ ス ト の最初の単語 と を、 つなげて読 も う と し て し ま
う でし ょ う 。
278
第 10 章 : PDF のバージ ョ ン と 規格
11 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 カ テ ゴ リ
にあ り ます。
11.1 PDFlib Block Plugin を イ ン ス ト ール
Block Plugin と 、 その姉妹製品であ る PDF フ ォーム フ ィ ール ド 変換プ ラ グ イ ンは、 以下の
バージ ョ ンの Acrobat で動作 し ます :
> Windows 版 Acrobat 8/9/X Standard ・ Professional ・ Pro Extended
> Mac 版 Acrobat 8/9/X Professional
こ のプ ラ グ イ ンは Acrobat Elements では動作せず、 Adobe Reader の ど のバージ ョ ンで も 動
作 し ません。
Windows 版 Acrobat 8/9/X に PDFlib Block Plugin を イ ン ス ト ール PDFlib Block Plugin
と PDF フ ォーム フ ィ ール ド 変換プ ラ グ イ ン を Acrobat に イ ン ス ト ールす る には、 プ ラ グ
イ ンの フ ァ イ ルを Acrobat のプ ラ グ イ ン フ ォ ルダのサブデ ィ レ ク ト リ に入れ る 必要があ り
ます。 こ れは、 プ ラ グ イ ンの イ ン ス ト ー ラ に よ っ て自動的に実行 さ れますが、 手作業で も
で き ます。 プ ラ グ イ ンの フ ァ イ ル名は Block.api と AcroFormConversion.api です。 プ ラ グ イ
ン フ ォ ルダの典型的な場所は下記の よ う にな り ます :
C:\Program Files\Adobe\Acrobat 10.0\Acrobat\plug_ins\PDFlib Block Plugin
Mac 版 Acrobat 8/9/X に PDFlib Block Plugin を イ ン ス ト ール Mac 版 Acrobat 8/9/X で
は、 プ ラ グ イ ン フ ォ ルダは Finder 内で直接見 る こ と がで き ません。 プ ラ グ イ ンの フ ァ イ ル
11.1 PDFlib Block Plugin を イ ン ス ト ール
279
を プ ラ グ イ ン フ ォ ルダに ド ラ ッ グす る のではな く 、 以下の手順を踏みます (Acrobat が動
作 し ていない こ と を確認 し て く だ さ い) :
> デ ィ ス ク イ メ ージ を ダブル ク リ ッ ク し て、 プ ラ グ イ ン フ ァ イ ルを フ ォ ルダへ抽出 し ま
す。
> Adobe Acrobat アプ リ ケーシ ョ ン ア イ コ ン を Finder 内で見つけ ます。通常は次の よ う な
名前の フ ォ ルダ内にあ り ます。
/Applications/Adobe Acrobat 10.0
> こ の Acrobat アプ リ ケーシ ョ ン ア イ コ ン を シ ン グル ク リ ッ ク し て、コ ン テ キ ス ト ア イ コ
ン を開 き 、 「パ ッ ケージの内容を表示」 を選択 し ます。
> 現れ る Finder ウ ィ ン ド ウ で、Contents/Plug-ins フ ォ ルダへ移動 し 、1 番目の手順でで き た
PDFlib Block Plugin フ ォ ルダ を こ の フ ォ ルダ内へ複製 し ます。
マルチ リ ン ガル イ ン タ フ ェ ース PDFlib Block Plugin は、 ユーザー イ ン タ フ ェース内で複
数言語に対応 し てい ます。 Acrobat のアプ リ ケーシ ョ ン言語に従っ て、 Block Plugin はその
イ ン タ フ ェース言語を自動的に選択 し ます。目下、英語・ ド イ ツ語・日本語の イ ン タ フ ェー
ス が利用可能です。Acrobat が こ れ以外の言語モー ド で動作 し てい る 場合には、Block Plugin
は英語 イ ン タ フ ェース を使用 し ます。
ト ラ ブルシ ュ ーテ ィ ン グ PDFlib Block Plugin が動作 し ない よ う に見 ら れ る 場合は、 以下
の点を確認 し て く だ さ い :
> 「編集」 → 「環境設定」 (→ 「一般 ...」) → 「一般」 で 「承認 さ れたプ ラ グ イ ンのみを使
用」 チ ェ ッ ク ボ ッ ク ス がオ フ にな っ てい る こ と を確認 し て く だ さ い。 Acrobat が承認済
みモー ド で動作 し てい る と 、 プ ラ グ イ ンは読み込まれません。
> Adobe Designerに よ っ て作成 さ れた PDF フ ォームは、Block Pluginの適切な動作を妨げ る
こ と があ り ます。 他の Acrobat のプ ラ グ イ ンの動作について も 同様です。 なぜな ら こ
う し た フ ォ ームは、 Acrobat の内部セ キ ュ リ テ ィ モデル と 衝突す る ためです。 ですの
で、 Designer の静的な PDF フ ォームは利用せずに、 動的な PDF フ ォームだけ を Block
Plugin への入力 と し て用い る こ と を推奨 し ます。
280
第 11 章 : PPS と PDFlib Block Plugin
11.2 PDFlib ブ ロ ッ ク の概念あ ら ま し
11.2.1 文書デザ イ ン と プ ロ グ ラ ム コ ー ド と の分離
PDFlib のデー タ ブ ロ ッ ク を利用す る と 、 取 り 込んだページ上に、 可変のテ キ ス ト や画像や
グ ラ フ ィ ッ ク を簡単に配置で き ます。 単純な PDF ページ と 違っ て、 デー タ ブ ロ ッ ク を含
むページは、 後でサーバサ イ ド で行われ る べ き 処理についての情報を内部に持っ てい ま
す。 PDFlib ブ ロ ッ ク の概念は、 以下の 2 種類の作業を完全に分離する も のです :
> デザ イ ナーはページ レ イ ア ウ ト を作成 し 、 可変ページ構成要素の位置を指定す る と と
も に、 その文字サ イ ズ ・ 色 ・ 画像縮尺 と い っ たプ ロ パテ ィ も 指定 し ま す。 レ イ ア ウ ト
は PDF 文書 と し て作成 し 、 その後デザ イ ナーは、 Acrobat 用 PDFlib Block Plugin を使っ
て、 可変デー タ ブ ロ ッ ク と そのそれぞれのプ ロ パテ ィ を指定 し ます。
> プ ロ グ ラ マーは、取 り 込まれ る PDF ページ上の PDFlib ブ ロ ッ ク に含まれ る 情報を、デー
タ ベー ス の フ ィ ール ド と い っ た動的な情報 と 紐づけ る コ ー ド を 書 き ま す。 プ ロ グ ラ
マーは、 ブ ロ ッ ク の詳細については何 も 知 ら な く て よ く (名前を含むのか ZIP コ ー ド
を含むのか、 ページ上の正確な位置、 書式な ど)、 そのため、 ど の よ う な レ イ ア ウ ト 変
更か ら も 独立でい ら れ ます。 ブ ロ ッ ク に関連す る 詳細についてはすべて、 フ ァ イ ル内
のブ ロ ッ ク プ ロ パテ ィ に基づいて PPS の側で処理 し ます。
言いかえれば、 プ ロ グ ラ マーに よ っ て書かれ る コ ー ド は 「デー タ 非依存」 です。 すなわち
それは汎用であ り 、 ブ ロ ッ ク のいかな る 特性に も 依存 し ません。 た と えばデザ イ ナーは、
手紙の宛先を入れ る ブ ロ ッ ク をページ上の別の場所へ移動 さ せ る か も し れません し 、あ る
いは、 文字サ イ ズ を変え る か も し れません。 一般的なブ ロ ッ ク 処理 コ ー ド に変更を加え る
必要はな く 、 デザ イ ナーがブ ロ ッ ク プ ロ パテ ィ を Acrobat プ ラ グ イ ン で変更 し て ラ ス ト
ネームのかわ り に フ ァ ース ト ネーム を用い る よ う に し さ えすれば、正 し い出力が生成 さ れ
ます。
中間ス テ ッ プ と し て、ブ ロ ッ ク への流 し 込みは Acrobat でプ レ ビ ュ ーで き ますので、開
発 と 試験サ イ ク ルを迅速化す る こ と が可能です。 ブ ロ ッ ク プ レ ビ ュ ーには、 ブ ロ ッ ク の定
義内で指定 さ れたデフ ォ ル ト デー タ (文字列や画像フ ァ イ ル名等) が用い ら れます。
11.2.2 ブ ロ ッ ク プ ロパテ ィ
ブ ロ ッ ク の動作はブ ロ ッ ク プ ロ パテ ィ で制御す る こ と がで き ま す。 プ ロ パテ ィ は Block
Plugin でブ ロ ッ ク に割 り 当て ます。
標準ブ ロ ッ ク プ ロパテ ィ ブ ロ ッ ク はページ上の矩形 と し て定義 さ れ、 名前 ・ 種類 ・ そ
の他自由なプ ロ パテ ィ 群を割 り 当て ら れます。こ う し たプ ロ パテ ィ は後で PPS に よ っ て処
理 さ れ ま す。 名前は、 ブ ロ ッ ク を 識別す る 任意の文字列で あ り 、 た と え ば firstname ・
lastname ・ zipcode の よ う に名づけ る こ と がで き ます。 PPS では、 さ ま ざ ま な種類のブ ロ ッ
ク を使 う こ と がで き ます :
> テキス ト 行ブ ロ ッ ク は、 1 行のテ キ ス ト デー タ を持ち ます。 こ のデー タ は、 PPS のテ キ
ス ト 行 メ ソ ッ ド で処理 さ れます。
> テキス ト フ ローブ ロ ッ ク は、1 行ない し 複数行のテ キ ス ト デー タ を持ち ます。複数行の
テ キ ス ト は PPS のテ キ ス ト フ ロ ーフ ォーマ ッ タ に よ っ て組版 さ れます。 複数のテ キ ス
ト フ ロ ーブ ロ ッ ク を連結 し て、 前のブ ロ ッ ク か ら あふれた テ キ ス ト を次のブ ロ ッ ク に
入れ る こ と も 可能です (302 ページ 「 テ キ ス ト フ ロ ーブ ロ ッ ク を連結」 参照)。
> 画像ブ ロ ッ ク は、ラ ス タ 画像を持ち ます。こ れは、DTP アプ リ ケーシ ョ ンで TIFF や JPEG
の フ ァ イ ルを貼 り 付け る の と 似てい ます。
11.2 PDFlib ブ ロ ッ クの概念あ ら ま し
281
> PDF ブ ロ ッ ク は、他の PDF文書のページか ら 取 り 込んだ任意の PDF グ ラ フ ィ ッ ク を持ち
ます。 こ れは、 DTP アプ リ ケーシ ョ ン で PDF ページ を貼 り 付け る の と 似てい ます。
ブ ロ ッ ク は、 その種類に よ っ て異な る さ ま ざ ま な標準プ ロ パテ ィ を持っ てい ます。 プ ロ パ
テ ィ は、 Block Plugin で追加 ・ 変更す る こ と がで き ます (288 ページ 「11.3.2 ブ ロ ッ ク プ ロ
パテ ィ を編集」 参照)。 標準ブ ロ ッ ク プ ロ パテ ィ の全一覧が 306 ページ 「11.6 ブ ロ ッ ク の
プ ロ パテ ィ 」 にあ り ます。 た と えば、 テ キ ス ト ブ ロ ッ ク ではテ キ ス ト の フ ォ ン ト やサ イ ズ
を指定す る こ と がで き 、 画像ブ ロ ッ ク や PDF ブ ロ ッ ク では拡縮倍率や回転を指定す る こ
と がで き ます。 PPS はブ ロ ッ ク の種類ご と に、 それを処理す る ための専用の関数を提供 し
てい ます (PDF_fill_textblock( ) 等)。 こ う し た関数は、 取 り 込まれた PDF ページの中でブ
ロ ッ ク を名前で検索 し 、 そのプ ロ パテ ィ を分析 し て、 ク ラ イ ア ン ト の与えたデー タ (一行
テ キ ス ト ・ 複数行テ キ ス ト ・ ラ ス タ 画像 ・ PDF ページのいずれか) を、 新 し いページ上
に、 指定 さ れたブ ロ ッ ク プ ロ パテ ィ に従っ て配置 し ます。 プ ロ グ ラ マーは、 ブ ロ ッ ク 流 し
込み関数の対応す る オプシ ョ ン を指定す る こ と に よ っ て、ブ ロ ッ ク プ ロ パテ ィ を オーバ ラ
イ ド す る こ と も で き ます。
デ フ ォ ル ト 内容に関す る プ ロパテ ィ 特殊 な ブ ロ ッ ク プ ロ パ テ ィ を 定義 し て、 そ の ブ
ロ ッ ク のデフ ォ ル ト 内容を持たせ る こ と も で き ます。 こ のデフ ォ ル ト 内容は、 ブ ロ ッ ク 流
し 込み関数に可変デー タ が与え ら れなかっ た と き や、あ る いはブ ロ ッ ク 内容が次回の印刷
実行時には変わ り う る けれど も 現時点では不変であ る よ う な と き に、そのブ ロ ッ ク に配置
さ れます。
デフ ォ ル ト プ ロ パテ ィ は、 Block Plugin のプ レ ビ ュ ー機能で も 用い ら れます (296 ペー
ジ 「11.4 Acrobat でブ ロ ッ ク を プ レ ビ ュ ー」 参照)。
カ ス タ ムブ ロ ッ ク プ ロパテ ィ 標準ブ ロ ッ ク プ ロ パ テ ィ を 利用す る こ と に よ り 、 可変
デー タ 処理ア プ リ ケーシ ョ ン を手軽に実装す る こ と がで き ま すが、 こ う し たプ ロ パテ ィ
は、 PPS の内部的に既知で自動処理可能な も のに限 ら れて し ま い ます。 よ り 高い柔軟性を
与え る ために、 デザ イ ナーは、 カ ス タ ムプ ロ パテ ィ を ブ ロ ッ ク に割 り 当て る こ と も で き ま
す。 カ ス タ ムプ ロ パテ ィ を利用すれば、 ブ ロ ッ ク の概念を拡張 し て、 よ り 高度な可変デー
タ 処理アプ リ ケーシ ョ ンの要請に応え る こ と が可能です。
カ ス タ ムプ ロ パテ ィ に関 し てはいかな る 規則 も 存在 し ません。 なぜな ら PPS はカ ス タ
ムプ ロ パテ ィ に対 し てはいかな る 処理 も 行わないか ら です。 PPS はただ、 カ ス タ ムプ ロ パ
テ ィ を ク ラ イ ア ン ト が利用で き る よ う にす る だけです。 ク ラ イ ア ン ト コ ー ド は、 カ ス タ ム
プ ロ パテ ィ を取得 し 、 適切に処理す る こ と がで き ます。 ブ ロ ッ ク のカ ス タ ムプ ロ パテ ィ に
基づいて、アプ リ ケーシ ョ ンが レ イ ア ウ ト 関連やデー タ 抽出関連の決定を行え る よ う にす
る こ と も 可能です。 た と えば、 科学アプ リ ケーシ ョ ンのためのカ ス タ ムプ ロ パテ ィ であれ
ば、数値出力の桁数を指定す る こ と も で き る で し ょ う し 、あ る いは、デー タ ベース の フ ィ ー
ル ド 名を カ ス タ ムブ ロ ッ ク プ ロ パテ ィ と し て定義 し ておいて、そのブ ロ ッ ク のためのデー
タ 抽出に用い る こ と も で き る で し ょ う 。
11.2.3 PDF の フ ォ ーム フ ィ ール ド を利用 し ない理由は ?
経験あ る Acrobat ユーザーな ら ば、なぜ我々は新たにブ ロ ッ ク と い う 概念を導入 し たのか、
ど う し て PDF にすでにあ る フ ォーム フ ィ ール ド の し く みを活用 し ないのか、 疑問を抱か
れ る か も し れません。 そ も そ も の違いは、 PDF の フ ォーム フ ィ ール ド は対話的に記入 さ れ
る こ と を主眼 と し て作 ら れてい る のに対 し て、PDFlib のブ ロ ッ ク は自動的に流 し 込まれ る
こ と を目的 と し てい る 点です。対話的記入 と 自動流 し 込みの両方を必要 と す る アプ リ ケー
シ ョ ン の場合であれば、 フ ォ ーム フ ィ ール ド 変換プ ラ グ イ ン を用いて、 PDF フ ォ ーム と
282
第 11 章 : PPS と PDFlib Block Plugin
PDFlib ブ ロ ッ ク を併用す る こ と も 可能です (291 ページ 「11.3.4 PDF フ ォーム フ ィ ール ド
を PDFlib ブ ロ ッ ク に変換」 参照)。
両概念の間には類似点 も 多 く あ り ますが、 PDFlib ブ ロ ッ ク には PDF フ ォーム フ ィ ール
ド と 比較 し て表 11.1 に示す よ う ない く つかの利点があ り ます。
表 11.1 PDF フ ォ ーム フ ィ ール ド と PDFlib ブ ロ ッ クの比較
機能
PDF フ ォ ーム フ ィ ール ド
PDFlib ブ ロ ッ ク
設計の趣旨
対話的利用
自動流 し 込み
文字組版機能 (フ ォ ン ト 指定 ・ 文 -
字サイ ズ指定よ り も高度な)
カ ーニ ング ・ 単語間隔 ・ 文字間隔 ・ 下線 / 上線
/ 取り消し線
OpenType レ イ アウ ト 機能
-
何ダース も の OpenType レ イ アウ ト 機能 (合字 ・
スウ ォ ッ シ ュ文字 ・ オール ド ス タ イル数字等)
複雑用字系への対応
制約あ り
シ ェ ーピ ン グ ・ 双方向テキス ト (ア ラ ビ ア文
字 ・ デーヴ ァ ナーガ リ ー等)
フ ォ ン ト 制御
フ ォ ン ト 埋め込み
フ ォ ン ト 埋め込み ・ サブ セ ッ ト 化 ・ エ ン コ ー
デ ィ ング
テキス ト 組版制御
左 ・ 中央 ・ 右揃え
左 ・ 中央 ・ 右 ・ 両端揃え。 各種組版アルゴ リ ズ
ム ・ 制御。 イ ン ラ イ ン オプ シ ョ ン を用いて テキ
ス ト の見映え を制御可能
テキス ト の途中で フ ォ ン ト その他 -
のテキス ト 属性を変え ら れる
○
追加結果が PDF のページ記述に
組み込まれる
-
○
ユーザーが追加フ ィ ール ド の内容 ○
を編集可能
×
プ ロパテ ィ の拡張セ ッ ト
-
○ (カ ス タ ムブ ロ ッ ク プ ロパテ ィ )
画像 フ ァ イルを流 し 込める
-
BMP ・ CCITT ・ GIF ・ PNG ・ JPEG ・ JBIG2 ・
JPEG 2000 ・ TIFF
カ ラ ー対応
RGB
グ レースケール ・ RGB ・ CMYK ・ Lab ・ スポ ッ ト
カ ラ ー (HKS ・ Pantone スポ ッ ト カ ラ ーが Block
Plugin に内蔵)
PDF/X ・ PDF/A
PDF/X : ×
○ (ブ ロ ッ ク コ ン テナ も 追加結果も)
PDF/A : 制約あ り
グ ラ フ ィ ッ クやテキス ト のプ ロパ -
テ ィ を流 し 込み時に上書き可能
○
透過内容
-
○
テキス ト ブ ロ ッ ク 群を連結可能
-
○
11.2 PDFlib ブ ロ ッ クの概念あ ら ま し
283
11.3 PDFlib Block Plugin で ブ ロ ッ ク を編集
11.3.1 ブ ロ ッ ク を作成
ブ ロ ッ ク ツ ール を ア ク テ ィ ブ にす る Block Plugin を使っ た PDFlib ブ ロ ッ ク の作 り 方は、
Acrobat の フ ォーム ツール と 同様です。 ページ上のすべてのブ ロ ッ ク は、 ブ ロ ッ ク ツール
がア ク テ ィ ブな時に表示 さ れます。 Acrobat の他の ツールが選択 さ れ る と ブ ロ ッ ク は見え
な く な り ますが、 な く な っ たわけではあ り ません。 ブ ロ ッ ク ツールを ア ク テ ィ ブにす る に
は、 以下のいずれかの操作を行い ます :
> 「ツール」 → 「プ ラ グ イ ン 高度な編集」 ペーン (Acrobat X) ま たは 「高度な編集」 ツー
ルバー (Acrobat 8/9) でブ ロ ッ ク ア イ コ ン
を ク リ ッ ク 。 Acrobat で こ の ツ ール
バーが表示 さ れ て い な い と き は、 「表示」 → 「ツ ール」 → 「プ ラ グ イ ン 高度な編集」
(Acrobat X) ま たは 「表示」 → 「ツールバー」 → 「高度な編集」 (Acrobat 8/9) を選択
すれば表示 さ せ る こ と がで き ます。
> メ ニ ュ ー項目 「PDFlib ブ ロ ッ ク」 → 「PDFlib ブ ロ ッ ク ツール」 を選択。
ブ ロ ッ ク の作成 と 変更 ブ ロ ッ ク ツールを ア ク テ ィ ブに し た ら 、 十字ポ イ ン タ を ド ラ ッ
グすれば、 ページ上の希望の位置に希望の大 き さ のブ ロ ッ ク を作成す る こ と がで き ます。
ブ ロ ッ ク は必ず矩形で、 その辺はページの辺 と 平行にな り ます (ブ ロ ッ ク の内容をページ
の辺 と 平行でな く す る には rotate プ ロ パテ ィ を用い ます)。 ブ ロ ッ ク の矩形を ド ラ ッ グ し
終わ る と 、 「PDFlib ブ ロ ッ ク プ ロパテ ィ 」 ダ イ ア ロ グが現れ る ので、 ブ ロ ッ ク の さ ま ざ ま
なプ ロ パテ ィ を編集す る こ と がで き ます (288 ページ 「11.3.2 ブ ロ ッ ク プ ロ パテ ィ を編集」
参照) 。 ブ ロ ッ ク ツールはブ ロ ッ ク の名前を自動生成 し ますが、 こ の名前はプ ロ パテ ィ ダ
イ ア ロ グで変更す る こ と も で き ます。ブ ロ ッ ク 名はページ内では一意であ る 必要があ り ま
すが、 別のページでは同 じ 名前 も 使え ます。
ダ イ ア ロ グ の上端では、 ブ ロ ッ ク の種類を 「Textline」 (テ キ ス ト 行) ・ 「Textflow」 (テ
キ ス ト フ ロ ー) ・ 「Image」 (画像) ・ 「PDF」 のいずれかに変更で き ます。 ブ ロ ッ ク の種類ご
と に異な る 色が用い ら れてい ます (図 11.1 参照)。 タ ブは、 ど のブ ロ ッ ク の種類を選択 し
てい る かに応 じ て、 一度に 1 つだけがア ク テ ィ ブにな っ てい ます。 「PDFlib ブ ロ ッ ク プ ロ
パテ ィ 」 ダ イ ア ロ グは、 ブ ロ ッ ク の種類に応 じ て、 プ ロ パテ ィ を階層的にい く つかの グ
ループやサブグループに ま と めて表示 し ます。
注 PDF にブ ロ ッ ク を追加 し た り 、既存のブ ロ ッ ク に変更を加えた り し た後は、Acrobat の 「名
前を付けて保存 ...」 コ マ ン ド を使 う ほ う が フ ァ イルサイ ズが小 さ く な り ます (「上書き保
存」 よ り も)。
注 Acrobat 用 Enfocus PitStop プ ラ グ イ ン を使っ て、 PDFlib ブ ロ ッ ク を含んだ文書を編集する
際、「This document contains PieceInfo from PDFlib. Press OK to continue editing or Cancel to
abort.」 と い う メ ッ セージが表示 さ れる こ と があ り ます。 こ の メ ッ セージは気に し な く て
かまいません。 このよ う な場合、 OK を ク リ ッ ク し て も安全です。
ブ ロ ッ ク を選択 コ ピー ・ 移動 ・ 削除 ・ プ ロ パテ ィ 編集 と いっ たい く つかのブ ロ ッ ク 操作
は、 選択 し た 1 個ない し 複数のブ ロ ッ ク に対 し て動作 し ます。 ブ ロ ッ ク ツールを用いてブ
ロ ッ ク を選択す る には、 以下の よ う に操作 し ます :
> 1 個のブ ロ ッ ク を選択す る には、 単にそれを シ ン グル ク リ ッ ク し ます。
> 複数のブ ロ ッ ク を選択す る には、Shift キーを押 し なが ら 2 個目以降のブ ロ ッ ク を選択 し
ます。
284
第 11 章 : PPS と PDFlib Block Plugin
図 11.1
各種ブ ロ ッ クの表示
> ページ上のすべてのブ ロ ッ ク を選択す る には、Ctrl+A (Windows の場合) か Cmd+A (Mac
の場合) を押すか、 ま たは 「編集」 → 「すべて選択」 を用い ます。
コ ン テキス ト メ ニ ュ ー ブ ロ ッ ク を 選択 (複数可) し て い る 時に は、 コ ン テ キ ス ト メ
ニ ュ ーを開けば、 ブ ロ ッ ク 関連のいろいろ な機能 (「PDFlib ブ ロ ッ ク」 メ ニ ュ ーか ら 利用
で き る 諸機能 と 同 じ ) をすばや く 実行す る こ と がで き ます。 コ ン テ キ ス ト メ ニ ュ ーを開 く
には、 選択 し たブ ロ ッ ク (複数可) を、 Windows の場合はマ ウ ス の右ボ タ ン で ク リ ッ ク し 、
Mac の場合は Ctrl+ ク リ ッ ク し ます。 た と えば、 ブ ロ ッ ク を削除す る には、 それをブ ロ ッ
ク ツールで選択 し たのち、 Delete キーを押 し て も よ いです し 、 あ る いは コ ン テ キ ス ト メ
ニ ュ ーで 「編集」 → 「削除」 を用い る こ と も で き ます。
ページ上でブ ロ ッ ク のない領域を右 ク リ ッ ク (Mac では Ctrl+ ク リ ッ ク ) す る と 、 コ ン
テ キ ス ト メ ニ ュ ーの中身は、 「プ レ ビ ュ ーの生成」 と 「プ レ ビ ュ ーの設定 ...」 と い う 項目
にな り ます。
ブ ロ ッ ク の大 き さ と 位置 ブ ロ ッ ク ツールを使 う と 、 選択 し たブ ロ ッ ク (複数可) を別
の位置へ動かす こ と も 可能です。 Shift キーを押 し なが ら ブ ロ ッ ク を ド ラ ッ グす る と 、 水平
方向か垂直方向にだけ動 き ます。 こ れはブ ロ ッ ク を正確に整列 さ せたい と き に便利で し ょ
う 。 ポ イ ン タ がブ ロ ッ ク の角の近 く にあ る 時は、 ポ イ ン タ は矢印に変わ り 、 ブ ロ ッ ク の大
き さ を変え る こ と がで き ます。 複数のブ ロ ッ ク の位置や大き さ を調整 し たい と き は、 複数
のブ ロ ッ ク を選択 し て、「PDFlib ブ ロ ッ ク」 メ ニ ュ ーか コ ン テ キ ス ト メ ニ ュ ーか ら 「整列」 ・
「中央揃え」 ・ 「均等配置」 ・ 「サイ ズ」 のいずれかの コ マ ン ド を選択 し ます。 ブ ロ ッ ク (複
数可) の位置は、 矢印キーを使っ て小刻みに変え る こ と も で き ます。
11.3 PDFlib Block Plugin で ブ ロ ッ ク を編集
285
図 11.2
ブ ロ ッ ク プ ロパテ ィ ダ イ ア ログ
あ る いは、 ブ ロ ッ ク の座標を数値でプ ロ パテ ィ ダ イ ア ロ グに入力す る こ と も で き ます。
座標系の原点はページの左上隅です。 座標は、 その時点で Acrobat で選択 さ れてい る 単位
で表示 さ れます :
> Acrobat 8/9/X で表示単位を変え る には、 「編集」 → 「環境設定」 (→ 「一般 ...」) → 「単
位 と ガ イ ド 」 を選択 し 、 イ ンチ ・ セ ンチ メ ー ト ル ・ パ イ カ ・ ポ イ ン ト ・ ミ リ のいずれ
か を選びます。 あ る いは Acrobat 8 の場合は、 「表示」 → 「ナビゲーシ ョ ンパネル」 →
「情報」 を選択 し 、 「オプ シ ョ ン」 メ ニ ュ ーか ら 単位を選ぶ こ と も で き ます。
> カー ソ ルの座標を表示す る には、「表示」 → 「表示切 り 替え」 → 「カ ー ソ ル座標」 (Acrobat
X) ま たは 「表示」 → 「カ ー ソル座標」 (Acrobat 9) ま たは 「表示」 → 「ナビゲーシ ョ
ンパネル」 → 「情報」 (Acrobat 8) を選択 し ます。
ただ し こ こ で選択 さ れてい る 単位は Rect プ ロ パテ ィ に対 し てのみ効力を持ち、 それ以外
の数値プ ロ パテ ィ (fontsize 等) に対 し ては一切効力を持ち ません。
グ リ ッ ド を用いて ブ ロ ッ ク を位置合わせ Acrobat のグ リ ッ ド 機能を活用 し て、 ブ ロ ッ ク
の位置合わせやサ イ ズ合わせを正確に行 う こ と も で き ます :
286
第 11 章 : PPS と PDFlib Block Plugin
図 11.3
Acrobat の
グ リ ッ ド 設定
> グ リ ッ ド を 表示 : 「表示」 → 「表示切 り 替 え」 → 「定規 と グ リ ッ ド 」 → 「グ リ ッ ド 」
(Acrobat X) ま たは 「表示」 → 「グ リ ッ ド 」 (Acrobat 8/9)。
> グ リ ッ ド ス ナ ッ プ を有効に : 「表示」 → 「表示切 り 替え」 → 「定規 と グ リ ッ ド 」 → 「グ
リ ッ ド にスナ ッ プ」 (Acrobat X) ま たは 「表示」 → 「グ リ ッ ド にスナ ッ プ」 (Acrobat 8/9)。
> グ リ ッ ド を変更 (図 11.3 参照) : 「編集」 → 「環境設定」 (→ 「一般 ...」) → 「単位 と ガ イ
ド 」 を選択 し ます。 そ こ でグ リ ッ ド 線の間隔や位置や色を変え る こ と がで き ます。
「グ リ ッ ド にスナ ッ プ」 を有効に し てい る と 、ブ ロ ッ ク の大 き さ と 位置は、設定 し た グ リ ッ
ド に揃い ます。 「グ リ ッ ド にスナ ッ プ」 は、 新規作成 し たブ ロ ッ ク に も 効 き ます し 、 既存
のブ ロ ッ ク をブ ロ ッ ク ツールで移動 し た り 大 き さ を変えた り す る と き に も 効 き ます。
画像やグ ラ フ ィ ッ ク を選択 し て ブ ロ ッ ク を作成 手動でブ ロ ッ ク の矩形を ド ラ ッ グす る
のではな く 、 既存のページ内容を使っ てブ ロ ッ ク の大き さ を定義する こ と も で き ます。 ま
ず、 メ ニ ュ ー項目 「PDFlib ブ ロ ッ ク」 → 「オブ ジ ェ ク ト を ク リ ッ ク で ブ ロ ッ ク を定義」 を
有効に し ます。 こ れで、 ブ ロ ッ ク ツールを使っ て、 ページ上の画像を ク リ ッ ク し て、 その
画像 と 同 じ 位置に同 じ 大 き さ の ブ ロ ッ ク を 作成す る こ と が で き ま す。 それ以外の グ ラ
フ ィ ッ ク オブジ ェ ク ト を ク リ ッ ク す る こ と も で き 、 その場合、 ブ ロ ッ ク ツールはそのグ ラ
フ ィ ッ ク (た と えば ロ ゴ) 全体を選択 し よ う と し ます。 こ の 「オブ ジ ェ ク ト ク リ ッ ク 」 機
能は、 ブ ロ ッ ク 定義作業を補助す る ために設けて あ る も のです。 で き たブ ロ ッ ク の位置や
大 き さ を変更 し たければ、 後か ら 何 ら 制約な く 行 う こ と がで き ます。 ブ ロ ッ ク は、 画像や
グ ラ フ ィ ッ ク に固定 さ れて し ま う のではな く 、ただそれを位置や大 き さ の決定の補助 と し
て用い る だけです。
こ の 「オブジ ェ ク ト ク リ ッ ク 」 機能は、 ど のベ ク ト ルグ ラ フ ィ ッ ク や画像がページ上
で論理的要素を形づ く っ てい る か を認識 し よ う と し ます。いずれかのページ内容が ク リ ッ
ク さ れ る と 、 その対象が白かっ た り 非常に大 き か っ た り し ない限 り 、 その外接枠 (対象を
囲む矩形) が選択 さ れます。 その次の段階 と し て、 こ の検知 さ れた矩形に一部入 り 込んで
い る 他の物が選択領域に追加 さ れ、 こ れが繰 り 返 さ れます。 そ う し て最終的にで き た領域
11.3 PDFlib Block Plugin で ブ ロ ッ ク を編集
287
に基づいてブ ロ ッ ク の矩形が生成 さ れ る のです。 結局の と こ ろ 「オブジ ェ ク ト ク リ ッ ク 」
機能は、 個々の線ではな く グ ラ フ ィ ッ ク 全体を選択 し よ う と する こ と にな り ます。
フ ォ ン ト プ ロパテ ィ の自動検出 Block Plugin は、 テ キ ス ト 行 ま た は テ キ ス ト フ ロ ーブ
ロ ッ ク の置かれた位置の背景にあ る フ ォ ン ト を分析する こ と がで き 、ブ ロ ッ ク の以下のプ
ロ パテ ィ を自動的に書 き 込む こ と がで き ます :
fontname・fontsize・fillcolor・charspacing・horizscaling・wordspacing・
textrendering・textrise
フ ォ ン ト プ ロ パテ ィ の自動検出は望ま し く ない結果を も た ら す こ と も あ る ので、背景を無
視 さ せたい場合は、 「PDFlib ブ ロ ッ ク 」 → 「背景フ ォ ン ト ・ 色の検出」 を用いて機能の有
効 ・ 無効を切 り 替え る こ と がで き ます。 デフ ォ ル ト では こ の機能は無効にな っ てい ます。
ブ ロ ッ ク を ロ ッ ク ブ ロ ッ ク は、 う っ か り 移動 し た り 大 き さ を変え た り 削除 し た り さ れ
ない よ う 、 ロ ッ ク し て保護す る こ と がで き ます。 ブ ロ ッ ク ツールがア ク テ ィ ブな状態で、
ブ ロ ッ ク を選択 し 、 その コ ン テ キ ス ト メ ニ ュ ーか ら 「ロ ッ ク」 を選び ま す。 ブ ロ ッ ク が
ロ ッ ク さ れてい る と 、 移動 さ せ る こ と も 大 き さ を変え る こ と も 削除す る こ と も で き ず、 そ
のプ ロ パテ ィ ダ イ ア ロ グ を編集す る こ と も で き ません。
11.3.2 ブ ロ ッ ク プ ロパテ ィ を編集
新規ブ ロ ッ ク を作成 し た時や、 既存ブ ロ ッ ク を ダブル ク リ ッ ク し た時や、 ブ ロ ッ ク の コ ン
テ キ ス ト メ ニ ュ ーか ら 「プ ロパテ ィ 」 を選択 し た時には、 プ ロ パテ ィ ダ イ ア ロ グ が現れ
て、 その選択 し たブ ロ ッ ク に関す る すべての設定を編集する こ と がで き ます (図 11.2 参
照)。 306 ページ 「11.6 ブ ロ ッ ク のプ ロ パテ ィ 」 で詳述す る よ う に、 プ ロ パテ ィ にはブ ロ ッ
ク の種類に応 じ て、 い く つかのグループがあ り ます。
「適用」 ボ タ ンは、 ダ イ ア ロ グ内の 1 個ない し 複数のプ ロ パテ ィ を変更 し た時にのみ有
効にな り ます。 「適用」 ボ タ ンは、 ロ ッ ク さ れたブ ロ ッ ク については無効 と な り ます。
注 ブ ロ ッ クの種類やプ ロパテ ィ の設定によ っ ては、 表示 さ れないプ ロパテ ィ も あ り ます。 た
と えば、 タ ブ設定を編集する ためのプ ロパテ ィ サブグループ 「hortabmethod=ruler におけ
るルーラタブ」は、 テキス ト フ ローグループの hortabmethod プ ロパテ ィ が ruler に設定 さ
れている と き にのみ表示 さ れます。
プ ロ パテ ィ の値を変更す る には、入力 し たい数や文字列を そのプ ロ パテ ィ の入力領域に入
力す る か (例 : linewidth) 、 ド ロ ッ プ ダ ウ ン リ ス ト か ら 値 を 選ぶ か (例 : fitmethod ・
orientate)、 ま たはダ イ ア ロ グの右側にあ る 「...」 ボ タ ン を ク リ ッ ク し て フ ォ ン ト や色の値
やフ ァ イ ル名を選択 し ます (例 : backgroundcolor ・ defaultimage)。 fontname プ ロ パテ ィ
の場合は、 シ ス テ ム に イ ン ス ト ール さ れてい る フ ォ ン ト の一覧か ら 選ぶ こ と も で き ま す
し 、 カ ス タ ムの フ ォ ン ト 名を打ち込む こ と も で き ます。 フ ォ ン ト 名を入力 し た方式にかか
わ ら ず、 その フ ォ ン ト は、 PPS に よ っ てブ ロ ッ ク へ内容が流 し 込まれ る シ ス テ ム上におい
て利用可能にな っ てい る こ と が必要です。
変更 さ れたプ ロ パテ ィ は、ブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ グ内で太字で表示 さ れます。ブ
ロ ッ ク のいずれかのプ ロ パテ ィ が変更 さ れてい る と き には、その表示 さ れてい る ブ ロ ッ ク
名の後に接尾辞 (*) が付記 さ れ ます。 プ ロ パテ ィ の編集が済んだ ら 、 「適用」 ボ タ ン を ク
リ ッ ク し てブ ロ ッ ク を更新 し ます。 定義 し たプ ロ パテ ィ は、 PDF フ ァ イ ル内にブ ロ ッ ク 定
義の一部 と し て格納 さ れます。
288
第 11 章 : PPS と PDFlib Block Plugin
重な っ た ブ ロ ッ ク 重な り あ う ブ ロ ッ ク 群は選択 し づ ら い こ と が あ り ま す。 その領域を
ク リ ッ ク す る と 必ず最前面のブ ロ ッ ク が選ばれて し ま う か ら です。 こ の よ う な場合には、
コ ン テ キ ス ト メ ニ ュ ーの 「ブ ロ ッ ク の選択」 項目を用いれば、 ブ ロ ッ ク の う ちのいずれか
1 個を名前で選択す る こ と がで き ます。 1 個のブ ロ ッ ク を選んだ直後にその領域で行 う 操
作は、 その選択 し た 1 個のブ ロ ッ ク に対 し てのみ効力を持ち、 他のブ ロ ッ ク に対 し ては効
力を持ち ません。 た と えば Enter を押せば、 選択 し たブ ロ ッ ク のプ ロ パテ ィ を編集で き ま
す。 こ の方法を利用すれば、 ブ ロ ッ ク の上に他のブ ロ ッ ク が部分的ない し 完全にかぶ さ っ
ていて も 、 簡単にそのブ ロ ッ ク のプ ロ パテ ィ を編集す る こ と がで き ます。
ブ ロ ッ ク プ ロパテ ィ の値 を繰 り 返 し 使用 ・ リ セ ッ ト キー入力や ク リ ッ ク の量を い く ら
か軽減で き る よ う 、 ブ ロ ッ ク ツールは、 直前のブ ロ ッ ク のプ ロ パテ ィ ダ イ ア ロ グで入力 さ
れたプ ロ パテ ィ 値を記憶 し てい ます。 こ う し た値は、 新規ブ ロ ッ ク の作成時に再利用 さ れ
ます。 も ち ろんその値は、 いつ別の値で上書 き し て も か ま い ません。
プ ロ パテ ィ のダ イ ア ロ グで 「全て リ セ ッ ト 」 ボ タ ン を押す と 、 多 く のブ ロ ッ ク プ ロ パ
テ ィ がそれぞれのデフ ォ ル ト に リ セ ッ ト さ れます。 以下の項目は変更 さ れません :
> Name ・ Type ・ Rect ・ Description プ ロ パテ ィ
> すべてのカ ス タ ムプ ロ パテ ィ
注 標準プ ロパテ ィ のデ フ ォル ト 値は、プ レ ビ ュ ー生成時のプ レースホルダデー タ を保持する
defaulttext ・ defaultimage ・ defaultpdf プ ロパテ ィ と 混同 し ないよ う にする必要があ り ま
す (296 ページ 「ブ ロ ッ クのデ フ ォル ト 内容」 参照)。
複数のブ ロ ッ ク を一度に編集 複数のブ ロ ッ ク のプ ロ パテ ィ を一度に編集すれば、 大い
に時間が節約で き ます。 複数のブ ロ ッ ク を選択す る には以下の よ う に操作 し ます :
> メ ニ ュ ー項目 「PDFlib ブ ロ ッ ク」 → 「PDFlib ブ ロ ッ ク ツール」 を選択 し てブ ロ ッ ク ツー
ルを ア ク テ ィ ブに し ます。
> 1 個目のブ ロ ッ ク を ク リ ッ ク し て選択 し ます。最初に選択 し た こ のブ ロ ッ ク がマ ス タ ー
ブ ロ ッ ク にな り ます。 他のブ ロ ッ ク (複数可) を Shift+ ク リ ッ ク し て、 選択ブ ロ ッ ク
群に加え ます。 あ る いは、 「編集」 → 「すべて を選択」 を ク リ ッ ク し て、 現在のページ
上のすべてのブ ロ ッ ク を選択す る こ と も で き ます。
> こ れ ら のブ ロ ッ ク の う ちいずれか 1 個を ダブル ク リ ッ ク す る と 、ブ ロ ッ ク プ ロ パテ ィ ダ
イ ア ロ グが開 き ます。 こ の時ダブル ク リ ッ ク し たブ ロ ッ ク は、 新たにマ ス タ ーブ ロ ッ
ク にな り ます。
> あ る いは、 1 個のブ ロ ッ ク を ク リ ッ ク し てマ ス タ ーブ ロ ッ ク と し て指定 し た う えで、
Enter キーを押 し てブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ グ を開 く こ と も で き ます。
プ ロ パテ ィ ダ イ ア ロ グには、選択 さ れてい る すべてのブ ロ ッ ク に適用 さ れ る プ ロ パテ ィ の
部分集合だけが表示 さ れ ま す。 ダ イ ア ロ グ には、 マ ス タ ーブ ロ ッ ク か ら 採 ら れたプ ロ パ
テ ィ 値が表示 さ れます。 ダ イ ア ロ グ を 「適用」 で閉 じ る と 、 その時点の内容が、 選択 さ れ
てい る ブ ロ ッ ク すべてに複製 さ れます。 すなわち、 マ ス タ ーブ ロ ッ ク の値がその ま ま、 あ
る いはダ イ ア ロ グで手変更を加え ていればそれが適用 さ れます。 こ の動作を利用 し て、 あ
る 1 個のブ ロ ッ ク のブ ロ ッ ク プ ロ パテ ィ を、他の 1 個ない し 複数のブ ロ ッ ク へ複製す る こ
と も 可能です。
以下の標準プ ロ パテ ィ は共用で き ません。 すなわち、 こ れ ら は複数のブ ロ ッ ク に対 し
て一度に編集す る こ と はで き ません :
Name・Description・Subtype・Type・Rect・Status
カ ス タ ムプ ロ パテ ィ も 、 ブ ロ ッ ク 間で共用す る こ と はで き ません。
11.3 PDFlib Block Plugin で ブ ロ ッ ク を編集
289
11.3.3 ページ間 ・ 文書間で ブ ロ ッ ク を コ ピ ー
Block Plugin は、 現在のページの中で、 ま たは現在の文書の中で、 あ る いは他の文書へ と 、
ブ ロ ッ ク を移動 し た り コ ピー し た り す る ための手段をい く つか提供 し てい ます :
> ブ ロ ッ ク を マ ウ ス で ド ラ ッ グ し て移動 ・ コ ピー、 ま たは他のページや開いてい る 文書
へブ ロ ッ ク を貼 り 付け
> ブ ロ ッ ク を、 通常の コ ピー / 貼 り 付け操作を用いて、 同一文書内のページ (複数可) へ
複製
> ブ ロ ッ ク を、 新 し い フ ァ イ ル (ページが空白の) や、 既存の文書 (既存のページにブ
ロ ッ ク を適用) へ書 き 出 し
> 他の文書か ら ブ ロ ッ ク を取 り 込み
ブ ロ ッ ク の定義を維持 し た ま まページの内容を更新 し たい場合には、ブ ロ ッ ク を保っ た ま
ま背景のページ (複数可) を置換す る こ と がで き ます。 Acrobat の 「文書」 → 「ページの
置換 ...」 を用い ます。
ブ ロ ッ ク を移動 ・ 複製 ブ ロ ッ ク の位置を変え る には、 ブ ロ ッ ク (複数可) を選択 し て、
新 し い位置へ ド ラ ッ グ し ます。 ブ ロ ッ ク の複製を作成する には、 Ctrl キー (Windows の場
合) か Alt キー (Mac の場合) を押 し なが ら 同様に ド ラ ッ グ し ます。 キーを押 し てい る 間
は、 マ ウ ス カー ソ ルが変わ り ます。 複製 さ れたブ ロ ッ ク は元のブ ロ ッ ク と 同 じ プ ロ パテ ィ
を持ち ますが、 ただ し 名前 と 位置だけは自動的に変更 さ れます。
ま た、 コ ピー/貼 り 付け を使っ て、 ブ ロ ッ ク を、 同一ページ内の他の場所へ、 ま たは
同一文書内の他のページへ、 あ る いは Acrobat でその時点で開いてい る 他の文書へ複製す
る こ と も で き ます :
> ブ ロ ッ ク ツールを ア ク テ ィ ブに し てか ら 、 複製 し たいブ ロ ッ ク 群を選択 し ます。
> Ctrl+C (Windows の場合) か Cmd+C (Mac の場合) を、 ま たは 「編集」 → 「 コ ピー」 を
使っ て、 選択 し たブ ロ ッ ク を ク リ ッ プボー ド へ コ ピー し ます。
> 複製先ページへ移動 し ます (必要な ら )。
> Ctrl+V (Windows の場合) か Cmd+V (Mac の場合) を、 ま たは 「編集」 → 「貼 り 付け」
を使っ て、 ク リ ッ プボー ド か ら ブ ロ ッ ク を現在のページへ貼 り 付け ます。
ブ ロ ッ ク を他のページ群へ複製 ブ ロ ッ ク (複数可) の複製を、 現在の文書の中の任意
の数のページ上に一度に作成す る こ と も で き ます :
> ブ ロ ッ ク ツールを ア ク テ ィ ブに し てか ら 、 複製 し たいブ ロ ッ ク 群を選択 し ます。
> 「PDFlib ブ ロ ッ ク」 メ ニ ュ ーか コ ン テ キ ス ト メ ニ ュ ーか ら 「取 り 込み と 書き出 し 」 → 「複
製 ...」 を選びます。
> ど のブ ロ ッ ク を複製す る か を選び (「選択 さ れている ブ ロ ッ ク 」 ま たは 「 このページ上
の全ブ ロ ッ ク」)、 こ の選んだブ ロ ッ ク 群を複製 し たい複製先ページの範囲を選びます。
ブ ロ ッ ク を書 き出 し ・ 取 り 込み ブ ロ ッ ク の書 き 出 し /取 り 込み機能を使 う と 、 あ る 1
つのページ上のブ ロ ッ ク の定義や、 あ る 文書内のすべてのブ ロ ッ ク の定義を、 複数の PDF
フ ァ イ ル間で共用す る こ と が可能です。 こ れは、 既存のブ ロ ッ ク 定義を維持 し た ま まペー
ジ内容を更新 し たい と き に便利です。ブ ロ ッ ク 定義を別フ ァ イ ル と し て書 き 出すには以下
の よ う に操作 し ます :
> ブ ロ ッ ク ツールを ア ク テ ィ ブに し てか ら 、 書 き 出 し たいブ ロ ッ ク 群を選択 し ます。
> 「PDFlib ブ ロ ッ ク」 メ ニ ュ ーか コ ン テ キ ス ト メ ニ ュ ーか ら 「取 り 込み と 書き出 し 」 → 「書
き出 し ...」 を選択 し ます。 ページ範囲 と 、 ブ ロ ッ ク 定義を持たせたい新規 PDF フ ァ イ
ル名を入力 し ます。
290
第 11 章 : PPS と PDFlib Block Plugin
ブ ロ ッ ク 定義を取 り 込むには 「PDFlib ブ ロ ッ ク」 → 「取 り 込み と 書き出 し 」 → 「取 り 込み
...」 を選択 し ます。 ブ ロ ッ ク 取 り 込みの際には、 取 り 込んだブ ロ ッ ク を文書内の全ページ
に適用す る か、 それ と も あ る ページ範囲にのみ適用する か を選ぶ こ と がで き ます。 複数の
ページ を選択 し た場合、 ブ ロ ッ ク 定義は変更 さ れずに各ページへコ ピー さ れます。 取 り 込
むブ ロ ッ ク 定義 よ り も 取 り 込み先範囲のほ う がページ数が多い場合には、 「テ ン プ レー ト
を繰 り 返す」 チ ェ ッ ク ボ ッ ク ス を用い る こ と も で き ます。 こ れをチ ェ ッ ク す る と 、 取 り 込
みフ ァ イ ル内のブ ロ ッ ク のシーケ ン ス が、 現在の文書の中で、 文書の終わ り に達す る ま で
繰 り 返 さ れます。
書 き出 し で ブ ロ ッ ク を他の文書へ複製 ブ ロ ッ ク を書 き 出す際には、 そのブ ロ ッ ク 群を
他の文書内のページ群へ直接適用す る こ と も で き ます。 結果 と し て、 あ る 文書か ら 別の文
書へブ ロ ッ ク 群を転写す る こ と が可能です。 そのためには、 ブ ロ ッ ク の書 き 出 し 先 と し て
既存の文書を選び ま す。 「既存のブ ロ ッ ク を削除」 チ ェ ッ ク ボ ッ ク ス を チ ェ ッ ク す る と 、
書 き 出 し 先の文書にブ ロ ッ ク が存在 し ていて も すべて削除 さ れ、 その後に、 新 し いブ ロ ッ
ク 群がその文書へ コ ピー さ れます。
11.3.4 PDF フ ォ ーム フ ィ ール ド を PDFlib ブ ロ ッ ク に変換
PDFlib ブ ロ ッ ク を手動で作成す る のではな く 、PDF フ ォーム フ ィ ール ド をブ ロ ッ ク へ自動
変換 さ せ る こ と も で き ます。 こ れは、 複雑な PDF フ ォームがあ っ て PPS で自動流 し 込み
さ せたい場合や、 既存の大量の PDF フ ォーム を自動流 し 込みで き る よ う に変換 し たい場
合な ど に特に便利です。1 つのページ上のすべての フ ォーム フ ィ ール ド を PDFlib ブ ロ ッ ク
に変換す る には、 「PDFlib ブ ロ ッ ク」 → 「フ ォ ーム フ ィ ール ド の変換」 → 「現在のページ」
を選択 し ます。 文書内のすべての フ ォーム フ ィ ール ド を変換 し たい場合は 「全ページ」 を
選びます。 選択 し た フ ォーム フ ィ ール ド だけ を変換す る には (1 個ま たは複数の フ ォーム
フ ィ ール ド を選択す る には、 Acrobat の フ ォーム ツールかオブジ ェ ク ト 選択ツールを選び
ます)、 「選択 さ れてい る フ ォ ーム フ ィ ール ド 」 を選択 し ます。
フ ォ ーム フ ィ ール ド 変換の詳細 自動フ ォ ーム フ ィ ール ド 変換では、 「PDFlib ブ ロ ッ ク」
→ 「 フ ォ ーム フ ィ ール ド の変換」 → 「変換オプ シ ョ ン ...」 ダ イ ア ロ グで選択 さ れてい る 種
類の フ ォーム フ ィ ール ド が、テ キ ス ト 行ブ ロ ッ ク かテ キ ス ト フ ロ ーブ ロ ッ ク に変換 さ れま
す。 デ フ ォ ル ト では、 すべての種類の フ ォ ーム フ ィ ール ド が変換 さ れ ま す。 変換 さ れた
フ ィ ール ド の属性は、 表 11.3 に従っ て各ブ ロ ッ ク プ ロ パテ ィ へ変換 さ れます。
同名の複数の フ ォ ーム フ ィ ール ド 同 じ ページ上に あ る 複数の フ ォ ー ム フ ィ ール ド は、
同 じ 名前を持つ こ と が許 さ れてい ますが、それに対 し てブ ロ ッ ク 名はページ上で一意でな
ければな り ません。 こ のため、 フ ォーム フ ィ ール ド がブ ロ ッ ク に変換 さ れ る 際には、 生成
さ れ る ブ ロ ッ ク の名前に数の接尾辞が付加 さ れ、 一意なブ ロ ッ ク 名が作成 さ れ ます (291
ページ 「フ ォーム フ ィ ール ド の対応ブ ロ ッ ク を見つけ る 」 も 参照)。
なお、 Acrobat の内部的な問題のため、 複数の フ ォーム フ ィ ール ド が同 じ 名前を持つ場
合の フ ィ ール ド の属性は正 し く 報告 さ れません。複数の フ ィ ール ド が同 じ 名前を持っ てい
て、 し か し 属性が異な っ てい る 場合には、 生成 さ れ る ブ ロ ッ ク には こ う し た属性の違いは
反映 さ れ ま せん。 変換処理は こ の場合、 警告 メ ッ セージ を表示 し て、 関係す る フ ォ ーム
フ ィ ール ド 群の名前を示 し ます。 こ の場合は、 生成 さ れたブ ロ ッ ク のプ ロ パテ ィ を注意深
く 調べ る 必要があ り ます。
フ ォ ーム フ ィ ール ド の対応ブ ロ ッ ク を見つけ る 同 じ 名前の フ ィ ール ド が複数あ っ た場
合 ( ラ ジオボ タ ン等) 、 変換 さ れた フ ォーム フ ィ ール ド の名前は変更 さ れて し ま っ てい ま
すか ら 、 ど の フ ォーム フ ィ ール ド が ど のブ ロ ッ ク にな っ たのか を正 し く 知 る こ と は困難で
11.3 PDFlib Block Plugin で ブ ロ ッ ク を編集
291
す。 こ の こ と は特に、 FDF ま たは XFDF フ ァ イ ルを用いてブ ロ ッ ク への流 し 込みを行い、
その結果を フ ォームへの記入 と 同 じ に し たい場合に問題 と な り ます。
こ の問題を解決す る ため、 AcroFormConversion プ ラ グ イ ンは、 元の フ ォーム フ ィ ール
ド に関す る 情報を、 それに対応す る ブ ロ ッ ク を生成す る 際に、 カ ス タ ムプ ロ パテ ィ 群 と し
て記録 し ます。 表 11.2 に、 ブ ロ ッ ク を正 し く 同定す る ために利用で き る カ ス タ ムプ ロ パ
テ ィ の一覧を示 し ます。 プ ロ パテ ィ の型はすべて文字列です。
表 11.2 ブ ロ ッ ク の元の フ ォ ーム フ ィ ール ド を同定する ためのカ ス タ ムプ ロパテ ィ 一覧
カ ス タ ムプ ロパテ ィ
意味
PDFlib:field:name
フ ォ ーム フ ィ ール ド の完全修飾名。
PDFlib:field:pagenumber
元の文書で フ ォ ーム フ ィ ール ド が存在 し ていたページの番号 (文字列で)。
PDFlib:field:type
フ ォ ーム フ ィ ール ド の種類。 pushbutton ・ checkbox ・ radiobutton ・ listbox ・
combobox ・ textfield ・ signature の う ちのいずれか。
PDFlib:field:value
(type=checkbox の場合のみ) フ ォ ーム フ ィ ール ド の出力値。
ブ ロ ッ ク を対応す る フ ォ ーム フ ィ ール ド へバ イ ン ド PDFlib フ ォーム フ ィ ール ド と 生成
PDFlib ブ ロ ッ ク を同期 さ せ る ために、 生成 さ れたブ ロ ッ ク は、 対応す る フ ォーム フ ィ ール
ド にバ イ ン ド さ せ てお く こ と が で き ま す。 言い換え れば、 ブ ロ ッ ク ツ ールが内部的に
フ ォーム フ ィ ール ド と ブ ロ ッ ク と の紐付け を保持する と い う こ と です。変換処理が再実行
さ れ る 際、 バ イ ン ド さ れたブ ロ ッ ク は、 対応する PDFlib フ ォーム フ ィ ール ド の属性を反
映 し て更新 さ れます。 ブ ロ ッ ク がバ イ ン ド さ れてい る と 、 作業の二度手間が省けて便利で
す。 フ ォームが対話的利用のために更新 さ れた時には、 対応す る ブ ロ ッ ク も 自動的に更新
さ れ る か ら です。
ブ ロ ッ ク 生成後に変換元フ ォーム フ ィ ール ド を残 し た く ない場合は、「PDFlib ブ ロ ッ ク」
→ 「 フ ォ ーム フ ィ ール ド の変換」 → 「変換オプ シ ョ ン ...」 ダ イ ア ロ グの 「変換 さ れた フ ォ ー
ム フ ィ ール ド を削除」 オプシ ョ ン を選びます。 こ のオプシ ョ ン を選ぶ と 、 フ ォーム フ ィ ー
ル ド は変換処理後に完全に削除 さ れます。削除 さ れた フ ィ ール ド に関連づけ ら れていた ア
ク シ ョ ン (JavaScript な ど) も 、 すべて文書か ら 削除 さ れます。
バ ッ チ変換 フ ォーム フ ィ ール ド を PDFlib ブ ロ ッ ク に変換 し たい PDF 文書が多数あ る 場
合には、 バ ッ チ変換機能 を 利用 し て、 任意の数の文書 を 自動処理す る こ と も で き ま す。
「PDFlib ブ ロ ッ ク」 → 「フ ォ ーム フ ィ ール ド の変換」 → 「バ ッ チ変換 ...」 を選択すれば、
バ ッ チ処理ダ イ ア ロ グが現れます。
> 入力フ ァ イ ルは個別に選ぶ こ と も で き ます し 、1 個の フ ォ ルダの中身をすべて ま と めて
処理 さ せ る こ と も で き ます。
> 出力フ ァ イ ルは、入力フ ァ イ ル と 同 じ フ ォ ルダへ書 き 出す こ と も で き ます し 、別の フ ォ
ルダへ書 き 出す こ と も で き ます。 出力フ ァ イ ルには、 入力フ ァ イ ル と 区別す る ために
プ レ フ ィ ッ ク ス を追加す る こ と も で き ます。
> 大量の文書を処理す る 際には、 ロ グ フ ァ イ ルを指定する こ と を推奨 し ます。変換後、 ロ
グ フ ァ イ ルには、 処理 さ れたすべての フ ァ イ ルの一覧 と 、 それぞれの変換結果に関す
る 詳細が書 き 込ま れてお り 、 エ ラ ーが起 き た場合にはエ ラ ー メ ッ セージ も 書 き 込ま れ
ます。
変換処理の間、 変換 さ れ る PDF 文書は Acrobat で表示 さ れますが、 変換が完了す る ま で、
Acrobat の メ ニ ュ ー機能やツールは一切使用で き ません。
292
第 11 章 : PPS と PDFlib Block Plugin
表 11.3 PDF フ ォ ーム フ ィ ール ド から PDFlib ブ ロ ッ ク への変換
以下の PDF フ ォ ーム フ ィ ール ド 属性は ...
... 以下の PDFlib ブ ロ ッ ク プ ロパテ ィ に変換 さ れる
全フ ィ ール ド
位置
Rect
11.3 PDFlib Block Plugin で ブ ロ ッ ク を編集
293
表 11.3 PDF フ ォ ーム フ ィ ール ド から PDFlib ブ ロ ッ クへの変換
以下の PDF フ ォ ーム フ ィ ール ド 属性は ...
... 以下の PDFlib ブ ロ ッ ク プ ロパテ ィ に変換 さ れる
名前
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
オプ シ ョ ン→複数行
チ ェ ッ ク あ り な ら テキス ト フ ローブ ロ ッ クが生成
チ ェ ッ ク な し な ら テキス ト 行ブ ロ ッ クが生成
ラ ジオボ タ ン ・ チ ェ ッ ク ボ ッ ク ス
「デ フ ォ ル ト でチ ェ ッ ク」 がオ ンの場合 : defaulttext :
オプ シ ョ ン→チ ェ ッ ク ボ ッ ク スス タ イル、 チ ェ ッ ク マー ク =4
オプ シ ョ ン→ボ タ ン ス タ イル
円形 =l
十字形 =8
ひ し 形 =u
四角形 =n
星形 =H
(文字は ZapfDingbats フ ォ ン ト における各記号を表 し ます)
リ ス ト ボ ッ ク ス ・ コ ンポボ ッ ク ス
オプ シ ョ ン→選択 さ れている (デ フ ォ ル
ト ) 項目
defaulttext
ボタ ン
オプ シ ョ ン→ア イ コ ン と ラ ベル→ラ ベル
294
第 11 章 : PPS と PDFlib Block Plugin
defaulttext
11.3.5 Block Plugin のユーザー イ ン タ フ ェ ース を XML で カ ス タ マ イ ズ
Block Plugin のユーザー イ ン タ フ ェース の以下の点は、 XML 設定フ ァ イ ルで制御す る こ と
がで き ます。 こ の XML フ ァ イ ルは、 Block Plugin デ ィ レ ク ト リ に置 く 必要があ り ます。 デ
フ ォ ル ト 設定フ ァ イ ル default.PPSoptions は起動時に読み込まれます。 PDFlib Block Plugin
と と も に イ ン ス ト ール さ れ る こ のデフ ォ ル ト 設定フ ァ イ ルを参照 し て く だ さ い :
> 要素 /Block_Plugin/MainDialog/CloseOnApply は、ブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ グの 「適
用 し た ら ダ イ ア ログ を閉 じ る」 チ ェ ッ ク ボ ッ ク ス の初期状態を制御 し ます。こ のチ ェ ッ
ク ボ ッ ク ス は、 ブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ グ を、 ブ ロ ッ ク を作成 し た後 も 、 ま たは
ブ ロ ッ ク プ ロ パテ ィ を変更 し た後 も 開いた ま ま に し てお く か ど う か を決定 し ます。
> 要素 /Block_Plugin/FontDialog/ShowBaseFonts は、 ブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ グの
フ ォ ン ト 一覧 (「書式」 プ ロ パテ ィ グループの fontname プ ロ パテ ィ ) に、 シ ス テ ムに
イ ン ス ト ール さ れてい る フ ォ ン ト 群に加えて、 ベース 14 フ ォ ン ト も 表示す る か ど う か
を制御 し ます。
> 要素 /Block_Plugin/Command/ControlByClick は、 メ ニ ュ ー項目 「PDFlib ブ ロ ッ ク」 → 「オ
ブ ジ ェ ク ト を ク リ ッ ク で ブ ロ ッ ク を定義」 の初期状態を制御 し ます。
> 要素 /Block_Plugin/Command/DetectFonts は、 メ ニ ュ ー項目 「PDFlib ブ ロ ッ ク 」 → 「背景
フ ォ ン ト ・ 色の検出」 の初期状態を制御 し ます。
11.3 PDFlib Block Plugin で ブ ロ ッ ク を編集
295
11.4 Acrobat で ブ ロ ッ ク を プ レ ビ ュ ー
注 PDFlib デ ィ ス ト リ ビ ュ ーシ ョ ンの中の block_template.pdf 文書で、プ レ ビ ュ ー機能を試す
こ と がで き ます。 必要な リ ソ ース ( フ ォ ン ト ・ 画像等) も デ ィ ス ト リ ビ ュ ーシ ョ ンに含ま
れています。
PDFlib ブ ロ ッ ク は PPS に よ っ て処理 さ れます。 PPS を用い る こ と で、 ブ ロ ッ ク への流 し 込
み処理について、 そのデー タ 源 (デー タ ベース内のテ キ ス ト 、 デ ィ ス ク 上の画像フ ァ イ ル
等) や、 生成 さ れ る 文書の書式 ・ 対話的性質を カ ス タ マ イ ズす る こ と がで き ます。 こ の処
理について詳 し く は 301 ページ 「11.5 PPS でブ ロ ッ ク へ流 し 込み」 で解説 し ます。
し か し Block Plugin には内蔵バージ ョ ンの PPS が含まれてお り 、 こ れを用いて、 プ ロ グ
ラ ミ ン グ を一切必要 と せずに Acrobat 上で、 流 し 込まれたブ ロ ッ ク のプ レ ビ ュ ーバージ ョ
ン を生成す る こ と がで き ます。 こ のプ レ ビ ュ ー機能は、 カ ス タ ムプ ロ グ ラ ミ ン グ と 同等の
柔軟性を提供す る こ と はで き ませんが、ブ ロ ッ ク への流 し 込み結果を手軽に眺め る には適
し てい ます。 ブ ロ ッ ク プ レ ビ ュ ーを活用すれば、 ブ ロ ッ ク の位置や大 き さ を改善 し た り 、
ブ ロ ッ ク のプ ロ パテ ィ (フ ォ ン ト 名 ・ 文字サ イ ズ等) をチ ェ ッ ク し た り す る こ と がで き ま
す。 プ レ ビ ュ ーの表示結果に満足す る ま で、 ブ ロ ッ ク を変更 し 、 プ レ ビ ュ ーを新たに生成
す る こ と がで き ます。 プ レ ビ ュ ーは、 現在のページについて も 、 文書全体について も 生成
で き ます。
プ レ ビ ュ ーはつねに、 新 し い PDF 文書 と し て表示 さ れます。 元の文書 (ブ ロ ッ ク を含
んでい る ) は、 プ レ ビ ュ ーを生成 し て も 変更を受け ません。 プ レ ビ ュ ー文書は、 必要に応
じ て保存す る こ と も 捨て る こ と も で き ます。 元のブ ロ ッ ク コ ン テナ文書は、 プ レ ビ ュ ーに
よ っ て影響を受け ません。
ブ ロ ッ ク のデ フ ォ ル ト 内容 プ ラ グ イ ン では、 サーバサ イ ド のデー タ 源 (デー タ ベー ス
等) か ら ブ ロ ッ ク のテ キ ス ト ・ 画像 ・ PDF 内容を入手す る こ と は望むべ く も あ り ませんの
で、 プ レ ビ ュ ー機能 で はつねに、 ブ ロ ッ ク のデ フ ォ ル ト 内容、 す な わ ち defaulttext ・
defaultimage ・ defaultpdf プ ロ パテ ィ で指定 さ れてい る デー タ が用い ら れます。 通常、 PPS
で使われ る 実際のブ ロ ッ ク 内容を代表す る よ う なサ ン プルデー タ セ ッ ト が、 デ フ ォ ル ト
デー タ と し て用い ら れます。 デフ ォ ル ト 内容を持たないブ ロ ッ ク は、 プ レ ビ ュ ー生成時に
は無視 さ れます。 Status=ignoredefault のブ ロ ッ ク について も 同様です。
新規ブ ロ ッ ク では、 デ フ ォ ル ト プ ロ パテ ィ は空です。 プ レ ビ ュ ー機能を使 う 前には、
「デ フ ォ ル ト 内容」 プ ロ パテ ィ グループの defaulttext ・ defaultimage ・ defaultpdf プ ロ パ
テ ィ (ブ ロ ッ ク の種類に よ る ) に書 き 込む必要があ り ます。
注 デ フ ォル ト テキス ト を記号 フ ォ ン ト で入力する方法はやや ト リ ッ キーです。 詳 し く は 299
ページ 「デ フ ォル ト テキス ト に記号 フ ォ ン ト を用いる」 を参照 し て く だ さ い。
ブ ロ ッ ク プ レ ビ ュ ー を生成 ブ ロ ッ ク プ レ ビ ュ ーを生成す る には、 以下のいずれかの方
法を用い ます :
> メ ニ ュ ー項目 「PDFlib ブ ロ ッ ク」 → 「プ レ ビ ュ ー」 → 「プ レ ビ ュ ーの生成」 で。
> 「ツール」 → 「プ ラ グ イ ン 高度な編集」 ペーン (Acrobat X) ま たは 「高度な編集」 ツー
ルバー (Acrobat 8/9) で PDFlib ブ ロ ッ ク プ レ ビ ュ ーア イ コ ン
を ク リ ッ ク 。Acrobat
で こ の ツールバーが表示 さ れていない と き は、 「表示」 → 「ツール」 → 「プ ラ グ イ ン 高
度な編集」 (Acrobat X) ま たは 「表示」 → 「ツールバー」 → 「高度な編集」 (Acrobat 8/
9) を選択すれば表示 さ せ る こ と がで き ます。
296
第 11 章 : PPS と PDFlib Block Plugin
図 11.4
図 11.1 で示 し た コ ン テナ文書
に対する プ レ ビ ュ ー PDF。 ブ
ロ ッ ク 情報レ イ ヤー群 と 注釈
群を含んでいます
> ブ ロ ッ ク ツールがア ク テ ィ ブの と き は、ど のブ ロ ッ ク も ない所を右 ク リ ッ ク すれば、コ
ン テ キ ス ト メ ニ ュ ーに項目 「プ レ ビ ュ ーの生成」 と 「プ レ ビ ュ ー設定 ...」 が現れます。
プ レ ビ ュ ーは、 デ ィ ス ク 上の PDF フ ァ イ ルに基づいて生成 さ れます。 Acrobat 上で変更を
行な っ ていた場合、 ブ ロ ッ ク PDF を 「 フ ァ イル」 → 「上書き保存」 ま たは 「フ ァ イル」 →
「名前を付けて保存 ...」 を用いてデ ィ ス ク に保存 し ては じ めて、 その変更はプ レ ビ ュ ーに
反映 さ れます。 変更を受けたブ ロ ッ ク は、 ブ ロ ッ ク の名前の後にア ス タ リ ス ク が付いてい
る こ と で識別で き ます。 プ レ ビ ュ ー機能を設定 し て、 プ レ ビ ュ ー生成前にブ ロ ッ ク PDF
が自動保存 さ れ る よ う にす る こ と も で き ます。 そ う すれば、 対話的に行な っ た変更が確実
に、 ただちにプ ラ グ イ ン内で反映 さ れます。
プ レ ビ ュ ー を設定 ブ ロ ッ ク プ レ ビ ュ ーの生成 と 、その背後の PPS の動作については、い
く つかの性質を、 「PDFlib ブ ロ ッ ク 」 → 「プ レ ビ ュ ー」 → 「プ レ ビ ュ ー設定 ...」 で設定す
る こ と がで き ます :
> 現在のページ をプ レ ビ ュ ーす る か、 それ と も 文書全体をプ レ ビ ュ ーす る か。
> 生成 さ れ る プ レ ビ ュ ー文書の出力デ ィ レ ク ト リ 。
> ブ ロ ッ ク PDF をプ レ ビ ュ ー生成前に自動保存。
> ブ ロ ッ ク 情報レ イ ヤー と 注釈を追加。
> PDF/A-1b ま たは PDF/X 状態を複製。こ れ ら の規格では、レ イ ヤー と 注釈の使用は制限
さ れてい ますので、 「ブ ロ ッ ク情報レ イヤー と 注釈を追加」 オプシ ョ ン と こ のオプシ ョ
ンは同時には使え ません。
11.4 Acrobat で ブ ロ ッ ク を プ レ ビ ュ ー
297
図 11.5
ブロ ッ ク
プ レ ビ ュ ー設定
> 「高度な PPS オプ シ ョ ン」ダ イ ア ロ グ を利用 し て、PPS API に従っ て PPS 関数のオプシ ョ
ン リ ス ト を追加指定す る こ と も で き ます。 た と えば、 PDF_set_option( ) の searchpath
オプ シ ョ ン を 用い て、 ブ ロ ッ ク への流 し 込みに使 う フ ォ ン ト や画像が置かれて い る
デ ィ レ ク ト リ を指定す る こ と がで き ま す。 高度なオプ シ ョ ン を指定す る 際には、 PPS
コ ー ド を書 く プ ロ グ ラ マー と の連携の も と に行 う こ と を推奨 し ます。
プ レ ビ ュ ー設定は、 デ ィ ス ク フ ァ イ ルに保存 し て、 後で再読み込みする こ と も 可能です。
プ レ ビ ュ ーで提供 さ れ る情報 生成 さ れ る プ レ ビ ュ ー文書には、 元のページ内容 (背景)
と 、 流 し 込みが行われたブ ロ ッ ク のほかに、 さ ま ざ ま な情報 も 含ま れ る こ と があ り ます。
こ の情報は、 ブ ロ ッ ク や PPS 設定のチ ェ ッ ク や改善に役立つ も のです。 デフ ォ ル ト 内容を
持つア ク テ ィ ブなブ ロ ッ ク それぞれについて、 以下の項目が生成 さ れます :
> エ ラ ーマー カ : 流 し 込みが成功 し なか っ たブ ロ ッ ク は、 打ち消 し 線の付いた矩形 と し
て図示 さ れ、 容易に識別す る こ と がで き ます。 エ ラ ーマーカは、 ブ ロ ッ ク が処理で き
なか っ た と き にはつねに生成 さ れます。
> し お り : ブ ロ ッ ク の処理結果は し お り に ま と め ら れ ます。 こ の し お り は、 ページ番号
と ブ ロ ッ ク の種類に従っ て、 かつエ ラ ーが起 き た と き はエ ラ ーに も 従っ て、 構造化 さ
れてい ます。 し お り は 「表示」 → 「ナ ビ ゲーシ ョ ンパネル」 → 「 し お り 」 で表示で き
ます。 し お り はつねに生成 さ れます。
> 注釈 : 処理 さ れたブ ロ ッ ク ご と に、 ブ ロ ッ ク 内容その も のに加え て、 ページ上に注釈
が生成 さ れ ます。 こ の注釈の矩形は、 元のブ ロ ッ ク の枠を図示 し てい ます (デフ ォ ル
ト 内容 と 流 し 込みモー ド に よ っ ては、 こ れはブ ロ ッ ク 内容の枠 と は異な る 場合があ る
のです)。 こ の注釈の中にはブ ロ ッ ク の名前が入っ てお り 、 ブ ロ ッ ク への流 し 込みがで
き なか っ た と き にはエ ラ ー メ ッ セージ も 入っ てい ます。 注釈はデフ ォ ル ト で生成 さ れ
ますが、 プ レ ビ ュ ー設定で無効化す る こ と も で き ます。 PDF/A-1 ・ PDF/X 規格では注
釈の使用は制限 さ れてい ますので、 「ブ ロ ッ ク PDF の PDF/A-1b または PDF/X 状態を複
製」 オプシ ョ ン を有効にす る と 、 注釈は生成 さ れません。
> レ イ ヤー : ページの内容は、 分析 と デバ ッ グが容易にな る よ う 、 複数の レ イ ヤーに分
けて配置 さ れます。 ページ背景 (すなわち元のページの内容)、 ブ ロ ッ ク の各種類、 流
し 込みがで き なか っ たエ ラ ーブ ロ ッ ク 、 ブ ロ ッ ク 情報を持っ た注釈について、 それぞ
れ別々の レ イ ヤーが生成 さ れ ます。 空の ま ま にな る レ イ ヤーについては生成 さ れ ませ
ん (エ ラ ーが何 も 起 き なか っ た場合等)。 レ イ ヤー一覧は 「表示」 → 「ナビゲーシ ョ ン
パネル」 → 「レ イ ヤー」 で表示で き ます。 デフ ォ ル ト では、 ページ上のすべての レ イ
ヤーが表示 さ れ ます。 いずれかの レ イ ヤーの内容を見え な く す る には、 その レ イ ヤー
の名前の左の目のア イ コ ン を ク リ ッ ク し ます。 レ イ ヤーの生成は、 プ レ ビ ュ ー設定で
無効化す る こ と も 可能です。 PDF/A-1 ・ PDF/X 規格ではレ イ ヤーの使用は制限 さ れて
い ますので、 「ブ ロ ッ ク PDF の PDF/A-1b または PDF/X 状態を複製」 オプシ ョ ン を有効
にす る と 、 レ イ ヤーは生成 さ れません。
298
第 11 章 : PPS と PDFlib Block Plugin
PDF/A ま たは PDF/X 状態 を複製 「ブ ロ ッ ク PDF の PDF/A-1b または PDF/X 状態を複製」設
定は、 PDF/A 規格か PDF/X 規格に従っ た PDF 出力を生成す る 必要があ る と き に有用で
す。 複製モー ド は、 入力が以下のいずれかの規格に準拠 し てい る と き に有効にで き ます :
PDF/A-1b:2005
PDF/X-1a:2001・PDF/X-1a:2003
PDF/X-3:2002・PDF/X-3:2003
PDF/X-4・PDF/X-4p
PDF/X-5g・PDF/X-5pg
プ レ ビ ュ ーが複製モー ド で生成 さ れ る と き は、 PPS は、 ブ ロ ッ ク PDF の以下の性質を、 生
成す る プ レ ビ ュ ーへ複製 し ます :
> PDF 規格識別。
> 出力 イ ン テ ン ト 条件。
> ページ寸法。 すべてのページボ ッ ク ス を含みます。
> XMP 文書 メ タ デー タ 。
規格準拠の PDF 文書を複製す る 際には、 すべてのブ ロ ッ ク 流 し 込み操作が、 それぞれの
規格に準拠 し てい る 必要があ り ま す。 た と えば、 出力 イ ン テ ン ト がな ければ、 ICC プ ロ
フ ァ イ ルのない RGB 画像は使 う こ と がで き ません。 同様に、 使用 し てい る フ ォ ン ト はす
べて埋め込む必要があ り ます。 要請の全一覧は、 253 ページ 「10.3 PDF/X に よ る 印刷出
力」 と 、 261 ページ 「10.4 PDF/A に よ る アーカ イ ビ ン グ」 に示 し てい ます。 PDF/A ま た
は PDF/X 複製モー ド でのブ ロ ッ ク 流 し 込み操作が、 選択 さ れてい る 規格に違反す る と き
には (デフ ォ ル ト 画像が RGB カ ラ ースペース を用いてい る に も かかわ ら ず、 文書が適切
な出力 イ ン テ ン ト を含んでいない場合等) 、 エ ラ ー メ ッ セージが表示 さ れ、 プ レ ビ ュ ーは
生成 さ れません。 こ れに よ り 、 ユーザーは作業フ ロ ーの非常に早い時点で、 規格違反の危
険を感知す る こ と がで き ます。
デ フ ォ ル ト テキス ト に記号 フ ォ ン ト を用い る ブ ロ ッ ク の デ フ ォ ル ト テ キ ス ト を 記号
フ ォ ン ト で与え る には、 2 つの方法があ り ます :
> Windowsの文字コ ー ド 表アプ リ ケーシ ョ ン な ど に示 さ れてい る 8 ビ ッ ト レ ガシ コ ー ド を
用い る : defaulttext に対 し て 8 ビ ッ ト コ ー ド を、 その対応す る 8 ビ ッ ト キ ャ ラ ク タ を
リ テ ラ ルに入力す る か (Windows の文字 コ ー ド 表か ら コ ピー/ 貼 り 付けす る な ど し て)、
あ る いは数値エ ス ケープシーケ ン ス と し て与え ます。 こ の場合には、 「テキス ト 作成」
プ ロ パテ ィ グループ内の charref プ ロ パテ ィ のデフ ォ ル ト 値を false に し てお く 必要が
あ り 、 ま た、 文字参照を用い る こ と はで き ません。 た と えば、 下記のデフ ォ ル ト テ キ
ス ト は、 charref=false の と き 、 記号フ ォ ン ト Wingdings の 「ス マ イ リ ー」 グ リ フ を生成
し ます :
J
\x4A
\112
> フ ォ ン ト 内で用い ら れてい る Unicode 値かグ リ フ名を用い る : 「テキス ト 作成」 プ ロ パ
テ ィ グループの charref プ ロ パテ ィ を true に設定 し た う えで、記号の文字参照かグ リ フ
名参照を与え ます (112 ページ 「4.5.2 文字参照」 参照)。 た と えば、 下記のデフ ォ ル ト
テ キ ス ト は、 charref=true の と き 、 記号フ ォ ン ト Wingdings の 「ス マ イ リ ー」 グ リ フ を
生成 し ます :
&#xF04A;
&.smileface;
11.4 Acrobat で ブ ロ ッ ク を プ レ ビ ュ ー
299
なお、 ど ち ら の方法で も 、 ブ ロ ッ ク プ ロ パテ ィ ダ イ ア ロ グ上は、 実際の記号グ リ フ ではな
く 文字化け し た状態で表示 さ れます。
300
第 11 章 : PPS と PDFlib Block Plugin
11.5 PPS で ブ ロ ッ ク へ流 し 込み
PPS でブ ロ ッ ク へ流 し 込みを行 う には、 まずブ ロ ッ ク を含むページ を、PDF_fit_pdi_page( )
関数で出力ページ上に貼 り 付け る 必要が あ り ま す。 ページ を貼 り 付け た後、 その上のブ
ロ ッ ク へ PDF_fill_*block( ) 関数群で流 し 込みを行 う こ と がで き ます。
簡単な例 : 可変テキス ト を テ ン プ レ ー ト に追加 PDF テ ンプ レー ト への動的テ キ ス ト の
追加は、 非常に頻繁に必要 と な る 動作です。 以下の コ ー ド では、 入力 PDF 文書 (テ ンプ
レー ト 、 ブ ロ ッ ク コ ン テナ) の中のページ を開 き 、 それを出力ページ上に配置 し 、 そ し て
firstname と い う テ キ ス ト ブ ロ ッ ク に可変テ キ ス ト を入れ込んでい ます :
doc = p.open_pdi_document(filename, "");
if (doc == -1)
throw new Exception("エラー : " + p.get_errmsg());
page = p.open_pdi_page(doc, pageno, "");
if (page == -1)
throw new Exception("エラー : " + p.get_errmsg());
p.begin_page_ext(width, height, "");
/* 取り込んだページを貼り付け */
p.fit_pdi_page(page, 0.0, 0.0, "");
/* 貼り付けたページ上のブロック1個へ流し込み */
p.fill_textblock(page, "firstname", "Serge", "encoding=winansi");
p.close_pdi_page(page);
p.end_page_ext("");
p.close_pdi_document(doc);
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの blocks/starter_block ト ピ ッ ク にあ り ます。
ブ ロ ッ ク のプ ロパテ ィ を上書 き 場合に よ っ てプ ロ グ ラ マーは、 ブ ロ ッ ク の定義が与え
てい る プ ロ パテ ィ 群を一部だけ採用 し 、その他のプ ロ パテ ィ を カ ス タ ムの値で上書 き し た
い こ と があ り ます。 こ れは さ ま ざ ま な場合に有用です :
> 業務上の要請であ る 種の上書 き が必要 と 判断 さ れ る 場合に対応。
> 画像・PDF ページの拡縮倍率を、ブ ロ ッ ク 定義か ら 採 ら ずに、アプ リ ケーシ ョ ンで算出。
> ブ ロ ッ ク の座標を プ ロ グ ラ ム で変え る 。 生成 し たい請求書のデー タ 項目数が一定でな
い場合等。
> 別々の ス ポ ッ ト カ ラ ー名を与え る こ と も 可能。 プ リ ン ト サービ ス業務で、 顧客ご と の
要請に合わせる ため。
プ ロ パテ ィ を上書 き す る には、 PDF_fill_*block( ) 関数群のオプシ ョ ン リ ス ト にプ ロ パテ ィ
の名前 と その値を与え ます。 例 :
p.fill_textblock(page, "firstname", "Serge", "fontsize=12");
こ れは、 ブ ロ ッ ク の内部の fontsize プ ロ パテ ィ を、 与え た値 12 で上書 き し ます。 ほ と ん
どすべてのプ ロ パテ ィ 名を、 オプシ ョ ン と し て用い る こ と が可能です。
プ ロ パテ ィ の上書 き は、 それぞれの関数呼び出 し にのみ適用 さ れ ます。 ブ ロ ッ ク 定義
内に保持 さ れ る わけではあ り ません。
11.5 PPS で ブ ロ ッ ク へ流 し 込み
301
流 し 込んだ ブ ロ ッ ク の上に取 り 込んだページ を配置 取 り 込んだページは、 ど のブ ロ ッ
ク 流 し 込み関数を使 う よ り も 前に、 出力ページ上に配置 し てお く 必要があ り ます。 と い う
こ と は元ページは通常、 ブ ロ ッ ク 内容 よ り も 下に配置 さ れ る こ と にな り ます。 し か し 場合
に よ っ ては、流 し 込みが行われたブ ロ ッ ク よ り も 上に元ページ を配置 し たい こ と も あ る で
し ょ う 。 こ れを実現す る には、 PDF_fit_pdi_page( ) の blind オプシ ョ ン を用いてページ を
一度貼 り 付け る こ と に よ り 、 そのページ上のブ ロ ッ ク と その位置を PPS に知 ら せてお き 、
ブ ロ ッ ク への流 し 込みが済んだ後にページ を再び貼 り 付け る こ と に よ り 、実際にページ内
容を表示 さ せます :
/* ブロックを用意するためにページをblindモードで配置してページを見えなくする */
p.fit_pdi_page(page, 0.0, 0.0, "blind");
/* ブロックへ流し込み */
p.fill_textblock(page, "firstname", "Serge", "encoding=winansi");
/* ... いろいろなブロックへ流し込み ... */
/* ページを再度配置、今度は見えるように */
p.fit_pdi_page(page, 0.0, 0.0, "");
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの blocks/block_below_contents ト ピ ッ ク にあ り ま
す。
ブ ロ ッ ク へ流 し 込む際に コ ン テ ナページ を無視 取 り 込んだブ ロ ッ ク は、 そのブ ロ ッ ク
の背景のページ内容を一切参照せずに、 プ レース ホルダ と し て使っ て も よ いで し ょ う 。 ブ
ロ ッ ク を持つ コ ン テナページ を ブ ラ イ ン ド モー ド で、すなわち PDF_fit_pdi_page( ) で blind
オプシ ョ ン を指定 し て、 1 個ない し 複数のページ上に取 り 込んだ う えで、 ブ ロ ッ ク への流
し 込みを行 う と い う 方法です。 こ う すれば、 出力ページ上に コ ン テナページ を貼 り 付け る
こ と な く 、 ブ ロ ッ ク やそのプ ロ パテ ィ の利点を活用する こ と がで き 、 ま た、 ブ ロ ッ ク を複
数のページ上に (あ る いは同一出力ページ上に さ え) 複製する こ と が可能にな り ます。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの blocks/duplicate_block ト ピ ッ ク にあ り ます。
テキス ト フ ロ ーブ ロ ッ ク を連結 テ キ ス ト フ ロ ーブ ロ ッ ク は、 前のブ ロ ッ ク か ら あふれ
たテ キ ス ト が次のブ ロ ッ ク に入 る よ う 、 連結する こ と が可能です。 た と えば、 長い可変テ
キ ス ト があ っ て、 別のページへ続かせ る 必要が想定 さ れ る 場合、 2 個のブ ロ ッ ク を連結 し
ておけば、 1 個目のブ ロ ッ ク がいっぱいにな っ て も 、 残 り は 2 個目のブ ロ ッ ク へ流 し 込ま
れます。
PPS は、 PDF_fill_textblock( ) と ブ ロ ッ ク プ ロ パテ ィ に与え ら れた テ キ ス ト か ら 、 1 個の
テ キ ス ト フ ロ ーを内部的に生成 し ます。 連結 さ れていないブ ロ ッ ク の場合は、 こ のテ キ ス
ト フ ロ ーはそのブ ロ ッ ク 内に配置 さ れ、そのテ キ ス ト フ ロ ーハン ド ルは呼び出 し が終わっ
た時点で削除 さ れ、 あふれたテ キ ス ト は失われます。
連結 さ れた テ キ ス ト フ ロ ーの場合は、 最初のブ ロ ッ ク へ流 し 込んだ後に余っ てい る あ
ふれテ キ ス ト を、 その次のブ ロ ッ ク へ流 し 込む こ と がで き ます。 最初のテ キ ス ト フ ロ ーの
余 り がブ ロ ッ ク 内容 と し て使われ、 新たなテ キ ス ト フ ロ ーは作成 さ れません。 テ キ ス ト フ
ロ ーブ ロ ッ ク の連結は以下の よ う に動作 し ます :
> 連結 さ れたテ キ ス ト ブ ロ ッ ク のチ ェーンの中の最初の PDF_fill_textblock( ) を呼び出す
時は、 textflowhandle オプシ ョ ンに値 -1 (PHP では 0) を与え る 必要があ り ます。 内
部的に生成 さ れたテ キ ス ト フ ロ ーハン ド ルを PDF_fill_textblock( ) が返 し ますので、 ア
プ リ ケーシ ョ ン側で こ れを保持 し てお く 必要があ り ます。
302
第 11 章 : PPS と PDFlib Block Plugin
> PDF_fill_textblock( ) への次の呼び出 し では、前段で返 さ れた テ キ ス ト フ ロ ーハン ド ルを
textflowhandle オプシ ョ ンに与え る こ と がで き ます ( こ の と き text 引数にテ キ ス ト を
与えて も 無視 さ れ る ので、 空にす る べ き です)。 ブ ロ ッ ク へ、 テ キ ス ト フ ロ ーの余 り が
流 し 込まれます。
> こ の処理を、 さ ら な る テ キ ス ト フ ロ ーブ ロ ッ ク 群に対 し て繰 り 返す こ と がで き ます。
> 返 さ れたテ キ ス ト フ ロ ーハン ド ルは、PDF_info_textflow( ) に与えれば、ブ ロ ッ ク 流 し 込
みの結果を知 る こ と がで き ます。 終了状況やテ キ ス ト の終了位置な ど がわか り ます。
なお、 fitmethod プ ロ パテ ィ は clip に設定す る 必要があ り ます (textflowhandle を与え て
い る と き はど のみち こ れがデフ ォ ル ト です) 。 テ キ ス ト フ ロ ーブ ロ ッ ク を連結す る 基本的
な コ ー ド の骨組みは以下の よ う にな り ます :
p.fit_pdi_page(page, 0.0, 0.0, "");
tf = -1;
for (i = 0; i < blockcount; i++)
{
String optlist = "encoding=winansi textflowhandle=" + tf;
tf = p.fill_textblock(page, blocknames[i], text, optlist);
text = null;
if (tf == -1)
break;
/* いちばん最近のfit_textflow()呼び出しの結果をチェック */
reason = (int) p.info_textflow(tf, "returnreason");
result = p.get_parameter("string", (float) reason);
/* テキストが全部配置されたならループを抜ける */
if (result.equals("_stop"))
{
p.delete_textflow(tf);
break;
}
}
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの blocks/linked_textblocks ト ピ ッ ク にあ り ます。
ブ ロ ッ ク の流 し 込み順序 ブ ロ ッ ク 関数群 PDF_fill_*block( ) は、 プ ロ パテ ィ と ブ ロ ッ ク 内
容を、 以下の順序で処理 し ます :
> 背景:backgroundcolor プ ロ パテ ィ が存在 し 、かつ None 以外のカ ラ ースペース キーワー
ド を持っ てい る と き は、 ブ ロ ッ ク 領域は指定 さ れた色で塗 ら れます。
> 枠線 :bordercolor プ ロ パテ ィ が存在 し 、かつ None 以外のカ ラ ースペース キーワー ド を
持っ てい る と き は、 ブ ロ ッ ク の枠は指定 さ れた色 と 線幅で描線 さ れます。
> 内容 : 与え ら れたブ ロ ッ ク 内容 と 、 bordercolor ・ linewidth 以外のすべてのプ ロ パテ ィ
が処理 さ れます。
> テ キ ス ト 行 ・ テ キ ス ト フ ロ ーブ ロ ッ ク : テ キ ス ト も デフ ォ ル ト テ キ ス ト も 与え ら れて
いない と き は、 何の出力 も 行われません。 背景色やブ ロ ッ ク の枠線 も あ り ません。
入れ子にな っ た ブ ロ ッ ク ブ ロ ッ ク へ流 し 込みを行 う 前には、 そのブ ロ ッ ク を含むペー
ジ を出力ページ上に ま ず貼 り 付け る 必要が あ り ま す (そ う でない と 、 ページ を拡縮 ・ 回
転 ・ 平行移動 し た後のブ ロ ッ ク の位置を PPS が知 り え ないため)。 ページ をブ ロ ッ ク の コ
11.5 PPS で ブ ロ ッ ク へ流 し 込み
303
ン テナ と し てのみ使っ てお り 、 静的内容を新ページへ複製 し な く て よ い場合には、 取 り 込
んだページ を、 blind オプシ ョ ン を用いて貼 り 付け る こ と がで き ます。
取 り 込んだページ を、 ど の よ う な方法で出力ページ上に貼 り 付けて も 、 ブ ロ ッ ク への
流 し 込みは行 う こ と がで き ます :
> ページは、 PDF_fit_pdi_page( ) で直接貼 り 付け る こ と がで き ます。
> ページは、 テーブルセル内に PDF_fit_table( ) で間接的に貼 り 付け る こ と がで き ます。
> ページは、他の PDF ブ ロ ッ ク の内容 と し て PDF_fill_pdfblock( ) で貼 り 付け る こ と がで き
ます。
こ の 3 番目の方法、 すなわち PDF ブ ロ ッ ク へ、 ブ ロ ッ ク を含む他のページ を流 し 込む と
い う 方法を用い る と 、 ブ ロ ッ ク コ ン テナを入れ子にす る こ と がで き ます。 こ れを活用す る
と 、 面白い使い方を簡単に実装で き ます。 た と えば、 2 段階のブ ロ ッ ク 流 し 込み処理で、
組み付け と パー ソ ナ ラ イ ゼーシ ョ ンの両方を実装する こ と がで き ます :
> 第一層のブ ロ ッ ク コ ン テナページには、い く つかの大 き な PDF ブ ロ ッ ク を置 き ます。こ
れ ら は、 印刷す る 紙の上の主要な領域を表 し てい ます。 PDF ブ ロ ッ ク の配置は、 想定
し てい る 紙の後工程を反映 し てい ます (折 り ・ 断裁等)。
> こ の第一層の PDF ブ ロ ッ ク それぞれへ、第二層の コ ン テナ PDF ページ を流 し 込みます。
こ の PDF ページには、 テ キ ス ト ・ 画像 ・ PDF ブ ロ ッ ク を置いてお き 、 それ ら へ可変テ
キ ス ト を流 し 込んでパー ソ ナ ラ イ ゼーシ ョ ン を行い ます。
こ の方法で、 ブ ロ ッ ク コ ン テナは入れ子にす る こ と がで き ます。 ブ ロ ッ ク の入れ子は何重
で も 可能ですが、 三重以上の入れ子が必要にな る こ と は まれで し ょ う 。
こ の第二層のブ ロ ッ ク コ ン テナは、 各組み付けページで同 じ にす る こ と も で き ます し 、
別の も のにす る こ と も で き ます。 も し 同 じ に し た場合は、 すべての第二層ブ ロ ッ ク への流
し 込みが済んでか ら 、 次の第一層ブ ロ ッ ク への流 し 込みを行 う 必要が あ り ま す。 なぜな
ら 、 第二層ブ ロ ッ ク をページ上に配置す る ための情報は、 次の イ ン ス タ ン ス の第二層 コ ン
テナページが配置 さ れた時点で、 利用不可能にな る か ら です。
ク ッ ク ブ ッ ク 完全な コ ー ド サン プルが ク ッ ク ブ ッ クの blocks/nested_blocks ト ピ ッ ク にあ り ます。
ブ ロ ッ ク の座標 ブ ロ ッ ク の矩形の座標は、 PDF のデフ ォ ル ト 座標系を参照 し てい ます。
ブ ロ ッ ク を含んだページ を PPS で出力ページに配置する と き には、 PDF_fit_pdi_page( ) に
対 し てい く つかの配置オプシ ョ ンや拡縮オプシ ョ ン を与え る こ と がで き ます。 こ れ ら のオ
プシ ョ ンは、 そのブ ロ ッ ク が処理 さ れ る 際に考慮 さ れます。 こ れを利用す る と 、 1 つのテ
ンプ レー ト ページ を出力ページ上に何度で も 配置 し て、そのたびにそのブ ロ ッ ク 群へデー
タ を流 し 込む こ と がで き ます。 た と えば 1 枚の組み付け紙上に、 1 つの名刺テ ンプ レー ト
を 4 回配置す る と い っ た こ と が可能です。 ブ ロ ッ ク 関数群は、 座標系の変換を正 し く 行
い、 すべてのブ ロ ッ ク に対 し て、 それがページ上に配置 さ れ る たびに、 正 し く テ キ ス ト を
配置 し ます。 ク ラ イ ア ン ト に求め ら れ る のはただ、 ページ を配置 し て、 そ し てその配置 し
たページ上のすべてのブ ロ ッ ク を処理す る こ と だけです。 以後はそのページ を、 出力ペー
ジ上の他の場所に配置 し た う えで、その新 し い場所に対 し て さ ら にブ ロ ッ ク 処理操作を行
う こ と がで き 、 こ れを繰 り 返 し てい く こ と が可能です。
Block Plugin におけ る ブ ロ ッ ク 座標の表示の さ れかたは、 PDF フ ァ イ ル内に格納 さ れて
い る も の と は異な っ てい ま す。 プ ラ グ イ ン では Acrobat の方式を用いて、 座標の原点を
ページの左上隅に置いてい ま すが、 内部座標 (ブ ロ ッ ク 内に格納 さ れてい る も の) では
PDF の方式を用いて、 座標の原点をページの左下隅に置いてい る ためです。 プ ロ パテ ィ ダ
イ ア ロ グの座標表示は、 Acrobat で指定 さ れてい る 単位に も 従い ます (285 ページ 「ブ ロ ッ
ク の大 き さ と 位置」 参照)。
304
第 11 章 : PPS と PDFlib Block Plugin
ブ ロ ッ ク プ ロパテ ィ で スポ ッ ト カ ラ ー ブ ロ ッ ク プ ロ パテ ィ で特色 (ス ポ ッ ト カ ラ ー) を
使 う には、 「...」 を ク リ ッ ク すれば、 HKS ・ PANTONE ス ポ ッ ト カ ラ ーの全一覧を表示 さ せ
る こ と がで き ます。 こ れ ら の色名は PPS に内蔵 さ れてお り (80 ページ 「3.5.2 Pantone ・
HKS ・ カ ス タ ム ス ポ ッ ト カ ラ ー」 参照) 、 それ以上の準備な し に使用で き ます。 カ ス タ ム
ス ポ ッ ト カ ラ ーに対 し ては、 Block Plugin で代替色を定義す る こ と が可能です。 ブ ロ ッ ク
プ ロ パ テ ィ で 代替 色 を 指 定 し て い な い と き は、 PPS
アプ リ ケーシ ョ ン で
PDF_
makespotcolor( ) を用いて カ ス タ ム ス ポ ッ ト カ ラ ーを あ ら か じ め定義 し てお く 必要があ り
ます。 そ う でない と ブ ロ ッ ク への流 し 込みは失敗 し ます。
11.5 PPS で ブ ロ ッ ク へ流 し 込み
305
11.6 ブ ロ ッ ク のプ ロパテ ィ
PPS と Block Plugin では、 ど の種類のブ ロ ッ ク に対 し て も 適用す る こ と ので き る 一般プ ロ
パテ ィ 群が用意 さ れてい ます。 そのほかに、 ブ ロ ッ ク の種類 「テキス ト 行」 ・ 「テキス ト フ
ロー」 ・ 「画像」 ・ 「PDF ブ ロ ッ ク」 にそれぞれ特有のプ ロ パテ ィ 群 も あ り ます。
プ ロ パテ ィ は、 ハン ド ル と ア ク シ ョ ン リ ス ト を除いて、 オプシ ョ ン リ ス ト と 同 じ デー
タ 型に対応 し てい ます。
ブ ロ ッ ク プ ロ パテ ィ の名前は一般に、 PDF_fit_image( ) に対す る オプシ ョ ン と 同 じ です
(fitmethod ・ charspacing 等)。 その場合、 それぞれの動作は、 対応す る オプシ ョ ンの解説
に書いて あ る も の と ま っ た く 同 じ です。
11.6.1 管理プ ロパテ ィ 群
管理プ ロ パ テ ィ 群は、 すべて の種類のブ ロ ッ ク に適用 さ れ ま す。 必須の項目は、 Block
Plugin に よ っ て自動生成 さ れます。 表 11.4 に、 管理プ ロ パテ ィ の一覧を示 し ます。
表 11.4 管理プ ロパテ ィ 一覧
キーワー ド
と り う る値 ・ 解説
Description
(文字列) ブ ロ ッ クの機能に関する、 人が読める説明。 エ ン コ ーデ ィ ングは PDFDocEncoding か
Unicode (後者の場合は先頭 BOM)。 こ のプ ロパテ ィ は、 ユーザーへの情報提供のためだけにあ り 、
PPS には無視 さ れます。
Locked
(論理値) true な ら、 ブ ロ ッ ク と そのプ ロパテ ィ は Block Plugin で編集で き ません。 こ のプ ロパ
テ ィ は PPS には無視 さ れます。 デ フ ォ ル ト : false
Name
(文字列、 必須) ブ ロ ッ クの名前。 ブ ロ ッ ク 名は、 ページ ご と に一意である必要があ り ますが、 文
書内では一意で な く て もかまいません。 3 種のキ ャ ラ ク タ [ ] / は、 ブ ロ ッ ク名には使え ません。
ブ ロ ッ ク名は最長 125 文字です。
Subtype
(キーワー ド 、 必須) ブ ロ ッ ク の種類によ っ て、 Text ・ Image ・ PDF のいずれか。 テキス ト 行ブ ロ ッ
ク と テキス ト フ ローブ ロ ッ クは、 と も に Subtype が Text にな る こ と に留意 し て く だ さ い。 両者は
textflow プ ロパテ ィ によ っ て識別 さ れます。
textflow
(論理値) 一行処理か複数行処理かを制御 し ます。 こ のプ ロパテ ィ は、 Block Plugin のユーザー イ ン
タ フ ェ ースでは表示 さ れず、 それぞれテキス ト 行ブ ロ ッ ク と テキス ト フ ローブ ロ ッ ク と し て表 さ
れます (デ フ ォ ル ト : false) :
Type
306
false
テキス ト 行ブ ロ ッ ク : テキス ト が一行で組まれ、 PDF_fit_textline( ) で処理 さ れます。
true
テキス ト フ ローブ ロ ッ ク : テキス ト が複数行にわた る場合があ り 、 PDF_fit_textflow( ) で
処理 さ れます。 標準テキス ト プ ロパテ ィ 群に加え、 テキス ト フ ロー関連のプ ロパテ ィ 群
も 指定で き ます (表 11.9 参照)。
(キーワー ド 、 必須) つねに Block
第 11 章 : PPS と PDFlib Block Plugin
11.6.2 矩形プ ロパテ ィ 群
矩形プ ロ パテ ィ 群は、 すべての種類のブ ロ ッ ク に適用 さ れます。 こ れ ら は、 ブ ロ ッ ク の矩
形本体の書式を記述 し ます。 必須の項目は、 Block Plugin に よ っ て自動生成 さ れます。 表
11.5 に、 矩形プ ロ パテ ィ の一覧を示 し ます。
表 11.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 プ ロパテ ィ が無視 さ れる、 すなわち可変内容がない と き (特に
プ レ ビ ュ ーで) ブ ロ ッ クが空のま まにな る点を除き、 active と 同 じ です。 こ れは特に、
ブ ロ ッ ク がプ レ ビ ュ ー生成のためのデ フ ォ ル ト 内容を持 っ ているかも し れないけれど
も 、 サーバサイ ド で ブ ロ ッ ク へ流 し 込みが行われる際にはそのブ ロ ッ クのデ フ ォル ト 内
容が用い られないよ う に し たい と き に有用です。 また、 ブ ロ ッ ク を プ レ ビ ュ ーする際に
も 、 ブ ロ ッ ク プ ロパテ ィ から デ フ ォ ル ト 内容を削除する こ と な く デ フ ォ ル ト 内容を無効
化する ために用いる こ と がで き ます。
static
可変内容が配置 さ れません。 ブ ロ ッ ク にデ フ ォル ト のテキス ト ・ 画像 ・ PDF 内容があれ
ば、 それが用い られます。
11.6 ブ ロ ッ クのプ ロパテ ィ
307
11.6.3 書式プ ロパテ ィ 群
書式プ ロ パテ ィ 群は、 組版の詳細を指定 し ます :
> 表 11.6 に、 透過書式プ ロ パテ ィ の一覧を示 し ます。 こ れ ら は、 すべての種類のブ ロ ッ
ク に適用 さ れます。
> 表 11.7 に、 テ キ ス ト 書式プ ロ パテ ィ の一覧を示 し ます。 こ れ ら は、 テ キ ス ト 行ブ ロ ッ
ク と テ キ ス ト フ ロ ーブ ロ ッ ク に適用 さ れます。
表 11.6 透過書式プ ロパテ ィ 一覧 (すべてのブ ロ ッ ク に適用)
キーワー ド
と り う る値 ・ 解説
blendmode
(キーワー ド リ ス ト 。 PDF 1.4。 PDF/A モー ド で用い られる と きは値 Normal を持つ必要があ り ま
す) ブ レ ン ド モー ド の名前 : None・Color・ColorDodge・ColorBurn・Darken・Difference・
Exclusion・HardLight・Hue・Lighten・Luminosity・Multiply・None・Normal・Overlay・
Saturation・Screen・SoftLight。 デ フ ォル ト : None
opacityfill
(float。 PDF 1.4。 PDF/A モー ド で用い ら れる と きは値 1 を持つ必要があ り ます) 塗 り 操作の不透明
度を範囲 0 ~ 1 で表 し た も の。 値 0 は完全透過を意味 し 、 1 は完全不透過を意味 し ます。
opacitystroke
(float。 PDF 1.4。 PDF/A モー ド で用い ら れる と きは値 1 を持つ必要があ り ます) 描線操作の不透明
度を範囲 0 ~ 1 で表 し た も の。 値 0 は完全透過を意味 し 、 1 は完全不透過を意味 し ます。
308
第 11 章 : PPS と PDFlib Block Plugin
表 11.7 テキス ト 書式プ ロパテ ィ 一覧 (テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク に適用)
キーワー ド
と り う る値 ・ 解説
charspacing
(float またはパーセ ン ト 値) 文字間隔。 パーセ ン ト 値は fontsize に対する割合。 デ フ ォ ル ト : 0
decorationabove
(論理値) true の場合、 underline ・ strikeout ・ overline オプ シ ョ ン で有効に さ れた テキス ト 装
飾がテキス ト の前面に描かれ、 そ う で なければテキス ト の背面に描かれます。 描画順序を変え る
と 、 装飾線の書式に影響を与え ます。 デ フ ォル ト : false
fillcolor
(色) テキス ト の塗 り 色。 デ フ ォ ル ト : gray 0 (= 黒)
1
fontname
(文字列) フ ォ ン ト の名前。 PDF_load_font( ) が求める も の と 同 じ です。 Block Plugin では、 シ ス テム
で利用可能な フ ォ ン ト の一覧が表示 さ れます。 ただ し こ う し た フ ォ ン ト 名は、 Mac ・ Windows ・
Unix シ ス テム間で互換 と は限 り ません。 fontname の先頭が 「@」 キ ャ ラ ク タ であ る場合は、 その
フ ォ ン ト は縦書き モー ド で適用 さ れます。
ブ ロ ッ ク への流 し 込み時には、 PDF_fill_textblock( ) にオプ シ ョ ン と し て テキス ト のエ ン コ ーデ ィ ン
グ を与え る必要があ り ます。 ただ し 、 font オプ シ ョ ンが与え られている場合は除き ます。
fontsize1
(float) 文字のサイ ズをポ イ ン ト 単位で指定 し ます
fontstyle
(キーワー ド ) フ ォ ン ト ス タ イル。 normal ・ bold ・ italic ・ bolditalic のいずれかで なければな り
ません
horizscaling
(float またはパーセ ン ト 値) テキス ト の水平倍率。 デ フ ォル ト : 100%
italicangle
(float) テキス ト の斜体角度を度単位で表 し た もの。 デ フ ォル ト : 0
kerning
(論理値) カ ーニ ングの動作。 デ フ ォル ト : false
monospace
(整数 : 1 ~ 2048) フ ォ ン ト の全キ ャ ラ ク タ を強制的に等幅に し ます。 デ フ ォル ト : 無指定 ( フ ォ
ン ト の メ ト リ ッ クが用い られます)
overline
(論理値) 上線のモー ド 。 デ フ ォ ル ト : false
strikeout
(論理値) 取 り 消 し 線のモー ド 。 デ フ ォ ル ト : false
strokecolor
(色) テキス ト の描線色。 デ フ ォ ル ト : gray 0 (= 黒)
strokewidth
(float ・ パーセ ン ト 値 ・ キーワー ド のいずれか。 textrendering が袋文字に設定 さ れている と きの
み意味を持ち ます) 袋文字の線幅 (ユーザー座標で、 または percentage に対するパーセ ン ト 値
で)。 キーワー ド auto または値 0 は内蔵のデ フ ォ ル ト を用います。 デ フ ォル ト : auto
textrendering
(整数) テキス ト 表現モー ド 。 Type 3 フ ォ ン ト では値 3 のみ意味を持ち ます (デ フ ォル ト : 0) :
0
P
1
2
3
P
テキス ト を塗る
4
テキス ト を塗 り 、 ク リ ッ ピ ングパスに追加
テキス ト を描線 (袋文字) 5
テキス ト を描線 し 、 ク リ ッ ピ ン グパスに追加
テキス ト を塗 っ て描線
6
テキス ト を塗っ て描線 し 、 ク リ ッ ピ ン グパスに追加
不可視テキス ト
7
テキス ト を ク リ ッ ピ ングパスに追加
(ブ ロ ッ ク では不可)
textrise
(float またはパーセ ン ト 値) テキス ト の縦方向のオ フ セ ッ ト 。 パーセ ン ト 値は fontsize に対する
割合。 デ フ ォル ト : 0
underline
(論理値) 下線のモー ド 。 デ フ ォ ル ト : false
underlineposition
(float ・ パーセ ン ト 値 ・ キーワー ド のいずれか) 下線テキス ト のベース ラ イ ンに対する描線の相対
位置。 パーセ ン ト 値は fontsize に対する割合。 デ フ ォ ル ト : auto
11.6 ブ ロ ッ クのプ ロパテ ィ
309
表 11.7 テキス ト 書式プ ロパテ ィ 一覧 (テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク に適用)
キーワー ド
と り う る値 ・ 解説
underlinewidth
(float ・ パーセ ン ト 値 ・ キーワー ド のいずれか) 下線テキス ト の線幅。 パーセ ン ト 値は fontsize に
対する割合。 デ フ ォ ル ト : auto
wordspacing (float またはパーセ ン ト 値) 単語間隔。 パーセ ン ト 値は fontsize に対する割合。 デ フ ォル ト : 0
1. このプ ロパテ ィ は、 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク では必須です。 Block Plugin は こ れを自動生成 し ます。
310
第 11 章 : PPS と PDFlib Block Plugin
11.6.4 テキス ト 作成プ ロパテ ィ 群
テ キ ス ト 作成プ ロ パテ ィ 群は、 テ キ ス ト 行 ・ テ キ ス ト フ ロ ーブ ロ ッ ク の前処理工程を指定
し ます。 表 11.8 に、 テ キ ス ト 行 ・ テ キ ス ト フ ロ ーブ ロ ッ ク に適用 さ れ る テ キ ス ト 作成プ
ロ パテ ィ の一覧を示 し ます。
表 11.8 テキス ト 作成プ ロパテ ィ 一覧 (テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク に適用)
キーワー ド
と り う る値 ・ 解説
charref
(論理値) true な ら、 数値参照 ・ 文字参照 ・ グ リ フ 名参照の置き換え を行います。 デ フ ォル ト : グ
ローバルな charref なパラ メ タ
escapesequence
(論理値) true な ら、 内容文字列 ・ ハイパーテキス ト 文字列 ・ 名前文字列内のエ スケープ シーケ ン
スの置き換え を行います。 デ フ ォル ト : グ ローバルな escapesequence パラ メ タ
features
(キーワー ド の リ ス ト ) script ・ language オプ シ ョ ンに従っ て、 OpenType フ ォ ン ト のどの タ イ ポ
グ ラ フ ィ 機能を テキス ト に適用するかを指定 し ます。 フ ォ ン ト 内に存在 し ない機能に対するキー
ワー ド は、 エ ラ ーを出 さ ずに無視 さ れます。 以下のキーワー ド を与え る こ と がで き ます :
_none
フ ォ ン ト 内のどの機能 も適用 し ません。 ただ し vert 機能だけは、 novert キーワー ド で
明示的に無効化する必要があ り ます。
< 名前 >
4 文字の OpenType タ グ名を与えてその機能を有効に し ます。 よ く 用い ら れる機能名は
liga ・ ital ・ tnum ・ smcp ・ swsh ・ zero です。 利用で き るすべての機能の名前 と 説明の
全一覧は、 154 ページ 「6.3.1 対応 し ている OpenType レ イ アウ ト 機能」 に示 し ていま
す。
no< 名前 > 機能名の前に接尾辞 no をつける と (noliga 等) その機能が無効化 さ れます。
デ フ ォル ト : 横書き モー ド では _none。 縦書き モー ド では vert が自動的に適用 さ れます。
OpenType 機能を利用する には、 PDF_load_font( ) で readfeatures オプ シ ョ ンが必須です。
language
(キーワー ド 。 script が与え ら れている と きのみ意味を持ち ます) 指定 さ れた言語に従っ て テキス
ト が処理 さ れます。 こ れは features ・ shaping オプ シ ョ ン に対 し て意味を持ち ます。 キーワー ド
の全一覧は 163 ページ 「6.4.2 用字系 と 言語」 に示 し ています。 例 : ARA (ア ラ ビ ア語) ・ JAN (日本
語) ・ HIN ( ヒ ンデ ィ ー語)。 デ フ ォ ル ト : _none (言語未定義)
script
(キーワー ド 。 shaping=true の と きは必須) 指定 さ れた用字系に従 っ て テキス ト が処理 さ れます。
こ れは features ・ shaping ・ advancedlinebreak オプ シ ョ ンに対 し て意味を持ち ます。 用字系 と し
て も っ と も よ く 用い ら れるキーワー ド は次の と お り です : _none (未定義用字系) latn ・ grek ・
cyrl ・ armn ・ hebr ・ arab ・ deva ・ beng ・ guru ・ gujr ・ orya ・ taml ・ thai ・ laoo ・ tibt ・ hang ・
kana ・ han。 キーワー ド _auto を指定する と 、 テキス ト 内のキ ャ ラ ク タ の多数が属する用字系が選
ばれますが、 ただ し _latn と _none は無視 さ れます。 キーワー ド の全一覧は 163 ページ 「6.4.2 用
字系 と 言語」 に示 し ています。 デ フ ォル ト : _none
shaping
(論理値) true な ら、 script ・ language オプ シ ョ ンに従っ て文字の字形選択 (シ ェ ーピ ング) が
行われます。 script オプ シ ョ ンが _none 以外の値を持つ必要があ り 、 かつ、 必要な シ ェ ーピ ング
テーブルがフ ォ ン ト 内に存在 し ている必要があ り ます。 デ フ ォ ル ト : false
11.6 ブ ロ ッ クのプ ロパテ ィ
311
11.6.5 テキス ト 組版プ ロパテ ィ 群
表 11.9 に、 テ キ ス ト フ ロ ーブ ロ ッ ク に対 し てのみ用い る こ と がで き る テ キ ス ト 組版プ ロ
パテ ィ の一覧を示 し ます。 ただ し stamp プ ロ パテ ィ だけは、 テ キ ス ト 行ブ ロ ッ ク に対 し て
も 用い る こ と がで き ます。 こ れ ら は、 テ キ ス ト フ ロ ーを処理す る ための初期オプシ ョ ン リ
ス ト を構築す る ために用い ら れます (PDF_create_textflow( ) の optlist パ ラ メ タ と 対応 し て
い ます) 。 テ キ ス ト フ ロ ーで用い る イ ン ラ イ ンオプシ ョ ン リ ス ト は、 プ ラ グ イ ンでは指定
す る こ と がで き ず、 サーバ上で PDF_fill_textblock( ) に よ る ブ ロ ッ ク への流 し 込みの際に、
ま たはブ ロ ッ ク の defaulttext プ ロ パテ ィ 内で、 テ キ ス ト 内容の一部 と し て与え る こ と が
で き ます。
表 11.9 テキス ト 組版プ ロパテ ィ 一覧 (主にテキス ト フ ローブ ロ ッ ク に適用)
キーワー ド
と り う る値 ・ 解説
adjustmethod
(キーワー ド ) minspacing ・ maxspacing オプ シ ョ ン で指定 さ れた制限内で単語間隔を詰めた り 拡げ
た り し て も テキス ト の一部が行内に収ま ら ない時、 行の調整に用いる方式 (デ フ ォル ト : auto) :
advancedlinebreak
alignment
auto
次の方式を順に適用 : shrink ・ spread ・ nofit ・ split。
clip
はめ込み枠の右端 (rightindent オプ シ ョ ン を考慮) からはみ出 し た部分を切 り 落 と す
点を除いて、 nofit と 同 じ 。
nofit
最後の単語を次行へ送 り ます。 ただ し 、 残 さ れる (短い) 行が、 nofitlimit オプ シ ョ
ン で指定 さ れたパーセ ン ト 値よ り も短 く な ら ない場合に限 り ます。 均等配置の段落で
あ っ て も 、 若干がたついて見え る こ と があ り ます。
shrink
単語が行内に収ま ら ない と き、 テキス ト を shrinklimit の制限内で圧縮 し ます。 それで
も 収ま ら なければ nofit 方式を適用 し ます。
split
最後の単語を次行へ送 ら ず、 強制的にハイ フ ネーシ ョ ン し ます。 テキス ト フ ォ ン ト な ら
ハイ フ ンキ ャ ラ ク タ を挿入 し ますが、 記号フ ォ ン ト な ら挿入 し ません。
spread
最後の単語を次行へ送 り 、 残 さ れた (短い) 行を均等配置する よ う 単語内の文字間の間
隔を spreadlimit の制限内で拡げます。 それで均等配置で き なければ nofit 方式を適用
し ます。
(論理値) 複雑用字系で必要 と さ れる高度な改行アルゴ リ ズムを適用 し ます。 こ れは タ イ語等、 単
語間の区切 り を空白キ ャ ラ ク タ を用いて示 さ ない用字系での改行に必須です。 locale ・ script オ
プ シ ョ ンに従います。 デ フ ォ ル ト : false
(キーワー ド ) 段落内の行の書式を指定。 デ フ ォル ト : left。
left
左揃え (leftindent を始点 と し て)。
center
中央揃え (leftindent から rightindent ま での間で)。
right
右揃え (rightindent を終点 と し て)。
justify
両端揃え。
avoidemptybegin
(論理値) true な ら、 はめ込み枠先頭の空行が削除 さ れます。 デ フ ォ ル ト : false
fixedleading
(論理値) true な ら、 各行内で最初に見つかっ た行送 り 値を用います。 そ う で ないな ら、 行内のす
べての行送 り 値の う ちの最大値を用います。 デ フ ォル ト : false
hortabmethod
(キーワー ド ) テキス ト 内の水平 タ ブの扱い。 算出位置がカ レ ン ト テキス ト 位置よ り 左の と きは、
その タ ブは無視 さ れます (デ フ ォ ル ト : relative) :
relative
hortabsize で指定 さ れた分、 位置を進めます。
typewriter hortabsize の次の倍数ま で位置を進めます。
ruler
312
ruler オプ シ ョ ン内の n 番目の タ ブ値ま で位置を進めます。 こ こ で n は、 その行内でそ
れま でに見つか っ た タ ブの数です。 n が タ ブ位置の数を超え る分については、 relative
方式を適用 し ます。
第 11 章 : PPS と PDFlib Block Plugin
表 11.9 テキス ト 組版プ ロパテ ィ 一覧 (主にテキス ト フ ローブ ロ ッ ク に適用)
キーワー ド
と り う る値 ・ 解説
hortabsize
(float またはパーセ ン ト 値) 水平 タ ブの幅1。 その解釈は hortabmethod オプ シ ョ ンに依存 し ます。
デ フ ォル ト : 7.5%
lastalignment
(キーワー ド ) 段落内の最終行の書式。 alignment オプ シ ョ ンのすべてのキーワー ド を用いる こ と
がで き るほか、 以下のキーワー ド も用いる こ と がで き ます (デ フ ォ ル ト : auto) :
auto
alignment オプ シ ョ ンの値を用います。 ただ し それが justify の と きは left を用いま
す。
leading
(float またはパーセ ン ト 値) テキス ト のベース ラ イ ン間の間隔。 ユーザー座標で、 または文字サイ
ズに対するパーセ ン ト 値で指定 し ます。 デ フ ォ ル ト : 100%
locale
(キーワー ド ) advancedlinebreak=true の と き、 用字系特有の改行方式で用い られる ロ ケール。
キーワー ド は、 以下の構成要素 (複数可) から 成 り 、 オプ シ ョ ナルな構成要素は下線キ ャ ラ ク タ
「_」 で区切られます (その文法は、 NLS/POSIX のロ ケール ID と は若干異な っ ています) :
> (必須) ISO 639-2 に従っ た、 小文字 2 文字または 3 文字の言語 コ ー ド (www.loc.gov/standards/
iso639-2 参照)。 例 : en (英語) ・ de ( ド イ ツ語) ・ ja (日本語)。 こ れは language オプ シ ョ ン と
は異な っ ています。
> (オプ シ ョ ン) ISO 15924 に従っ た、 4 文字の用字系 コ ー ド (www.unicode.org/iso15924/iso15924codes.html 参照)。 例 : Hira (ひ ら がな) ・ Hebr (ヘブ ラ イ文字) ・ Arab (ア ラ ビ ア文字) ・ Thai
( タ イ文字)。
> (オプ シ ョ ン) ISO 3166 に従 っ た、 大文字 2 文字の国 コ ー ド (www.iso.org/iso/country_codes/iso_
3166_code_lists 参照)。 例 : DE ( ド イ ツ) ・ CH (ス イ ス) ・ GB (イ ギ リ ス)。
ロケールを指定する こ と は、 高度な改行のために必須ではあ り ません。 キーワー ド _none は、 ロ
ケール独自の処理が行われない こ と を指定 し ます。 デ フ ォル ト : _none。
例 : de_DE ・ en_US ・ en_GB
maxspacing
minspacing
(float またはパーセ ン ト 値) 単語間の最大間隔 ・ 最小間隔 (ユーザー座標で表すか、 空白キ ャ ラ ク
タ の幅に対するパーセ ン ト 値で指定)。 算出 さ れる単語間隔が、 与え ら れた値ま でに制限 さ れます
(ただ し 、 wordspacing オプ シ ョ ンはなお加算 さ れます)。 デ フ ォル ト : minspacing=50%、
maxspacing=500%
minlinecount
(整数) はめ込み枠の最終段落の最小行数。 こ れよ り 行が少ない と きは、 次のはめ込み枠内に配置
さ れます。 値 2 を用いる と 、 段落の中の 1 行だけがはめ込み枠末尾に配置 さ れる (「オー フ ァ ン」)
のを避け られます。 デ フ ォル ト : 1
nofitlimit
(float またはパーセ ン ト 値) nofit 方式における行の長 さ の下限 (ユーザー座標で表すか、 はめ込
み枠の幅に対するパーセ ン ト 値で指定)。 デ フ ォル ト : 75%
parindent
(float またはパーセ ン ト 値) 段落の先頭行の左イ ンデン ト 1。 leftindent に こ の値が加算 さ れま
す。 このオプ シ ョ ン を行内で指定する と 、 タ ブのよ う に動作 し ます。 デ フ ォ ル ト : 0
rightindent
leftindent
(float またはパーセ ン ト 値) 全テキス ト 行の右イ ンデン ト ・ 左イ ンデン ト 1。 leftindent が行内で
指定 さ れた場合、 決定 さ れた位置がカ レ ン ト テキス ト 位置よ り 左の と きは、 こ のオプ シ ョ ンはカ
レ ン ト 行については無視 さ れます。 デ フ ォ ル ト : 0
ruler2
(float の リ ス ト 、 ま たはパーセ ン ト 値の リ ス ト ) hortabmethod=ruler に対する絶対 タ ブ位置の リ ス
ト 1。 この リ ス ト は、 非負値を昇順で最大 32 個持て ます。 デ フ ォル ト : hortabsize の整数倍
shrinklimit
(パーセ ン ト 値) shrink 方式における テキス ト 長体の下限。 算出 さ れる縮小率が、 与え られた値ま
でに制限 さ れます。 ただ し 、 horizscaling オプ シ ョ ンの値が乗算 さ れます。 デ フ ォ ル ト : 85%
spreadlimit
(float またはパーセ ン ト 値) spread 方式における 2 文字間の間隔の上限 (ユーザー座標で表すか、
文字サイ ズに対するパーセ ン ト 値で指定)。 算出 さ れた文字間隔が、 charspacing オプ シ ョ ンの値
に加算 さ れます。 デ フ ォル ト : 0
11.6 ブ ロ ッ クのプ ロパテ ィ
313
表 11.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 におけるルーラタブ」で編
集する こ と がで き ます。
314
第 11 章 : PPS と PDFlib Block Plugin
11.6.6 オ ブ ジ ェ ク ト はめ込みプ ロパテ ィ 群
はめ込みプ ロ パテ ィ 群は、 すべての種類のブ ロ ッ ク で利用で き ますが、 い く つかのプ ロ パ
テ ィ は、 特定の種類のブ ロ ッ ク でのみ利用で き ます。 こ れ ら は、 ブ ロ ッ ク 内に内容が配置
さ れ る 方法を管理 し ます :
> 表 11.10 に、 テ キ ス ト 行 ・ 画像 ・ PDF ブ ロ ッ ク で利用で き る はめ込みプ ロ パテ ィ の一覧
を示 し ます。
> 表 11.11 に、テ キ ス ト フ ロ ーブ ロ ッ ク で利用で き る はめ込みプ ロ パテ ィ の一覧を示 し ま
す (主に縦方向のはめ込みに関す る も のです)。
オ ブ ジ ェ ク ト は め込み ア ル ゴ リ ズ ム は、 ブ ロ ッ ク 矩形 を は め込み枠 と し て 用い ま す。
fitmethod=clip の場合を除 き 、 切 り 落 と し は行われません。 ブ ロ ッ ク 内容がブ ロ ッ ク 矩形
か ら はみ出 さ ない よ う に し たい と き は、 fitmethod=nofit を避けて く だ さ い。
表 11.10 はめ込みプ ロパテ ィ 一覧 (テキス ト 行 ・ 画像 ・ PDF ブ ロ ッ ク に適用)
キーワー ド
と り う る値 ・ 解説
alignchar
(Unichar またはキーワー ド 。 テキス ト 行ブ ロ ッ ク にのみ適用) 指定 さ れたキ ャ ラ ク タ を テキス ト
内に見つけた と き、 その左下隅を、 ブ ロ ッ ク矩形の左下隅に整列 さ せます。 横書き テキス ト で
orientate=north か south の場合には、 position オプ シ ョ ンの 1 番目の値で位置を決定 し ます。
縦書き テキス ト で orientate=west か east の場合には、 position オプ シ ョ ンの 2 番目の値で位置
を決定 し ます。 指定 さ れた位置整列キ ャ ラ ク タ がテキス ト 内にない と きは、 こ のオプ シ ョ ンは無
視 さ れます。 値 0 かキーワー ド none ならば、 位置整列キ ャ ラ ク タ を無効に し ます。 fitmethod は
指定 さ れれば適用 し ますが、 alignchar で強制的に位置整列 さ れるので、 はめ込み枠内にテキス ト
配置する こ と はで き ません。 デ フ ォ ル ト : none
dpi
(float の リ ス ト 。 画像ブ ロ ッ ク にのみ適用) 縦方向 ・ 横方向の画像解像度を表す 1 個ま たは 2 個の
値。 単位は pixels per inch。 値 0 の場合、 画像内部に解像度が格納 さ れていればそれを用い、 なけ
れば 72 dpi と し ます。 fitmethod プ ロパテ ィ が指定 さ れていて、 そのキーワー ド が auto ・ meet ・
slice ・ entire のいずれかな らば、 本プ ロパテ ィ は無視 さ れます。 デ フ ォ ル ト : 0
fitmethod
(キーワー ド ) 与え られた内容がブ ロ ッ ク矩形に収ま り き ら ない と きの解決方式。 と り う る値は
auto ・ nofit ・ clip ・ meet ・ slice ・ entire。 テキス ト 行 ・ 画像 ・ PDF ブ ロ ッ ク については、 こ の
プ ロパテ ィ は標準的に解釈 さ れます。 デ フ ォル ト : auto。 テキス ト フ ローブ ロ ッ ク については、
ブ ロ ッ ク がテキス ト に対 し て小 さ すぎ る と きは、 以下のよ う に解釈 さ れます :
auto
テキス ト が収ま る ま で、 fontsize と leading を縮めます。
nofit
テキス ト を ブ ロ ッ ク下端から はみ出 さ せます。
clip
テキス ト を ブ ロ ッ クの端で切 り 落 と し ます。
margin
(float の リ ス ト 。 テキス ト 行ブ ロ ッ ク にのみ適用) テキス ト 枠の縦 ・ 横方向の長 さ 差 し 引き を記述
する 1 個または 2 個の値。 デ フ ォル ト : 0
orientate
(キーワー ド ) 内容を配置する向き を指定 し ます。 と り う る値は north ・ east ・ south ・ west。 デ
フ ォ ル ト : north
position
(float の リ ス ト ) 内容の中における参照点の位置を指定する、 1 個ま たは 2 個の値。 ブ ロ ッ ク内で
のパーセ ン ト 値 と し て位置を指定 し ます。 テキス ト 行ブ ロ ッ クのみ : キーワー ド auto を、 リ ス ト
の 1 番目の値 と し て用いる こ と も で き ます。 これは、 テキス ト の筆記方向が右書きの場合 (ア ラ
ビ ア文字 ・ ヘブ ラ イ文字等) には right を意味 し 、 そ う で ない場合 (欧文等) には left を意味 し
ます。
デ フ ォル ト : {0 0}、 すなわち左下隅
rotate
(float) 回転角を度単位で表 し た もの。 処理が始ま る前にブ ロ ッ クが反時計回 り に回転 さ れます。
参照点が回転の中心 と な り ます。 デ フ ォル ト : 0
11.6 ブ ロ ッ クのプ ロパテ ィ
315
表 11.10 はめ込みプ ロパテ ィ 一覧 (テキス ト 行 ・ 画像 ・ PDF ブ ロ ッ ク に適用)
キーワー ド
と り う る値 ・ 解説
scale
(float の リ ス ト ) 縦方向 ・ 横方向の拡縮倍率を表す 1 個ま たは 2 個の値。 fitmethod プ ロパテ ィ が
指定 さ れていて、 かつそのキーワー ド が auto ・ meet ・ slice ・ entire のいずれかな ら ば、 本プ ロ
パテ ィ は無視 さ れます。 デ フ ォル ト : 1
shrinklimit
(float またはパーセ ン ト 値。 テキス ト 行ブ ロ ッ ク にのみ適用) fitmethod=auto で テキス ト を収める
際に適用 さ れる縮小倍率の下限。 デ フ ォ ル ト : 0.75
表 11.11 はめ込みプ ロパテ ィ 一覧 (テキス ト フ ローブ ロ ッ ク に適用)
キーワー ド
と り う る値 ・ 解説
firstlinedist
(float ・ パーセ ン ト 値 ・ キーワー ド のいずれか) ブ ロ ッ ク矩形上端 と テキス ト 先頭行ベース ラ イ ン
と の間隔を、 ユーザー座標で表すか、 そ こ の文字サイ ズ (fixedleading=true な ら行の先頭の文字
サイ ズ、 そ う で ないな ら行内のすべての文字サイ ズの う ちの最大値) に対するパーセ ン ト 値で表
すか、 キーワー ド で表 し た もの。 デ フ ォ ル ト : leading。
leading
先頭行について決定 さ れた行送 り 値。 ヒのよ う な、 読み分け記号つきの文字は普通、 は
め込み枠上端に接する で し ょ う 。
ascender
先頭行について決定 さ れたア セ ン ダ値。 d や h のよ う な、 大き なアセ ン ダ を持つ文字は
普通、 はめ込み枠上端に接する で し ょ う 。
capheight 先頭行について決定 さ れたキ ャ ッ プハイ ト 値。 H のよ う な大文字は普通、 はめ込み枠上
端に接する で し ょ う 。
先頭行について決定 さ れた x ハイ ト 値。 x のよ う な小文字は普通、 はめ込み枠上端に接
する で し ょ う 。
fixedleading=false な ら、 先頭行内で見出 さ れたすべての leading ・ ascender ・ xheight ・
capheight 値の う ちの最大値が用い ら れます。
xheight
fitmethod
lastlinedist
(キーワー ド ) 与え られた内容が枠に収ま り き ら ない と きの解決方式。 と り う る値は auto ・
nofit ・ clip。 デ フ ォ ル ト : auto。 テキス ト フ ローブ ロ ッ ク の場合、 ブ ロ ッ クがテキス ト に対 し て
小 さ すぎ る と きは、 以下のよ う に解釈 さ れます :
auto
テキス ト が収ま る ま で、 fontsize と leading を縮めます。
nofit
テキス ト を ブ ロ ッ ク下端か らはみ出 さ せます。
clip
テキス ト を ブ ロ ッ クの端で切 り 落 と し ます。
(float ・ パーセ ン ト 値 ・ キーワー ド のいずれか。 fitmethod=nofit の と きは無視 さ れます) テキス
ト 最終行ベース ラ イ ン と はめ込み枠下端 と の間隔を、 ユーザー座標で表すか、 文字サイ ズ
(fixedleading=true な ら行の先頭の文字サイ ズ、 そ う でないな ら行内のすべての文字サイ ズの う
ちの最大値) に対するパーセ ン ト 値で表すか、 キーワー ド で表 し た もの。 デ フ ォ ル ト : 0、 すなわ
ちはめ込み枠下端をベース ラ イ ン と し て用い、 デ ィ セ ン ダは普通、 はめ込み枠の下へはみ出すで
し ょ う。
descender 最終行について決定 さ れたデ ィ セ ン ダ値。 g や j のよ う な、 デ ィ セ ン ダ を持つ文字は普
通、 はめ込み枠下端に接する で し ょ う 。
fixedleading=false な ら、 最終行内で見出 さ れたすべてのデ ィ セ ン ダ値の う ちの最大値が用い ら
れます。
linespreadlimit
(float またはパーセ ン ト 値。 verticalalign=justify の場合のみ) 上下合わせの場合に行送 り を増
やす際の最大値を、 ユーザー座標で表すか、 行送 り に対するパーセ ン ト 値で表 し た もの。 デ フ ォ
ル ト : 200%
maxlines
(整数ま たはキーワー ド ) はめ込み枠内の最大行数。 あ るいはキーワー ド auto を指定 し て、 で き
る だけ多 く の行をはめ込み枠内に入れ さ せる こ と も で き ます。 最大行数が入っ た と き、 PDF_fit_
textflow( ) は文字列 _boxfull を返 し ます。
316
第 11 章 : PPS と PDFlib Block Plugin
表 11.11 はめ込みプ ロパテ ィ 一覧 (テキス ト フ ローブ ロ ッ ク に適用)
キーワー ド
と り う る値 ・ 解説
minfontsize
(float またはパーセ ン ト 値) shrinklimit を超えた と き に、 fitmethod=auto のブ ロ ッ ク 矩形に収ま
る よ う テキス ト が縮小 さ れる際に許 さ れる最小文字サイ ズ。 下限値を、 ユーザー座標で、 ま たは
ブ ロ ッ ク の高 さ に対するパーセ ン ト 値で指定 し ます。 下限に達 し た場合には、 テキス ト は、 こ の
指定 し た minfontsize を文字サイ ズ と し て生成 さ れます。 デ フ ォ ル ト : 0.1%
orientate
(キーワー ド ) テキス ト を配置する向き を指定 し ます。 と り う る値は north ・ east ・ south ・ west。
デ フ ォル ト : north
rotate
(float) 回転角を度単位で表 し た もの。 はめ込み枠の左下隅を中心 と し て、 座標系を回転 さ せます。
こ れに よ っ て、 枠 と テキス ト が回転 さ れます。 テキス ト が配置 さ れた時点で回転は リ セ ッ ト さ れ
ます。 デ フ ォル ト : 0
verticalalign
(キーワー ド ) はめ込み枠内のテキス ト の縦揃え。 デ フ ォ ル ト : top。
top
先頭行か ら下へ順に組版。 テキス ト がはめ込み枠に満たない と きは、 テキス ト の下に余
白があ き ます。
center
はめ込み枠内の縦方向の中央にテキス ト を配置。 テキス ト がはめ込み枠に満たない と き
は、 テキス ト の上下に余白があ き ます。
bottom
最終行か ら上へ順に組版。 テキス ト がはめ込み枠に満たない と きは、 テキス ト の上に余
白があ き ます。
justify
はめ込み枠の上端 と 下端にテキス ト を合わせます。 それを実現する ために、 行送 り を増
や し ます。 ただ し 、 linespreadlimit で指定 さ れた限界ま で し か増や し ません。 先頭行
の高 さ は、 firstlinedist=leading の場合のみ増や し ます。
11.6 ブ ロ ッ クのプ ロパテ ィ
317
11.6.7 デ フ ォ ル ト 内容に関す る プ ロパテ ィ 群
デフ ォ ル ト 内容に関す る プ ロ パテ ィ 群は、内容が特に与え ら れなかっ た と き のブ ロ ッ ク へ
の流 し 込みの方法を指定 し ます。 こ れ ら は と り わけプ レ ビ ュ ー機能で有用です。 なぜな ら
プ レ ビ ュ ーではブ ロ ッ ク にへそのデフ ォ ル ト 内容を流 し 込むか ら です。 表 11.12 に、 デ
フ ォ ル ト 内容に関す る プ ロ パテ ィ の一覧を示 し ます。
表 11.12 デ フ ォル ト 内容に関する プ ロパテ ィ 一覧
キーワー ド
と り う る値 ・ 解説
defaultimage
(文字列。 画像ブ ロ ッ ク にのみ適用) 置き換え画像がク ラ イ ア ン ト ア プ リ ケーシ ョ ンから与え ら れ
なかっ た と き に用い られる画像のパス名。 フ ァ イル名には絶対パス を付けず、 SearchPath 機能を
利用する よ う 、 PPS ク ラ イ ア ン ト ア プ リ ケーシ ョ ン を作っ てお く ほ う がよいで し ょ う 。 そ う すれ
ばブ ロ ッ ク処理を、 プ ラ ッ ト フ ォ ームや フ ァ イルシ ス テムの細かい違いか ら切 り 離す こ と がで き
ます。
defaultpdf
(文字列。 PDF ブ ロ ッ ク にのみ適用) 置き換え PDF が ク ラ イ ア ン ト ア プ リ ケーシ ョ ンか ら与え られ
なかっ た と き に用い られる PDF 文書のパス名。 フ ァ イル名には絶対パス を付けず、 SearchPath 機
能を利用する よ う 、 PPS ク ラ イ ア ン ト ア プ リ ケーシ ョ ン を作っ てお く ほ う がよいで し ょ う 。 そ う
すればブ ロ ッ ク処理を、 プ ラ ッ ト フ ォ ームやフ ァ イルシ ス テムの細かい違いから 切 り 離す こ と が
で き ます。
defaultpdfpage
(整数。 PDF ブ ロ ッ ク にのみ適用) デ フ ォ ル ト PDF 文書内のページのページ番号。 デ フ ォル ト : 1
defaulttext
(文字列。 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク にのみ適用) 可変テキス ト が ク ラ イ ア ン ト ア プ リ
ケーシ ョ ンか ら与え られなかっ た と き に用い ら れる テキス ト 1
1. テキス ト は winansi エ ン コ ーデ ィ ン グか Unicode で解釈 さ れます。
11.6.8 カ ス タ ムプ ロパテ ィ
カ ス タ ムプ ロ パテ ィ は、 すべての種類のブ ロ ッ ク に適用 さ れます。 PPS と プ レ ビ ュ ー機能
か ら は無視 さ れます。 表 11.13 に、 カ ス タ ムプ ロ パテ ィ の命名規則を示 し ます。
表 11.13 カ ス タ ムブ ロ ッ ク プ ロパテ ィ (すべての種類のブ ロ ッ ク に適用)
キーワー ド
と り う る値 ・ 解説
3 種類のキ ャ ラ ク タ [ ] /
を含ま ないあ ら ゆる名前
(文字列 ・ 名前 ・ float のいずれか、 または float の リ ス ト ) 各カ ス タ ムプ ロパテ ィ の
値を ど う 解釈するかは、 全 く ク ラ イ ア ン ト ア プ リ ケーシ ョ ンの領分です。 PPS か ら
は無視 さ れます。
318
第 11 章 : PPS と PDFlib Block Plugin
11.7 pCOS で ブ ロ ッ ク 名 と プ ロパテ ィ を取得
PPS に よ る 自動ブ ロ ッ ク 処理に加えて、 内蔵の pCOS 機能を使 う と 、 ブ ロ ッ ク 名を評価 し
た り 、 標準 ・ カ ス タ ムプ ロ パテ ィ を取得 し た り す る こ と がで き ます。
ク ッ ク ブ ッ ク 取 り 込んだPDFの中に含まれている ブ ロ ッ クのプ ロパテ ィ を取得する ための完全な コ ー ド
サン プルが ク ッ ク ブ ッ クの blocks/query_block_properties ト ピ ッ ク にあ り ます。
ブ ロ ッ ク の数 と 名前の取得 ク ラ イ ア ン ト コ ー ド 側では、 取 り 込んだページ上のブ ロ ッ
ク の名前 も 数 も 知 ら な く てか ま い ません。 なぜな ら 取得する こ と も で き る か ら です。 下記
の ス テー ト メ ン ト は、 ページ番号 pagenum のページ上のブ ロ ッ ク の数を返 し ます :
blockcount = (int) p.pcos_get_number(doc, "length:pages[" + pagenum + "]/blocks");
下記の ス テー ト メ ン ト は、 ページ pagenum 上の blocknum 番目のブ ロ ッ ク の名前を返 し
ます (ブ ロ ッ ク と ページの番号は 0 か ら 始ま り ます) :
blockname = p.pcos_get_string(doc,
"pages[" + pagenum + "]/blocks[" + blocknum + "]/Name");
返 さ れた ブ ロ ッ ク 名はその後、 ブ ロ ッ ク のプ ロ パテ ィ を取得 し た り 、 ブ ロ ッ ク へテ キ ス
ト ・ 画像 ・ PDF を流 し 込んだ り す る ために利用す る こ と がで き ます。 指定 さ れたブ ロ ッ ク
が存在 し ない と き は、 例外が発生 し ます。 こ れを避け る には、 length 接頭辞を用いて、 ブ
ロ ッ ク の数を知 り 、 ひいては Blocks 配列の最大添字を知 る こ と がで き ます (配列の添字が
0 か ら 始ま る ため、 ブ ロ ッ ク の数は最大可能添字 よ り 1 大 き い こ と に留意 し て く だ さ い)。
ブ ロ ッ ク プ ロ パテ ィ を特定す る パス文法において、以下の表現は等価です。 こ こ で、通
し 番号 < 番号 > のブ ロ ッ ク が、その Name プ ロ パテ ィ を < ブ ロ ッ ク名 > に設定 さ れてい る
と し ます :
pages[...]/blocks[<番号>]
pages[...]/blocks/<ブロック名>
ブ ロ ッ ク の座標の取得 名前 foo のブ ロ ッ ク の左下隅 と 右上隅を記述す る 2 個の座標ペア
(llx, lly) お よ び (urx, ury) は、 以下の よ う に し て取得で き ます :
llx
lly
urx
ury
=
=
=
=
p.pcos_get_number(doc,
p.pcos_get_number(doc,
p.pcos_get_number(doc,
p.pcos_get_number(doc,
"pages["
"pages["
"pages["
"pages["
+
+
+
+
pagenum
pagenum
pagenum
pagenum
+
+
+
+
"]/blocks/foo/Rect[0]");
"]/blocks/foo/Rect[1]");
"]/blocks/foo/Rect[2]");
"]/blocks/foo/Rect[3]");
上記の座標はデフ ォ ル ト のユーザー座標系で与え ら れてい る こ と に注意 し て く だ さ い (左
下隅が原点。 ただ し 、 そのページの CropBox に よ っ て変更 さ れてい る 可能性 も あ り ます)。
こ れに対 し て Block Plugin は、ページ左上隅に原点を持つ Acrobat のユーザー イ ン タ フ ェー
ス座標系に従っ て座標を表示 し ます。 ブ ロ ッ ク の座標に優先 さ せ る ための Rect オプシ ョ
ンは、CropBoxエン ト リ に よ っ て適用 さ れてい る いかな る 変更を も 考慮には入れないので、
元のブ ロ ッ ク か ら 取得 さ れた座標は、 CropBox が存在す る 場合には新 し い座標 と し てその
ま ま受け渡す こ と はで き ません。 こ れを回避す る には、 refpoint ・ boxsize オプシ ョ ン を用
い る こ と がで き ます。
ま た、 topdown パ ラ メ タ はブ ロ ッ ク 座標取得の際には考慮 さ れない こ と に も 留意 し て
く だ さ い。
11.7 pCOS で ブ ロ ッ ク名 と プ ロパテ ィ を取得
319
カ ス タ ムプ ロパテ ィ の取得 カ ス タ ム プ ロ パテ ィ は、 下記の例の よ う に取得す る こ と が
で き ます。 こ こ では、 ページ 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 プ ロ パテ ィ 名 (306 ページ 「11.6 ブ ロ ッ ク のプ ロ パテ ィ 」 で定義 さ れてい る
も の) がカ ス タ ムプ ロ パテ ィ 名 と 衝突す る こ と は決 し て あ り ません。
320
第 11 章 : PPS と PDFlib Block Plugin
11.8 PDFlib ブ ロ ッ ク の仕様
PDFlib ブ ロ ッ ク の文法は、 PDF ページ を構成する デー タ 構造にアプ リ ケーシ ョ ンが独自
デー タ を追加格納で き る よ う にす る 拡張の し く みを定めた PDF Reference に完全準拠 し て
い ます。 こ こ では、 PDFlib ブ ロ ッ ク の文法を詳述 し て、 ブ ロ ッ ク を Block Plugin 以外の方
法で作成 し たいユーザーの助け と し ます。プ ラ グ イ ンのユーザーは こ の節は飛ば し てか ま
い ません。
11.8.1 PDFlib ブ ロ ッ ク の PDF オ ブ ジ ェ ク ト 構造
ページ辞書は PieceInfo 項目を含んでお り 、 こ の項目は値 と し て別の辞書を持っ てい ます。
こ の辞書はキーPDFlib を含んでお り 、 こ のキーはアプ リ ケーシ ョ ンデー タ 辞書を値 と し て
持っ てい ます。 こ のアプ リ ケーシ ョ ンデー タ 辞書は、 表 11.14 に挙げ る 2 個の標準キーを
含んでい ます。
表 11.14 ア プ リ ケーシ ョ ンデー タ 辞書内項目一覧
キー
値
LastModified
(日付文字列、 必須) ページ上のブ ロ ッ クが作成 さ れた、 または最近更新 さ れた日時。
Private
(辞書、 必須) ブ ロ ッ ク リ ス ト (表 11.15 参照)
ブ ロ ッ ク リ ス ト と は、 ブ ロ ッ ク 処理に関す る 一般的な情報に加え て、 ページ上のすべての
ブ ロ ッ ク の一覧を も 含んだ辞書です。 表 11.15 に、 ブ ロ ッ ク リ ス ト 辞書の中のキーの一覧
を示 し ます。
表 11.15 ブ ロ ッ ク リ ス ト 辞書内項目一覧
キー
値
Version
(数、 必須) フ ァ イルが準拠する ブ ロ ッ ク仕様のバージ ョ ン番号。 本文書では、 バージ ョ ン 9 のブ
ロ ッ ク仕様を解説 し ています。
Blocks
(辞書、 必須) キーはそれぞれ、 ブ ロ ッ ク名の名前オブ ジ ェ ク ト 。 対応する値はそれぞれ、 そのブ
ロ ッ ク に対する ブ ロ ッ ク辞書です (表 11.17 参照)。 ブ ロ ッ ク辞書内の Name キーは、 こ の辞書内の
ブ ロ ッ ク 名 と 同 じ でなければな り ません。
PluginVersion
(文字列。 pdfmark キーがないな ら 必須1) ブ ロ ッ クの作成に使われた Block Plugin のバージ ョ ン識
別を表す文字列。
pdfmark
(論理値。 PluginVersion キーがないな ら必須 1) ブ ロ ッ ク リ ス ト が pdfmark を用いて生成 さ れてい
る場合は true でなければな り ません。
1. PluginVersion キー と pdfmark キーは、 ど ち ら か一方 し か存在で きず、 かつ、 ど ち ら かが必ず存在 し なければな り ません。
ブ ロ ッ ク プ ロパテ ィ のデー タ 型 プ ロ パテ ィ はオプシ ョ ン リ ス ト と 同 じ デー タ 型に対応
し てい ます。 ただ し ハン ド ル と 、 ア ク シ ョ ン リ ス ト の よ う な特化 さ れた リ ス ト には対応 し
てい ません。 表 11.16 に、 こ れ ら の型 と PDF のデー タ 型 と の対応づけ を示 し ます。
表 11.16 ブ ロ ッ ク プ ロパテ ィ のデー タ 型一覧
デー タ 型
PDF での型および注釈
論理値
(論理値)
文字列
(文字列)
11.8 PDFlib ブ ロ ッ クの仕様
321
表 11.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
322
(テキス ト 文字列) UTF-16 BOM U+FEFF で始ま る utf16be 形式の Unicode 文字列
第 11 章 : PPS と PDFlib Block Plugin
11.8.2 ブ ロ ッ ク 辞書のキー
ブ ロ ッ ク 辞書は、 表 11.17 に挙げ る キーを含む こ と がで き ます。
表 11.17 ブ ロ ッ ク辞書内項目一覧
プ ロパテ ィ グループ
値
管理プ ロパテ ィ 群
(い く つかのキーは必須) 表 11.4 に従っ た管理プ ロパテ ィ 群
矩形プ ロパテ ィ 群
(い く つかのキーは必須) 表 11.5 に従っ た矩形プ ロパテ ィ 群
書式プ ロパテ ィ 群
(い く つかのキーは必須) 表 11.6 に従っ た、 すべての種類のブ ロ ッ ク に適用 さ れる
書式プ ロパテ ィ 群 と 、 表 11.7 に従っ た、 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク に適
用 さ れる テキス ト 書式プ ロパテ ィ 群
テキス ト 作成プ ロパテ ィ 群 (オプ シ ョ ン) 表 11.8 に従っ た、 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク に適用 さ れ
る テキス ト 作成プ ロパテ ィ 群
テキス ト 組版プ ロパテ ィ 群 (オプ シ ョ ン) 表 11.9 に従っ た、 テキス ト 行 ・ テキス ト フ ローブ ロ ッ ク に適用 さ れ
る テキス ト 組版プ ロパテ ィ 群
オブ ジ ェ ク ト はめ込みプ ロ (オプ シ ョ ン) 表 11.10 に従 っ た、 テキス ト 行 ・ 画像 ・ PDF ブ ロ ッ ク に適用 さ れる オ
パテ ィ 群
ブ ジ ェ ク ト はめ込みプ ロパテ ィ 群 と 、 表 11.11 に従っ た、 テキス ト フ ローブ ロ ッ ク
に適用 さ れるはめ込みプ ロパテ ィ 群
デ フ ォ ル ト 内容に関する プ (オプ シ ョ ン) 表 11.12 に従 っ た、 デ フ ォ ル ト 内容に関する プ ロパテ ィ 群
ロパテ ィ 群
カスタム
(辞書、 オプ シ ョ ン) 表 11.13 に従 っ た、 カ ス タ ムプ ロパテ ィ に対するキー ・ 値の対
を含んだ辞書
作成例
以下に示す PDF コ ー ド は、 job_title と い う テ キ ス ト ブ ロ ッ ク と 、 logo と い う 画
像ブ ロ ッ ク の、 2 個のブ ロ ッ ク を扱っ てい ます。 テ キ ス ト ブ ロ ッ ク には format と い う カ
ス タ ムプ ロ パテ ィ が含まれてい ます :
<<
/Contents 12 0 R
/Type /Page
/Parent 1 0 R
/MediaBox [ 0 0 595 842 ]
/PieceInfo << /PDFlib 13 0 R >>
>>
13 0 obj
<<
/Private <<
/Blocks <<
/job_title 14 0 R
/logo 15 0 R
>>
/Version 9
/PluginVersion (4.1)
>>
/LastModified (D:20110813200730)
>>
endobj
14 0 obj
<<
11.8 PDFlib ブ ロ ッ クの仕様
323
/Type /Block
/Rect [ 70 740 200 800 ]
/Name /job_title
/Subtype /Text
/fitmethod /auto
/fontname (Helvetica)
/fontsize 12
/Custom << /format 5 >>
>>
endobj
15 0 obj
<<
/Type /Block
/Rect [ 250 700 400 800 ]
/Name /logo
/Subtype /Image
/fitmethod /auto
>>
11.8.3 pdfmark で PDFlib ブ ロ ッ ク を生成
こ のプ ラ グ イ ン でブ ロ ッ ク を作成す る のではな く 、 PostScript ス ト リ ーム の中に適切な
pdfmark コ マ ン ド を挿入 し て、それを Distiller で PDF に変換す る こ と に よ っ てブ ロ ッ ク を
作成す る こ と も 可能です。 pdfmark オペレー タ については詳 し く は Acrobat の解説文書に
記載 さ れてい ます。 以下に示す pdfmark オペレー タ 群を用いれば、 前節 と 同 じ ブ ロ ッ ク 定
義を生成す る こ と がで き ます :
% ---------- Setup for the Blocks on a page ---------[/_objdef {B1} /type /dict /OBJ pdfmark
% Blocks dict
[{ThisPage} <<
/PieceInfo <<
/PDFlib <<
/LastModified (D:20110813200730)
/Private <<
/Version 9
/pdfmark true
/Blocks {B1}
>>
>>
>>
>> /PUT pdfmark
% ---------- text Block ---------[{B1} <<
/job_title <<
/Type /Block
/Name /job_title
/Subtype /Text
/Rect [ 70 740 200 800 ]
/fitmethod /auto
/fontsize 12
/fontname (Helvetica)
/Custom << /format 5 >>
>>
>> /PUT pdfmark
324
第 11 章 : PPS と PDFlib Block Plugin
% ---------- image Block ---------[{B1} <<
/logo <<
/Type /Block
/Name /logo
/Subtype /Image
/Rect [ 250 700 400 800 ]
/fitmethod /auto
>>
>> /PUT pdfmark
11.8 PDFlib ブ ロ ッ クの仕様
325
326
第 11 章 : PPS と PDFlib Block Plugin
A 改訂履歴
日付
更新点
2011 年 7 月 11 日
> PDFlib 8.0.3 に関する さ ま ざ ま な更新 ・ 修正
2010 年 12 月 09 日
> PDFlib 8.0.2 に関する さ ま ざ ま な更新 ・ 修正
2010 年 9 月 22 日
> PDFlib 8.0.1p7 に関する さ ま ざ ま な更新 ・ 修正
2010 年 4 月 13 日
> PDFlib 8.0.1 に関する さ ま ざ ま な更新 ・ 修正
2009 年 12 月 07 日
> PDFlib 8.0.0 に関する更新
2009 年 3 月 13 日
> PDFlib 7.0.4 に関する さ ま ざ ま な更新 ・ 修正
2008 年 2 月 13 日
> PDFlib 7.0.3 に関する さ ま ざ ま な更新 ・ 修正
2007 年 8 月 08 日
> PDFlib 7.0.2 に関する さ ま ざ ま な更新 ・ 修正
2007 年 2 月 19 日
> PDFlib 7.0.1 に関する さ ま ざ ま な更新 ・ 修正
2006 年 10 月 03 日
> PDFlib 7.0.0 に関する更新 と 再構成
2006 年 2 月 21 日
> PDFlib 6.0.3 に関する さ ま ざ ま な更新 ・ 修正。 Ruby の節を追加
2005 年 8 月 09 日
> PDFlib 6.0.2 に関する さ ま ざ ま な更新 ・ 修正
2004 年 11 月 17 日
> PDFlib 6.0.1 に関する小規模な更新 ・ 修正
> 8 章に言語別関数プ ロ ト タ イ プ用新書式導入
> 3 章にハイパーテキス ト の例を追加
2004 年 6 月 18 日
> PDFlib 6 に関する大規模な変更
2004 年 1 月 21 日
> PDFlib 5.0.3 に関する小規模な追加 ・ 修正
2003 年 9 月 15 日
> PDFlib 5.0.2 に関する小規模な追加 ・ 修正。 ブ ロ ッ クの仕様を追加
2003 年 5 月 26 日
> PDFlib 5.0.1 に関する小規模な更新 ・ 修正
2003 年 3 月 26 日
> PDFlib 5.0.0 に関する全面的変更 と 書き直 し
2002 年 6 月 14 日
> PDFlib 4.0.3 に関する小規模な変更 と .NET バイ ンデ ィ ングに関する追加
2002 年 1 月 26 日
> PDFlib 4.0.2 に関する小規模な変更 と IBM eServer エデ ィ シ ョ ンに関する追加
2001 年 5 月 17 日
> PDFlib 4.0.1 に関する小規模な変更
2001 年 4 月 1 日
> PDFlib 4.0.0 の PDI ・ 他機能を解説
2001 年 2 月 5 日
> PDFlib 3.5.0 のテ ン プ レー ト ・ CMYK 機能を解説
2000 年 12 月 22 日
> ColdFusion 解説 と PDFlib 3.03 に関する追加。 COM エデ ィ シ ョ ン を別マニ ュ アルに
2000 年 8 月 8 日
> Delphi 解説 と PDFlib 3.02 に関する小規模な追加
2000 年 7 月 1 日
> PDFlib 3.01 に関する追加 ・ 説明の明瞭化
2000 年 2 月 20 日
> PDFlib 3.0 に関する変更
1999 年 8 月 2 日
> PDFlib 2.01 に関する小規模な変更 ・ 追加
A 改訂履歴
327
日付
更新点
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 と 本マニ ュ アルを初めて公開
索引
記号
dpi 計算 175
.NET バイ ンデ ィ ング 42
E
A
EBCDIC 65
ebcdicutf8 → hypertextformat
ebcdic エ ン コ ーデ ィ ン グ 99
errorpolicy パラ メ タ 186
EUDC (エ ン ド ユーザー定義キ ャ ラ ク タ ) フ ォ
ン ト 115
EXIF JPEG 画像 178
Acrobat のブ ロ ッ ク作成用プ ラ グ イ ン 279
Adobe Font Metrics (AFM) 116
AES (Advanced Encryption Standard) 76
AFM (Adobe Font Metrics) 116
ArtBox 70
AS/400 65
ascender 149
asciifile パラ メ タ 65
auto → hypertextformat
autocidfont パラ メ タ 141
autosubsetting パラ メ タ 140
G
GBK 105
GIF 179
grid.pdf 68
B
H
Big Five 105
BleedBox 70
BMP 97, 179
bytes → hypertextformat
HKS カ ラ ー 82
HTML character references 112
hypertextformat パラ メ タ 108
C
C++ バイ ンデ ィ ング 36
capheight 149
CCITT 179
CCSID 100, 101
character references 112
characters per inch 150
CIE L*a*b* カ ラ ースペース 83
CLI 36
CMap 103
CMaps 103
Cobol バイ ンデ ィ ン グ 30
COM (Component Object Model) バイ ンデ ィ
ング 31
copyoutputintent オプ シ ョ ン 259
CPI (characters per inch) 150
CropBox 70
currentx ・ currenty パラ メ タ 149
C バイ ンデ ィ ング 32
D
defaultgray/rgb/cmyk パラ メ タ 85
descender 149
I
IBM zSeries ・ iSeries 65
ignoremask 181
image:iccprofile パラ メ タ 85
iSeries 65
ISO 10646 125
ISO 15930 253
ISO 19005 261
ISO 32000 252
ISO 8859-2 から -15 ま で 99
J
Javadoc 41
Java バイ ンデ ィ ング 39
JBIG2 178
JFIF 178
Johab 105
JPEG 177
JPEG2000 178
JPEG 画像
EXIF 形式の 178
L
leading 149
索引
329
linearized PDF 78
LWFN (LaserWriter Font) 116
M
macroman エ ン コ ーデ ィ ング 99
makepsres ユーテ ィ リ テ ィ 59
masked 182
masterpassword 76
MediaBox 70
O
OpenType フ ォ ン ト 115
optimized PDF 78
overline パラ メ タ 152
P
page 176
PANTONE カ ラ ー 80
pCOS 247
pCOS イ ン タ フ ェ ース 247
PDF/A 261
PDF/X 253
PDF_EXIT_TRY( ) 34
PDF_get_buffer() 64
PDF_set_parameter() 63
PDFlib
機能一覧 22
PDFlib Personalization Server 279
pdflib.upr 62
PDFLIBRESOURCE 環境変数 62
PDFlib の機能 22, 26
PDF 取 り 込みラ イ ブ ラ リ (PDI) 184
pdiusebox パラ メ タ 186
PDI (PDF 取 り 込み) 184
Perl バイ ンデ ィ ング 43
permissions 76
PFA (Printer Font ASCII) 116
PFB (Printer Font Binary) 116
PFM (Printer Font Metrics) 116
PHP バイ ンデ ィ ング 45
PNG 177, 181
PostScript Type 1 フ ォ ン ト 116
PPS (PDFlib Personalization Server) 279
Printer Font ASCII (PFA) 116
Printer Font Binary (PFB) 116
Printer Font Metrics (PFM) 116
PUA 97
Python バイ ンデ ィ ング 47
R
RAW 画像デー タ 180
REALbasic バイ ンデ ィ ング 48
renderingintent オプ シ ョ ン 83
330
索引
resourcefile パラ メ タ 63
RPG バイ ンデ ィ ング 49
Ruby バイ ンデ ィ ング 51
S
S/390 65
SearchPath パラ メ タ 60
setcolor:iccprofilegray/rgb/cmyk パラ メ タ 85
Shift-JIS 105
sRGB カ ラ ースペース 84
strikeout パラ メ タ 152
subsetminsize パ ラ メ タ 141
T
Tcl バイ ンデ ィ ング 53
textformat パラ メ タ 108
textrendering パラ メ タ 153
textx ・ texty パ ラ メ タ 149
TIFF 179
topdown パラ メ タ 69
TrimBox 70
TrueType フ ォ ン ト 115
TTC (TrueType Collection) 115
TTC (TrueType Collection) 171
Type 1 フ ォ ン ト 116
Type 3 (ユーザー定義) フ ォ ン ト 117
U
UHC 105
underline パラ メ タ 152
UPR (Unix PostScript Resource) 59
usehypertextencoding パラ メ タ 109
usercoordinates パラ メ タ 67
userpassword 76
utf16 → hypertextformat
utf16be → hypertextformat
utf16le → hypertextformat
utf8 → hypertextformat
UTF 形式 98
W
web-optimized PDF 78
winansi エ ン コ ーデ ィ ング 99
X
XObject 72
x ハイ ト 149
Z
zSeries 65
あ
アセ ン ダ 149
暗号化 75
い
一時領域の必要 78
入れ子
例外の 33
イ ン コ ア生成 63
イ ン チ 67
イ ン ラ イ ン画像 176
う
上付き 150
え
エ スケープ シーケ ン ス 111
エ ラ ー処理 55
エ ン コ ーデ ィ ン グ
カ ス タ ム 101
シ ス テムか らの取得 100
日中韓 104
か
カ ーニ ン グ 150
外在透過 181
回転 68
拡縮画像 175
カ ス タ ムエ ン コ ーデ ィ ング 101
画像デー タ の再利用 175
画像の拡縮 175
画像フ ァ イル形式 177
画像マ ス ク 180, 182
カテゴ リ
リ ソ ース 59
カ レ ン ト 点 71
環境変数 PDFLIBRESOURCE 62
韓国語 104, 105, 169
き
擬似フ ォ ン ト ス タ イル 151
機能
PDFlib の 22, 26
機能一覧
PDFlib 22
基本多言語面 97
キ ャ ッ プハイ ト 149
キ ャ ラ ク タ と グ リ フ 97
キ ャ ラ ク タ メ ト リ ッ ク 149
行送 り 149
切 り 抜き 71
く
グ ラ デ ィ エ ン ト 79
グ リ フ 97
グ リ フ互換性 145
グ リ フ置換 123
け
権限 75
言語バイ ンデ ィ ング→バイ ンデ ィ ング
こ
コ ア フ ォ ン ト 131
高度な改行 221
コ ー ド ページ :Microsoft Windows 1250 ~
1258 99
さ
座標系 67
下向き 69
メ ー ト ル 67
サブ セ ッ ト 化 140
サブパス 70
し
シ ス テムエ ン コ ーデ ィ ン グ対応 100
下付き 150
下向き座標 69
出力イ ン テ ン ト 257
PDF/A のための 262
PDF/X のための 254
私用領域 97
す
Windows の 133
ス タ イル名 133
スポ ッ ト カ ラ ー (分版カ ラ ースペース) 80
スムーズシ ェ ーデ ィ ン グ 79
せ
セキ ュ リ テ ィ 75
た
ダウンサン プ リ ング 175
縦書き 169, 170
単位 67
ち
中国語 103, 105, 169
索引
331
て
デ ィ セ ン ダ 149
テキス ト 位置 149
テキス ト 進行方向 169, 170
テキス ト バ リ エーシ ョ ン 149
テキス ト メ ト リ ッ ク 149
デ フ ォ ル ト 座標 67
テ ン プ レー ト 72
と
透過 180
等幅 フ ォ ン ト 150
な
内容文字列 106
Unicode 非対応言語における 108
名前文字列 106
Unicode 非対応言語における 108
に
日中韓 (日本語 ・ 中国語 ・ 韓国語)
Windows コ ー ド ページ 105
カ ス タ ム フ ォ ン ト 171
標準フ ォ ン ト 103
日本語 103, 105, 169
ぬ
塗 り 70
は
バイ ト サービ ング 78
バイ ト 順序マー ク (BOM) 98, 109
ハイパーテキス ト 文字列 106
Unicode 非対応言語における 108
バイ ンデ ィ ング 29
パス 70
パスオブ ジ ェ ク ト 71
パスワー ド 75
パ タ ーン 79
バ ッ ク ス ラ ッ シ ュ置換 111
へ
ページ ご と のダウン ロー ド 78
ページサイ ズ規格 69
Acrobat の限界 70
ページ定義 67
ベース ラ イ ン圧縮 177
ほ
ホス ト エ ン コ ーデ ィ ング 100
ホス ト フ ォ ン ト 133
ひ
ま
標準出力条件
PDF/A のための 264
PDF/X のための 257
描線 70
マ ス ク 画像 180
ふ
フ ォ ーム XObject 72
332
フ ォ ーム フ ィ ール ド : ブ ロ ッ クへの変換 291
フォン ト
Type 3 (ユーザー定義) フ ォ ン ト 117
サブ セ ッ ト 化 140
AFM フ ァ イル 116
OpenType 115
PDF コ アセ ッ ト 131
PFA フ ァ イル 116
PFB フ ァ イル 116
PFM フ ァ イル 116
PostScript Type 1 116
TrueType 115
Type 3 (ユーザー定義) 117
埋め込みの法的側面 140
等幅 150
ユーザー定義 (Type 3) 117
リ ソ ース設定 59
フ ォ ン ト ス タ イル 151
フ ォ ン ト ス タ イル名
Windows の 133
フ ォ ン ト メ ト リ ッ ク 149
不可視テキス ト 309
複数ページ画像フ ァ イル 176
複製
ページ枠を 194
袋文字 309
プ ラグイ ン
ブ ロ ッ ク 作成用 279
ブ レ ン ド 79
ブロ ッ ク
プ ラ グ イ ン 279
ブ ロ ッ ク プ ロパテ ィ 281
索引
み
ミ リ メ ー ト ル 67
め
メ ー ト ル座標 67
メ ト リ ッ ク 149
メ モ リ 内に PDF 文書を生成 63
も
文字参照 112
文字列
オプ シ ョ ン リ ス ト の 110
ゆ
ユーザースペース 67
ユーザー定義 (Type 3) フ ォ ン ト 117
よ
用字系固有の改行 221
横書き 169, 170
り
リ ソ ース カ テ ゴ リ 59
れ
例外 55
レ イ ヤー と PDI 186
レ ン ダ リ ング イ ン テ ン ト 83
索引
333
ABC
PDFlib GmbH
Franziska-Bilek-Weg 9
80339 München, Germany
www.pdflib.com
電話 +49 • 89 • 452 33 84-0
FAX +49 • 89 • 452 33 84-99
ご質問がある と きは、 PDFlib メ ー リ ング リ ス ト と
tech.groups.yahoo.com/group/pdflib にある アー カ イ ブ を チ ェ ッ ク し て く だ さ い
ラ イ セ ン ス発行のお問い合わせ
[email protected]
サポー ト
[email protected] (お持ちの ラ イ セ ン ス番号をお書 き く だ さ い)