GPT-5.4 holds the best OCR edit distance on OmniDocBench at 0.02. Claude has the lowest hallucination rate on CC-OCR at 0.09%. The question is which matters more: raw accuracy or reliability.
| Metric | Claude Sonnet 4.6 | GPT-5.4 |
|---|---|---|
| Average time per page | 2.8s | 2.3s |
| OCR edit distance | 0.03 | 0.02 |
| Hallucination rate | 0.09% | 0.15% |
| Thai OCR accuracy | 94.2% | 91.8% |
| Cost per 1000 images | $6.00 | $7.50 |
| Character errors (100 pages) | 12 | 8 |
| Structured output support | Native JSON | Structured outputs |

Test document set. Mixed quality, various fonts, some handwriting.
Edit distance 0.03 with 0.09% hallucination — slightly less accurate but less likely to invent text.
QUARTERLY FINANCIAL REPORT
Invoice #: QFR-2025-001
Date: December 18, 2025
Bill To:
Acme Corporation
123 Business Street
San Francisco, CA 94102
Description Qty Price Total
Consulting Services 40 $150.00 $6,000.00
Project Management 20 $175.00 $3,500.00
Technical Documentation 15 $125.00 $1,875.00
Subtotal: $11,375.00
Tax (8.5%): $966.88
Total: $12,341.88Edit distance 0.02 — clean, accurate, table alignment preserved. 0.15% hallucination rate.
QUARTERLY FINANCIAL REPORT
Invoice #: QFR-2025-001
Date: December 18, 2025
Bill To:
Acme Corporation
123 Business Street
San Francisco, CA 94102
Description Qty Price Total
Consulting Services 40 $150.00 $6,000.00
Project Management 20 $175.00 $3,500.00
Technical Documentation 15 $125.00 $1,875.00
Subtotal: $11,375.00
Tax (8.5%): $966.88
Total: $12,341.88Get the full OCR comparison spreadsheet
30+ models × 8 benchmarks, accuracy + price per page. We email it and keep it current.
Edit distance measures character-level accuracy. Hallucination measures invented content. A model with 0.02 edit distance that hallucinates a line of text is worse than a model with 0.03 edit distance that only makes transcription errors. For invoices, receipts, and financial documents, Claude’s lower hallucination rate is the safer choice.
import anthropic
client = anthropic.Anthropic(api_key="your-key")
with open("document.png", "rb") as f:
image_data = base64.b64encode(f.read()).decode()
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=4096,
messages=[{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": image_data
}
},
{
"type": "text",
"text": "Extract all text from this image."
}
]
}]
)
print(message.content[0].text)import openai
client = openai.OpenAI(api_key="your-key")
with open("document.png", "rb") as f:
image_data = base64.b64encode(f.read()).decode()
response = client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": f"data:image/png;base64,{image_data}"
}
},
{
"type": "text",
"text": "Extract all text from this image."
}
]
}],
max_tokens=4096
)
print(response.choices[0].message.content)Get the full OCR comparison spreadsheet
30+ models × 8 benchmarks, accuracy + price per page. We email it and keep it current.