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部の大きさが異なるため、明細行も異なる。
- 第1回 | 概要
- 第2回 | PASE環境へのApache-FOPインストールと実行するための設定
- 第3回 | サンプル・プログラムの概要と配置および実行方法
- 第4回(最終回) | サンプルのXSLTについて












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