From 02ec24e0d1a3bd0fe4bcdb8fe37fe0cb55a6f921 Mon Sep 17 00:00:00 2001
From: yjz <3131811435@qq.com>
Date: Mon, 3 Jun 2024 14:45:45 +0800
Subject: [PATCH] =?UTF-8?q?feat(=E6=9C=AC=E5=9C=B0=E5=B7=A5=E5=85=B7):=20O?=
=?UTF-8?q?CR=E8=AF=86=E5=88=AB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
laws-modules/pom.xml | 8 +-
.../com/jero/modules/laws/ocr/Base64Util.java | 213 ++++++++++++++
.../com/jero/modules/laws/ocr/MD5Util.java | 77 +++++
.../com/jero/modules/laws/ocr/OkHttpUtil.java | 193 ++++++++++++
.../com/jero/modules/laws/ocr/RsaUtil.java | 132 +++++++++
.../com/jero/modules/laws/ocr/UUIDUtils.java | 40 +++
.../modules/laws/ocr/config/OkHttpConfig.java | 69 +++++
.../ocr/controller/OCRRestfulController.java | 181 ++++++++++++
.../modules/laws/ocr/entity/BaseEntity.java | 6 +
.../laws/ocr/entity/OcrCallBackResultEo.java | 76 +++++
.../modules/laws/ocr/entity/OcrRecordEO.java | 278 ++++++++++++++++++
.../modules/laws/ocr/entity/OcrRequestEo.java | 83 ++++++
.../modules/laws/ocr/entity/OcrResultEo.java | 30 ++
.../jero/modules/laws/ocr/http/PageInfo.java | 168 +++++++++++
.../laws/ocr/http/ResponseMessage.java | 62 ++++
.../ocr/http/ResponseMessageCodeEnum.java | 21 ++
.../jero/modules/laws/ocr/http/Result.java | 50 ++++
.../laws/ocr/mapper/OcrRecordEOMapper.java | 32 ++
.../laws/ocr/mapper/xml/OcrRecordEOMapper.xml | 259 ++++++++++++++++
.../jero/modules/laws/ocr/page/BasePage.java | 102 +++++++
.../laws/ocr/page/OcrRecordEOPage.java | 255 ++++++++++++++++
.../laws/ocr/service/OCRRestfulService.java | 15 +
.../laws/ocr/service/OcrRecordEOService.java | 18 ++
.../service/impl/OCRRestfulServiceImpl.java | 230 +++++++++++++++
.../service/impl/OcrRecordEOServiceImpl.java | 44 +++
.../modules/laws/ocr/web/BaseController.java | 82 ++++++
.../src/main/resources/application-dev.yml | 16 +
27 files changed, 2739 insertions(+), 1 deletion(-)
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/Base64Util.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/MD5Util.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/OkHttpUtil.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/RsaUtil.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/UUIDUtils.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/config/OkHttpConfig.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/controller/OCRRestfulController.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/entity/BaseEntity.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/entity/OcrCallBackResultEo.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/entity/OcrRecordEO.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/entity/OcrRequestEo.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/entity/OcrResultEo.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/http/PageInfo.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/http/ResponseMessage.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/http/ResponseMessageCodeEnum.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/http/Result.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/mapper/OcrRecordEOMapper.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/mapper/xml/OcrRecordEOMapper.xml
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/page/BasePage.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/page/OcrRecordEOPage.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/service/OCRRestfulService.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/service/OcrRecordEOService.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/service/impl/OCRRestfulServiceImpl.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/service/impl/OcrRecordEOServiceImpl.java
create mode 100644 laws-modules/src/main/java/com/jero/modules/laws/ocr/web/BaseController.java
diff --git a/laws-modules/pom.xml b/laws-modules/pom.xml
index c06c35d0..a4e94544 100644
--- a/laws-modules/pom.xml
+++ b/laws-modules/pom.xml
@@ -178,5 +178,11 @@
poi-ooxml-schemas
3.17
-->
+
+ org.bouncycastle
+ bcprov-jdk15on
+ 1.56
+ compile
+
-
\ No newline at end of file
+
diff --git a/laws-modules/src/main/java/com/jero/modules/laws/ocr/Base64Util.java b/laws-modules/src/main/java/com/jero/modules/laws/ocr/Base64Util.java
new file mode 100644
index 00000000..e8e982bb
--- /dev/null
+++ b/laws-modules/src/main/java/com/jero/modules/laws/ocr/Base64Util.java
@@ -0,0 +1,213 @@
+package com.jero.modules.laws.ocr;
+
+import org.bouncycastle.util.encoders.Base64;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+
+/**
+ * @program: OcrDemo
+ * @description: 工具类
+ * @author: duyunbao
+ * @create: 2019-03-13 14:58
+ */
+public class Base64Util {
+ private static final Logger logger = LoggerFactory.getLogger(Base64Util.class);
+ public static String PDFToBase64(MultipartFile file) {
+ //BASE64Encoder encoder = new BASE64Encoder();
+ InputStream fin =null;
+ BufferedInputStream bin =null;
+ ByteArrayOutputStream baos = null;
+ BufferedOutputStream bout =null;
+ try {
+ fin = file.getInputStream();
+ bin = new BufferedInputStream(fin);
+ 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 Base64.toBase64String(bytes);
+
+ } catch (FileNotFoundException e) {
+ logger.error(e.getMessage(),e);
+ } catch (IOException e) {
+ logger.error(e.getMessage(),e);
+ }finally{
+ try {
+ fin.close();
+ bin.close();
+ bout.close();
+ } catch (IOException e) {
+ logger.error(e.getMessage(),e);
+ }
+ }
+ return null;
+ }
+
+
+ /* public static String FindPDFBase(MultipartFile file){
+ InputStream fin= null;
+ BufferedInputStream bin= null;
+ ByteArrayOutputStream baos= null;
+ BufferedOutputStream bout= null;
+ try{
+ fin=file.getInputStream();
+ bin=new BufferedInputStream(fin);
+ 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();
+ String res= Base64.toBase64String(bytes);
+ return res;
+ }catch(Exception e){
+ e.printStackTrace();
+ }finally {
+ try{
+ fin.close();
+ bin.close();
+ bout.close();
+ }catch (IOException e){
+ e.printStackTrace();
+ }
+ }
+
+ return null;
+ }*/
+
+ /**
+ *@Description: base64 转成文件
+ *@Param: [base64Content, filePath]
+ *@return: void
+ *@Author: duyunbao
+ *@date: 2019/3/13 16:49
+ */
+ public static String base64StringToFile(String base64Content,String filePath) {
+ // BASE64Decoder decoder = new BASE64Decoder();
+ BufferedInputStream bis = null;
+ FileOutputStream fos = null;
+ BufferedOutputStream bos = null;
+
+ try {
+ // logger.info("获取到的文件base64字符串:"+base64Content);
+ // byte[] bytes = decoder.decodeBuffer(base64Content,);//base64编码内容转换为字节数组
+ byte[] bytes = Base64.decode(base64Content.getBytes("UTF-8"));
+ ByteArrayInputStream byteInputStream = new ByteArrayInputStream(bytes);
+ bis = new BufferedInputStream(byteInputStream);
+ File file = new File(filePath);
+ File path = file.getParentFile();
+ if(!path.exists()){
+ path.mkdirs();
+ }
+ fos = new FileOutputStream(file);
+ bos = new BufferedOutputStream(fos);
+
+ byte[] buffer = new byte[1024];
+ int length = bis.read(buffer);
+ while(length != -1){
+ bos.write(buffer, 0, length);
+ length = bis.read(buffer);
+ }
+ bos.flush();
+ } catch (Exception e) {
+ logger.error(e.getMessage(),e);
+ return "error";
+ }finally{
+ try {
+ bos.close();
+ bis.close();
+ fos.close();
+ } catch (IOException e) {
+ logger.error(e.getMessage(),e);
+ return "error";
+ }
+ }
+ return "success";
+ }
+
+ /**
+ *@Description: base64 转成文件
+ *@Param: [base64Content, filePath]
+ *@return: void
+ *@Author: duyunbao
+ *@date: 2019/3/13 16:49
+ */
+ public static String base64StringToFileOfTxt(String base64Content,String filePath) {
+// BASE64Decoder decoder = new BASE64Decoder();
+ java.util.Base64.Decoder decoder = java.util.Base64.getDecoder();
+ BufferedInputStream bis = null;
+ FileOutputStream fos = null;
+ BufferedOutputStream bos = null;
+
+ try {
+ //logger.info("获取到的文件base64字符串:"+base64Content);
+ // new String(decoder.decodeBuffer(base64Content),"UTF-8");
+// byte[] bytes = decoder.decodeBuffer(base64Content);//base64编码内容转换为字节数组
+ byte[] bytes = Base64.decode(base64Content.getBytes("UTF-8"));
+// String result=new String(bytes);
+// logger.info("返回的内容为:"+result);
+ ByteArrayInputStream byteInputStream = new ByteArrayInputStream(bytes);
+ bis = new BufferedInputStream(byteInputStream);
+ File file = new File(filePath);
+ File path = file.getParentFile();
+ if(!path.exists()){
+ path.mkdirs();
+ }
+ fos = new FileOutputStream(file);
+ bos = new BufferedOutputStream(fos);
+
+ byte[] buffer = new byte[1024];
+ int length = bis.read(buffer);
+ while(length != -1){
+ bos.write(buffer, 0, length);
+ length = bis.read(buffer);
+ }
+ bos.flush();
+// FileWriter fw;
+// fw = new FileWriter(filePath);
+// PrintWriter out = new PrintWriter(fw);
+// out.write(result);
+// out.println();
+// fw.close();
+// out.close();
+ } catch (Exception e) {
+ logger.error(e.getMessage(),e);
+ return "error";
+ }finally{
+ try {
+ bos.close();
+ bis.close();
+ fos.close();
+ } catch (IOException e) {
+ logger.error(e.getMessage(),e);
+ return "error";
+ }
+ }
+ return "success";
+ }
+
+
+
+ public static void main(String[] args) {
+ String str="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";
+ base64StringToFileOfTxt(str,"d://1.json");
+ }
+
+
+}
diff --git a/laws-modules/src/main/java/com/jero/modules/laws/ocr/MD5Util.java b/laws-modules/src/main/java/com/jero/modules/laws/ocr/MD5Util.java
new file mode 100644
index 00000000..dbe22ece
--- /dev/null
+++ b/laws-modules/src/main/java/com/jero/modules/laws/ocr/MD5Util.java
@@ -0,0 +1,77 @@
+package com.jero.modules.laws.ocr;
+
+
+import java.security.MessageDigest;
+
+/**
+ * 采用MD5加密解密
+ * @author tfq
+ * @datetime 2011-10-13
+ */
+public class MD5Util {
+
+ /***
+ * MD5加码 生成32位md5码
+ */
+ public static String string2MD5(String inStr){
+ MessageDigest md5 = null;
+ try{
+ md5 = MessageDigest.getInstance("MD5");
+ }catch (Exception e){
+ System.out.println(e.toString());
+ e.printStackTrace();
+ return "";
+ }
+ char[] charArray = inStr.toCharArray();
+ byte[] byteArray = new byte[charArray.length];
+
+ for (int i = 0; i < charArray.length; i++)
+ byteArray[i] = (byte) charArray[i];
+ byte[] md5Bytes = md5.digest(byteArray);
+ StringBuffer hexValue = new StringBuffer();
+ for (int i = 0; i < md5Bytes.length; i++){
+ int val = ((int) md5Bytes[i]) & 0xff;
+ if (val < 16)
+ hexValue.append("0");
+ hexValue.append(Integer.toHexString(val));
+ }
+ return hexValue.toString();
+
+ }
+
+ /**
+ * 加密解密算法 执行一次加密,两次解密
+ */
+ public static String convertMD5(String inStr){
+
+ char[] a = inStr.toCharArray();
+ for (int i = 0; i < a.length; i++){
+ a[i] = (char) (a[i] ^ 't');
+ }
+ String s = new String(a);
+ return s;
+
+ }
+
+ // 测试主函数
+ public static void main(String args[]) {
+ /* String s = new String("tangfuqiang");
+ System.out.println("原始:" + s);
+ System.out.println("MD5后:" + string2MD5(s));
+
+ System.out.println("加密的:" + convertMD5(s));
+
+ System.out.println("解密的:" + convertMD5(convertMD5(s)));*/
+// String fileId = "ATT_FILE_07_JLBUTUSFXDRUKTVX5BT5";
+// String key = "dufy20170329java";
+// SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH");
+// String time = df.format(new Date());
+// String sign = fileId + time + key;
+ String str="GVJ3EZKW6NTK6Z5U92QE"+"EC4KKA6ZDTCPAOCRBC5M";
+ String key="ecd2c0791b398882310c4edcc1eee42b";
+ String entoryStr = string2MD5(str);
+
+ System.out.println(entoryStr);
+ System.out.println(key);
+ }
+}
diff --git a/laws-modules/src/main/java/com/jero/modules/laws/ocr/OkHttpUtil.java b/laws-modules/src/main/java/com/jero/modules/laws/ocr/OkHttpUtil.java
new file mode 100644
index 00000000..2a8b80b3
--- /dev/null
+++ b/laws-modules/src/main/java/com/jero/modules/laws/ocr/OkHttpUtil.java
@@ -0,0 +1,193 @@
+package com.jero.modules.laws.ocr;
+
+import okhttp3.*;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ *
+ * @author David
+ */
+@Component
+public class OkHttpUtil {
+ private static final Logger logger = LoggerFactory.getLogger(OkHttpUtil.class);
+
+ @Autowired
+ private OkHttpClient okHttpClient;
+ /**
+ * get
+ *
+ * @param url 请求的url
+ * @param queries 请求的参数,在浏览器?后面的数据,没有可以传null
+ * @return
+ */
+ public String get(String url, Map queries, Map headerParams) {
+ String responseBody = "";
+ StringBuffer sb = new StringBuffer(url);
+ if (queries != null && queries.keySet().size() > 0) {
+ boolean firstFlag = true;
+ Iterator iterator = queries.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Map.Entry entry = (Map.Entry) iterator.next();
+ if (firstFlag) {
+ sb.append("?" + entry.getKey() + "=" + entry.getValue());
+ firstFlag = false;
+ } else {
+ sb.append("&" + entry.getKey() + "=" + entry.getValue());
+ }
+ }
+ }
+
+ Request.Builder requestBuilder = new Request.Builder().url(url);
+
+ if(headerParams != null){
+ for(Map.Entry entry : headerParams.entrySet()) {
+ requestBuilder.addHeader(entry.getKey(), entry.getValue());
+ }
+ }
+
+
+ Request request = requestBuilder.url(sb.toString())
+ .build();
+ Response response = null;
+ try {
+ response = okHttpClient.newCall(request).execute();
+ int status = response.code();
+ if (status == 200) {
+ return response.body().string();
+ }
+ } catch (Exception e) {
+ logger.error("okhttp put error >> ex = {}", ExceptionUtils.getStackTrace(e));
+ } finally {
+ if (response != null) {
+ response.close();
+ }
+ }
+ return responseBody;
+ }
+ /**
+ * post
+ *
+ * @param url 请求的url
+ * @param params post form 提交的参数
+ * @return
+ */
+ public String post(String url, Map params, Map headerParams) {
+ String responseBody = "";
+ FormBody.Builder builder = new FormBody.Builder();
+ //添加参数
+ if (params != null && params.keySet().size() > 0) {
+ for (String key : params.keySet()) {
+ builder.add(key, params.get(key));
+ }
+ }
+
+ Request.Builder requestBuilder = new Request.Builder().url(url);
+
+ for(Map.Entry entry : headerParams.entrySet()) {
+ requestBuilder.addHeader(entry.getKey(), entry.getValue());
+ }
+
+ Request request = requestBuilder.post(builder.build()).build();
+ Response response = null;
+ try {
+ response = okHttpClient.newCall(request).execute();
+ int status = response.code();
+ if (status == 200) {
+ return response.body().string();
+ }
+ } catch (Exception e) {
+ logger.error("okhttp post error >> ex = {}", ExceptionUtils.getStackTrace(e));
+ } finally {
+ if (response != null) {
+ response.close();
+ }
+ }
+ return responseBody;
+ }
+
+ /**
+ * post
+ *
+ * @param url 请求的url
+ * @param params post form 提交的参数
+ * @return
+ */
+ public String postForJson(String url, String json, Map headerParams) {
+ RequestBody requestBody = FormBody.create(MediaType.parse("application/json; charset=utf-8"), json);
+ String responseBody = "";
+ Request.Builder requestBuilder = new Request.Builder().url(url);
+ for(Map.Entry entry : headerParams.entrySet()) {
+ requestBuilder.addHeader(entry.getKey(), entry.getValue());
+ }
+ Request request = requestBuilder.post(requestBody).build();
+ Response response = null;
+ try {
+ response = okHttpClient.newCall(request).execute();
+ int status = response.code();
+ if (status == 200) {
+ return response.body().string();
+ }
+ } catch (Exception e) {
+ logger.error("okhttp post error >> ex = {}", ExceptionUtils.getStackTrace(e));
+ } finally {
+ if (response != null) {
+ response.close();
+ }
+ }
+ return responseBody;
+ }
+
+ /**
+ * post 上传文件
+ *
+ * @param url
+ * @param params
+ * @param fileType
+ * @return
+ */
+ public String postFile(String url, Map params, String fileType, Map headerParams) {
+ String responseBody = "";
+ MultipartBody.Builder builder = new MultipartBody.Builder();
+ //添加参数
+ if (params != null && params.keySet().size() > 0) {
+ for (String key : params.keySet()) {
+ if (params.get(key) instanceof File) {
+ File file = (File) params.get(key);
+ builder.addFormDataPart(key, file.getName(), RequestBody.create(MediaType.parse(fileType), file));
+ continue;
+ }
+ builder.addFormDataPart(key, params.get(key).toString());
+ }
+ }
+
+ Request.Builder requestBuilder = new Request.Builder();
+ for(Map.Entry entry : headerParams.entrySet()) {
+ requestBuilder.addHeader(entry.getKey(), entry.getValue());
+ }
+
+ Request request = requestBuilder.url(url).post(builder.build()).build();
+ Response response = null;
+ try {
+ response = okHttpClient.newCall(request).execute();
+ int status = response.code();
+ if (status == 200) {
+ return response.body().string();
+ }
+ } catch (Exception e) {
+ logger.error("okhttp postFile error >> ex = {}", ExceptionUtils.getStackTrace(e));
+ } finally {
+ if (response != null) {
+ response.close();
+ }
+ }
+ return responseBody;
+ }
+}
diff --git a/laws-modules/src/main/java/com/jero/modules/laws/ocr/RsaUtil.java b/laws-modules/src/main/java/com/jero/modules/laws/ocr/RsaUtil.java
new file mode 100644
index 00000000..296c8310
--- /dev/null
+++ b/laws-modules/src/main/java/com/jero/modules/laws/ocr/RsaUtil.java
@@ -0,0 +1,132 @@
+package com.jero.modules.laws.ocr;
+
+
+import com.aliyuncs.utils.IOUtils;
+import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
+import org.bouncycastle.crypto.params.RSAKeyParameters;
+import org.bouncycastle.crypto.util.SubjectPublicKeyInfoFactory;
+import org.bouncycastle.util.encoders.Base64;
+import org.dom4j.DocumentException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.crypto.Cipher;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.math.BigInteger;
+import java.security.KeyFactory;
+import java.security.NoSuchAlgorithmException;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.X509EncodedKeySpec;
+
+/**
+ * @program: OcrDemo
+ * @description: rsa加密解密
+ * @author: duyunbao
+ * @create: 2019-03-14 19:54
+ */
+public class RsaUtil {
+
+ private static final Logger logger = LoggerFactory.getLogger(RsaUtil.class);
+
+ public static final String CHARSET = "UTF-8";
+ public static final String RSA_ALGORITHM = "RSA";
+
+ /// RSA公钥格式转换,.net->java
+
+ public static String RSAPublicKeyDotNet2Java() throws IOException, DocumentException {
+ /* SAXReader reader = new SAXReader();
+ Document document = reader.read(new File("../../../resources/rsa/publicRSAXML.xml"));
+ Element root = document.getRootElement();
+ Element ModulusElem = root.element("Modulus");
+ Element ExponentElem = root.element("Exponent");
+ BigInteger m = new BigInteger(1, Base64.decode(ModulusElem.elements().get(0).getData().toString()));
+ BigInteger p = new BigInteger(1, Base64.decode(ExponentElem.elements().get(0).getData().toString()));*/
+ BigInteger m = new BigInteger(1, Base64.decode("ncJeLmq4CT6t07x1Ct8LJn8/h6vPaSoySEcirRxAfFS7uoxxaWTyQE3khA4idvwky2ZrLtZjqVCFWRlHADKB5OCbRsVxvQv7kAR3VASJnCUtXH1lm+5zF9vxcw20ISfqEYUwikMDDogbVyLzNjwU/7ZfzzNY5lG+KsZxV8tuOE8="));
+ BigInteger p = new BigInteger(1, Base64.decode("AQAB"));
+
+ RSAKeyParameters pub = new RSAKeyParameters(false, m, p);
+ SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.createSubjectPublicKeyInfo(pub);
+ byte[] serializedPublicBytes = publicKeyInfo.toASN1Primitive().getEncoded();
+ return Base64.toBase64String(serializedPublicBytes);
+ }
+
+
+ /**
+ }
+
+ * 得到公钥
+ * @param publicKey 密钥字符串(经过base64编码)
+ * @throws Exception
+ */
+ public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
+ // 通过X509编码的Key指令获得公钥对象
+ KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
+ X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decode(publicKey));
+ RSAPublicKey key = (RSAPublicKey) keyFactory.generatePublic(x509KeySpec);
+ return key;
+ }
+
+
+
+ /**
+ * 公钥加密
+ * @param data
+ * @return
+ */
+ public static String publicEncrypt(String data) {
+ RSAPublicKey publicKey = null;
+ try {
+ publicKey = getPublicKey(RSAPublicKeyDotNet2Java());
+ }catch (Exception e){
+ logger.error(e.getMessage(),e);
+ return null;
+ }
+
+ try {
+ Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
+ cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+ return Base64.toBase64String(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET),
+ publicKey.getModulus().bitLength()));
+ } catch (Exception e) {
+ logger.error("加密字符串[" + data + "]时遇到异常",e);
+ return null;
+ }
+ }
+
+
+
+
+ private static byte[] rsaSplitCodec(Cipher cipher, int opmode, byte[] datas, int keySize) {
+ int maxBlock = 0;
+ if (opmode == Cipher.DECRYPT_MODE) {
+ maxBlock = keySize / 8;
+ } else {
+ maxBlock = keySize / 8 - 11;
+ }
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ int offSet = 0;
+ byte[] buff;
+ int i = 0;
+ try {
+ while (datas.length > offSet) {
+ if (datas.length - offSet > maxBlock) {
+ buff = cipher.doFinal(datas, offSet, maxBlock);
+ } else {
+ buff = cipher.doFinal(datas, offSet, datas.length - offSet);
+ }
+ out.write(buff, 0, buff.length);
+ i++;
+ offSet = i * maxBlock;
+ }
+ } catch (Exception e) {
+ logger.error("加解密阀值为[" + maxBlock + "]的数据时发生异常",e);
+ }
+ byte[] resultDatas = out.toByteArray();
+ IOUtils.closeQuietly(out);
+ return resultDatas;
+ }
+
+
+}
diff --git a/laws-modules/src/main/java/com/jero/modules/laws/ocr/UUIDUtils.java b/laws-modules/src/main/java/com/jero/modules/laws/ocr/UUIDUtils.java
new file mode 100644
index 00000000..f88b3f9f
--- /dev/null
+++ b/laws-modules/src/main/java/com/jero/modules/laws/ocr/UUIDUtils.java
@@ -0,0 +1,40 @@
+package com.jero.modules.laws.ocr;
+
+
+import com.jero.common.util.RandomUtils;
+
+import java.util.Random;
+
+public class UUIDUtils {
+
+ public static String randomUUID10() {
+ return RandomUtils.randomString(10);
+ }
+
+ public static String randomUUID20() {
+ return RandomUtils.randomString(20);
+ }
+
+ public static String randomUUID(int length) {
+ return RandomUtils.randomString(length);
+ }
+
+ public static String getUUIDPath(String uuid){
+ StringBuilder builder=new StringBuilder();
+ builder.append("/");
+ builder.append((uuid.substring(0, 3).hashCode())%100+"").append("/");
+ builder.append((uuid.substring(7,10).hashCode())%100+"").append("/");
+ builder.append((uuid.substring(11,14).hashCode())%100+"").append("/");
+ return builder.toString();
+ }
+
+ public static String getAttTable(){
+ Random rand = new Random();
+ int nextInt = rand.nextInt(10)+1;
+ StringBuilder builder=new StringBuilder();
+ builder.append("ATT_FILE_").append(String.format("%02d", nextInt));
+ return builder.toString();
+ }
+
+
+}
diff --git a/laws-modules/src/main/java/com/jero/modules/laws/ocr/config/OkHttpConfig.java b/laws-modules/src/main/java/com/jero/modules/laws/ocr/config/OkHttpConfig.java
new file mode 100644
index 00000000..ec6c56fb
--- /dev/null
+++ b/laws-modules/src/main/java/com/jero/modules/laws/ocr/config/OkHttpConfig.java
@@ -0,0 +1,69 @@
+package com.jero.modules.laws.ocr.config;
+
+import okhttp3.ConnectionPool;
+import okhttp3.OkHttpClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.concurrent.TimeUnit;
+
+@Configuration
+public class OkHttpConfig {
+
+ @Bean
+ public X509TrustManager x509TrustManager() {
+ return new X509TrustManager() {
+ @Override
+ public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
+ }
+ @Override
+ public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
+ }
+ @Override
+ public X509Certificate[] getAcceptedIssuers() {
+ return new X509Certificate[0];
+ }
+ };
+ }
+ @Bean
+ public SSLSocketFactory sslSocketFactory() {
+ try {
+ //信任任何链接
+ SSLContext sslContext = SSLContext.getInstance("TLS");
+ sslContext.init(null, new TrustManager[]{x509TrustManager()}, new SecureRandom());
+ return sslContext.getSocketFactory();
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ } catch (KeyManagementException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+ /**
+ * Create a new connection pool with tuning parameters appropriate for a single-user application.
+ * The tuning parameters in this pool are subject to change in future OkHttp releases. Currently
+ */
+ @Bean
+ public ConnectionPool pool() {
+ return new ConnectionPool(200, 5, TimeUnit.MINUTES);
+ }
+ @Bean
+ public OkHttpClient okHttpClient() {
+ return new OkHttpClient.Builder()
+ .sslSocketFactory(sslSocketFactory(), x509TrustManager())
+ .retryOnConnectionFailure(false)//是否开启缓存
+ .connectionPool(pool())//连接池
+ .connectTimeout(10L, TimeUnit.SECONDS)
+ .readTimeout(10L, TimeUnit.SECONDS)
+ .build();
+ }
+}
diff --git a/laws-modules/src/main/java/com/jero/modules/laws/ocr/controller/OCRRestfulController.java b/laws-modules/src/main/java/com/jero/modules/laws/ocr/controller/OCRRestfulController.java
new file mode 100644
index 00000000..0f7602d4
--- /dev/null
+++ b/laws-modules/src/main/java/com/jero/modules/laws/ocr/controller/OCRRestfulController.java
@@ -0,0 +1,181 @@
+package com.jero.modules.laws.ocr.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.jero.modules.laws.ocr.MD5Util;
+import com.jero.modules.laws.ocr.entity.OcrCallBackResultEo;
+import com.jero.modules.laws.ocr.entity.OcrRecordEO;
+import com.jero.modules.laws.ocr.http.PageInfo;
+import com.jero.modules.laws.ocr.http.ResponseMessage;
+import com.jero.modules.laws.ocr.http.Result;
+import com.jero.modules.laws.ocr.page.OcrRecordEOPage;
+import com.jero.modules.laws.ocr.service.OCRRestfulService;
+import com.jero.modules.laws.ocr.service.OcrRecordEOService;
+import com.jero.modules.laws.ocr.web.BaseController;
+import com.jero.modules.onlyoffice.entity.AttFileEO;
+import com.jero.modules.onlyoffice.service.IAttFileEOService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.entity.ContentType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @program: OcrDemo
+ * @description: ocr接口对接类
+ * @author: duyunbao
+ * @create: 2019-03-13 18:21
+ */
+@RestController
+@RequestMapping("/laws/ocr/OCRRestful")
+@Api(description = "|OCR识别 |")
+public class OCRRestfulController extends BaseController {
+ private static final Logger logger = LoggerFactory.getLogger(OCRRestfulController.class);
+
+ @Autowired
+ private OCRRestfulService ocrRestfulService;
+ @Autowired
+ private OcrRecordEOService ocrRecordEOService;
+ @Autowired
+ private IAttFileEOService attFileEOService;
+ //接口回调公钥
+ @Value("${OCR.publicKey}")
+ private String OcrPublicKey;
+ @Value("${OCR.ocrDownPath}")
+ private String ocrDownPath;
+ @Value("${file.path}")
+ private String filePath;//文件存储路径
+
+ @ApiOperation(value = "请求ocr")
+ @PostMapping(value="/upload",consumes="multipart/*",headers="content-type=multipart/form-data" )
+ public ResponseMessage handleFile(@RequestParam("file") MultipartFile file) throws Exception {
+ SimpleDateFormat sdf=new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
+ logger.info("收到文件上传请求,开始处理文件:【"+sdf.format(new Date())+"】");
+ return ocrRestfulService.handleFile(file,file.getOriginalFilename(),null,"add");
+ }
+
+ @ApiOperation(value = "ocr回调")
+ @PostMapping("/OcrHandleResult")
+ public String OcrHandleResult(@RequestParam("wordFile") MultipartFile wordFile,@RequestParam("jsonFile") MultipartFile jsonFile, OcrCallBackResultEo ocrCallBackResultEo) {
+ try{
+ logger.info("调取到我了");
+ logger.info("接口回调结果:"+ JSON.toJSONString(ocrCallBackResultEo));
+ logger.info("接口回调时所传文件---wordFile:"+ wordFile.toString() +"; jsonFile:"+jsonFile.toString());
+ if("error".equals(ocrCallBackResultEo.getResult())){
+ logger.info("客户接口处理文件失败");
+ ocrRestfulService.updateDb(ocrCallBackResultEo.getTaskID(),"客户接口处理文件失败");
+ return "{\"result\":\"error\"}";
+ }
+ //1.验证 key 是否符合,不符合打回,符合继续
+ //2.向后传递文件
+ String key = ocrCallBackResultEo.getKey();
+ String sign = ocrCallBackResultEo.getTaskID() + OcrPublicKey;
+ String signMD5 = MD5Util.string2MD5(sign);
+ if(!signMD5.equals(key)){
+ //不同,则认证失败
+ logger.info("认证失败");
+ ocrRestfulService.updateDb(ocrCallBackResultEo.getTaskID(),"回调接口认证失败");
+ return "{\"result\":\"Authentication failed\"}";
+ }
+ return ocrRestfulService.OcrHandleResult(wordFile,jsonFile,ocrCallBackResultEo.getTaskID());
+ }catch (Exception e){
+ logger.error(e.getMessage(),e);
+ return "{\"result\":\"runTimeException\"}";
+ }
+ }
+
+ @ApiOperation(value = "获取所有ocr结果")
+ @PostMapping("/getAllOcrResult")
+ public ResponseMessage> page(OcrRecordEOPage page) throws Exception {
+ if(org.apache.commons.lang3.StringUtils.isNotBlank(page.getPaixu()) && org.apache.commons.lang3.StringUtils.isNotBlank(page.getShunxu())){
+ String sql = page.getPaixu()+" "+page.getShunxu();
+ page.setSql(sql);
+ }else{
+ page.setOrderBy("creation_time");
+ page.setOrder("desc");
+ }
+ List rows = ocrRecordEOService.queryByPage(page);
+ Integer integer = ocrRecordEOService.queryByPageCount(page);
+ DecimalFormat df = new DecimalFormat("0.00");//设置保留位数
+ for (OcrRecordEO ocrRecordEO : rows){
+ ocrRecordEO.setDocRealFile(ocrDownPath+ocrRecordEO.getDocRealName());
+ ocrRecordEO.setJsonRealFile(ocrDownPath+ocrRecordEO.getJsonRealName());
+ }
+ page.getPager().setRowCount(integer);
+ return Result.success(getPageInfo(page.getPager(), rows));
+ }
+
+ @ApiOperation(value = "新增ocr内容")
+ @PostMapping("/addOcrRecord")
+ public ResponseMessage addOcrRecord(OcrRecordEO ocrRecordEO) throws Exception {
+ SimpleDateFormat sdf=new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
+ logger.info("收到文件上传请求,开始处理文件:【"+sdf.format(new Date())+"】");
+ // 根据attID查找文件
+ String fileId = ocrRecordEO.getAttId();
+ AttFileEO attFileEO = attFileEOService.getFileInfo(fileId);
+ if (attFileEO != null) {
+ String fileOriPath = filePath + attFileEO.getFilePath();
+ String oriName = attFileEO.getOldFileName();
+ File pdfFile = new File(fileOriPath+attFileEO.getFileName());
+ FileInputStream fileInputStream = new FileInputStream(pdfFile);
+ MultipartFile multipartFile = new MockMultipartFile(oriName, oriName,
+ ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);
+ return ocrRestfulService.handleFile(multipartFile,multipartFile.getOriginalFilename(),ocrRecordEO,"add");
+ } else {
+ return Result.error("0","无法找到该文件",null);
+ }
+ }
+
+ @ApiOperation(value = "修改ocr内容")
+ @PutMapping("/updateOcrRecord")
+ public ResponseMessage updateOcrRecord(@RequestBody OcrRecordEO ocrRecordEO) throws Exception {
+ if (StringUtils.isEmpty(ocrRecordEO.getAttId())) {
+ ocrRecordEOService.updateByPrimaryKeySelective(ocrRecordEO);
+ return Result.success("0","保存成功",ocrRecordEO);
+ } else {
+ SimpleDateFormat sdf=new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
+ logger.info("收到文件上传请求,开始处理文件:【"+sdf.format(new Date())+"】");
+ // 根据attID查找文件
+ String fileId = ocrRecordEO.getAttId();
+ AttFileEO attFileEO = attFileEOService.getFileInfo(fileId);
+ if (attFileEO != null) {
+ String fileOriPath = filePath + attFileEO.getFilePath();
+ String oriName = attFileEO.getOldFileName();
+ File pdfFile = new File(fileOriPath+attFileEO.getFileName());
+ FileInputStream fileInputStream = new FileInputStream(pdfFile);
+ MultipartFile multipartFile = new MockMultipartFile(oriName, oriName,
+ ContentType.APPLICATION_OCTET_STREAM.toString(), fileInputStream);
+ return ocrRestfulService.handleFile(multipartFile,multipartFile.getOriginalFilename(),ocrRecordEO,"update");
+ } else {
+ return Result.error("0","无法找到该文件",null);
+ }
+ }
+ }
+
+ @ApiOperation(value = "删除ocr内容")
+ @DeleteMapping("/deleteOcrRecord")
+ public ResponseMessage deleteOcrRecord(String ids) throws Exception {
+ if (StringUtils.isNotEmpty(ids)) {
+ String[] idArr = ids.split(",");
+ List idList = Arrays.asList(idArr);
+ int i = ocrRecordEOService.deleteByIds(idList);
+ return Result.success("0","删除成功",i);
+ } else {
+ return Result.error("删除数据不能为空");
+ }
+
+ }
+}
diff --git a/laws-modules/src/main/java/com/jero/modules/laws/ocr/entity/BaseEntity.java b/laws-modules/src/main/java/com/jero/modules/laws/ocr/entity/BaseEntity.java
new file mode 100644
index 00000000..ea90712a
--- /dev/null
+++ b/laws-modules/src/main/java/com/jero/modules/laws/ocr/entity/BaseEntity.java
@@ -0,0 +1,6 @@
+package com.jero.modules.laws.ocr.entity;
+
+public class BaseEntity {
+ public BaseEntity() {
+ }
+}
diff --git a/laws-modules/src/main/java/com/jero/modules/laws/ocr/entity/OcrCallBackResultEo.java b/laws-modules/src/main/java/com/jero/modules/laws/ocr/entity/OcrCallBackResultEo.java
new file mode 100644
index 00000000..fd39b673
--- /dev/null
+++ b/laws-modules/src/main/java/com/jero/modules/laws/ocr/entity/OcrCallBackResultEo.java
@@ -0,0 +1,76 @@
+package com.jero.modules.laws.ocr.entity;
+
+/**
+ * @program: OcrDemo
+ * @description: orc调取回调函数的参数
+ * @author: duyunbao
+ * @create: 2019-03-13 16:14
+ */
+public class OcrCallBackResultEo {
+
+ private String result ;
+ private String taskID ;
+// private String wordFileName;
+// private String wordFileContent;
+// private String jsonFileName;
+// private String jsonFileContent;
+
+ private String key;
+
+ public String getResult() {
+ return result;
+ }
+
+ public void setResult(String result) {
+ this.result = result;
+ }
+
+ public String getTaskID() {
+ return taskID;
+ }
+
+ public void setTaskID(String taskID) {
+ this.taskID = taskID;
+ }
+//
+// public String getWordFileName() {
+// return wordFileName;
+// }
+//
+// public void setWordFileName(String wordFileName) {
+// this.wordFileName = wordFileName;
+// }
+//
+// public String getWordFileContent() {
+// return wordFileContent;
+// }
+//
+// public void setWordFileContent(String wordFileContent) {
+// this.wordFileContent = wordFileContent;
+// }
+//
+// public String getJsonFileName() {
+// return jsonFileName;
+// }
+//
+// public void setJsonFileName(String jsonFileName) {
+// this.jsonFileName = jsonFileName;
+// }
+
+// public String getJsonFileContent() {
+// return jsonFileContent;
+// }
+//
+// public void setJsonFileContent(String jsonFileContent) {
+// this.jsonFileContent = jsonFileContent;
+// }
+
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+}
diff --git a/laws-modules/src/main/java/com/jero/modules/laws/ocr/entity/OcrRecordEO.java b/laws-modules/src/main/java/com/jero/modules/laws/ocr/entity/OcrRecordEO.java
new file mode 100644
index 00000000..68bc404c
--- /dev/null
+++ b/laws-modules/src/main/java/com/jero/modules/laws/ocr/entity/OcrRecordEO.java
@@ -0,0 +1,278 @@
+package com.jero.modules.laws.ocr.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 功能:OCR_RECORD OcrRecordEOEntity
+ * 作者:code generator
+ * 日期: 2019-03-25
+ * 版权所有:版权归北京卡达克数据技术中心所有。
+ */
+public class OcrRecordEO extends BaseEntity implements Serializable{
+
+ private static final long serialVersionUID = -5464438392516276473L;
+ private Object wordFileCode;
+ private Object jsonFileCode;
+ private String id;
+ private String docRealName;
+ private String jsonRealName;
+ private String fileName;
+ private String docName;
+ private String jsonName;
+ @org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ private Date creationTime;
+ @org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ private Date modifyTime;
+
+ private String docRealFile;
+ private String jsonRealFile;
+
+ //计算文件转换耗费时间
+ private String spendTime;
+ //转换结果
+ private String resultContent;
+ //新增字段
+ private String fileType;
+ private String standNumber;
+ private String standName;
+ private String creationUser;
+ private String attId;
+ /**
+ * java字段名转换为原始数据库列名。如果不存在则返回null
+ * 字段列表:
+ * wordFileCode -> word_file_code
+ * jsonFileCode -> json_file_code
+ * id -> id
+ * docRealName -> doc_real_name
+ * jsonRealName -> json_real_name
+ * fileName -> file_name
+ * docName -> doc_name
+ * jsonName -> json_name
+ * creationTime -> creation_time
+ * modifyTime -> modify_time
+ */
+ public static String fieldToColumn(String fieldName) {
+ if (fieldName == null) return null;
+ switch (fieldName) {
+ case "wordFileCode": return "word_file_code";
+ case "jsonFileCode": return "json_file_code";
+ case "id": return "id";
+ case "docRealName": return "doc_real_name";
+ case "jsonRealName": return "json_real_name";
+ case "fileName": return "file_name";
+ case "docName": return "doc_name";
+ case "jsonName": return "json_name";
+ case "creationTime": return "creation_time";
+ case "modifyTime": return "modify_time";
+ default: return null;
+ }
+ }
+
+ /**
+ * 原始数据库列名转换为java字段名。如果不存在则返回null
+ * 字段列表:
+ * word_file_code -> wordFileCode
+ * json_file_code -> jsonFileCode
+ * id -> id
+ * doc_real_name -> docRealName
+ * json_real_name -> jsonRealName
+ * file_name -> fileName
+ * doc_name -> docName
+ * json_name -> jsonName
+ * creation_time -> creationTime
+ * modify_time -> modifyTime
+ */
+ public static String columnToField(String columnName) {
+ if (columnName == null) return null;
+ switch (columnName) {
+ case "word_file_code": return "wordFileCode";
+ case "json_file_code": return "jsonFileCode";
+ case "id": return "id";
+ case "doc_real_name": return "docRealName";
+ case "json_real_name": return "jsonRealName";
+ case "file_name": return "fileName";
+ case "doc_name": return "docName";
+ case "json_name": return "jsonName";
+ case "creation_time": return "creationTime";
+ case "modify_time": return "modifyTime";
+ default: return null;
+ }
+ }
+
+ /** **/
+ public Object getWordFileCode() {
+ return this.wordFileCode;
+ }
+
+ /** **/
+ public void setWordFileCode(Object wordFileCode) {
+ this.wordFileCode = wordFileCode;
+ }
+
+ /** **/
+ public Object getJsonFileCode() {
+ return this.jsonFileCode;
+ }
+
+ /** **/
+ public void setJsonFileCode(Object jsonFileCode) {
+ this.jsonFileCode = jsonFileCode;
+ }
+
+ /** **/
+ public String getId() {
+ return this.id;
+ }
+
+ /** **/
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ /** **/
+ public String getDocRealName() {
+ return this.docRealName;
+ }
+
+ /** **/
+ public void setDocRealName(String docRealName) {
+ this.docRealName = docRealName;
+ }
+
+ /** **/
+ public String getJsonRealName() {
+ return this.jsonRealName;
+ }
+
+ /** **/
+ public void setJsonRealName(String jsonRealName) {
+ this.jsonRealName = jsonRealName;
+ }
+
+ /** **/
+ public String getFileName() {
+ return this.fileName;
+ }
+
+ /** **/
+ public void setFileName(String fileName) {
+ this.fileName = fileName;
+ }
+
+ /** **/
+ public String getDocName() {
+ return this.docName;
+ }
+
+ /** **/
+ public void setDocName(String docName) {
+ this.docName = docName;
+ }
+
+ /** **/
+ public String getJsonName() {
+ return this.jsonName;
+ }
+
+ /** **/
+ public void setJsonName(String jsonName) {
+ this.jsonName = jsonName;
+ }
+
+ /** **/
+ public Date getCreationTime() {
+ return this.creationTime;
+ }
+
+ /** **/
+ public void setCreationTime(Date creationTime) {
+ this.creationTime = creationTime;
+ }
+
+ /** **/
+ public Date getModifyTime() {
+ return this.modifyTime;
+ }
+
+ /** **/
+ public void setModifyTime(Date modifyTime) {
+ this.modifyTime = modifyTime;
+ }
+
+ public String getDocRealFile() {
+ return docRealFile;
+ }
+
+ public void setDocRealFile(String docRealFile) {
+ this.docRealFile = docRealFile;
+ }
+
+ public String getJsonRealFile() {
+ return jsonRealFile;
+ }
+
+ public void setJsonRealFile(String jsonRealFile) {
+ this.jsonRealFile = jsonRealFile;
+ }
+
+ public String getSpendTime() {
+ return spendTime;
+ }
+
+ public void setSpendTime(String spendTime) {
+ this.spendTime = spendTime;
+ }
+
+ public String getResultContent() {
+ return resultContent;
+ }
+
+ public void setResultContent(String resultContent) {
+ this.resultContent = resultContent;
+ }
+
+ public static long getSerialVersionUID() {
+ return serialVersionUID;
+ }
+
+ public String getFileType() {
+ return fileType;
+ }
+
+ public void setFileType(String fileType) {
+ this.fileType = fileType;
+ }
+
+ public String getStandNumber() {
+ return standNumber;
+ }
+
+ public void setStandNumber(String standNumber) {
+ this.standNumber = standNumber;
+ }
+
+ public String getStandName() {
+ return standName;
+ }
+
+ public void setStandName(String standName) {
+ this.standName = standName;
+ }
+
+ public String getCreationUser() {
+ return creationUser;
+ }
+
+ public void setCreationUser(String creationUser) {
+ this.creationUser = creationUser;
+ }
+
+ public String getAttId() {
+ return attId;
+ }
+
+ public void setAttId(String attId) {
+ this.attId = attId;
+ }
+}
diff --git a/laws-modules/src/main/java/com/jero/modules/laws/ocr/entity/OcrRequestEo.java b/laws-modules/src/main/java/com/jero/modules/laws/ocr/entity/OcrRequestEo.java
new file mode 100644
index 00000000..fe8029b5
--- /dev/null
+++ b/laws-modules/src/main/java/com/jero/modules/laws/ocr/entity/OcrRequestEo.java
@@ -0,0 +1,83 @@
+package com.jero.modules.laws.ocr.entity;
+
+/**
+ * @program: OcrDemo
+ * @description: ocr接口请求实体类
+ * @author: duyunbao
+ * @create: 2019-03-13 20:46
+ */
+public class OcrRequestEo {
+
+ private String userId;
+ private String authCode;
+ private String convertType;
+ private String Filename;
+ private String taskId;
+ private String callBackUrl;
+ private String callBackMethod;
+ private String fileContent;
+
+ public String getUserId() {
+ return userId;
+ }
+
+ public void setUserId(String userId) {
+ this.userId = userId;
+ }
+
+ public String getAuthCode() {
+ return authCode;
+ }
+
+ public void setAuthCode(String authCode) {
+ this.authCode = authCode;
+ }
+
+ public String getConvertType() {
+ return convertType;
+ }
+
+ public void setConvertType(String convertType) {
+ this.convertType = convertType;
+ }
+
+ public String getFilename() {
+ return Filename;
+ }
+
+ public void setFilename(String filename) {
+ Filename = filename;
+ }
+
+ public String getTaskId() {
+ return taskId;
+ }
+
+ public void setTaskId(String taskId) {
+ this.taskId = taskId;
+ }
+
+ public String getCallBackUrl() {
+ return callBackUrl;
+ }
+
+ public void setCallBackUrl(String callBackUrl) {
+ this.callBackUrl = callBackUrl;
+ }
+
+ public String getCallBackMethod() {
+ return callBackMethod;
+ }
+
+ public void setCallBackMethod(String callBackMethod) {
+ this.callBackMethod = callBackMethod;
+ }
+
+ public String getFileContent() {
+ return fileContent;
+ }
+
+ public void setFileContent(String fileContent) {
+ this.fileContent = fileContent;
+ }
+}
diff --git a/laws-modules/src/main/java/com/jero/modules/laws/ocr/entity/OcrResultEo.java b/laws-modules/src/main/java/com/jero/modules/laws/ocr/entity/OcrResultEo.java
new file mode 100644
index 00000000..7f917942
--- /dev/null
+++ b/laws-modules/src/main/java/com/jero/modules/laws/ocr/entity/OcrResultEo.java
@@ -0,0 +1,30 @@
+package com.jero.modules.laws.ocr.entity;
+
+/**
+ * @program: OcrDemo
+ * @description: ocr返回结果
+ * @author: duyunbao
+ * @create: 2019-03-13 15:35
+ */
+public class OcrResultEo {
+
+ private String resultCode;
+
+ private String returnMessage;
+
+ public String getResultCode() {
+ return resultCode;
+ }
+
+ public void setResultCode(String resultCode) {
+ this.resultCode = resultCode;
+ }
+
+ public String getReturnMessage() {
+ return returnMessage;
+ }
+
+ public void setReturnMessage(String returnMessage) {
+ this.returnMessage = returnMessage;
+ }
+}
diff --git a/laws-modules/src/main/java/com/jero/modules/laws/ocr/http/PageInfo.java b/laws-modules/src/main/java/com/jero/modules/laws/ocr/http/PageInfo.java
new file mode 100644
index 00000000..71379196
--- /dev/null
+++ b/laws-modules/src/main/java/com/jero/modules/laws/ocr/http/PageInfo.java
@@ -0,0 +1,168 @@
+package com.jero.modules.laws.ocr.http;
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class PageInfo {
+ private Integer pageNo;
+ private Integer pageSize;
+ private Long count;
+ private Long pageCount;
+ private List list;
+ private List