初めて 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 --------------------------------------------------------------------------------------------