Your operators manually retype data from forms, invoices, and waybills? Errors in manual entry cost time and money. We integrate Tesseract OCR — the open-source text recognition engine from Google (Wikipedia) — into your system. Result: text is extracted automatically with up to 98% accuracy on standard documents. And all locally, without the risk of data leakage to the cloud. At volumes exceeding 10,000 pages per month, Tesseract OCR is 40% cheaper than cloud APIs.
Let's look at typical problems we solve when implementing OCR and what is needed for seamless integration.
What problems do we solve?
The main difficulty is the variability of input documents. Resolution, rotation angle, font type, background noise — all reduce recognition accuracy. Especially acute is the issue of mixed languages: Russian + English, Russian + digits. We encountered a project where a client processed medical insurance policies: scans were of varying quality, and the text contained Latin abbreviations. Basic configuration yielded 70% accuracy. After selecting PSM and preprocessing, accuracy reached 94%. According to OCR efficiency research, proper image preprocessing improves accuracy by 15–25%.
Another problem: the LSTM engine in Tesseract 5 requires correct selection of page segmentation mode (PSM). Incorrect PSM can cause half the text to be lost.
How we integrate Tesseract
We use the Python library pytesseract. For basic recognition, just a few lines are enough:
import pytesseract
from PIL import Image
import cv2
import numpy as np
# Basic recognition
def extract_text(image_path: str, lang: str = 'rus') -> str:
image = Image.open(image_path)
text = pytesseract.image_to_string(image, lang=lang, config='--psm 3')
return text
# Detailed output with positions
def extract_with_positions(image_path: str, lang: str = 'rus') -> list[dict]:
image = Image.open(image_path)
data = pytesseract.image_to_data(
image,
lang=lang,
output_type=pytesseract.Output.DICT
)
results = []
for i, text in enumerate(data['text']):
if text.strip() and int(data['conf'][i]) > 0:
results.append({
'text': text,
'confidence': int(data['conf'][i]),
'x': data['left'][i],
'y': data['top'][i],
'w': data['width'][i],
'h': data['height'][i]
})
return results
This is the foundation. For production, we add preprocessing and parameter tuning.
Why local OCR is more profitable than cloud?
Cloud services (Google Cloud Vision, Azure OCR) require sending data externally and are expensive at high volumes. Tesseract runs on your server — no API costs, no request limits. With proper configuration, it matches commercial solutions in quality. Moreover, all data stays within your perimeter, which is critical for medical and financial organizations. We guarantee processing confidentiality. Using local Tesseract OCR can save up to 60% of your recognition budget compared to cloud services.
How to improve recognition accuracy?
The first step is selecting the right PSM (Page Segmentation Mode). Below are popular modes:
| PSM | Description | Usage |
|---|---|---|
| 0 | Only orientation | Rarely |
| 3 | Auto (default) | General text |
| 6 | Single block of text | Paragraphs |
| 7 | Single line | Form fields |
| 8 | Single word | Stamps, seals |
| 11 | Sparse text | Invoices, bills |
| 13 | Raw line | Technical strings |
The second step is image preprocessing. We apply upscaling, grayscale conversion, adaptive binarization, and morphology. Example function:
def prepare_for_tesseract(image: np.ndarray,
scale_factor: float = 2.0) -> np.ndarray:
# Upscale — Tesseract works better at 300+ DPI
h, w = image.shape[:2]
image = cv2.resize(image, (int(w * scale_factor), int(h * scale_factor)),
interpolation=cv2.INTER_CUBIC)
# Grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Adaptive threshold — better for uneven lighting
processed = cv2.adaptiveThreshold(
gray, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 31, 2
)
# Dilate to improve character connections
kernel = np.ones((1, 1), np.uint8)
processed = cv2.dilate(processed, kernel, iterations=1)
processed = cv2.erode(processed, kernel, iterations=1)
return processed
For Russian, we additionally configure:
custom_config = (
'--psm 6 '
'--oem 3 ' # LSTM engine
'-c preserve_interword_spaces=1 '
'-c tessedit_char_whitelist='
'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя'
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 .,!?-:;'
)
text = pytesseract.image_to_string(image, lang='rus+eng', config=custom_config)
If documents contain specific terms (medical, technical), we create a custom dictionary:
# Create custom .traineddata
combine_tessdata -u rus.traineddata rus.
# Add custom dictionary to rus.user-words
echo "ЭКГ МРТ КТ УЗИ" > rus.user-words
Accuracy on different scenarios:
| Scenario | Accuracy | Speed |
|---|---|---|
| Printed text, good quality | 95–98% | 0.5–2 sec/page |
| Printed text, medium-quality scans | 85–92% | 1–3 sec/page |
| Mixed text (rus+eng) | 88–95% | 1–3 sec/page |
Work process
- Document analysis. You provide 10-20 typical samples. We assess quality, language, fonts.
- Configuration selection. Choose PSM, preprocessing settings, language list.
- Integration. Embed code into your system, write documentation.
- Testing. Validate on a sample of documents, adjust.
- Deployment. Deploy the solution on your server.
- Training. Conduct a session for your developers.
What is included
- Python integration code (pytesseract) with ready-made functions
- Configuration files for PSM and preprocessing
- Deployment instructions for your environment (Docker / bare metal)
- Test report on your documents
- Team training (2 online sessions)
- 30-day warranty support
Timelines and cost
| Task | Timeline |
|---|---|
| Basic Tesseract integration | 3–5 days |
| Optimization for specific documents | 1–2 weeks |
| Custom training for special fonts | 2–4 weeks |
Cost is calculated individually based on document volume and complexity. Contact us for a project assessment. Get a consultation on Tesseract OCR integration today — we will select the optimal configuration for your business.
Why choose us
For over 5 years, we have been implementing OCR solutions in business processes. We have completed 50+ projects for financial, medical, and logistics companies. We guarantee recognition quality not lower than 95% on standard documents. We provide a full cycle — from analysis to support.







