From 7dbab2a7af396fd02012cc1527e006425e7d3aa4 Mon Sep 17 00:00:00 2001
From: P15GEN2\59518 <lilith@highdatas.com>
Date: 星期六, 18 十月 2025 12:51:53 +0800
Subject: [PATCH] no message
---
ai/src/ai/AliyunOcrApiDirect.java | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 162 insertions(+), 0 deletions(-)
diff --git a/ai/src/ai/AliyunOcrApiDirect.java b/ai/src/ai/AliyunOcrApiDirect.java
new file mode 100644
index 0000000..33556bf
--- /dev/null
+++ b/ai/src/ai/AliyunOcrApiDirect.java
@@ -0,0 +1,162 @@
+package ai;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+public class AliyunOcrApiDirect {
+
+ private final String accessKeyId;
+ private final String accessKeySecret;
+ private final String baseUrl;
+
+ public AliyunOcrApiDirect() {
+ this.accessKeyId = "LTAI5tCSkZYYhkUCsk4v4CCu";
+ this.accessKeySecret = "vhJBGvKQKmKFIpUq6WQndYYMwwRaP7";
+ this.baseUrl = "https://ocr.cn-shanghai.aliyuncs.com?";
+ }
+
+ /**
+ * PDF璇嗗埆
+ */
+ public String recognizePdf(String fileUrl, int pageNumber) throws Exception {
+ Map<String, Object> params = new HashMap<>();
+ params.put("PdfOcr", true);
+ params.put("PdfPageNumber", pageNumber);
+ return callOcrApi("RecognizeAdvanced", fileUrl, params);
+ }
+
+ private String callOcrApi(String action, String fileUrl, Map<String, Object> extraParams) throws Exception {
+ // 1. 鍑嗗鍩烘湰鍙傛暟
+ String timestamp = getTimestamp();
+ String signatureNonce = UUID.randomUUID().toString();
+
+ // 2. 鏋勫缓鏌ヨ鍙傛暟
+ StringBuilder queryParams = new StringBuilder();
+ queryParams.append("Action=").append(action);
+ queryParams.append("&Format=JSON");
+ queryParams.append("&Version=2021-07-07");
+ queryParams.append("&AccessKeyId=").append(accessKeyId);
+ queryParams.append("&SignatureMethod=HMAC-SHA1");
+ queryParams.append("&Timestamp=").append(encode(timestamp));
+ queryParams.append("&SignatureVersion=1.0");
+ queryParams.append("&SignatureNonce=").append(signatureNonce);
+ queryParams.append("&RegionId=cn-shanghai");
+
+ // 3. 鐢熸垚绛惧悕
+ String signature = generateSignature("POST", queryParams.toString());
+ queryParams.append("&Signature=").append(encode(signature));
+
+ // 4. 鏋勫缓瀹屾暣URL
+ String url = baseUrl + queryParams;
+
+ // 5. 鏋勫缓璇锋眰浣�
+ String requestBody = buildRequestBody(fileUrl, extraParams);
+
+ // 6. 鍙戦�佽姹�
+ return sendHttpRequest(url, requestBody);
+ }
+
+ private String generateSignature(String method, String queryParams) throws Exception {
+ String stringToSign = method + "&%2F&" + encode(queryParams);
+
+ javax.crypto.Mac mac = javax.crypto.Mac.getInstance("HmacSHA1");
+ mac.init(new javax.crypto.spec.SecretKeySpec(
+ (accessKeySecret + "&").getBytes(StandardCharsets.UTF_8), "HmacSHA1"));
+ byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8));
+
+ return Base64.getEncoder().encodeToString(signData);
+ }
+
+ private String buildRequestBody(File file, Map<String, Object> extraParams) throws Exception {
+ byte[] fileBytes = Files.readAllBytes(file.toPath());
+ String base64Data = Base64.getEncoder().encodeToString(fileBytes);
+
+ StringBuilder json = new StringBuilder();
+ json.append("{\"ImageData\":\"").append(base64Data).append("\"");
+
+ for (Map.Entry<String, Object> entry : extraParams.entrySet()) {
+ json.append(",\"").append(entry.getKey()).append("\":");
+ if (entry.getValue() instanceof Boolean) {
+ json.append(entry.getValue());
+ } else if (entry.getValue() instanceof Number) {
+ json.append(entry.getValue());
+ } else {
+ json.append("\"").append(entry.getValue()).append("\"");
+ }
+ }
+ json.append("}");
+
+ return json.toString();
+ }
+
+ private String buildRequestBody(String fileUrl, Map<String, Object> extraParams) throws Exception {
+ StringBuilder json = new StringBuilder();
+ json.append("{\"url\":\"").append(fileUrl).append("\"");
+
+ for (Map.Entry<String, Object> entry : extraParams.entrySet()) {
+ json.append(",\"").append(entry.getKey()).append("\":");
+ if (entry.getValue() instanceof Boolean) {
+ json.append(entry.getValue());
+ } else if (entry.getValue() instanceof Number) {
+ json.append(entry.getValue());
+ } else {
+ json.append("\"").append(entry.getValue()).append("\"");
+ }
+ }
+ json.append("}");
+
+ return json.toString();
+ }
+
+ private String sendHttpRequest(String urlStr, String requestBody) throws Exception {
+ URL url = new URL(urlStr);
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+
+ connection.setRequestMethod("POST");
+ connection.setDoOutput(true);
+ connection.setRequestProperty("Content-Type", "application/json");
+ connection.setRequestProperty("Accept", "application/json");
+
+ try (OutputStream os = connection.getOutputStream()) {
+ os.write(requestBody.getBytes(StandardCharsets.UTF_8));
+ }
+
+ int responseCode = connection.getResponseCode();
+ if (responseCode == 200) {
+ try (BufferedReader br = new BufferedReader(
+ new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8))) {
+ StringBuilder response = new StringBuilder();
+ String line;
+ while ((line = br.readLine()) != null) {
+ response.append(line);
+ }
+ return response.toString();
+ }
+ } else {
+ throw new RuntimeException("API璇锋眰澶辫触锛岀姸鎬佺爜: " + responseCode);
+ }
+ }
+
+ private String getTimestamp() {
+ return java.time.Instant.now().atZone(java.time.ZoneOffset.UTC)
+ .format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'"));
+ }
+
+ private String encode(String value) {
+ return URLEncoder.encode(value)
+ .replace("+", "%20")
+ .replace("*", "%2A")
+ .replace("%7E", "~");
+ }
+}
\ No newline at end of file
--
Gitblit v1.8.0