文档抽取
更新时间:2024-10-31
接口描述
文档抽取支持自定义配置字段,无需训练即可抽取文档字段信息,精准定位字段值,适用于合同、票据、订单等各类文档场景。如希望快速可视化体验效果,可登录智能文档分析平台,一键上传文档,在线测试;在线工具和API服务的额度共享互通。
文档抽取API服务为异步接口,需要先调用提交请求接口获取taskId,然后调用获取结果接口进行结果轮询,建议提交请求后30秒开始轮询。提交请求接口QPS为2,获取结果接口QPS为10。
提交请求接口
请求说明
请求示例
HTTP 方法:POST
请求URL: https://aip.baidubce.com/rest/2.0/brain/online/v1/extract/task
URL参数:
参数 | 值 |
---|---|
access_token | 通过API Key和Secret Key获取的access_token,参考“Access Token获取” |
Header如下:
参数 | 值 |
---|---|
Content-Type | application/x-www-form-urlencoded |
Body中放置请求参数,参数详情如下:
请求参数
参数 | 是否必选 | 类型 | 说明 |
---|---|---|---|
file | 和 fileURLs 二选一 | string | 文档 base64编码,需去掉编码头(data:image/jpeg;base64, ),支持上传 JPG、JPEG、PNG、BMP、TIF 和 TIFF 格式图片及 DOC、DOCX、PDF、XLSX、XLS 和 OFD 格式文档, 单个文件大小不超过50MB优先级:file>fileURLs,当file字段存在时,fileURLs字段失效 |
fileName | file不为空时必传 | string | 文档名称,当传入file参数时,该字段必传,例如test.docx |
fileURLs | 和file二选一 | []string | 文件数据URL,URL长度不超过1024字节,支持单个URL传入。其余文件准入标准与file一致。优先级:file>fileURLs,当file字段存在时,fileURLs字段失效 |
manifestVersionId | 和 manifest 二选一 | string | 用户在智能文档分析平台配置的清单版本id优先级:manifestVersionId>manifest,当manifestVersionId字段存在时,manifest字段失效 |
manifest | 和 manifestVersionId 二选一 | string | 抽取字段配置,每个抽取字段包含key、parentKey、description三个参数: • key为抽取字段名称,是必传参数; • parentKey为抽取字段的父字段,是非必传参数,不存在时传root或为空; • description为抽取字段的补充说明,用于辅助大模型提升抽取效果,是非必传参数,不存在时为空。 以上三个参数支持中英文、数字、下划线、中划线、斜杠、冒号和括号,其中中横线、下划线、斜杠和冒号不能作为开头和结尾。key和parentKey字符数不超过30,description字符数不超过100。 key的数量不能超过100。优先级:manifestVersionId>manifest,当manifestVersionId字段存在时,manifest字段失效 |
removeDuplicates | 否 | bool | 是否开启字段值去重。开启后,对单个字段内重复抽取的相同值进行去重,并默认输出首个值的位置信息 |
manifest参数示例:
[{
"parentKey": "",
"key": "生效范围",
"description": "指国家范围而非省份、城市或更细分的范围"
}, {
"parentKey": "商品信息",
"key": "商品编号",
"description": ""
}, {
"parentKey": "商品信息",
"key": "商品价格",
"description": ""
}]
请求代码示例
提示一:使用示例代码前,请记得替换其中的示例Token、文档地址和清单。
提示二:目前仅提供Python语言,如需其他语言示例可参考 示例代码中心 。
import base64
import requests
import os
'''
文档抽取-提交请求
'''
file_path = '[本地文件]'
manifest_version_id = '[清单id]'
request_host = "https://aip.baidubce.com/rest/2.0/brain/online/v1/extract/task"
encoded_string = ''
with open(file_path, 'rb') as file:
file_base64 = base64.b64encode(file.read()).decode('utf-8')
# 优先级:manifestVersionId>manifest,当manifestVersionId字段存在时,manifest字段失效
data = {
'file': file_base64,
'fileName': os.path.basename(file_path),
# 'manifestVersionId': manifest_version_id,
'manifest': """
[{"key":"单位", "description":"工作单位一般出现在正文内容里前面带着单位2字", "parentKey":"root"},
{"key":"工作票号", "description":"工作票号不是编号一般由纯数字组成", "parentKey":"root"}
]
"""
}
access_token = '[调用鉴权接口获取的token]'
request_url = request_host + "?access_token=" + access_token
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, headers=headers, data=data)
if response:
print(response.json())
返回说明
返回参数
字段 | 类型 | 说明 |
---|---|---|
log_id | string | 唯一的 log_id,用于问题定位 |
error_code | int | 状态码 |
error_msg | string | 详情 |
result | dict | 返回的结果列表 |
+ taskId | string | 发送提交请求时返回的taskId |
返回示例 成功返回示例:
{
"error_code": 0,
"error_msg": "",
"log_id": "088d6639-bafd-4007-be27-dcddbb651322",
"result": {
"taskId": "task-6tb7mgduz9rqaxzi"
}
}
失败返回示例(详细的错误码说明见API文档-错误码):
{
"error_code": 283016,
"error_msg": "parameters value error:清单字段名称格式错误",
"log_id": "debb76a0-8015-4647-be19-f76c5a0f2892",
"result": None
}
获取结果接口
请求说明
请求示例
HTTP 方法:POST
请求URL:https://aip.baidubce.com/rest/2.0/brain/online/v1/extract/query_task
URL参数:
参数 | 值 |
---|---|
access_token | 通过API Key和Secret Key获取的access_token,参考“Access Token获取” |
Header如下:
参数 | 值 |
---|---|
Content-Type | application/x-www-form-urlencoded |
Body中放置请求参数,参数详情如下:
请求参数
参数 | 是否必选 | 类型 | 说明 |
---|---|---|---|
taskId | 是 | string | 发送提交请求时返回的taskId |
请求代码示例
提示一:使用示例代码前,请记得替换其中的示例Token、taskId。 提示二:目前仅提供Python语言,如需其他语言示例可参考 示例代码中心 。
import requests
'''
文档抽取-获取结果
'''
request_host = "https://aip.baidubce.com/rest/2.0/brain/online/v1/extract/query_task"
data = {
"taskId": "[调用提交请求接口获取的task_id]"
}
access_token = "[调用鉴权接口获取的token]"
request_url = request_host + "?access_token=" + access_token
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=data, headers=headers)
if response:
print(response.json())
返回说明
返回参数
字段 | 类型 | 说明 |
---|---|---|
log_id | uint64 | 唯一的log id,用于问题定位 |
error_code | int | 错误码 |
error_msg | string | 错误描述信息 |
result | dict | 返回的结果列表 |
+ taskId | string | 任务ID |
+ status | string | 任务状态,pending:排队中;processing:运行中;success:成功;failed:失败 |
+ reason | string | 任务失败描述信息 |
+ createdAt | string | 任务创建时间 |
+ startedAt | string | 任务开始时间 |
+ finishedAt | string | 任务结束时间 |
+ duration | string | 任务执行时长 |
+ extractResult | []dict | 文档抽取结果列表 |
++ docId | string | 文档ID |
++ docName | string | 文档名称 |
++ data | dict | 抽取字段和结果信息 |
+++singleKey | dict | 单个字段抽取结果列表 |
++++{字段名称} | []dict | 单个字段的字段名称 |
+++++word | string | 单个字段的抽取结果 |
+++++valuePositions | []dict | 抽取内容位置信息 |
++++++box | [4][2]int | 抽取结果的四角点坐标框,[[x1,y1],[x2,y2],[,x3,y3],[x4,y4]],分别对应坐标框四个点的坐标 |
++++++cbox | [4]int | 抽取结果的坐标框,「x, y, w, h」(x, y)为坐标点坐标,w为box宽度,h为box高度(以页面坐标为原点) |
++++++pageNo | int | 页号 |
+++comboKey | dict | 组合字段抽取结果列表 |
++++{父字段名称} | []dict | 组合字段的父字段名称 |
+++++{子字段名称} | dict | 组合字段的子字段名称 |
++++++valuePositions | []dict | 抽取内容位置信息 |
+++++++box | [4][2]int | 四角点坐标框,[[x1,y1],[x2,y2],[,x3,y3],[x4,y4]],分别对应坐标框四个点的坐标 |
+++++++cbox | [4]int | 坐标框,「x, y, w, h」(x, y)为坐标点坐标,w为box宽度,h为box高度(以页面坐标为原点) |
+++++++pageNo | int | 页号 |
返回示例
成功返回示例:
{
"error_code": 0,
"error_msg": "",
"log_id": "ead7beaf-aeec-4ca5-ac0e-d0e4c5517baa",
"result": {
"taskId": "task-4x0e0ssnhds2esb8",
"status": "Success",
"createdAt": "2024-08-06 11:23:56 +0000 UTC",
"startedAt": "2024-08-06 11:23:59 +0000 UTC",
"finishedAt": "2024-08-06 11:24:24 +0000 UTC",
"duration": 25,
"reason": "",
"extractResult": [{
"docId": "doc-8gh9uqz9v5g32ccx",
"docName": "跨页楼地址.pdf",
"data": {
"singleKey": {
"保全金额": [{
"valuePositions": [{
"box": [
[388, 240],
[445, 240],
[445, 254],
[388, 254]
],
"cbox": [388, 240, 57, 14],
"pageNo": 4
}, {
"box": [
[127, 426],
[184, 426],
[184, 440],
[127, 440]
],
"cbox": [127, 426, 57, 14],
"pageNo": 4
}],
"word": "45000元"
}]
},
"comboKey": {
"申请人": [{
"申请人地址": {
"valuePositions": [{
"box": [
[372, 108],
[500, 108],
[500, 124],
[372, 124]
],
"cbox": [372, 108, 128, 16],
"pageNo": 1
}, {
"box": [
[74, 142],
[189, 142],
[189, 156],
[74, 156]
],
"cbox": [74, 142, 115, 14],
"pageNo": 1
}],
"word": "烟台市莱山区润华大厦1号楼14层"
},
"申请人联系方式": {
"valuePositions": [{
"box": [
[144, 174],
[238, 174],
[238, 189],
[144, 189]
],
"cbox": [144, 174, 94, 15],
"pageNo": 1
}],
"word": "13589767069"
}
}]
}
}
}]
}
}
失败返回示例(详细的错误码说明见API文档-错误码):
{
"error_code": 0,
"error_msg": "",
"log_id": "7ea4d878-ed81-49de-88cc-5f910c6b8d1b",
"result": {
"taskId": "task-utbgdcp6hqx96d3b",
"status": "Failed",
"createdAt": "2024-07-29 07:09:41 +0000 UTC",
"startedAt": "",
"finishedAt": "",
"duration": 0,
"reason": "no valid doc",
"extractResult": [
{
"docId": "doc-g34h4tsyv7zpsz05",
"docName": "4b252fcf49f9a7a7042e63e6b6fefbcc1000007.png",
"data": {}
}
]
}
}