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", "~");
|
}
|
}
|