NAMEPDFJ - 日本語 PDF 生成モジュール

SYNOPSIS
use PDFJ qw(SJIS);$doc = PDFJ::Doc‑>new($pdfversion, $paperwidth, $paperheight);$font = $doc‑>new̲font('Ryumin‑Light', '90ms‑RKSJ‑H', 'Times‑Roman');$page = $doc‑>new̲page;$text = Text(" テキスト ", TStyle(font => $font, fontsize => 10));$paragraph = Paragraph($text, PStyle(size => 100, align => 'w', linefeed => 20));$image = $doc‑>new̲image($jpgfile, $pixelwidth, $pixelheight, $width, $height);$shape = Shape‑>ellipse($x, $y, $rx, $ry);$block = Block('V', $paragraph, $image, $shape, BStyle(align => 'c'));$block‑>show($page, $x, $y);$doc‑>print('sample.pdf');

DESCRIPTION■概要
このモジュールは日本語 PDF を生成する。次のような特徴がある。
・JIS X 4051「日本語文書の行組版方法」（1995）にほぼ準拠した行組版ルールを組み込んであり、禁則や行の詰め伸ばしはこのモジュールに任せることができる。

・

ルビ、添え字、縦書き中の欧文、縦中横、欧文のハイフネーション、下線・傍線、圏点、網掛けといった組版処理もこのモジュールに任せることができる。

・

Type1 フォントでは、和文に Ryumin-Light と GothicBBB-Medium、欧文に Times、Helvetica、Courierの各ファミリが使える。これらはフォント自体は埋め込まれないので、コンパクトな PDF を作れる。ただし表示・印刷環境にそのフォントがないと代替フォントとなる。

・

任意の TrueType フォントや OpenType フォントを使うこともできる。TrueType フォントやOpenType フォントは埋め込まれる（和文についてはサブセットで）ので、若干 PDF のサイズが大きくなるが、どんな環境でも同じように表示・印刷できる。

・

欧文に、固定ピッチの半角フォントを使うことも、プロポーショナルな欧文フォントを使うこともできる。

・

日本語文字コードとしては、シフト JIS、日本語 EUC、UTF8、Unicode に対応している。

1

・

JPEG 画像（ファイルおよび URL 指定）、PNG 画像（ファイル指定）と線画図形が扱える。画像や図形をテキストの一部として行内に配置することも可能。逆に線画図形の中にテキストや画像を配置することもできる。

・

テキストを行長と行送りを指定して折り返し処理し、段落を作ることができる。段落には箇条書
きのためのラベルを付けることができる

・

段落、画像、図形などを並べてブロックというまとまりを作ることができる。ブロックには、内容の配置、周囲の余白、枠線、塗りつぶし色などを指定できる。一方向に並ぶ配列ブロック、縦横に並ぶ行列ブロック、木構造のツリーブロックがある。ブロックは入れ子にできる。

・

段落やブロックを指定の大きさを超えないように分割して、複数のページに分けて表示すること
ができる。

・

PDF のフォーム、文書情報、アウトライン情報、ハイパーリンク（文書内および URL）を付加できる。

・

暗号化ができる。

■表示可能なオブジェクト
PDFJ では次の表示可能な構成要素に対応するオブジェクトを組み合わせて PDF 文書を作成する。これらはみな、show というメソッドでページ上に位置を指定して表示することができる。show メソッ
ドの具体的な使い方については後述する。
テキスト（PDFJ::Text）
指定の文字列を、指定のフォントやサイズなどの属性に従って表示するもの。フォントのエン
コーディングが H であれば左から右へ横書きで、V であれば上から下へ縦書きで表示される。
ルビ、添え字、縦中横、下線・傍線、圏点、囲みといった属性の指定ができる。
テキスト自体には行長や行送りといった属性はなく、折り返して表示されることはない。
文字だけでなく、表示可能なオブジェクトを含むことができる。
段落（PDFJ::Paragraph）
テキストに対して行長と行送りと配置を指定して行の折り返しをおこない、ひとつの段落として表示するもの。行の折り返しに伴う、禁則処理、ハイフネーション、行の詰め伸ばしは自動的に処理される。
またテキストには、文字だけでなく画像や図形をひとつの文字のように扱って含むこともできる。
行頭、行末のインデント、先頭行につけるラベルを指定することもできる。
段落の前後の間隔を指定することができる。この間隔は段落を並べてブロックを作る際に適用される。
画像（PDFJ::Image）

JPEG または PNG 形式でファイルに保存されているものか、JPEG 形式で URL で参照できる画像のみが扱える。元のピクセルサイズとは関係なく指定の大きさで表示できる。
周囲の余白を指定することもできる。

2

図形（PDFJ::Shape）
直線、矩形、多角形、円、楕円、ベジエ曲線を組み合わせて図形を作成し、表示できる。線の有無、
太さ、色、点線、塗りつぶしの有無、色といった属性が指定できる。
図形内にテキストを配置することもできる。
周囲の余白を指定することもできる。
ブロック（PDFJ::Block）
表示可能なオブジェクトを並べてひとまとめにしたもの。一方向に並べる配列ブロック、縦横に並べる行列ブロック、木構造のツリーブロックがある。
全体の幅や高さを指定して内容の配置を指定することもできる。内容の配置は、左右方向に、l（左）、c（中央）、r（右）、上下方向に、t（上）、m（中央）、b（下）を組み合わせて指定する。ただし、全体の幅や高さは内容によって決まる幅や高さより小さくはできない。
配列ブロックでは、オブジェクトに前後の間隔の指定があれば、それに従って間隔が空けられる。
また、直接数値で間隔を指定することもできる。行列ブロックでは、行間隔と列間隔を指定できる。ツリーブロックでは親子方向と兄弟方向の間隔を指定できる。
ブロックには、周囲の余白、枠線、塗りつぶし色を指定することができる。
ツリーブロックには親子間の接続線を指定することができる。
ブロックは入れ子にできる。
空白（PDFJ::Space）
縦横に指定のサイズを持った正方形の空白。テキスト中に特定の大きさの間隔を取りたい場合に使用する。
フォームフィールド（PDFJ::Field::*）
対話フォームの各種の入力フィールド（テキスト、ボタン、チェックボックス、ラジオボタン、コ
ンボボックス）。
ミニページ（PDFJ::MiniPage）
指定の幅と高さを持った矩形の領域で、ページと同様に表示可能なオブジェクトを配置できる。
領域外にはみ出た部分は表示されない。

■その他のオブジェクト
その他に次のようなオブジェクトが、表示可能なオブジェクトとともに使用される。
特殊オブジェクト（PDFJ::NewLine、PDFJ::Null、PDFJ::Outline、PDFJ::Dest）
以下の特殊オブジェクトをテキスト中に置くことで様々な指示をおこなう。
改行オブジェクト（PDFJ::NewLine）は段落作成時に強制改行を指示する。
ヌルオブジェクト（PDFJ::Null）は段落作成時に改行可能位置を指示する。
アウトライン指示オブジェクト（PDFJ::Outline）は PDF のアウトライン（しおり）の作成を指示する。
リンク先オブジェクト（PDFJ::Dest）は PDF のハイパーリンクの宛先を指示する。

3

フォント（PDFJ::AFont、PDFJ::CIDFont）
フォントは Type1 フォントでは、和文に Ryumin-Light と GothicBBB-Medium、欧文に Times、Helvetica、Courier の各ファミリが使える。TrueType フォントおよび OpenType フォントは任意のものが使える。ただし PDF に埋め込まれるので、埋め込みが許可されたフォントでなければならない。
和文フォントだけを指定したテキストに欧文が現れたときには、和文フォントの半角文字（文字幅は半角固定）が使われるが、組み合わせる欧文フォントを指定しておくとその欧文フォントが使われる。その場合、欧文フォントの和文フォントに対するサイズ比率を指定できる。プロポーショ
ナルな和文フォントには対応していない。
縦書き用エンコーディング（V）を指定した和文フォントを指定すると、そのテキストは縦書きとなる。
テキストスタイル（PDFJ::TextStyle）
フォント、フォントサイズ、文字描画モード、ベースライン調整、斜体、下線（縦書きでは傍線）、
囲み箱、圏点、添え字（上・下）、ルビ、傍注、図形スタイル、が指定できる。
文字描画モードは、文字の枠線と塗りつぶしの組み合わせの指定。図形スタイルは、文字描画、下線・傍線、囲み箱における図形スタイルの指定。
段落スタイル（PDFJ::ParagraphStyle）
行長、揃え、行送り、ラベル、ラベル長、行頭インデント、行末インデント、前間隔、後間隔、が指定できる。
揃えとしては、b（行頭揃え）、m（中央揃え）、e（行末揃え）、w（両端揃え）がある。
ブロックスタイル（PDFJ::BlockStyle）
幅、高さ、揃え、揃えフラグ、周囲余白、枠線、塗りつぶし色、前間隔、後間隔、などが指定できる他、行列ブロック、ツリーブロックに特有のスタイルもある。
図形スタイル（PDFJ::ShapeStyle）
線幅、点線、線色、塗りつぶし色、周囲余白、前間隔、後間隔、が指定できる。
色（PDFJ::Color）
灰色指定と、ＲＧＢ指定ができる。図形属性の線色と塗りつぶし色の指定に使われる。
ページ（PDFJ::Page）
各ページの内容を保持する。テキストや画像や図形など、表示可能なオブジェクトはページに配置することで実際に表示される。

PDF 文書（PDFJ::Doc）
一つの PDF 文書。ページ群や、リソースとしてのフォントや画像をまとめ、最終的に一つの PDF
ファイルとして出力する。

■ PDFJ のインストール
管理者であれば次の標準的な手順でインストールできる。

4

perl Makefile.PL
make
make install
最後の make install は管理者権限で実行する。Windows では make でなく nmake を使用する。
管理者でない場合でも、PDFJ を構成する次のモジュールファイル群を Perl から利用できる（すなわち@INC にセットされた）ディレクトリにおけば利用できる。
PDFJ.pm
PDFJ サブディレクトリとその中の pm ファイル群

PDFJ は、欧文のハイフネーションをおこなうために、TeX::Hyphen モジュールを使用している。欧文を含むテキストを扱う場合は必要となるので、CPAN からダウンロードしてインストールしておく。
管理者でない場合は、次のモジュールを Perl から利用できるディレクトリにおけばよい。
TeX/Hyphen.pm
TeX/Hyphen/czech.pm
TeX/Hyphen/german.pm

PDFJ は、フォントや画像などのデータを埋め込む際に、デフォルトでは Compress::Zlib モジュールを使用する。Compress::Zlib がない環境や、Compress::Zlib を使いたくない場合のために、Compress::Zlib
を使わずにデータの埋め込みをおこなうオプションも用意されている。（文書オブジェクトの作成を参照）
暗号化をおこなう際には、Digest::MD5 モジュールが必要である。

■ PDFJ の使用
PDFJ を使用するには、つぎのようにして use PDFJ の引数に日本語文字コードを指定する。省略すると 'SJIS' とみなされる。
# Shift‑JIS の場合
use PDFJ 'SJIS';# EUC の場合
use PDFJ 'EUC';# UTF8 の場合
use PDFJ 'UTF8';# UNICODE（UCS2）の場合
use PDFJ 'UNICODE';
テキストオブジェクトを作る時に与える文字列や、フォントのエンコーディングでの日本語文字コー
ドは、use PDFJ で指定したものと合致するようにしなければならない。
異なる文字コードを混在させたり切り替えて使用することはできない。

5use PDFJ によって次のサブルーチンがエクスポートされる。
Doc
Text
TStyle
NewLineOutline
Dest
Null
Space
Paragraph
PStyleBlock
BStyle
NewBlock
BlockSkip
Shape
SStyleColor■文書オブジェクトの作成
まず最初に文書オブジェクトを作成しなければならない。
$docobj = PDFJ::Doc‑>new($version, $width, $height);
ここで、$version は PDF のバージョン（※下記の注を参照）、$width はページの幅、$height はページの高さで、単位はポイント（1/72 インチ）である。（ポイントの定義は定まったものがないが、PDF では 1/72 インチとされている。1 インチは 25.4mm。）
なお、ページの幅と高さは、各ページオブジェクトを作成する時に個別に指定することもできる。
※ PDF のバージョン

PDF のバージョンは、次のように Acrobat や Acrobat Reader のバージョンと対応している。
PDF バージョン 1.2 … Acrobat バージョン 3
PDF バージョン 1.3 … Acrobat バージョン 4
PDF バージョン 1.4 … Acrobat バージョン 5
PDF バージョン 1.5 … Acrobat バージョン 6
PDF バージョン 1.6 … Acrobat バージョン 7
したがって Acrobat3 でも使えるようにしたければ 1.2 にしておく。ただし、日本語 TrueType フォントを使うときは 1.3 以上が必要。OpenType フォントを使う時は 1.6 以上が必要。Acrobat4 以上で使えればよいということなら常に 1.3 にしておけばよい。
※データ埋め込み方法の指定

Compress::Zlib を使わずにデータの埋め込みをおこなう場合は、文書オブジェクトの filter メソッドを
用 い て 次 の よ う に デ ー タ 埋 め 込 み 方 法 の 指 定 を お こ な っ て お く。こ の 指 定 を し な い 場 合 は

6

Compress::Zlib を使った埋め込みがおこなわれる。（作成される PDF のサイズが変わる）。
$docobj‑>filter('a');※オプションの指定
文書オブジェクトの setoption() メソッドで、各種の処理の方法を切り替えるオプションを指定できる。
具体的なオプションについては以下でその都度説明する。

■ページオブジェクトの作成
ページは文書オブジェクトから new_page メソッドで追加される。幅と高さを省略すると文書オブジェクトの作成の際に指定したものが使われる。
$pageobj = $docobj‑>new̲page;$pageobj = $docobj‑>new̲page($width, $height);
途中にページを挿入したいときは insert_page メソッドを用いる。
$pageobj = $docobj‑>insert̲page($number);$pageobj = $docobj‑>insert̲page($number, $width, $height);
引数 $number でどの位置に挿入するか（0 が先頭ページ）を指示する。
さらに、全画面表示した時の画面表示秒数（その時間経過したら自動的に次の画面に移る）と画面移行
効果の指定ができる。
$pageobj = $docobj‑>new̲page($width, $height, $dur, $trans);$dur が画面表示秒数、$trans が画面移行効果。画面移行効果は、移行秒数、移行方法、オプション（複数可）をカンマで区切って並べる。移行方法は次のいずれか（デフォルトは R）。
Split … 二本の直線が動いて次の画面が現れる
Blinds … 等間隔の複数の直線が動いて次の画面が現れる
Box… 矩形領域が外から内あるいは内から外へ動いて次の画面が現れる
Wipe… 一本の直線が端から端へ動いて次の画面が現れる
Dissolve … モザイク上に前の画面が消えて次の画面が現れる
Glitter … Dissolve と似ているがモザイク領域が端から端へ動いて次の画面が現れるR… 単に次の画面に切り替わる（移行秒数は無視される）
画面移行効果のオプションは次のいずれか（デフォルトは H,I,0）。
※ Split,Blinds に対するオプション
H … 水平の直線
V … 垂直の直線※ Split,Box に対するオプション
I … 外から内へ
O … 内から外へ※ Wipe,Glitter に対するオプション

7

0… 左から右へ
90 … 下から上へ（Wipe のみ）
180 … 右から左へ（Wipe のみ）
270 … 上から下へ
315 … 左上から右下へ（Glitter のみ）
ページ番号は、pagenum メソッドで得られる。これで得られるページ番号は先頭が 0 でなく 1 であることに注意。insert_page でページの挿入をおこなうとそれ以降のページ番号が変わることにも注意が必要。
$pagenum = $pageobj‑>pagenum;■フォントオブジェクトの作成
フォントオブジェクトは、文書オブジェクトから、new_font メソッドで作られる。
$fontobj = $docobj‑>new̲font($basefont, $encoding);$basefont はベースフォント名で、Type1 フォントの場合次のいずれかを指定する。
※欧文フォント
Courier
Courier‑Bold
Courier‑BoldOblique
Courier‑Oblique
Helvetica
Helvetica‑Bold
Helvetica‑BoldOblique
Helvetica‑ObliqueTimes‑Bold
Times‑BoldItalic
Times‑Italic
Times‑Roman※和文フォント
Ryumin‑Light
GothicBBB‑Medium$basefont に TrueType フォントのファイル名（拡張子が .ttf）を指定することで、TrueType フォントを指定することができる。また、TrueTypeCollection フォント（拡張子が .ttc）の場合はその中の何番目（0 か ら 数 え て）の フ ォ ン ト を 使 う か を フ ァ イ ル 名 の 後 ろ に「: 番 号」と し て 付 加 す る。（例：「c:\windows\fonts\msgothic.ttc:0」）$basefont に OpenType フォントのファイル名（拡張子が .otf）を指定することで、OpenType フォントを指定することができる。OpenType フォントを使用する時は PDF バージョンに 1.6 以上を指定すること。

8

※ TrueTypeCollection フォントは固定ピッチのフォントとプロポーショナルなフォントがセットになっていることが多いが、上記のようにして指定するのは固定ピッチの方でなければならない。
付属のスクリプト ttcinfo.pl で TrueTypeCollection フォントに含まれるフォント名を調べることができる。プロポーショナルなフォントはフォント名に P が付加されていることが多い。
※ TrueType および OpenType フォントは PDF に埋め込まれる（和文フォントの場合はサブセット
で）が、埋め込みを許可しないフォントも存在する。PDFJ は、フォント自体の中にある埋め込みを許可するかどうかのフラグを見て、OK かどうかを判断する。ただし、別のライセンスファイルなどで使用許諾条件が示されている場合もありうるので、フォント作成者の権利を侵害しないよ
うに十分注意していただきたい。
※ TrueType フォントを埋め込む際には、フォントファイル内にユニコードに対応した cmap テーブル（platformID が 3、platformSpecificID が 1、format が 4 のもの）が必要である。古い TrueType
フォントではこの cmap テーブルを持たないものも存在する。現状ではそういう TrueType フォン
トは埋め込むことができない。また、ユニコードの 0x20000 以降の拡張文字を使用する場合は、
ucs4 に対応した cmap テーブル（platformID が 3、platformSpecificID が 10、format が 12 のもの）
が必要。

$encoding はエンコーディングで、次のいずれかの定義済みエンコーディング名を指定する。省略すると、欧文フォントに対しては 'WinAnsiEncoding'、和文フォントに対しては '90ms-RKSJ-H' が使われる。
MacExpertEncoding はエキスパートフォントと呼ばれる特殊なフォントのためのエンコーディング。
※欧文フォントのエンコーディング
WinAnsiEncoding
MacRomanEncoding
MacExpertEncoding※和文フォントのエンコーディング
83pv‑RKSJ‑H … Macintosh JIS X 0208 KanjiTalk6 拡張
90pv‑RKSJ‑H … Macintosh JIS X 0208 KanjiTalk7 拡張
90ms‑RKSJ‑H … Microsoft CP932 JIS X 0208 NEC,IBM 拡張
90ms‑RKSJ‑V … 〃縦書き
Add‑RKSJ‑H … JIS X 0208 富士通 FMR 拡張
Add‑RKSJ‑V … 〃縦書き
Ext‑RKSJ‑H … JIS C 6226(JIS78) NEC 拡張
Ext‑RKSJ‑V … 〃縦書き
EUC‑H
… JIS X 0208
EUC‑V
… 〃縦書きEUC‑NEC‑H… JIS X 0208 NEC 拡張
EUC‑NEC‑V… 〃縦書きUniJIS‑UCS2‑HW‑H … Unicode 横書き
UniJIS‑UCS2‑HW‑V … Unicode 縦書き
UniJIS‑UCS2‑EXT‑HW‑H … Unicode（0x20000 以降の拡張文字対応）横書き
UniJIS‑UCS2‑EXT‑HW‑V … Unicode（0x20000 以降の拡張文字対応）縦書き
和文フォントのエンコーディングの末尾の 'H' は横書き、'V' は縦書き。'RKSJ' とつくものは Shift-JIS
用、'EUC' とつくものは EUC 用、'Uni' とつくものは Unicode 用。日本語プロポーショナルフォントは使えないことに注意。欧文部分も含めてすべての文字が全角か半角の固定ピッチとなる。

9

※ EUC-NEC-H と EUC-NEC-V は、
EUC-H と EUC-V をベースに NEC 拡張文字（区点での 13,89-92 区）を加えたもので、PDFJ で独自に定義したエンコーディングである（これを使った PDF を Acrobat など
で開いてフォント情報を見るとエンコーディングは「カスタム」と表示される）。
※ UniJIS-UCS2-EXT-HW-H と UniJIS-UCS2-EXT-HW-V は、UniJIS-UCS2-HW-H と UniJIS-UCS2-HW-V をベースに、0x20000 以降の拡張文字に対応するように PDFJ で独自に定義したエンコーディ
ングである（これを使った PDF を Acrobat などで開いてフォント情報を見るとエンコーディングは「カスタム」と表示される）。
※ UTF8 の場合もフォントエンコーディングには上記の Unicode 用を指定すればよい。

new_font メソッドにはもう一つの用法があり、つぎのようにして和文フォントと欧文フォントの組を指定する。
$fontobj = $docobj‑>new̲font($jbasefont, $jencoding, $abasefont, $aencoding, $asize);
ここで、$jbasefont は日本語ベースフォント名、$jencoding はそのエンコーディング、$abasefont は欧文 ベ ー ス フ ォ ン ト 名、 $aencoding は そ の エ ン コ ー デ ィ ン グ。 $aencoding を 省 略 す る と
WinAnsiEncoding。$asize は欧文フォントの和文フォントに対するサイズ比率で、省略すると 1。
このように和文フォントと欧文フォントを組み合わせたフォントオブジェクトをテキストに対して指定すると、テキスト中の日本語部分と欧文部分（正確に言うと 0x7f までの ASCII 文字の部分）に対してそれぞれのフォントが自動的に切り替えて適用される。これにより、欧文部分についてはプロポー
ショナルな表示となる。組フォントでは欧文フォントが適用されるのは ASCII 文字だけであり、ASCII 文字については WinAnsiEncoding と MacRomanEncoding に違いはないので、組文字の欧文フォ
ントのエンコーディングはどちらを指定しても同じ。
※ use PDFJ で UTF8 または UNICODE を指定した場合は、0x7f までの ASCII 文字ではなく、0xff までの文字に対して欧文フォントが適用される。この場合、欧文フォントのエンコーディングには
WinAnsiEncoding を指定しておくべきである。Unicode での 0xff までの文字は iso-8859-1 と一致しており、WinAnsiEncoding は iso-8859-1 の拡張になっている。
単独の欧文フォントを適用した文字列は、use PDFJ '…' で指定した日本語文字コードによらず、1 バイ
ト＝ 1 文字としてエンコーディングに従って表示される。
和文フォントの文字セットは Adobe-Japan1-4 として扱われる。Adobe-Japan1-4 には、大まかに言って
JIS X 0201 と 0208（第一水準、第二水準）、および各メーカーの拡張文字が含まれる。詳細は次を参照のこと。

http://partners.adobe.com/asn/developer/pdfs/tn/5078.Adobe-Japan1-6.pdf
最新の文字セットは Adobe-Japan1-6 であり、これには JIS X 0212（補助漢字）と 0213（第三水準、第四水準）が含まれているが、今のところ PDFJ では Adobe-Japan1-6 ではなく Adobe-Japan1-4 が使われる。
上記のように、エンコーディング UniJIS-UCS2-EXT-HW-H と UniJIS-UCS2-EXT-HW-V を使用することで、ユニコード 0x20000 以降の拡張文字を扱うことができる（例えば上が土の吉）。この拡張文字
は ucs2（16 ビット）には納まらないので、0xE001 以降の領域に仮に割り当てて、それにフォントファ
イル内の文字コード（CID）が対応するように独自の CMAP を PDF に埋め込むことで対応している。
従って、その結果生成された PDF から再びテキストデータを取り出した場合には、拡張文字は元に戻らないことに注意。また、拡張文字を使用した場合、その文字を含むフォントを指定しなければその部分は表示されない。Ryumin-Light と GothicBBB-Medium を指定した場合は Adobe Reader などのPDF 表示ソフトが実際に使用するフォントに依存するが、最近の Acrobat や Adobe Reader では OK。

10

Windows 付属のフォントファイルでは、MS 明朝や MS ゴシックでは表示できない。メイリオでは
OK。

■テキストオブジェクトの作成
テキストオブジェクトは、Text サブルーチンで作成する。
$textobj = Text(@list, $textstyle);
ここで、@list は文字列、表示可能なオブジェクト、特殊オブジェクトのリストで、@list の要素が順に並べられた内容のテキストが作成される。$textstyle はテキストスタイルオブジェクト。
リストは配列参照の形で与えることもできる。
$textobj = Text([@list], $textstyle);
特殊オブジェクトには、改行オブジェクト、ヌルオブジェクト、アウトライン指示オブジェクト、リン
ク先オブジェクトがある。（アウトライン指示オブジェクト、リンク先オブジェクトについては後述。）
改行オブジェクトは NewLine サブルーチンで作成する（引数無し）。改行オブジェクトはテキストオ
ブジェクトをそのまま表示する場合には何の効果もないが、段落オブジェクトを作る際に強制改行す
る効果をもたらす。
ヌルオブジェクトは Null サブルーチンで作成する。ヌルオブジェクトは表示上は何の効果もないが、行の折り返しの時にその位置で折り返し可能であることを指示する。半角のアルファベットと記号が続く部分は途中では折り返されないが、ヌルオブジェクトを挿入することでその位置で折り返しが可能となる。Null() の引数にハッシュを与えてテキストスタイルを指定できる（ヌルオブジェクト自体は表示されないので通常はこれは無意味であるが、後述するように beginindent、
endindent、align といった特殊なスタイルを指定するのに使用する）。
テキスト中の文字の間隔は組版ルールに基づいて自動的に処理されるが、特定の大きさの間隔を取りたい場合は、後述の空白オブジェクトを挿入すればよい。なお、半角空白が行頭や行末に来たときは組版ルールによって無視されるが、Space による空白オブジェクトの場合は行頭や行末でも無視されることなく指定された間隔が取られる。
テキストスタイルオブジェクトは TStyle サブルーチンで作成する。
$textstyle = TStyle(%args);
引数にはハッシュリストの形で次のものを与える。font と fontsize は必須。その他はオプション。
font => フォントオブジェクト
fontsize => フォントサイズ（ポイント）
italic => イタリックフラグ（真を指定するとイタリックに）
bold => ボールドフラグ（真を指定するとボールドに）slant => 斜体フラグ（真を指定すると斜体に）render => 文字描画モード（0: 塗り潰し、1: 枠線、2: 塗り潰し＋枠線）
shapestyle => 文字描画の図形スタイルオブジェクト
rise => ベースラインの上調整値（ポイント）
vh => 縦中横フラグ（真を指定すると縦中横に）11

withline => 下線または傍線フラグ（真を指定すると下線または傍線が付く）
withlinestyle => 下線または傍線の図形スタイルオブジェクト
withbox => 囲み枠指定（f: 塗り潰し、s: 枠線、sf: 塗り潰し＋枠線）
withboxstyle => 囲み枠の図形スタイルオブジェクト
withdot => 圏点フラグ（真を指定すると圏点が付く）
withnote => 注釈テキストオブジェクト
suffix => 添え字指定（'u' を指定すると上添え字、'l' を指定すると下添え字）
ruby => ルビ文字列
objalign => 表示可能オブジェクトの配置
noglue => 文字種によって自動挿入される調整余白を入れない
noshift => 全角文字の字幅調整をおこなわない
code => 文字コード（'SJIS'、'EUC'、'UTF8'、'UNICODE' のいずれか）
pageattr => このテキストが配置されるページにセットする属性をハッシュ参照で指定
filltext => 前の文字との間の余白に指定の文字列を繰り返して埋める
blockalign => 配列ブロック内での配置（b: 左または上、m: 中央、e: 右または下、数値 : イン
デント量）

slant による斜体は機械的な変形による。欧文については Italic 系のフォントを指定するほうが適切な字形が得られる。italic と bold については、イタリックとボールドを参照。
render や shapestyle の指定をしないと、文字は黒の塗り潰しで描画される。
withline を指定して withlinestyle を省略すると黒の実線となる。withbox を指定して withboxstyle を省略すると黒の実線となる。
withnote は文字の上や右に別のテキスト（そのテキストオブジェクトを withnote で指定する）を表示するものであり、suffix は指定した文字を小さくして位置を上下させる命令である。
※ withnote に文字列を与え、withnotestyle にテキストスタイルオブジェクトを与えることもできる。

ruby で指定したルビ文字列は親文字列のフォントサイズの半分のフォントサイズとなる。
ルビ文字列と親文字列の長さに差がある場合、短い方の文字列の前後と字間を、前 : 字間 : 後＝ 1:2:1 となるように配置する。ただし欧文単語は一字扱い。
ルビ文字列が親文字列より長くて、前の文字が始め括弧類、行頭禁則文字、分離禁止文字（―‥…）、全
角空白、平仮名の場合、後の文字がが終わり括弧類、句点類、分離禁止文字、全角空白、平仮名の場合には、ルビ一文字分までを前や後の文字に重ねる。$PDFJ::Default{NoRubyOverlap} を真にセットすると、この重ね処理はおこなわれない。

objalign は、Text に画像や図形などの表示可能オブジェクトが与えられたときにどう配置するかをつぎのように指定する。objalign の指定を省略すると、横書きでは 'b'、縦書きでは 'c' とみなされる。
※横書きの場合（上下方向の配置の指定となる）
t … 文字とオブジェクトの上端をあわせる
m … 文字とオブジェクトの上下中央をあわせる
b … 文字とオブジェクトの下端をあわせる※縦書きの場合（左右方向の配置の指定となる）
l … 文字とオブジェクトの左端をあわせる
c … 文字とオブジェクトの左右中央をあわせる12r … 文字とオブジェクトの右端をあわせる

noglue と noshift を真に指定すると、和文フォントの非 ASCII 文字は全角ベタ組みとなる。
code は、use PDFJ で指定した文字コードとは違う文字コードによるテキストを与えたいときに指定する。
pageattr は、そのテキストがページに配置されたときに、そのページに属性として名前と値の組を与えるために使う。セットされた属性はページオブジェクトの getattr() メソッドで取り出せる。ページ
ヘッダやフッタをページ内容に応じて変化させたい場合などに使う。
filltext は、後述する空白オブジェクトに対して指定して、長いリーダーを実現するために使う。
次のスタイルは本来は段落スタイルであるが、テキストスタイルとして指定すると、行を折り返して段落を作成するときにそこで段落スタイルを切り替えることができる。文字列にこのスタイルを指定す
るとその文字列自体が行をまたいだ場合に予期せぬ動作をするので、切り替える位置に前述のヌルオ
ブジェクトを配置してそのスタイルとして指定するとよい。
beginindent => 行頭インデント
endindent => 行末インデントalign => 揃え（b: 行頭揃え m: 中央揃え e: 行末揃え w: 両端揃え W: 強制両端揃え）※ beginindent は次の行から、endindent と align はその行から、スタイルが指定のものに切り替わる。

■テキストオブジェクトの入れ子による部分スタイル指定
テキストの一部分だけに特定のスタイルを適用したい場合、テキストオブジェクトを入れ子にして部
分スタイルを指定することでおこなう。入れ子になったテキストオブジェクトでは子のスタイルで指定されていないスタイルは親のものが引き継がれる。
例えば、明朝のテキストの一部をゴシックにしたい場合、つぎのようにする。
$mincho = $docobj‑>new̲font('Ryumin‑Light', '90ms‑RKSJ‑H');$gothic = $docobj‑>new̲font('GothicBBB‑Medium', '90ms‑RKSJ‑H');$textobj = Text([" 明朝 ",
Text(" ゴシック ", TStyle(font => $gothic))," ここも明朝 "], TStyle(font => $mincho, fontsize => 10));
この場合、" ゴシック " に対するスタイルでは fontsize が指定されていないので、親スタイルの fontsizeの 10 が引き継がれる。
テキストの一部に下線を引く場合は、例えばつぎのようにする。
$mincho = $docobj‑>new̲font('Ryumin‑Light', '90ms‑RKSJ‑H');$normal̲style = TStyle(font => $mincho, fontsize => 10);
$uline̲style = TStyle(withline => 1);$textobj = Text([" テキスト ",Text(" 下線付き ", $uline̲style),

13], $normal̲style);
テキストスタイルはこのように変数にセットしておいて使うこともできるし、先の例のように直接
TStyle サブルーチンを使ってもよい。

■イタリックとボールド
テキストスタイルの italic と bold を使うためには、どのフォントがどのフォントのイタリック形やボールド形である、ということをドキュメントオブジェクトに教えておいてやる必要がある。そのために、
italic() と bold() メソッドを使う。例えば次のようにする。
$ft = $docobj‑>new̲font('Times‑Roman');$fti = $docobj‑>new̲font('Times‑Italic');$ftb = $docobj‑>new̲font('Times‑Bold');$ftbi = $docobj‑>new̲font('Times‑BoldItalic');$docobj‑>italic($ft, $fti, $ftb, $ftbi);$docobj‑>bold($ft, $ftb, $fti, $ftbi);
このように、元フォント、その修飾フォント、の順で、二組以上をまとめて引数に与えることができる。
組となるフォントは、欧文フォント同士、和文フォント同士、欧文フォントと組になった和文フォント
同士、でなければならない。
Text('normal', Text('italic', TStyle(italic => 1)), TStyle(font => $ft))
このようなテキストオブジェクトを作ると、'normal' には $ft が、'italic' には $fti が使われることになる。

italic() や bold() での登録がされていないフォントに対して italic や bold のスタイルを与えた場合は、何の効果ももたらさない。
なお、一般に和文フォントにはイタリック形は存在しないので、和文フォントのテキストに対してテキストスタイルで italic が指定された場合は、slant に置き換えて傾けて表示する。

■段落オブジェクトの作成
段落オブジェクトは Paragraph サブルーチンで作成する。
$paragraphobj = Paragraph($textobj, $parastyle);
ここで、$textobj はテキストオブジェクト、$parastyle は段落スタイルオブジェクト。複数のテキストを与えたいときはそれを一つのテキストオブジェクトにまとめた上で与える。
段落スタイルオブジェクトは PStyle サブルーチンで作成する。
$parastyle = PStyle(%args);
引数にはハッシュリストの形で次のものを与える。size と linefeed と align は必須。他はオプション。
size => 段落の行方向のサイズ（ポイント）align => 揃え（b: 行頭揃え m: 中央揃え e: 行末揃え w: 両端揃え W: 強制両端揃え）14

linefeed => 行送り（ポイント）
preskip => 段落前の間隔（ポイント）
postskip => 段落後の間隔（ポイント）
objinbounds => 真だと先頭・末尾行の行内オブジェクトを段落内とする
blockalign => 配列ブロック内での配置（b: 左または上、m: 中央、e: 右または下、数値 : イン
デント量）
beginindent => 行頭インデント
endindent => 行末インデント
beginpadding => 行頭側の余白（ポイント）
labeltext => ラベルのテキストオブジェクト
labelsize => ラベルの行方向のサイズ（ポイント）
labelskip => ラベルと本文の間隔（ポイント）
nobreak => 真だと break メソッドで分割されない
postnobreak => 真だとブロックの break でその後ろで分割されない
float => 配列ブロックの break で位置を自動移動（「ブロックオブジェクトの分割」参照）
typename => タイプ名

linefeed で指定するのは行送りであって行間ではないことに注意。linefeed => '150%' のように 数値 %と指定すると、テキストオブジェクトのフォントサイズに対する割合とみなされる。
linefeed に「s 数値」または「s 数値 %」というオプションを付加して指定することができる。s オプションがあると、テキスト中にテキスト以外のオブジェクトが含まれている場合に、オブジェクトと隣の行との間隔を最低でも s オプションで指定しただけ取るように行送りが部分調整される。例えば
linefeed => '150%s25%' と指定すると、通常の行間はフォントサイズの 50% だが、オブジェクトと隣の行との間隔がフォントサイズの 25% 以上になるように調整される。これによって行中の大きなオブジェクトが隣の行と重なるのを防ぐことができる。
preskip と postskip は、ブロック内に段落を並べる時の間隔として使われる。linefeed と同様、数値 %と指定すると、テキストオブジェクトのフォントサイズに対する割合とみなされる。省略すると、それぞれ行間（行送りからフォントサイズを差し引いた長さ）の半分にセットされる。ハッシュ参照で { タイプ名 => 間隔 ,...} と指定すると、preskip ならブロックないで前にある、postskip なら後にあるオブジェクトのタイプ名によって間隔を変えることができる。（タイプ名のないオブジェクトは 'default' と見なす。）
objinbounds を真に指定した場合、先頭行や末尾行のテキスト中の非テキストオブジェクトが段落内に納まるように境界が調整されて、preskip、postskip による間隔はその外側に取られる。objinbounds を指定せず、linefeed に s オプションを指定した場合は、objinbounds に 1 を指定したものとみなされる。
テキストは、(size - beginpadding - beginindent - endindent - labelsize) という行長を超えないように折り返し処理され、align にしたがって揃えられる。w による両端揃えの時、末尾行だけは行頭揃えとなる。
W による強制両端揃えでは、末尾行も含めて両端揃えとなる。行の折り返しの際の禁則とハイフネー
ション、両端揃えの際の詰め伸ばしは、JIS X 4051 にほぼ則っておこなわれる。

align、beginindent、endindent は配列参照の形で与えることができ、先頭行から順に使われる。行数が要素数より大きいときは最後の要素が繰り返し使われる。
beginpadding は、ラベルも含めた段落全体の、行頭側に取る余白を指定する。（この余白は size の中に含まれる。）したがって、ラベルがないときは、beginpadding の指定と単独要素の beginindent の指定は同じ効果を持つ。
labeltext でテキストオブジェクトが指定されると、ラベルとして先頭行の前に表示される。ラベルと15

本文の間には labelskip だけの間隔が取られる。labeltext に文字列を与えると本体のテキストオブジェ
クトと同じテキストスタイルでテキストオブジェクト化される。

labeltext には、テキストオブジェクトを返すサブルーチン参照と、そのサブルーチンに与える引数のリストを、配列参照の形で与えることもできる。これによって番号付き箇条書きが実現できる。例えばつぎのようになる。
$LabelNum = 1;
sub numlabel {my($fmt, $style) = @̲;Text(sprintf($fmt, $LabelNum++), $style);}$ol̲style = PStyle(size => 500, align => 'w', labelsize => 30,
labeltext => [¥&numlabel, "%d.", $normal̲style]);$para1 = Paragaph($text1, $ol̲style);$para2 = Paragaph($text2, $ol̲style);

postnobreak と float は、この段落を含むブロックが break されるときに意味を持つ。

■段落オブジェクトの分割
段落の行方向の大きさは段落スタイルの size で指定したものになるが、それと垂直な方向の大きさは
行数（と行送りとフォントサイズ）で決まる。これが一定の大きさになるように段落を分割するために、break メソッドが用意されている。例えば横書きの段落オブジェクト $para に対して、@paras = $para‑>break(200);とすると、高さが 200 ポイント以下になるように分割した段落のリストが得られる。もし、最初の段落だけは高さを 100 以下にしたければ、つぎのようにすればよい。
@paras = $para‑>break(100, 200);

break の引数に指定したサイズのリストは順に分割する段落のサイズとして使われ、なくなると最後のサイズが繰り返し使われる。
break の引数に指定したサイズが小さすぎて、最後のサイズでも分割できない部分が残ったときは、分割に失敗したものとして未定義値が返される。
もし、$para->break(5, 200) のように最初や途中にフォントサイズより小さなサイズを指定すると、それに対応して空の段落オブジェクトが得られる。この例では、最初に空の段落オブジェクト、続いて200 ずつに分割された段落オブジェクトが返されることになる。
段落スタイルの nobreak が真に設定されていると、分割されない。例えば nobreak な横書き段落オブ
ジェクト $upara があり、その高さが 150 であるときに、$upara->break(100, 200) は ( 空段落オブジェク
ト , $upara と同じオブジェクト ) を返す。$upara->break(100) では分割に失敗して未定義値を返す。

■空白オブジェクトとグルーSpace サブルーチンで作成した空白オブジェクトを、テキストオブジェクトの要素して与えることで、文字の間に指定の空白を置くことができる。Space() の引数は空白のポイント数。例えば、

16

Text(' なんたら ',Space(20),' かんたら ',TStyle(font => $font, fontsize => 10))とすると、
' なんたら ' と ' かんたら ' の間に 20 ポイントの余白が取られる。縦書きでも横書きでも指定の大きさの余白が取られることに注意。

Space() では、第二引数として前の文字との間のグルー（行長の調節のために伸び縮みする間隔）を指定することができる。グルーは [ 通常値 , 最小値 , 最大値 , 優先度 ] という配列参照として指定する。
単位はそのテキストのフォントサイズ（ポイントでないことに注意）。優先度は整数値を指定し、行長の調整の際に値が大きいグルーが優先して伸び縮みさせられる。PDFJ 組み込みの日本語組版ルール
では 0 〜 3 の優先度が使われている。空白のポイント数とグルーの両方を指定すると、指定のポイント
数の空白の前に指定のグルーが置かれることになる。例えば、
Text(' なんたら ',Space(10,[2,1,3,4]),' かんたら ',TStyle(font => $font, fontsize => 10))とすると、' なんたら ' と ' かんたら ' の間に通常は 30 ポイント、最小で 20 ポイント、最大で 40 ポイ
ントの空白が置かれることになる。（グルーの単位はフォントサイズ＝ 10 ポイントであることに注意。）空白量が実際にどうなるかは、段落が作られる時に行の折り返し処理の中で決まってくる。

Space() の第三引数には、テキストスタイルを与えることができる。filltext を与えると、グルー内を指定の文字列を繰り返して埋めることができる。例えば、
Text(' なんたら ',Space(0,[3,3,3,4],TStyle(filltext=>'*'),' かんたら ',TStyle(font => $font, fontsize => 10))とすると、' なんたら ' と ' かんたら ' の間に 30 ポイントの空白が取られて、'*' で埋められる。

■ブロックオブジェクトの作成
ブロックオブジェクトは Block サブルーチンで作成する。
$blockobj = Block($direction, @objlist, $blockstyle);
ここで、$direction はブロックの種類と内容を並べる方向を指示する。$direction によって、配列ブロッ
ク、行列ブロック、ツリーブロックのどれになるかが決まる。@objlist はブロックの内容で、配列ブロックでは表示可能なオブジェクトのリスト、行列ブロックでは表示可能なオブジェクトの配列参照のリスト。ツリーブロックでは階層的に構成された配列参照のリスト（詳細は後述）。$blockstyle はブ
ロックスタイルオブジェクト。
オブジェクトのリストはつぎのように配列参照の形で与えることもできる。
$blockobj = Block($direction, [@objlist], $blockstyle);
ブロックの種類と内容を並べる方向は、次のいずれかを指定する。
※配列ブロックH … 左から右R … 右から左V … 上から下17※行列ブロック
HV … [ 左から右 ] を上から下へ
RV … [ 右から左 ] を上から下へ
VH … [ 上から下 ] を左から右へ
VR … [ 上から下 ] を右から左へ※ツリーブロック
TH … 左が根のツリー
TR … 右が根のツリー
TV … 上が根のツリー
TU … 下が根のツリー
配列ブロックの場合、@objlist の各要素は表示可能なオブジェクトまたは改ブロックオブジェクトで、$direction で指定した方向に並べられる。各要素の間隔については後述。
行列ブロックの場合、@objlist の各要素は配列参照でなければならず、各配列参照が行を表すことになる。$direction が HV と RV の場合は行が横方向、列が縦方向であるが、VH と VR の場合は行が縦方
向、列が横方向となることに注意。
ツリーブロックの場合、@objlist の各要素はツリーの根となり、親子関係は親要素の後に子のリストを
配列参照の形で置くことで表現する。例えば
Ａ┬Ｂ┬Ｃ
│ └Ｄ
└Ｅ
のようなツリーは、
Block('TH', $Aobj, [$Bobj, [$Cobj, $Dobj], $Eobj], $style)のようになる。
ブロックスタイルオブジェクトは BStyle サブルーチンで作成する。
$blockstyle = BStyle(%args);
引数にはハッシュリストの形で次のものを与える。
width => 幅（ポイント）
height => 高さ（ポイント）
padding => 周囲余白（ポイント）align => 揃え（l: 左、c: 中央、r: 右、と、t: 上、m: 中央、b: 下、の組み合わせ）withbox => 囲み枠指定（f: 塗り潰し、s: 枠線、sf: 塗り潰し＋枠線）
withboxstyle => 囲み枠の図形スタイルオブジェクト
preskip => 前の間隔（ポイント）、'c' を指定すると先頭オブジェクトの preskip
postskip => 後の間隔（ポイント）、'c' を指定すると末尾オブジェクトの postskip
blockalign => 配列ブロック内での配置（b: 左または上、m: 中央、e: 右または下、数値 : イン
デント量）
typename => タイプ名

18

nobreak => 真だと break で分割されない
postnobreak => 真だとブロックの break でその後ろで分割されない
repeatheader => break で分割するとき先頭で繰り返す要素数
float => 配列ブロックの break で位置を自動移動（「ブロックオブジェクトの分割」参照）
colspan => 行列ブロックの要素となったとき指定数の列幅を持つものと扱われる
rowspan => 行列ブロックの要素となったとき指定数の行幅を持つものと扱われる※以下は配列ブロックで有効
adjust => サイズ調整フラグ
nofirstfloat => 真だと break で先頭には float 要素を置かない
bfloatsep => float が b の要素とそれ以外の要素の間に挿入される表示可能オブジェクト
efloatsep => float が e の要素とそれ以外の要素の間に挿入される表示可能オブジェクト※以下は行列ブロックで有効
adjust => サイズ調整フラグ
rowskip => 行間隔
colskip => 列間隔※以下はツリーブロックで有効
adjust => サイズ調整（l: 親子方向、s: 兄弟方向）
siblingalign => 揃え（b: 左または上、m: 子の中央、M: 子孫の中央、e: 右または下）levelskip => 親子間隔
siblingskip => 兄弟間隔
connectline => 親子接続線（s: 直線、c: クランク線）
connectlinestyle => 親子接続線の図形スタイルオブジェクト

width、height で幅や高さを指定した場合、内容の幅や高さがそれより大きい場合は内容に合わせられる。内容よりも指定した幅や高さが大きい場合は、align にしたがって位置が揃えられる。
align による揃えは、ブロック内で内容をどう配置するかを指定するもので、次のいずれかを組み合わせて指定。省略すると 'tl' とみなされる。配列ブロックでは、内容のオブジェクト自身のスタイルで
blockalign が指定されているとそちらが優先される。
※左右方向
l … 左寄せc … 中央寄せr … 右寄せ※上下方向
t … 上寄せm … 中央寄せb … 下寄せpadding は内容の周りに取られる余白の幅であり、withbox で囲み枠を指定した場合はその余白の外側に描画される。
withbox では、's','f','sf' の他に、'rX'（X は数値）を付加すると角が半径 X で丸くなる。
adjust は、要素となるオブジェクトがブロックである場合に、その大きさが揃うように調整する指定である。配列ブロックでは、adjust を真に指定すると、H と R の場合は要素ブロックの高さ、V の場合は要素ブロックの幅をもっとも大きいものに揃える。行列ブロックでは、adjust を真に指定すると、HV19

と RV では行内の高さと列内の幅、VH と VR では行内の幅と列内の高さを、もっとも大きいものに揃える。ツリーブロックでは、adjust に l（英小文字のエル）を指定すると親子方向の大きさを揃える。sを指定すると、兄弟方向の大きさを子孫の大きさに合わせる。
行列ブロックでは、widths と heights というメソッドで、行幅と列高さ（HV と RV の場合）または列
幅と行高さ（VH と VR の場合）を配列参照の形で得ることができる。
行列ブロックでは、rowskip スタイルで行間隔、colskip スタイルで列間隔を指定できる。ツリーブロッ
クでは、levelskip で親子間隔、siblingskip で兄弟間隔が指定できる。
行列ブロックの要素は通常は各々が行と列の交点に位置を占めるが、要素がブロックで colspan や
rowspan スタイルを指定してあれば、複数の列幅や行幅を占めるようにすることができる。言い換えれば、colspan は行方向に複数のセルを結合する指定、rowspan は列方向にセルを結合する指定と言える。なお、colspan や rowspan スタイルを指定できるのはブロックオブジェクトのみで、その他の表示
可能オブジェクトはみな colspan も rowspan も 1 とみなされる。
ツリーブロックの siblingalign スタイルは、親要素の兄弟方向の位置が子孫に対してどのように配置されるかを指定するもので、TV,TU では b: 左、m: 子の中央、M: 子孫の中央、e: 右 となり、TH,TR では
b: 上、m: 子の中央、M: 子孫の中央、e: 下 となる。省略すると 'b' とみなされる。
ツリーブロックの connectline スタイルは、親要素の子側中央と、子要素の親側中央を、線で結ぶ指定。
's' で直線、'c' でクランク線（親子方向と兄弟方向の直線をつなげた折れ線）となる。connectlinestyle は
その線の図形スタイルを指定し、省略すると黒の実線となる。

■配列ブロック内オブジェクトの間隔とタイプ名
配列ブロック内のオブジェクトの間隔は、前のオブジェクトの postskip と後ろのオブジェクトのpreskip を加算したものになる。また、Space サブルーチンで作成する空白オブジェクトで間隔を取ることもできる。オブジェクトリストの要素に数値があるとそのサイズの空白オブジェクトに変換される。
先頭要素の preskip と末尾要素の postskip はブロック内では無視されるが、ブロック自体の preskip や
postskip に 'c' を指定すると先頭要素の preskip や末尾要素の postskip がブロック自体の preskip や
postskip になる。

preskip や postskip が数値の場合は、その通りの間隔が取られるが、ハッシュ参照の場合は、preskip な
ら前の、postskip なら後のオブジェクトのタイプ名に応じて間隔を選択することになる。表示可能オ
ブジェクトのタイプ名は、typename メソッドで設定できるほか、段落、ブロック、図形の各スタイル
で与えることができる。タイプ名が設定されていないオブジェクトのタイプ名は 'default' と見なされる。タイプ名には任意の文字列が指定できるが、英小文字で始まる名前は PDFJ 自体が使用するので、ユーザーが設定するタイプ名は英大文字で始まるものにすべきである。
例えば次のようにした場合、$para1 = Paragraph($text1, PStyle(size => 200, align => 'w',
linefeed => '150%'));$para2 = Paragraph($text2, PStyle(size => 200, align => 'w',
linefeed => '150%', typename => 'Para2',
preskip => {default => '25%', Para2 => '75%'},
postskip => {default => '25%', Para2 => '75%'}));
配列ブロックの中で $para1 同士の間隔はフォントサイズの 50%（$para1 では preskip と postskip が指20

定されていないので、linefeed=150% から計算されてそれぞれ 25% となる）になる。$para1 と $para2の間隔は、$para2 側は 'default' の値 25% が使われて、やはり 50% になる。$para2 同士の間隔は、
preskipや postskip に 'Para2' の値 75% が使われて、100% になる。
以上はあくまで配列ブロックについてのもので、行列ブロックでは行列ブロックのスタイルで指定した行間隔、列間隔が一律に取られる。preskip と postskip に 'c' を指定することもできない。

■ブロックオブジェクトの分割
段落オブジェクトと同様に、配列ブロックオブジェクトと行列ブロックオブジェクトも break メソッド
によって分割ができる。（ツリーブロックオブジェクトは分割できない。）例えば方向が 'V' の配列ブロックオブジェクト $block を高さが 200 ポイント以下になるように分割したければ、@blocks = $block‑>break(200);とすればよい。最初のブロックだけ高さを 100 以下にしたければ、つぎのようにする。
@blocks = $block‑>break(100, 200);

break の引数に指定したサイズのリストは順に分割したブロックのサイズとして使われ、なくなると最後のサイズが繰り返し使われる。
配列ブロックの分割の際、ブロック内のオブジェクトとして、方向の同じブロックや、行方向の異なる段落（'V' なら 'H'、'H' や 'R' なら 'V'）があると、そのオブジェクトも分割することでできるだけ指定のサイズに合うように分割される。
行列ブロックの分割は、行単位で行われる。break で指定したサイズは、HV と RV では縦方向のサイ
ズを、VH と VR では横方向のサイズを意味することになる。rowspan によって結合されている部分があると、その途中では分割されない。
指定したサイズで分割ができなかった場合、break メソッドは未定義値を返す。複数のサイズを指定した場合に、最後以外のサイズが小さすぎた場合は、それに対応するものとして空のブロックが返される。
ブロックスタイルで nobreak が真になっていると、そのブロックは分割されない。
配列ブロックの中に NewBlock サブルーチンで作成される改ブロックオブジェクトがあると、ブロックの分割の際にそこで強制的に分割される。
配列ブロックの分割の際、その要素となるブロックや段落や図形のスタイルで postnobreak が真に設定されていると、その後ろで分割されることはない。これによって、見出し段落と本文段落が別ページに分かれることを防ぐことができる。行列ブロックの場合は、行の末尾要素の postnobreak が真であればその行の後では分割されない。
配列ブロックの分割の際、その要素となるブロックや段落や図形のスタイルで float が設定されていると、その要素は分割されたブロック内で指定の位置に移動される。float 機能は行列ブロックでは働かない。

float 指定の意味は次のとおり。
bN: 分割されたブロックの先頭（N は 1 〜 9 または省略）
eN: 分割されたブロックの末尾（N は 1 〜 9 または省略）
h: 分割せずに可能ならその位置に、無理なら次のブロックの先頭に

21

b と e の後ろに 1 〜 9 の番号を付けて数字別にグループ化できる。数字の大きなものほど先頭または末尾寄りに配置される。b0 や e0 とはせずに b や e とすることに注意。
配列ブロックのブロックスタイルで nofirstfloat を真に指定すると、
break の際に全体の先頭には float 要
素を置かない。
配列ブロックのブロックスタイルの bfloatsep で表示可能オブジェクトを指定すると、float が b で先頭に移動した要素群の後に挿入される。efloatsep で指定したオブジェクトは float が e で末尾に移動した要素群の前に挿入される。これにより、float を e としてページ末尾に移動した脚注段落と本文段落の間に区切り線を入れるようなことができる。float に bN や eN（N は 1 〜 9）を使う場合は、bfloatsep や
efloatsep に配列参照の形でオブジェクトのリストを与えると、その N 番目のものが使われる（b や e に
は 0 番目のものが使われる）。なお、bfloatsep や efloatsep に使うオブジェクトはそれ専用に使用し、分割されるブロックの内容として使ってはならない。また、bfloatsep に使うオブジェクトと efloatsep に使うオブジェクトも異なるオブジェクトでなければならない。
ブロックスタイルで repeatheader が指定されていると、その値の数だけの先頭要素が、分割された各ブ
ロックの先頭で繰り返される。（ただし先頭要素の途中や後ろで分割された場合は除く。）これによって表の先頭の項目名の行を繰り返すことができる。先頭要素自体が分割されるとおかしな結果が得られるので、先頭要素が分割可能な段落やブロックの場合は nobreak を指定しておくこと（方向の違うブロックの場合は不要）。また先頭要素と次の要素が分割された場合も不適切な結果となるので、先頭要
素には postnobreak の指定をしておくこと。repeatheader 機能は配列ブロックでも行列ブロックでも有効。

■画像オブジェクトの作成
画像オブジェクトは JPEG 画像または PNG 画像についてのみ作成でき、文書オブジェクトから
new_image メソッドで作成する。
$imgobj = $docobj‑>new̲image($src, $pxwidth, $pxheight,$width, $height, $padding, $colorspace, $type);
ここで、$src は JPEG 画像の場合は URL またはファイル名（拡張子は .jpg または .jpeg であること）、PNG 画像の場合はファイル名（拡張子は .png であること）、$pxwidth と $pxheight は画像のピクセル
サイズ、$width と $height は表示サイズ（ポイント）、$padding は周囲の余白（ポイント）、$colorspace
はカラースペース（rgb,gray,cmyk のいずれかで省略すると rgb）。$type は jpg または png を指定する
が、拡張子から判別できる場合は省略できる。$padding と $colorspace は省略できる。PNG 画像の場合
は画像のピクセルサイズとカラースペースは画像ファイル自体の内容に従って自動的に設定されるので、$pxwidth、$pxheight、$colorspace で指定した値は無視される。

$src にスカラ参照による画像データを与えることもできる。そのときは必ず $type に jpg または png を指定する。$src に URL やファイル名を指定するときはその拡張子から判断されるので $type の指定は不要。
現在の仕様では、URL 指定した場合は生成される PDF には URL 情報だけが埋め込まれ、表示する際に AcrobatReader がその URL にアクセスして画像内容を読みとる。したがって表示に時間がかかった
り、アクセスできないと画像が表示できないといったことが起こりうる。
ファイル名指定やスカラ参照で画像データを与えた画像の場合は、生成された PDF に画像内容そのものがデータとして埋め込まれるので、元の画像ファイルを PDF ファイルと一緒に配布したりする必要
はない。

22

画像オブジェクトには他の表示可能なオブジェクトと違ってスタイルの指定はない。ブロックに含める際に postnobreak を指定したいというようなときは、図形オブジェクトの中に画像オブジェクトを含めて、その図形オブジェクトにスタイルを指定する。

■図形オブジェクトの作成
図形オブジェクトは Shape サブルーチンで作成する。
$shapeobj = Shape($shapestyle);
ここで $shapestyle は図形スタイルオブジェクト。$shapestyle は省略できる。これだけでは何も中味のない図形オブジェクトが作られるだけである。その後、次のメソッドを使って図形を加えていく。
直線（line メソッド）$shapeobj‑>line($x, $y, $w, $h, $style);($x,$y) から ($x+$w,$y+$h) へ直線が引かれる。$style は図形スタイルオブジェクトで、省略可能。
矩形（box メソッド）$shapeobj‑>box($x, $y, $w, $h, $spec, $style);($x,$y) と ($x+$w,$y+$h) を対角とする矩形が描かれる。$style は図形スタイルオブジェクトで、省略可能。$spec は次の描画指定。
f … 塗り潰しのみ
s … 枠線のみ
sf … 塗り潰し＋枠線
n … 描画しない※上記の s の代わりに、l（左辺）、r（右辺）、t（上辺）、b（下辺）、の組み合わせも可※次はオプション
rX … （X は数値）角を半径 X で丸くする

box() に対する $style では、通常の図形スタイルに加えて次のスタイルが使える。（ハイパーリン
クを参照）
link => リンク先（文書内のリンク先名または、URI: を付けた URI 名）
円（circle メソッド）$shapeobj‑>circle($x, $y, $r, $spec, $arcarea, $style);($x,$y) が中心、$r が半径の円が描かれる。$arcarea は四半円指定（1: 右上、2: 左上、3: 左下、4:右下）で省略すれば全円。$style は図形スタイルオブジェクトで、省略可能。$spec は次の描画指定。
f … 塗り潰しのみ23

s … 枠線のみ
sf … 塗り潰し＋枠線
楕円（ellipse メソッド）$shapeobj‑>ellipse($x, $y, $xr, $yr, $spec, $arcarea, $style);$xr が横半径、$yr が縦半径であることを除けば円と同じ。
多角形（polygon メソッド）$shapeobj‑>polygon([@coords], $spec, $style);@coords は頂点の座標の X と Y の組を順に並べたリスト。$style は図形スタイルオブジェクトで、省略可能。$spec は次の描画指定。
f … 塗り潰しのみ
s … 枠線のみ
sf … 塗り潰し＋枠線
円弧（arc メソッド）$shapeobj‑>arc($x, $y, $r, $start, $end, $spec, $style);($x,$y) が中心、$r が半径、開始角 $start、終了角 $end の円弧または円弧と半径で囲まれた領域が描かれる。開始角、終了角はラジアン。$style は図形スタイルオブジェクトで、省略可能。$spec
は次の描画指定。$spec が a の時は円弧のみ、その他の場合は円弧と半径で囲まれた領域が描画される。
a … 円弧のみ
f … 塗り潰しのみ
s … 枠線のみ
sf … 塗り潰し＋枠線
オブジェクト（obj メソッド）$shapeobj‑>obj($obj, @showargs);
図形中に表示可能なオブジェクト $obj を、$obj->show($page, @showargs) によって配置する。
以上のメソッドはみなオブジェクト自身を返すので、$shapeobj = Shape‑>line(…)‑>box(…)‑>obj(…);のように記述することも可能。
以上のメソッドで描画する場合は、結果としてその図形オブジェクトが上下左右にどれだけの範囲を占めるかという全体としての図形の大きさが内部的に管理され、幅と高さを持った表示可能オブジェ
クトとして扱うことができる。

24

これら以外のプリミティブな描画メソッドもある（PDFJ::Shape のメソッド一覧を参照）が、それらのメソッドを使った場合は図形オブジェクトの大きさの管理はおこなわれないことに注意が必要。
図形スタイルオブジェクトは、SStyle サブルーチンで作成する。
$shapestyle = SStyle(%args);
引数にはハッシュリストの形で次のものを与える。
fillcolor => 塗り潰し色（色オブジェクト）
strokecolor => 線色（色オブジェクト）
linewidth => 線幅（ポイント）
linedash => [$dash, $gap, $phase] または "$dash, $gap, $phase"preskip => 前の間隔（ポイント）
postskip => 後の間隔（ポイント）
postnobreak => 真だとブロックの break でその後ろで分割されない
float => ブロックの break で位置を自動移動（「ブロックオブジェクトの分割」参照）
typename => タイプ名
blockalign => 配列ブロック内での配置（b: 左または上、m: 中央、e: 右または下、数値 : イン
デント量）

linedash の指定で、$dash は破線長、$gap は隙間長、$phase は開始位置。$phase は省略可能。
preskip、postskip、postnobreak、float は、ブロックの中に図形オブジェクトを置くときに意味を持つ。
box() に対する $style では、上記の図形スタイルに加えて次のスタイルが使える。
link => リンク先（文書内のリンク先名または、URI: を付けた URI 名）■追加の図形オブジェクトメソッド
use PDFJ::Shape; すると、次の追加の図形描画メソッドが PDFJ::Shape に追加される。これらのメソッドはいずれもオブジェクト自身を返す。また、描画範囲の管理がおこなわれる。
矢印（arrow メソッド）$shapeobj‑>arrow($x, $y, $w, $h, $headsize, $headangle, $style);$headsize と $headangle 以外の引数は line と同じ。直線の終端に、長さが $headsize、先端角度の半分が $headangle（ラジアン）の三角形の鏃が付けられる。
波括弧（brace メソッド）$shapeobj‑>brace($x, $y, $w, $h, $style);
引数の意味は矩形と同じ。その矩形の中に納まる波括弧を描画する。$w が正なら開き括弧、負なら閉じ括弧。文字の {} では間に合わない大きな波括弧が必要な場合に使用する。

25

角括弧（bracket メソッド）$shapeobj‑>bracket($x, $y, $w, $h, $style);
引数の意味は矩形と同じ。その矩形の中に納まる角括弧を描画する。$w が正なら開き括弧、負なら閉じ括弧。文字の [] では間に合わない大きな角括弧が必要な場合に使用する。
丸括弧（paren メソッド）$shapeobj‑>paren($x, $y, $w, $h, $style);
引数の意味は矩形と同じ。その矩形の中に納まる丸括弧を描画する。$w が正なら開き括弧、負なら閉じ括弧。文字の () では間に合わない大きな角括弧が必要な場合に使用する。

■色オブジェクトの作成
色オブジェクトは、Color サブルーチンで作成する。
$colorobj = Color($r, $g, $b);
$colorobj = Color('#RRGGBB');$colorobj = Color($g);
三引数の場合、$r は赤、$g は緑、$b は青のそれぞれの割合（0 から 1 までの範囲の数値）。
一引数で、# で始まる 16 進 6 桁の文字列の場合、二桁ずつ赤、緑、青の割合（00 から ff まで）とみなされる。
一引数で、数値の場合は、グレーの割合（0 から 1 までの範囲の数値）。0 が黒、1 が白。

■表示可能オブジェクトのページへの配置
表示可能なオブジェクトをページ上に配置するには、show メソッドを用いる。
$obj‑>show($page, $x, $y, $align, $transtype, @transargs);
ここで、$page はページオブジェクト、$x、$y は表示位置、$align は配置、$transtype は変形の種類、@transargs は変形のパラメータである。$align 以降の引数は省略できる。
表示位置の座標は、ページの左下隅が原点 (0,0) となり、X 座標は右へ、Y 座標は上へ向かって増加する。単位はポイントである。
配置 $align は、($x,$y) で指定した表示位置に対して、オブジェクトをどのように配置するかを指定するもので、次の横位置と縦位置を組み合わせて指定する。
横位置
l … オブジェクトの左端を $x にあわせる
c … オブジェクトの中央を $x にあわせる
r … オブジェクトの右端を $x にあわせる
縦位置
t … オブジェクトの上端を $y にあわせる

26

m … オブジェクトの中央を $y にあわせる
b … オブジェクトの下端を $y にあわせる
配置 $align の指定を省略すると、そのオブジェクト固有の原点を ($x,$y) にあわせる。各オブジェクトの固有の原点は次のとおり。
横書きテキスト … 先頭文字の左端の、下端から高さの 0.125 倍だけ上の位置
縦書きテキスト … 先頭文字の上端の、左右中央の位置
段落 … 先頭行テキストの固有の原点ブロック … 左上隅
画像 … 左下隅
図形 … 描画命令の原点がそのまま原点となる

show メソッドに、$transtype 以降の引数を与えると、表示の際に変形することができる。変形の種類$transtype とそのパラメータ @transargs には次のいずれかを指定する。
'magnify', $mx, $my … 横方向に $mx 倍、縦方向に $my 倍、拡大・縮小する'rotate', $rad … 反時計回りに $rad ラジアンだけ回転する'distort', $xtan, $ytan … (1,0) を (1,$xtan) へ、(0,1) を ($ytan,1) へ移すように、横軸、縦軸をそれぞれ傾ける
各変形は、show メソッドの $x と $y の引数で決まる位置を原点としておこなわれる。
なお、表示可能なオブジェクトには width と height というメソッドがあり、幅と高さを知ることができる。

■ページのレイヤ
show メソッドで表示可能オブジェクトをページに配置していくと、後から配置したものが手前に配置
されて、前に配置されたものに重なっていく。
この重なりの順序を制御したい場合のために、ページオブジェクトに layer メソッドが用意されている。
$pageobj‑>layer($layernum);$layernum はレイヤ番号で、0 以上の整数値。layer メソッドを実行すると、それ以降の描画は指定した
レイヤ番号のレイヤに対しておこなわれる。
ページの内容が表示されるときには、レイヤ番号の順番に配置される。

■ミニページオブジェクトの作成
ミニページオブジェクトは、文書オブジェクトから、new_minipage メソッドで作成する。
$minipageobj = $doc‑>new̲minipage($width, $height, $padding);
ここで、$width は領域の幅、$height は領域の高さ、$padding は領域の外側に取る余白の大きさで、いずれもポイント数で指定する。

27

ミニページオブジェクトに対して表示可能なオブジェクトを配置するには、ページに対する時と同様に show メソッドを用いる。
$obj‑>show($minipageobj, $x, $y, $align, $transtype, @transargs);
レイヤ指定もページと同様に可能である。
$minipageobj‑>layer($layernum);
ミニページオブジェクトをページに配置することで、ミニページ内に配置したオブジェクトが実際に表示されることになる。ミニページの領域の外にはみ出した部分は表示されない。
$minipageobj‑>show($pageobj, $x, $y, $align, $transtype, @transargs);■スタイルのコピー
直接入れ子になったテキストオブジェクトのテキストスタイルに関しては、親子関係による内容の継承がおこなわれるので、部分スタイルの指定ができる。それ以外の場合にスタイルの自動的な継承がおこなわれることはない。
既存のスタイルを元にして属性を変更したり追加したりしたスタイルを作成したい場合、clone メソッドを用いる。このメソッドはテキストスタイル、段落スタイル、ブロックスタイル、図形スタイルのす
べてについて使える。
$newstyle = $originalstyle‑>clone(%newargs);%newargs を指定しなければ単にコピーが作られる。%newargs で指定した属性は元の属性を上書きする（元の属性がなければ追加される）。
%newargs の style キーの値として既存のスタイルを与えることもできる。style とその他の属性の両方を指定した場合はまず style の内容が上書きされてからその他の属性が上書きされる。

■スタイル指定のさまざまな方法
各種のスタイルオブジェクトを作成したり、clone() でコピーしたりするときに、その引数はハッシュリストで与えるが、ハッシュ参照や css ライクな文字列で与えることもできる。次は同等である。
PStyle(size => 200, align => 'w', linefeed => '150%')
PStyle({size => 200, align => 'w', linefeed => '150%'})PStyle('size:200; align:w; linefeed:150%')
文字列で与えるときは、「属性名 : 属性値」を「;」で区切って並べて指定する。ただし、ハッシュ参照
や文字列で指定するときは引数はその一つだけでなければならない。
属性値としてオブジェクトを与えるときは文字列による方法は取れないが、属性値もスタイルオブジェクトである時には、次のように {} で指定が可能である。
TStyle('withline:1; withlinestyle:{linewidth:0.5; linedash:2,2; strokecolor:#ff0000}')

28

引数にハッシュリストを与えるときにも、属性値としてスタイルオブジェクトを取る属性（属性名がstyle で終わる）や、Color オブジェクトを取る属性（属性名が color で終わる）については、属性値をオブジェクトでなくハッシュ参照や文字列で与えることができる。
TStyle(withline => 1, withlinestyle =>{linewidth => 0.5, linedash => '2,2', strokecolor => '#ff0000'})■ PDF 文書の出力作成した PDF 文書をファイルに出力するには、文書オブジェクトの print メソッドを用いる。
$docobj‑>print($filename);
ファイル名 $filename の拡張子は、通常は .pdf とする。
ファイル名として '-' を指定すると標準出力に出力される。
また、print() の引数にファイル名でなく書き込み用にオープン済のファイルハンドルを与えることができる。ファイルハンドルはグロブリファレンス（\*STDOUT のような）か、ファイルハンドルオブ
ジェクト（IO::Handle から派生したクラスのオブジェクト）で指定する。
スカラ変数に PDF 文書の内容を格納したい場合は、
Perl5.8 以降であればスカラ入出力機能を使って次のようにするとよい。Perl5.8 未満の場合は IO::Scalar モジュールを使えばよい。
my $pdf;
open my $fh, '>', ¥$pdf;$doc‑>print($fh);
close $fh;

■文書情報の追加
PDF には文書のタイトル、作成者、キーワードなどの文書情報を入れることができる。これをおこな
うには、次のように add_info() メソッドを用いる。
$docobj‑>add̲info(Title => ' タイトル ', Author => ' 作成者 ');指定できるキーは次のものがある。
Title => 文書のタイトル
Author => 文書の作成者名
Subject => 文書の主題
Keywords => 文書に関連するキーワード
Creator => 文書を作成したアプリケーション名
なお、Producer キーには「PDFJ バージョン」が、CreationDate キーには作成日時（標準時）が自動的にセットされる。

29

■アウトラインPDF にはアウトラインという目次機能がある（しおりとも言う）。アウトラインの項目をマウスでクリックするとその項目で指定された位置が表示される。アウトラインは階層的に構成され、章や節などの見出しをアウトラインに対応させることが多い。
PDFJ で文書にアウトラインを付加するには、テキストオブジェクトを作成する際に、対象の文字列やオブジェクトの前にアウトライン指示オブジェクトを置く。アウトライン指示オブジェクトはOutline() サブルーチンで作成する。例えば、「はじめに」という見出しをアウトラインのトップレベルに加えたい場合、つぎのようにする。
Text(Outline(' はじめに '), ' はじめに ', $midasi̲style)
このテキストオブジェクトがページに配置されると、文書のアウトラインに「はじめに」という項目が作られてこの「はじめに」というテキストの左上の位置が指定される。この例ではアウトライン項目とテキストの文字列を同じにしているが、異なる文字列を指定してもよい。
１レベル下の「本書の内容」という見出しをアウトラインに加えたい場合、つぎのようにする。
Text(Outline(' 本書の内容 ', 1), ' 本書の内容 ', $midasi̲style)

Outline() の２番目の引数には、アウトラインの階層レベルを指定する。レベル 0 は上記の「はじめに」の例のように省略できる。
アウトラインは、Outline() を含んだテキストオブジェクトがページに配置されるときに順に追加されて作られていく。いまのところ、既存のアウトラインの途中に挿入する手段は用意されていない。レベル 0 の項目の次にレベル 2 の項目を作るなど、階層のギャップが生じると、ギャップを埋めるための空文字列によるアウトライン項目が作られる。
文書オブジェクトの outlinetree() メソッドで、アウトラインツリーを得ることができる。
$tree = $docobj‑>outlinetree()
アウトラインツリーは、[ タイトル , ページオブジェクト , X 位置 , Y 位置 , 子ツリー ] を要素とした配列参照である。ページオブジェクトから pagenum() メソッドでページ番号がわかるので、タイトルとページ番号の対応を知ることができる。

■ハイパーリンクPDF にはハイパーリンク機能があり、ページ上のリンク元に指定された領域をクリックすると、そのリンク先が表示される。リンク先としては、同じ文書内の場所、別の文書の場所、URI（http: などで始まるインターネット上の場所と考えればよい）があるが、今のところ PDFJ では同じ文書内の場所とURI に対応している。
同じ文書内でのリンクを作るには、リンク先のテキストに Dest() サブルーチンで名前を指定して作成したリンク先オブジェクト（PDFJ::Dest オブジェクト）を配置する。例えば
Text(Dest('dest'),' リンク先 ',TStyle(…))とすると、' リンク先 ' というテキストの前に 'dest' という名前のリンク先が作られる。Dest() で作られる PDFJ::Dest オブジェクト自体は、表示には現れない。リンク先の名前は任意の文字列が使えるが、30

「URI:」で始まるものは URI へのリンクのために使われる。
※同じ名前のリンク先を作ると後の方が実際のリンク先となる。名前の重複がないように管理するのはユーザーの責任である。
リンク元では矩形の図形オブジェクトの図形スタイルの link でリンク先名を指定するか、テキストス
タイルの withboxstyle で同様に link 指定をする。例えば
Shape‑>box(0,0,100,50,'s',SStyle(link => 'dest'))とすると、横 100 ポイント、縦 50 ポイントの矩形が作られて、その内部をクリックすると名前が 'dest'のリンク先に飛ぶ。テキストの場合は、Text(' ここをクリック ', TStyle(withbox => 'n',
withboxstyle => SStyle(link => 'dest')))のようにすればよい。このように withbox => 'n' とすると矩形は描画されない。リンクであることを示すために色を変えるとか下線を付けるとかいった工夫はユーザーに任されている。（withbox => 'b'
で下線を付けることができる。）
リンク先として Dest() で登録した名前を使わず、ページ番号と X 位置、Y 位置の組み合わせで直接指定したい場合は、「PAGE: ページ番号 ,X 位置 ,Y 位置」とする（ページ番号は 1 から数える）。例えば、
Text('10 ページ ', TStyle(withbox => 'n',
withboxstyle => SStyle(link => 'PAGE:10,72,770')))とすれば、10 ページ目の X 位置 72、Y 位置 770 へのリンクとなる。
また、ページオブジェクトと X 位置、Y 位置の組み合わせで指定したい場合は、link 属性に [ ページオ
ブジェクト ,X 位置 ,Y 位置 ] という配列参照を指定する。

URI リンクの場合は、Dest() によるリンク先の設定は必要なく、リンク先の名前として、「URI:」に続けて URI を書けばよい。例えば
Text(' 米アドビ ', TStyle(withbox => 'n',
withboxstyle => SStyle(link => 'URI:http://www.adobe.com/')))のようにする。

URI はすでに URI エンコードされていない限り URI エンコードされる。
Dest オブジェクトがページに配置されると、その名前とページオブジェクトとの対応が文書オブジェ
クトに登録される。文書オブジェクトの destpage() メソッドでその情報を取り出すことができる。
$pages = $docobj‑>destpage($name)とすれば、名前が $name の Dest オブジェクトが配置された [ ページオブジェクト , X 位置 , Y 位置 ] のリストが配列参照として得られる。同じ名前の Dest が複数あれば複数の要素を持った配列参照が得られることになる。ページオブジェクトから pagenum() メソッドでページ番号を得ることができるので、索引を作るのに利用できる。
文書オブジェクトの destnames メソッドですべての Dest の名前のリストを得ることができる。

31

@names = $docobj‑>destnames;
リンク先に名前を指定した場合にその対象のリンク先が存在しないと、エラーとなってスクリプトが停止する。文書オブジェクトの missdest オプションに 'neglect' を指定するとリンク先の名前が存在しないリンクは無視される。'carp' を指定すると警告が表示されるがスクリプトは停止しない。例えば次のようにする。
$docobj‑>setoption(missdest => 'neglect');■暗号化
PDF は暗号化できる。PDF のバージョンによって使用できる暗号化方式の範囲が違うが、今のところ
PDFJ ではもっとも基本的な 40 ビット RC4 暗号化をサポートしている。
暗号化するには、encrypt() メソッドを用いて、オーナーパスワード、ユーザーパスワード、ユーザーへの使用許可フラグ、を指定する。
$docobj‑>encrypt($ownerpass, $userpass, $allow);
オーナーパスワードとユーザーパスワードに同じものを指定すると、オーナー権限で開くことはできなくなる。
ユーザーへの使用許可フラグは、次の記号を並べた文字列として指定する。
P … 文書の印刷
M … 文書内容の変更
C … 文書からのテキストと画像のコピー
N … テキスト注釈および対話フォームフィールドの追加、変更※テキスト注釈および対話フォーム機能は今のところ PDFJ では未サポート■対話フォーム
PDF にはユーザーが入力した内容を保存したりサーバーへ送信したりできる対話フォーム機能がある。PDFJ で対話フォームを文書中に作成するには、まず次のようにして PDFJ::Form モジュールを読み込んでおく。これによって以下で説明する機能が使えるようになる。
use PDFJ::Form;
そして文書ドキュメントの new_field メソッドでフォームフィールドオブジェクトを作成する。
new_field メソッドの引数はハッシュまたは一つのハッシュ参照で与える。
$fieldobj = $docobj‑>new̲field(%spec);$fieldobj = $docobj‑>new̲field(¥%spec);
引数のハッシュのキーはフォームフィールドのタイプによって異なるが、次のものはどのタイプでも共通（※は必須）。

32

type => フィールドタイプ※
name => フィールド名※
width => 幅（ポイント）※height => 高さ（ポイント）※noprint => 真だと印刷時に表示されない
readonly => 真だと入力できない
required => 真だと必須入力
noexport => 真だとデータとして書き出し / 送信されない
フィールドタイプは、Text、Button、CheckBox、RadioButton、ComboBox のいずれか。

new_field メソッドで得られたフィールドオブジェクトは、width と height で指定した大きさを持った表示可能オブジェクトである。
以下、フィールドタイプ毎に指定できる引数を説明する。※は必須。
テキストフィールド（Text）
一行または複数行の文字列を入力できるフィールド。
type => 'Text' ※font => フォントオブジェクト※
fontsize => フォントサイズ※
multiline => 真だと複数行
password => 真だと入力文字がマスクされる
maxlen => 最大入力可能文字数（省略すると無制限）
fileselect => 真だと入力内容をファイル名としてそのファイル内容を送信（PDF1.4 以降）
donotspellcheck => 真だとスペルチェックしない（PDF1.4 以降）
donotscroll => 真だとスクロールせず入力領域の範囲内で入力（PDF1.4 以降）
comb => 一行に maxlen 文字を均等に配置（一行の場合のみ）（PDF1.5 以降）

fileselect を真に指定した時は Submit ボタンの format に POST を指定しなければならない（下記参照）。
ボタンフィールド（Button）
クリックすることでデータ送信など各種の動作をするボタン。
type => 'Button' ※buttontype => ボタンタイプ※
font => フォントオブジェクト※
fontsize => フォントサイズ※
caption => キャプション文字列※
ボタンタイプは、Submit（データ送信）、Reset（入力をリセット）、Import（ファイルからデータ読み込み）、JavaScript（JavaScript のスクリプトを実行）のいずれか。ボタンタイプによってさらに次の引数を指定する。
※ Submit の場合
url => データの送信先サーバーの URL ※33

format => データフォーマット（FDF、POST、GET のいずれか、省略すると FDF）
fields => 対象フィールド名の配列参照（省略すると全フィールド）exclude => 真だと fields で指定したフィールド以外を送信
includenovaluefields => 真だと空項目も含める
submitcoordinates => 真だとボタンのどの位置をクリックしたかを送信※ Reset の場合
fields => 対象フィールド名の配列参照（省略すると全フィールド）exclude => 真だと fields で指定したフィールド以外をリセット※ Import の場合
file => 対象ファイル名※※ JavaScript の場合
javascript => スクリプト文字列※
チェックボックスフィールド（CheckBox）
クリックするとチェックが入った状態と外れた状態でトグルする正方形のフィールド。
type => 'CheckBox' ※size => ボックスサイズ（ポイント）※
on => 真だとデフォルトでチェックが入る

size で指定した大きさのボックスが width と height で指定した領域の中心に置かれる。
通常はチェックボックスフィールドの隣にその意味を示すテキストを表示するが、それはチェッ
クボックスフィールドには含まれず、ユーザーに任されている。
ラジオボタンフィールド（RadioButton）
クリックするとグループ化された一連のフィールドのどれか一つだけがチェックが入った状態になる円形のフィールド。
type => 'RadioButton' ※size => ボタンサイズ（ポイント）※values => 各ラジオボタンの値となる文字列の配列参照※

size で指定した半径の円が width と height で指定した領域の中心に置かれる。
ラジオボタンフィールドの場合、new_field メソッドは、各々が values で指定した値を持つラジオ
ボタンフィールドのリストを返す。
@radios = $docobj‑>new̲field(type => 'RadioButton', values => [1,2,3],...);
通常はラジオボタンフィールドの隣にその意味を示すテキストを表示するが、それはラジオボタンフィールドには含まれず、ユーザーに任されている。

34

コンボボックスフィールド（ComboBox）
文字列のリストから選択できるフィールド。
type => 'ComboBox' ※values => 選択肢となる文字列の配列参照※
font => フォントオブジェクト※
fontsize => フォントサイズ※
list => 真だとリストボックス（デフォルトはコンボボックス）
edit => 真だと手入力も可能（コンボボックスの場合）
default => デフォルト選択肢の文字列（省略すると values の先頭要素）
multiselect => 真だと複数選択可（PDF1.4 以降）
donotspellcheck => 真だとスペルチェックしない（PDF1.4 以降）
commitonselchange => 真だと選択肢をクリックした時点で変更とみなす（PDF1.5 以降）
各フィールドオブジェクトは、背景が白で、周囲に灰色の濃淡で立体的に見えるような枠が表示されるが、次の引数でこれらを調整することができる。
framewidth => 枠の幅（ポイント、デフォルトは 1）lightcolor => 枠の明色部分の色（デフォルトは 0.9）
mediumcolor => 枠の中間色部分の色（デフォルトは 0.75）
darkcolor => 枠の暗色部分の色（デフォルトは 0.6）
fillcolor => 背景色（デフォルトはボタンでは 0.8、その他では 1）
色は灰色の濃淡（0 が黒、1 が白）の他、'#ff00ff' のように RGB でも指定可能。

■ PDFJ::Doc クラスのメソッド
PDFJ::Doc‑>new($version, $pagewidth, $pageheight)
PDFJ::Doc‑>new({version => $version, pagewidth => $pagewidth, pageheight =>$pageheight})
add̲info($key => $value, ...)
add̲info({$key => $value, ...})
encrypt($ownerpass, $userpass, $allow)
encrypt({ownerpass => $ownerpass, userpass => $userpass, allow => $allow})
filter($filter)
filter({filter => $filter})print($file)
print({file => $file})new̲page($pagewidth, $pageheight, $dur, $trans)new̲page({pagewidth => $pagewidth, pageheight => $pageheight, dur => $dur, trans =>$trans})insert̲page($number, $pagewidth, $pageheight, $dur, $trans)
insert̲page({number => $number, pagewidth => $pagewidth, pageheight => $pageheight,
dur => $dur, trans => $trans})
get̲page($pagenum)35

get̲page({number => $pagenum})
lastpagenum
outlinetree
destnames
destpage($name)destpage({name => $name})new̲font($basefont, $encoding, $abasefont, $aencoding, $asize)new̲font({basefont => $basefont, encoding => $encoding, abasefont => $abasefont,aencoding => $aencoding, asize => $asize})
italic($font1, $font2, ...)
italic({base => $font1, decorated => $font2})
bold($font1, $font2, ...)
bold({base => $font1, decorated => $font2})
new̲image($src, $pxwidth, $pxheight, $width, $height, $padding, $colorspace)new̲image({src => $src, pxwidth => $pxwidth, pxheight => $pxheight, width => $width,height => $height, padding => $padding, colorspace => $colorspace})new̲minipage($width, $height, $padding)new̲minipage({width => $width, height => $height, padding => $padding})
new̲field(%args)
new̲field(¥%args)※ new_field メソッドは use PDFJ::Form; すると使えるようになる。

■ PDFJ::Page クラスのメソッド
PDFJ::Page‑>new($docobj, $pagewidth, $pageheight, $dur, $trans)
pagenum
layer($layernum)
layer({layer => $layernum})setattr($name, $value)
setattr({name => $name, value => $value})getattr($name)getattr({name => $name})■ PDFJ::AFont クラスのメソッド
PDFJ::AFont‑>new̲std($docobj, $basefont, $encoding)
PDFJ::AFont‑>new̲ttf($docobj, $ttffile, $encoding)■ PDFJ::CIDFont クラスのメソッド
PDFJ::CIDFont‑>new̲std($docobj, $basefont, $encoding, $afontobj, $asize)
PDFJ::CIDFont‑>new̲ttf($docobj, $ttffile, $encoding, $afontobj, $asize)36

■ PDFJ::Showable クラスのメソッド
次のメソッドは、PDFJ::Text、PDFJ::Paragraph、PDFJ::Block、PDFJ::Image、PDFJ::Shape の各クラスで共通して使える。
show($page, $x, $y, $align, $transtype, @transargs)
show({page => $page, x => $x, y => $y, align => $align, transtype => $transtype,transargs => [@transargs]})
width
height■ PDFJ::Text クラスのメソッド
PDFJ::Text‑>new($text, $style)
PDFJ::Text‑>new(@texts, $style)
PDFJ::Text‑>new([@texts], $style)
PDFJ::Text‑>new({texts => $text, style => $style})
PDFJ::Text‑>new({texts => [@text], style => $style})■ PDFJ::Paragraph クラスのメソッド
PDFJ::Paragraph‑>new($text, $style)
PDFJ::Paragraph‑>new({text => $text, style => $style})linesnum
break($size)
break(@sizes)
break({sizes => $size})break({sizes => [@sizes]})■ PDFJ::Block クラスのメソッド
PDFJ::Block‑>new($direction, $object, $style)
PDFJ::Block‑>new($direction, @objects, $style)
PDFJ::Block‑>new($direction, [@objects], $style)
PDFJ::Block‑>new({direction => $direction, objects => $object, style => $style})
PDFJ::Block‑>new({direction => $direction, objects => [@objects], style => $style})
adjustwidth($size)
adjustwidth({size => $size})adjustheight($size)
adjustheight({size => $size})break($size)
break(@sizes)
break({sizes => $size})37

break({sizes => [@sizes]})■ PDFJ::Block::Matrix クラスのメソッド
widthsheights■ PDFJ::Image クラスのメソッド
PDFJ::Image‑>new($docobj, $src, $pxwidth, $pxheight, $width, $height, $padding)setsize($width, $height)
setpadding($padding)■ PDFJ::Shape クラスのメソッド
PDFJ::Shape‑>new($style)
PDFJ::Shape‑>new({style => $style})
マクロ命令（描画範囲の管理がおこなわれる）
line($x, $y, $w, $h, $style)line({x => $x, y => $y, w => $w, h => $h, style => $style})box($x, $y, $w, $h, $spec, $style)box({x => $x, y => $y, w => $w, h => $h, spec => $spec, style => $style})
circle($x, $y, $r, $spec, $arcarea, $style)circle({x => $x, y => $y, r => $r, spec => $spec, arcarea => $arcarea, style =>$style})ellipse($x, $y, $xr, $yr, $spec, $arcarea, $style)ellipse({x => $x, y => $y, xr => $xr, yr => $yr, spec => $spec, arcarea => $arcarea,
style => $style})
polygon([@coords], $spec, $style)polygon({coords => [@coords], spec => $spec, style => $style})
arc($x, $y, $r, $start, $end, $spec, $style)arc({x => $x, y => $y, r => $r, start => $start, end => $end, spec => $spec, style =>$style})オブジェクト配置命令（描画範囲の管理がおこなわれる）
obj($obj, @showargs)
obj({obj => $obj, showargs => [@showargs]})
プリミティブ命令

38

setboundary($x, $y)gstatepush
gstatepop
linewidth($w)
linedash($dash, $gap, $phase)ctm(@array)fillcolor($color)strokecolor($color)
fillgray($g)
strokegray($g)
fillrgb($r, $g, $b)
strokergb($r, $g, $b)
moveto($x, $y)lineto($x, $y)
curveto($x1, $y1, $x2, $y2, $x3, $y3)
rectangle($x, $y, $w, $h)closepath
newpathstrokeclosestroke
fill
fill2
fillstroke■ PDFJ::Style クラスのメソッド
次のメソッドは PDFJ::TextStyle、PDFJ::ParagraphStyle、PDFJ::BlockStyle、PDFJ::ShapeStyle のすべてで使える。
clone(%args)
clone({%args})
clone($argstr)■ PDFJ::TextStyle クラスのメソッド
PDFJ::TextStyle‑>new(%args)
PDFJ::TextStyle‑>new({%args})
PDFJ::TextStyle‑>new($argstr)■ PDFJ::ParagraphStyle クラスのメソッド
PDFJ::ParagraphStyle‑>new(%args)
PDFJ::ParagraphStyle‑>new({%args})

39

PDFJ::ParagraphStyle‑>new($argstr)■ PDFJ::BlockStyle クラスのメソッド
PDFJ::BlockStyle‑>new(%args)
PDFJ::BlockStyle‑>new({%args})
PDFJ::BlockStyle‑>new($argstr)■ PDFJ::ShapeStyle クラスのメソッド
PDFJ::ShapeStyle‑>new(%args)
PDFJ::ShapeStyle‑>new({%args})
PDFJ::ShapeStyle‑>new($argstr)■ PDFJ::Color クラスのメソッド
PDFJ::Color‑>new($r, $g, $b)
PDFJ::Color‑>new($rgb)
PDFJ::Color‑>new($g)
PDFJ::Color‑>new({value => $rgb})
PDFJ::Color‑>new({value => $g})

■ PDFJ::Outline クラスのメソッド
PDFJ::Outline‑>new($title, $level)
PDFJ::Outline‑>new({title => $title, level => $level})■ PDFJ::Dest クラスのメソッド
PDFJ::Dest‑>new($name)
PDFJ::Dest‑>new({name => $name})■内部クラス
以下は、通常はユーザーが直接扱う必要のない、PDFJ 内部で使われるクラス。

PDFJ::File クラス
PDFJ::Doc の下請け。PDF 文書＝ PDFJ::Doc オブジェクトを PDF ファイルに書き出す際に、PDF
オブジェクトの索引情報などのメタデータを付加して、規定に従ったファイル構造を作る役割を

40

する。

PDFJ::ObjTable クラス
PDFJ::Doc の下請け。PDFJ::Doc オブジェクトに含まれる PDF オブジェクトを管理する。
PDFJ::TextSpec クラス
PDFJ::Text の下請けとして、テキスト属性を保持する。
PDFJ::Object::* クラス群
PDF 文書は Adobe 社が規定した PDF の文法に沿って構成されており、その構成単位もまた「オブジェクト」と呼ばれる。この PDF レベルのオブジェクトを、上記で説明したような PDFJ における Perl オブジェクトと区別するために、「PDF オブジェクト」と呼ぶことにする。PDFJ は、低レベルでプリミティブな PDF オブジェクトを隠蔽し、ユーザーが直接扱わなくてよいようにしている。もし自分で PDF オブジェクトを操作したいときは、PDFJ::Object::* クラス群を使えばよい。
PDFJ::TTF クラス
TrueType フォントファイル (.ttf) の内容を読みとったり、サブセットを作成したりする。
PDFJ::TTC クラス
TrueTypeCollection フォントファイル (.ttc) を読みとって、指定した番号のフォントについての
PDFJ::TTF オブジェクトを得る。
PDFJ::OTF クラス
OpenType フォントファイル (.otf) の内容を読みとったり、サブセットを作成したりする。
PDFJ::CFF クラス
CFF（Compact Font Format）を扱う。
PDFJ::Form クラス
対話フォーム機能を提供する。

PDFJ::Field::* クラス群
対話フォームの個々のフィールドを表す。

AUTHOR中島 靖 nakajima@netstock.co.jp http://hp1.jonex.ne.jp/~nakajima.yasushi/

SEE ALSO「JIS X 4051（日本語文書の行組版方法）」(JIS、1995)

41

「PDF リファレンス 第２版」( アドビシステムズ、2001)42