文档智能解析

文档智能解析可进行通用文档抽取和理解,从文档中提取出层级结构、文本内容、KV字段、样式信息等。通过使用文档智能解析,您可以方便地对文本进行分析和处理,提高工作效率,提升业务能力。本文介绍文档智能解析API的调用方式。在调用OpenAPI接口前,请先阅读API使用指南

调用方式

文档智能解析接口为异步接口,需要先调用文档智能解析异步提交服务SubmitDocStructureJob或者SubmitDocStructureJobAdvance接口进行异步任务提交,然后调用文档智能解析结果查询服务GetDocStructureResult接口进行结果轮询。如下所示为文档智能解析使用流程图:

image
说明
  • 建议每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二选一。

pdf

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,用于获取文档的结构信息。

获取指定层级内容架构图如下:

yuque_diagram.jpg

获取指定层级内容代码如下:

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

侧栏