CL

26. すべてのOS/400 Ver で印刷スプールを PDF 化するには?

それではいよいよ印刷スプールを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
【 PDF化の実行 】

実際に上記のCLPを使ってPDF化の実行を行ってみる。
この リンク をクリックしてHTML画面が表示されたら,そのまま「検索」ボタンを押す。
印刷プログラムが実行されて、結果がPDFしとしてブラウザに表示されることをご確認頂きたい。
左ペインのPage をクリックするとPDFページ全体が表示される。
CVTSPLF によるPDF変換はフォントを MSUIGothic を使用してるので
Acrobat PDFライターによるPDF変換に比べてコンテンツそのものが非常に 明瞭であると同時に
ページ毎のBookマークが追加されている。
Book マークはページ番号以外にも設定が可能である。

【 日本語PDFライター on Spoolライターについて 】

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版」が参考になる。