使用Amazon Textract提取PDF:如何同时获取表格与段落原始文本?
解决Amazon Textract同时提取表格完整内容与非表格段落的方案
可以通过调用Amazon Textract的AnalyzeDocument API并同时指定TABLES和LAYOUT两个特征类型,实现同时获取表格结构化内容与非表格段落文本的需求,具体实现步骤如下:
核心思路
AnalyzeDocument API在同时启用TABLES和LAYOUT特征时,返回的结果会包含两类数据:
- 表格相关块:包含
TABLE、CELL、ROW等类型,保留表格的行列结构,每个单元格的完整文本可直接提取 - 布局相关块:包含
PARAGRAPH、LINE等类型,对应文档中的非表格段落、文本行内容
具体实现步骤
调用API时指定特征类型
使用AWS SDK(以Python的boto3为例)调用AnalyzeDocument,明确传入FeatureTypes=["TABLES", "LAYOUT"]:import boto3 def analyze_document(s3_bucket, s3_object): textract = boto3.client('textract') response = textract.analyze_document( Document={ 'S3Object': { 'Bucket': s3_bucket, 'Name': s3_object } }, FeatureTypes=["TABLES", "LAYOUT"] ) return response解析非表格段落内容
从返回的Blocks数组中筛选BlockType为PARAGRAPH的块,直接提取Text字段即可得到完整的段落内容:def extract_paragraphs(response): paragraphs = [] for block in response['Blocks']: if block['BlockType'] == 'PARAGRAPH': paragraphs.append(block['Text']) return paragraphs解析表格结构化内容
遍历BlockType为TABLE的块,关联对应的CELL块,按行列组织单元格内容,还原表格结构:def extract_tables(response): tables = [] for block in response['Blocks']: if block['BlockType'] == 'TABLE': table = [] # 获取当前表格的所有单元格 cells = [b for b in response['Blocks'] if 'Relationships' in b and any(r['Type'] == 'CHILD' and block['Id'] in r['Ids'] for r in b['Relationships'])] # 按行号和列号排序单元格 cells_sorted = sorted(cells, key=lambda x: (x['RowIndex'], x['ColumnIndex'])) # 按行组织表格内容 current_row = [] current_row_idx = None for cell in cells_sorted: if cell['RowIndex'] != current_row_idx: if current_row: table.append(current_row) current_row = [cell['Text']] current_row_idx = cell['RowIndex'] else: current_row.append(cell['Text']) if current_row: table.append(current_row) tables.append(table) return tables整合内容(可选)
如果需要保持原文档的内容顺序,可以通过块的Geometry坐标(比如BoundingBox的Top值)对所有段落和表格块进行排序,确保输出顺序与原文档一致。
关键说明
- 不要单独使用
DetectDocumentText(仅提取纯文本,表格会被拆分行/词)或仅指定TABLES特征(丢失非表格内容),必须同时启用两个特征 - 解析时通过
BlockType区分不同类型的内容,确保表格内容按单元格完整提取,段落内容直接获取
内容的提问来源于stack exchange,提问作者Barry
相关产品推荐
相关产品推荐

