まず相談する
まず相談する

Mistral OCR 3でPDF・画像を高精度テキスト化する方法【Python実装ガイド】

この記事のポイント

  • 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 2OCR 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円(通常プラン)程度と、商用利用でも現実的な価格設定です。


環境構築

前提条件

パッケージのインストール

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 にはページごとのオブジェクトが格納されています。

プロパティ内容
indexintページ番号(0始まり)
markdownstr抽出されたテキスト(Markdown形式)
imageslistページ内の画像リスト
tableslistページ内のテーブルリスト
hyperlinkslistページ内のハイパーリンク
headerstr / nullヘッダーテキスト(オプション有効時)
footerstr / nullフッターテキスト(オプション有効時)
dimensionsdictページサイズ情報

ローカル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_headerextract_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パラメータ一覧

パラメータ説明
modelstrモデル名。“mistral-ocr-latest” を指定
documentdict入力ドキュメント。type と URL を含む
table_formatstr / nullテーブル出力形式(null / “markdown” / “html”)
extract_headerboolヘッダーを分離抽出するか
extract_footerboolフッターを分離抽出するか
include_image_base64bool画像を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 3NDLOCR-Lite
実行環境クラウドAPIローカルPC
セットアップAPIキー取得のみアプリインストール
料金$2/1,000ページ無料
対応言語多言語日本語・英語
数式対応数式や方程式を Markdown として出力(LaTeX 風の表現を含む場合あり)非対応
テーブル精度HTML構造を再現基本的な表のみ
手書き対応高精度実験的
GUIWebブラウザデスクトップアプリ
データの扱いクラウド送信ローカル完結
ライセンス商用APICC 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内