この記事のポイント
- Mistral AI の最新OCRモデル「Mistral OCR 3」の特徴と、従来版からの改善点
- URL指定・ローカルファイル・画像の3パターンでOCR処理するPythonコード
- テーブル抽出やヘッダー分離など、実務で使える応用テクニック
はじめに
「論文PDFのテキストをコピーしたら、数式や表がグチャグチャになった」「スキャンした請求書を手作業で転記している」そんな経験はありませんか?
Mistral AI が提供する OCR API「Mistral OCR 3」は、PDF・画像からテキスト、テーブル、数式、さらには画像まで高精度に抽出できるクラウドOCRサービスです。出力はMarkdown形式なので、抽出した内容をそのままAIに渡したり、ドキュメントとして活用できます。
この記事では、Mistral OCR 3のセットアップから、実際にPDFや画像を読み取るPythonコードまで、ステップバイステップで解説します。
Mistral OCR 3とは
Mistral AI がリリースした文書OCRモデルの最新版です。PDFや画像を入力すると、テキスト・テーブル・数式・画像を構造化されたMarkdown形式で出力します。
従来版(OCR 2)からの改善点
| 項目 | OCR 2 | OCR 3 |
|---|---|---|
| 手書き文字 | 基本的な活字中心 | 筆記体や混在する注釈にも対応 |
| フォーム・帳票 | 一部レイアウト崩れ | チェックボックス・ラベル・密集レイアウトに対応 |
| スキャン品質 | 高解像度推奨 | 圧縮ノイズ・傾き・歪み・低DPIにも耐性 |
| 複雑なテーブル | 単純な表のみ | ヘッダー結合・colspan/rowspanの再構築 |
| 総合精度 | ベースライン | 74%のケースでOCR 2に勝利(社内評価) |
対応フォーマット
入力として以下の形式に対応しています。
- PDF(URL指定 / Base64エンコード / アップロード)
- 画像(PNG, JPEG, AVIF など)
- PPTX, DOCX
一部の形式(特に DOCX / PPTX)は、ドキュメント上はサポート対象ですが、現時点では環境によってエラーになる報告もあります。安定稼働させたい場合は PDF 変換を推奨します。
料金
| プラン | 料金 |
|---|---|
| 通常 | $2 / 1,000ページ |
| Batch API | $1 / 1,000ページ(50%割引) |
1ドル=150円換算で、1ページあたり約0.3円(通常プラン)程度と、商用利用でも現実的な価格設定です。
環境構築
前提条件
- Python 3.9以上
- Mistral AI のAPIキー(https://console.mistral.ai で取得)
パッケージのインストール
pip install mistralai
APIキーの設定
Mistral AI のコンソールでAPIキーを発行し、環境変数に設定します。
export MISTRAL_API_KEY="your-api-key-here"
Windowsの場合:
$env:MISTRAL_API_KEY="your-api-key-here"
基本的な使い方:URL指定でPDFを読み取る
最もシンプルな方法は、PDFのURLを直接指定する方法です。
import os
from mistralai.client import Mistral
api_key = os.environ["MISTRAL_API_KEY"]
client = Mistral(api_key=api_key)
# PDFのURLを指定してOCR処理
ocr_response = client.ocr.process(
model="mistral-ocr-latest",
document={
"type": "document_url",
"document_url": "https://arxiv.org/pdf/2201.04234"
},
table_format="html"
)
# ページごとに結果を表示
for i, page in enumerate(ocr_response.pages, 1):
print(f"\n--- Page {i} ---")
print(page.markdown)
レスポンスの構造
ocr_response.pages にはページごとのオブジェクトが格納されています。
| プロパティ | 型 | 内容 |
|---|---|---|
| index | int | ページ番号(0始まり) |
| markdown | str | 抽出されたテキスト(Markdown形式) |
| images | list | ページ内の画像リスト |
| tables | list | ページ内のテーブルリスト |
| hyperlinks | list | ページ内のハイパーリンク |
| header | str / null | ヘッダーテキスト(オプション有効時) |
| footer | str / null | フッターテキスト(オプション有効時) |
| dimensions | dict | ページサイズ情報 |
ローカルPDFを読み取る(Base64エンコード)
手元にあるPDFを読み取りたい場合は、Base64エンコードして送信します。
import os
import base64
from mistralai.client import Mistral
api_key = os.environ["MISTRAL_API_KEY"]
client = Mistral(api_key=api_key)
# ローカルPDFをBase64エンコード
pdf_path = "invoice.pdf"
with open(pdf_path, "rb") as f:
pdf_base64 = base64.standard_b64encode(f.read()).decode("utf-8")
# Base64形式でOCR処理
ocr_response = client.ocr.process(
model="mistral-ocr-latest",
document={
"type": "document_url",
"document_url": f"data:application/pdf;base64,{pdf_base64}"
},
table_format="html"
)
# 結果をMarkdownファイルとして保存
with open("output.md", "w", encoding="utf-8") as f:
for page in ocr_response.pages:
f.write(page.markdown + "\n\n")
print("OCR完了。output.md に保存しました。")
ファイルサイズの上限は50MBで、最大1,000ページまで処理できます。
画像ファイルを読み取る
名刺やレシートなど、画像1枚を読み取りたい場合は image_url タイプを使います。
import os
import base64
from mistralai.client import Mistral
api_key = os.environ["MISTRAL_API_KEY"]
client = Mistral(api_key=api_key)
# ローカル画像をBase64エンコード
image_path = "receipt.png"
with open(image_path, "rb") as f:
image_base64 = base64.standard_b64encode(f.read()).decode("utf-8")
# 画像のOCR処理
ocr_response = client.ocr.process(
model="mistral-ocr-latest",
document={
"type": "image_url",
"image_url": f"data:image/png;base64,{image_base64}"
}
)
# 結果を表示
for page in ocr_response.pages:
print(page.markdown)
PNG, JPEG, AVIF形式に対応しています。
応用:テーブル抽出とヘッダー・フッター分離
table_formatオプション
テーブルの出力形式を3種類から選べます。
| 値 | 出力形式 | 用途 |
|---|---|---|
| null(省略) | 本文中にインラインMarkdown | シンプルな表 |
| ”markdown” | テーブルを個別に分離してMarkdown形式 | 中程度の複雑さ |
| ”html” | テーブルを個別に分離してHTML形式 | colspan/rowspanのある複雑な表 |
ヘッダー・フッター抽出
extract_header と extract_footer を有効にすると、本文からヘッダーやフッターを分離して取得できます。
ocr_response = client.ocr.process(
model="mistral-ocr-latest",
document={
"type": "document_url",
"document_url": "https://example.com/report.pdf"
},
table_format="html",
extract_header=True,
extract_footer=True,
include_image_base64=True,
)
for page in ocr_response.pages:
if page.header:
print(f"ヘッダー: {page.header}")
print(page.markdown)
if page.footer:
print(f"フッター: {page.footer}")
if page.tables:
print(f"テーブル数: {len(page.tables)}")
これらのオプションは OCR 2512(OCR 3)以降で利用可能です。
APIパラメータ一覧
| パラメータ | 型 | 説明 |
|---|---|---|
| model | str | モデル名。“mistral-ocr-latest” を指定 |
| document | dict | 入力ドキュメント。type と URL を含む |
| table_format | str / null | テーブル出力形式(null / “markdown” / “html”) |
| extract_header | bool | ヘッダーを分離抽出するか |
| extract_footer | bool | フッターを分離抽出するか |
| include_image_base64 | bool | 画像をBase64で含めるか |
GUIで試す:Document AI Playground
コードを書かずに試したい場合は、Mistral AI Studio の Document AI Playground が便利です。
https://console.mistral.ai/build/document-ai/ocr-playground
ブラウザ上でPDFや画像をドラッグ&ドロップするだけで、OCR結果を確認できます。APIキーの発行前に精度を確認したい場合や、非エンジニアのチームメンバーに共有したい場合に活用できます。
NDLOCR-Liteとの比較
同じOCRでも、ローカル実行型の NDLOCR-Lite とは特徴が大きく異なります。用途に応じて使い分けましょう。
| 項目 | Mistral OCR 3 | NDLOCR-Lite |
|---|---|---|
| 実行環境 | クラウドAPI | ローカルPC |
| セットアップ | APIキー取得のみ | アプリインストール |
| 料金 | $2/1,000ページ | 無料 |
| 対応言語 | 多言語 | 日本語・英語 |
| 数式対応 | 数式や方程式を Markdown として出力(LaTeX 風の表現を含む場合あり) | 非対応 |
| テーブル精度 | HTML構造を再現 | 基本的な表のみ |
| 手書き対応 | 高精度 | 実験的 |
| GUI | Webブラウザ | デスクトップアプリ |
| データの扱い | クラウド送信 | ローカル完結 |
| ライセンス | 商用API | CC BY 4.0 |
機密文書でローカル処理が必須ならNDLOCR-Lite、精度と多機能さを求めるならMistral OCR 3が適しています。
まとめ
| ポイント | 内容 |
|---|---|
| サービス名 | Mistral OCR 3(mistral-ocr-latest) |
| 提供元 | Mistral AI |
| 料金 | $2/1,000ページ(Batch APIなら半額) |
| 入力形式 | PDF, 画像(PNG/JPEG/AVIF), PPTX, DOCX |
| 出力形式 | Markdown(テーブルはHTML/Markdown選択可) |
| 得意分野 | 論文・帳票・フォーム・手書き・複雑なテーブル |
| 導入の手軽さ | pip install + APIキーだけで即利用可能 |
Mistral OCR 3 は、数行のPythonコードでPDFや画像を高精度にテキスト化できる実用的なAPIです。論文の整理、帳票のデジタル化、スキャン文書の検索可能化など、幅広い場面で活用できます。まずは Document AI Playground で手元のドキュメントを試してみてください。
関連記事
AI導入でお困りですか?
「紙の書類が多すぎて、どこから手を付ければいいかわからない」「OCR APIの選定で迷っている」そんなお悩みはありませんか?
AI DARUMAでは、OCRやAIを活用した業務効率化のご相談を承っています。お気軽にお問い合わせください。
〒723-0062 広島県三原市本町 1丁目7-29 2階 コワーキングスペースarica内