NEWS
IBM i 技術解説 IBM i 技術解説
2026.03.23
SHARE
  • twitter
  • facebook
  • hatena
  • linkedin

IBM i Apache-FOPによるPDF作成|第4回|サンプルのXSLTについて

IBM i Apache-FOPによるPDF作成|第4回|サンプルのXSLTについて

第1回「概要」(最終的にどのようなPDFが作成できるのか?)はこちら
第2回「PASE環境へのApache-FOPインストールと実行するための設定」はこちら
第3回「サンプル・プログラムの概要と配置および実行方法」はこちら

1. サンプルプログラムの概要

今回は⑤の部分を説明します。このXSLTファイルが、PDFに変換する定義になります。

Apache-FOPはPDFBoxを使用してPDFを作成しています。(※最新の2.11は内部でPDFBox 3を使用)
Apache-FOPでPDFを作成するためにXSLTを記述する必要がありますが、印刷の様式には似通ったパターンがあります。
バリエーションをいくつか作成すれば使い回しできます。

今回のサンプルにはヘッダー及び明細があり、1ページ目と2ページ目以降ではヘッダー部分を異なる内容にしています。
またテキスト・エディタで修正するのが面倒という場合は、某社からGUIで編集するツールが有償で販売されています。ご興味があるかたは「組版 FOP」で検索してみて下さい。
今回のXSLTは、VS CodeにXML Toolsの拡張機能をインストールして作成しました。

2. Apache-FOPの構成

2.1 Apache-FOPページ構成

※PDFにjavaや.Netプログラムで直接描画する場合、原点は用紙の左下になります。
またApache-FOPでは、改ページはXSLTで制御しないようにするのが原則です。上図のエリアを設定し、描画データが領域からあふれたら自動的に改ページされます。

Apache-FOPは組版(印刷を前提としたもの)を意識したものになっており、印刷を意識した内容が出てきます。

ポートレイトとランドスケープという言葉が出てきますが、これらは写真や印刷物で使われる印刷の向きになります。

  • ポートレイト:縦
  • ランドスケープ:横

2.2 Apache-FOPの各要素

各要素としては、HTMLと同様にmarginとpaddingおよびBorderがあります。

罫線を引く場合はBorderになります。
基本的に表示領域の内側に余白を確保する場合はpadding、表示領域の外側に余白を確保する場合はmarginになります。
上図の様にmargin、padding、borderには、top(上)、left(左)、right(右)、bottom(下)のプロパティの設定があります。
top、left、right、bottomをつけない指定をするとtop、left、right、bottomに全て同じ値が設定されたと見なされます。
(※ margin: 10mm だけ指定されている場合は、margin-top: 10mm, margin-left: 10mm, margin-right: 10mm, margin-bottom: 10mmとなります)

Borderは基本的に罫線を引く場合に設定します。線種(実線、破線等々)、太さおよび色が指定できます。
(※色を指定する場合、カラー名【color: red】とカラーコード【color: #ff0000】が使用できます。)
この記述に関してもHTMLと同じようなものと考えて下さい。
FOPのXSLTの記述はHTMLと似ている内容が多い。)

2.3 Apache-FOP layout-master-set

使用する用紙を定義する場所になります。定義したものを使用しなくても問題ありません。

2.3.1 Apache-FOP simple-page-master

このタグの下に用紙サイズを記述します。(fo:simple-page-master)必ずmaster-name属性で名前を付けます。

No. 用紙サイズ(代表的なもの) 横サイズ 縦サイズ
1 A4縦(A4 ポートレイト) 210mm 297mm
2 A4横(A4 ランドスケープ) 297mm 210mm
3 A5横(A5 ランドスケープ) 210mm 148mm
4 A5縦(A5 ポートレイト) 148mm 210mm

A4縦、A4横、A5縦、A5横など良く使用するものを記述しておけば、流用する場合に便利です。流用時に修正するのは、主にregion-xxxの内容です。

下記の例はA4横とA4縦を記述したものです。名前(master-name)は、A4LandscapeとA4Portraitになっています。

2.3.2 Apache-FOP page-sequence-master

page-sequence-masterは、名の通りページの順序を記述する箇所になります。先頭ページのみ様式を変えたいとか、奇数・偶数ページで様式を変えたいというような時に記述します。このような変更が不要であれば、page-sequence-masterは記述しなくても問題ありません。代表的なものは以下のとおりです。

No. 名称 説明
1 single-page-master-reference 1ページだけsimple-page-masterを挿入する。master-reference属性でsimple-page-masterのmaster-nameを指定
2 repeatable-page-master-reference 繰り返すページにsimple-page-masterを挿入する。maximum-repeats属性で繰り返す回数を指定。
通常はno-limitを記述。master-reference属性でsimple-page-masterのmaster-nameを指定
3 conditional-page-master-reference 指定された条件により使用するsimple-page-masterを変えて挿入する。
主にodd(奇数)ページとeven(偶数)ページでレイアウトを変える場合に使用。

2.3.3 Apache-FOP page-sequence

実際に描画する処理を記述します。 master-reference属性で、page-sequence-masterのmaster-nameかsimple-page-masterのmaster-nameを指定します。このサンプルでは、page-sequence-masterにmaster-nameとしてA4Portraitを定義しています。

↑ またフォントを指定しています。<fo:page-sequence>が一番上位のタグになります。この階層下に記述したものに継承されます。

※上記の{$fontMamily}は、XSLT内で定義した変数です。
(※下記参照。<xsl:template match=”/quotation”>の下に記述していますので、/quotationノードのfont-family属性の値が格納されます。)



XML文書のルートノードは<xsl:template match=”/quotation” />の後に<xsl:variable name=”fontFamily” select=”@font-family” /> を定義していますので<quotation>ノードの属性fontFamilyの内容値になります。

※注 XSLTで定義する変数は内容値を変更する事ができません。使い捨て変数と考えて下さい。

2.3.4 Apache-FOP static-context (ヘッダー ※説明は1ページ目のみ)

下記はstatic-contentの抜粋です。static-contentは、属性flow-nameの名前を持つregion-nameのsimple-page-masterから呼び出されます。
サンプルでは、上位タグのpage-sequenceの一番目タグでsingle-page-masterが指定されており、そのmaster-referenceの値がfirst-page-masterとなっていますのでsimple-page-masterのmaster-name=”first-page-master”の用紙が使われます。
2ページ目以降はrepeatable^page-masterに指定されている”normal-page-master”の用紙が使われます。

上記の例では、XMLデータのノード位置が<quotation>です。この位置から相対XPATH記述でXMLデータを取得する事になります。
<block-container>でブロックの塊になります。block-containerに属性absolute-position=”absolute”(絶対位置指定)を設定して、上からの位置と左からの位置を指定しています。

上記はヘッダーに描画するものを記述しています。(説明のため、下記は抜粋になります。)

No. 描画するもの 描画位置 描画内容
1 見積番号
上から0mm
左から155mm
描画する内容はblockタグの配下に記述します。
フォントサイズ9ptで下線を引き、XMLデータの/quotation/headerタグのno属性の値になります、substring関数を使用し、先頭3文字と’-‘と5文字目から5文字を連結し描画します。
select=””構文にある@はタグではなく属性値を意味します。
text-decoration=”underline”を記述していますので、描画した文字には下線が引かれます。
2 QRコード
上から55mm
左から140mm
xsl:variableでqrFileNameを宣言し、内容値には‘quotation_’と/quotation/headerタグのno属性と’.svg’を連結したものになります。
XSLT2.0の関数を使用しqrFileNameのURIを生成し変数 qrImageUriに設定します。
次にexternal-graphicでsrc=”url({$qrImageUri})”に生成したイメージファイルのパスを指定しイメージファイルを描画します。
3 会社情報
上から12mm
左から117mm
フォントサイズ9ptで〒と/quotation/header/companyInfo/addressの属性noを描画
フォントサイズ10ptで/quotation/header/companyInfo/nameを描画
フォントサイズ9ptでTELと/quotation/header/companyInfo/telephoneNumberを描画
フォントサイズ9ptでFAXと/quotation/header/companyInfo/faxNumberを描画
※異なるblock間は改行されます。

次に罫線を描画している押印欄を説明します。
押印欄はtable(※htmlで使用するtableと似ていますが、カラムは明示的に宣言します。)

No. HTMLのtable Apache-FOPのtable
1 <tr> <fo:table-row> heightで高さを指定可能
2 <td> <fo:table-cell>column-widthで幅指定可能
3 valign display-align

2.3.5 fo:static-content flow-name=”xsl-region-after” (フッター)

flow-name=”xsl-region-after”と記述していますのでfo:simple-page-masterのfo:regin-afterの部分に描画します。

フッターは1ページ目と2ページ目以降で共通して使用しています。

$printTime変数の宣言部分。XSLT組込み関数を使用し現在時刻を取得しています。

2.3.6 fo:static-content flow-name=”xsl-region-body” (ボディ)

fo:flow flow-name=”xsl-region-body”と記述していますのでfo:simple-page-masterのfo:regin-bodyの部分に描画します。

a.明細部 ヘッダー

b.明細部 明細(抜粋説明。記載するコードも一部になっています。)

明細部分も1ページ目と2ページ目以降で共通で使用します。
※simple-page-masterでbody部の大きさが異なるため、明細行も異なる。

いいねと思ったらシェア
twitter
facebook
hatena
linkedin
関連記事
IBM i Apache-FOPによるPDF作成 | 第2回 | PASE環境へのApache-FOPインストールと実行するための設定
IBM i Apache-FOPによるPDF作成 | 第2回 | PASE環境へのApache-FOPインストールと実行するための設定
IBM i Apache-FOPによるPDF作成 | 第1回 | 概要
IBM i Apache-FOPによるPDF作成 | 第1回 | 概要
IBM i Apache-FOPによるPDF作成|第3回|サンプル・プログラムの概要と配置および実行方法
IBM i Apache-FOPによるPDF作成|第3回|サンプル・プログラムの概要と配置および実行方法
あなたにオススメの連載
Db2 for i & SQL活用 虎の巻
15記事
Db2 for i & SQL活用 虎の巻
IBM i の”新”必須言語 〜FFRPG入門〜
13記事
IBM i の”新”必須言語 〜FFRPG入門〜
できるIBM i 温故知新編
9記事
できるIBM i 温故知新編