xml:space="preserve">
注文書 9 申し込み書 プラン A
設定例

XDWからPDFに変換 (テキストを持ったPDFを作成)

概要

監視フォルダに格納されたXDW文書を、DocuWorks Viewerを使ってDocuWorks PDFに印刷して、テキストを持ったPDFを作成します。(XDW文書もテキストを持っている必要があります。)

DocuWorks Viewerはコマンド実行時のオプションを指定することで、指定のXDW文書を印刷することができます。

また、DocuWorks PDFやMicorsoft print to PDFプリンターは、ポートにファイル名を指定することで、任意の場所にPDFを出力することができます。

これらの仕様からDocuWorks Viewerをコマンド呼び出しすることで、XDWからPDFへの自動変換ができます。

自動処理ならではの問題

しかし、DocuWorks Viewerは対話方式で使用するアプリケーションのため、エラーなどが発生するとダイアログを表示します。

ダイアログが表示されてしまうケースがあると、ダイアログを閉じることができないため、そこで処理が停止してしまいます。自動処理では致命的な問題となります。

また、DocuWorks PDF等の仮想プリンターは印刷のしくみを利用してPDFファイルを出力します。印刷は非同期で実行されるためエラー処理を行いにくいという問題があります。

問題を回避するアプリケーションの開発

DocuWorks PDFやDocuWorks Viewerを使った自動処理で発生する問題を、極力発生しないように使用して、万一発生した場合でもエラー処理を行うことができるコンソールアプリケーションを開発しました。

printToPdfFromDocuWorksFile 仕様

https://www.technostyle.net/edoc/edocarrangement2/printToPdfFromDocuWorksFile/printToPdfFromDocuWorksFile.html

使用条件などが多いため、リンク先のページの最後にある注意事項をご覧ください。

このコンソールアプリケーションをeDocArrangement2から呼び出すことで、実用レベルの処理が可能になります。

\10_In
決裁申請書.xdw
printToPdfFrom
DocuWorksFile
正常の場合
DocuWorks
Viewer
DocuWorks PDF

で印刷
\20_Out
決裁申請書.pdf
正常の場合
\30_処理済み
決裁申請書.xdw
エラーの場合
\15_Error
決裁申請書.xdw

Windows11のバージョン24H2でプリンターキューを開いた状態でDocuWorks PDFやDocuWorks Viewerを使ってPDF変換を行うと、不完全なPDFが作成される問題が発生しています。この問題についてまとめました。

Windows11のバージョン24H2アップデートによる影響について

https://www.technostyle.net/edoc/edocarrangement2/24h2_printer/index.html

1万ファイルの変換テスト

イメージXDWとテキストを持ったXDWをそれぞれ5000ファイル、計1万ファイルを変換するテストを行いました。

約9.5時間ですべてのファイルの変換に成功しました。

設定の前準備

C:\Homeの下に、以下のような構成でフォルダを作り、準備します。

フォルダ構成のダウンロード

XDWからテキストを持ったPDFに変換_フォルダ構成.zip

Cドライブのルートに解凍してください。

フォルダ構成は以下の通りです。

  • C:\Home\eDocArrangement2\Demo\XDWからテキストを持ったPDFに変換
    • 10_In
      監視フォルダ。
    • 15_Error
    • 20_Out
      PDFの出力先。
    • 30_処理済み
      処理済みxdw文書の移動先。
    • 90_System
      • 10_Temp
        • 10_pdf変換_work
      • 80_Tool
        ここにprintToPdfFromDocuWorksFileを解凍してください。
        • printToPdfFromDocuWorksFile
      • 90_Log

以下から「printToPdfFromDocuWorksFile」をダウンロードして、上記の「\90_System\80_Tool」に解凍してください。

設定ファイル

以下のリンクから完成した設定をダウンロードしていただくことができます。

設定ファイルのダウンロード

XDWからテキストを持ったPDFに変換_設定.zip

以下のフォルダに解凍すると設定が適用されます。

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

バッチ設定

バッチ設定一覧

XDWからテキストを持ったPDFに変換

PDFプリンターを使ったPDF変換

ログ設定

共通ログ設定の内容でログを出力する。

ファイルの繰り返し1

Loop File

メイン画面のファイルリストを対象に繰り返し処理を行う。

ループ毎にユーザーデータをクリアする。但し、以下のユーザーデータはクリアの対象外とする。

result

以下の条件を満たした場合にループを中断する。

{%IF({%GET_U(result,1)}=-1,True,False)}

PDF変換

Macro Execute

以下のマクロを実行する。

#入力フォルダからの相対パスを取得
{%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(属性,コマンド引数)})}

結果判定

Macro Execute

以下のマクロを実行する。

{%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)})}
  )}
,)}

条件分岐1

If

以下の条件を判定して処理を分岐する。

処理階層内のエラー回数が0回。

満たしている場合

If Then

満たしていない場合

If Else

ファイル移動

Move File

文書を以下の通り移動する。

移動元 {%GET(FullPathFileName)}
移動先 {%GET_G(TopFolder)}\15_Error

移動先に同名の文書がある場合は、ファイル名に連番を付与する。

コピー後に削除を行う。

プリンターチェック

スケジューラーには設定していませんが、以下のマクロでプリンターの異常を検知することができます。

ログ設定

共通ログ設定の内容でログを出力する。

プリンターの状態チェック

Macro Execute

以下のマクロを実行する。

{%IF({%PRINTER_IS_ENABLED(DocuWorks PDF)}=False,
  {%WRITE_LOG(DocuWorks PDFが応答不能な状態です。)}
,)}

監視設定(eDocArrangement 2 Schedulerの設定)

スケジュール設定一覧

No.
設定名
実行対象
監視フォルダ
拡張子
下位フォルダ
対象フォルダ(正規表現)
スケジュール
常時ログ出力
オープンチェック
サイズチェック
ファイル取得数制限
実行条件
1
XDWからテキストを持ったPDFに変換
{%GET_G(TopFolder)}\10_In
*.xdw
下位フォルダを対象にする

一定間隔
00:00:10
しない
オープンチェックする。(3秒)
しない
ファイル取得数制限を行う。(3個)
{%PRINTER_IS_ENABLED(DocuWorks PDF)}

ファイル取得数制限

この設定ではprintToPdfFromDocuWorksFileを非同期で呼び出しています。printToPdfFromDocuWorksFileは最大で8プロセスまで印刷を待機するようになっています。

待機しているプロセスは印刷が終わると終了するので減っていきますが、減って行くペース以上に呼び出してしまうと、最大数を超えてしまい、-1の終了コードで処理を行わず終了してしまいます。

そのため、一度に大量のファイルを対象しても大半が処理されないので、ファイル取得数制限を有効にして、一度の監視処理で3個までファイルを処理するように設定しています。

監視条件

この処理では印刷を行うので、プリンタースプーラーサービスが稼働していることが前提条件となっており、監視条件にプリンターの状態が正常の場合に動作するマクロを指定しています。

動作確認

以下の動画をご覧ください。