監視フォルダに格納されたXDW文書を、DocuWorks Viewerを使ってDocuWorks PDFに印刷して、テキストを持ったPDFを作成します。(XDW文書もテキストを持っている必要があります。)
DocuWorks Viewerはコマンド実行時のオプションを指定することで、指定のXDW文書を印刷することができます。
https://opencds-fb.fujifilm.com/gen/docuworks_aux/v9/help/jpn/viewer/2_03_10.html
また、DocuWorks PDFやMicorsoft print to PDFプリンターは、ポートにファイル名を指定することで、任意の場所にPDFを出力することができます。
これらの仕様からDocuWorks Viewerをコマンド呼び出しすることで、XDWからPDFへの自動変換ができます。
しかし、DocuWorks Viewerは対話方式で使用するアプリケーションのため、エラーなどが発生するとダイアログを表示します。
ダイアログが表示されてしまうケースがあると、ダイアログを閉じることができないため、そこで処理が停止してしまいます。自動処理では致命的な問題となります。
また、DocuWorks PDF等の仮想プリンターは印刷のしくみを利用してPDFファイルを出力します。印刷は非同期で実行されるためエラー処理を行いにくいという問題があります。
DocuWorks PDFやDocuWorks Viewerを使った自動処理で発生する問題を、極力発生しないように使用して、万一発生した場合でもエラー処理を行うことができるコンソールアプリケーションを開発しました。
使用条件などが多いため、リンク先のページの最後にある注意事項をご覧ください。
このコンソールアプリケーションをeDocArrangement2から呼び出すことで、実用レベルの処理が可能になります。
Windows11のバージョン24H2でプリンターキューを開いた状態でDocuWorks PDFやDocuWorks Viewerを使ってPDF変換を行うと、不完全なPDFが作成される問題が発生しています。この問題についてまとめました。
https://www.technostyle.net/edoc/edocarrangement2/24h2_printer/index.html
イメージXDWとテキストを持ったXDWをそれぞれ5000ファイル、計1万ファイルを変換するテストを行いました。
約9.5時間ですべてのファイルの変換に成功しました。
C:\Homeの下に、以下のような構成でフォルダを作り、準備します。
フォルダ構成は以下の通りです。
以下から「printToPdfFromDocuWorksFile」をダウンロードして、上記の「\90_System\80_Tool」に解凍してください。
https://www.technostyle.net/edoc/edocarrangement2/printToPdfFromDocuWorksFile/index.html
以下のフォルダに解凍すると設定が適用されます。
C:\Users\ユーザー名\AppData\Roaming\TechnoStyle\eDocArrangement2
グローバルデータの内容は以下の通りです。
名前 | 値 |
---|---|
TopFolder |
C:\Home\eDocArrangement2\Demo\XDWからテキストを持ったPDFに変換 |
printToPdfFromDocuWorksFile |
{%GET_G(TopFolder)}\90_System\80_Tool\printToPdfFromDocuWorksFile\printToPdfFromDocuWorksFile.exe |
SystemFolder |
{%GET_G(TopFolder)}\90_System |
TempFolder |
{%GET_G(SystemFolder)}\10_Temp |
PDFプリンターを使ったPDF変換
共通ログ設定の内容でログを出力する。
メイン画面のファイルリストを対象に繰り返し処理を行う。
ループ毎にユーザーデータをクリアする。但し、以下のユーザーデータはクリアの対象外とする。
result
以下の条件を満たした場合にループを中断する。
{%IF({%GET_U(result,1)}=-1,True,False)}
以下のマクロを実行する。
#入力フォルダからの相対パスを取得 {%SET_U(属性,相対パス,{%REGEX_CAPTURE({%ESCAPE_REGEX({%GET_G(TopFolder)}\10_In)}(.+),{%GET(FolderPath)})})} #変換先フォルダ {%SET_U(属性,変換先,{%GET_G(TopFolder)}\20_Out{%GET_U(属性,相対パス)})} #処理済み正常フォルダ {%SET_U(属性,処理済み正常,{%GET_G(TopFolder)}\30_処理済み{%GET_U(属性,相対パス)})} #処理済みエラーフォルダ {%SET_U(属性,処理済みエラー,{%GET_G(TopFolder)}\15_Error)} #変換用作業フォルダ {%SET_U(属性,変換Work,{%GET_G(TempFolder)}\10_pdf変換_work)} #コマンド実行結果ファイルのパス {%SET_U(属性,ResultPath,{%GET_G(TempFolder)}\result.txt)} #XDWからPDF変換 コマンド引数 {%SET_U(属性,コマンド引数,{%REPLACE( -i "{%GET(FullPathFileName)}" -o "{%GET_U(属性,変換先)}\{%GET(FileNameWithoutExtension)}.pdf" -p "DocuWorks PDF" -async -mdtw -ppto 20 -ftwto -sdf "{%GET_U(属性,処理済み正常)}" -fdf "{%GET_U(属性,処理済みエラー)}" -slf "{%GET_G(SystemFolder)}\90_Log\CommandLog\Log_{%DATE(yyyyMMdd)}.txt" -flf "{%GET_G(SystemFolder)}\90_Log\CommandLog\ErrorLog_{%DATE(yyyyMMdd)}.txt" -wf "{%GET_U(属性,変換Work)}" -z "{%GET_U(属性,ResultPath)}" ,<CrLf>, )})} #コマンド実行 {%COMMAND({%GET_G(printToPdfFromDocuWorksFile)},{%GET_U(属性,コマンド引数)})}
以下のマクロを実行する。
{%READ_FILE({%GET_U(属性,ResultPath)},result,SJIS,LINE)} #結果ファイルの1行目の終了コードを判定 {%IF({%GET_U(result,1)}!=0, {%IF({%REGEX_CAPTURE((非同期プロセス数が上限に達しています),{%GET_U(result,2)})}!=, #非同期プロセス数が上限に達していますの場合 , #結果ファイルの2行目のエラーメッセージでエラーを発生させる {%RAISE_ERROR({%GET_U(result,2)})} )} ,)}
以下の条件を判定して処理を分岐する。
処理階層内のエラー回数が0回。
文書を以下の通り移動する。
移動元 | {%GET(FullPathFileName)} |
---|---|
移動先 | {%GET_G(TopFolder)}\15_Error |
移動先に同名の文書がある場合は、ファイル名に連番を付与する。
コピー後に削除を行う。
スケジューラーには設定していませんが、以下のマクロでプリンターの異常を検知することができます。
共通ログ設定の内容でログを出力する。
以下のマクロを実行する。
{%IF({%PRINTER_IS_ENABLED(DocuWorks PDF)}=False, {%WRITE_LOG(DocuWorks PDFが応答不能な状態です。)} ,)}
この設定ではprintToPdfFromDocuWorksFileを非同期で呼び出しています。printToPdfFromDocuWorksFileは最大で8プロセスまで印刷を待機するようになっています。
待機しているプロセスは印刷が終わると終了するので減っていきますが、減って行くペース以上に呼び出してしまうと、最大数を超えてしまい、-1の終了コードで処理を行わず終了してしまいます。
そのため、一度に大量のファイルを対象しても大半が処理されないので、ファイル取得数制限を有効にして、一度の監視処理で3個までファイルを処理するように設定しています。
この処理では印刷を行うので、プリンタースプーラーサービスが稼働していることが前提条件となっており、監視条件にプリンターの状態が正常の場合に動作するマクロを指定しています。
以下の動画をご覧ください。