Інтеграція 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: оцінимо ваш кейс і запропонуємо оптимальне рішення. Отримайте консультацію вже сьогодні.







