初めて Web化を行うときに「印刷はどのようにするのか?」という疑問は最も多い質問のひとつです。
印刷指示プログラムを起動するだけなら従来の5250エミュレータと同じですから、どこかの
印刷待ち行列(OUTQ) に印刷スプールが出力されますので、印刷業務が動作しない
というわけではありません。
しかし多くの適用業務は端末名等で OUTQ を割り振っている場合は Web では端末名を
固定することができませんので省略時のプリンター(OUTQ) に印刷スプールが出力されてしまいます。
これに対して構内でAutoWebを使用している場合は端末名も固定することができますので
従来どおりの OUTQ に印刷スプールを出力することができます。
ここでは AutoWeb ではなく、一般的な Webで遠隔地であっても処理可能な印刷の方法を紹介します。
Webでの印刷は、
【印刷スプールを、PDF に変換して、PDF をブラウザにリダイレクトする。】
という手法が一般的に用いられます。
つまり印刷スプールを動的に、その場で PDF化して、IFS に一時保存してその場所のリンクをブラウザに
戻すだけです。
( PDF化を行うには Spoolライター Ver4.0 が必要となります。)
ブラウザにPDFが表示されてしまえば PDFリーダーによって、ユーザーはローカルのプリンターに
印刷することもできますし、ローカルPCに PDFを保存することもできます。
このような印刷の仕組みを作成するには、CLP による CGI で実現することができます。
CGI は、どのような言語であってもかまわないのですが、CLP によるCGI が、この場合は最も簡単です。
既存のRPG 等による印刷プログラムは一切、変更する必要はありません。
CLP-CGI が、既存の印刷プログラムを呼び出して、実行し、その後に Spoolライターによって
印刷スプールを PDF に変換し、変換したPDFの名前を HTMLに埋め込んで、ブラウザに戻します。印刷スプールは PDFに変換後、ただちに消去されます。
このサンプルを実行するには Adobe Acrobat Reader が必要です。
Adobe Acrobat Reader はこちらから無料でダウンロードできます。
1.印刷の実行
画面が表示されましたら、そのままで「実行」ボタンを押して
印刷を指示してください。
2.印刷結果の表示
印刷結果が ブラウザ内に Acrobat Reader で PDF として
表示されます。
(画像は Acrobat Reader Ver.8.0 です)
プレビュー画面内のツールバーで「印刷」や「保存」を
実行できます。
■印刷指示のための CLP-CGI
■ サンプルソース: http://218.44.135.18/QSYS.LIB/PGMRLIB.LIB/QCLLESRC.FILE/PRINTER.MBR
--------------------------------------------------------------------------------------------
0001.00 PGM
0002.00 /*-------------------------------------------------------------------*/
0003.00 /* PRINTER : WORKSHOP 印刷のサンプル CLP-CGI */
0004.00 /* */
0005.00 /* CRTCLMOD QTEMP/PRINTER SRCFILE(MYSRCFILE/QCLLESRC) AUT(*ALL) */
0006.00 /* CRTPGM CGIBIN/PRINTER MODULE(QTEMP/PRINTER) */
0007.00 /* BNDSRVPGM(ASNET.COM/RPGENGINE5) ACTGRP(*NEW) AUT(*ALL)*/
0008.00 /* */
0009.00 /*-------------------------------------------------------------------*/
0010.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(80)
0011.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1)
0012.00 DCL VAR(&USER) TYPE(*CHAR) LEN(10) +
0013.00 VALUE('QTMHHTTP ')
0014.00 DCL VAR(&JOB) TYPE(*CHAR) LEN(10) +
0015.00 VALUE('AURORA_EGN')
0016.00 DCL VAR(&JOBNBR) TYPE(*CHAR) LEN(6)
0017.00 DCL VAR(&HNSFROM) TYPE(*CHAR) LEN(4) /* +
0018.00 品種コード FROM */
0019.00 DCL VAR(&HNSEND) TYPE(*CHAR) LEN(4) /* +
0020.00 品種コード END */
0021.00 DCL VAR(&SHFROM) TYPE(*CHAR) LEN(10) /* +
0022.00 商品コード FROM */
0023.00 DCL VAR(&SHEND) TYPE(*CHAR) LEN(10) /* +
0024.00 商品コード END */
0025.00 DCL VAR(&VALUE) TYPE(*CHAR) LEN(256)
0026.00 DCL VAR(&FIELD) TYPE(*CHAR) LEN(48)
0027.00 DCL VAR(&HTML) TYPE(*CHAR) LEN(256) +
0028.00 VALUE('/AS400-NET.USR/PROJECT/PRINTER/PRINT+
0029.00 ER.HTML')
0030.00 DCL VAR(&NULL) TYPE(*CHAR) LEN(1) VALUE(X'00')
0031.00 DCL VAR(&PDF_FILE) TYPE(*CHAR) LEN(48)
0032.00 DCL VAR(&FLD) TYPE(*CHAR) LEN(20) +
0033.00 VALUE('$(PDF_FILE)')
0034.00 DCL VAR(&RTN) TYPE(*CHAR) LEN(5)
0035.00 DCL VAR(&DATETIME) TYPE(*CHAR) LEN(20)
0036.00 DCL VAR(&DATE) TYPE(*CHAR) LEN(6)
0037.00 DCL VAR(&TIME) TYPE(*CHAR) LEN(6)
0038.00 DCL VAR(&HH) TYPE(*DEC) LEN(2 0)
0039.00 DCL VAR(&HHC) TYPE(*CHAR) LEN(2)
0040.00 DCL VAR(&MM) TYPE(*DEC) LEN(2 0)
0041.00 DCL VAR(&MMC) TYPE(*CHAR) LEN(2)
0042.00 DCL VAR(&SS) TYPE(*DEC) LEN(2 0)
0043.00 DCL VAR(&SSC) TYPE(*CHAR) LEN(2)
0044.00 DCL VAR(&DIR) TYPE(*CHAR) LEN(256)
0045.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))
0046.00
0047.00 /*-------------------------------------------------------------*/
0048.00 /*( 1 ) HTML からの入力値を取得する */
0049.00 /*-------------------------------------------------------------*/
0050.00 ADDLIBLE LIB(SPOOLWTR)
0051.00 MONMSG CPF2100
0052.00 RTVJOBA TYPE(&TYPE) DATETIME(&DATETIME)
0053.00 CHGVAR VAR(&DATE) VALUE(%SST(&DATETIME 3 6))
0054.00 CHGVAR VAR(&TIME) VALUE(%SST(&DATETIME 9 6))
0055.00 CALLPRC PRC(CGIPARM) PARM(('HNSFROM')) +
0056.00 RTNVAL(&VALUE)
0057.00 CHGVAR VAR(&HNSFROM) VALUE(&VALUE)
0058.00 CALLPRC PRC(CGIPARM) PARM(('HNSEND')) +
0059.00 RTNVAL(&VALUE)
0060.00 CHGVAR VAR(&HNSEND) VALUE(&VALUE)
0061.00 CALLPRC PRC(CGIPARM) PARM(('SHFROM')) +
0062.00 RTNVAL(&VALUE)
0063.00 CHGVAR VAR(&SHFROM) VALUE(&VALUE)
0064.00 CALLPRC PRC(CGIPARM) PARM(('SHEND')) +
0065.00 RTNVAL(&VALUE)
0066.00 CHGVAR VAR(&SHEND) VALUE(&VALUE)
0067.00
0068.00 /*-------------------------------------------------------------*/
0069.00 /*( 2 ) 印刷プログラム PGM202 を呼び出して実行する */
0070.00 /*-------------------------------------------------------------*/
0071.00 OVRPRTF FILE(QPRINT) HOLD(*YES) SECURE(*YES) +
0072.00 OVRSCOPE(*JOB)
0073.00 OVRDBF FILE(LSHOHNS) TOFILE(QTRFIL/LSHOHNS) +
0074.00 SECURE(*YES) OVRSCOPE(*JOB)
0075.00 OVRDBF FILE(HINSHU) TOFILE(QTRFIL/HINSHU) +
0076.00 SECURE(*YES) OVRSCOPE(*JOB)
0077.00 CALL PGM(QTROBJ/PGM202) PARM(&HNSFROM &HNSEND +
0078.00 &SHFROM &SHEND)
0079.00 DLTOVR FILE(QPRINT LSHOHNS HINSHU) LVL(*JOB)
0080.00
0081.00 /*-------------------------------------------------------------*/
0082.00 /*( 3 ) QPRTJOB の JOB 番号を検索する */
0083.00 /*-------------------------------------------------------------*/
0084.00 CALL PGM(ASNET.COM/PRTJOBNO) PARM(&USER &JOBNBR)
0085.00 /*-------------------------------------------------------------*/
0086.00 /*( 4 ) SPOOL ライターによって PDF に変換して IFS に保管する */
0087.00 /*-------------------------------------------------------------*/
0088.00 CHGVAR VAR(&PDF_FILE) VALUE('PDF' *CAT &JOBNBR +
0089.00 *TCAT '.PDF')
0090.00 SPOOLWTR/CVTSPLF SPLF(QPRINT) JOB(&JOBNBR/&USER/&JOB) +
0091.00 SPLNO(*LAST) OUTPUT(*PDF) OPTION(*IFS) +
0092.00 TOSTMF(&PDF_FILE) +
0093.00 TODIR('/AS400-NET.USR/PROJECT/PRINTER')
0094.00 DLTSPLF FILE(QPRINT) JOB(&JOBNBR/&USER/&JOB) +
0095.00 SPLNBR(*LAST)
0096.00 RMVLIBLE SPOOLWTR
0097.00
0098.00 /*-------------------------------------------------------------*/
0099.00 /*( 5 ) リダイレクト用の HTML テンプレートをオープンする */
0100.00 /*-------------------------------------------------------------*/
0101.00 CALLPRC PRC(OPENHTML) PARM((&HTML *BYVAL)) RTNVAL(&RTN)
0102.00
0103.00 /*-------------------------------------------------------------*/
0104.00 /*( 6 ) PDF の名前を HTML テンプレートにセットする */
0105.00 /*-------------------------------------------------------------*/
0106.00 CHGVAR VAR(&VALUE) VALUE(&PDF_FILE)
0107.00 CALLPRC PRC(SETFLD) PARM((&FLD *BYVAL) (&VALUE *BYVAL))
0108.00
0109.00 /*-------------------------------------------------------------*/
0110.00 /*( 7 ) HTML テンプレートをブラウザに送出して完了 */
0111.00 /*-------------------------------------------------------------*/
0112.00 CALLPRC PRC(WRITE)
0113.00
0114.00 /*-------------------------------------------------------------*/
0115.00 /*( 8 ) 10 分後に PDF を削除するように SBMJOB */
0116.00 /*-------------------------------------------------------------*/
0117.00 CHGVAR VAR(&HH) VALUE(%SST(&TIME 1 2))
0118.00 CHGVAR VAR(&MM) VALUE(%SST(&TIME 3 2))
0119.00 CHGVAR VAR(&SS) VALUE(%SST(&TIME 5 2))
0120.00 CHGVAR VAR(&MM) VALUE(&MM + 10)
0121.00 IF COND(&MM >= 60) THEN(DO)
0122.00 CHGVAR VAR(&HH) VALUE(&HH + 1)
0123.00 CHGVAR VAR(&MM) VALUE(1)
0124.00 ENDDO
0125.00 CHGVAR VAR(&HHC) VALUE(&HH)
0126.00 CHGVAR VAR(&MMC) VALUE(&MM)
0127.00 CHGVAR VAR(&SSC) VALUE(&SS)
0128.00 CHGVAR VAR(&TIME) VALUE(&HHC *CAT &MMC *CAT &SSC)
0129.00 CHGVAR VAR(&DIR) +
0130.00 VALUE('/AS400-NET.USR/PROJECT/PRINTER/' +
0131.00 *CAT &PDF_FILE)
0132.00 SBMJOB CMD(RMVLNK OBJLNK(&DIR)) JOB(RMVLNK) +
0133.00 SCDDATE(&DATE) SCDTIME(&TIME) MSGQ(*NONE)
0134.00 RETURN
0135.00
0136.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG)
0137.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */
0138.00 SNDPGMMSG MSG(&MSG) TOMSGQ(*SYSOPR) MSGTYPE(*COMP)
0139.00 ENDDO /* バッチ */
0140.00 ELSE CMD(DO) /* 対話式 */
0141.00 SNDPGMMSG MSG(&MSG) MSGTYPE(*DIAG)
0142.00 ENDDO /* 対話式 */
0143.00 ENDPGM
--------------------------------------------------------------------------------------------