@ -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); | |||
} | |||
} |