1. はじめに
今回はIBMiでApache-FOPを使用し、ライセンス・コスト不要でPDFを作成するものです。
コストをかければソリューションはあると思いますが、ちょっとした事を行う事でPDFを作成できるのは便利だと考えたからです。もちろん単純なPDFを作成するのはIBM iの機能で可能ですが、せっかくPDFを作成するので、CPIに縛られたものではなくフォントや画像(罫線を含む)を使用して作成する方法をご紹介させて頂きます。
(※Apacheプロジェクトとしては、Javaを使用したHttpサーバーや、tomcatなどのサーブレット・コンテナが有名です。)
要求されるJavaのバージョンは、最新Apache-Fop 2.11でJava8以上です。PASE環境(jdk8)でも動作しました。(2025.07.09)
2. 弊社の環境
| No. | 項目 | 内容 | 備考 |
|---|---|---|---|
| 1 | ハードウェア | Power10 (9105-41B) 1 Core | |
| 2 | OS | IBMi V7.5 TR 3 CCSID 5026 : 日本語カタカナ | |
| 3 | Java | JDK 8 | Apace-FOP2.10のREADMEに記載されています。 |
| 4 | Apache-FOP ※1※2 | 2.10 | ※ |
| 5 | 5250エミュレータ | ACS 1.1.9.6 | ホストコードページ=930(日本語拡張カタカナ) |
※1.Apache-FOPはzipファイルで提供されていますので、解凍する為にツールが必要です。
※2.Apache-FOPはWindows環境(Java8以降がインストールされている事)でも動作します。
※今回のサンプルプログラムはPDFを生成するのに10秒前後かかります。(※XMLデータ作成時に外字変換も行っているため)
Apache-fopでのPDF変換は5秒程度です。サーブレット化すればJVMの起動時間がなくなりますのでもっと速くなります。
3. どんなPDFが作成できるのか?
3.1 全体の流れ
-
5250画面にて選択条件入力
抽出条件からSQL文をQTEMP/SQLWORKに作成します。 -
XML出力
QTEMP/SQLWORKに出力されたSQL文を読み込み、SQLを実行しXMLデータを作成します。
今回はDTDのないXMLデータを作成します。 -
IFSへのデータ転送
今回のサンプルではFTPを使用してIFS上にXMLデータを転送します。
※コード変換はFTPが行ってくれます。(今回のサンプルではシフトJIS) -
シェル・スクリプトを実行
QP2SHELLにてPASE環境のシェル・スクリプトを実行します。
このシェルからApache-FOPを実行し、
転送したXMLデータと予め配置するスタイルシート(.xsl)ファイル使用してPDFファイルを生成します。
なお、シェル・スクリプトの中でPythonを実行しQRコードイメージを生成しています。
3.2 サンプルプログラムで作成したPDF
3.2.1 フォントについて
PDFにはフォントが必要です、今回はフリーで使用できるIPAゴシック・フォントを使用しています。
このフォントは数字の0に斜め線が入ったものになりますのでO(オー)と0(ゼロ)が明確に判別できます。
※Apache-FOPでは生成されたPDFファイルにフォントが埋め込まれます。生成したPDFファイルのプロパティを表示すると、埋め込まれたフォントが確認できます。
Windowsで使用できるフォント・ファイル.TTFはPASE環境でも使用できます。今回のサンプルではIPAから提供されているIPAゴシックを使用しています。
フォント・ファイルには.TTFと.TTCの2種類があります。.TTCは複数のフォントが含まれているものです。拡張子の通りCollectionファイルです。
(※注意事項)使用するフォントにより、¥が\に変わるケースがあります。
今回XMLデータがSHIFT_JISコードですので、¥と\の区別がつきません。(¥と\は同じコード点にマップされています。)
- MSゴシックやIPAゴシックなどのフォントでは¥は¥で表示されます。
- モリサワ BIZ UDゴシックでは¥が\で表示されます。
3.2.2 生成したPDFファイル(1ページ目の抜粋) ※PASE環境で作成したものです。
上記のPDFには複数の大きさのフォント・サイズを使用しています。
-
会社ロゴ(イメージ)。会社ロゴはイメージ・ファイルではなくSVGファイル(Scalable Vector Graphic)です。
※拡大・縮小しても画像が劣化しません。
※Apache-FOPにはバーコード化(JAN,CODE39,NW7など)やQRコード化の機能はありませんが、Pythonを組み合わせる事で可能となります。 - QRコード(Pythonで見積№をQRコード化しています。Pythonで出力されたSVGを取り込む事でPDFに表示しています。)
-
明細(タイトル行は網掛け、改ページすると明細行の先頭に表示)。明細の金額がマイナスの時は赤字表示。
※下図のように2行単位での行網掛けを行う事も可能です。(入力データは同じXMLデータ。異なるXSLで処理)
-
また各ページ下部には、現在ページと総ページ数を表示しています。
生成したPDFファイル(2ページ目抜粋)※PASE環境で作成したものです。
2ページ目以降は、上記の通りヘッダー部分が1ページ目と異なっています。
これらの印刷レイアウトは.xslファイル(スタイルシート)に記述しています。異なるxslファイルを使用する事で、1つのxmlファイルから異なるレイアウトのPDFファイルを生成できます。
なお、提供するサンプル・プログラムのIBM i 側(ソース、オブジェクト及びデータ)は、CSV->EXCEL変換と共通です。(※同じEXCELLIBです。)












株式会社電業でシステム担当をしている竹本です。
2023年1月にIBM Powerサロンで講演させて頂きましたので、会社紹介や私のプロファイルについてはそちらをご覧下さい。
ご存じの通り、中小企業ではシステムへの投資のための予算捻出がなかなか難しいという現場があります。それでも私は、システムを活用して現場の負担を少なくし、働きやすい環境を作りたく、今まで培った自分の知っている限りのIT知識でいろんな取り組みをしてきました。
サロンでお話した自動倉庫とIBMiの連携もそのひとつです。ところが、その他の事例についてもぜひ紹介してほしいとの要望を頂き、ブログ連載という形で発信していく事になりました。
この記事を読んで頂くとおわかりになると思いますが、ソリューションを買わなくても、自分たちでちょっとした工夫を行う事でいろんなことができると思います。
私は中小企業のシステム担当として、自分でできることはやればいい、という信条があります。従いまして、私の知識、今までやってきた事例を公開して、ぜひ参考にして頂ければと思っております。この連載がみなさんのお役にたてればと思い執筆しています。
かなり技術よりの記事になりますが、ご興味がありましたら一読頂ければ幸いです。