Інтеграція AWS Textract для вилучення даних з документів
Бухгалтерія витрачає дні на ручне перенесення даних з рахунків-фактур та актів. Наші клієнти стикалися з тією ж проблемою: до 80% часу йде на копіювання цифр з PDF в ERP. Інтеграція AWS Textract для вилучення даних з документів — завдання, яке ми вирішуємо під ключ. Ми впровадили AWS Textract — сервіс OCR, який вилучає не просто текст, а готові структури: таблиці, форми з парами «ключ-значення», дані посвідчень. Один із проектів скоротив обробку документа з 15 хвилин до 3 секунд, що дає значну економію часу та коштів. Нижче — як ми досягаємо такого результату.
За даними 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%, що дає значну економію коштів.
Зв'яжіться з нами для безкоштовного Demo: оцінимо ваш кейс і запропонуємо оптимальне рішення. Отримайте консультацію вже сьогодні.







