---
id: sm-reading-invoice
name: "reading-invoice"
url: https://skills.yangsir.net/skill/sm-reading-invoice
author: kazukinagata
domain: finance
tags: ["invoice-processing", "financial-document-automation", "ocr-for-finance", "expense-management", "accounts-payable"]
install_count: 318
rating: 4.10 (20 reviews)
github: https://github.com/kazukinagata/shinkoku
---

# reading-invoice

> 读取发票图像并返回结构化数据。可被其他技能调用，也可由用户直接调用。

**Stats**: 318 installs · 4.1/5 (20 reviews)

## Before / After 对比

### 纸质/图片发票数据提取效率与准确性对比

| Metric | Before | After | Change |
|---|---|---|---|
| - | - | - | - |
| - | - | - | - |
| - | - | - | - |

## Readme

# 請求書 画像読み取り

請求書の画像を読み取り、構造化データとして返すスキル。

## PDF ファイルの場合

ファイルが PDF（`.pdf`）の場合、画像 OCR の前にテキスト抽出を試みる。

1. `shinkoku pdf extract-text --file-path <path>` を実行する
2. 抽出テキストに必要な情報（金額・日付・請求元等）が含まれていれば、テキストから構造化データを生成する
3. テキストが不十分（スキャン PDF 等）の場合は `shinkoku pdf to-image --file-path <path> --output-dir <dir>` で PNG に変換し、以下の画像読み取りフローに進む

## 画像読み取り方法

### 推奨: デュアル検証（並列2コンテキスト）

精度を高めるため、同じ画像を2つの独立したコンテキストで並列に読み取り、結果を照合する。

1. **2つの独立した読み取りを実行する:**
   サブエージェントが使える環境では、2つのサブエージェントを並列で起動し、それぞれ独立に画像を読み取る。
   各サブエージェントには以下の「基本ルール」と「出力フォーマット」をプロンプトとして渡し、画像ファイルパスを指定する。

2. **結果照合:** 両方の読み取り結果から主要フィールド（金額等）を比較する。

3. **一致の場合:** そのまま採用。「2つの独立した読み取りで結果が一致しました」と報告する。

4. **不一致の場合:** ユーザーに元画像パスと両方の結果を提示し、正しい方を選択してもらう:
   - 差異のあるフィールドを明示する
   - A を採用 / B を採用 / 手動入力 の3択を提示する

### フォールバック（サブエージェント非対応の場合）

サブエージェントが利用できない環境では、以下の手順で読み取る:

1. 画像ファイルを直接 Read ツールで読み取る
2. 以下の「基本ルール」と「出力フォーマット」に従ってデータを抽出する
3. 抽出結果をユーザーに提示し、**必ず目視確認を依頼する**

⚠ デュアル検証が利用できないため、必ずユーザーに目視確認を依頼してください。

## 基本ルール

- 画像ファイルは Read ツールで読み取る（Claude Vision が自動的に画像を認識する）
- 金額は必ず int（円単位の整数）で返す。カンマや「円」は除去する
- 日付は YYYY-MM-DD 形式で返す
- 和暦は西暦に変換する（令和7年 → 2025、令和6年 → 2024、平成31年 → 2019）
- 読み取れないフィールドは UNKNOWN（文字列）または 0（金額）とする
- 複数ファイルを渡された場合は全て順に処理してまとめて返す

## 出力フォーマット

画像を読み取り、以下の形式で返す:

```
---INVOICE_DATA---
vendor: 請求元名
invoice_number: 請求書番号
invoice_registration_number: 適格請求書発行事業者番号（T+13桁）
date: YYYY-MM-DD
total_amount: 請求金額合計（int）
tax_amount: 消費税額（int）
items:
  - description: 品目・サービス名
    amount: 金額（int）
    quantity: 数量（int）
    tax_rate: 税率（10 or 8）
---END---
```

## 抽出のポイント

- 請求金額の合計（税込）を最優先で抽出する
- 消費税額を確認する（10% と 8% 軽減税率の区分があれば区別する）
- インボイス番号（T+13桁の適格請求書発行事業者登録番号）の有無を確認する
- 請求書番号がある場合は抽出する
- 請求元（vendor）の名称を抽出する
- 日付は請求日を使用する（発行日と請求日が異なる場合は請求日を優先）
- 明細行は読み取れる範囲で抽出する（不明な場合は items を空にする）

## 複数ファイルの処理

複数のファイルパスが指示された場合:

1. Glob ツールでファイル一覧を取得する（パターンが指示された場合）
2. 各ファイルを Read ツールで順に読み取る
3. 全ファイルの結果をまとめて返す（各結果の前にファイル名を記載する）

```
## file1.jpg
---INVOICE_DATA---
...
---END---

## file2.jpg
---INVOICE_DATA---
...
---END---
```


---
*Source: https://skills.yangsir.net/skill/sm-reading-invoice*
*Markdown mirror: https://skills.yangsir.net/api/skill/sm-reading-invoice/markdown*