文档介绍了文档智能解析API的调用方式,调用前,请先阅读API使用指南。
文档智能解析接口可进行通用文档抽取和理解,从文档中提取出层级结构、文本内容、KV字段、样式信息等。
文档智能解析接口为异步接口,需要先调用文档智能解析异步提交服务SubmitDocStructureJob接口进行异步任务提交,然后调用文档智能解析结果查询服务GetDocStructureResult接口进行结果轮询,建议每10秒轮询一次,最多轮询120分钟,如果120分钟还未查询到处理完成结果,则视为处理超时。
当异步任务处理提交后,用户可以在处理结束后的24小时之内查询处理结果,超过24小时后将无法查询到处理结果。
免费额度为100页,用完即止。若您的免费额度或资源包消耗完毕,系统将默认采用按量付费的后付费计费方式。
首次解析超过100页的文档,解析成功后,系统会自动进入后付费计费模式,产生后付费账单。
步骤一:调用文档智能解析异步提交服务
异步提交服务支持本地文件和URL文件两种方式:
URL上传的异步提交服务接口为:SubmitDocStructureJob接口。
本地文件上传的异步提交服务接口为:SubmitDocStructureJobAdvance接口。
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
FileUrl | string | 是 | 以文档URL方式使用。 单个文档(支持1000页以内、100 MB以内的PDF、Word文档,支持20 MB以内的单张图片)。 | https://example.com/example.pdf |
FileUrlObject | stream | 是 | 以本地文件上传方式调用接口时使用。 单个文档(支持1000页以内、100 MB以内的PDF、Word文档,支持20 MB以内的单张图片)。 | 本地文件生成的FileInputStream |
FileName | string | 否 | 文件名需带文件类型后缀,与fileNameExtension二选一。 | example.pdf |
FileNameExtension | string | 否 | 文件类型,与fileName二选一。 | |
StructureType | string | 否 | default:默认走全链路结构化解析,相对处理耗时较长。 layout:仅返回版面信息,处理耗时最短。 doctree:返回版面信息、层级树相关信息。 | default |
FormulaEnhancement | bool | 否 | layout\doctree\default参数中,用于开启公式识别增强选项,默认为false | true |
AllowPptFormat | bool | 否 | 是否允许PDF类型PPT,默认为true | true |
StructureType参数说明:
枚举值 | 是否包含坐标信息 | 是否包含文本信息 | 是否包含layout字段,版面信息 | 是否包含logic.docTree字段,层级树信息 | 是否包含logic.paragraphKV/tableKV字段,kv信息 |
layout | 是 | 是 | 是 | 否 | 否 |
doctree | 是 | 是 | 是 | 是 | 否 |
default | 是 | 是 | 是 | 是 | 是 |
支持的文档格式:PDF、Word和图片,图片支持JPG、JPEG、PNG、BMP、GIF。
结构化信息StructureType类型:
default:默认走全链路结构化解析,将返回以下全部结构化信息;
layout:返回结果仅包括版面信息,如段落、表格、图等,包括版面文本、版面坐标等信息;
doctree:返回结果包括版面、层级树信息。文档层级结构信息会以版面为基础,构建全文档的树形层级结构;
FormulaEnhancement 公式增强开关说明:针对于文档中包含的公式以latex方式进行输出,结合GetDocStructureResult配置markdown输出;
返回参数
名称 | 类型 | 描述 | 示例值 |
RequestId | string | 请求唯一ID。 | 43A29C77-405E-4CC0-BC55-EE694AD0**** |
Data | object | 返回数据。 | {"Id": "docmind-20220712-b15f****"} |
+Id | string | 业务订单号,用于后续查询接口进行查询的唯一标识。 | docmind-20220712-b15f**** |
Code | string | 状态码。 | 200 |
Message | string | 状态详细信息。 | message |
示例
本接口支持本地文档上传和传入文档URL这两种调用方式。
以Java SDK为例,本地文档上传调用方式的请求示例代码如下,调用submitDocStructureJobAdvance接口,通过fileUrlObject参数实现本地文档上传。
获取并使用AccessKey信息的方式,可参考SDK概述中不同语言的SDK使用指南。
import com.aliyun.docmind_api20220711.models.*;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.docmind_api20220711.Client;
import com.aliyun.teautil.models.RuntimeOptions;
import java.io.File;
import java.io.FileInputStream;
public static void submit() throws Exception {
// 使用默认凭证初始化Credentials Client。
com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();
Config config = new Config()
// 通过credentials获取配置中的AccessKey ID
.setAccessKeyId(credentialClient.getAccessKeyId())
// 通过credentials获取配置中的AccessKey Secret
.setAccessKeySecret(credentialClient.getAccessKeySecret());
// 访问的域名,支持ipv4和ipv6两种方式,ipv6请使用docmind-api-dualstack.cn-hangzhou.aliyuncs.com
config.endpoint = "docmind-api.cn-hangzhou.aliyuncs.com";
Client client = new Client(config);
// 创建RuntimeObject实例并设置运行参数
RuntimeOptions runtime = new RuntimeOptions();
SubmitDocStructureJobAdvanceRequest advanceRequest = new SubmitDocStructureJobAdvanceRequest();
File file = new File("D:\\example.pdf");
advanceRequest.fileUrlObject = new FileInputStream(file);
advanceRequest.fileName = "example.pdf";
// 发起请求并处理应答或异常。
SubmitDocStructureJobResponse response = client.submitDocStructureJobAdvance(advanceRequest, runtime);
}
const Client = require('@alicloud/docmind-api20220711');
const Credential = require('@alicloud/credentials');
const Util = require('@alicloud/tea-util');
const fs = require('fs');
const getResult = async () => {
// 使用默认凭证初始化Credentials Client
const cred = new Credential.default();
const client = new Client.default({
// 访问的域名,支持ipv4和ipv6两种方式,ipv6请使用docmind-api-dualstack.cn-hangzhou.aliyuncs.com
endpoint: 'docmind-api.cn-hangzhou.aliyuncs.com',
// 通过credentials获取配置中的AccessKey ID
accessKeyId: cred.credential.accessKeyId,
// 通过credentials获取配置中的AccessKey Secret
accessKeySecret: cred.credential.accessKeySecret,
type: 'access_key',
regionId: 'cn-hangzhou'
});
const advanceRequest = new Client.SubmitDocStructureJobAdvanceRequest();
const file = fs.createReadStream('./example.pdf');
advanceRequest.fileUrlObject = file;
advanceRequest.fileName = 'example.pdf';
const runtimeObject = new Util.RuntimeOptions({});
const response = await client.submitDocStructureJobAdvance(advanceRequest, runtimeObject);
return response.body;
}
from alibabacloud_docmind_api20220711.client import Client as docmind_api20220711Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_docmind_api20220711 import models as docmind_api20220711_models
from alibabacloud_tea_util.client import Client as UtilClient
from alibabacloud_tea_util import models as util_models
from alibabacloud_credentials.client import Client as CredClient
def submit_file():
# 使用默认凭证初始化Credentials Client。
cred=CredClient()
config = open_api_models.Config(
# 通过credentials获取配置中的AccessKey ID
access_key_id=cred.get_access_key_id(),
# 通过credentials获取配置中的AccessKey Secret
access_key_secret=cred.get_access_key_secret()
)
# 访问的域名
config.endpoint = f'docmind-api.cn-hangzhou.aliyuncs.com'
client = docmind_api20220711Client(config)
request = docmind_api20220711_models.SubmitDocStructureJobAdvanceRequest(
# file_url_object : 本地文件流
file_url_object=open("./example.pdf", "rb"),
# file_name :文件名称。名称必须包含文件类型
file_name='123.pdf',
# file_name_extension : 文件后缀格式。与文件名二选一
file_name_extension='pdf'
)
runtime = util_models.RuntimeOptions()
try:
# 复制代码运行请自行打印 API 的返回值
response = client.submit_doc_structure_job_advance(request, runtime)
# API返回值格式层级为 body -> data -> 具体属性。可根据业务需要打印相应的结果。如下示例为打印返回的业务id格式
# 获取属性值均以小写开头,
print(response.body.data.id)
except Exception as error:
# 如有需要,请打印 error
UtilClient.assert_as_string(error.message)
import (
"fmt"
"os"
openClient "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.com/alibabacloud-go/docmind-api-20220711/client"
"github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/aliyun/credentials-go/credentials"
)
func submit(){
// 使用默认凭证初始化Credentials Client。
credential, err := credentials.NewCredential(nil)
// 通过credentials获取配置中的AccessKey ID
accessKeyId, err := credential.GetAccessKeyId()
// 通过credentials获取配置中的AccessKey Secret
accessKeySecret, err := credential.GetAccessKeySecret()
// 访问的域名,支持ipv4和ipv6两种方式,ipv6请使用docmind-api-dualstack.cn-hangzhou.aliyuncs.com
var endpoint string = "docmind-api.cn-hangzhou.aliyuncs.com"
config := openClient.Config{AccessKeyId: accessKeyId, AccessKeySecret: accessKeySecret, Endpoint: &endpoint}
// 初始化client
cli, err := client.NewClient(&config)
if err != nil {
panic(err)
}
// 上传本地文档调用接口
filename := "D:\\example.pdf"
f, err := os.Open(filename)
if err != nil {
panic(err)
}
// 初始化接口request
request := client.SubmitDocStructureJobAdvanceRequest{
FileName: &filename,
FileUrlObject: f,
}
// 创建RuntimeObject实例并设置运行参数
options := service.RuntimeOptions{}
response, err := cli.SubmitDocStructureJobAdvance(&request, &options)
if err != nil {
panic(err)
}
// 打印结果
fmt.Println(response.Body.String())
}
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Tea;
using Tea.Utils;
public static void SubmitFile()
{
// 使用默认凭证初始化Credentials Client。
var akCredential = new Aliyun.Credentials.Client(null);
AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config
{
// 通过credentials获取配置中的AccessKey Secret
AccessKeyId = akCredential.GetAccessKeyId(),
// 通过credentials获取配置中的AccessKey Secret
AccessKeySecret = akCredential.GetAccessKeySecret(),
};
// 访问的域名
config.Endpoint = "docmind-api.cn-hangzhou.aliyuncs.com";
AlibabaCloud.SDK.Docmind_api20220711.Client client = new AlibabaCloud.SDK.Docmind_api20220711.Client(config);
//需要安装额外的依赖库--> AlibabaCloud.DarabonbaStream
Stream bodySyream = AlibabaCloud.DarabonbaStream.StreamUtil.ReadFromFilePath("<YOUR-FILE-PATH>");
AlibabaCloud.SDK.Docmind_api20220711.Models.SubmitDocStructureJobAdvanceRequest request = new AlibabaCloud.SDK.Docmind_api20220711.Models.SubmitDocStructureJobAdvanceRequest
{
FileUrlObject = bodySyream,
FileNameExtension = "pdf"
};
AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
try
{
// 复制代码运行请自行打印 API 的返回值
client.SubmitDocStructureJobAdvance(request, runtime);
}
catch (TeaException error)
{
// 如有需要,请打印 error
AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message);
}
catch (Exception _error)
{
TeaException error = new TeaException(new Dictionary<string, object>
{
{ "message", _error.Message }
});
// 如有需要,请打印 error
AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message);
}
}
以Java SDK为例,传入文档URL调用方式的请求示例代码如下,调用submitDocStructureJob接口,通过fileUrl参数实现传入文档URL。请注意,您传入的文档URL必须为公网可访问下载的公网URL地址,无跨域限制,URL不带特殊转义字符。
获取并使用AccessKey信息的方式,可参考SDK概述中不同语言的SDK使用指南。
import com.aliyun.docmind_api20220711.models.*;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.docmind_api20220711.Client;
public static void submit() throws Exception {
// 使用默认凭证初始化Credentials Client。
com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();
Config config = new Config()
// 通过credentials获取配置中的AccessKey ID
.setAccessKeyId(credentialClient.getAccessKeyId())
// 通过credentials获取配置中的AccessKey Secret
.setAccessKeySecret(credentialClient.getAccessKeySecret());
// 访问的域名,支持ipv4和ipv6两种方式,ipv6请使用docmind-api-dualstack.cn-hangzhou.aliyuncs.com
config.endpoint = "docmind-api.cn-hangzhou.aliyuncs.com";
Client client = new Client(config);
SubmitDocStructureJobRequest request = new SubmitDocStructureJobRequest();
request.fileName = "example.pdf";
request.fileUrl = "https://example.com/example.pdf";
SubmitDocStructureJobResponse response = client.submitDocStructureJob(request);
}
const Client = require('@alicloud/docmind-api20220711');
const Credential = require('@alicloud/credentials');
const getResult = async () => {
// 使用默认凭证初始化Credentials Client
const cred = new Credential.default();
const client = new Client.default({
// 访问的域名,支持ipv4和ipv6两种方式,ipv6请使用docmind-api-dualstack.cn-hangzhou.aliyuncs.com
endpoint: 'docmind-api.cn-hangzhou.aliyuncs.com',
// 通过credentials获取配置中的AccessKey ID
accessKeyId: cred.credential.accessKeyId,
// 通过credentials获取配置中的AccessKey Secret
accessKeySecret: cred.credential.accessKeySecret,
type: 'access_key',
regionId: 'cn-hangzhou'
});
const request = new Client.SubmitDocStructureJobRequest();
request.fileName = 'example.pdf';
request.fileUrl = 'https://example.com/example.pdf';
const response = await client.submitDocStructureJob(request);
return response.body;
}
from alibabacloud_docmind_api20220711.client import Client as docmind_api20220711Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_docmind_api20220711 import models as docmind_api20220711_models
from alibabacloud_tea_util.client import Client as UtilClient
from alibabacloud_credentials.client import Client as CredClient
def submit_url():
# 使用默认凭证初始化Credentials Client。
cred=CredClient()
config = open_api_models.Config(
# 通过credentials获取配置中的AccessKey ID
access_key_id=cred.get_access_key_id(),
# 通过credentials获取配置中的AccessKey Secret
access_key_secret=cred.get_access_key_secret()
)
# 访问的域名
config.endpoint = f'docmind-api.cn-hangzhou.aliyuncs.com'
client = docmind_api20220711Client(config)
request = docmind_api20220711_models.SubmitDocStructureJobRequest(
# file_url : 文件url地址
file_url='https://example.com/example.pdf',
# file_name :文件名称。名称必须包含文件类型
file_name='123.pdf',
# file_name_extension : 文件后缀格式。与文件名二选一
file_name_extension='pdf'
)
try:
# 复制代码运行请自行打印 API 的返回值
response = client.submit_doc_structure_job(request)
# API返回值格式层级为 body -> data -> 具体属性。可根据业务需要打印相应的结果。如下示例为打印返回的业务id格式
# 获取属性值均以小写开头,
print(response.body.data.id)
except Exception as error:
# 如有需要,请打印 error
UtilClient.assert_as_string(error.message)
import (
"fmt"
openClient "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.com/alibabacloud-go/docmind-api-20220711/client"
"github.com/aliyun/credentials-go/credentials"
)
func submit(){
// 使用默认凭证初始化Credentials Client。
credential, err := credentials.NewCredential(nil)
// 通过credentials获取配置中的AccessKey ID
accessKeyId, err := credential.GetAccessKeyId()
// 通过credentials获取配置中的AccessKey Secret
accessKeySecret, err := credential.GetAccessKeySecret()
// 访问的域名,支持ipv4和ipv6两种方式,ipv6请使用docmind-api-dualstack.cn-hangzhou.aliyuncs.com
var endpoint string = "docmind-api.cn-hangzhou.aliyuncs.com"
config := openClient.Config{AccessKeyId: accessKeyId, AccessKeySecret: accessKeySecret, Endpoint: &endpoint}
// 初始化client
cli, err := client.NewClient(&config)
if err != nil {
panic(err)
}
// 文件URL
fileURL := "https://example.com/example.pdf"
// 文件名
fileName := "example.pdf"
// 初始化接口request
request := client.SubmitDocStructureJobRequest{
FileUrl: &fileURL,
FileName: &fileName,
}
response, err := cli.SubmitDocStructureJob(&request)
if err != nil {
panic(err)
}
// 打印结果
fmt.Println(response.Body.String())
}
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Tea;
using Tea.Utils;
public static void SubmitUrl()
{
// 使用默认凭证初始化Credentials Client。
var akCredential = new Aliyun.Credentials.Client(null);
AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config
{
// 通过credentials获取配置中的AccessKey Secret
AccessKeyId = akCredential.GetAccessKeyId(),
// 通过credentials获取配置中的AccessKey Secret
AccessKeySecret = akCredential.GetAccessKeySecret(),
};
// 访问的域名
config.Endpoint = "docmind-api.cn-hangzhou.aliyuncs.com";
AlibabaCloud.SDK.Docmind_api20220711.Client client = new AlibabaCloud.SDK.Docmind_api20220711.Client(config);
AlibabaCloud.SDK.Docmind_api20220711.Models.SubmitDocStructureJobRequest request = new AlibabaCloud.SDK.Docmind_api20220711.Models.SubmitDocStructureJobRequest
{
FileUrl = "https://example.pdf",
FileNameExtension = "pdf"
};
try
{
// 复制代码运行请自行打印 API 的返回值
client.SubmitDocStructureJob(request);
}
catch (TeaException error)
{
// 如有需要,请打印 error
AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message);
}
catch (Exception _error)
{
TeaException error = new TeaException(new Dictionary<string, object>
{
{ "message", _error.Message }
});
// 如有需要,请打印 error
AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message);
}
}
use AlibabaCloud\SDK\Docmindapi\V20220711\Docmindapi;
use AlibabaCloud\SDK\Docmindapi\V20220711\Models\SubmitDocStructureJobRequest;
use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use AlibabaCloud\Tea\Exception\TeaUnableRetryError;
use AlibabaCloud\Credentials\Credential;
// 使用默认凭证初始化Credentials Client。
$bearerToken = new Credential();
$config = new Config();
// 访问的域名,支持ipv4和ipv6两种方式,ipv6请使用docmind-api-dualstack.cn-hangzhou.aliyuncs.com
$config->endpoint = "docmind-api.cn-hangzhou.aliyuncs.com";
// 通过credentials获取配置中的AccessKey ID
$config->accessKeyId = $bearerToken->getCredential()->getAccessKeyId();
// 通过credentials获取配置中的AccessKey Secret
$config->accessKeySecret = $bearerToken->getCredential()->getAccessKeySecret();
$config->type = "access_key";
$config->regionId = "cn-hangzhou";
$client = new Docmindapi($config);
$request = new SubmitDocStructureJobRequest();
$runtime = new RuntimeOptions();
$runtime->maxIdleConns = 3;
$runtime->connectTimeout = 10000;
$runtime->readTimeout = 10000;
$request->fileName = "example.pdf";
$request->fileUrl = "https://example.com/example.pdf";
try {
$response = $client->submitDocStructureJob($request, $runtime);
var_dump($response->toMap());
} catch (TeaUnableRetryError $e) {
var_dump($e->getMessage());
var_dump($e->getErrorInfo());
var_dump($e->getLastException());
var_dump($e->getLastRequest());
}
正常返回示例
JSON
格式
{
"RequestId": "43A29C77-405E-4CC0-BC55-EE694AD0****",
"Data": {
"Id": "docmind-20220712-b15f****"
}
}
步骤二:轮询文档智能解析结果查询服务GetDocStructureResult接口
调用查询接口的入参ID就是前面异步任务提交接口返回的出参ID,查询结果有处理中、处理成功、处理失败三种情况。建议每10秒轮询一次,最多轮询10分钟。若明确返回Completed为true或者超过轮询最大时间,则终止轮询。
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
Id | string | 是 | 需要查询的业务订单号,订单号从提交接口的返回结果中获取。 | docmind-20220712-b15f**** |
RevealMarkdown | boolean | 否 | 是否输出markdown类型文本(layout内包含markdownContent字段) | true |
ImageStrategy | String | 否 | markdownContent中图片存储方式 | url:提供oss url(含有效期) base64: 提供base64字段 |
UseUrlResponseBody | bool | 否 | 是否以url方式返回结果,默认为false | true |
开启markdown输出后,ImageStrategy才能生效。ImageStrategy参数用于控制markdown内图片存储方式,base64适合较小文件,推荐使用url,但注意url会有时效期。
如果上传的文件较大 或者文件内容较多 ,建议开启UseUrlResponseBody,可以有效避免接口超时等问题,但注意url会有时效期。
返回参数
名称 | 类型 | 描述 | 示例值 |
RequestId | string | 请求唯一ID。 | 43A29C77-405E-4CC0-BC55-EE694AD0**** |
Completed | boolean | 异步任务是否处理完成,false表示任务仍在处理中,true代表任务处理完成,有处理成功或处理失败的明确结果。 | true |
Status | String | 异步任务处理完成的状态,最终处理结束后的状态。Success为处理成功,Fail为处理失败。 | Success |
Data | string | 返回数据,文档智能解析的解析结果,输出包括文档内容及样式、文档版面信息以及文档逻辑信息(层级树、表格理解、表格及段落KV)的JSON数据结构返回。 | |
Code | string | 状态码。 | 200 |
Message | string | 详细信息。 | message |
使用流程说明
示例
以Java SDK为例,调用文档智能解析接口的结果查询类API示例代码如下,调用 接口,通过ID参数传入查询流水号。
获取并使用AccessKey信息的方式,可参考SDK概述中不同语言的SDK使用指南。
import com.aliyun.docmind_api20220711.models.*;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.docmind_api20220711.Client;
public static void submit() throws Exception {
// 使用默认凭证初始化Credentials Client。
com.aliyun.credentials.Client credentialClient = new com.aliyun.credentials.Client();
Config config = new Config()
// 通过credentials获取配置中的AccessKey ID
.setAccessKeyId(credentialClient.getAccessKeyId())
// 通过credentials获取配置中的AccessKey Secret
.setAccessKeySecret(credentialClient.getAccessKeySecret());
// 访问的域名,支持ipv4和ipv6两种方式,ipv6请使用docmind-api-dualstack.cn-hangzhou.aliyuncs.com
config.endpoint = "docmind-api.cn-hangzhou.aliyuncs.com";
Client client = new Client(config);
GetDocStructureResultRequest resultRequest = new GetDocStructureResultRequest();
resultRequest.id = "docmind-20220902-824b****";
GetDocStructureResultResponse response = client.getDocStructureResult(resultRequest);
}
const Client = require('@alicloud/docmind-api20220711');
const Credential = require('@alicloud/credentials');
const getResult = async () => {
// 使用默认凭证初始化Credentials Client
const cred = new Credential.default();
const client = new Client.default({
// 访问的域名,支持ipv4和ipv6两种方式,ipv6请使用docmind-api-dualstack.cn-hangzhou.aliyuncs.com
endpoint: 'docmind-api.cn-hangzhou.aliyuncs.com',
// 通过credentials获取配置中的AccessKey ID
accessKeyId: cred.credential.accessKeyId,
// 通过credentials获取配置中的AccessKey Secret
accessKeySecret: cred.credential.accessKeySecret,
type: 'access_key',
regionId: 'cn-hangzhou'
});
const resultRequest = new Client.GetDocStructureResultRequest();
resultRequest.id = "docmind-20220902-824b****";
const response = await client.getDocStructureResult(resultRequest);
return response.body;
}
from typing import List
from alibabacloud_docmind_api20220711.client import Client as docmind_api20220711Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_docmind_api20220711 import models as docmind_api20220711_models
from alibabacloud_tea_util.client import Client as UtilClient
from alibabacloud_credentials.client import Client as CredClient
def query():
# 使用默认凭证初始化Credentials Client。
cred=CredClient()
config = open_api_models.Config(
# 通过credentials获取配置中的AccessKey ID
access_key_id=cred.get_access_key_id(),
# 通过credentials获取配置中的AccessKey Secret
access_key_secret=cred.get_access_key_secret()
)
# 访问的域名
config.endpoint = f'docmind-api.cn-hangzhou.aliyuncs.com'
client = docmind_api20220711Client(config)
request = docmind_api20220711_models.GetDocStructureResultRequest(
# id : 任务提交接口返回的id
id='docmind-20220902-824b****'
)
try:
# 复制代码运行请自行打印 API 的返回值
response = client.get_doc_structure_result(request)
# API返回值格式层级为 body -> data -> 具体属性。可根据业务需要打印相应的结果。获取属性值均以小写开头
# 获取异步任务处理情况,可根据response.body.completed判断是否需要继续轮询结果
print(response.body.completed)
# 获取返回结果。建议先把response.body.data转成json,然后再从json里面取具体需要的值。
print(response.body.data)
except Exception as error:
# 如有需要,请打印 error
UtilClient.assert_as_string(error.message)
import (
"fmt"
openClient "github.com/alibabacloud-go/darabonba-openapi/v2/client"
"github.com/alibabacloud-go/docmind-api-20220711/client"
"github.com/aliyun/credentials-go/credentials"
)
func submit(){
// 使用默认凭证初始化Credentials Client。
credential, err := credentials.NewCredential(nil)
// 通过credentials获取配置中的AccessKey ID
accessKeyId, err := credential.GetAccessKeyId()
// 通过credentials获取配置中的AccessKey Secret
accessKeySecret, err := credential.GetAccessKeySecret()
// 访问的域名,支持ipv4和ipv6两种方式,ipv6请使用docmind-api-dualstack.cn-hangzhou.aliyuncs.com
var endpoint string = "docmind-api.cn-hangzhou.aliyuncs.com"
config := openClient.Config{AccessKeyId: accessKeyId, AccessKeySecret: accessKeySecret, Endpoint: &endpoint}
// 初始化client
cli, err := client.NewClient(&config)
if err != nil {
panic(err)
}
id := "docmind-20220925-76b1****"
// 调用查询接口
request := client.GetDocStructureResultRequest{Id: &id}
response, err := cli.GetDocStructureResult(&request)
if err != nil {
panic(err)
}
// 打印查询结果
fmt.Println(response.Body.String())
}
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Tea;
using Tea.Utils;
public static void GetResult()
{
// 使用默认凭证初始化Credentials Client。
var akCredential = new Aliyun.Credentials.Client(null);
AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config
{
// 通过credentials获取配置中的AccessKey Secret
AccessKeyId = akCredential.GetAccessKeyId(),
// 通过credentials获取配置中的AccessKey Secret
AccessKeySecret = akCredential.GetAccessKeySecret(),
};
// 访问的域名
config.Endpoint = "docmind-api.cn-hangzhou.aliyuncs.com";
AlibabaCloud.SDK.Docmind_api20220711.Client client = new AlibabaCloud.SDK.Docmind_api20220711.Client(config);
AlibabaCloud.SDK.Docmind_api20220711.Models.GetDocStructureResultRequest request = new AlibabaCloud.SDK.Docmind_api20220711.Models.GetDocStructureResultRequest
{
Id = "docmind-20220902-824b****"
};
AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
try
{
// 复制代码运行请自行打印 API 的返回值
client.GetDocStructureResult(request);
}
catch (TeaException error)
{
// 如有需要,请打印 error
AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message);
}
catch (Exception _error)
{
TeaException error = new TeaException(new Dictionary<string, object>
{
{ "message", _error.Message }
});
// 如有需要,请打印 error
AlibabaCloud.TeaUtil.Common.AssertAsString(error.Message);
}
}
use AlibabaCloud\SDK\Docmindapi\V20220711\Docmindapi;
use AlibabaCloud\SDK\Docmindapi\V20220711\Models\GetDocStructureResultRequest;
use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use AlibabaCloud\Tea\Exception\TeaUnableRetryError;
use AlibabaCloud\Credentials\Credential;
// 使用默认凭证初始化Credentials Client。
$bearerToken = new Credential();
$config = new Config();
// 访问的域名,支持ipv4和ipv6两种方式,ipv6请使用docmind-api-dualstack.cn-hangzhou.aliyuncs.com
$config->endpoint = "docmind-api.cn-hangzhou.aliyuncs.com";
// 通过credentials获取配置中的AccessKey ID
$config->accessKeyId = $bearerToken->getCredential()->getAccessKeyId();
// 通过credentials获取配置中的AccessKey Secret
$config->accessKeySecret = $bearerToken->getCredential()->getAccessKeySecret();
$config->type = "access_key";
$config->regionId = "cn-hangzhou";
$client = new Docmindapi($config);
$request = new GetDocStructureResultRequest();
$request->id = "docmind-20220902-824b****";
$runtime = new RuntimeOptions();
$runtime->maxIdleConns = 3;
$runtime->connectTimeout = 10000;
$runtime->readTimeout = 10000;
try {
$response = $client->getDocStructureResult($request, $runtime);
var_dump($response->toMap());
} catch (TeaUnableRetryError $e) {
var_dump($e->getMessage());
var_dump($e->getErrorInfo());
var_dump($e->getLastException());
var_dump($e->getLastRequest());
}
查询结果有处理中、处理成功、处理失败三种情况,分别说明每种情况的返回结果示例。
处理中的返回结果如下所示:
{
"RequestId": "2AABD2C2-D24F-12F7-875D-683A27C3****",
"Completed": false,
"Code": "DocProcessing",
"Message": "Document processing",
"HostId": "ocr-api.cn-hangzhou.aliyuncs.com",
"Recommend": "https://next.api.aliyun.com/troubleshoot?q=DocProcessing&product=docmind-api"
}
处理中Completed会返回false,表示任务没有处理结束,仍在处理中。这种情况需要继续轮询,直到明确返回Completed为true或者超过轮询最大时间。
处理失败的返回结果如下所示:
{
"RequestId": "A8EF3A36-1380-1116-A39E-B377BE27****",
"Completed": true,
"Status": "Fail",
"Code": "UrlNotLegal",
"Message": "Failed to process the document. The document url you provided is not legal.",
"HostId": "docmind-api.cn-hangzhou.aliyuncs.com",
"Recommend": "https://next.api.aliyun.com/troubleshoot?q=IDP.UrlNotLegal&product=docmind-api"
}
处理失败Completed会返回true,表示任务处理结束,同时会返回Status为字符串的Fail,表示处理成功失败,同时会返回失败Code和详细原因Message。访问错误码可以查看错误码详细介绍。
处理成功的返回结果如下所示:
{
"Status": "Success",
"RequestId": "73134E1A-E281-1B2C-A105-D0ECFE2DFail",
"Completed": true,
"Data": {
"styles": [{
"styleId": 0,
"underline": false,
"deleteLine": false,
"bold": true,
"italic": false,
"fontSize": 15,
"fontName": "黑体",
"color": "000000",
"charScale": 0.95
},
{
"styleId": 1,
"underline": false,
"deleteLine": false,
"bold": false,
"italic": false,
"fontSize": 12,
"fontName": "微软雅黑",
"color": "000000",
"charScale": 1
}
],
"layouts": [{
"text": "测试标题",
"index": 0,
"uniqueId": "xxxx9816e77caea338df554b80ab95c7",
"alignment": "center",
"pageNum": [
0
],
"pos": [{
"x": 405,
"y": 192
},
{
"x": 860,
"y": 191
},
{
"x": 860,
"y": 236
},
{
"x": 406,
"y": 237
}
],
"type": "title",
"subType":"doc_title"
}, {
"text": "本段为测试内容",
"index": 1,
"uniqueId": "xxxx8606c213c01c12d70f98dcfb2525",
"alignment": "left",
"pageNum": [
0
],
"pos": [{
"x": 187,
"y": 311
},
{
"x": 1075,
"y": 311
},
{
"x": 1076,
"y": 373
},
{
"x": 187,
"y": 373
}
],
"type": "text",
"subType":"para",
"lineHeight": 7,
"firstLinesChars": 30,
"blocks": [{
"text": "本段",
"pos": null,
"styleId": 0
},
{
"text": "为测试内容",
"pos": null,
"styleId": 1
}
]
}],
"logics": {
"docTree": [{
"uniqueId": "xxxx9816e77caea338df554b80ab95c7",
"level": 0,
"link": {
"下级": [
],
"包含": [
]
},
"backlink": {
"上级": [
"ROOT"
]
}
}],
"paragraphKVs": null,
"tableKVs": null
},
"docInfo": {
"docType": "pdf",
"orignalDocName": "1.pdf",
"pages": [{
"imageType": "JPEG",
"imageUrl": "http://test.moshi.aliyuncs.com/docMind/image/xxxx3cccbfec45b48d3a8081c9c9659e/0",
"angle": null,
"imageWidth": 1273,
"imageHeight": 1801,
"pageIdCurDoc": 1,
"pageIdAllDocs": 1
}]
}
}
}
处理成功Completed会返回true,表示任务处理结束,同时会返回Status为字符串的Success,表示处理成功。具体的处理结果在Data节点中,接下来介绍Data节点的具体格式:
Data | object | 解析结果 |
+ styles | array | 样式列表(全文档中block的去重样式列表) |
++ styleId | int | 样式ID |
++ underline | bool | 是否有下划线 |
++ deleteLine | bool | 是否有删除线 |
++ bold | bool | 是否加粗 |
++ fontSize | int | 字号大小 |
++ fontName | string | 字体名称 |
++ color | string | 文字颜色 |
++ charScale | float | 对齐宽高比例尺字体高度不变的情况下,宽度会有变化,计算逻辑为宽/高 |
+ layouts | array | 版面信息列表 |
++ uniqueId | string | 版面信息唯一ID |
++ index | int | 版面阅读顺序 |
++ type | string | 版面类型(详见备注版面类型) |
++ subType | string | 版面子类型(详见备注版面类型) |
++ text | string | 文本内容 |
++ alignment | string | 间距枚举 |
++ pos | array | 坐标 |
++ pageNum | array | 版面所在页数(可能多页) |
++ lineHeight | int | 行平均高度(段落版面特有) |
++ firstLinesChars | int | 文字首行缩进 (段落版面特有) |
++ numCol | int | 表格总列数(表格版面类型特有) |
++ numRow | int | 表格总行数(表格版面类型特有) |
++ cells | string | 单元格信息(类型是表格才有) |
+++ cellId | string | 单元格ID(单个版面信息中唯一) |
+++ cellUniqueId | string | 单元格ID(全局唯一) |
+++ type | string | 单元格类型 |
+++ alignment | string | 单元格对齐方式 |
+++ pageNum | array | 单元格所在页数(可能多页) |
+++ xsc | int | 起始单元格横向是第几列 |
+++ ysc | int | 起始单元格纵向是第几行 |
+++ xec | int | 结束单元格横向是第几列 |
+++ yec | int | 结束单元格纵向是第几行 |
+++ pos | array | 单元格坐标 |
+++ text | string | 单元格文本内容 |
+++ layouts | array | 内嵌版面信息 |
+ logics | array | 逻辑信息列表 |
++ docTree | array | 层级树信息列表 |
+++ uniqueId | string | 层级树节点的唯一ID |
+++ level | int | 节点层级 |
+++ link | object | 子节点 |
+++ backlink | object | 父节点 |
+ paragraphKVs | array | 段落kv列表 |
++ kvInfo | array | 段落kv信息 |
+++ key | array | key列表 |
+++ value | array | value列表 |
+++ extInfo | object | 扩展信息 |
+ tableKVs | array | 表格kv列表 |
++ kvInfo | object | 段落kv信息 |
+++ key | array | key列表 |
+++ value | array | value列表 |
+++ extInfo | object | 扩展信息 |
++ kvListInfo | array | 段落kvList的列表 |
+++ key | array | key列表 |
+++ value | array | value列表 |
+++ extInfo | object | 扩展信息 |
++ cellIdRelations | array | 单元格对应关系列表 |
+++ key | array | key所在单元格ID列表 |
+++ value | array | value所在单元格ID列表 |
+++ extInfo | object | 扩展信息 |
+ docInfo | object | 文档信息 |
++ docType | string | 文档类型 |
++ imageCount | int | 图片数量 |
++ tableCount | int | 表格数量 |
++ pageCountEstimate | int | 文档页数 |
++ paragraphCount | int | 段落数量 |
++ tokens | long | 英文单词数,或中文字数 |
++ docUrl | string | 文档URL地址 |
++ orignalDocName | string | 用户提供的原始文档名称 |
++ originalDocUrl | string | 用户提供的原始文档URL地址 |
++ pages | array | 文档页面列表 |
+++ imageType | string | 页面转换后的类型 |
+++ imageUrl | string | 页面转图片后的图片URL |
+++ angle | float | 页面转图片后的图片的旋转角度 |
+++ imageWidth | int | 页面转图的宽 |
+++ imageHeight | int | 页面转图的高 |
+++ pageIdCurDoc | int | 页面在当前文档的页索引,从0开始 |
+++ pageIdAllDocs | int | 页面在所有文档的页索引,从0开始 |
场景示例
本内容阐述获取json后,场景处理使用上建议和方案:
获取markdown信息
GetDocStructureResult设置RevealMarkdown为true,ImageStrategy为url
import json
response = json.load(open("demo.json", "r"))
doc_json = response["Data"]
markdown_str = ""
for layout in doc_json["layouts"]:
markdown_str+=layout["markdownContent"]+" \n"
print(markdown_str)
获取指定层级内容
SubmitDocStructureJob/SubmitDocStructureJobAdvance 接口中,设置doctree或default,用于获取文档的结构信息
import json
response = json.load(open("demo.json", "r"))
doc_json = response["Data"]
doc_tree = doc_json["logics"]["docTree"]
layout_cache: {} = {}
for layout in doc_json["layouts"]:
layout_cache[layout["uniqueId"]] = layout
layout["children"] = list()
for node in doc_tree:
father = node["backlink"]["上级"][0]
child = node["uniqueId"]
if father in layout_cache:
# 设置 子layout
layout_cache[father]["children"].append(layout_cache[child])
for layout in doc_json["layouts"]:
# 当前layout下的子layout
print(layout["children"])
附录
doc-json数据结构
VERSION(STRING: DOC-JSON版本信息)
Doc-json | styles(array:无重复的样式集合) |
layouts(array:版面信息列表) | |
logics(object:逻辑信息,如层级树、表格KV、段落KV等) | |
doclnfo(object:文档信息) | |
version(string:doc-json版本信息) |
版面类型
文档智能解析返回结果中,版面的类型type及子类型subType列表如下:
type(类型) | 类型描述 | subType(子类型) | 子类型描述 |
title | 标题 | doc_name | 文档名称 |
doc_title | 文档标题 | ||
doc_subtitle | 文档副标题 | ||
para_title | 段落标题 | ||
table | 表格 | 无 | 无 |
table_name | 表格名 | table_name | 表格标题 |
table_note | 表注 | table_note | 表注 |
multicolumn | 多栏文字 | 无 | 无 |
formula | 公式 | formula | 公式 |
contents_title | 目录标题 | cate_title | 目录标题 |
contents | 目录主体 | cate | 目录主体 |
text | 普通文字 | para | 段落 |
figure | 图表 | picture | 图片 |
logo | logo | ||
figure_name | 图名 | pic_title | 图片标题 |
figure_note | 图注 | pic_caption | 图注 |
foot | 页脚 | page_footer | 页脚 |
foot_image | 页脚图片 | 无 | 无 |
head | 页眉 | page_header | 页眉 |
head_image | 页眉图片 | 无 | 无 |
head_pagenum | 页眉页码 | page | 页码 |
foot_pagenum | 页脚页码 | page | 页码 |
corner_note | 脚注 | footer_note | 脚注 |
end_note | 尾注 | endnode | 尾注 |
side | 侧栏 | sidebar | 侧栏 |