文档解析(Unlimited-OCR)
接口描述
文档解析(Unlimited-OCR):基于 Unlimited-OCR 开源底座,通过标准化API服务,提供开箱即用、免部署的快捷接入方式,可直接返回 Json/Markdown 结构化输出,助您快速实现复杂文档智能解析。
接口限时免费,欢迎进行体验与咨询反馈!个人实名可获取免费测试资源200页,企业实名可获取免费测试资源1000页。
文档解析(Unlimited-OCR)API服务为异步接口,需要先调用提交请求接口获取 task_id,然后调用获取结果接口进行结果轮询,建议提交请求后 5~10 秒轮询。提交请求接口QPS为2,获取结果接口QPS为5。
在线调试
您可以在 示例代码中心 中调试该接口,可进行签名验证、查看在线调用的请求内容和返回结果、示例代码的自动生成。
为方便您更好地使用文档解析服务,我们设立了专属交流群。您可通过下方二维码入群:

提交请求接口
请求说明
请求示例
HTTP 方法:POST
请求URL: https://aip.baidubce.com/rest/2.0/brain/online/v2/unlimited-ocr-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,图片最长边不大于8192px-流式文档:doc、docx、txt、wps、ppt、pptx图片不超过10M,版式文档大小不超过100M,流式文档大小不超过50M,其中PDF文档最大支持500页若文档大小超过50M,须从file_url方式上传。优先级: file_data > file_url,当file_data字段存在时,file_url字段失效 |
| file_url | 和file_data二选一 | string | - | 文件数据URL,URL长度不超过1024字节,支持单个URL传入PDF文档大小不超过100M,最大支持500页优先级: file_data > file_url,当file_data字段存在时,file_url字段失效请注意关闭URL防盗链 |
| file_name | 是 | string | - | 文件名,请保证文件名后缀正确,例如 "1.pdf " |
| recognize_formula | - | bool | - | 无需开启,大模型默认对版式类型文档进行公式识别 |
| analysis_chart | 否 | bool | True/False | 是否对统计图表进行解析,默认为False |
| parse_image_layout | - | bool | - | 无需开启,大模型默认解析文档中的所有图片 |
| language_type | - | string | - | 无需开启,大模型默认识别语种类型 |
| merge_tables | - | bool | - | 是否将跨页表格合并输出,开启后tables内将返回跨页表格的合并标识,并将合并内容存放在table_html和markdown下,默认为False |
| relevel_titles | - | bool | - | 是否对段落标题(paragraph_title)进行分级,开启后会在sub_type中输出对应的标题级别,默认为False |
| recognize_seal | - | bool | - | 是否识别印章内容 ,默认为true;erase_seal=true 时被强制置false |
| return_span_boxes | - | bool | - | 是否返回行坐标,默认为False |
| angle_adjust | - | bool | - | 角度矫正,默认为true |
| angle_mode | - | string | - | 角度矫正模式,开启角度矫正后生效,默认为 derection,可选: - direction:四方向 - arbitrary:任意方向 |
| erase_seal | - | bool | - | 印章擦除,默认为False;优先级高于 recognize_seal |
| erase_watermark | - | bool | - | 水印擦除,默认为False |
| unwarp | - | bool | - | 图像扭曲矫正,默认为False |
| page_filter | - | list[int] | - | 指定页码进行解析,默认解析全部页数 |
| need_pdffile_data | - | bool | - | 是否返回整份PDF,默认为False |
| need_pdffile_vis_data | - | bool | - | 当开启角度矫正、水印擦除等预处理能力后,是否输出处理后的PDF,默认为False |
请求代码示例
提示:使用示例代码前,请记得替换其中的示例Token、文档地址或Base64信息。
import base64
import os
import requests
API_KEY = "你的API_KEY"
SECRET_KEY = "你的SECRET_KEY"
FILE_PATH = "./test_sample/doc-0emc2uejide48tnp.jpg"
def get_access_token():
url = "https://aip.baidubce.com/oauth/2.0/token"
params = {
"grant_type": "client_credentials",
"client_id": API_KEY,
"client_secret": SECRET_KEY,
}
return requests.get(url, params=params, timeout=30).json()["access_token"]
def create_task(url, file_path):
with open(file_path, "rb") as f:
file_data = base64.b64encode(f.read()).decode()
data = {
"file_data": file_data,
"file_name": os.path.basename(file_path),
}
headers = {"Content-Type": "application/x-www-form-urlencoded"}
return requests.post(url, headers=headers, data=data, timeout=120)
if __name__ == "__main__":
access_token = get_access_token()
url = (
"https://aip.baidubce.com/rest/2.0/brain/online/v2/unlimited-ocr-parser/task"
f"?access_token={access_token}"
)
response = create_task(url, 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/unlimited-ocr-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
API_KEY = "你的API_KEY"
SECRET_KEY = "你的SECRET_KEY"
TASK_ID = "task_id" # 替换为提交接口返回的 task_id
def get_access_token():
url = "https://aip.baidubce.com/oauth/2.0/token"
params = {
"grant_type": "client_credentials",
"client_id": API_KEY,
"client_secret": SECRET_KEY,
}
return requests.get(url, params=params, timeout=30).json()["access_token"]
def query_task(url, task_id):
data = {"task_id": task_id}
headers = {"Content-Type": "application/x-www-form-urlencoded"}
return requests.post(url, headers=headers, data=data, timeout=60)
if __name__ == "__main__":
access_token = get_access_token()
url = (
"https://aip.baidubce.com/rest/2.0/brain/online/v2/unlimited-ocr-parser/task/query"
f"?access_token={access_token}"
)
resp = query_task(url, 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:排队中;running:运行中;success:成功;failed:失败 |
| + task_error | string | 解析报错信息,包含任务失败、额度不够 |
| + markdown_url | string | 文档解析结果的 markdown 格式链接,链接有效期30天 |
| + parse_result_url | string | 文档解析结果的 JSON bos 链接,链接有效期30天 |
可通过parse_result_url下载解析结果的JSON文件,parse_result_url的返回参数如下:
| 字段 | 类型 | 说明 |
|---|---|---|
| file_name | string | 文档名称 |
| file_id | string | 文档ID |
| + pdf_vis_data | string | 文档预处理后输出PDF的bos链接,链接有效期30天 |
| + pages | list | 文件单页解析内容 |
| ++ page_id | string | 页码ID |
| ++ page_num | int | 页码数 |
| ++ page_angle | int | 旋转角度值,取值0~359 |
| ++ 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框,左上角和宽高 |
| +++ polygon | list | layout元素在页面中的顶点坐标列表,可围合成多边形 |
| +++ span_boxes | list | 行信息,开启return_span_boxex后生效 |
| ++++ text | list | 行内文本内容 |
| ++++ location | list | 行坐标 |
| +++ type | string | layout元素类型, 当前可取值: • abstract:摘要 • algorithm:算法 • aside_text:旁注文本 • chart:图表 • contents:目录 • formula:公式 • doc_title:文档标题 • figure_title:图片标题 • footer:页脚 • footer_image:页脚图片 • footnote:脚注 • formula_number:公式编号 • header:页眉 • header_image:页眉图片 • image:图片(figure:普通插图、QRcode:二维码、Barcode:条形码、handsign:手写签名、doc:文档截图) • inline_formula:行内公式 • number:页码 • paragraph_title:段落标题 • reference:参考文献 • reference_content:参考文献内容 • seal:印章 • table:表格(wired_table:有线表格、wireless_table:无线表格) • text:文本 • vertical_text:竖排文本 |
| +++ sub_type | string | 输出标题层级,开启relevel_titles后生效 |
| ++ tables | list | 页面表格解析结果 |
| +++ layout_id | string | layout ID,与layouts中的元素type为table的元素的layout ID对应 |
| +++ markdown | string | 表格内容的markdown形式 |
| +++ position | list | 边框数据 「x, y, w, h」(x, y)为坐标点坐标,w为box宽度,h为box高度(以页面坐标为原点),版式格式时有效 |
| +++ cells | list | 单元格的内嵌版面信息,layout类型为表格时有值 |
| +++ matrix | list | 二位数组 表示表格内布局位置信息,每个元素对应cells列表中元素的索引 |
| +++ merge_table | string | 合并表格标识,开启merge_tables后生效,跨页表格开始(begin),跨页表格结束(end) |
| ++ images | list | 页面中图片解析结果 |
| +++ layout_id | string | layout ID,与layouts中的元素type为image的元素的layout ID对应 |
| +++ position | list | 边框数据 「x, y, w, h」(x, y)为坐标点坐标,w为box宽度,h为box高度(以页面坐标为原点),版式格式时有效 |
| +++ data_url | string | 图片存储链接 |
| +++ image_description | string | 对统计图表进行内容解析和描述,输出结果为json字符串,可通过json.loads结构化为json格式 |
| ++ meta | dict | 页面元信息 |
| +++ page_width | int | 页面宽度 |
| +++ page_height | int | 页面高度 |
返回示例
成功返回示例:
{
"log_id": "23596597899286921761579365582373",
"error_code": 0,
"error_msg": "",
"result":
{
"task_id": "task-UnvGsgbYZp9pS3BZRHn11ifzjNvKzTgf",
"status": "success",
"task_error": null,
"markdown_url": "https:xxxxxxxxxxxxxxxxxxx",
"parse_result_url": "https:xxxxxxxxxxxxxxxxxxx"//后续支持
}
}markdown_url解析结果示例:

附表一:
机组每日用房、用餐明细表
<table border=1 style='margin: auto; word-wrap: break-word;'><tr><td colspan="9">机组每日用房明细表</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>房间号</td><td style='text-align: center; word-wrap: break-word;'>姓名</td><td style='text-align: center; word-wrap: break-word;'>编号</td><td style='text-align: center; word-wrap: break-word;'>单间/标间</td><td style='text-align: center; word-wrap: break-word;'>入住时间</td><td style='text-align: center; word-wrap: break-word;'>退房时间</td><td style='text-align: center; word-wrap: break-word;'>天数</td><td style='text-align: center; word-wrap: break-word;'>金额</td><td style='text-align: center; word-wrap: break-word;'>备注</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>101</td><td style='text-align: center; word-wrap: break-word;'>张三</td><td style='text-align: center; word-wrap: break-word;'>1000001234</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>20XX-01-0108:30</td><td style='text-align: center; word-wrap: break-word;'>20XX-01-0208:30</td><td style='text-align: center; word-wrap: break-word;'>1</td><td style='text-align: center; word-wrap: break-word;'>0</td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td style='text-align: center; word-wrap: break-word;'>101</td><td style='text-align: center; word-wrap: break-word;'>李四</td><td style='text-align: center; word-wrap: break-word;'>1000001334</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>20XX-01-0108:30</td><td style='text-align: center; word-wrap: break-word;'>20XX-01-0208:30</td><td style='text-align: center; word-wrap: break-word;'>1</td><td style='text-align: center; word-wrap: break-word;'>100</td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td style='text-align: center; word-wrap: break-word;'>102</td><td style='text-align: center; word-wrap: break-word;'>王五</td><td style='text-align: center; word-wrap: break-word;'>1000008234</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>20XX-01-0508:30</td><td style='text-align: center; word-wrap: break-word;'>20XX-01-0708:30</td><td style='text-align: center; word-wrap: break-word;'>2</td><td style='text-align: center; word-wrap: break-word;'>200</td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td style='text-align: center; word-wrap: break-word;'>...</td><td style='text-align: center; word-wrap: break-word;'>...</td><td style='text-align: center; word-wrap: break-word;'>...</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>...</td><td style='text-align: center; word-wrap: break-word;'>...</td><td style='text-align: center; word-wrap: break-word;'>...</td><td style='text-align: center; word-wrap: break-word;'>...</td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td style='text-align: center; word-wrap: break-word;'>...</td><td style='text-align: center; word-wrap: break-word;'>...</td><td style='text-align: center; word-wrap: break-word;'>...</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>...</td><td style='text-align: center; word-wrap: break-word;'>...</td><td style='text-align: center; word-wrap: break-word;'>...</td><td style='text-align: center; word-wrap: break-word;'>...</td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td style='text-align: center; word-wrap: break-word;'>405</td><td style='text-align: center; word-wrap: break-word;'>杨一</td><td style='text-align: center; word-wrap: break-word;'>1000004454</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>20XX-01-0815:23</td><td style='text-align: center; word-wrap: break-word;'>20XX-01-1506:20</td><td style='text-align: center; word-wrap: break-word;'>7</td><td style='text-align: center; word-wrap: break-word;'>0</td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td style='text-align: center; word-wrap: break-word;'>405</td><td style='text-align: center; word-wrap: break-word;'>王二</td><td style='text-align: center; word-wrap: break-word;'>1000001331</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>20XX-01-0815:23</td><td style='text-align: center; word-wrap: break-word;'>20XX-01-1506:20</td><td style='text-align: center; word-wrap: break-word;'>7</td><td style='text-align: center; word-wrap: break-word;'>700</td><td style='text-align: center; word-wrap: break-word;'></td></tr><tr><td style='text-align: center; word-wrap: break-word;'>708</td><td style='text-align: center; word-wrap: break-word;'>李四</td><td style='text-align: center; word-wrap: break-word;'>1000001334</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>20XX-01-0412:45</td><td style='text-align: center; word-wrap: break-word;'>20XX-01-0813:46</td><td style='text-align: center; word-wrap: break-word;'>3.5</td><td style='text-align: center; word-wrap: break-word;'>350</td><td style='text-align: center; word-wrap: break-word;'></td></tr></table>
<table border=1 style='margin: auto; word-wrap: break-word;'><tr><td colspan="7">机组每日用餐明细表</td></tr><tr><td colspan="2">日期</td><td style='text-align: center; word-wrap: break-word;'>姓名</td><td style='text-align: center; word-wrap: break-word;'>编号</td><td style='text-align: center; word-wrap: break-word;'>早餐</td><td style='text-align: center; word-wrap: break-word;'>中餐</td><td style='text-align: center; word-wrap: break-word;'>晚餐</td></tr><tr><td colspan="2">20XX-01-01</td><td style='text-align: center; word-wrap: break-word;'>张三</td><td style='text-align: center; word-wrap: break-word;'>1000001234</td><td style='text-align: center; word-wrap: break-word;'>25</td><td style='text-align: center; word-wrap: break-word;'>0</td><td style='text-align: center; word-wrap: break-word;'>25</td></tr><tr><td colspan="2">20XX-01-01</td><td style='text-align: center; word-wrap: break-word;'>李四</td><td style='text-align: center; word-wrap: break-word;'>1000001334</td><td style='text-align: center; word-wrap: break-word;'>25</td><td style='text-align: center; word-wrap: break-word;'>45</td><td style='text-align: center; word-wrap: break-word;'>45</td></tr><tr><td colspan="2">20XX-01-01</td><td style='text-align: center; word-wrap: break-word;'>王五</td><td style='text-align: center; word-wrap: break-word;'>1000008234</td><td style='text-align: center; word-wrap: break-word;'>25</td><td style='text-align: center; word-wrap: break-word;'>0</td><td style='text-align: center; word-wrap: break-word;'>25</td></tr><tr><td colspan="2">...</td><td style='text-align: center; word-wrap: break-word;'>...</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>...</td><td style='text-align: center; word-wrap: break-word;'>...</td><td style='text-align: center; word-wrap: break-word;'>...</td></tr><tr><td colspan="2">...</td><td style='text-align: center; word-wrap: break-word;'>...</td><td style='text-align: center; word-wrap: break-word;'></td><td style='text-align: center; word-wrap: break-word;'>...</td><td style='text-align: center; word-wrap: break-word;'>...</td><td style='text-align: center; word-wrap: break-word;'>...</td></tr><tr><td colspan="2">20XX-01-01</td><td style='text-align: center; word-wrap: break-word;'>王二</td><td style='text-align: center; word-wrap: break-word;'>1000001331</td><td style='text-align: center; word-wrap: break-word;'>25</td><td style='text-align: center; word-wrap: break-word;'>0</td><td style='text-align: center; word-wrap: break-word;'>45</td></tr><tr><td colspan="2">20XX-01-01</td><td style='text-align: center; word-wrap: break-word;'>李四</td><td style='text-align: center; word-wrap: break-word;'>1000001334</td><td style='text-align: center; word-wrap: break-word;'>25</td><td style='text-align: center; word-wrap: break-word;'>45</td><td style='text-align: center; word-wrap: break-word;'>45</td></tr></table>
<table border=1 style='margin: auto; word-wrap: break-word;'><tr><td colspan="10">机组每日用车明细表</td></tr><tr><td style='text-align: center; word-wrap: break-word;'>车牌</td><td style='text-align: center; word-wrap: break-word;'>发车日</td><td style='text-align: center; word-wrap: break-word;'>发车时间</td><td style='text-align: center; word-wrap: break-word;'>航班号</td><td style='text-align: center; word-wrap: break-word;'>发车</td><td style='text-align: center; word-wrap: break-word;'>目的</td><td style='text-align: center; word-wrap: break-word;'>航司代</td><td style='text-align: center; word-wrap: break-word;'>司机签</td><td style='text-align: center; word-wrap: break-word;'>保障车</td><td style='text-align: center; word-wrap: break-word;'>备</td></tr></table>失败返回示例(详细的错误码说明见API文档-错误码):
{"log_id": "13665091038742503867108513247608",
"error_code": "282007",
"error_msg": "task not exist, please check task id",
"result": "null"}