Print formだけではPDFに出力できない?

Print formで印刷すると、プリンタに出力される。以前から特にエラーにはならない。なのでPrint formすれば印刷はされている、と思い込んでいた。今回、「ボタンが押されたら画面の内容をPDFに出力してその結果をサーバに転送する」という処理を実装した。結果はNG。まずWindowsとmacOSでNG加減が違った。Windowsはエラーメッセージが表示されるが、macOSではノーエラー。ただしよく見るとmacOSでも処理は完了していない。でき上がったはずのPDFが0バイトになっていてサーバに転送されていない。

正しくは、Print formする前にOPEN PRINTING JOB、実行後にCLOSE PRINTING JOBを実行する。

印刷という処理は、OS側に投げかける非同期処理であるため、完了のタイミングが捕まえにくい。どうやらクローズすることでPDFファイルは作成されるようだ。次の例は[SHOSHI}テーブルの「SH57_Print」フォームをPDFに印刷するコード。

//zz_print_toPDF
//20250827 wat
//printのマナーが変わっていた
//OPEN PRINTING JOBで囲むようにして、モジュール化

C_TEXT($1; $pdf_path)
$pdf_path:=$1
C_TEXT($pdfprintername)

If (Is macOS)
	//macOS
	SET PRINT OPTION(Destination option; 3; $pdf_path)
	
	OPEN PRINTING JOB
	Print form([SHOSHI]; "SH57_Print"; Form detail)
	CLOSE PRINTING JOB
	
Else 
	//Windows
	$pdfprintername:="Microsoft Print to PDF"
	ARRAY TEXT($aryPrinterName; 0)
	PRINTERS LIST($aryPrinterName)
	If (Find in array($aryPrinterName; $pdfprintername)>0)
		SET CURRENT PRINTER($pdfprintername)
		SET PRINT OPTION(Destination option; 2; $pdf_path)
		
		OPEN PRINTING JOB
		Print form([SHOSHI]; "SH57_Print"; Form detail)
		CLOSE PRINTING JOB
		
		SET CURRENT PRINTER("")
	End if 
End if 

これにより、あとに続く処理でサーバに送信、作成したPDFをサーバにアップロードすることができた。

テーブル名とフォーム名は引数で渡すといいだろう。次のように修正して修正版をJCLメソッドとした。

//JCL_print_toPDF
//20251008 wat
//テーブルフォームを使って、Print formでPDFに出力。OPEN PRINTING JOBで囲むようにして、モジュール化

C_TEXT($1; $pdf_path)
$pdf_path:=$1
C_POINTER($2;$tblPtr)
$tblPtr:=$2
C_TEXT($3;$frmName)
$frmName:=$3
C_TEXT($pdfprintername)

If (Is macOS)
	//macOS
	SET PRINT OPTION(Destination option; 3; $pdf_path)
	
	OPEN PRINTING JOB
	Print form($tblPtr->; $frmName; Form detail)
	CLOSE PRINTING JOB
	
Else 
	//Windows
	$pdfprintername:="Microsoft Print to PDF"
	ARRAY TEXT($aryPrinterName; 0)
	PRINTERS LIST($aryPrinterName)
	If (Find in array($aryPrinterName; $pdfprintername)>0)
		SET CURRENT PRINTER($pdfprintername)
		SET PRINT OPTION(Destination option; 2; $pdf_path)
		
		OPEN PRINTING JOB
		Print form($tblPtr->; $frmName; Form detail)
		CLOSE PRINTING JOB
		
		SET CURRENT PRINTER("")
	End if 
End if 

JCL_print_toPDF