文档智能解析可进行通用文档抽取和理解,从文档中提取出层级结构、文本内容、KV字段、样式信息等。通过使用文档智能解析,您可以方便地对文本进行分析和处理,提高工作效率,提升业务能力。本文介绍文档智能解析API的调用方式。在调用OpenAPI接口前,请先阅读API使用指南。
调用方式
文档智能解析接口为异步接口,需要先调用文档智能解析异步提交服务SubmitDocStructureJob或者SubmitDocStructureJobAdvance接口进行异步任务提交,然后调用文档智能解析结果查询服务GetDocStructureResult接口进行结果轮询。如下所示为文档智能解析使用流程图:
建议每10秒轮询一次,最多轮询120分钟,如果120分钟还未查询到处理完成结果,则视为处理超时。
当异步任务处理提交后,用户可以在处理结束后的24小时之内查询处理结果,超过24小时后将无法查询到处理结果。
文档的免费额度为100页,用完即止。若您的免费额度或资源包消耗完毕,系统将默认采用按量付费的后付费计费方式。
首次解析超过100页的文档,解析成功后,系统会自动进入后付费计费模式,产生后付费账单。
支持的文档格式:pdf、word和图片,图片支持jpg、jpeg、png、bmp、gif。
步骤一:调用文档智能解析异步提交服务SubmitDocStructureJob接口
异步提交服务支持本地文件和url文件两种方式:
本地文件上传的异步提交服务接口为:SubmitDocStructureJobAdvance接口。
url上传的异步提交服务接口为:SubmitDocStructureJob接口。
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
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。针对文档中包含的公式以latex方式进行输出,结合GetDocStructureResult配置Markdown输出。 | true |
AllowPptFormat | bool | 否 | 是否允许PDF类型PPT,默认为true。 | true |
StructureType参数说明:
枚举值 | 是否包含坐标信息 | 是否包含文本信息 | 是否包含layout字段,版面信息 | 是否包含logic.docTree字段,层级树信息 | 是否包含logic.paragraphKV/tableKV字段,kv信息 | 参数说明 |
layout | 是 | 是 | 是 | 否 | 否 | 返回结果仅包括版面信息,如段落、表格、图等,包括版面文本、版面坐标等信息。 |
doctree | 是 | 是 | 是 | 是 | 否 | 返回结果包括版面、层级树信息。文档层级结构信息会以版面为基础,构建全文档的树形层级结构。 |
default | 是 | 是 | 是 | 是 | 是 | 默认走全链路结构化解析,将返回以下全部结构化信息。 |
返回参数
名称 | 类型 | 描述 | 示例值 |
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 main(String[] args) throws Exception {
submit();
}
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);
System.out.println(JSON.toJSON(response.getBody()));
}
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
if __name__ == '__main__':
# 使用默认凭证初始化Credentials Client。
cred=CredClient()
config = open_api_models.Config(
# 通过credentials获取配置中的AccessKey ID
access_key_id=cred.get_credential().get_access_key_id(),
# 通过credentials获取配置中的AccessKey Secret
access_key_secret=cred.get_credential().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)
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 main(String[] args) throws Exception {
submit();
}
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);
System.out.println(JSON.toJSON(response.getBody()));
}
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
if __name__ == '__main__':
# 使用默认凭证初始化Credentials Client。
cred=CredClient()
config = open_api_models.Config(
# 通过credentials获取配置中的AccessKey ID
access_key_id=cred.get_credential().get_access_key_id(),
# 通过credentials获取配置中的AccessKey Secret
access_key_secret=cred.get_credential().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)
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());
}
正常返回示例:
{
"RequestId": "43A29C77-405E-4CC0-BC55-EE694AD0****",
"Data": {
"Id": "docmind-20220712-b15f****"
}
}
步骤二:调用文档智能解析结果查询服务GetDocStructureResult接口
调用GetDocStructureResult查询接口的入参ID就是前面异步任务提交接口返回的出参ID,查询结果有处理中、处理成功、处理失败三种情况。
请求参数
名称 | 类型 | 必填 | 描述 | 示例值 |
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适合较小文件,建议小于1M的图片使用base64。推荐使用url,但注意url会有时效期,一般为12小时。
根据您计算机的规格大小,如果上传的文件较大或者文件内容较多 ,建议开启UseUrlResponseBody,可以有效避免接口超时等问题,但注意url会有时效期,一般为12小时。
返回参数
名称 | 类型 | 描述 | 示例值 |
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 main(String[] args) throws Exception {
submit();
}
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);
System.out.println(JSON.toJSON(response.getBody()));
}
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
if __name__ == '__main__':
# 使用默认凭证初始化Credentials Client。
cred=CredClient()
config = open_api_models.Config(
# 通过credentials获取配置中的AccessKey ID
access_key_id=cred.get_credential().get_access_key_id(),
# 通过credentials获取配置中的AccessKey Secret
access_key_secret=cred.get_credential().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)
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数据结构
版本(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 | 侧栏 |