@ -0,0 +1,168 @@ | |||||
package org.jeecg.modules.miniapp.utils; | |||||
import cn.hutool.core.codec.Base64; | |||||
import cn.hutool.http.HttpRequest; | |||||
import cn.hutool.json.JSONUtil; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import java.io.File; | |||||
import java.io.IOException; | |||||
import java.nio.file.Files; | |||||
/** | |||||
* @author Tanzs | |||||
* @date 2025/2/19 下午4:14 | |||||
* @description | |||||
*/ | |||||
@Slf4j | |||||
public class BaiduOCRUtil { | |||||
private static final String API_KEY = "ILgowCd9vTRSAEPRPhVvn0Oy"; // API Key | |||||
private static final String SECRET_KEY = "pqRPRjUaHvpgupAiPw7YtHaoj2GnE74S"; // Secret Key | |||||
private static final String ACCESS_TOKEN_URL = "https://aip.baidubce.com/oauth/2.0/token"; | |||||
/** | |||||
* 身份证识别API | |||||
* @param image 文件 url/文件 path | |||||
* @param base64 是否为base64 | |||||
* @return | |||||
* @throws IOException | |||||
*/ | |||||
public static String recognizeIdCardWithImage(String image, String type, boolean base64) throws IOException { | |||||
String accessToken = getAccessToken(); | |||||
String apiUrl = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard"; | |||||
JSONObject params = new JSONObject(); | |||||
if (base64){ | |||||
String base64Image = encodeImageToBase64(image); | |||||
params.put("image", base64Image); // 使用图片的Base64编码 | |||||
}else { | |||||
params.put("url", image); // 使用图片的URL | |||||
} | |||||
params.put("id_card_side", type); // 正反面 front/back | |||||
return makePostRequest(apiUrl, accessToken, params); | |||||
} | |||||
/** | |||||
* 营业执照识别API | |||||
* @param image 文件 url/文件 path | |||||
* @param base64 是否为base64 | |||||
* @return | |||||
* @throws IOException | |||||
*/ | |||||
public static String recognizeBusinessLicenseWithImage(String image, boolean base64) throws IOException { | |||||
String accessToken = getAccessToken(); | |||||
String apiUrl = "https://aip.baidubce.com/rest/2.0/ocr/v1/business_license"; | |||||
JSONObject params = new JSONObject(); | |||||
if (base64){ | |||||
String base64Image = encodeImageToBase64(image); | |||||
params.put("image", base64Image); // 使用图片的Base64编码 | |||||
}else { | |||||
params.put("url", image); // 使用图片的URL | |||||
} | |||||
return makePostRequest(apiUrl, accessToken, params); | |||||
} | |||||
/** | |||||
* 车辆合格证识别API | |||||
* @param image 文件 url/文件 path | |||||
* @param base64 是否为base64 | |||||
* @throws IOException | |||||
*/ | |||||
public static String recognizeVehicleCertificateWithImage(String image, boolean base64) throws IOException { | |||||
String accessToken = getAccessToken(); | |||||
String apiUrl = "https://aip.baidubce.com/rest/2.0/ocr/v1/vehicle_certificate"; | |||||
JSONObject params = new JSONObject(); | |||||
if (base64){ | |||||
String base64Image = encodeImageToBase64(image); | |||||
params.put("image", base64Image); // 使用图片的Base64编码 | |||||
}else { | |||||
params.put("image_url", image); // 使用图片的URL | |||||
} | |||||
return makePostRequest(apiUrl, accessToken, params); | |||||
} | |||||
/** | |||||
* 获取访问令牌 | |||||
* @return | |||||
*/ | |||||
private static String getAccessToken(){ | |||||
String url = ACCESS_TOKEN_URL + "?grant_type=client_credentials&client_id=" + API_KEY + "&client_secret=" + SECRET_KEY; | |||||
log.info("百度获取 token 的 URL:" + url); | |||||
String response = HttpRequest.post(url).execute().body(); | |||||
JSONObject jsonObject = JSONObject.parseObject(response); | |||||
log.info("百度获取 token 的响应:" + jsonObject.toString()); | |||||
return jsonObject.getString("access_token"); | |||||
} | |||||
/** | |||||
* 文件转换成 base64 编码 | |||||
* @param imagePath 编码 | |||||
* @return | |||||
* @throws IOException | |||||
*/ | |||||
private static String encodeImageToBase64(String imagePath) throws IOException { | |||||
byte[] imageBytes = Files.readAllBytes(new File(imagePath).toPath()); | |||||
return Base64.encode(imageBytes); | |||||
} | |||||
/** | |||||
* 发送 POST 请求 | |||||
* @param apiUrl - 接口的URL | |||||
* @param accessToken - 访问令牌 | |||||
* @param params - 请求参数 | |||||
* @return | |||||
* @throws IOException | |||||
*/ | |||||
private static String makePostRequest(String apiUrl, String accessToken, JSONObject params) { | |||||
String url = apiUrl + "?access_token=" + accessToken; | |||||
log.info("百度 POST 请求的 URL:" + url); | |||||
// log.info("百度 POST 请求的参数:" + params.toString()); | |||||
String response = HttpRequest.post(url) | |||||
.body(jsonToQueryString(params),"application/x-www-form-urlencoded") | |||||
.header("Content-Type", "application/x-www-form-urlencoded") | |||||
.execute() | |||||
.body(); | |||||
log.info("百度 POST 请求的响应:" + response); | |||||
return response; | |||||
} | |||||
public static String jsonToQueryString(JSONObject jsonObject) { | |||||
StringBuilder queryString = new StringBuilder(); | |||||
for (String key : jsonObject.keySet()) { | |||||
queryString.append(key).append("=") | |||||
.append(jsonObject.getString(key)); | |||||
// 如果不是最后一个参数,添加 "&" | |||||
if (!key.equals(jsonObject.keySet().toArray()[jsonObject.size() - 1])) { | |||||
queryString.append("&"); | |||||
} | |||||
} | |||||
return queryString.toString(); | |||||
} | |||||
/** | |||||
* 调试 | |||||
* @param args | |||||
* @throws IOException | |||||
*/ | |||||
public static void main(String[] args) throws IOException { | |||||
// 示例:调用身份证识别API(图片URL) | |||||
String idCardResultUrl = recognizeIdCardWithImage("/Users/tanzs/Pictures/cert/font.jpg","front",true); | |||||
// String idCardResultUrl = recognizeIdCardWithImage("https://jf.sh.189.cn/minio/gov-miniapp/order_pdf/font.jpg","front",false); | |||||
System.out.println("身份证识别结果: " + idCardResultUrl); | |||||
// 示例:调用营业执照识别API(图片URL) | |||||
// String businessLicenseResultUrl = recognizeBusinessLicenseWithImage("/Users/tanzs/Pictures/cert/license.jpg",true); | |||||
// System.out.println("营业执照识别结果: " + businessLicenseResultUrl); | |||||
// 示例:调用车辆合格证识别API(图片URL) | |||||
// String vehicleCertificateResultUrl = recognizeVehicleCertificateWithImage("https://example.com/path_to_vehicle_certificate_image.jpg"); | |||||
// System.out.println("车辆合格证识别结果(URL): " + vehicleCertificateResultUrl); | |||||
} | |||||
} |
@ -0,0 +1,109 @@ | |||||
package org.jeecg.modules.miniapp.utils; | |||||
import cn.hutool.http.HttpException; | |||||
import cn.hutool.http.HttpRequest; | |||||
import com.alibaba.fastjson.JSON; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import java.util.HashMap; | |||||
import java.util.Map; | |||||
@Slf4j | |||||
public class HttpRequestUtil { | |||||
public static JSONObject postBody(String url, String body, String contentType, Map<String,String> headers){ | |||||
log.info("[postBody]Post携带请求体请求方法:url:{},body:{},contentType:{},headers:{}",url,body,contentType,headers); | |||||
String res = null; | |||||
try { | |||||
// 配置请求地址 | |||||
HttpRequest post = HttpRequest.post(url) | |||||
// 配置请求体以及请求体格式 | |||||
.body(body, contentType); | |||||
// 配置请求头 | |||||
if (headers != null && !headers.isEmpty()){ | |||||
for (String key : headers.keySet()) { | |||||
post.header(key,headers.get(key)); | |||||
} | |||||
} | |||||
// 获取响应 | |||||
res = post.execute().body(); | |||||
log.info("[postBody]Post携带请求体请求方法,响应结果:res:{}",res); | |||||
} catch (HttpException e) { | |||||
log.error("接口调用异常URL{},请求报文:{},响应报文:{}", url,body,res); | |||||
throw new RuntimeException(e); | |||||
} | |||||
JSONObject result = null; | |||||
try { | |||||
result = JSON.parseObject(res); | |||||
} catch (Exception e) { | |||||
log.error("接口响应处理异常异常URL{},请求报文:{},响应报文:{}", url,body,res); | |||||
throw new RuntimeException(e); | |||||
} | |||||
log.info("[postBody]Post携带请求体请求方法返回:result:{}",JSON.toJSONString(result)); | |||||
return result; | |||||
} | |||||
public static JSONObject postFrom(String url, Map<String,Object> params, Map<String,String> headers){ | |||||
log.info("[postFrom]Form表单Post请求方法:url:{},params:{}",url,params); | |||||
String res = null; | |||||
try { | |||||
HttpRequest post = HttpRequest.post(url); | |||||
// 配置请求头 | |||||
if (headers != null && !headers.isEmpty()){ | |||||
for (String key : headers.keySet()) { | |||||
post.header(key,headers.get(key)); | |||||
} | |||||
} | |||||
res = post.form(params).execute().body(); | |||||
log.info("[postFrom]Form表单Post请求,响应结果:res:{}",res); | |||||
} catch (HttpException e) { | |||||
log.error("接口调用异常URL{},请求报文:{},响应报文:{}", url,params,res); | |||||
throw new RuntimeException(e); | |||||
} | |||||
JSONObject result = null; | |||||
try { | |||||
result = JSON.parseObject(res); | |||||
} catch (Exception e) { | |||||
log.error("接口响应处理异常异常URL{},请求报文:{},响应报文:{}", url,params,res); | |||||
throw new RuntimeException(e); | |||||
} | |||||
log.info("[postFrom]Form表单Post请求方法返回:result:{}",JSON.toJSONString(result)); | |||||
return result; | |||||
} | |||||
public static JSONObject getFrom(String url, Map<String,Object> params, Map<String,String> headers){ | |||||
log.info("[getFrom]Form表单Get请求方法:url:{},params:{}",url,params); | |||||
String res = null; | |||||
try { | |||||
HttpRequest get = HttpRequest.get(url); | |||||
// 配置请求头 | |||||
if (headers != null && !headers.isEmpty()){ | |||||
for (String key : headers.keySet()) { | |||||
get.header(key,headers.get(key)); | |||||
} | |||||
} | |||||
res = get.form(params).execute().body(); | |||||
log.info("[getFrom]Form表单Get请求方法,响应结果:res:{}",res); | |||||
} catch (HttpException e) { | |||||
log.error("接口调用异常URL{},请求报文:{},响应报文:{}", url,params,res); | |||||
throw new RuntimeException(e); | |||||
} | |||||
JSONObject result = null; | |||||
try { | |||||
result = JSON.parseObject(res); | |||||
} catch (Exception e) { | |||||
log.error("接口响应处理异常异常URL{},请求报文:{},响应报文:{}", url,params,res); | |||||
throw new RuntimeException(e); | |||||
} | |||||
log.info("[getFrom]Form表单Get请求方法返回:result:{}",JSON.toJSONString(result)); | |||||
return result; | |||||
} | |||||
public static void main(String[] args) { | |||||
HashMap<String, Object> map = new HashMap<>(); | |||||
JSONObject result = postFrom("http://36.153.19.254:9001/api/auth/login", map,null); | |||||
System.out.println(result); | |||||
} | |||||
} |
@ -0,0 +1,129 @@ | |||||
package org.jeecg.modules.miniapp.utils; | |||||
import com.itextpdf.forms.PdfAcroForm; | |||||
import com.itextpdf.forms.fields.PdfFormField; | |||||
import com.itextpdf.kernel.pdf.PdfDocument; | |||||
import com.itextpdf.kernel.pdf.PdfReader; | |||||
import com.itextpdf.kernel.pdf.PdfWriter; | |||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.net.URL; | |||||
import java.util.HashMap; | |||||
import java.util.Map; | |||||
/** | |||||
* @author Tanzs | |||||
* @date 2025/2/19 下午3:29 | |||||
* @description PDF表单填充工具类 | |||||
*/ | |||||
public class PdfFormUtils { | |||||
/** | |||||
* 通过 pdf 文本域拼接 PDF 表单 | |||||
* @param templatePath PDF 表单文件路径 | |||||
* @param outputPath 填充后的 PDF 文件路径 | |||||
* @param formData 填充的数据,键为表单字段名称,值为填充的值 | |||||
* @param fontSize 字体大小 | |||||
*/ | |||||
public static void fillPdfForm(String templatePath, String outputPath, Map<String, String> formData, float fontSize) { | |||||
try (PdfReader reader = new PdfReader(templatePath); | |||||
PdfWriter writer = new PdfWriter(outputPath); | |||||
PdfDocument pdfDoc = new PdfDocument(reader, writer)) { | |||||
// 获取表单 | |||||
PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true); | |||||
// 填写表单字段 | |||||
Map<String, PdfFormField> fields = form.getAllFormFields(); | |||||
for (String fieldName : fields.keySet()) { | |||||
System.out.println("Field name: " + fieldName); | |||||
} | |||||
for (Map.Entry<String, String> entry : formData.entrySet()) { | |||||
String fieldName = entry.getKey(); | |||||
String fieldValue = entry.getValue(); | |||||
// 确保字段存在并填写值 | |||||
if (fields.containsKey(fieldName)) { | |||||
fields.get(fieldName).setValue(fieldValue); | |||||
fields.get(fieldName).setFontSize(fontSize); // 设置字体大小 | |||||
} | |||||
} | |||||
// 可选:扁平化表单(使字段不可编辑) | |||||
form.flattenFields(); | |||||
} catch (IOException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
/** | |||||
* 通过 pdf 文本域拼接 PDF 表单 | |||||
* @param templateUrl PDF 表单文件 URL,例如 "https://example.com/template.pdf" | |||||
* @param outputPath 填充后的 PDF 文件路径 | |||||
* @param formData 填充的数据,键为表单字段名称,值为填充的值 | |||||
* @param fontSize 字体大小 | |||||
*/ | |||||
public static void fillPdfFormFromUrl(String templateUrl, String outputPath, Map<String, String> formData, float fontSize) { | |||||
try { | |||||
// 从 URL 获取输入流 | |||||
URL url = new URL(templateUrl); | |||||
try (InputStream templateInputStream = url.openStream(); | |||||
PdfWriter writer = new PdfWriter(outputPath); | |||||
PdfDocument pdfDoc = new PdfDocument(new PdfReader(templateInputStream), writer)) { | |||||
// 获取表单 | |||||
PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true); | |||||
// 填写表单字段 | |||||
Map<String, PdfFormField> fields = form.getAllFormFields(); | |||||
for (String fieldName : fields.keySet()) { | |||||
System.out.println("Field name: " + fieldName); | |||||
} | |||||
for (Map.Entry<String, String> entry : formData.entrySet()) { | |||||
String fieldName = entry.getKey(); | |||||
String fieldValue = entry.getValue(); | |||||
// 确保字段存在并填写值 | |||||
if (fields.containsKey(fieldName)) { | |||||
fields.get(fieldName).setValue(fieldValue); | |||||
fields.get(fieldName).setFontSize(fontSize); // 设置字体大小 | |||||
} | |||||
} | |||||
// 可选:扁平化表单(使字段不可编辑) | |||||
form.flattenFields(); | |||||
} catch (IOException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
} catch (IOException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
} | |||||
// 示例:调用此工具类 | |||||
public static void main(String[] args) { | |||||
String templatePath = "/Users/tanzs/Downloads/carT.pdf"; | |||||
String templateUrl = "https://jf.sh.189.cn/minio/gov-miniapp/order_pdf/carT.pdf"; | |||||
String outputPath = "/Users/tanzs/Downloads/carR.pdf"; | |||||
float fontSize = 6.5f; // 设置字体大小 | |||||
// 填写的数据 | |||||
Map<String, String> formData = new HashMap<String, String>(); | |||||
formData.put("name", "张三"); | |||||
formData.put("idCard", "123213"); | |||||
formData.put("carNo", "京A12345"); | |||||
formData.put("phone", "19921199563"); | |||||
// 调用工具类进行表单填写 | |||||
// fillPdfForm(templatePath, outputPath, formData, fontSize); | |||||
fillPdfFormFromUrl(templateUrl, outputPath, formData, fontSize); | |||||
} | |||||
} |