You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Amazon Textract提取PDF:如何同时获取表格与段落原始文本?

解决Amazon Textract同时提取表格完整内容与非表格段落的方案

可以通过调用Amazon Textract的AnalyzeDocument API并同时指定TABLES和LAYOUT两个特征类型,实现同时获取表格结构化内容与非表格段落文本的需求,具体实现步骤如下:

核心思路

AnalyzeDocument API在同时启用TABLES和LAYOUT特征时,返回的结果会包含两类数据:

  • 表格相关块:包含TABLE、CELL、ROW等类型,保留表格的行列结构,每个单元格的完整文本可直接提取
  • 布局相关块:包含PARAGRAPH、LINE等类型,对应文档中的非表格段落、文本行内容

具体实现步骤

  1. 调用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
    
  2. 解析非表格段落内容
    从返回的Blocks数组中筛选BlockType为PARAGRAPH的块,直接提取Text字段即可得到完整的段落内容:

    def extract_paragraphs(response):
        paragraphs = []
        for block in response['Blocks']:
            if block['BlockType'] == 'PARAGRAPH':
                paragraphs.append(block['Text'])
        return paragraphs
    
  3. 解析表格结构化内容
    遍历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
    
  4. 整合内容(可选)
    如果需要保持原文档的内容顺序,可以通过块的Geometry坐标(比如BoundingBox的Top值)对所有段落和表格块进行排序,确保输出顺序与原文档一致。

关键说明

  • 不要单独使用DetectDocumentText(仅提取纯文本,表格会被拆分行/词)或仅指定TABLES特征(丢失非表格内容),必须同时启用两个特征
  • 解析时通过BlockType区分不同类型的内容,确保表格内容按单元格完整提取,段落内容直接获取

内容的提问来源于stack exchange,提问作者Barry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 04:40:44