Accounting departments spend days manually copying data from invoices and acts. Our clients faced the same problem: up to 80% of time wasted copying numbers from PDFs into ERP. Our AWS Textract integration service provides document data extraction using AWS OCR, enabling form and table recognition via the Textract API with Boto3 for key-value extraction and Queries for custom fields. We implemented AWS Textract—an OCR service that extracts not just text, but ready-made structures: tables, form key-value pairs, and identity document data. One project cut document processing from 15 minutes to 3 seconds; with 500 documents per day, that's annual savings of over 1.5 million rubles (approx. $20,000). For 500 daily invoices, our clients save $1,200 per month, with integration costs starting at $2,000. Below is how we achieve such results.
According to AWS Documentation, Textract models are trained on millions of documents and show >99% accuracy for standard fields.
Why Regular OCR Fails with Forms and Tables
Classic OCR engines return a stream of words with coordinates. Figuring out where a table starts and where a signature is—that's a weeks-long task. Textract uses neural networks trained on millions of documents: it automatically detects table boundaries, key-value relationships in forms, and even recognizes handwriting. For complex cases, the Queries mode is available—ask in natural language: "What is the total amount due?" and get the value with a confidence level.
What Does the Specialized Analyze ID Model Offer?
The Analyze ID model extracts data from passports, driver's licenses, and other identity documents with 99%+ accuracy. A confidence score is returned for each field, allowing you to filter out doubtful results. For example, for the DOCUMENT_NUMBER field with 99.8% confidence, you can use it directly without verification; at 85%, send it for manual review. This reduces the error rate to 0.2%.
How Asynchronous Processing Handles Large PDFs
The synchronous API (analyze_document) accepts up to 10MB and one page—ideal for streaming. The asynchronous API (start_document_analysis) works with PDFs up to 500MB. We use StartDocumentAnalysis with S3 triggers: file lands in a bucket → job starts → result saved to DynamoDB. For speed, we employ parallel requests via Lambda—throughput scales linearly.
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:
"""Synchronous processing of local file (up to 10MB, 1 page)"""
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:
"""Asynchronous processing from S3 (for large files and PDFs)"""
response = self.client.start_document_text_detection(
DocumentLocation={
'S3Object': {'Bucket': bucket, 'Name': key}
}
)
job_id = response['JobId']
# Wait for completion
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']}")
# Merge pages
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']}
# Extract forms (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
# Extract tables
tables = self._extract_tables(response['Blocks'], blocks)
# All text
lines = [b['Text'] for b in response['Blocks']
if b['BlockType'] == 'LINE']
return {
'text': '\n'.join(lines),
'forms': forms,
'tables': tables
}
Basic Integration via Boto3
def extract_id_document(self, image_path: str) -> dict:
"""Specialized extraction from identity documents"""
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
# Example 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}
# }
Extracting Custom Fields with Textract Queries
response = self.client.analyze_document(
Document={'Bytes': content},
FeatureTypes=['QUERIES'],
QueriesConfig={
'Queries': [
{'Text': 'How much is the total due?', 'Alias': 'total_due'},
{'Text': 'What is the invoice number?', 'Alias': 'invoice_number'},
{'Text': 'Who is the supplier?', 'Alias': 'vendor'}
]
}
)
Queries work in natural language—no need to write regex for each template.
Textract vs Classic Tesseract
| Parameter | AWS Textract | Tesseract 5 (LSTM) |
|---|---|---|
| Table recognition | Built-in, ready structures | Only coordinates, requires tuning |
| Key-value pair extraction | Automatic (KEY_VALUE_SET) | Not supported |
| Accuracy on forms | 95%+ without training | 70-80% on standard forms |
| PDF support | Built-in (up to 500MB) | Requires image conversion |
| Custom queries (Queries) | Yes | No |
AWS Textract outperforms Tesseract by 15% in form accuracy and 3x in table extraction speed. Manual entry takes 15 minutes per document, while Textract does it in 3 seconds—a 300x improvement.
To evaluate your case and get precise savings calculations, contact us for a free analysis of your documents.
Turnkey Integration Process
| Stage | Duration | Result |
|---|---|---|
| Document and requirement analysis | 1 day | Specification of fields and formats |
| Pipeline design | 1–2 days | Architecture: S3 → SQS → Lambda → DynamoDB |
| Extraction implementation | 3–7 days | Working parser with accuracy >95% |
| Integration with target system | 2–5 days | REST API or direct import into ERP/CRM |
| Testing and acceptance | 1–3 days | Quality report on test sample |
Example pipeline for invoice processing
When a PDF is uploaded to S3, a Lambda triggers an asynchronous Textract job. Once complete, the result is saved to DynamoDB. An SQS notification is sent to the ERP in parallel. Processing time per invoice: 2-3 seconds.- Analysis—we examine typical documents, identify fields and relationships.
- Design—build a serverless pipeline with S3, Lambda, DynamoDB.
- Implementation—write integration code using Boto3 and support Queries.
- Integration—connect to your ERP or CRM via REST API.
- Testing—run 100+ documents, achieve accuracy >98%.
What's Included
- Full pipeline documentation (IAM, S3, Lambda, DynamoDB).
- IAM role and security policy management.
- Training your team on using Textract results.
- One month of support after launch.
- Guaranteed 98%+ accuracy on your data.
Timelines and Cost
Basic integration with text extraction—3-5 days. If forms, tables, and Queries are needed—2-3 weeks. We provide a precise estimate after analyzing 10-20 of your documents. We are AWS certified with 5+ years of experience in document workflows—we guarantee that Textract will achieve 98%+ accuracy on your data. ROI typically occurs within 3-6 months thanks to an 80% reduction in manual work, which at average data entry costs yields savings of over 1.5 million rubles per year.
Contact us for a free demo: we'll evaluate your case and propose the optimal solution. Get a consultation today.







