[お断り]本記事は9月中旬に別の著者名で掲載しましたが、著者名を改め、再掲載いたします。
text=佐藤 尚 氏 ソリューション・ラボ・ジャパン
CPYSPLFコマンドを使用してスプールファイルをPDFに変換する方法について、実際に試してみた方も多いと思います。私も試してみました。
図表1のようなイメージのスプールファイルを出力するRPGプログラムを作成し、図表2のようにCLプログラム内で指定して実行することで、図表3のようなPDFが作成されます。
ただし図表3は、少々文字が読みにくいです。
この方法は、印刷装置タイプに*SCSが指定されたプリンターファイルを、実行時に一時変更コマンドで*AFPDSに変更しています。その際にQFNTxxにあるAFPフォントを使用して文字を出力するように指定していますが、このフォントの表示品質が低いことが原因のようです。
じつは、プリンターファイルには印刷装置タイプが*AFPDSの場合にのみ使用できるキーワードがいくつかあり、その中には我々がふだんExcelなどで利用しているTrueTypeフォントを指定するものもあります。これを利用すると、文字を読みやすくできます。
IBM iつれづれ草[Special]目次
TrueTypeフォントを使用する
バーコードや画像の出力
・バーコード出力
・画像出力
・その他のキーワード
HTTPを使用してPDFを印刷する
・PDFビューアーのインストール
・印刷API(REST API)の作成
・印刷APIのIIS(Webサーバー)への配置
・PDF送信PGMの作成
・PDF印刷のテスト
TrueTypeフォントを使用する
印刷装置タイプが*AFPDSの場合に有効になるDDSキーワードの1つに、FONTNAMEがあります。このキーワードは、レコードレベルまたはフィールドレベルで指定でき、レコード内の名前付きフィールドまたは固定情報の印刷で使用するTrueTypeフォント名を指定します。
キーワードのパラメーターは図表4のとおりです。各パラメーターの値は、変数(プログラム-システム間フィールド)を指定することもできます。
必須なのはフォント名とポイントサイズですが、*CODEPAGEおよび*IGCCODEPAGEを省略した場合は、印刷データをUCS-2またはUTF-16でエンコードしなければなりません。このため、通常はこれらのパラメーターを指定する必要があります。
なお、TrueTypeフォントはIBM iのオプション43(追加フォント)で提供されています。詳細は下記のIBMオンライン資料を参照してください。
TrueType および OpenType フォント
https://www.ibm.com/docs/ja/i/7.5?topic=fonts-truetype-opentype
前述の人口動態リストのDDSを修正し、レコードレベルでFONTNAMEキーワードを指定します(図表5)。
このDDSをコンパイルする際は、DEVTYPE(*AFPDS)を指定します。
CRTPRTF FILE(FONT03P) SRCFILE(QDDSSRC) DEVTYPE(*AFPDS)
CLプログラムを修正し、一時変更を行わないようにします(図表6)。
プログラムを実行すると、出力されるPDFは次のように変わり、文字が読みやすくなりました(図表7)
バーコードや画像の出力
プリンターファイルの装置タイプを*AFPDSにすることで有効になるDDSキーワードはほかにもあります。その中からいくつかを紹介します。
バーコード出力
BARCODEキーワードを使用すると、APWを使用せずにバーコードを出力することができます。このキーワード自体は古くから存在するものですが、IBM i 7.2からQRコードがサポートされています。これを試してみます。
QRコードを出力する場合は、フィールドレベルで次のように指定します。パラメーターの詳細は、IBMのオンラインマニュアルを参照してください(図表8)。
実際に試してみます。まず、プリンターファイルのDDSを次のように作成します。今回はBARCODEキーワードだけでなく、コードページ指定なしのFONTNAMEキーワードも指定しています(図表9)。
上記のプリンターファイルを使用して、IBMオンラインマニュアルのURLをQRCODEに出力するプログラムを作成します(図表10)。
プログラムを実行し、出力されたスプールファイルをCPYSPLFでPDFに変換すると、図表11のようなPDFが作成されました。
このQRコードをスマートフォンなどで読み込むと、IBMのWebページが開くことを確認できます。
画像出力
AFPRSCキーワードを使用すると、JPEGやTIFFなどの画像を出力することができます。このキーワードはレコードレベルキーワードです。出力する画像の数だけキーワードを指定します。
キーワードのパラメーターは次のとおりです(図表12)。各パラメーターはプログラム-システム間フィールド(変数)にすることができます。
次の画像(図表13)をPDFに出力してみます。画像はあらかじめJPEG形式に変換し、IFS上に配置しておきます。
プリンターファイルのDDSを図表14のように作成します。AFPRSCキーワードが指定されているレコード様式では、行と桁の欄でフィールドの位置を指定できないため、文字を表示する場合はフィールドレベルでPOSITIONキーワードを使用して位置を指定します。
次のような印刷プログラムを作成します(図表15)。
プログラムを実行し、出力されたスプールファイルをCPYSPLFでPDFに変換すると、図表16のようなPDFが作成されました。
その他のキーワード
装置タイプ*AFPDSのプリンターファイルのDDSでは、これまで紹介してきたキーワードのほかに、直線を出力するLINEキーワード、長方形を出力するBOXキーワード、文字の色を指定するCOLORキーワードなどを使用できます。
装置タイプ*SCSの場合と比較して、印刷出力の表現力が大幅に向上することがおわかりいただけたと思います。
HTTPを使用してPDFを印刷する
作成したPDFを、プログラムからプリンターへ出力できたら便利です。今回は、REST APIの仕組みを利用して、PDFをPCのデフォルトプリンターへ出力する仕組みを作成する方法を紹介します。
大まかな構成は図表17のとおりで、作成するプログラムは、送信PGMと印刷APIの2つです。
まず、Windows PC上に、印刷を行うための印刷API(REST API)を作成します。
・PDFビューアーはSumatraPDFを使用します。
・APIはASP.NET(VB.NET)で作成します。
・WebサーバーはIISを使用します。
PDFビューアーのインストール
SumatraPDFの公式ページよりダウンロードします。
https://www.sumatrapdfreader.org/free-pdf-reader
今回はコマンドラインから呼び出すだけなので、ポータブル版を使用します(図表18)。
ダウンロードしたZIPファイルを展開します(図表19)。
中にあるSumatraPDF-3.4.6-64.exeを任意のフォルダ(今回はC:¥Tools¥SumatraPDF)へ配置します(図表20)。
このPDFビューアーは、次のようにコマンドラインパラメーターを指定することで、PDFをPCのデフォルトプリンターへ出力することができます。
SumatraPDF-3.4.6-64.exe -print-to-default –silent PDFファイルのパス
・-print-to-default 指定されたPDFファイルをPCのデフォルトプリンターへ出力する
・-silent コマンドライン印刷に関するエラーメッセージの表示を抑止する
印刷API(REST API)の作成
ASP.NETで印刷APIを作成します。
今回の機能は無償版のVisual Studio(Visual Studio Express 2013 Web with Update 5など)で作成できます。マイクロソフトのページより日本語版のISOイメージをダウンロードし、インストールしてください。
以前のバージョンの Visual Studio のダウンロード
https://visualstudio.microsoft.com/ja/vs/older-downloads/
Visual Studioを起動し、新しいプロジェクトを作成します。
「新しいプロジェクト」ウインドウで次のように指定し、OKをクリックします(図表21)。
・開発言語: Visual Basic
・プロジェクトテンプレート: ASP.NET Web アプリケーション
・プロジェクト名: PdfPrintingService
「新規ASP.NETプロジェクト」ウインドウで「Web API」を選択し、OKをクリックします(図表22)。
・テンプレート: Web API
・クラウドにホストする: チェック外す
プロジェクトが作成されます。ソリューションエクスプローラーは次のような表示になっています(図表23)。
印刷用コントローラーを追加します。ソリューションエクスプローラーのControllersフォルダを右クリックし、表示されたメニューから追加 > コントローラー(T)…をクリックします(図表24)。
「スキャフォールディングの追加」ウインドウで「Web API 2 コントローラー – 空」を選択し、追加をクリックします(図表25)。
コントローラー名をPrintControllerに変更して追加をクリックします(図表26)。
PrintController.vbの編集ウインドウが開きます(図表27)。
次のようにソースコードを変更し、デフォルトアクションを実装します(図表28)。
印刷APIのIIS(Webサーバー)への配置
WindowsのクライアントOS(Windows 10など)にもIIS(Internet Information Service)と呼ばれるWebサーバーが標準で搭載されています。これは、Windows Serverに搭載されているものと異なり、同時接続数などに制限があるため、本格的な運用には使用できませんが、今回はテストが目的ですのでこれを使用します。
デフォルトでは無効になっているので、有効にします。コントロールパネルより、Windowsの機能の有効化または無効化を起動します(図表29)。
インターネットインフォメーションサービスのチェックボックスをチェックします(図表30)。
さらに、インターネットインフォメーションサービス > World Wide Webサービス > アプリケーション開発機能 と展開し、ASP.NET 4.8のチェックボックスをチェックし、OKをクリックします(図表31)。
次の画面に切り替われば成功です(図表32)。
アプリケーションの配置先フォルダを作成します。IISのドキュメントルート(公開フォルダ)はC:\inetpub\wwwrootですが、今回はアプリケーションをこれとは別の場所に配置し、アプリケーションエイリアスを設定して呼び出す形とします。
今回のアプリケーション配置先フォルダはC:¥www¥PdfPrintServiceです。エクスプローラーで作成します(図表33)。
Visual Studioに戻り、ソリューションエクスプローラーでプロジェクトを右クリックし、表示されたメニューから発行(B)…をクリックします(図表34)。
Webを発行ウインドウでカスタムをクリックします(図表35)。
プロファイル名にPdfPrintingServiceと入力しOKをクリックします(図表36)。
発行方法プルダウンで、ファイルシステムを選択します(図表37)。
ターゲットの場所で参照ボタン(…)をクリックします(図表38)。
あらかじめ作成しておいたC:\www\PdfPrintingServiceフォルダを選択して、開くをクリックします(図表39)。
次へをクリックします(図表40)。
次へをクリックします(図表41)。
発行をクリックします(図表42)。
発行が成功すると、出力ウインドウに次のようなメッセージが表示されます(図表43)。
エクスプローラーでもファイルが作成されていることが確認できます(図表44)。
IISにアプリケーションとして登録します。WindowsのStartメニューからWindows管理ツール > インターネットインフォメーションサービス(IIS)を起動します(図表45)。
接続ペインでコンピュータ名 > サイトと展開、Default Web Siteを右クリックし、表示されたメニューのアプリケーションの追加…をクリックします(図表46)。
エイリアスにpdfと入力し、物理パスの参照(…)ボタンをクリックします(図表47)。
先ほどアプリケーションの配置したC:\www\PdfPrintServiceを選択して、OKをクリックします(図表48)。
OKをクリックします(図表49)。
pdfという名前のアプリケーションが追加されました(図表50)。
Default Web Siteを右クリックし、表示されたメニューのWebサイトの管理 > 開始をクリックし、Webサイトを開始します(図表51)。
これで、印刷APIの準備が整いました(図表52)。
PDF送信PGMの作成
IBMi上で、作成したPDFを印刷APIへ送信するためのプログラムを作成します。プログラム名はPRINTPDF、組み込みSQLを使用するのでソースのメンバータイプはSQLRPGLEに設定し、CRTSQLRPGコマンドでコンパイルします(図表53)。
PDF印刷のテスト
スプールファイル出力~PDF変換~PDF印刷の一連の処理をバッチ実行するCLプログラムを作成します(図表54)。
コマンドラインからプログラムを実行すると(図表55)、印刷APIの呼び出しに成功し、プリンターに出力されました(図表56)。
著者
佐藤 尚 氏
ソリューション・ラボ・ジャパン株式会社
第1ソリューションサービス統括
ソリューション開発2部
アプリケーションスペシャリスト
AS/400ユーザーの情報システム部門を経て、2006年ソリューション・ラボ・横浜(現ソリューション・ラボ・ジャパン)に入社。主にIBM iを中心に他のプラットフォームとの連携を行うシステムの設計・開発を行う。近年はIBM i技術者の教育タスクを担当している。
[i Magazine・IS magazine]