Windows10/11 で fop 2.11

久し振りに環境構築が必要になったので、思い出しながらメモしておこう…

システムを公開していたら、利用者がことのほか多くて再構築する必要が出てきてしまった..
Ubuntu で構築していたものを Windows に変更してみようという試み..

十年選手の Ubuntu の開発環境を壊してしまい、再構築しなければならなくなりました
バックアップしていた待避先の方が先に壊れてしまい、ソースのオリジナルがなくて焦ったことは別の話…

fop とか結構な設定していたやつで、フォントテーブルの設定で苦労した記憶がある機体

この他、PHP と PostgreSQL を同居させないといけない環境….

面倒なので、Windows で構築しちゃおうかな…と考えたので、構築しながら備忘録として残しておく事にしました

0.JDK

最近は、JRE を配布していないらしい (Java は詳しくないので詳細は不明)

で、Apache ってJava 作ってなカタッヶ…

OpenJDK で良いらしいので、openjdk-24.0.2_windows-x64_bin を拾ってきた
基本的に、拾ってきて解凍して bin に PATH を通せば良い


Microsoft Windows [Version 10.0.19045.6332]
(c) Microsoft Corporation. All rights reserved.

C:\Users\user>java
'java' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

C:\Users\user>cd C:\Users\user\Downloads\XXXX\fop-2.11-bin\fop-2.11\fop

C:\Users\user\Downloads\XXXX\fop-2.11-bin\fop-2.11\fop>fop
'"java"' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

C:\Users\user\Downloads\XXXX\fop-2.11-bin\fop-2.11\fop>SET PATH=%PATH%;C:\Users\user\Downloads\XXXX\openjdk-24.0.2_windows-x64_bin\jdk-24.0.2\bin

C:\Users\user\Downloads\XXXX\fop-2.11-bin\fop-2.11\fop>fop
FOP Version 2.11

実行してみた

fop C:\Users\user\Downloads\XXXX\fop-2.11-bin\fop-2.11\fop\examples\fo\basic\border.fo tt.pdf
9月 12, 2025 5:10:25 午後 org.apache.fop.apps.FOUserAgent processEvent
警告: Only a value of "auto" for block-progression-dimension has a well-specified behavior on fo:table. Falling back to "auto". (See position 123:22)
9月 12, 2025 5:10:25 午後 org.apache.fop.apps.FOUserAgent processEvent
情報: Rendered page #1.

なんとなく動いてる

1.Apache

https://www.apachelounge.com/download/
解凍
プロパティー
cmd 管理者
httpd.conf servername
httpd -k install
windows firewall

2.php

VC_redist.x64
php module

php.ini

3.PostgreSQL

EDB postgreSQL
ロール

4.OpenJDK

JAVA_HOME
%JAVA_HOMR%¥bin

IPAexGothic

5.fop 2.11 動作編

今回、OS を Windows 11 へ変更しようとしてみています
 
これまで Ubuntu の結構前のバージョンで動かしてた
fop も結構前のバージョンだった
 
今回は新しめにしたのだけれど、なぜかまったく動かない
 
ですが、今回で判明したのは external-graphic の src 属性で SVG を指定して読み込ませ、 PNG や PDF を作成していましたが、これが上手く動きません
 
<fo:external-graphic src="Base105.svg" />
 
で、fop の実行前に SVG のノードに ID を打っておきデータを書く作戦で帳票を作成していました
(実際はテンポラリーに tempnam で一意のファイル名で作成されている)
 
調べてみた結果、file:/// で外部ファイルであることを指示しないと駄目なようです
php のテンポラリーに SVG , FOP , PDF/PNG を作成して

// FOP の取り込み
//
 
$fop = new DOMDocument("1.0", "UTF-8");
 
$fop->load('sample1.fo');
$fop->formatOutput = TRUE;
$fop->preserveWhiteSpace = FALSE;
$fop->encoding = 'UTF-8';
 
$extPath = $fop->getElementsByTagNameNS('http://www.w3.org/1999/XSL/Format','external-graphic')->item(0);
 

 
 
$tmpSVG = tempnam("",'tmp');
$tmpFOP = tempnam("","tmp");
$tmpPDF = tempnam("","tmp");

$fp1 = fopen($tmpSVG,'w+');
fwrite($fp1,$svg->saveXML());
fclose($fp1);
 
// FOP をテンポラリに
 
$fp2 = fopen($tmpFOP,'w+');

$extPath->setAttribute('src',$tmpSVG);

fwrite($fp2,$fop->saveXML());
fclose($fp2);

if( isset($_REQUEST['png']))
exec("fop -c fop.conf {$tmpFOP} -noedit -nocopy -noannotations -png {$tmpPDF} -dpi 200");
else
exec("fop -c fop.conf {$tmpFOP} -noedit -nocopy -noannotations -pdf {$tmpPDF} -dpi 400");


この後、ヘッダーを出力して readfile($tmpPDF); を実行します
 
こんな感じで fop を 実行していました
$extPath は external-graphic のノードですね!
 
テンポラリーに SVG,FOP を作成し、PDF/PNG ファイルとして書き出す感じです
 
ここで、SVG も、fop も問題なく、エディターで確認しても問題がわかりませんでした
 
だが、何度実行しても 空白の PNG/PDF を作成しやがります
 
そこで external-graphic を調べてみると、URI での指定をしないといけなくなっているようで、実ファイルは file:/// で指定するそうです
 

<fo:page-sequence master-reference="A6-landscape">
<fo:flow flow-name="xsl-region-body">
<fo:block>
<fo:external-graphic src="file:///E:¥TEMP¥tmpXXXXXX.tmp." />
</fo:block>
</fo:flow>
</fo:page-sequence>

 
tempnam でテンポラリーを作成しているので、実際はこんな感じになるようにしないといけないい様です
 
これ、実際は ファイルが読めない警告をコマンドラインで実行すると確認できるのですが、なんで読めないのかが判りませんでした
 

<fo:external-graphic src="url('images/logo.jpg')"/>
 
Here is an example referencing an external-graphic that is an absolute URI on a local filesystem:
 
<fo:external-graphic src="url('file:d:///images/logo.jpg')"/>
 

 
fop のサイトではこんな感じで説明がありましたが、URL の指定は無くても動くようです
(ちょっと書き方があってないかもしれないですね…)
$extPath->setAttribute('src',"file:///".$tmpSVG);
上のソースをこんな感じで修正しましたが、今回は動いてます
バージョンが進んでパスの検証とかが厳密になったら、tempnam() の戻り値をそのまま使えなくなるかもしれないですね
(チャッと調べた範囲では、イッパツで変換する関数とかは用意されてないようですね…)
 
その時は、http 経由で読める実行ディレクトリにファイルを準備するようにすれば良いかな..
 

6.fop 2.11 フォント編

fop の 引数オプション -c の additional configuration file で fonts タグで font の指定をするが、うまく指定できない件について…
 

<font kerning="yes" embed-url="HGRHR4.TTC" sub-font="HGHeiseiMarugothictaiW4">
<font-triplet name="HGHeiseiMarugothictaiW4" style="normal" weight="normal"/>
</font>
 
<font kerning="yes" embed-url="NotoSansJP-Thin.ttf">
<font-triplet name="NotoSansJP" style="normal" weight="100"/>
</font>
<font kerning="yes" embed-url="NotoSansJP-ExtraLight.ttf">
<font-triplet name="NotoSansJP" style="normal" weight="200"/>
</font>
<font kerning="yes" embed-url="NotoSansJP-Light.ttf">
<font-triplet name="NotoSansJP" style="normal" weight="300"/>
</font>
<font kerning="yes" embed-url="NotoSansJP-Regular.ttf">
<font-triplet name="NotoSansJP" style="normal" weight="400"/>
</font>
<font kerning="yes" embed-url="NotoSansJP-Medium.ttf">
<font-triplet name="NotoSansJP" style="normal" weight="500"/>
</font>
<font kerning="yes" embed-url="NotoSansJP-SemiBold.ttf">
<font-triplet name="NotoSansJP" style="normal" weight="600"/>
</font>
<font kerning="yes" embed-url="NotoSansJP-Bold.ttf">
<font-triplet name="NotoSansJP" style="normal" weight="700"/>
</font>
<font kerning="yes" embed-url="NotoSansJP-ExtraBold.ttf">
<font-triplet name="NotoSansJP" style="normal" weight="800"/>
</font>
<font kerning="yes" embed-url="NotoSansJP-Black.ttf">
<font-triplet name="NotoSansJP" style="normal" weight="900"/>
</font>

 
これ、レンダラーに application/pdf をしていたんだけど、これは結構な綺麗さで再現できました

 
指定は SVG でこんな感じです

 
<text transform="translate(7.335 132.7)" style="font-size: 10px;font-family: HGHeiseiMarugothictaiW4">備考</text>
 
<text transform="translate(7.335 145.7)" style="font-size: 13px;font-family: NotoSansJP;font-weight:100;">亜亜</text>
<text transform="translate(33.335 145.7)" style="font-size: 13px;font-family: NotoSansJP;font-weight:200;">亜亜</text>
<text transform="translate(60.335 145.7)" style="font-size: 13px;font-family: NotoSansJP;font-weight:300;">亜亜</text>
<text transform="translate(85.335 145.7)" style="font-size: 13px;font-family: NotoSansJP;font-weight:400;">亜亜</text>
<text transform="translate(111.335 145.7)" style="font-size: 13px;font-family: NotoSansJP;font-weight:500;">亜亜</text>
<text transform="translate(137.335 145.7)" style="font-size: 13px;font-family: NotoSansJP;font-weight:600;">亜亜</text>
<text transform="translate(163.335 145.7)" style="font-size: 13px;font-family: NotoSansJP;font-weight:700;">亜亜</text>
<text transform="translate(189.335 145.7)" style="font-size: 13px;font-family: NotoSansJP;font-weight:800;">亜亜</text>
<text transform="translate(215.335 145.7)" style="font-size: 13px;font-family: NotoSansJP;font-weight:900;">亜亜</text>
 

フォントのウェイトと対応するファイル名は、ここで確認できます
https://fonts.google.com/noto/specimen/Noto+Sans+JP
 
「備考」は、HG平成丸ゴシックW4 って言う市販のフォントで TTC (写して良いのか微妙)のサンプルで指定してみています
TrueType Collection の丸ゴシックはうまく指定できているようです
(このフォントはウェイトごとにファイルがあって、コレクションはピッチによって三種類のフォントが同梱されています)
 
別で、IPA のフォントも指定していますが、TTF ですので、特に問題なく指定できています
PDF の埋め込みサブセットとして組み込まれていますので、再現性も問題ありません
 
で、問題は PDF 以外のレンダラーの指定です
AWT と PNG のセクションでフォントを指定してもうまく行きません

java -cp s:\fop\build\fop-core-2.11.jar;s:\fop\lib\commons-logging-1.3.0.jar;S:\fop\lib\commons-io-2.17.0.jar;S:\fop\lib\xmlgraphics-commons-2.11.jar org.apache.fop.fonts.apps.TTFReader ipaexg.ttf tt.xml

java -cp s:\fop\build\fop-core-2.11.jar;s:\fop\lib\commons-logging-1.3.0.jar;S:\fop\lib\commons-io-2.17.0.jar;S:\fop\lib\xmlgraphics-commons-2.11.jar org.apache.fop.fonts.apps.TTFReader -ttcname “HGHeiseiMarugothictaiW4” HGRHR4.TTC tt.xml

未完

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です