🍣

XSL入門以前 1(ハロワ)

2020/12/05に公開

この記事はXSL Advent Calendar 2020 5日目の記事です。
https://adventar.org/calendars/5027

XEPとFOPによるPDF出力表示

1日目の記事でXSL-FOプロセッサーであるXEPとFOPを入手し、日本語フォントの指定を行いました。これで皆さんはFOファイルからPDFを出力できるわけです。やっぱり出力したPDF、見たいですよね。モチベのために。
ほぼFOPやXEPのチュートリアルと変わらない例ですが、あるFOを出力した例です。Windows版での例を示します。パスとかは適当に読み換えてください。

まずはXEP。

PS > .\xep.bat -fo somepath\fo.fo -pdf somepath\xep.pdf

FOP。

PS > ./fop.bat -c confpath\fop.xconf -fo somepath\fo.fo' -pdf somepath\fop.pdf'

FOPの方は設定ファイルのパスも指定しています。「設定ファイルに日本語フォント指定したのに出力したPDFで表示されてない」とかはこの指定を追加しましょう。

XEPの方は用途限定の無償版なので下部にロゴなどが挿入されていますが、同じように出力されていますね。同じ入力に対し同じ出力を得られる、これが標準仕様とその準拠の美しい形ですね。実はちゃんと指定していない箇所についてはそれぞれのプロセッサのデフォルト値になってしまうので常に同じ見た目というのは難しいのですが。例えば全角スペースの処理とか。

何にせよ、「コマンドライン1行でPDFができるんだ! 普通!」という感想を持っていただけたかと思います。XSL-FO、PDF、フォントの仕様などを実装側で考えると普通というには大変すぎる道程がありますが、大抵の物事はそんなものですね。さて、そんなPDFにビルドされるFOを見てみましょう。

<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"
xml:lang="ja-JP"
>
  <fo:layout-master-set>
    <fo:simple-page-master master-name="main"
     page-width="182mm" page-height="257mm">
        <fo:region-body region-name="xsl-region-body"
         margin-top="15mm"
         margin-bottom="20mm"
         margin-left="15mm"
         margin-right="15mm" />
    </fo:simple-page-master>
  </fo:layout-master-set>
  <fo:page-sequence master-reference="main">
    <fo:flow flow-name="xsl-region-body">
        <fo:block font-size="14pt" line-height="1.6" font-family="'Noto Serif CJK Jp'">こんにちは、世界。</fo:block>
        <fo:block font-size="14pt" line-height="1.4" font-family="'Juliamo'" xml:lang="eo">Saluton, Mondo.</fo:block>
    </fo:flow>
  </fo:page-sequence>
</fo:root>

「よくわからないが長い。毎回これを入力するの?」「Wordなら画面を開いて2行打つだけなのに」などの感想を持っていただけたのではないでしょうか[1]。マークアップの内容については別の機会にちゃんと解説していくとして、

「毎回こんなの手打ちするワケないじゃん」[2]

XSL仕様はXSL-FOとXSLTに分けられます。元の文書をXSLTに喰わせて、XSL-FOを吐いてもらう(XSL-FOに限りませんが)、それがXSLの使い方です。

脚注
  1. もっと「このページ凝ってる!」みたいな例を載せることも考えたんですが、FOの複雑さが引くくらいになっていくので、この記事ではこのくらいということで。 ↩︎

  2. でもレイアウトとかまで一品モノだと手打ちの方が早いこともある。「XSL-FOでスライドを作成してみる」 - I love software2! https://blog.antenna.co.jp/ILSoft2/archives/12386 ↩︎

Discussion