From a670c006af6d1f5e32828f7aadc2111f26680029 Mon Sep 17 00:00:00 2001 From: zhengfangyuan Date: Tue, 26 Jan 2021 19:06:06 +0800 Subject: [PATCH] fix ocr --- .../main/java/com/iformall/CApplication.java | 3 + .../iformall/controller/WxOcrController.java | 14 +- .../src/main/resources/application-dev.yml | 1 + .../src/main/resources/application-prod.yml | 1 + .../main/resources/application-test.yml-bak | 1 + .../java/com/iformall/ocr/FormallTess4j.java | 19 +- .../com/iformall/ocr/FormallTess4jTrain.java | 228 ++++++------------ mallinkSysAdmin/pom.xml | 7 + .../java/com/iformall/SysApplication.java | 3 + .../controller/ocr/WxOcrController.java | 220 +++++++++++++++++ .../src/main/resources/application-dev.yml | 1 + .../src/main/resources/application-prod.yml | 2 + .../main/resources/application-test.yml-bak | 1 + 13 files changed, 328 insertions(+), 173 deletions(-) create mode 100644 mallinkSysAdmin/src/main/java/com/iformall/controller/ocr/WxOcrController.java diff --git a/mallinkCApi/src/main/java/com/iformall/CApplication.java b/mallinkCApi/src/main/java/com/iformall/CApplication.java index 4e5aeb268..5fc95eb94 100644 --- a/mallinkCApi/src/main/java/com/iformall/CApplication.java +++ b/mallinkCApi/src/main/java/com/iformall/CApplication.java @@ -32,6 +32,9 @@ public class CApplication { @Value("${fm.upload_dir}") private String uploadDir; + + @Value("${fm.ocr_data}") + private String ocrData; @Bean public boolean isFmException() { diff --git a/mallinkCApi/src/main/java/com/iformall/controller/WxOcrController.java b/mallinkCApi/src/main/java/com/iformall/controller/WxOcrController.java index 71826861c..79bef0746 100644 --- a/mallinkCApi/src/main/java/com/iformall/controller/WxOcrController.java +++ b/mallinkCApi/src/main/java/com/iformall/controller/WxOcrController.java @@ -3,6 +3,7 @@ package com.iformall.controller; import com.iformall.common.ErrorCode; import com.iformall.common.ResultData; import com.iformall.domain.po.WxMerchantOcrModel; +import com.iformall.domain.po.WxOcrModel; import com.iformall.domain.po.base.TenantEntity; import com.iformall.ocr.FormallTess4j; import com.iformall.service.WxOcrService; @@ -28,7 +29,8 @@ public class WxOcrController extends BaseController { @Autowired private WxOcrService ocrService; - + @Autowired + private String ocrData; @ApiOperation("分析图片信息") @GetMapping("/analyImage") @@ -38,13 +40,17 @@ public class WxOcrController extends BaseController { }) public ResultData analyImage(Long merchantId,String imageUrl) { TenantEntity tenantEntity = getTenantInfo(); - WxMerchantOcrModel model = ocrService.getMerchantOcrModel(merchantId, tenantEntity.getTenantId(), tenantEntity.getParentTenantId()); - if (null == model) { + WxMerchantOcrModel MerchantModel = ocrService.getMerchantOcrModel(merchantId, tenantEntity.getTenantId(), tenantEntity.getParentTenantId()); + if (null == MerchantModel) { return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(), "当前商户没有配置OCR模板"); } + WxOcrModel ocrModel = ocrService.getOcrModelById(MerchantModel.getOcrModelId()); + if (null == ocrModel) { + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(), "当前商户配置的OCR模板未查询到"); + } String result; try { - result = FormallTess4j.ocrNetImgFile(imageUrl); + result = FormallTess4j.ocrNetImgFile(ocrData,imageUrl,ocrModel.getFontName()); return new ResultData(result); } catch (Exception e) { logger.error("ocr识别失败。",e); diff --git a/mallinkCApi/src/main/resources/application-dev.yml b/mallinkCApi/src/main/resources/application-dev.yml index b2b606aad..a3334c605 100644 --- a/mallinkCApi/src/main/resources/application-dev.yml +++ b/mallinkCApi/src/main/resources/application-dev.yml @@ -160,6 +160,7 @@ fm: deploy: 1 open: true upload_dir: /home/test/server/uploads/ + ocr_data: /home/test/server/ocr_data/ logging: level: diff --git a/mallinkCApi/src/main/resources/application-prod.yml b/mallinkCApi/src/main/resources/application-prod.yml index cb6c367fc..86d1a247c 100644 --- a/mallinkCApi/src/main/resources/application-prod.yml +++ b/mallinkCApi/src/main/resources/application-prod.yml @@ -115,6 +115,7 @@ fm: deploy: 3 open: true upload_dir: /root/uploads/ + ocr_data: /root/ocr_data/ logging: level: diff --git a/mallinkCApi/src/main/resources/application-test.yml-bak b/mallinkCApi/src/main/resources/application-test.yml-bak index 4aa4daf72..e75ea2d83 100644 --- a/mallinkCApi/src/main/resources/application-test.yml-bak +++ b/mallinkCApi/src/main/resources/application-test.yml-bak @@ -93,6 +93,7 @@ fm: deploy: 2 open: true upload_dir: /home/ec2-user/server/uploads/ + ocr_data: /home/ec2-user/server/ocr_data/ logging: level: diff --git a/mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4j.java b/mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4j.java index 522ca71f2..b1069601f 100644 --- a/mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4j.java +++ b/mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4j.java @@ -119,14 +119,14 @@ public class FormallTess4j { } - public static String ocrLocalImgFile(String filePath) throws Exception { - File imageFile = new File(filePath); - return testDoOCR_File(imageFile); + private static String ocrLocalImgFile(String languagePath,String filePath,String fontName) throws Exception { + File imageFile = new File(filePath,fontName); + return testDoOCR_File(languagePath,imageFile,fontName); } - public static String ocrNetImgFile(String fileUrl) throws Exception { + public static String ocrNetImgFile(String languagePath,String fileUrl,String fontName) throws Exception { File imageFile = urlImgToFile(fileUrl); - return testDoOCR_File(imageFile); + return testDoOCR_File(languagePath,imageFile,fontName); } /** @@ -134,11 +134,11 @@ public class FormallTess4j { * 根据图片文件进行识别 * @throws Exception while processing image. */ - private static String testDoOCR_File(File imageFile) throws Exception { + public static String testDoOCR_File(String languagePath,File imageFile,String fontName) throws Exception { logger.info("doOCR on a jpg image"); //set language - instance.setDatapath(testResourcesLanguagePath); - instance.setLanguage("test1"); + instance.setDatapath(languagePath); + instance.setLanguage(fontName); String result = instance.doOCR(imageFile); return result; } @@ -146,14 +146,13 @@ public class FormallTess4j { public static void main(String[] args) { try { - System.out.println(ocrNetImgFile("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.my0832.com%2Fattachments%2Fbbs%2F20140424%2F201442413083356803_740_1186.jpg&refer=http%3A%2F%2Fimg.my0832.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1613903848&t=985fc4c6c7b7ee82cb98f97ab5bf1459")); + System.out.println(ocrNetImgFile(testResourcesLanguagePath,"https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.my0832.com%2Fattachments%2Fbbs%2F20140424%2F201442413083356803_740_1186.jpg&refer=http%3A%2F%2Fimg.my0832.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1613903848&t=985fc4c6c7b7ee82cb98f97ab5bf1459","test1")); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } - // // /** // * Test of doOCR method, of class Tesseract. diff --git a/mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4jTrain.java b/mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4jTrain.java index cede78e76..eceac2147 100644 --- a/mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4jTrain.java +++ b/mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4jTrain.java @@ -15,90 +15,38 @@ public class FormallTess4jTrain { private static final String newFileFolder = "C:\\Users\\iformall\\Desktop\\newfile"; - /** - * 第一步,用jTessBoxEditor --> Tools --> Merge 多选图片,保存为tif格式 - * 命名: [lang].[fontname].exp[num].tif lang是语言 fontname是字体 - */ + private static final String huanhangstr = " \n"; - /** - * 第二部,用tif生成box - * @param args - */ - public static void createBoxFile(String tifFileName,String lang,String fontName) { + private static String getprefix(String lang,String fontName) { + String realFileName = lang+"."+fontName+".exp0"; + return realFileName; + } + + private static String createBoxFile(String tifFileName,String lang,String fontName) { String prefix = getprefix(lang,fontName); String realFileName = prefix+".tif"; if (tifFileName.equals(realFileName)) { String cmdstr = "tesseract "+tifFileName+" "+prefix+" -l chi_sim batch.nochop makebox"; - System.out.println(cmdstr); + return cmdstr; //String result = executeLocalCmd(cmdstr, null); //System.out.println("Done createBoxFile"+result); + }else { + return "文件必须是.tif"; } } - /** - * 第三步,用jTessBoxEditor 打开.box文件进行矫正。 - */ - - /** - * 第四步,新建font_properties,内容 [fontName] 0 0 0 0 0 - * 的取值为1或0,表示字体是否具有这些属性 - */ - public static void createFontPorperties(String fontName,int italic, int bold, int fixed,int serif,int fraktur) { - try { - - String content = fontName+" "+italic+" "+bold+" "+fixed+" "+serif+" "+fraktur; - System.out.println(content); - File file = new File(newFileFolder+"\\font_properties"); - if (file.exists()) { - file.delete(); - } - file.createNewFile(); - - FileWriter fw = new FileWriter(file.getAbsoluteFile()); - BufferedWriter bw = new BufferedWriter(fw); - bw.write(content); - bw.close(); - System.out.println("Done createFontPorperties"); - - } catch (IOException e) { - e.printStackTrace(); - } - } - - /*** - * 第五步:执行以下命令 - * @param lang - * @param fontName - * @return - */ - public static void createTrainFiles(String lang,String fontName) { + private static String createTranFile(String lang,String fontName) { String prefix = getprefix(lang,fontName); String realFileName = prefix+".tif"; - String trainCmdstr = "tesseract "+realFileName+" "+prefix+" nobatch box.train"; - System.out.println(trainCmdstr); - //executeLocalCmd(trainCmdstr, null); - - //此处可以批量开始 + return trainCmdstr; + } + + private static String getBoxFont(String lang,String fontName) { + String prefix = getprefix(lang,fontName); String extractorCmdstr = "unicharset_extractor "+prefix+".box"; - System.out.println(extractorCmdstr); - //executeLocalCmd(extractorCmdstr, null); - - String shapeCmdStr = "shapeclustering -F font_properties -U unicharset "+prefix+".tr"; - System.out.println(shapeCmdStr); - //executeLocalCmd(shapeCmdStr, null); - - String mftraingCmdstr = "mftraining -F font_properties -U unicharset -O unicharset "+prefix+".tr"; - System.out.println(mftraingCmdstr); - //executeLocalCmd(mftraingCmdstr, null); - - String cntrainCmdstr = "cntraining "+prefix+".tr"; - System.out.println(cntrainCmdstr); - //executeLocalCmd(cntrainCmdstr, null); - //批量结束 - - //System.out.println("DONE createTrainFiles !"); + return extractorCmdstr; } /** @@ -108,28 +56,23 @@ public class FormallTess4jTrain { * @param fontName * @return */ - public static void renameTrainFiles(String fontName) { + private static String renameTrainFiles(String fontName) { + StringBuffer sb = new StringBuffer(); String renCmdstr = "REN unicharset "+fontName+".unicharset"; - System.out.println(renCmdstr); - //executeLocalCmd(renCmdstr, null); + sb.append(renCmdstr).append(huanhangstr); renCmdstr = "REN inttemp "+fontName+".inttemp"; - System.out.println(renCmdstr); - //executeLocalCmd(renCmdstr, null); + sb.append(renCmdstr).append(huanhangstr); renCmdstr = "REN pffmtable "+fontName+".pffmtable"; - System.out.println(renCmdstr); - //executeLocalCmd(renCmdstr, null); + sb.append(renCmdstr).append(huanhangstr); renCmdstr = "REN shapetable "+fontName+".shapetable"; - System.out.println(renCmdstr); - //executeLocalCmd(renCmdstr, null); + sb.append(renCmdstr).append(huanhangstr); renCmdstr = "REN normproto "+fontName+".normproto"; - System.out.println(renCmdstr); - //executeLocalCmd(renCmdstr, null); - - //System.out.println("DONE renameTrainFiles !"); + sb.append(renCmdstr).append(huanhangstr); + return sb.toString(); } /** @@ -138,87 +81,54 @@ public class FormallTess4jTrain { * @param fontName * @return */ - public static void mergeTrainFiles(String fontName) { + private static String mergeTrainFiles(String fontName) { String mergeCmdstr = "combine_tessdata "+fontName+"."; - System.out.println(mergeCmdstr); - //executeLocalCmd(mergeCmdstr, null); - - //System.out.println("DONE mergeTrainFiles !"); - } - - - - private static String getprefix(String lang,String fontName) { - String realFileName = lang+"."+fontName+".exp0"; - return realFileName; + return mergeCmdstr; } - private static String executeLocalCmd(String cmd, File workpath) { - try { - String[] cmdA = { "cmd.exe", "/c", cmd }; - Process process = null; - if(workpath==null){ - process = Runtime.getRuntime().exec(cmdA); - }else{ - process = Runtime.getRuntime().exec(cmdA, null, workpath); - } -// LineNumberReader br = new LineNumberReader(new InputStreamReader(process.getInputStream())); - LineNumberReader br = new LineNumberReader(new InputStreamReader(process.getInputStream(),"GBK")); - StringBuffer sb = new StringBuffer(); - String line; - while ((line = br.readLine()) != null) { - sb.append(line).append("\n"); - } - return sb.toString(); - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - - public static void main(String[] args) { -// String cmdStr = "mspaint";// 打开画板 -// //cmdStr = "ren C:/server/data/ccgavr/3.png C:/server/data/ccgavr/4.png";// 重命名,DOS中不可 -// //cmdStr = "ren 3.png 4.png"; -// cmdStr = "ipconfig"; -//// executeCMD(cmdStr); -// System.out.println(executeLocalCmd(cmdStr, null)); - - /**第一步,用jTessBoxEditor --> Tools --> Merge 多选图片,保存为tif格式*/ - System.out.println("第一步,用jTessBoxEditor --> Tools --> Merge 多选图片,保存为tif格式 . 命名格式:lang.fontName.exp0.tif"); - System.out.println("》》》》》》》》》"); - - /**第二部,用tif生成box*/ - System.out.println("第二步,用tif生成box"); - createBoxFile("mylang.test1.exp0.tif", "mylang", "test1"); - System.out.println("》》》》》》》》》"); - - /**第三步,用jTessBoxEditor 打开.box文件进行矫正。*/ - System.out.println("第三步,用jTessBoxEditor 打开.box文件进行矫"); - System.out.println("》》》》》》》》》"); - - /**第四步,新建font_properties,内容 [fontName] 0 0 0 0 0*/ - System.out.println("第四步:新建font_properties,内容 [fontName] 0 0 0 0 0"); - createFontPorperties("test1", 0, 0, 0, 0, 0); - System.out.println("》》》》》》》》》"); - - /** 第五步:执行以下命令*/ - System.out.println("第五步:执行以下命令"); - createTrainFiles("mylang", "test1"); - System.out.println("》》》》》》》》》"); - - /**第六步,执行完成后生成以下几个文件加前缀*/ - System.out.println("第六步,执行完成后生成以下几个文件加前缀"); - renameTrainFiles("test1"); - System.out.println("》》》》》》》》》"); - - /**第七步:合并5个文件*/ - System.out.println("第七步:合并5个文件"); - mergeTrainFiles("test1"); + public static String getTrainSteps(String lang,String fontName) { + + StringBuffer sb = new StringBuffer("请进入到样本图片文件夹用doc命令执行.").append(huanhangstr); + sb.append("第一步,用jTessBoxEditor --> Tools --> Merge 多选图片,保存为tif格式 .命名格式为[lang].[fontName].exp0.tif. 命名:").append(lang).append(".").append(fontName).append(".exp0.tif ").append(huanhangstr); + sb.append("............ ").append(huanhangstr); + sb.append("第二步,用tif生成box ").append(huanhangstr); + sb.append(createBoxFile(lang+"."+fontName+".exp0.tif", lang, fontName)).append(huanhangstr); + sb.append("............ ").append(huanhangstr); + sb.append("第三步,用jTessBoxEditor 打开.box文件进行矫正 ").append(huanhangstr); + sb.append("............ ").append(huanhangstr); + sb.append("第四步:用box文件生成。tr文件 ").append(huanhangstr); + sb.append(createTranFile(lang,fontName)).append(huanhangstr); + sb.append("............ ").append(huanhangstr); + sb.append("第五步:提取box字符 ").append(huanhangstr); + sb.append(getBoxFont(lang,fontName)).append(huanhangstr); + sb.append("............ ").append(huanhangstr); + sb.append("@@@!!!!从此处开始,可以处理多个字库处理。如原来的字库现在做升级,需要把老的字库的。tif,.box,.tr文件重新命名也放到同目录文件夹, ").append(huanhangstr); + sb.append("............ ").append(huanhangstr); + sb.append("第六步:新建font_properties(没有.txt后缀), 把所有box对应的字体特征加进去。").append(huanhangstr); + sb.append("fontname为字体名称,保持和 图片集文件 .tif 和.box文件的前缀名一致 .的取值为1或0,表示字体是否具有这些属性。 ").append(huanhangstr); + sb.append("如以下内容: ").append(huanhangstr); + sb.append("fontName1 0 0 0 0 0 ").append(huanhangstr); + sb.append("fontName2 0 1 0 0 0 ").append(huanhangstr); + sb.append("fontName3 1 1 0 0 0 ").append(huanhangstr); + sb.append("............ ").append(huanhangstr); + sb.append("第六步:批量执行系列命令。多个文件在后面累加。 ").append(huanhangstr); + String prefix = getprefix(lang,fontName); + String shapeCmdStr = "shapeclustering -F font_properties -U unicharset "+prefix+".tr [other .tr files...] "; + sb.append(shapeCmdStr).append(huanhangstr); + String mftraingCmdstr = "mftraining -F font_properties -U unicharset -O unicharset "+prefix+".tr [other .tr files...] "; + sb.append(mftraingCmdstr).append(huanhangstr); + String cntrainCmdstr = "cntraining "+prefix+".tr [other .tr files...] "; + sb.append(cntrainCmdstr).append(huanhangstr); + sb.append("............ ").append(huanhangstr); + sb.append("第七步,执行完成后生成以下几个文件加前缀: unicharset、inttemp、pffmtable、shapetable、normproto 添加这几个文件的前缀为[fontName] ").append(huanhangstr); + sb.append(renameTrainFiles(fontName)); + sb.append("............ ").append(huanhangstr); + sb.append("第七步:合并5个文件").append(huanhangstr); + sb.append(mergeTrainFiles(fontName)).append(huanhangstr); + sb.append("............ ").append(huanhangstr); + sb.append("第八步:将").append(fontName).append(".traineddata 文件拷贝到后端服务器ocr_data(项目配置fm.ocr_data)目录下。 .tif、。box、。tr文件也需要保留,后面如果这个字库有更新,需要用到这些文件。").append(huanhangstr); + return sb.toString(); } - - } diff --git a/mallinkSysAdmin/pom.xml b/mallinkSysAdmin/pom.xml index 9544ca12d..d595fe242 100644 --- a/mallinkSysAdmin/pom.xml +++ b/mallinkSysAdmin/pom.xml @@ -39,6 +39,13 @@ com.github.axet kaptcha 0.0.9 + + + + + com.iformall + mallinkOcr + 1.0 diff --git a/mallinkSysAdmin/src/main/java/com/iformall/SysApplication.java b/mallinkSysAdmin/src/main/java/com/iformall/SysApplication.java index 787b04e1d..88dd8c2de 100644 --- a/mallinkSysAdmin/src/main/java/com/iformall/SysApplication.java +++ b/mallinkSysAdmin/src/main/java/com/iformall/SysApplication.java @@ -34,6 +34,9 @@ public class SysApplication { @Value("${fm.upload_dir}") private String uploadDir; + @Value("${fm.ocr_data}") + private String ocrData; + @Bean public boolean isFmException() { return fmException; diff --git a/mallinkSysAdmin/src/main/java/com/iformall/controller/ocr/WxOcrController.java b/mallinkSysAdmin/src/main/java/com/iformall/controller/ocr/WxOcrController.java new file mode 100644 index 000000000..cedacb431 --- /dev/null +++ b/mallinkSysAdmin/src/main/java/com/iformall/controller/ocr/WxOcrController.java @@ -0,0 +1,220 @@ +package com.iformall.controller.ocr; + +import com.github.pagehelper.PageInfo; +import com.iformall.annotation.SystemControllerLog; +import com.iformall.common.ErrorCode; +import com.iformall.common.Result; +import com.iformall.common.ResultData; +import com.iformall.controller.base.BaseController; +import com.iformall.domain.po.MallUserInfo; +import com.iformall.domain.po.WxMall; +import com.iformall.domain.po.WxMerchant; +import com.iformall.domain.po.WxMerchantOcrModel; +import com.iformall.domain.po.WxOcrModel; +import com.iformall.domain.po.base.TenantEntity; +import com.iformall.domain.po.base.BaseEntity.SortField; +import com.iformall.enums.EnumFromType; +import com.iformall.enums.EnumRentStartType; +import com.iformall.ocr.FormallTess4j; +import com.iformall.ocr.FormallTess4jTrain; +import com.iformall.service.WxMallService; +import com.iformall.service.WxMerchantService; +import com.iformall.service.WxOcrService; + +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Date; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +@RestController +@RequestMapping("ocr") +public class WxOcrController extends BaseController { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private WxOcrService ocrService; + @Autowired + private WxMerchantService merchantService; + @Autowired + private String ocrData; + + /** + * 模板列表 + * @param wxRentContract + * @param pageNum + * @param pageSize + * @return + */ + @GetMapping("/modelList") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), + @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) + public ResultData modelList(@ModelAttribute WxOcrModel ocrModel, Integer pageNum, Integer pageSize) { + if (null == ocrModel) { + ocrModel = new WxOcrModel(); + } + ocrModel.setSortColumns(SortField.Createtime_DESC); + PageInfo page = ocrService.listOcrModelAsPage(ocrModel, pageNum, pageSize); + return new ResultData(page); + } + + /** + * 更新模板 + * @param wxRentContract + * @return + */ + @PostMapping("updateModel") + public ResultData updateModel(@RequestBody WxOcrModel ocrModel) { + return ocrService.saveOrUpdateOcrModel(ocrModel); + } + + /** + * 根据商户查询模板 + * @param wxRentContract + * @return + */ + @GetMapping("merchantModel") + @ApiImplicitParams({ + @ApiImplicitParam(name = "merchantId", value = "商户编号", dataType = "Long", paramType = "query", required = true) + }) + public ResultData merchantModel(Long merchantId) { + WxMerchant merchant = merchantService.getById(merchantId); + if (null == merchant) { + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),"商户数据不存在"); + } + return new ResultData(ocrService.getMerchantOcrModel(merchantId, merchant.getTenantId(), merchant.getParentTenantId())); + } + + /** + * 更新商户模板 + * @param wxRentContract + * @return + */ + @PostMapping("updateMerchantModel") + public ResultData updateMerchantModel(@RequestBody WxMerchantOcrModel merchantModel) { + return ocrService.saveOrUpdateMerchantOcrModel(merchantModel); + } + + /** + * 删除商户模板 + * @param wxRentContract + * @return + */ + @PostMapping("deleteMerchantModel") + public ResultData deleteMerchantModel(@RequestBody WxMerchantOcrModel merchantModel) { + return ocrService.deleteMerchantOcrModel(merchantModel.getId()); + } + + /** + * 获取训练步骤 + * @return + */ + @GetMapping("getTrainSteps") + @ApiImplicitParams({ + @ApiImplicitParam(name = "modelId", value = "模板编号", dataType = "Long", paramType = "query", required = true) + }) + public ResultData getTrainSteps(Long modelId) { + WxOcrModel model = ocrService.getOcrModelById(modelId); + if (null == model) { + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),"ocr模板不存在"); + } + return new ResultData(FormallTess4jTrain.getTrainSteps(model.getLangCode(), model.getFontName())); + } + + /** + *测试训练结果 + * @return + */ + @PostMapping(value = "/testTrain", consumes = "multipart/*", headers = "content-type=multipart/form-data") + public ResultData testTrain(@RequestParam("file") MultipartFile multiReq,@RequestParam("modelId") Long modelId) { + try { + WxOcrModel model = ocrService.getOcrModelById(modelId); + if (null == model) { + return new ResultData(ErrorCode.SYS_SERVER_ERROR.getCode(),"ocr模板不存在"); + } + File file = multipartFileToFile(multiReq); + + String result = FormallTess4j.testDoOCR_File(ocrData, file, model.getFontName()); + return new ResultData(result); + + } catch (Exception e) { + logger.error("testTrain error.",e); + return new ResultData(ErrorCode.PICTURE_ANALYZING_ERROR.getCode(),"解析失败。"+e.getMessage()); + } + } + + + private File multipartFileToFile(MultipartFile file) { + File toFile = null; + if (file.equals("") || file.getSize() <= 0) { + file = null; + } else { + InputStream ins = null; + try { + ins = file.getInputStream(); + toFile = new File(file.getOriginalFilename()); + inputStreamToFile(ins, toFile); + ins.close(); + } catch (IOException e) { + logger.error("multipartFileToFile error.",e); + }finally { + if (null != ins) { + try { + ins.close(); + } catch (IOException e) { + logger.error("multipartFileToFile error.",e); + } + } + } + } + return toFile; + } + + private void inputStreamToFile(InputStream ins, File file) { + OutputStream os = null; + try { + os = new FileOutputStream(file); + int bytesRead = 0; + byte[] buffer = new byte[8192]; + while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) { + os.write(buffer, 0, bytesRead); + } + os.close(); + ins.close(); + } catch (Exception e) { + logger.error("inputStreamToFile error.",e); + }finally { + if (null != os) { + try { + os.close(); + } catch (IOException e) { + logger.error("inputStreamToFile error.",e); + } + } + if (null != ins) { + try { + ins.close(); + } catch (IOException e) { + logger.error("inputStreamToFile error.",e); + } + } + } + } + + + +} diff --git a/mallinkSysAdmin/src/main/resources/application-dev.yml b/mallinkSysAdmin/src/main/resources/application-dev.yml index b86a317f0..41f9ff620 100644 --- a/mallinkSysAdmin/src/main/resources/application-dev.yml +++ b/mallinkSysAdmin/src/main/resources/application-dev.yml @@ -165,6 +165,7 @@ fm: deploy: 1 open: true upload_dir: /home/test/server/uploads/ + ocr_data: /home/test/server/ocr_data/ ueditor: config: config.json diff --git a/mallinkSysAdmin/src/main/resources/application-prod.yml b/mallinkSysAdmin/src/main/resources/application-prod.yml index 9edbe54a1..3cf2ecd0b 100644 --- a/mallinkSysAdmin/src/main/resources/application-prod.yml +++ b/mallinkSysAdmin/src/main/resources/application-prod.yml @@ -122,12 +122,14 @@ fm: deploy: 3 open: true upload_dir: /root/uploads/ + ocr_data: /root/ocr_data/ ueditor: config: config.json unified: true upload-path: ./upload/ url-prefix: "" + logging: level: diff --git a/mallinkSysAdmin/src/main/resources/application-test.yml-bak b/mallinkSysAdmin/src/main/resources/application-test.yml-bak index d560852c6..2bbf9ef4d 100644 --- a/mallinkSysAdmin/src/main/resources/application-test.yml-bak +++ b/mallinkSysAdmin/src/main/resources/application-test.yml-bak @@ -100,6 +100,7 @@ fm: deploy: 2 open: true upload_dir: /home/ec2-user/server/uploads/ + ocr_data: /home/ec2-user/server/ocr_data/ ueditor: config: config.json