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