PaddleOCR is the world's most accurate open-source OCR toolkit, achieving 96.3% accuracy on OmniDocBench v1.6 with its PaddleOCR-VL-1.6 model.
Install with pip install paddlepaddle paddleocr — works on Windows, macOS, Linux, CPU and GPU.
Three core pipelines: PP-OCRv6 (fast text extraction), PP-StructureV3 (PDF/table parsing → Markdown/JSON), and PaddleOCR-VL (vision-language document AI).
Supports 100+ languages with a single pip install; PP-OCRv6 unifies 50 languages (including Chinese, Japanese, Arabic) in one model — no model switching needed.
Natively integrated with Dify, RAGFlow, Pathway, Cherry Studio; supports MCP server mode for direct LLM agent tool use.
Getting Started — Overview
PaddleOCR is an open-source, production-grade OCR (Optical Character Recognition) toolkit and document AI engine developed by Baidu's PaddlePaddle team. PaddleOCR is designed to bridge the gap between raw image/PDF documents and structured, LLM-consumable data — making it the preferred document parser for AI pipelines in 2025–2026.
PaddleOCR provides a complete document intelligence stack organized into modular pipelines. Each pipeline is purpose-built for a specific document processing task:
PP-OCRv6 — Universal text detection and recognition (Scene OCR). Supports 50 languages in a single model with three model tiers for different hardware constraints.
PP-StructureV3 — Complete document layout analysis. Converts PDFs and complex images to structured Markdown or JSON with table cell coordinates, formula positions, and reading-order data.
PaddleOCR-VL — Vision-language model for document parsing. Uses PaddleOCR-VL-1.6 (0.9B parameters) to achieve 96.33% accuracy on OmniDocBench v1.6 — SOTA for open-source document AI.
PP-ChatOCRv4 — Conversational document understanding. Chat with your PDFs and images using natural language queries backed by PaddleOCR's extraction pipeline.
HPD-Parsing — High-throughput document parsing with hierarchical parallel decoding. Achieves 4,752 tokens/second peak throughput for large-scale document processing.
PaddleOCR is trusted by 6,000+ open-source repositories and integrated into the world's most popular RAG and AI agent platforms including Dify, RAGFlow, Pathway, and Cherry Studio.
Installation
PaddleOCR is a Python package distributed via PyPI. It requires Python 3.8 through 3.12 and the PaddlePaddle deep learning framework. PaddleOCR runs on Windows, macOS, and Linux on CPU and GPU.
System Requirements
Python: 3.8 ≤ version ≤ 3.12 (Python 3.13+ not yet supported)
OS: Linux (Ubuntu 18.04+), macOS (10.15+), Windows 10/11
Hardware: CPU (any x86-64 or ARM64), NVIDIA GPU (CUDA 11.8+), Intel CPU with OpenVINO, Apple Silicon (M1/M2/M3/M4)
RAM: Minimum 4 GB (8 GB recommended for medium model)
Step-by-Step Installation
1
Install PaddlePaddle (CPU)
Install the CPU version of PaddlePaddle — the required deep learning framework:
Terminal
# Install CPU version (all platforms)$pip install paddlepaddle# For NVIDIA GPU (CUDA 11.8+)$pip install paddlepaddle-gpu# For NVIDIA GPU (CUDA 12.x)$pip install paddlepaddle-gpu==3.0.0.post120 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html
2
Install PaddleOCR
Install the PaddleOCR package via pip:
Terminal
$pip install paddleocr# Install latest dev version from source$git clone https://github.com/PaddlePaddle/PaddleOCR.git$cd PaddleOCR && pip install -e .
First Run Note: PaddleOCR automatically downloads model weights on first use (~100–300 MB). Models are cached in ~/.paddleocr/. Ensure internet access for the first run.
Install via Docker
Docker
# Pull the latest PaddleOCR Docker image$docker pull paddlecloud/paddleocr:latest# Run interactively$docker run -it paddlecloud/paddleocr:latest bash# Run with GPU support (requires nvidia-docker)$docker run --gpus all -it paddlecloud/paddleocr:gpu bash
Quick Start Guide
The fastest way to extract text from an image using PaddleOCR is the PaddleOCR class with the predict() method. PaddleOCR automatically handles model loading, text detection, and recognition in a single call.
Basic Text Extraction
basic_ocr.py
frompaddleocrimport PaddleOCR
# Initialize — downloads models on first run (~150 MB)
ocr = PaddleOCR(lang='en')
# Run OCR on an image
result = ocr.predict('image.jpg')
# Access extracted textfor page in result:
for text in page['rec_texts']:
print(text) # Prints each text block
Get Text with Bounding Boxes
ocr_with_boxes.py
from paddleocr import PaddleOCR
ocr = PaddleOCR(lang='en')
result = ocr.predict('invoice.jpg')
for page in result:
texts = page['rec_texts']
boxes = page['rec_boxes'] # [[x1,y1],[x2,y2],[x3,y3],[x4,y4]]
scores = page['rec_scores'] # confidence 0.0–1.0for text, box, score in zip(texts, boxes, scores):
print(f'Text: {text}')
print(f'Box: {box}')
print(f'Confidence: {score:.3f}')
PDF to Markdown (PP-StructureV3)
pdf_to_markdown.py
from paddleocr import PPStructureV3
# Initialize PP-StructureV3 — full document parser
pipeline = PPStructureV3()
# Parse a PDF — automatically handles multi-page
results = pipeline.predict('document.pdf')
# Save each page as Markdownfor i, page in enumerate(results):
md = page.get('markdown', '')
with open(f'page_{i+1}.md', 'w', encoding='utf-8') as f:
f.write(md)
print(f'Page {i+1} saved')
PP-OCRv6 — Universal Scene OCR
PP-OCRv6 is PaddleOCR's flagship text detection and recognition pipeline, released with PaddleOCR v3.7.0 in June 2026. It achieves state-of-the-art accuracy on real-world scene text benchmarks, surpassing much larger vision-language models with only 34.5M parameters in the medium tier.
PP-OCRv6 Model Tiers
Tier
Parameters
Use Case
Speed (A100)
Accuracy
Tiny
1.5M
Edge, IoT, Mobile
Fastest
Good
Small
7.7M
Mobile, Low-power
Fast
Better
Medium
34.5M
Server, Production
0.13s
SOTA
PP-OCRv6 Key Improvements
+4.6% detection accuracy over PP-OCRv5_server on standard benchmarks
+5.1% recognition accuracy — surpassing Qwen3-VL-235B and GPT-5.5 with 34.5M parameters
50 languages unified — Chinese, English, Japanese, and 46 Latin-script languages in one model
5.2× CPU speedup via OpenVINO backend on Intel hardware
6.1× Apple Silicon speedup on M4 (tiny model)
Specialized improvements for digital displays, dot-matrix characters, tire prints, and industrial text
PP-OCRv5 vs PP-OCRv6 Architecture & Upgrade Guide
PP-OCRv5 was the previous stable release of PaddleOCR (v3.5–v3.6). While PP-OCRv5 remains fully supported for backward compatibility, upgrading to PP-OCRv6 is strongly recommended for all new and existing deployments:
Dimension
PP-OCRv5 (Legacy)
PP-OCRv6 (Current SOTA)
Detection Accuracy
Baseline (88.4%)
+4.6% improvement (93.0%)
Recognition Accuracy
Baseline (89.1%)
+5.1% improvement (94.2%)
Language Models
Separate model per language
50 languages unified in 1 model
Model Scaling
Server / Mobile fixed
3 Tiers: Tiny (1.5M), Small (7.7M), Medium (34.5M)
CPU Optimization
MKL-DNN baseline
5.2× OpenVINO CPU speedup
PP-OCRv6 Configuration Options
langstrdefault: 'en'
Language for recognition. Options include 'en', 'ch', 'japan', 'korean', 'arabic', 'latin', and 80+ more. Use 'ch' for a unified Chinese+English model.
use_gpubooldefault: False
Enable GPU acceleration. Set to True when using paddlepaddle-gpu. Dramatically increases throughput for batch processing.
use_angle_clsbooldefault: False
Enable text angle classification. Set to True for documents with rotated or upside-down text (e.g., scanned documents at various orientations).
det_db_threshfloatdefault: 0.3
Detection binarization threshold. Lower values detect more text regions (may include noise). Higher values are more selective. Range: 0.0–1.0.
det_db_box_threshfloatdefault: 0.6
Minimum confidence threshold for text boxes. Boxes below this threshold are discarded. Increase to 0.8+ for high-precision mode.
rec_batch_numintdefault: 6
Number of text regions processed per recognition batch. Increase for GPU batching (e.g., 32–64) to maximize GPU utilization during batch processing.
Advertisement
PP-StructureV3 — Document Parsing Pipeline
PP-StructureV3 is PaddleOCR's document layout analysis and structured conversion pipeline. Unlike the base OCR pipeline which extracts flat text, PP-StructureV3 understands the full structure of a document — including reading order, table layout, formula positions, chart locations, and heading hierarchy — and outputs clean, semantically structured Markdown or JSON.
What PP-StructureV3 Can Parse
Multi-page PDF documents (native PDF and scanned PDFs)
Images with complex layouts (multi-column academic papers, reports)
Tables — extracts HTML, cell content, and row/column coordinates
Mathematical formulas — detected and preserved as LaTeX
Charts and figures — regions detected and described
Seals and stamps
Multi-page TIFF files (v3.6.0+)
Office documents: Word, Excel, PowerPoint → Markdown (v3.5.0+)
PP-StructureV3 Usage
ppstructure_v3.py
from paddleocr import PPStructureV3
pipeline = PPStructureV3(
lang='en', # Language for text recognition
use_gpu=False, # Set True for GPU
)
# Process a PDF or image
results = pipeline.predict('annual_report.pdf')
for page_idx, page in enumerate(results):
print(f'=== Page {page_idx + 1} ===')
# Get full structured Markdown
print(page.get('markdown', ''))
# Access individual content blocksfor block in page.get('blocks', []):
block_type = block['type'] # 'text', 'table', 'formula', 'figure'if block_type == 'table':
print('HTML:', block['html'])
elif block_type == 'formula':
print('LaTeX:', block['latex'])
PP-StructureV3 Output JSON Schema
Output Structure (JSON)
# Each page in results is a dict with this structure:
{
"page_id": 0,
"markdown": "# Document Title\n\n...",
"blocks": [
{
"type": "title", # title|text|table|formula|figure|seal"bbox": [x1, y1, x2, y2],
"text": "..."
},
{
"type": "table",
"bbox": [x1, y1, x2, y2],
"html": "<table>...</table>",
"cells": [...] # Cell-level coordinates
}
]
}
PaddleOCR-VL — Vision-Language Document AI
PaddleOCR-VL is a lightweight vision-language model (VLM) series specifically optimized for document parsing. Unlike the pipeline-based PP-StructureV3, PaddleOCR-VL processes an entire document page holistically — understanding layout, text, tables, and visual elements together as a vision-language model.
The latest version, PaddleOCR-VL-1.6 (0.9B parameters), achieves a 96.33% score on OmniDocBench v1.6 — the highest accuracy of any open-source document parsing model as of June 2026. It surpasses both commercial closed-source solutions and much larger models in text, formula, and table recognition tasks.
Key Capabilities
96.33% accuracy on OmniDocBench v1.6 (current SOTA)
Table, ancient Chinese document, and rare character recognition
Seal recognition and text spotting across diverse formats
Chart and diagram understanding
Structured output in Markdown and JSON formats
Zero-cost migration from VL-1.5 — fully compatible model architecture
PaddleOCR-VL Usage
paddleocr_vl.py
# PaddleOCR-VL available on HuggingFacefrom transformers import AutoProcessor, AutoModelForVision2Seq
from PIL import Image
# Load PaddleOCR-VL-1.6 from HuggingFace Hub
processor = AutoProcessor.from_pretrained('PaddlePaddle/PaddleOCR-VL-1.6')
model = AutoModelForVision2Seq.from_pretrained('PaddlePaddle/PaddleOCR-VL-1.6')
# Parse a document image
image = Image.open('complex_document.jpg')
prompt = "Parse this document and output as Markdown."
inputs = processor(
text=prompt,
images=image,
return_tensors='pt'
)
outputs = model.generate(**inputs, max_new_tokens=2048)
result = processor.decode(outputs[0], skip_special_tokens=True)
print(result)
Advanced Usage & Performance Tuning
PaddleOCR provides several configuration options to maximize performance for production workloads. This section covers hardware-specific optimizations, batching strategies, and model selection guidance.
OpenVINO Backend (Intel CPU — 5.2× Speedup)
openvino_inference.py
from paddleocr import PaddleOCR
# Enable MKL-DNN (OpenVINO) for Intel CPU — 5.2× speedup
ocr = PaddleOCR(
lang='en',
use_gpu=False,
enable_mkldnn=True, # Enable MKL-DNN optimization
cpu_threads=8, # Number of CPU threads
)
# Tip: Keep ocr instance across calls — model init is expensive
result = ocr.predict('image.jpg')
GPU Batch Inference
gpu_batch.py
import glob
from paddleocr import PaddleOCR
# Initialize once with large batch size for GPU
ocr = PaddleOCR(
lang='en',
use_gpu=True,
rec_batch_num=32, # Larger batch = better GPU utilization
det_limit_side_len=960, # Limit resize for speed vs accuracy tradeoff
)
images = glob.glob('docs/*.jpg')
results = []
for img in images:
results.append(ocr.predict(img))
print(f'Processed {len(results)} images')
RAG & LLM Pipeline Integration
PaddleOCR is the most widely used document parser in open-source RAG (Retrieval-Augmented Generation) pipelines. It bridges the gap between raw document files (PDFs, images, scanned documents) and the structured text chunks needed by vector databases and LLMs.
PaddleOCR → LangChain → Vector Store
langchain_rag.py
from paddleocr import PPStructureV3
from langchain.text_splitter import MarkdownTextSplitter
from langchain.vectorstores import Chroma
# Step 1: Parse PDF with PaddleOCR → Markdown
pipeline = PPStructureV3()
results = pipeline.predict('knowledge_base.pdf')
full_markdown = '\n\n'.join(p.get('markdown', '') for p in results)
# Step 2: Split into LLM-friendly chunks
splitter = MarkdownTextSplitter(chunk_size=1000, chunk_overlap=100)
chunks = splitter.split_text(full_markdown)
# Step 3: Embed and index in a vector storefrom langchain.embeddings import OpenAIEmbeddings
vectorstore = Chroma.from_texts(chunks, OpenAIEmbeddings())
# Step 4: Query your document
docs = vectorstore.similarity_search("What is the Q3 revenue?", k=3)
for doc in docs:
print(doc.page_content)
MCP Server Mode (LLM Agent Tool)
mcp_server.sh
# Start PaddleOCR as an MCP (Model Context Protocol) server$paddleocr serve --port 8080 --lang en# MCP server exposes OCR as a callable tool for LLM agents# Compatible with Claude, ChatGPT, and any MCP-enabled agent# Available tools: ocr_image, parse_pdf, extract_table
Python API Reference
PaddleOCR Class
PaddleOCR(lang, use_gpu, use_angle_cls, ...)
Main OCR pipeline class. Initializes text detection, angle classification, and text recognition models. Initialize once and reuse — model loading takes 1–3 seconds.
.predict(input)str | PIL.Image | np.ndarray
Run OCR on an image file path, PIL Image, or NumPy array. Returns a list of page results, each containing rec_texts, rec_boxes, and rec_scores.
PPStructureV3 Class
PPStructureV3(lang, use_gpu, ...)
Document layout analysis and structure pipeline. Handles PDFs (multi-page), images, and office documents.
.predict(input)
Parse a document. Returns list of page dicts with keys: markdown, blocks, page_id. Each block has type, bbox, and type-specific data.
Command Line Interface (CLI) Reference
PaddleOCR can be invoked from the command line using the paddleocr command after installation.
CLI Usage
# Basic OCR on a directory of images$paddleocr --image_dir=./images --lang=en --use_gpu=False# Structure analysis (detect tables, titles, layout)$paddleocr --image_dir=./docs --type=structure --lang=en# Single image OCR$paddleocr --image_dir=image.jpg --lang=ch# With angle classification (for rotated text)$paddleocr --image_dir=./scans --lang=en --use_angle_cls=True# Start OCR HTTP server$paddleocr serve --port 8080 --lang en
CLI Flags Reference
Flag
Type
Default
Description
--image_dir
str
—
Path to image file or directory
--lang
str
en
Recognition language code
--use_gpu
bool
False
Enable GPU acceleration
--use_angle_cls
bool
False
Enable text angle classification
--type
str
ocr
Pipeline type: ocr or structure
--det_limit_side_len
int
736
Max image side for detection (resize)
--rec_batch_num
int
6
Recognition batch size
--output
str
./output
Output directory for results
--show_log
bool
True
Print inference logs
Supported Language Codes
PaddleOCR supports 100+ languages. PP-OCRv6's unified model covers 50 languages out-of-the-box without any additional downloads. The following table lists commonly used language codes:
Language
Code
Language
Code
English
en
Chinese (Simplified)
ch
Chinese (Traditional)
chinese_cht
Japanese
japan
Korean
korean
Arabic
arabic
French
french
German
german
Spanish
es
Italian
it
Portuguese
pt
Russian
ru
Hindi
hi
Thai
th
Vietnamese
vi
Latin (general)
latin
Devanagari
devanagari
Cyrillic
cyrillic
Kannada
ka
Tamil
ta
Troubleshooting Guide
This section covers the most common PaddleOCR issues and their solutions.
ImportError: No module named 'paddleocr'
Fix: Run pip install paddleocr. If using a virtual environment, ensure it is activated. Also install PaddlePaddle first: pip install paddlepaddle.
Model download fails / timeout
Fix: Models are downloaded from Baidu cloud on first run. If you are in a region with slow access, use: export PADDLEOCR_HOME=/custom/path and pre-download models from the HuggingFace Hub.
CUDA out of memory
Fix: Use a smaller model tier (tiny or small), reduce rec_batch_num, or set use_gpu=False to fall back to CPU inference. The medium model requires ~2 GB GPU VRAM.
Poor accuracy on my documents
Try: (1) Use the medium tier model for best accuracy. (2) Set use_angle_cls=True for rotated documents. (3) Pre-process images to improve contrast and resolution (300+ DPI recommended). (4) Use PP-StructureV3 or PaddleOCR-VL for complex layouts.
Changelog
v3.7.0 — June 11, 2026 (Latest)
Released PP-OCRv6 with 3 model tiers (tiny 1.5M / small 7.7M / medium 34.5M)
+4.6% detection, +5.1% recognition accuracy vs PP-OCRv5_server
50 language unified model (Chinese, English, Japanese, 46 Latin-script)
5.2× CPU speedup via OpenVINO; 6.1× on Apple M4 (tiny model)
Improvements in digital displays, dot-matrix, tire prints, industrial text
v3.6.0 — May 28, 2026
Released PaddleOCR-VL-1.6 — 96.33% on OmniDocBench v1.6 (SOTA)
Official Python, Go, and TypeScript API SDKs released
Multi-page TIFF file parsing support added
v3.5.0 — April 21, 2026
Flexible inference backends: Paddle static, dynamic, and Transformers
Word, Excel, PowerPoint → Markdown conversion
DOCX export for parsed results
PaddleOCR.js — official browser inference SDK for PP-OCRv5
v3.4.0 — January 29, 2026
HPD-Parsing model added — 4,752 tokens/sec peak throughput
MCP server mode for direct LLM agent tool use
PP-ChatOCRv4 with improved document Q&A capabilities