Excel文書を印刷して作成されたXDW文書から特定文字を取得して文書属性に設定する方法

概要

自社内で作成しているExcel文書を、DocuWorksプリンターに出力して作成されたXDW文書から、特定の文字を取得します。

取得した文字は、文書属性に登録したり、フォルダやファイル名に使用することができます。

今回作成した設定例では、「10_属性設定」フォルダに格納されたXDW文書から「項目名{[値]}」の文字を検索し、取得した文字を属性登録します。

検索して取得ができた場合は「15_属性設定済み」フォルダに、取得できなかった場合は「80_エラー」フォルダに文書を移動します。

また、属性取得ができた場合は、ファイル名を「申請日 + "_" + 申請者 + ".xdw"」に変更します。エラーになったファイルは、取得できなかった項目名をファイル名の先頭に付加して、「項目名 + "取得エラー_" + 元の文書名」とします。

\10_属性設定
文書1.xdw
属性読み取り・属性設定・移動
\15_属性設定済み
20170821_伊藤博文.xdw
エラー移動
\80_エラー
申請者取得エラー_文書1.xdw

Excel文書のセル参照について

Excel文書をDocuWorksプリンターに印刷をして作成されたXDW文書は、テキスト情報を保持しています。しかし、DocuWorksAPIで取得できるテキストは、文字が全て繋がった状態になっています。(改行は削除されています。)

また、文字の順番は見た目上の左上からではなく、セル単位で前後するので、正規表現を使っても目的の文字を特定出来ない場合があります。

そのため、XDW文書から特定の文字を取り出すには、Excel文書に項目名と値を決まった書式で記述する必要があります。

今回作成した設定では、以下のような書式の文字が文書中にあることとします。

項目名1{[値1]} 項目名2{[値2]} 項目名3{[値3]} ・・・

Excelの文書中の取り出しを行いたい項目を、上記の様な書式で記述するために、A1セルに、以下のセル参照を記述しました。

="申請者{[" & E5 & "]} 申請日{[" & IF(T5="","",TEXT(T5,"yyyy/mm/dd")) & "]} 件名{[" & E8 & "]}"

Excel文書のダウンロード

決裁申請書_サンプル.zip

この参照は印刷される文字として出力されますが、印刷されたときに見えないように文字の色を白にしています。

白文字の参照セルはページからはみ出るとデータが消えることがあります。文字の大きさを小さくしたり、参照セルを複数に分けるなどしてページからはみ出ないように調整してください。

IF関数とTEXT関数 (日付のフォーマット)

セルの書式が日付の場合、そのままセルを参照すると、日付を表す数値が取得されてしまいます。印刷する文字は、日付書式(yyyy/mm/dd)で出力したいので、TEXT関数を使って日付をフォーマットします。

また、日付形式のセルが空の場合に、空文字を出力したいので、IF関数を使っています。

IF(T5="","",TEXT(T5,"yyyy/mm/dd"))

設定

設定ファイルは、メニューのファイルの「設定ファイルのフォルダを開く」から開いたフォルダに配置されています。以下のファイルをダウンロードして、上書きするだけで簡単に設定が完了します。(上書きする際は、eDocArrangementを終了した状態で行ってください。)

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

eDocArrangement.zip

属性設定

監視設定

「{%GET_GLOBAL_DATA(TopFolder)}\10_属性設定」フォルダを監視します。

OCR読み取り1

正規表現を使って、「項目名{[値]}」のような文字を検索します。項目名は「(申請者|申請日|件名)」のように正規表現のORを使って列挙します。

以下の内容でOCR読み取りを行います。

ページ「1」を処理する。

正規表現「/(申請者|申請日|件名)\{\[.*?\]\}/g」でマッチオールによる検索を行う。

OCR処理を行わずテキスト抽出のみ行う。

属性設定

OCR読み取りで取得したテキストから、項目名と値を取り出して、ユーザーデータと文書属性に保存します。

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

#すべての属性を設定
{%LOOP L1 {%SYMBOL_COUNT(OCR読み取り1)}(
  {%SET_USER_DATA(属性,{%REGEX_CAPTURE((.+?)\{\[.*?\]\},{%P_DATA(OCR読み取り1.[L_IDX(L1)])})},{%REGEX_CAPTURE(.+?\{\[(.*?)\]\},{%P_DATA(OCR読み取り1.[L_IDX(L1)])})})}
  {%IF({%REGEX_CAPTURE(.+?\{\[(.*?)\]\},{%P_DATA(OCR読み取り1.[L_IDX(L1)])})}=,
  ,
    {%DW_SET_USER_ATTRIBUTE({%REGEX_CAPTURE((.+?)\{\[.*?\]\},{%P_DATA(OCR読み取り1.[L_IDX(L1)])})},{%REGEX_CAPTURE(.+?\{\[(.*?)\]\},{%P_DATA(OCR読み取り1.[L_IDX(L1)])})})}
  )}
)}

属性判定

属性が取得できたかを判定します。「{%SET_USER_DATA(必須項目,申請者,)} 」のように、必須項目の項目名をユーザーデータのキーとしてセットして、直後のループ処理で項目が取得できたかチェックしています。

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

{%SET_USER_DATA(wk,結果,True)}

{%SET_USER_DATA(必須項目,申請者,)}
{%SET_USER_DATA(必須項目,申請日,)}
{%SET_USER_DATA(必須項目,件名,)}

#--

{%LOOP L1 {%GET_USER_DATA_COUNT(必須項目)}(
  {%IF({%GET_USER_DATA(属性,{%GET_USER_DATA_KEY_BY_NUMBER(必須項目,[L_IDX(L1)])})}=,
    {%SET_USER_DATA(wk,結果,False)}
    {%SET_USER_DATA(wk,エラー内容,{%GET_USER_DATA_KEY_BY_NUMBER(必須項目,[L_IDX(L1)])}取得エラー)}
  ,)}
)}

文書移動1

文書を「{%GET_GLOBAL_DATA(TopFolder)}\15_属性設定済み 」に移動する。

ファイル名を「{%GET_USER_DATA(属性,申請日)}_{%GET_USER_DATA(属性,申請者)}.xdw」に変更する。

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

この処理は「{%GET_USER_DATA(wk,結果)}」がTrueの場合に実行する。

文書移動2

文書を「{%GET_GLOBAL_DATA(TopFolder)}\80_エラー 」に移動する。

ファイル名を「{%GET_USER_DATA(wk,エラー内容)}_{%FILE_NAME}」に変更する。

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

フォルダ構成と説明

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

  • C:\Home\Demo\属性設定
    トップフォルダ。
    • 10_属性設定
      監視フォルダ。
      • 決裁申請書_サンプル.xdw
        テスト用のXDW文書。
    • 15_属性設定済み
      処理済みファイルの移動先。
    • 80_エラー
      属性が取得できなかったファイルの移動先。
    • 90_System
      • 90_Log
        ログの出力先。
フォルダ構成のダウンロード(Cドライブのルートに解凍してください。)

属性設定.zip

グローバルデータ

グローバルデータの内容は以下の通りです。トップフォルダを変更する場合は、以下の定義を変更してください。グローバルデータは、メニューのツールのグローバルデータの設定から変更できます。

名前
TopFolder C:\Home\Demo\属性設定