本文介紹如何使用阿里云Java語言SDK開發(fā)包,調用文檔智能解析的SubmitDocStructureJob接口(本地文件上傳的異步提交服務接口)、SubmitDocStructureJob接口(URL上傳的異步提交服務接口)和GetDocStructureResult接口(解析結果查詢服務接口),從文檔中提取出層級結構、文本內容、KV字段、樣式信息等。
查看OpenAPI文檔
在調用OpenAPI前,建議您先閱讀對應接口文檔,了解、學習調用該接口所需要的參數及權限等。更多信息,請參見API概覽。
準備工作
在使用Java語言SDK方式調用OpenAPI之前,請您完成如下準備工作。
準備Java SDK環(huán)境
在使用Java SDK前,您需要配置好Java SDK環(huán)境,Java版本要求Java 8及以上。
在Maven項目的pom.xml文件中,添加阿里云sdk核心庫tea-openapi、文檔智能sdk docmind_api20220711依賴,如下所示:
<dependencies> <dependency> <groupId>com.aliyun</groupId> <artifactId>tea-openapi</artifactId> <version>0.2.5</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>docmind_api20220711</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.68.noneautotype</version> </dependency> </dependencies>
配置身份認證
創(chuàng)建AccessKey。詳細內容,請參見創(chuàng)建AccessKey。
創(chuàng)建RAM用戶:您可以創(chuàng)建RAM用戶并為其授權,實現不同RAM用戶擁有不同資源訪問權限的目的。當您的企業(yè)存在多用戶協同訪問資源的場景時,使用RAM可以按需為用戶分配最小權限,避免多用戶共享阿里云賬號(主賬號)密碼或訪問密鑰,從而降低企業(yè)的安全風險。阿里云基于最佳實踐,提供了常見場景的快速配置方式,且預置了對應RAM用戶的權限策略,方便您快速創(chuàng)建RAM用戶并授權。同時,您也可以根據自己的實際業(yè)務需求,采用手動配置的方式,手動創(chuàng)建RAM用戶并授權。詳細內容,請參見創(chuàng)建RAM用戶并授權。
重要阿里云賬號(主賬號)默認擁有當前賬號下所有云資源的Administrator權限,且無法修改。阿里云賬號(主賬號)的AccessKey泄露會威脅該賬號下所有資源的安全。為保證賬號安全,強烈建議您不要給阿里云賬號(主賬號)創(chuàng)建AccessKey,建議您創(chuàng)建專用于API訪問的RAM用戶并創(chuàng)建對應的AccessKey,完成最小化授權后,通過編程的方式訪問阿里云資源。
不要將AccessKey ID和AccessKey Secret保存到工程代碼里,避免AccessKey泄露。更多關于憑據的安全使用建議,請參見憑據的安全使用方案。
添加阿里云SDK Credentials依賴。具體代碼如下:
<dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>0.2.11</version> </dependency>
配置身份認證:本文以配置文件的方式為例。詳細內容,請參見管理訪問憑據。
調用OpenAPI
文檔智能解析接口為異步任務接口,需要先調用文檔智能解析異步提交服務SubmitDocStructureJobAdvance或SubmitDocStructureJob接口進行異步任務提交,然后調用文檔智能解析結果查詢服務GetDocStructureResult接口進行結果輪詢。
建議每10秒輪詢一次,最多輪詢120分鐘,如果120分鐘還未查詢到處理完成結果,則視為處理超時。
當異步任務處理提交后,用戶可以在處理結束后的24小時之內查詢處理結果,超過24小時后將無法查詢到處理結果。
圖片轉Word、圖片轉Excel、圖片轉PDF接口不支持文件上傳方式。
調用接口提交文檔處理任務
異步提交服務支持上傳本地文件和url文件兩種方式:
上傳本地文件的異步提交服務接口為:SubmitDocStructureJobAdvance接口。
上傳url文件的異步提交服務接口為:SubmitDocStructureJob接口。
若您需要識別的文件為大文件,耗時較長,可對config對象設置以下屬性。
// 建立連接超時時間
config.connectTimeout = 60000;
// 讀取資源超時時間
config.readTimeout = 60000;
使用本地文檔提交異步任務
如下代碼所示為調用SubmitDocStructureJobAdvance接口通過本地文件上傳方式提交異步任務示例。
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 {
// 調用接口時,程序直接訪問憑證,讀取您的訪問密鑰(即AccessKey)并自動完成鑒權。
// 運行本示例前,請先完成步驟二:配置身份認證。
// 本示例使用默認配置文件方式,通過配置Credentials文件創(chuàng)建默認的訪問憑證。
// 使用默認憑證初始化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);
// 創(chuàng)建RuntimeObject實例并設置運行參數。
RuntimeOptions runtime = new RuntimeOptions();
// 替換成具體異步任務提交類API接口的入參和方法,示例方法是文檔智能解析。
SubmitDocStructureJobAdvanceRequest advanceRequest = new SubmitDocStructureJobAdvanceRequest();
File file = new File("D:\\example.pdf");
advanceRequest.fileUrlObject = new FileInputStream(file);
advanceRequest.fileName = "example.pdf";
// 4 發(fā)起請求并處理應答或異常。
SubmitDocStructureJobResponse response = client.submitDocStructureJobAdvance(advanceRequest, runtime);
System.out.println(JSON.toJSON(response.getBody()));
}
返回結果
{
"RequestId": "4FF7D611-782B-1557-AF71-6541E10A****",
"Data": {
"Id": "docmind-20220902-824b****"
}
}
傳入文檔URL提交異步任務
您傳入的文檔URL必須為公網可訪問下載的URL地址,無跨域限制,URL不帶特殊轉義字符。以下代碼示例表示調用SubmitDocStructureJob接口通過傳入文檔URL方式調用異步任務提交類API。
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 {
// 調用接口時,程序直接訪問憑證,讀取您的訪問密鑰(即AccessKey)并自動完成鑒權。
// 運行本示例前,請先完成步驟二:配置身份認證。
// 本示例使用默認配置文件方式,通過配置Credentials文件創(chuàng)建默認的訪問憑證。
// 使用默認憑證初始化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);
// 替換成具體異步任務提交類API接口的入參和方法,示例方法是文檔智能解析。
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()));
}
返回結果
{
"RequestId": "4FF7D611-782B-1557-AF71-6541E10A****",
"Data": {
"Id": "docmind-20220902-824b****"
}
}
調用結果查詢類API
以調用文檔層級結構查詢服務GetDocStructureResultRequest接口為例,查詢結果有處理中、處理成功、處理失敗三種情況。如下代碼示例表示調用結果查詢類API:
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 {
// 調用接口時,程序直接訪問憑證,讀取您的訪問密鑰(即AccessKey)并自動完成鑒權。
// 運行本示例前,請先完成步驟二:配置身份認證。
// 本示例使用默認配置文件方式,通過配置Credentials文件創(chuàng)建默認的訪問憑證。
// 使用默認憑證初始化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****";
// 替換成具體結果查詢類API接口,示例方法是文檔智能解析。
GetDocStructureResultResponse response = client.getDocStructureResult(resultRequest);
System.out.println(JSON.toJSON(response.getBody()));
}
返回結果
返回結果分為處理中、處理成功、處理失敗三種情況。
處理中的返回結果如下所示,Completed返回值為false,表示任務沒有處理結束,仍在處理中。這種情況需要繼續(xù)輪詢,直到Completed返回值為true或者超過輪詢最大時間。
{ "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返回值為true,表示任務處理結束,Status返回值為Success,表示處理成功。具體的處理結果在Data節(jié)點中。
{ "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返回值為Fail,表示處理失敗,同時會返回失敗Code和詳細原因Message。訪問錯誤碼可以查看錯誤碼詳細介紹。
{ "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" }