文档智能解析可提取文档中的层级结构、文本内容、KV字段和样式信息。本文介绍其API调用方式,调用前建议先查阅各种编程语言对应的SDK 使用指南,例如 Java SDK使用指南。
调用方式
文档智能解析接口为异步接口,需要先调用文档智能解析异步提交服务接口SubmitDocStructureJob或者SubmitDocStructureJobAdvance接口进行异步任务提交,然后调用文档智能解析结果查询服务接口GetDocStructureResult进行结果轮询。如下所示为文档智能解析使用流程图:
- 建议每10秒轮询一次,最长持续轮询120分钟。若120分钟内未查询到处理完成结果,则视为处理超时。异步任务提交后,用户可在任务状态变为完成(包括成功/超时/失败)后的24小时内查询结果;超出24小时则结果数据将被清除,无法再查询。 
- 免费额度100页,耗尽后自动转为按量计费:累计解析超过100页后所有文档解析自动转为按量计费,产生后付费账单。 
- 文档智能解析支持的文档格式:PDF、Word、图片(JPG/PNG等主流格式),支持解析文档中的表格。 
- 解析效果优先级排序:文档解析(大模型版)>文档智能解析>电子文档解析;解析速度优先级排序:电子文档解析>文档解析(大模型版)>文档智能解析。 
步骤一:调用文档智能解析异步提交服务接口
本接口支持本地文档上传和传入文档URL这两种调用方式:
- 本地文件上传的异步提交服务接口为:SubmitDocStructureJobAdvance接口。 
- url上传的异步提交服务接口为:SubmitDocStructureJob接口。 
- 异步处理的时长以实际测试为准,开通电子文档解析服务后我们会提供免费额度供您测试。 
- FileName、FileNameExtension参数,服务会根据后缀配置解析器,若不确定文档类型,可配置无后缀的文件名后台进行默认路由配置,避免非预期解析结果产生; 
使用示例
以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****"
  }  
}请求参数
| 名称 | 类型 | 必填 | 描述 | 示例值 | 
| 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 | 
| OssBucket | string | 否 | 个人的oss bucket名称,具体可查看OSS托管支持 | docmind-trust | 
| OssEndpoint | string | 否 | 个人的oss endpoint地址,具体可查看OSS托管支持 | oss-cn-hangzhou.aliyuncs.com | 
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 | 
步骤二:调用文档智能解析结果查询服务GetDocStructureResult接口
调用GetDocStructureResult查询接口的入参ID就是步骤一异步任务提交接口返回的出参ID,查询结果有处理中、处理成功、处理失败三种情况。
使用示例
以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开始 
请求参数
| 名称 | 类型 | 必填 | 描述 | 示例值 | 
| 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 | 
场景示例
本内容阐述获取JSON后,场景处理使用上的建议和方案。获取JSON文件的方式如下(这里以Python代码示例):
若要获取JSON文件,则需要在步骤二中的示例代码中添加reveal_markdown=True参数(在请求参数里有说明),同时需要打印完整的JSON格式信息。完整的代码块展示如下,在添加完该参数后运行代码,将返回的结果放到一个JSON文件里,这个文件就是下方对应修改的“demo.json”文件。修改时填写文件的绝对路径即可。
import json
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-20250421-******************',
        reveal_markdown=True,
    )
    try:
        # 复制代码运行请自行打印 API 的返回值
        response = client.get_doc_structure_result(request)
        # API返回值格式层级为 body -> data -> 具体属性。可根据业务需要打印相应的结果。获取属性值均以小写开头
        # 获取异步任务处理情况,可根据response.body.completed判断是否需要继续轮询结果
        print(json.dumps(response.body.data))
        # 获取返回结果。建议先把response.body.data转成json,然后再从json里面取具体需要的值。
    except Exception as error:
        # 如有需要,请打印 error
        UtilClient.assert_as_string(error.message)
获取Markdown信息
GetDocStructureResult设置RevealMarkdown为True,ImageStrategy为url。
import json
response = json.load(open("demo.json", "r"))
doc_json = response
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数据结构
版本信息如下:
| Doc-JSON | styles(array:无重复的样式集合) | 
| layouts(array:版面信息列表) | |
| logics(object:逻辑信息,如层级树、表格KV、段落KV等) | |
| doc_lnfo(object:文档信息) | |
| version(string:doc-json版本信息) | 
版面类型
文档智能解析返回结果中,版面的类型type及子类型subType列表如下:
| type(类型) | 类型描述 | subType(子类型) | 子类型描述 | 
| title | 标题 | doc_name | 文档名称 | 
| doc_title | 文档标题 | ||
| doc_subtitle | 文档副标题 | ||
| para_title | 段落标题 | ||
| contents_title | 目录标题 | cate_title | 目录标题 | 
| contents | 目录主体 | cate | 目录主体 | 
| text | 普通文字 | para | 段落 | 
| figure | 图表 | picture | 图片 | 
| logo | logo | ||
| figure_name | 图名 | pic_title | 图片标题 | 
| figure_note | 图注 | pic_caption | 图注 | 
| foot | 页脚 | page_footer | 页脚 | 
| head | 页眉 | page_header | 页眉 | 
| head_pagenum | 页眉页码 | page | 页码 | 
| foot_pagenum | 页脚页码 | page | 页码 | 
| corner_note | 脚注 | footer_note | 脚注 | 
| end_note | 尾注 | endnode | 尾注 | 
| side | 侧栏 | sidebar | 侧栏 | 
相同子类型的 type 如下
| type(类型) | 类型描述 | 
| table_name | 表格名称 | 
| table_note | 表注 | 
| formula | 公式 | 
无子类型的 type
| type(类型) | 类型描述 | 
| multicolumn | 多栏文字 | 
| table | 表格 | 
| foot_image | 页脚图片 | 
| head_image | 页眉图片 |