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