それではいよいよ印刷スプールをPDF化してWeb表示するサンプルを紹介しよう。
印刷のWeb化手法としてユーザーがWebから入力した値に基づいて印刷プログラムを起動して
実行する。
作成された印刷スプールを、その場でPDF化してIFS に配置してこれを
Web公開すれば良い。
CLP によってIFSにジャンプする手法はこれまでに示してきたとおりである。
ここでは印刷スプールのPDF化についてのみ焦点を当てて解説することとする。
印刷スプールのPDF化については SpoolライターVer 3.0 を利用することがコスト面や操作面に
おいても優れている。
PDF化のためにAcrobat PDFライターや別のPCサーバーなども
必要でないし、もちろんPCへのダウンロードも必要ない。
すべてのPDF化は iSeries400の内部処理だけで完結するのである。
具体的には Spoolライター Ver 3.0 に提供されている「CVTSPLF」コマンドを使用するだけ
である。
CVTSPLF コマンドは任意の印刷スプールを TEXT / PDF / HTML / Word などに
変換、すなわち電子帳票化して IFS に保管することができる。
下記は CVTSPLFの実行中の様子である。
これさえわかれば後は従来のCLP-CGI と同じである。
CLP のソースを下記に紹介する。
0001.00 PGM
0002.00 /*---------------------------------------------------------*/
0003.00 /* PDPRINTCL : 印刷スプールの PDF 化 */
0004.00 /* */
0005.00 /* この CLP は CGI として呼びだされて */
0006.00 /* RPG : SMPRINT を実行して印刷出力を行います。 */
0007.00 /* 印刷出力の結果は SPOOL ライターによって */
0008.00 /* HTML 化されて直ちにブラウザへ戻されます。 */
0009.00 /* */
0010.00 /*---------------------------------------------------------*/
0011.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(80)
0012.00 DCL VAR(&ENBUFF) TYPE(*CHAR) LEN(2048)
0013.00 DCL VAR(&ENBUFFLN) TYPE(*CHAR) LEN(4)
0014.00 DCL VAR(&ENVARNAME) TYPE(*CHAR) LEN(20) +
0015.00 VALUE('QUERY_STRING')
0016.00 DCL VAR(&ENACTLN) TYPE(*CHAR) LEN(4)
0017.00 DCL VAR(&ENVARLN) TYPE(*CHAR) LEN(4)
0018.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(4) +
0019.00 VALUE(X'00000000') /* 2 進数 */
0020.00 DCL VAR(&FRMCOD) TYPE(*CHAR) LEN(10)
0021.00 DCL VAR(&DTA001) TYPE(*CHAR) LEN(120) +
0022.00 VALUE('CONTENT-TYPE: TEXT/HTML')
0023.00 DCL VAR(&DTA002) TYPE(*CHAR) LEN(120) VALUE(' ')
0024.00 DCL VAR(&DTA003) TYPE(*CHAR) LEN(120) +
0025.00 VALUE('<HTML><HEAD><TITLE> 印刷 CLP</TITL+
0026.00 E>')
0027.00 DCL VAR(&DTA004) TYPE(*CHAR) LEN(120) +
0028.00 VALUE('<META HTTP-EQUIV="CONTENT-TYPE" +
0029.00 CONTENT="TEXT/HTML; CHARSET="X-SJIS">')
0030.00 DCL VAR(&DTA005) TYPE(*CHAR) LEN(120) +
0031.00 VALUE('<META HTTP-EQUIV="REFRESH" +
0032.00 CONTENT="0;URL=HTTP://218.44.135.18/AS400-N+
0033.00 ET.USR/PROJECT/SMPRINT/')
0034.00 DCL VAR(&DTA006) TYPE(*CHAR) LEN(120) +
0035.00 VALUE('</HEAD>')
0036.00 DCL VAR(&DTA007) TYPE(*CHAR) LEN(120) +
0037.00 VALUE('<BODY>')
0038.00 DCL VAR(&DTA008) TYPE(*CHAR) LEN(120) +
0039.00 VALUE('</BODY></HTML>')
0040.00 DCL VAR(&DATA) TYPE(*CHAR) LEN(960)
0041.00 DCL VAR(&HTML) TYPE(*CHAR) LEN(120)
0042.00 DCL VAR(&N) TYPE(*DEC) LEN(4 0) VALUE(1)
0043.00 DCL VAR(&POS) TYPE(*DEC) LEN(4 0) VALUE(1)
0044.00 DCL VAR(&OUTLN) TYPE(*CHAR) LEN(4)
0045.00 DCL VAR(&CRLN) TYPE(*CHAR) LEN(2) VALUE(X'1500')
0046.00 DCL VAR(&OUTPUT) TYPE(*CHAR) LEN(20)
0047.00 DCL VAR(&JOBNBR) TYPE(*CHAR) LEN(6) VALUE('057084'
0048.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
0049.00
0050.00 CHGVAR VAR(&OUTPUT) VALUE('P' *CAT &JOBNBR *TCAT +
0051.00 '.PDF')
0052.00 ADDLIBLE LIB(SPOOLWTR)
0053.00 MONMSG CPF2100
0054.00 /*( ブラウザからの入力値を取得 )*/
0055.00 CHGVAR VAR(%BIN(&ENBUFFLN)) VALUE(2048)
0056.00 CHGVAR VAR(%BIN(&ENACTLN)) VALUE(0)
0057.00 CHGVAR VAR(%BIN(&ENVARLN)) VALUE(12)
0058.00 CALLPRC PRC(QtmhGetEnv) PARM(&ENBUFF &ENBUFFLN +
0059.00 &ENACTLN &ENVARNAME &ENVARLN &APIERR)
0060.00 CHGVAR VAR(&FRMCOD) VALUE(%SST(&ENBUFF 8 10))
0061.00 /*---( 印刷プログラム SMPRINT の実行 )------------------------*/
0062.00 OVRDBF FILE(SHOHIN) TOFILE(QTRFIL/SHOHIN) +
0063.00 OVRSCOPE(*JOB)
0064.00 OVRPRTF FILE(QPRINT) HOLD(*YES) SECURE(*YES) +
0065.00 OVRSCOPE(*JOB)
0066.00 CALL PGM(R520OBJ/SMPRINT) PARM(&FRMCOD)
0067.00 DLTOVR FILE(SHOHIN) LVL(*JOB)
0068.00 /*( SPOOLWTR/CVTSPLF による HTML 変換 )*/
0069.00 SPOOLWTR/CVTSPLF SPLF(QPRINT) +
0070.00 JOB(&JOBNBR/QTMHHTP1/QPRTJOB) +
0071.00 SPLNO(*LAST) OUTPUT(*PDF) OPTION(*IFS) +
0072.00 PAGESIZE(*SPLF) BOOKMARK(*PAGNBR) +
0073.00 TOSTMF(&OUTPUT) +
0074.00 TODIR('/AS400-NET.USR/PROJECT/SMPRINT')
0075.00 /*( 変換後の保管場所にリダイレクト )*/
0076.00 CHGVAR VAR(&DATA) VALUE(&DTA001 *CAT &DTA002 *CAT +
0077.00 &DTA003 *CAT &DTA004 *CAT &DTA005 *CAT +
0078.00 &DTA006 *CAT &DTA007 *CAT &DTA008)
0079.00 CHGVAR VAR(%BIN(&OUTLN)) VALUE(120)
0080.00 LOOP: CHGVAR VAR(&HTML) VALUE(%SST(&DATA &POS 120))
0081.00 IF COND(&N *EQ 5) THEN(DO)
0082.00 CHGVAR VAR(&HTML) VALUE(&HTML *TCAT &OUTPUT *TCAT +
0083.00 '">')
0084.00 ENDDO
0085.00 CHGVAR VAR(&HTML) VALUE(&HTML *TCAT &CRLN)
0086.00 CALLPRC PRC(QtmhWrStout) PARM(&HTML &OUTLN &APIERR)
0087.00 IF COND(&N < 8) THEN(DO)
0088.00 CHGVAR VAR(&N) VALUE(&N + 1)
0089.00 CHGVAR VAR(&POS) VALUE(&POS + 120)
0090.00 GOTO LOOP
0091.00 ENDDO
0092.00 /*( 処理完了すればスプールを削除する。 )*/
0093.00 DLTSPLF FILE(QPRINT) JOB(&JOBNBR/QTMHHTP1/QPRTJOB) +
0094.00 SPLNBR(*LAST)
0095.00 RETURN
0096.00
0097.00 ERROR: RCVMSG RMV(*NO) MSG(&MSG)
0098.00 SNDMSG: SNDPGMMSG MSG(&MSG) TOMSGQ(*SYSOPR) MSGTYPE(*COMP)
0099.00 DSPJOBLOG OUTPUT(*PRINT)
0100.00 ENDPGM
実際に上記のCLPを使ってPDF化の実行を行ってみる。
この リンク をクリックしてHTML画面が表示されたら,そのまま「検索」ボタンを押す。
印刷プログラムが実行されて、結果がPDFしとしてブラウザに表示されることをご確認頂きたい。
左ペインのPage をクリックするとPDFページ全体が表示される。
CVTSPLF によるPDF変換はフォントを MSUIGothic を使用してるので
Acrobat PDFライターによるPDF変換に比べてコンテンツそのものが非常に
明瞭であると同時に
ページ毎のBookマークが追加されている。
Book マークはページ番号以外にも設定が可能である。
Spoolライター Ver 3.0 の「日本語PDFライター」はまだAPW などによる罫線や
倍角印字は
サポートしていない。
今後のリリース・アップの中でサポートされる予定である。
( PC側での変換ではもちろんサポートされている。)
iSeries400ベンダー・ソフトウェア製品の中でも「日本語PDFライター」が
搭載されたのは
初めての試みであると思う。
Spoolライター Ver 3.0 は、これ以外にも「ホスト変換」によって
初めてHPT (Host Print Transform) API を駆動する製品としても他に例を見ない。
インターフェースもHTMLをベースとする MS Outlook Express 風に一新された。
Ver 3.0 はあたかも新製品であるかのように、すべてが進化した。
また「日本語PDFライター」は今後ユーザーの要望に応じて随時拡張の予定である。
なお、読者がPDFの仕様を調べたいのであれば
書籍:アドビシステムズ著「PDFリファレンス第2版」が参考になる。