文档解析
更新时间:2024-11-06
接口描述
文档解析支持对doc、pdf、图片、xlsx等16种格式文档进行解析,输出文档的版面、表格、阅读顺序、标题层级、旋转角度等信息,可返回Markdown格式内容,将非结构化数据转化为易于处理的结构化数据,识别准确率可达 90% 以上。
文档解析API服务为异步接口,需要先调用提交请求接口获取 task_id,然后调用获取结果接口进行结果轮询,建议提交请求后 5~10 秒轮询。提交请求接口QPS为2,获取结果接口QPS为10。
提交请求接口
请求说明
请求示例
HTTP 方法:POST
请求URL: https://aip.baidubce.com/rest/2.0/brain/online/v2/parser/task
URL参数:
参数 | 值 |
---|---|
access_token | 通过API Key和Secret Key获取的access_token,参考“Access Token获取” |
Header如下:
参数 | 值 |
---|---|
Content-Type | application/x-www-form-urlencoded |
Body中放置请求参数,参数详情如下:
请求参数
参数 | 是否必选 | 类型 | 可选值范围 | 说明 |
---|---|---|---|---|
file_data | 和file_url二选一 | string | - | 文件的base64编码数据:-版式文档:pdf、jpg、jpeg、png、bmp、tif、tiff、ofd、ppt、pptx-流式文档:doc、docx、txt、xls、xlsx、wpsPDF文档大小不超过300M,非PDF文档大小不超过50M,文档页数不超过2000页(流式文档按2000字算一页)优先级: file_data > file_url,当file_data字段存在时,file_url字段失效 |
file_url | 和file_data二选一 | string | - | 文件数据URL,URL长度不超过1024字节,支持单个URL传入,若文件大小超过50M,须通过该方式上传。其余文件准入标准与file_data一致。优先级: file_data > file_url,当file_data字段存在时,file_url字段失效请注意关闭URL防盗链 |
file_name | 是 | string | - | 文件名,请保证文件名后缀正确,例如 "1.pdf " |
return_doc_chunks | 否 | string | - | JSON 字符串,文档切分的传参结构,Python中,json字符串示例 json.dumps({"switch": True, "chunk_size": -1 }),详细结构详见下方说明,具体调用方式详见下方请求示例 |
+ switch | 否 | bool | True/False | 是否进行文档内容切分,「default=False」 |
+ chunk_size | 否 | int | (0,∞) | 切分块的大小,按照字符数统计。若段落字符数小于或等于chunk_size,则按chunk_size切分;若大于chunk_size,则整段作为一个切分块,不因chunk_size限制而额外切分。「default=-1」,表示不限制切分块的大小,按照文档的段落进行切分 |
+ split_type | 否 | string | chunk/mark | 切分方式。 chunk:按照字符数「chunk_size」切分; mark:按照「separators」中的标点符号切分; 「default=chunk」 |
+ separators | 否 | list | 。/ ;/ !/ ?/ ; / ! / ? | 切分标点,仅包含表示一句话结束的标点。「default=["。", ";", "!", "?", ";", "!", "?"]」 |
recognize_formula | 否 | bool | True/False | 是否对版式类型文档进行公式识别 |
请求代码示例
提示:使用示例代码前,请记得替换其中的示例Token、文档地址或Base64信息。
import requests
import os
import base64
def create_task(url, file_path, file_url):
"""
Args:
url: string, 服务请求链接
file_path: 本地文件路径
file_url: 文件链接
Returns: 响应
"""
# 文件请求
with open(file_path, "rb") as f:
file_data = base64.b64encode(f.read())
data = {
"file_data": file_data,
"file_url": file_url,
"file_name": os.path.basename(file_path)
}
# 文档切分参数,非必传
# return_doc_chunks = json.dumps({"switch": True, "chunk_size": -1})
# data["return_doc_chunks"] = return_doc_chunks
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
response = requests.post(url, headers=headers, data=data)
return response
if __name__ == '__main__':
request_host = "https://aip.baidubce.com/rest/2.0/brain/online/v2/parser/task?" \
"access_token={token}"
file_path = "./test.pdf"
response = create_task(request_host, file_path, "")
print(response.json())
返回说明
返回参数
字段 | 类型 | 说明 |
---|---|---|
log_id | uint64 | 唯一的log id,用于问题定位 |
error_code | int | 错误码 |
error_msg | string | 错误描述信息 |
result | dict | 返回的结果列表 |
+ task_id | string | 该请求生成的task_id,后续使用该task_id获取审查结果 |
返回示例
成功返回示例:
{
"error_code": 0,
"error_msg": "",
"log_id": "10138598131137362685273505665433",
"result": {
"task_id": "task-3zy9Bg8CHt1M4pPOcX2q5bg28j26801S"
}
}
失败返回示例(详细的错误码说明见API文档-错误码):
{
"error_code": 282003,
"error_msg": "missing parameters",
"log_id": "37507631033585544507983253924141",
"result": "null"
}
获取结果接口
请求说明
请求示例
HTTP 方法:POST
请求URL: https://aip.baidubce.com/rest/2.0/brain/online/v2/parser/task/query
URL参数:
参数 | 值 |
---|---|
access_token | 通过API Key和Secret Key获取的access_token,参考“Access Token获取” |
Header如下:
参数 | 值 |
---|---|
Content-Type | application/x-www-form-urlencoded |
Body中放置请求参数,参数详情如下:
请求参数
参数 | 是否必选 | 类型 | 说明 |
---|---|---|---|
task_id | 是 | string | 发送提交请求时返回的task_id |
请求代码示例
提示:使用示例代码前,请记得替换其中的示例Token、task_id。
import requests
def query_task(url, task_id):
"""
Args:
url: string, 请求链接
task_id: string, task id
Returns: 响应
"""
data = {
"task_id": task_id
}
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
print(url)
response = requests.post(url, headers=headers, data=data)
return response
if __name__ == '__main__':
# 需要替换为实际的任务id
task_id = "task_id"
# {access_token} 需要替换为实际调用鉴权接口获取的access_token
request_host = "https://aip.baidubce.com/rest/2.0/brain/online/v2/parser/task/query?access_token={access_token}"
resp = query_task(request_host, task_id)
print(resp.json())
返回说明
返回参数
字段 | 类型 | 说明 |
---|---|---|
log_id | uint64 | 唯一的log id,用于问题定位 |
error_code | int | 错误码 |
error_msg | string | 错误描述信息 |
result | dict | 返回的结果列表 |
+ task_id | string | 任务ID |
+ status | string | 任务状态,pending:排队中;processing:运行中;success:成功;failed:失败 |
+ task_error | string | 解析报错信息,包含任务失败、额度不够 |
+ markdown_url | string | 文档解析结果的markdown格式链接,链接有效期30天 |
+ parse_result_url | string | 文档解析结果的bos链接,链接有效期30天 |
可通过parse_result_url下载解析结果的JSON文件,parse_result_url的返回参数如下:
字段 | 类型 | 说明 |
---|---|---|
file_name | string | 文档名称 |
file_id | string | 文档ID |
+ pages | list | 文件单页解析内容 |
++ page_id | string | 页码ID |
++ page_num | int | 页码数 |
++ text | string | 当前页的所有纯文字内容 |
++ layouts | list | 页面内容版式分析的结果 |
+++ layout_id | string | layout ID,layout元素唯一标志,以"xxxxx-layout-{global_layout_index}"形式,global_layout_index为layout元素整个文档的全局索引 |
+++ text | string | layout对应的文本内容。注:当type为table, image时该字段为空, 需要根据type和layout_id分别到tables, images字段里找到对应的内容 |
+++ position | list | layout元素在页面中的位置,[x, y, w, h] box框,左上角和宽高 |
+++ type | string | layout元素类型, 当前可取值: • para:段落 • table:表格 • head_tail:页面顶部 • image:文档中的插图 • contents:目录 • seal:印章 • title:标题 • formula:公式 |
+++ sub_type | string | layout元素子类型, 当type为title、image时,subtype有值。 title类的 subtype 包含: • title_{n},代表n级标题, 比如title_2代表二级标题 • image_title:图标题 • table_title:表标题 image类的 subtype 包含: • chart:统计图表 • figure:普通插图 • QR_code:二维码 • Bar_code:条形码 |
+++ parent | string | 标题层级树中父节点的layout ID,若当前layout为一级标题,其parent为 "root"。在table和image的内嵌版面信息中暂时都为空 |
+++ children | list | 标题层级树中子节点的layout ID。在table和image的内嵌版面信息中暂时都为空 |
++ tables | list | 页面表格解析结果 |
+++ layout_id | string | layout ID,与layouts中的元素type为table的元素的layout ID对应 |
+++ markdown | string | 表格内容的markdown形式 |
+++ table_title_id | list | 表格标题对应的layout_id,默认为null |
+++ position | list | 边框数据 「x, y, w, h」(x, y)为坐标点坐标,w为box宽度,h为box高度(以页面坐标为原点),版式格式时有效 |
+++ cells | list | 单元格的内嵌版面信息,layout类型为表格时有值 |
+++ matrix | list | 二位数组 表示表格内布局位置信息,每个元素对应cells列表中元素的索引 |
+++ merge_table | string | 「begin」- 跨页表格开始、「inner」- 跨页表格中间表格(表格跨页超过两页)、「end」- 跨页表格结束;非跨页表格该字段为空 |
++ images | list | 页面中图片解析结果 |
+++ layout_id | string | layout ID,与layouts中的元素type为image的元素的layout ID对应 |
+++ image_title_id | list | 图片标题对应的layout_id,默认为null |
+++ position | list | 边框数据 「x, y, w, h」(x, y)为坐标点坐标,w为box宽度,h为box高度(以页面坐标为原点),版式格式时有效 |
+++ content_layouts | list | 图片的内嵌版面信息 |
+++ data_url | string | 图片存储链接 |
++ meta | dict | 页面元信息 |
+++ page_width | int | 页面宽度 |
+++ page_height | int | 页面高度 |
+++ is_scan | bool | 是否扫描件 |
+++ page_angle | int | 页面倾斜角度 |
+++ page_type | string | 页面属性「text」- 正文、「contents」- 目录、「appendix」- 附录、「others」- 其他 |
+++ sheet_name | string | excel的sheet名 |
+ chunks | list | 文件内容切分结果,return_doc_chunks中switch为True时有值 |
++ chunk_id | string | 切片的ID |
++ content | string | 切片的内容 |
++ type | string | 切片类型, 为text或者table |
++ meta | dict | chunk元信息 |
+++ title | list | chunk所属的多级标题内容 |
+++ position | list | chunk的位置,根据分块算法有可能chunk跨多个页 |
+++ box | list | chunk的位置坐标 |
+++ page_num | int | chunk内容所在页数 |
表格解析结构说明
以下图为例:
{
# cells列表包含14个元素,matrix中的每个数字表示一个单元格在cells列表中的索引。
"cells": [
{"layout_id": "layout-xxxx",
"position": [90, 376, 21, 10],
"text": "序号"
...
}, # ... 其他单元格信息
],
"matrix": [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8],
[9, 10, 11],
[12, 12, 13],
[12, 12, 14]
}
返回示例
成功返回示例:
{
"log_id": "23596597899286921761579365582373",
"error_code": 0,
"error_msg": "",
"result":
{
"task_id": "task-UnvGsgbYZp9pS3BZRHn11ifzjNvKzTgf",
"status": "success",
"task_error": null,
"duration": 902.0,
"parse_result_url": "https:xxxxxxxxxxxxxxxxxxx"
}
}
解析结果示例:
{
"file_name": "示例文件1(文字+表格)更新-改-1.pdf",
"file_id": "file-u9kVDu6dtwMyNrizbejMlF8A852aJLm2",
"pages": [
{
"page_id": "2aJLm2-page-0",
"page_num": 0,
"text": "买卖合同\n甲、乙双方根据《中华人民共和国合同法》及其它相关法律、法规的规定,本着平等、自愿、互利的原则,经友好协商,订立本合同,以资共同信守:\n1.合同标的物信息\n| 序号 | 商品名称 | 产品简称 | 单价 | 数量 | 总价 | 税率 | 备注 |\n| --- | --- | --- | --- | --- | --- | --- | --- |\n| 1 | 软件-AI | 中台内网-推理平台+训练平台 | 95,000 | 1 | 905,000 | 13% | 第一单元 |\n| 2 | 硬件【A】 | 服务器 | 30,250 | 37 | 1,11950 | 13% | 第一单元 |\n\n本合同一式【2】份,经双方代表签字盖章生效。甲乙双方各执【3】份,具有同等法律效力。\n1 \n",
"layouts": [
{
"layout_id": "2aJLm2-layout-1",
"text": "买卖合同",
"position": [
263,
109,
103,
28
],
"type": "title",
"sub_type": "title_1",
"parent": "root",
"children": [
"2aJLm2-layout-2",
"2aJLm2-layout-3"
]
},
{
"layout_id": "2aJLm2-layout-2",
"text": "甲、乙双方根据《中华人民共和国合同法》及其它相关法律、法规的规定,本着平等、自愿、互利的原则,经友好协商,订立本合同,以资共同信守:",
"position": [
84,
160,
444,
31
],
"type": "text",
"sub_type": "",
"parent": "2aJLm2-layout-1",
"children": [
]
},
{
"layout_id": "2aJLm2-layout-3",
"text": "1.合同标的物信息",
"position": [
79,
206,
110,
14
],
"type": "title",
"sub_type": "title_2",
"parent": "2aJLm2-layout-1",
"children": [
"2aJLm2-layout-4",
"2aJLm2-layout-5",
"2aJLm2-layout-6"
]
},
{
"layout_id": "2aJLm2-layout-4",
"text": "",
"position": [
82,
224,
452,
97
],
"type": "table",
"sub_type": "",
"parent": "2aJLm2-layout-3",
"children": [
]
},
{
"layout_id": "2aJLm2-layout-5",
"text": "本合同一式【2】份,经双方代表签字盖章生效。甲乙双方各执【3】份,具有同等法律效力。",
"position": [
79,
348,
456,
31
],
"type": "text",
"sub_type": "",
"parent": "2aJLm2-layout-3",
"children": [
]
},
{
"layout_id": "2aJLm2-layout-6",
"text": "1",
"position": [
305,
745,
11,
12
],
"type": "head_tail",
"sub_type": "",
"parent": "2aJLm2-layout-3",
"children": [
]
}
],
"tables": [
{
"layout_id": "2aJLm2-layout-4",
"markdown": "| 序号 | 商品名称 | 产品简称 | 单价 | 数量 | 总价 | 税率 | 备注 |\n| --- | --- | --- | --- | --- | --- | --- | --- |\n| 1 | 软件-AI | 中台内网-推理平台+训练平台 | 95,000 | 1 | 905,000 | 13% | 第一单元 |\n| 2 | 硬件【A】 | 服务器 | 30,250 | 37 | 1,11950 | 13% | 第一单元 |\n",
"position": [
82,
224,
452,
97
],
"cells": [
{
"layout_id": "2aJLm2-layout-4-0",
"text": "序号",
"position": [
82,
224,
36,
28
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-1",
"text": "商品名称",
"position": [
118,
224,
78,
28
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-2",
"text": "产品简称",
"position": [
196,
224,
92,
28
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-3",
"text": "单价",
"position": [
288,
224,
57,
28
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-4",
"text": "数量",
"position": [
345,
224,
43,
28
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-5",
"text": "总价",
"position": [
387,
224,
61,
28
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-6",
"text": "税率",
"position": [
448,
224,
46,
28
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-7",
"text": "备注",
"position": [
494,
224,
41,
28
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-8",
"text": "1",
"position": [
82,
252,
36,
44
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-9",
"text": "软件-AI ",
"position": [
118,
252,
78,
44
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-10",
"text": "中台内网-推理平台+训练平台",
"position": [
196,
252,
92,
44
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-11",
"text": "95,000",
"position": [
288,
252,
57,
44
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-12",
"text": "1",
"position": [
345,
252,
43,
44
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-13",
"text": "905,000",
"position": [
387,
252,
61,
44
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-14",
"text": "13% ",
"position": [
448,
252,
46,
44
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-15",
"text": "第一单元",
"position": [
494,
252,
41,
71
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-16",
"text": "2",
"position": [
82,
295,
36,
28
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-17",
"text": "硬件【A】",
"position": [
118,
295,
78,
28
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-18",
"text": "服务器",
"position": [
196,
295,
92,
28
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-19",
"text": "30,250",
"position": [
288,
295,
57,
28
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-20",
"text": "37",
"position": [
345,
295,
43,
28
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-21",
"text": "1,11950",
"position": [
387,
295,
61,
28
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
},
{
"layout_id": "2aJLm2-layout-4-22",
"text": "13% ",
"position": [
448,
295,
46,
28
],
"type": "text",
"sub_type": "",
"parent": "",
"children": null
}
],
"matrix": [
[
0,
1,
2,
3,
4,
5,
6,
7
],
[
8,
9,
10,
11,
12,
13,
14,
15
],
[
16,
17,
18,
19,
20,
21,
22,
15
]
],
"merge_table": ""
}
],
"images": [
],
"meta": {
"page_width": 612,
"page_height": 792,
"is_scan": false,
"page_angle": 0,
"page_type": "text",
"sheet_name": ""
}
}
],
"chunks": [
{
"chunk_id": "2aJLm2-chunk-0",
"content": "甲、乙双方根据《中华人民共和国合同法》及其它相关法律、法规的规定,本着平等、自愿、互利的原则,经友好协商,订立本合同,以资共同信守:",
"type": "text",
"meta": {
"title": [
"买卖合同"
],
"position": [
{
"box": [
84,
160,
444,
31
],
"page_num": 0
}
]
}
},
{
"chunk_id": "2aJLm2-chunk-1",
"content": "| 序号 | 商品名称 | 产品简称 | 单价 | 数量 | 总价 | 税率 | 备注 |\n| --- | --- | --- | --- | --- | --- | --- | --- |\n| 1 | 软件-AI | 中台内网-推理平台+训练平台 | 95,000 | 1 | 905,000 | 13% | 第一单元 |\n| 2 | 硬件【A】 | 服务器 | 30,250 | 37 | 1,11950 | 13% | 第一单元 |\n",
"type": "table",
"meta": {
"title": [
"买卖合同",
"1.合同标的物信息"
],
"position": [
{
"box": [
82,
224,
452,
97
],
"page_num": 0
}
]
}
},
{
"chunk_id": "2aJLm2-chunk-2",
"content": "本合同一式【2】份,经双方代表签字盖章生效。甲乙双方各执【3】份,具有同等法律效力。",
"type": "text",
"meta": {
"title": [
"买卖合同",
"1.合同标的物信息"
],
"position": [
{
"box": [
79,
348,
456,
31
],
"page_num": 0
}
]
}
}
]
}
失败返回示例(详细的错误码说明见API文档-错误码):
{"log_id": "13665091038742503867108513247608",
"error_code": "282007",
"error_msg": "task not exist, please check task id",
"result": "null"}