|
@@ -0,0 +1,678 @@
|
|
|
|
|
+package com.jzg.commons.util;
|
|
|
|
|
+
|
|
|
|
|
+import com.jzg.commons.constants.quote.enums.base.InsuranceEnum;
|
|
|
|
|
+import com.jzg.commons.util.http.HttpUtils;
|
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
+import org.apache.pdfbox.pdmodel.PDDocument;
|
|
|
|
|
+import org.apache.pdfbox.text.PDFTextStripper;
|
|
|
|
|
+import org.slf4j.Logger;
|
|
|
|
|
+
|
|
|
|
|
+import java.io.*;
|
|
|
|
|
+import java.net.URI;
|
|
|
|
|
+import java.time.LocalDateTime;
|
|
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
|
|
+import java.util.HashMap;
|
|
|
|
|
+import java.util.UUID;
|
|
|
|
|
+import java.util.regex.Matcher;
|
|
|
|
|
+import java.util.regex.Pattern;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @version
|
|
|
|
|
+ * @author: hxl
|
|
|
|
|
+ * @Date: 2024/3/27 17:24
|
|
|
|
|
+ * @Description: pdf解密
|
|
|
|
|
+ */
|
|
|
|
|
+@Slf4j
|
|
|
|
|
+public class PDFUtil {
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 解除PDF口令
|
|
|
|
|
+ * @param filePath
|
|
|
|
|
+ * @throws IOException
|
|
|
|
|
+ */
|
|
|
|
|
+ public static void decipher(String filePath,String password) throws IOException {
|
|
|
|
|
+
|
|
|
|
|
+ File encryptFile = new File(filePath);
|
|
|
|
|
+ String parentPath = encryptFile.getParent();
|
|
|
|
|
+ String name = encryptFile.getName();
|
|
|
|
|
+ String fileName = name.split("\\.")[0] + "-decipher.pdf";
|
|
|
|
|
+ //PDDocument load = PDDocument.load(encryptFile, password);
|
|
|
|
|
+ //load.setAllSecurityToBeRemoved(true);
|
|
|
|
|
+ //String decodeFilePath = parentPath + File.separator+fileName;
|
|
|
|
|
+ // load.save(decodeFilePath);
|
|
|
|
|
+ // load.close();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 将base64编码转换成PDF
|
|
|
|
|
+ * @param base64sString
|
|
|
|
|
+ * @param filePath
|
|
|
|
|
+ *
|
|
|
|
|
+ */
|
|
|
|
|
+ public static void base64StringToPDF(String base64sString, String filePath) {
|
|
|
|
|
+ BufferedInputStream bin = null;
|
|
|
|
|
+ FileOutputStream fout = null;
|
|
|
|
|
+ BufferedOutputStream bout = null;
|
|
|
|
|
+ try {
|
|
|
|
|
+ //将base64编码的字符串解码成字节数组
|
|
|
|
|
+ byte[] bytes = Base64Convert.encodeToString(base64sString);
|
|
|
|
|
+ //创建一个将bytes作为其缓冲区的ByteArrayInputStream对象
|
|
|
|
|
+ ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
|
|
|
|
|
+ //创建从底层输入流中读取数据的缓冲输入流对象
|
|
|
|
|
+ bin = new BufferedInputStream(bais);
|
|
|
|
|
+ //指定输出的文件
|
|
|
|
|
+ File file = new File(filePath);
|
|
|
|
|
+ File parentDir = file.getParentFile();
|
|
|
|
|
+ if (!parentDir.exists()) {
|
|
|
|
|
+ parentDir.mkdirs();
|
|
|
|
|
+ }
|
|
|
|
|
+ //创建到指定文件的输出流
|
|
|
|
|
+ fout = new FileOutputStream(file);
|
|
|
|
|
+ //为文件输出流对接缓冲输出流对象
|
|
|
|
|
+ bout = new BufferedOutputStream(fout);
|
|
|
|
|
+ byte[] buffers = new byte[1024];
|
|
|
|
|
+ int len = bin.read(buffers);
|
|
|
|
|
+ while (len != -1) {
|
|
|
|
|
+ bout.write(buffers, 0, len);
|
|
|
|
|
+ len = bin.read(buffers);
|
|
|
|
|
+ }
|
|
|
|
|
+ //刷新此输出流并强制写出所有缓冲的输出字节,必须这行代码,否则有可能有问题
|
|
|
|
|
+ bout.flush();
|
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ try {
|
|
|
|
|
+ bin.close();
|
|
|
|
|
+ fout.close();
|
|
|
|
|
+ bout.close();
|
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 将PDF转换成base64编码
|
|
|
|
|
+ * @param filePath
|
|
|
|
|
+ * */
|
|
|
|
|
+ public static String getPDFBinary(String filePath) {
|
|
|
|
|
+ System.out.println("加密PDF路径:" + filePath);
|
|
|
|
|
+ FileInputStream fin =null;
|
|
|
|
|
+ BufferedInputStream bin =null;
|
|
|
|
|
+ ByteArrayOutputStream baos = null;
|
|
|
|
|
+ BufferedOutputStream bout =null;
|
|
|
|
|
+ File encriptPath = new File(filePath);
|
|
|
|
|
+ try {
|
|
|
|
|
+ //建立读取文件的文件输出流
|
|
|
|
|
+ fin = new FileInputStream(encriptPath);
|
|
|
|
|
+ //在文件输出流上安装节点流(更大效率读取)
|
|
|
|
|
+ bin = new BufferedInputStream(fin);
|
|
|
|
|
+ // 创建一个新的 byte 数组输出流,它具有指定大小的缓冲区容量
|
|
|
|
|
+ baos = new ByteArrayOutputStream();
|
|
|
|
|
+ //创建一个新的缓冲输出流,以将数据写入指定的底层输出流
|
|
|
|
|
+ bout = new BufferedOutputStream(baos);
|
|
|
|
|
+ byte[] buffer = new byte[1024];
|
|
|
|
|
+ int len = bin.read(buffer);
|
|
|
|
|
+ while(len != -1){
|
|
|
|
|
+ bout.write(buffer, 0, len);
|
|
|
|
|
+ len = bin.read(buffer);
|
|
|
|
|
+ }
|
|
|
|
|
+ //刷新此输出流并强制写出所有缓冲的输出字节,必须这行代码,否则有可能有问题
|
|
|
|
|
+ bout.flush();
|
|
|
|
|
+ byte[] bytes = baos.toByteArray();
|
|
|
|
|
+ // return encoder.encodeBuffer(bytes).trim();
|
|
|
|
|
+ return Base64Convert.byteToBase64(bytes);
|
|
|
|
|
+ } catch (FileNotFoundException e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ }finally{
|
|
|
|
|
+ try {
|
|
|
|
|
+ fin.close();
|
|
|
|
|
+ bin.close();
|
|
|
|
|
+ bout.close();
|
|
|
|
|
+// deleteDir(encriptPath.getParent());
|
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * @Description
|
|
|
|
|
+ * @Author hxl
|
|
|
|
|
+ * @Date 2024/4/2 15:02
|
|
|
|
|
+ * @Param encryptPdfStr 待解密的base64字符串
|
|
|
|
|
+ * @Param targetPath 输出路径
|
|
|
|
|
+ * @Param password 密钥
|
|
|
|
|
+ * @Return
|
|
|
|
|
+ * @Exception
|
|
|
|
|
+ *
|
|
|
|
|
+ */
|
|
|
|
|
+ public static void decryptFileByPassword(String encryptPdfStr, String targetPath, String password) throws IOException {
|
|
|
|
|
+ /**
|
|
|
|
|
+ * base64字符转换PDF
|
|
|
|
|
+ */
|
|
|
|
|
+ base64StringToPDF(encryptPdfStr,targetPath);
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 解除PDF口令
|
|
|
|
|
+ */
|
|
|
|
|
+ decipher(targetPath,password);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static String getPdfText(String pdfFilePath) {
|
|
|
|
|
+ PDDocument document = null;
|
|
|
|
|
+ String text ="";
|
|
|
|
|
+ try {
|
|
|
|
|
+ document = PDDocument.load(new File(pdfFilePath));
|
|
|
|
|
+ PDFTextStripper pdfStripper = new PDFTextStripper();
|
|
|
|
|
+ pdfStripper.setSortByPosition(true); // 设置为true以按照文档中的顺序提取文本
|
|
|
|
|
+ pdfStripper.setShouldSeparateByBeads(true);
|
|
|
|
|
+ text= pdfStripper.getText(document);
|
|
|
|
|
+ text = text.replaceAll("\\s+", " ");
|
|
|
|
|
+ log.info(text);
|
|
|
|
|
+ document.close();
|
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
|
+ throw new RuntimeException(e);
|
|
|
|
|
+ }
|
|
|
|
|
+ return text;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static String getPdfContentStr(String pdfText, String beginStr,String endStr,String dateType) {
|
|
|
|
|
+ if("end".equals(endStr)){
|
|
|
|
|
+ return getEndString(pdfText, beginStr);
|
|
|
|
|
+ }
|
|
|
|
|
+ String contentStr = getContentStr(pdfText, beginStr, endStr);
|
|
|
|
|
+ if(StringUtils.isNotBlank(contentStr)){
|
|
|
|
|
+ contentStr=contentStr.replaceAll(" ", "");
|
|
|
|
|
+ contentStr=contentStr.replaceAll("\\n+", "");
|
|
|
|
|
+ contentStr=contentStr.replaceAll("\\t+", "");
|
|
|
|
|
+ contentStr=contentStr.replaceAll("\\r+", "");
|
|
|
|
|
+ contentStr = contentStr.replaceAll("\\s+", "");
|
|
|
|
|
+ contentStr = contentStr.replaceAll("[^\u4E00-\u9FA50-9年月日:-]+", "");
|
|
|
|
|
+ contentStr = contentStr.replaceAll("时", "");
|
|
|
|
|
+ String longestRepeat = getRepeatedData(contentStr);
|
|
|
|
|
+ if(StringUtils.isNotBlank(longestRepeat)){
|
|
|
|
|
+ contentStr = longestRepeat;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return contentStr;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static LocalDateTime getPdfContentDate(String pdfText, String beginStr,String endStr,String dateType) {
|
|
|
|
|
+ if("end".equals(endStr)){
|
|
|
|
|
+ String substring = getEndString(pdfText, beginStr);
|
|
|
|
|
+ String patten ="";
|
|
|
|
|
+ if("1".equals(dateType)){
|
|
|
|
|
+ patten ="yyyy-MM-dd HH:mm:ss";
|
|
|
|
|
+ }else if("2".equals(dateType)){
|
|
|
|
|
+ patten = "yyyy/MM/dd HH:mm:ss";
|
|
|
|
|
+ }else if("3".equals(dateType)){
|
|
|
|
|
+ patten = "yyyy年MM月dd日 HH:mm:ss";
|
|
|
|
|
+ }
|
|
|
|
|
+ return LocalDateTime.parse(substring, DateTimeFormatter.ofPattern(patten));
|
|
|
|
|
+ }
|
|
|
|
|
+ String payDate = getContentStr(pdfText, beginStr, endStr);
|
|
|
|
|
+ LocalDateTime payDateTime = null;
|
|
|
|
|
+ if("1".equals(dateType)){
|
|
|
|
|
+ payDateTime = getStringTranferDate(payDate);
|
|
|
|
|
+ }else if("2".equals(dateType)){
|
|
|
|
|
+ payDateTime = getStringTranferDateCPIC(payDate);
|
|
|
|
|
+ }else if("3".equals(dateType)){
|
|
|
|
|
+ payDateTime = getStringTranferDatePinAn(payDate);
|
|
|
|
|
+ }
|
|
|
|
|
+ return payDateTime;
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * @version
|
|
|
|
|
+ * @author: hxl
|
|
|
|
|
+ * @Date: 2024/10/23 9:26
|
|
|
|
|
+ * @Description: 截取开始到字符串结尾的字符
|
|
|
|
|
+ */
|
|
|
|
|
+ private static String getEndString(String pdfText, String beginStr) {
|
|
|
|
|
+ String substring = pdfText.substring(pdfText.indexOf(beginStr), pdfText.length());
|
|
|
|
|
+ substring=substring.replaceAll(beginStr, "");
|
|
|
|
|
+ substring=substring.replaceAll(beginStr, "");
|
|
|
|
|
+ substring = substring.replaceAll(" ", "");
|
|
|
|
|
+ substring = substring.replaceAll("\\n+", "");
|
|
|
|
|
+ substring = substring.replaceAll("\\t+", "");
|
|
|
|
|
+ substring = substring.replaceAll("\\r+", "");
|
|
|
|
|
+ substring = substring.replaceAll("\\s+", "");
|
|
|
|
|
+ if(substring.length() == 18){
|
|
|
|
|
+ substring = substring.substring(0,10)+" "+ substring.substring(10,18);
|
|
|
|
|
+ }else if(substring.length() == 15){
|
|
|
|
|
+ substring = substring.substring(0,10)+" "+ substring.substring(10,15)+":00";
|
|
|
|
|
+ }else if(substring.length() == 10){
|
|
|
|
|
+ substring = substring+" 00:00:00";
|
|
|
|
|
+ }
|
|
|
|
|
+ return substring;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static HashMap<String,LocalDateTime> getPdfContent(String pdfPath, String companyId){
|
|
|
|
|
+ HashMap<String,LocalDateTime> map =new HashMap<String,LocalDateTime>();
|
|
|
|
|
+ String pdfText = getPdfText(pdfPath);
|
|
|
|
|
+ System.out.println(pdfText);
|
|
|
|
|
+ String payDate=null;
|
|
|
|
|
+ String signDate=null;
|
|
|
|
|
+ if(StringUtils.isNotBlank(pdfText)){
|
|
|
|
|
+ //缴费时间、签单时间 payDate signingTime
|
|
|
|
|
+ //中煤 ===================== 11
|
|
|
|
|
+ if(companyId.contains(InsuranceEnum.ZMBX.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收付确认时间:", "保单生成时间");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "(保险人签章)");
|
|
|
|
|
+ //永诚 ----------------------------11
|
|
|
|
|
+ }else if(companyId.contains(InsuranceEnum.AICS.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收费确认时间:", "电子保单生成时间");
|
|
|
|
|
+ //payDate = getContentStr(pdfText, "收费确认时间:", "业 电子保单生成时间:");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "(保险人签章)");
|
|
|
|
|
+ //安盛 ================================11
|
|
|
|
|
+ }else if(companyId.contains(InsuranceEnum.TPBX.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收费确认时间", "微信二维码");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "(保险人签章)");
|
|
|
|
|
+ //恒邦 ==================== 11
|
|
|
|
|
+ }else if(companyId.contains(InsuranceEnum.HBIC.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "保费确认时间:", "保单打印时间");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "核保");
|
|
|
|
|
+ }
|
|
|
|
|
+ //国任 ========================= 11
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.XDCX.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收费确认时间:", "投保确认时间");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "核保");
|
|
|
|
|
+ }
|
|
|
|
|
+ //平安 =================================33
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.PAIC.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收费确认时间:", "投保确认时间");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "(保险人签章)");
|
|
|
|
|
+ }
|
|
|
|
|
+ // 华农 ============================1.1
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.HNIC.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收费确认时间:", "有效保单生成时间");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "(保险人签章)");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 华泰 ============================ 1 1
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.HTIC.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收费确认时间:", "有效保单生成时间");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "(保险人签章)");
|
|
|
|
|
+ }
|
|
|
|
|
+ // 众安 ================================ 2.2
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.ZAPA.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收费确认时间:", "投保确认时间");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "(保险人签章)");
|
|
|
|
|
+ }
|
|
|
|
|
+ //诚泰 ======================== 1.2
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.CHAC.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收费确认时间:", "投保确认时间");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "(保险人签章)");
|
|
|
|
|
+ }
|
|
|
|
|
+ //大家 ====================== 111
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.DJPC.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收付确认时间:", "投保确认码");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "(保险人签章)");
|
|
|
|
|
+ }
|
|
|
|
|
+ //泰康 ================================= 1.2
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.TKIC.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收费确认时间:", "投保确认码");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "(保险人签章)");
|
|
|
|
|
+ }
|
|
|
|
|
+ //紫金 ============================= 1.1
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.ZKIC.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收费确认时间:", "确认码");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "(保险人签章)");
|
|
|
|
|
+ }
|
|
|
|
|
+ //渤海 =========================== 11
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.BPIC.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收款确认时间:", "投保确认码");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "核保");
|
|
|
|
|
+ }
|
|
|
|
|
+ //太平 =================== 1.2
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.TPIC.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "保费确认时间:", "确认码");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "(保险人签章)");
|
|
|
|
|
+ }
|
|
|
|
|
+ //天安 ==============================1.1
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.TAIC.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收费确认时间:", "生成保单时间");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "(保险人签章)");
|
|
|
|
|
+ }
|
|
|
|
|
+ //人保 ================================1.1
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.PICC.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收费确认时间:", "投保确认时间");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "(保险人签章)");
|
|
|
|
|
+ }
|
|
|
|
|
+ //人寿 ===========================1 ,2
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.GPIC.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收付确认时间:", "保单打印时间");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "保险人签章");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //阳光 =========================== 11
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.YGBX.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收款确认:", "电子保单流水号");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "经办");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //太平洋 ================================2.2
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.CPIC.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收费确认时间:", "保单生成时间");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "(保险人签章)");
|
|
|
|
|
+ }
|
|
|
|
|
+ // 泰山 ========================= 1.1
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.TSBX.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收费确认时间:", "保单生成时间");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "(保险人签章)");
|
|
|
|
|
+ }
|
|
|
|
|
+ //中华 ============================ 3.1
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.CICP.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收费确认时间:", "投保确认时间");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "核保");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 华安 =================== 1.1
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.HAIC.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收费时间:", "投保确认时间");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "(保险人签章)");
|
|
|
|
|
+ }
|
|
|
|
|
+ // 大地 ===========================1.1
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.CCIC.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "收费确认时间:", "投保确认时间");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "(保险人签章)");
|
|
|
|
|
+ }
|
|
|
|
|
+ // 安诚 ====================== 1.3
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.ACIC.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "缴费确认时间:", "保单生成时间");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "(保");
|
|
|
|
|
+ }
|
|
|
|
|
+ // 永安 =============================== 11
|
|
|
|
|
+ else if(companyId.contains(InsuranceEnum.YAIC.getCode())){
|
|
|
|
|
+ payDate = getContentStr(pdfText, "支付确认时间:", "投保确认码");
|
|
|
|
|
+ signDate = getContentStr(pdfText, "签单日期:", "(保险人签章)");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ LocalDateTime payDateTime = null;
|
|
|
|
|
+ LocalDateTime signDateTime = null;
|
|
|
|
|
+ if(companyId.contains(InsuranceEnum.PAIC.getCode()) || companyId.contains(InsuranceEnum.ZAPA.getCode())){
|
|
|
|
|
+ payDateTime = getStringTranferDatePinAn(payDate);
|
|
|
|
|
+ signDateTime = getStringTranferDatePinAn(signDate);
|
|
|
|
|
+ }else if(companyId.contains(InsuranceEnum.CHAC.getCode()) || companyId.contains(InsuranceEnum.TKIC.getCode()) || companyId.contains(InsuranceEnum.TPIC.getCode())
|
|
|
|
|
+ || companyId.contains(InsuranceEnum.GPIC.getCode()) || companyId.contains(InsuranceEnum.ACIC.getCode())){
|
|
|
|
|
+ payDateTime = getStringTranferDate(payDate);
|
|
|
|
|
+ signDateTime = getStringTranferDatePinAn(signDate);
|
|
|
|
|
+ }else if(companyId.contains(InsuranceEnum.CPIC.getCode())){
|
|
|
|
|
+ payDateTime = getStringTranferDateCPIC(payDate);
|
|
|
|
|
+ signDateTime = getStringTranferDateCPIC(signDate);
|
|
|
|
|
+ }else if(companyId.contains(InsuranceEnum.CICP.getCode())){
|
|
|
|
|
+ payDateTime = getStringTranferDatePinAn(payDate);
|
|
|
|
|
+ signDateTime = getStringTranferDate(signDate);
|
|
|
|
|
+ }
|
|
|
|
|
+ else{
|
|
|
|
|
+ payDateTime = getStringTranferDate(payDate);
|
|
|
|
|
+ signDateTime = getStringTranferDate(signDate);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ map.put("payDate",payDateTime);
|
|
|
|
|
+ map.put("signDate",signDateTime);
|
|
|
|
|
+ return map;
|
|
|
|
|
+ }
|
|
|
|
|
+ private static LocalDateTime getStringTranferDateCPIC(String payDate) {
|
|
|
|
|
+ if (StringUtils.isNotBlank(payDate)) {
|
|
|
|
|
+ payDate = payDate.replaceAll(" ", "");
|
|
|
|
|
+ payDate = payDate.replaceAll("\\n+", "");
|
|
|
|
|
+ payDate = payDate.replaceAll("\\t+", "");
|
|
|
|
|
+ payDate = payDate.replaceAll("\\r+", "");
|
|
|
|
|
+ payDate = payDate.replaceAll("\\s+", "");
|
|
|
|
|
+ payDate = payDate.replaceAll("[\u4e00-\u9fa5]", "");
|
|
|
|
|
+ System.out.println(payDate.length());
|
|
|
|
|
+ if (payDate.length() == 18) {
|
|
|
|
|
+ payDate = payDate.substring(0, 10) + " " + payDate.substring(10, 18);
|
|
|
|
|
+ } else if (payDate.length() == 15) {
|
|
|
|
|
+ payDate = payDate.substring(0, 10) + " " + payDate.substring(10, 15) + ":00";
|
|
|
|
|
+ } else if (payDate.length() == 10) {
|
|
|
|
|
+ payDate = payDate + " 00:00:00";
|
|
|
|
|
+ }
|
|
|
|
|
+ return LocalDateTime.parse(payDate, DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"));
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ private static LocalDateTime getStringTranferDate(String payDate) {
|
|
|
|
|
+ if(StringUtils.isNotBlank(payDate)){
|
|
|
|
|
+ payDate=payDate.replaceAll(" ", "");
|
|
|
|
|
+ payDate=payDate.replaceAll("\\n+", "");
|
|
|
|
|
+ payDate=payDate.replaceAll("\\t+", "");
|
|
|
|
|
+ payDate=payDate.replaceAll("\\r+", "");
|
|
|
|
|
+ payDate = payDate.replaceAll("\\s+", "");
|
|
|
|
|
+ payDate = payDate.replaceAll("[\u4e00-\u9fa5]", "");
|
|
|
|
|
+ System.out.println(payDate.length());
|
|
|
|
|
+ if(payDate.length() == 18){
|
|
|
|
|
+ payDate = payDate.substring(0,10)+" "+ payDate.substring(10,18);
|
|
|
|
|
+ }else if(payDate.length() == 15){
|
|
|
|
|
+ payDate = payDate.substring(0,10)+" "+ payDate.substring(10,15)+":00";
|
|
|
|
|
+ }else if(payDate.length() == 10){
|
|
|
|
|
+ payDate = payDate+" 00:00:00";
|
|
|
|
|
+ }
|
|
|
|
|
+ return LocalDateTime.parse(payDate, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private static LocalDateTime getStringTranferDatePinAn(String payDate) {
|
|
|
|
|
+ if(StringUtils.isNotBlank(payDate)){
|
|
|
|
|
+ payDate=payDate.replaceAll(" ", "");
|
|
|
|
|
+ payDate=payDate.replaceAll("\\n+", "");
|
|
|
|
|
+ payDate=payDate.replaceAll("\\t+", "");
|
|
|
|
|
+ payDate=payDate.replaceAll("\\r+", "");
|
|
|
|
|
+ payDate = payDate.replaceAll("\\s+", "");
|
|
|
|
|
+ payDate = payDate.replaceAll("[^\u4E00-\u9FA50-9年月日:]+", "");
|
|
|
|
|
+ payDate = payDate.replaceAll("时", "");
|
|
|
|
|
+ String longestRepeat = getRepeatedData(payDate);
|
|
|
|
|
+ if(StringUtils.isNotBlank(longestRepeat)){
|
|
|
|
|
+ payDate = longestRepeat;
|
|
|
|
|
+ }
|
|
|
|
|
+ int count = 0;
|
|
|
|
|
+ int index = 0;
|
|
|
|
|
+ while ((index = payDate.indexOf(":", index)) != -1) {
|
|
|
|
|
+ index += ":".length();
|
|
|
|
|
+ count++;
|
|
|
|
|
+ }
|
|
|
|
|
+ System.out.println(payDate.length());
|
|
|
|
|
+ if((payDate.length() == 17 && count==2 ) || (payDate.length() == 18 && count==2 ) || ( payDate.length() == 19 && count==2 ) ) {
|
|
|
|
|
+ String minnute = payDate.substring(payDate.indexOf("日") + 1, payDate.length());
|
|
|
|
|
+ String day = payDate.substring(0, payDate.indexOf("日") + 1);
|
|
|
|
|
+ payDate = getContentStr(day) + " " + minnute;
|
|
|
|
|
+ }else if((payDate.length() == 14 && count==1 ) || ( payDate.length() == 15 && count==1 ) || ( payDate.length() == 16 && count==1 )){
|
|
|
|
|
+ String minnute = payDate.substring(payDate.indexOf("日")+1, payDate.length());
|
|
|
|
|
+ String day = payDate.substring(0, payDate.indexOf("日")+1);
|
|
|
|
|
+ payDate = getContentStr(day)+" "+ minnute+":00";
|
|
|
|
|
+ }else if(payDate.length() == 9 ||payDate.length() == 10 || payDate.length() == 11){
|
|
|
|
|
+ payDate = getContentStr(payDate)+" 00:00:00";
|
|
|
|
|
+ }
|
|
|
|
|
+ return LocalDateTime.parse(payDate, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static String getContentStr(String input){
|
|
|
|
|
+ Pattern pattern = Pattern.compile("(\\d{4})年(\\d{1,2})月(\\d{1,2})日");
|
|
|
|
|
+ Matcher matcher = pattern.matcher(input);
|
|
|
|
|
+ if (matcher.matches()) {
|
|
|
|
|
+ String year = matcher.group(1);
|
|
|
|
|
+ String month = matcher.group(2);
|
|
|
|
|
+ String day = matcher.group(3);
|
|
|
|
|
+ return year+"-"+((Integer.parseInt(month)<10 && month.length()==1) ?"0"+month:month)+"-"+((Integer.parseInt(day)<10 && day.length()==1) ?"0"+day:day);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static String getContentStr(String input, String beginStr, String endStr){
|
|
|
|
|
+ // 创建正则表达式,其中"(?s)"表示忽略换行符,"."匹配任何字符(包括换行符)
|
|
|
|
|
+ String regex = "(?s)" + Pattern.quote(beginStr) + "(.+?)" + Pattern.quote(endStr);
|
|
|
|
|
+ Pattern pattern = Pattern.compile(regex);
|
|
|
|
|
+ Matcher matcher = pattern.matcher(input);
|
|
|
|
|
+
|
|
|
|
|
+ if (matcher.find()) {
|
|
|
|
|
+ return matcher.group(1);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ /**
|
|
|
|
|
+ * @version
|
|
|
|
|
+ * @author: hxl
|
|
|
|
|
+ * @Date: 2024/10/22 15:08
|
|
|
|
|
+ * @Description: 找出字符串中的重复值
|
|
|
|
|
+ */
|
|
|
|
|
+ private static String getRepeatedData(String input) {
|
|
|
|
|
+ String repeatedData = "";
|
|
|
|
|
+ Pattern pattern = Pattern.compile("(\\d{4}年\\d{1,2}月\\d{1,2}日)\\s*\\1");
|
|
|
|
|
+ Matcher matcher = pattern.matcher(input);
|
|
|
|
|
+ if (matcher.find()) {
|
|
|
|
|
+ repeatedData= matcher.group(1);
|
|
|
|
|
+ }
|
|
|
|
|
+ return repeatedData;
|
|
|
|
|
+ }
|
|
|
|
|
+ public static String trafferHttpToLocalPath(String path) {
|
|
|
|
|
+ if (path.contains("http") || path.contains("https")) {
|
|
|
|
|
+ //转成本地路径
|
|
|
|
|
+ String os = System.getProperty("os.name").toLowerCase();
|
|
|
|
|
+ String tempDir="";
|
|
|
|
|
+ if (os.contains("linux")) {
|
|
|
|
|
+ tempDir = "/tmp";
|
|
|
|
|
+ } else if (os.contains("windows")) {
|
|
|
|
|
+ tempDir = System.getProperty("java.io.tmpdir");
|
|
|
|
|
+ }
|
|
|
|
|
+ String last = path.substring(path.lastIndexOf(".") + 1);
|
|
|
|
|
+ File file =new File(tempDir+ UUID.randomUUID()+"."+last);
|
|
|
|
|
+ String encodeUrl = FileUtil.urlEncodeChinese(path);
|
|
|
|
|
+ URI u = URI.create(encodeUrl);
|
|
|
|
|
+ HttpUtils.disableSSLCertificateChecking();
|
|
|
|
|
+ try{
|
|
|
|
|
+ InputStream inputStream = u.toURL().openStream();
|
|
|
|
|
+ FileUtil.copyInputStreamToFile(inputStream, file);
|
|
|
|
|
+ }catch(Exception e){
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+ return file.getPath();
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return path;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static void main(String[] args) throws IOException {
|
|
|
|
|
+ //中煤
|
|
|
|
|
+ //String pdfFilePath = "D:\\nasData\\carInsPolicy\\晋AC692F\\晋AC692F-商业险保单.pdf"; // PDF文件路径
|
|
|
|
|
+ //HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "ZMBX");
|
|
|
|
|
+ //永城
|
|
|
|
|
+ // String pdfFilePath = "D:\\nasData\\carInsPolicy\\1834183151125594114\\晋LD580R114B4032620240026390-交强险保单.pdf"; // PDF文件路径
|
|
|
|
|
+ //HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "AICS");
|
|
|
|
|
+ //安盛
|
|
|
|
|
+ // String pdfFilePath = "D:\\nasData\\carInsPolicy\\1823634528262541312\\晋JH6836-交强险保单.pdf"; // PDF文件路径
|
|
|
|
|
+ // HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "TPBX");
|
|
|
|
|
+ //恒邦
|
|
|
|
|
+ // String pdfFilePath = "D:\\nasData\\carInsPolicy\\晋KLY103\\晋KLY103-交强险保单.pdf"; // PDF文件路径
|
|
|
|
|
+ // HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "HBIC");
|
|
|
|
|
+ //国任
|
|
|
|
|
+ // String pdfFilePath = "D:\\nasData\\carInsPolicy\\晋A139LV\\晋A139LV-交强险保单.pdf"; // PDF文件路径
|
|
|
|
|
+ // HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "XDCX");
|
|
|
|
|
+ //平安
|
|
|
|
|
+ // String pdfFilePath = "D:\\nasData\\carInsPolicy\\晋C5523Q\\晋C5523Q-交强险保单.pdf"; // PDF文件路径
|
|
|
|
|
+ //HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "PAIC");
|
|
|
|
|
+
|
|
|
|
|
+ //华农
|
|
|
|
|
+ //String pdfFilePath = "D:\\bx\\huanong\\晋KME755-交强险保单.pdf"; // PDF文件路径
|
|
|
|
|
+ //HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "HNIC");
|
|
|
|
|
+
|
|
|
|
|
+ // 华泰
|
|
|
|
|
+ //String pdfFilePath = "D:\\bx\\huatai\\晋AH15L3-交强险保单.pdf"; // PDF文件路径
|
|
|
|
|
+ //HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "HTIC");
|
|
|
|
|
+
|
|
|
|
|
+ //众安
|
|
|
|
|
+ // String pdfFilePath = "D:\\bx\\zongan\\晋JTT447-交强险保单.pdf"; // PDF文件路径
|
|
|
|
|
+ //HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "ZAPA");
|
|
|
|
|
+
|
|
|
|
|
+ //诚泰
|
|
|
|
|
+ // String pdfFilePath = "D:\\bx\\chengtai\\晋A1WJ61-交强险保单.pdf"; // PDF文件路径
|
|
|
|
|
+ //HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "CHAC");
|
|
|
|
|
+
|
|
|
|
|
+ //大家
|
|
|
|
|
+ //String pdfFilePath = "D:\\bx\\dajia\\晋FH3550-交强险保单.pdf"; // PDF文件路径
|
|
|
|
|
+ //HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "DJPC");
|
|
|
|
|
+
|
|
|
|
|
+ //泰康
|
|
|
|
|
+ //String pdfFilePath = "D:\\bx\\taikang\\晋BB0233-交强险保单.pdf"; // PDF文件路径
|
|
|
|
|
+ //HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "TKIC");
|
|
|
|
|
+
|
|
|
|
|
+ //紫荆
|
|
|
|
|
+ //String pdfFilePath = "D:\\bx\\zijin\\晋KTY710-交强险保单.pdf"; // PDF文件路径
|
|
|
|
|
+ //HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "ZKIC");
|
|
|
|
|
+
|
|
|
|
|
+ //渤海
|
|
|
|
|
+ // String pdfFilePath = "D:\\bx\\bohai\\晋C1358S-2141103302024015981-交强险保单.pdf"; // PDF文件路径
|
|
|
|
|
+ // HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "BPIC");
|
|
|
|
|
+
|
|
|
|
|
+ //太平
|
|
|
|
|
+ // String pdfFilePath = "D:\\bx\\taiping\\63fe59c9f37a2a1ab62fe8f23f63943c.pdf"; // PDF文件路径
|
|
|
|
|
+ //HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "TPIC");
|
|
|
|
|
+
|
|
|
|
|
+ //天安
|
|
|
|
|
+ //String pdfFilePath = "D:\\bx\\tianan\\829d3f8efdc565b61092cc675d8ac316.pdf"; // PDF文件路径
|
|
|
|
|
+ //HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "TAIC");
|
|
|
|
|
+
|
|
|
|
|
+ //人民
|
|
|
|
|
+ //String pdfFilePath = "D:\\bx\\renbao\\b504310a9897db5be1745c76463d9e0a.pdf"; // PDF文件路径
|
|
|
|
|
+ // HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "PICC");
|
|
|
|
|
+
|
|
|
|
|
+ //人寿
|
|
|
|
|
+ // String pdfFilePath = "D:\\bx\\renshou\\4d36d1b7f19059ffb14a59d04ae140fb.pdf"; // PDF文件路径
|
|
|
|
|
+ // HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "GPIC");
|
|
|
|
|
+
|
|
|
|
|
+ // String pdfFilePath = "D:\\bx\\renshou\\4d36d1b7f19059ffb14a59d04ae140fb.pdf"; // PDF文件路径
|
|
|
|
|
+ // HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "GPIC");
|
|
|
|
|
+
|
|
|
|
|
+ // String pdfFilePath = "D:\\bx\\renshou\\4d36d1b7f19059ffb14a59d04ae140fb.pdf"; // PDF文件路径
|
|
|
|
|
+ // HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "GPIC");
|
|
|
|
|
+
|
|
|
|
|
+ //阳光
|
|
|
|
|
+ // String pdfFilePath = "D:\\bx\\yangguang\\e364a2ea5b29b5056005c084c69fbcde.pdf"; // PDF文件路径
|
|
|
|
|
+ // HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "YGBX");
|
|
|
|
|
+
|
|
|
|
|
+ //太平洋
|
|
|
|
|
+ // String pdfFilePath = "D:\\bx\\taipingyang\\31f92fc448ef7aab3127a6d7fa07621c.pdf"; // PDF文件路径
|
|
|
|
|
+ // HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "CPIC");
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ //泰山
|
|
|
|
|
+ // String pdfFilePath = "D:\\bx\\taishan\\2c46d1bd604efe4d1894bf826af30e0a.pdf"; // PDF文件路径
|
|
|
|
|
+ // HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "TSBX");
|
|
|
|
|
+
|
|
|
|
|
+ // String pdfFilePath = "D:\\bx\\taishan\\2c46d1bd604efe4d1894bf826af30e0a.pdf"; // PDF文件路径
|
|
|
|
|
+ // HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "TSBX");
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ //中华
|
|
|
|
|
+ // String pdfFilePath = "D:\\bx\\zhonghua\\e3358efb60e4924c65d28971f4a01f94.pdf"; // PDF文件路径
|
|
|
|
|
+ // HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "CICP");
|
|
|
|
|
+
|
|
|
|
|
+ // 华安
|
|
|
|
|
+ // String pdfFilePath = "D:\\bx\\huaan\\9560fc38737dc922db73bf8ffaa56482.pdf"; // PDF文件路径
|
|
|
|
|
+ // HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "HAIC");
|
|
|
|
|
+ // 大地
|
|
|
|
|
+ // String pdfFilePath = "D:\\bx\\dadi\\24f9830c1807fa47ecb933b78e155ed5.pdf"; // PDF文件路径
|
|
|
|
|
+ // HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "CCIC");
|
|
|
|
|
+ // 安诚
|
|
|
|
|
+ // String pdfFilePath = "D:\\bx\\ancheng\\f0b6430219fe3f32b2d63ab41dba95c4.pdf"; // PDF文件路径
|
|
|
|
|
+ // HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "ACIC");
|
|
|
|
|
+ // 永安
|
|
|
|
|
+ String pdfFilePath = "D:\\bx\\yongan\\交强.pdf"; // PDF文件路径
|
|
|
|
|
+ HashMap<String, LocalDateTime> zmbx = getPdfContent(pdfFilePath, "YAIC");
|
|
|
|
|
+
|
|
|
|
|
+ System.out.println(zmbx.toString());
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+}
|