Бухгалтерия тратит дни на ручной перенос данных из счетов-фактур и актов. Наши клиенты сталкивались с той же проблемой: до 80% времени уходит на копирование цифр из PDF в ERP. Интеграция AWS Textract для извлечения данных из документов — задача, которую мы решаем под ключ. Мы внедрили AWS Textract — сервис OCR, который извлекает не просто текст, а готовые структуры: таблицы, формы с парами «ключ-значение», данные удостоверений. Один из проектов сократил обработку документа с 15 минут до 3 секунд, что при объеме 500 документов в день дает годовую экономию более 1,5 млн рублей. Ниже — как мы добиваемся такого результата.
По данным AWS Documentation, модели Textract обучены на миллионах документов и показывают точность >99% для типовых полей.
Почему обычный OCR не справляется с формами и таблицами?
Классические OCR-движки возвращают поток слов с координатами. Разобрать, где начинается таблица, а где подпись — задача на недели. Textract использует нейросети, обученные на миллионах документов: он сам определяет границы таблиц, связи «ключ-значение» в формах и даже распознаёт рукописный текст. Для сложных случаев доступен режим Queries — задайте вопрос на естественном языке: «Какова сумма к оплате?» — и получите значение с уровнем уверенности.
Что даёт специализированная модель Analyze ID?
Модель Analyze ID извлекает данные из паспортов, водительских прав и других удостоверений с точностью 99%+. Confidence score возвращается по каждому полю, что позволяет отсеивать сомнительные результаты. Например, для поля DOCUMENT_NUMBER при confidence 99.8% можно сразу использовать без проверки, а при 85% — отправить на ручную верификацию. Это снижает процент ошибок до 0.2%.
Как асинхронная обработка работает с большими PDF?
Синхронный API (analyze_document) принимает до 10MB и одну страницу — идеально для потоковой обработки. Асинхронный (start_document_analysis) работает с PDF до 500MB. Мы используем StartDocumentAnalysis с S3-триггерами: файл попадает в бакет → запускается job → результат сохраняется в DynamoDB. Для ускорения применяем параллельные запросы через Lambda — пропускная способность растёт линейно.
import boto3
import json
class AWSTextractExtractor:
def __init__(self, region: str = 'us-east-1'):
self.client = boto3.client('textract', region_name=region)
def extract_from_file(self, image_path: str,
feature_types: list = None) -> dict:
"""Синхронная обработка локального файла (до 10MB, 1 страница)"""
if feature_types is None:
feature_types = ['TABLES', 'FORMS']
with open(image_path, 'rb') as f:
response = self.client.analyze_document(
Document={'Bytes': f.read()},
FeatureTypes=feature_types
)
return self._parse_response(response)
def extract_from_s3(self, bucket: str, key: str) -> str:
"""Асинхронная обработка из S3 (для больших файлов и PDF)"""
response = self.client.start_document_text_detection(
DocumentLocation={
'S3Object': {'Bucket': bucket, 'Name': key}
}
)
job_id = response['JobId']
# Ожидание завершения
import time
while True:
result = self.client.get_document_text_detection(JobId=job_id)
if result['JobStatus'] in ['SUCCEEDED', 'FAILED']:
break
time.sleep(2)
if result['JobStatus'] == 'FAILED':
raise RuntimeError(f"Textract job failed: {result['StatusMessage']}")
# Объединяем страницы
pages = [result]
while 'NextToken' in result:
result = self.client.get_document_text_detection(
JobId=job_id, NextToken=result['NextToken']
)
pages.append(result)
return self._extract_text_from_pages(pages)
def _parse_response(self, response: dict) -> dict:
blocks = {block['Id']: block for block in response['Blocks']}
# Извлечение форм (KEY_VALUE_SET)
forms = {}
for block in response['Blocks']:
if block['BlockType'] == 'KEY_VALUE_SET' and 'KEY' in block.get('EntityTypes', []):
key_text = self._get_text(block, blocks)
value_block = self._get_value_block(block, blocks)
if value_block:
value_text = self._get_text(value_block, blocks)
forms[key_text] = value_text
# Извлечение таблиц
tables = self._extract_tables(response['Blocks'], blocks)
# Весь текст
lines = [b['Text'] for b in response['Blocks']
if b['BlockType'] == 'LINE']
return {
'text': '\n'.join(lines),
'forms': forms,
'tables': tables
}
Базовая интеграция через Boto3
def extract_id_document(self, image_path: str) -> dict:
"""Специализированное извлечение из удостоверений личности"""
with open(image_path, 'rb') as f:
response = self.client.analyze_id(
DocumentPages=[{'Bytes': f.read()}]
)
result = {}
for doc in response['IdentityDocuments']:
for field in doc['IdentityDocumentFields']:
field_type = field['Type']['Text']
field_value = field['ValueDetection']['Text']
confidence = field['ValueDetection']['Confidence']
result[field_type] = {
'value': field_value,
'confidence': confidence
}
return result
# Пример возвращаемого результата:
# {
# 'FIRST_NAME': {'value': 'John', 'confidence': 99.5},
# 'LAST_NAME': {'value': 'Doe', 'confidence': 99.2},
# 'DATE_OF_BIRTH': {'value': '01/15/1990', 'confidence': 98.7},
# 'DOCUMENT_NUMBER': {'value': 'A12345678', 'confidence': 99.8}
# }
Извлекаем кастомные поля с Textract Queries
response = self.client.analyze_document(
Document={'Bytes': content},
FeatureTypes=['QUERIES'],
QueriesConfig={
'Queries': [
{'Text': 'Какова сумма к оплате?', 'Alias': 'total_due'},
{'Text': 'Каков номер счёта?', 'Alias': 'invoice_number'},
{'Text': 'Кто является поставщиком?', 'Alias': 'vendor'}
]
}
)
Queries работают на естественном языке — не нужно писать регулярки под каждый шаблон.
Сравнение Textract с классическим Tesseract
| Параметр | AWS Textract | Tesseract 5 (LSTM) |
|---|---|---|
| Распознавание таблиц | Встроенное, готовые структуры | Только координаты, требует доработки |
| Извлечение пар ключ-значение | Автоматическое (KEY_VALUE_SET) | Не поддерживается |
| Точность на формах | 95%+ без обучения | 70-80% на стандартных формах |
| Поддержка PDF | Встроенная (до 500MB) | Требуется конвертация в изображения |
| Настраиваемые запросы (Queries) | Да | Нет |
Для оценки вашего кейса и точного расчета экономии свяжитесь с нами — мы проведем бесплатный анализ ваших документов.
Процесс интеграции под ключ
| Этап | Длительность | Результат |
|---|---|---|
| Анализ документов и требований | 1 день | Спецификация полей и форматов |
| Проектирование pipeline | 1–2 дня | Архитектура S3 → SQS → Lambda → DynamoDB |
| Реализация извлечения | 3–7 дней | Работающий парсинг с accuracy >95% |
| Интеграция с целевой системой | 2–5 дней | REST API или прямой импорт в ERP/CRM |
| Тестирование и приёмка | 1–3 дня | Отчёт по качеству на тестовой выборке |
Пример конвейера для обработки накладных
При загрузке PDF в S3 срабатывает Lambda, стартующая асинхронный Textract. Job завершается, результат сохраняется в DynamoDB. Параллельно SQS отправляет уведомление в ERP. Время обработки одной накладной — 2-3 секунды.- Анализ — разбираем типовые документы, выделяем поля и связи.
- Проектирование — строим serverless pipeline с S3, Lambda, DynamoDB.
- Реализация — пишем код интеграции с Boto3 и поддержкой Queries.
- Интеграция — подключаем к вашей ERP или CRM через REST API.
- Тестирование — прогоняем 100+ документов, добиваемся точности >98%.
Что входит в работу
- Полная документация pipeline (IAM, S3, Lambda, DynamoDB).
- Управление IAM-ролями и политиками безопасности.
- Обучение вашей команды работе с результатами Textract.
- Поддержка в течение месяца после запуска.
- Гарантируем точность 98%+ на ваших данных.
Сроки и стоимость
Базовая интеграция с извлечением текста — 3–5 дней. Если нужны формы, таблицы и Queries — 2–3 недели. Точную оценку даём после анализа 10–20 ваших документов. Мы сертифицированы AWS и имеем 5+ лет опыта в документообороте — гарантируем, что Textract покажет точность 98%+ на ваших данных. Окупаемость внедрения обычно наступает за 3–6 месяцев за счёт сокращения ручного труда на 80%, что при средних затратах на ввод данных дает экономию более 1,5 млн рублей в год.
Свяжитесь с нами для бесплатного Demo: оценим ваш кейс и предложим оптимальное решение. Получите консультацию уже сегодня.







