月1,400〜2,400枚のFAX注文書(新刊予約)を Gemini Vision で自動読取し、書店マスタ23,505件と照合してTHINKs一括入力用Excelを生成する。松本課長の手入力工数を「数十時間/月 → 30分/日」に圧縮する。
FAX 注文書(新刊予約)の処理を「人手で読んで手入力」から「Pythonが自動読取してExcel出力 → 人は要確認のみ目視」に転換する。完全無人運用ではなく、人間が最後のチェッカーに残る設計。
共有フォルダに届くFAX (PDF / DocuWorks .xdw) を検知 → Gemini Vision OCR → 書店マスタ照合 → THINKs 一括入力用 Excel に追記。松本課長は Excel を THINKs 画面に貼り付けるだけ。
OCR が読み取った書店コード or 書店名を、取次マスタの5段階フォールバック照合で補正。書店コード精度はほぼ 100%。OCR で多少の誤読があっても自動で正しいコードに着地する。
担当者欄は手書きの走り書きが多く OCR 精度が最も低い箇所。「1文字/英数字のみ/カタカナのみ/『様』含む/異体字含む」の5ルールで明らかな誤読を ファックス に統一。「デタラメよりはファックスの方がマシ」という松本課長合意ベース。
予約数 = 1(空欄との混同リスク)・書店コード/名前不一致・信頼度<70% など、要注意レコードに ⚠️ フラグを自動付与。松本課長は「全件確認」ではなく「フラグ付きだけ確認」で済む。
共有フォルダの実態は .xdw 形式。xdwlib (PyPI) + Windows 同梱の XDWAPI.DLL で GUI を一切起動せず .xdw → PDF 変換。DocuWorks Desk の手動印刷も追加ライセンスも不要。
大和書房社内に置いた小型PC上で Python / Windows Task Scheduler が朝 8 時に起動。共有フォルダ監視 → OCR → Excel 追記 → 完了通知(メール/Slack)まで自動。RDP で名古屋から保守可能。
FAX 着信から THINKs 入力まで、3 層(営業現場 → 大和PC上の自動処理 → 松本課長の確認)で完結する。VPN 不要、外部サーバなし、追加ライセンス費 0 円。
flowchart TB
subgraph external["① 営業現場 / 外部"]
fax["✅ 複合機
FAX 受信"]
shop["書店
新刊予約 FAX 送信"]
end
subgraph share["② 大和書房 社内共有フォルダ (Synx)"]
input["✅ 入力前データ
.xdw / .pdf"]
pending["🟡 _pending_xdw/
(現在は xdw を退避)"]
done["✅ 入力済データ
処理済原本"]
end
subgraph pc["③ 大和PC (NucBox4) — Python 自動処理"]
watcher["✅ file_watcher
(watchdog)"]
xdw["🟡 xdwlib_convert
.xdw → .pdf"]
ocr["✅ OCR v7.4
Gemini 2.0-flash"]
master["✅ 書店マスタ照合
23,505件"]
excel["✅ Excel 追記
order_ocr_master.xlsx"]
notifier["🟡 通知
(メール/Slack)"]
end
subgraph user["④ 松本課長 (RDP or 直接)"]
review["人間チェック
Wフラグだけ目視"]
thinks["✅ THINKs 一括入力
(コピペ)"]
end
shop -->|FAX 送信| fax
fax -->|自動転送| input
input -->|.xdw 検知| watcher
input -->|.pdf 検知| watcher
watcher --> xdw
xdw --> ocr
ocr --> master
master --> excel
excel --> notifier
notifier -.->|要確認通知| user
excel --> review
review --> thinks
watcher -->|処理済原本退避| done
松本課長が日次で見る Excel ファイル。「入力中」シートに新規行が追記され、Wチェックフラグだけ確認 → THINKs 画面の取次×書誌ごとに A〜C 列をコピペ。
本Phase 1 では 3 つの登場人物。営業現場(FAX を送る書店)はシステムには現れない。
order_ocr_master.xlsx を開くFAX 着信から Excel 追記まで、1 件あたり 30 秒〜2 分。Gemini API 呼び出し回数を最小化するため、信頼度が低いページのみ Gemini 2.5-pro に再スキャンする 2 段構成。
sequenceDiagram
autonumber
actor shop as 書店
participant fax as 複合機
(FAX)
participant share as 共有フォルダ
(Synx)
participant watcher as file_watcher
(watchdog)
participant xdw as xdwlib_convert
participant ocr as OCR v7.4
participant gem as Gemini Vision
(2.0-flash → 2.5-pro)
participant mst as 書店マスタ
(23,505件)
participant xlsx as order_ocr
_master.xlsx
participant matsu as 松本課長
rect rgb(245,245,250)
Note over shop,share: 受信フェーズ
shop->>fax: 新刊予約 FAX
fax->>share: .xdw 自動保存
end
rect rgb(245,250,245)
Note over watcher,xlsx: 自動処理フェーズ(朝 8:00 起動 or リアルタイム)
share-->>watcher: 新規ファイル検知
watcher->>watcher: ファイルサイズ安定待ち
watcher->>xdw: .xdw を渡す
xdw->>xdw: XDWAPI で PDF 化
xdw->>ocr: .pdf を渡す
ocr->>gem: 2.0-flash で各ページ OCR
gem-->>ocr: JSON(書店コード/予約数/担当者)
alt 全0 or 全同値 or 名前不一致
ocr->>gem: 2.5-pro で再スキャン
gem-->>ocr: 高精度結果
end
ocr->>mst: 5段階フォールバック照合
mst-->>ocr: 補正済み書店コード
ocr->>xlsx: 「入力中」シートに追記
xlsx->>xlsx: Wチェックフラグ判定
end
rect rgb(250,247,240)
Note over xlsx,matsu: 確認フェーズ
xlsx-->>matsu: 処理完了通知(メール/Slack)
matsu->>xlsx: 「要確認」を目視
matsu->>matsu: THINKs に貼付
end
v7.4 で確定した出力 Excel の列定義。A〜C 列が THINKs 入力用、D 列が要確認フラグ、E〜M 列が参考情報・デバッグ用。
| 列 | 項目 | 用途 | 出元 |
|---|---|---|---|
| A | 書店コード | THINKs 入力用 | マスタ照合の最終結果 |
| B | 予約数 | THINKs 入力用 | Gemini OCR 出力 |
| C | 担当者名 | THINKs 入力用 | 5ルールフィルタ後の値(誤読は ファックス) |
| D | Wチェックフラグ | ⚠️ 要確認の理由 | 予約数1 / コード名前不一致 / 信頼度<70% etc |
| E | 書籍名 | 参考 | FAX ヘッダ部から抽出 |
| F | 書籍コード(5桁) | 参考 | 単行本1点は ISBN 末尾5桁 |
| G | 取次名 | 参考 | マスタB列の取次コード(101=日販、102=トーハン暫定) |
| H | 原本パス | 松本課長確認用 | 共有FDの PDF へのハイパーリンク |
| I | 書店名(OCR) | デバッグ | Gemini が読んだ生テキスト |
| J | 書店名(マスタ) | デバッグ | マスタ照合の結果 |
| K | 照合方法 | デバッグ | exact / name+code_cross / exact_name_mismatch 等 |
| L | 備考 | 履歴 | Pro 参考値 / 担当者変換前の値 |
| M | FAXタイプ | 分類 | 単行本1点 / 単行本一覧 / 文庫一覧 |
2026-03-23 v7.0(THINKSフォーマット対応)から始まり、4/6 までに v7.4 まで進化。書店コード精度はほぼ 100%、予約数は90〜95%、担当者名は2〜3割(残りは ファックス 自動変換)。
| バージョン | 追加機能 | 結果 |
|---|---|---|
v7.0 | THINKSフォーマット対応 / 0件ページ残し / 取次名追加 / 書籍コード5桁追加 | 基本要件達成 |
v7.1 | Gemini 2.5-flash 試行 + 全0は Pro 再スキャン | 2.5-flash は 2.0-flash より精度低 → 2.0-flash に回帰 |
v7.2 | 2.0-flash 回帰 + 1判定プロトコル + Pro 再スキャン拡張(全0/全同値/0含み) | 空ページ0件達成。ただし p1 [0,1,0] が Pro [1,1,1] で改悪 |
v7.3 | セル単位クロップOCR(OpenCV) | セル座標取得不安定 → 無効化 |
v7.3b | 担当者名 5 ルールフィルタ + A3方式(0含みは Flash 維持) | 担当者 72 件をファックス変換、p1 [0,1,0] 保護 |
v7.4 | 書店名不一致時 Pro 再スキャン + Wチェックフラグ + 書籍名追加 | 最終版。マスタ照合 96% 達成 |
flowchart LR
s1["1️⃣ exact
コード完全一致"] --> s2["2️⃣ exact_name
書店名完全一致"]
s2 --> s3["3️⃣ fuzzy_name
類似度80%以上"]
s3 --> s4["4️⃣ name+code_cross
名前+末尾2桁照合"]
s4 --> s5["5️⃣ unmatched
マスタ無し"]
s1 -.->|名前<50%| warn["⚠️ exact_name_mismatch
→ Pro 再スキャン"]
| # | ルール | 該当例 | 理由 |
|---|---|---|---|
| 1 | 1 文字 | 在、中、梯、榛、棟 | 名前として不完全 or 注文書デフォルト記載の誤読 |
| 2 | 英数字のみ | MC、2 | 名前ではない |
| 3 | カタカナのみ | サイトウ | OCR 読み取り不安定 |
| 4 | 「様」含む | いぬい様 | 注文書テンプレートの一部 |
| 5 | 異体字含む | 山下檢、トラ械 | 明らかに誤読 |
→ 82 件中 72 件を ファックス に自動変換。正しい名前(三宅、塚田、吉岡、阿部)は保持。
| Flash 結果パターン | 動作 | 狙い |
|---|---|---|
[0, 0, 0] 全0 | Pro に差し替え | FAX 自体が空ページかもしれないが、要確認 |
[n, n, n] 全同値 | Pro に差し替え | Flash の引きずられ誤読の可能性 |
[x, 0, y] 0含み | Flash 維持、Pro は備考のみ | p1 で正解 [0,1,0] が Pro [1,1,1] に改悪された事例の保護 |
複合機 → 共有フォルダの実態は .xdw(DocuWorks 独自形式)。当初 DWVIEWER.EXE のサイレント印刷を採用予定だったが、実機検証で NG → xdwlib + Windows 同梱 XDWAPI.DLL 方式に最終決定。
C:\Windows\System32\xdwapi.dll(311関数Export)が大和PCに既にインストール済みと判明。xdwlib (PyPI) でラップして doc.export_image(format='PDF') 一発で PDF 化できる。GUI 一切起動せず、追加ライセンス不要。import xdwlib
doc = xdwlib.xdwopen(r"\\192.168.1.114\共有\...\20260417135024.xdw")
doc.export_image(0, r"C:\tmp\out.pdf",
pages=doc.pages, dpi=300, color="COLOR", format="PDF")
doc.close()
| 出力形式 | サイズ | 用途 | 採否 |
|---|---|---|---|
| PDF (300dpi COLOR 全ページ) | 1.0 MB | ⭐ 既存 v7.4 パイプライン互換 | ◎ 採用 |
| TIFF (300dpi MONO) | 1.1 MB | OCR 専用ならコンパクト | ○ 代替 |
| JPEG (300dpi COLOR) | 1.0 MB | Gemini 直接投入も可 | ○ 代替 |
| BMP (300dpi) | 27 MB | 大きすぎ | × |
DWVIEWER.EXE /p /t "DocuWorks PDF" を実機で試行 → GUI 起動扱いでタイムアウト、印刷キューにも投入されず。DWVIEWER /? のヘルプフラグですら timeout(=CLI 非対応)。/p /t は DocuWorks 9.x 以前のみ対応、10.x で廃止された可能性→ プリンタ自動保存設定の追求は中止。xdwlib 採用で完全に回避。
| 方式 | コスト | 採否 | 備考 |
|---|---|---|---|
| DocuWorks Desk 手動印刷 | 人件費(月3.3h) | 緊急時保険 | 松本課長が朝一括 PDF 化 → 後段は自動 |
| printToPdfFromDocuWorksFile (eDocArrangement) | 有償(数万円) | 第2保険 | xdwlib NG時のフォールバック |
| PDFオートコンバータEX | 年30万円 | 不採用 | コスト過大 |
| 紙スキャン運用 | 現場負荷増 | 不採用 | OCR 精度劣化 |
2026-04-05 時点の正解データ突合結果。書店コードは事実上 100%、予約数は手書きの 0/1 混同のみが残課題、担当者は ファックス 変換で「明示的にわからない」が判明する設計。
77 件のテストデータで 全件正解。OCR で多少誤読されても 5 段階マスタ照合で補正される。実質、新刊予約注文の自動入力で最も価値の高い列。
手書きの 0 と 1 の混同(空欄か「1」か)のみが残課題。該当レコードには Wチェックフラグを自動付与し、松本課長が原本リンクで確認できる仕組み。
手書きの走り書きが多く、最も読取困難。5 ルールフィルタで誤読は ファックス に統一。「デタラメよりはファックスのほうがマシ」という松本課長合意。
v6.1 基準の 52 件中 50 件成功。書店コードと書店名のクロスチェックで、コードだけ合っていて別店舗になる事故も検知(exact_name_mismatch)。
v7.2 で達成。送信されたページは全て出力に残る。「送ってくれたのに何もなかったことにされる」(廣瀬本部長)事故を構造的に防止。
マスタ完全一致: Gemini 68% / Claude 46%。空ページ救出は Claude 優位だが、書店コード精度は Gemini が圧勝。メインエンジンは Gemini で確定。
| コード | 取次名 | 件数 | 確度 |
|---|---|---|---|
| 101 | 日販 | 9,924 | ◎ 5桁コードの 67.6% |
| 102 | トーハン | 9,821 | ◎ 6桁コードの 73.8% |
| 103 | 大阪屋栗田(推測) | 2,616 | △ 要確認 |
| 104〜 | 未確認 | – | ❌ 松本課長に確認 |
Phase 1 では「共有フォルダ + Gemini API + Excel + 通知」の 4 つだけで完結。THINKs への入力は手動コピペ(一括入力画面の API は無いため)。
| 連携先 | 方式 | 頻度 | 自動度 | Phase | 備考 |
|---|---|---|---|---|---|
| 共有フォルダ (Synx) | SMB マウント(大和PC直接) | 常時監視 | 完全自動 | P1 | watchdog で新規 .xdw / .pdf 検知 |
| Gemini Vision API | REST(HTTPS) | ページごと | 完全自動 | P1 | 2.0-flash → 必要時 2.5-pro |
| DocuWorks API (XDWAPI.DLL) | ctypes(Windows 同梱) | ファイルごと | 完全自動 | P1 | xdwlib 経由、追加ライセンス不要 |
| 書店マスタ (Excel) | ローカルファイル | 起動時ロード | 完全自動 | P1 | 23,505件 / 月1〜四半期1 で手動更新 |
| THINKs(基幹) | 手動コピペ(一括入力画面) | 日次 | 手動 | P1 | 取次×書誌ごとに画面を開いて貼付 |
| 通知(メール/Slack/Teams) | SMTP / Webhook | 処理完了時 | 準自動 | P1 | チャネル選定中(B4-1 確認待ち) |
| Windows Task Scheduler | OS 標準 | 朝 8:00 | 完全自動 | P1 | RDP 切断中でも動作 |
| 稼働在庫マスタ(書籍) | ローカルファイル | 起動時 | 完全自動 | P1 | 1,226 件 / 書籍名表示用 |
| kintone(書誌DB) | REST API | 非同期 | 対象外 | P3 | THINKs リプレース時に統合検討 |
| BEAT-VPN | — | — | 廃止 | — | 大和PC直接運用で不要に |
運用で必ず発生するエッジケース。それぞれ「自動判定 or 人間確認」のどちらに振るかを設計済み。
[0,1,0] の「0含み」パターン → Flash 維持[0,0,0] 全0 → Pro で再スキャン[1,1,1] 全同値 → Pro で再スキャンexact_name_mismatchempty_page として「⚠️ 要確認」フラグ付きで残すファックス に自動変換doc.pages でページ数取得 → export_image(0, path, pages=doc.pages, format='PDF') で全ページ一括 PDF 化セッション協調ボード(_session_board.md)の OA-1 〜 OA-6 に対応。OCR 精度(OA-1)と DocuWorks 変換方式(OA-2a)は完了、現在は OA-2b(パイプライン統合)が主戦場。本稼働 Go/No-Go を 5/30(金)に置き、残り 2 週間で逆算配置。
ClickUp 親タスク 86exh0pwz(暫定)配下に Step 0〜4 を配置。各 Step に細粒度の孫タスクを置き、5/30(金) Go/No-Go 逆算で開始-終了日を設定。太字 が現在進行中。
| ID | タスク名 | 担当 | 開始 | 終了 | 期間 | ステータス |
|---|---|---|---|---|---|---|
M-pre | OCRエンジン v7.4 確立(書店マスタ照合96%、担当者5ルール) | 西川 | 3/23 | 4/06 | 15日 | ✅ Done |
M0 | 大和PC NucBox4 セットアップ + RDP環境構築(VPN不要化) | 西川+情シス | 4/10 | 4/10 | 1日 | ✅ Done |
M0.5 | 共有フォルダ疎通確認 + テスト用パス開設 | 西川 | 4/21 | 4/21 | 1日 | ✅ Done |
M0.6 | パイプラインプロトタイプ(watchdog + Excel追記 + 通知スタブ) | 西川 | 4/21 | 4/21 | 1日 | ✅ Done |
M0.7 | DocuWorks(.xdw)変換方式 実機検証 → xdwlib + XDWAPI.DLL 確定 | 西川 | 5/16 | 5/17 | 2日 | ✅ Done |
| ID | タスク名 | 担当 | 開始 | 終了 | 期間 | ステータス |
|---|---|---|---|---|---|---|
M1 | xdwlib_convert.py 新規モジュール作成(xdw_to_pdf 関数) | 西川 | 5/18(月) | 5/18(月) | 1日 | 🔄 Now |
M2 | run_pipeline_demo.py 統合改修(.xdw を SUPPORTED_EXTENSIONS に追加 / OCR前に変換挿入) | 西川 | 5/19(火) | 5/19(火) | 1日 | 📋 Next |
M3 | 多ページ .xdw 動作検証(_pending_xdw/ 全4件で変換 → OCR精度同等性確認) | 西川 | 5/20(水) | 5/20(水) | 1日 | ⏳ Wait (M2) |
M4 | 通知チャネル決定(メール/Slack/Teams)+ pipeline_notifier.py 実装 | 西川+松本 | 5/21(木) | 5/22(木) | 2日 | ⏳ Wait (P0-2) |
M4.5 | T-B3-1〜8 回帰テスト(正常PDF×.xdw×破損ファイル×並列etc) | 西川 | 5/22(木) | 5/22(木) | 1日 | ⏳ Wait |
| ID | タスク名 | 担当 | 開始 | 終了 | 期間 | ステータス |
|---|---|---|---|---|---|---|
M5 | Excel プロトタイプ生成(ダミー30件)+ 松本課長レビューMTG | 西川+松本 | 5/21(木) | 5/22(木) | 2日 | 📋 Next |
M6 | シート管理運用ルール策定(入力中/処理済み/要確認の3シート方式 確定) | 西川+松本 | 5/26(月) | 5/28(水) | 3日 | ⏳ Wait (M5) |
M7 | 取次コードマッピング確認(103以降)+ マスタ更新フロー確定 | 松本→西川 | 5/22(木) | 5/22(木) | 1日 | ⏳ Wait (P0-5) |
| ID | タスク名 | 担当 | 開始 | 終了 | 期間 | ステータス |
|---|---|---|---|---|---|---|
M8 | 本番共有フォルダ UNCパス確定 + 権限・命名規則・形式比率把握 | 松本+西川 | 5/23(金) | 5/23(金) | 1日 | ⏳ Wait (P0-4) |
M9 | E2E カットオーバーリハ(本番1日分 50-70枚で全工程テスト) | 西川 | 5/24(土) | 5/25(日) | 2日 | ⏳ Wait (M8) |
M10 | THINKs 一括入力 突合検証(松本課長同席、貼付フロー実機 ≤30分達成) | 松本+西川 | 5/26(月) | 5/27(火) | 2日 | ⏳ Wait (M9) |
M11 | 自動実行 + 監視構築(Windows Task Scheduler 朝8:00 / JSON Lines ログ / 異常通知) | 西川 | 5/27(火) | 5/29(木) | 3日 | ⏳ Wait (M9) |
M11.5 | 48時間連続稼働テスト(RDP切断中も継続動作確認) | 西川 | 5/28(水) | 5/29(木) | 2日 | ⏳ Wait (M11) |
| ID | タスク名 | 担当 | 開始 | 終了 | 期間 | ステータス |
|---|---|---|---|---|---|---|
M12 | 運用マニュアル v1 作成(手順 / トラブルシュート / ロールバック) | 西川 | 5/28(水) | 5/29(木) | 2日 | ⏳ Wait |
M13 | 実運用 1日シミュレーション(松本課長同席で AS-IS 業務並行確認) | 松本+西川 | 5/29(木) | 5/29(木) | 1日 | ⏳ Wait |
M14 | 本稼働 Go/No-Go MTG(松本課長サインオフ) 🎯 マイルストーン | 松本+廣瀬+西川 | 5/30(金) | 5/30(金) | 1日 | ⏳ Wait |
M15a | 🚀 本稼働開始 + 初週ダブルチェック運用 | 松本 | 6/02(月) | 6/06(金) | 5日 | ⏳ Wait (M14) |
M15b | 初週レビュー → 自動化のみに移行(手入力廃止) | 松本+西川 | 6/09(月) | 6/09(月) | 1日 | ⏳ Wait (M15a) |
Phase 1 MVP は「新刊予約 FAX」のみ対象。Phase 2 以降で対象を拡張する。
| Phase | カバー範囲 | 論点 | 確度 |
|---|---|---|---|
| Phase 2 | 即出荷(在庫品の追加発注) | FAX フォーマットが新刊予約と異なる。既存マスタへのマッピングを再設計。OCR プロンプトは v7.4 系列を派生 | 中 |
| Phase 2 | チェーン一括(複数店舗まとめ発注) | 1 FAX に複数店舗が並ぶ形式。Gemini の表構造認識能力を再評価。Phase 1 では対象外 | 中 |
| Phase 2 | セット売り(1 セット = 5 点等) | 1 行に複数書誌が紐づく。スキーマ拡張要。Phase 1 では対象外で松本課長と合意 | 高 |
| Phase 3 | 全カテゴリ対応 | 返品・調整・特殊取引等。FAX 件数の Long Tail 部分。Phase 1〜2 の運用安定後 | 低 |
| Phase 4 | kintone UI 置き換え | Excel コピペを廃止し、kintone 上で承認・台帳化まで一気通貫。THINKs リプレースとセットで設計 | 低 |
本稼働 Go/No-Go 前に解消が必要な項目。優先度 P0(要決定)・P1(早期確認)・P2(運用前)で整理。
Step 1(5/18〜22 パイプライン統合)→ Step 2(5/21〜28 出力Excel)→ Step 3(5/23〜29 本番移行 + 検証)→ Step 4(5/30 Go/No-Go → 6/2 本稼働)。各 M-番号は Section 12 の詳細チケット表と対応。
5/18(月))
projects/order-ocr/scripts/xdwlib_convert.py に xdw_to_pdf() 関数を定義
5/19(火))
PENDING_EXTENSIONS から .xdw 撤去 / SUPPORTED_EXTENSIONS に .xdw 追加 / OCR 直前に変換挿入
5/20(水))
_pending_xdw/ の 4 件全てで変換 → v7.4 投入 → マスタ照合 ≥95% 確認
5/21(木)〜5/22(木))
ダミー 30 件で生成した order_ocr_master.xlsx を画面共有 → フィードバック反映
5/21〜5/22)
P0-2 の松本課長承認待ち。メール / Slack / Teams のいずれか
5/22(木) までにご回答希望)