随分前に PHP + FPDF を使って PDF ファイルを出力するシステムを運用していたんだけど、サーバーが壊れてしまった!
そこで、別に運営していた fop で帳票を出力するシステムを参照して焼き直そう!と思ったんだけれども、どうも上手く行かない…
fop で -png や -awt を表示すると上手く行くんだけど、-pdf だけ日本語が上手く行かない….
で、悩んだあげく、簡単な設定だった⁉ と言う落ちなので、忘れないように書いておこう!
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" x="0px" y="0px" width="148mm" height="210mm" xml:space="preserve">
<g id="lines-layer">
<line style="fill:none;stroke:#000000;stroke-width:0.1;stroke-miterlimit:10;" x1="244.1" y1="139.6" x2="376.9" y2="139.6"/>
<line style="fill:none;stroke:#000000;stroke-width:0.1;stroke-miterlimit:10;" x1="244.1" y1="184.8" x2="376.9" y2="184.8"/>
<line style="fill:none;stroke:#000000;stroke-width:0.1;stroke-miterlimit:10;" x1="40.8" y1="252.5" x2="376.9" y2="252.5"/>
<line style="fill:none;stroke:#000000;stroke-width:0.1;stroke-miterlimit:10;" x1="40.9" y1="275" x2="376.8" y2="275"/>
…
</g>
<g font-size="12" font-family="MS Mincho" id="data-layer">
…
<text x="94mm" y="64mm" font-size="12" text-anchor="start" font-family="MS Gothic">東京都特許許可局</text>
…
<text x="88mm" y="102mm" >実施した理由実施した理由</text>
…
</g>
</svg>
こんな感じの Adobe Illustrator で作った sample.svg と言う帳票に
<g> で データー用のレイヤーを用意して PHP でそのレイヤーにデータを追加してやるという簡単なシステムだったはず…
書いてあるように mm 単位で帳票が設計できるので便利だよね!
あとは、この SVG ファイルに A5 の指定を付けて表示するだけだ!
<?xml version="1.0" encoding="UTF-8" ?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xml:lang="ja">
<fo:layout-master-set>
<fo:simple-page-master master-name="A5-portrait" page-height="210mm" page-width="148mm" margin="5mm">
<fo:region-body />
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="A5-portrait">
<fo:flow flow-name="xsl-region-body">
<fo:block>
<fo:external-graphic src="sample.svg" />
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
こんな感じの sample.fo ファイルで A5 の用紙に印刷する様に準備してみた
fop sample.fo -awt
fop sample.fo -png sample.png
fop sample.fo -print
ここまで問題ない
カラーも線の太さも問題ない
で、PDF を作成してみよう!と思い
fop sample.fo -pdf sample.pdf
これが上手く行かない…
ネットで調べた限り、2.1 の設定では問題ないはず…
だけど、SVG の id=data-layer で指定した部分が文字化けする
具体的に言うと # で置き換えられてしまう…..
で、fop.xconf には
<!-- auto-detect fonts -->
<auto-detect/>
</fonts>
って書いてある…
これでいいって事らしいんだけどなぁ….
と思ったら、この fop を展開したフォルダーの設定ファイルを読みに行っていないと言う事が判りました!
解れば簡単だけど、2日も調べてしまった….
(フォントのマトリックスファイルを作って指定してたり…)
<?xml version="1.0" encoding="utf-8" ?>
<fop>
<renderers>
<renderer mime="application/pdf">
<fonts>
<auto-detect/>
</fonts>
</renderer>
</renderers>
</fop>
こんな感じのファイルを fop.conf として保存しておきます (XML のファイルなので fop.xconf の方が良いかな…)
で、コマンドラインの -c オプションで指定すれば良い!
fop -c fop.conf sample.fo -pdf sample.pdf
これでいけました…
(一回目の起動でフォントを確認して、どこかの領域にテーブルを用意するらしく、少し時間が掛かる
このリストを表示すると、どう言うフォントがどう言う名前で使えるか解るかな?
これは Windows 10 で確認したので、Linux では微妙に異なると思います..)
こう言うのって、解るまでが大変…
環境変数とかで指定できないのかな….
あ、せっかくだから書いておくけど、
<font metrics-url="file:///C:/Users/User/Downloads/TEST/msgothic.xml"
kerning="yes" embed-url="file:///C:/WINDOWS/Fonts/msgothic.ttc">
<font-triplet name="MS Gothic" style="normal" weight="normal"/>
<font-triplet name="MS Gothic" style="normal" weight="bold"/>
<font-triplet name="MS Gothic" style="italic" weight="normal"/>
<font-triplet name="MS Gothic" style="italic" weight="bold"/>
</font>
フォントのマトリックスファイルを指定する場合は metrics-url で指定して、 file:// を付けないとエラーするかな…
マトリックスファイルの作り方..
Windows:
C:\Users\User\Downloads\fop-2.1>java -cp build\fop.jar;lib\avalon-framework-impl-4.3.1.jar;lib\commons-logging-1.0.4.jar;lib\commons-io-1.3.1.jar;lib\xmlgraphics-commons-2.1.jar org.apache.fop.fonts.apps.TTFReader -ttcname "MS Mincho" c:\windows\fonts\msmincho.ttc msmincho.xml
Ubuntu:
user@ubuntuST27:~/TT$ java -cp /usr/share/java/fop-2.1.jar org.apache.fop.fonts.apps.TTFReader -fn "IPAex Mincho" /usr/share/fonts/opentype/ipaexfont-mincho/ipaexm.ttf ipaexm.xml
こんな感じで作れました
※ 調べていませんけど、フォントマトリックスを用意しても文字化けが止まりませんでした ^^;
2017-04-1:追記
Ubuntu は 16.04 で、 aptitude で追加した FOP です
続く..