diff --git a/mallinkOcr/pom.xml b/mallinkOcr/pom.xml
index b43f32111..110fefed4 100644
--- a/mallinkOcr/pom.xml
+++ b/mallinkOcr/pom.xml
@@ -15,17 +15,25 @@
net.java.dev.jna
jna
- 4.1.0
+ 5.3.1
net.sourceforge.tess4j
tess4j
- 3.4.0
+ 4.4.0
- com.sun.jna
- jna
-
+ commons-io
+ commons-io
+
+
+ commons-logging
+ commons-logging
+
+
+ jna
+ net.java.dev.jna
+
diff --git a/mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4j.java b/mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4j.java
index 68ee0cd27..522ca71f2 100644
--- a/mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4j.java
+++ b/mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4j.java
@@ -138,7 +138,7 @@ public class FormallTess4j {
logger.info("doOCR on a jpg image");
//set language
instance.setDatapath(testResourcesLanguagePath);
- instance.setLanguage("chi_sim");
+ instance.setLanguage("test1");
String result = instance.doOCR(imageFile);
return result;
}
diff --git a/mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4jTrain.java b/mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4jTrain.java
new file mode 100644
index 000000000..953cef31d
--- /dev/null
+++ b/mallinkOcr/src/main/java/com/iformall/ocr/FormallTess4jTrain.java
@@ -0,0 +1,222 @@
+package com.iformall.ocr;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
+
+/**
+ * 训练
+ * @author iformall
+ */
+public class FormallTess4jTrain {
+
+ private static final String newFileFolder = "C:\\Users\\iformall\\Desktop\\newfile";
+
+ /**
+ * 第一步,用jTessBoxEditor --> Tools --> Merge 多选图片,保存为tif格式
+ * 命名: [lang].[fontname].exp[num].tif lang是语言 fontname是字体
+ */
+
+ /**
+ * 第二部,用tif生成box
+ * @param args
+ */
+ public static void 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);
+ //String result = executeLocalCmd(cmdstr, null);
+
+ //System.out.println("Done createBoxFile"+result);
+ }
+ }
+
+ /**
+ * 第三步,用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) {
+ String prefix = getprefix(lang,fontName);
+ String realFileName = prefix+".tif";
+
+ String trainCmdstr = "tesseract "+realFileName+" "+prefix+" nobatch box.train";
+ System.out.println(trainCmdstr);
+ //executeLocalCmd(trainCmdstr, null);
+
+ 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 !");
+ }
+
+ /**
+ * 第六步,执行完成后生成以下几个文件加前缀
+ * unicharset、inttemp、pffmtable、shapetable、normproto 添加这几个文件的前缀为fontName
+ * @param lang
+ * @param fontName
+ * @return
+ */
+ public static void renameTrainFiles(String fontName) {
+ String renCmdstr = "REN unicharset "+fontName+".unicharset";
+ System.out.println(renCmdstr);
+ //executeLocalCmd(renCmdstr, null);
+
+ renCmdstr = "REN inttemp "+fontName+".inttemp";
+ System.out.println(renCmdstr);
+ //executeLocalCmd(renCmdstr, null);
+
+ renCmdstr = "REN pffmtable "+fontName+".pffmtable";
+ System.out.println(renCmdstr);
+ //executeLocalCmd(renCmdstr, null);
+
+ renCmdstr = "REN shapetable "+fontName+".shapetable";
+ System.out.println(renCmdstr);
+ //executeLocalCmd(renCmdstr, null);
+
+ renCmdstr = "REN normproto "+fontName+".normproto";
+ System.out.println(renCmdstr);
+ //executeLocalCmd(renCmdstr, null);
+
+ //System.out.println("DONE renameTrainFiles !");
+ }
+
+ /**
+ * 第七步:合并5个文件
+ * @param lang
+ * @param fontName
+ * @return
+ */
+ public static void 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;
+ }
+
+ 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");
+ }
+
+
+
+}
diff --git a/mallinkOcr/src/main/resources/Read.txt b/mallinkOcr/src/main/resources/Read.txt
index f10a0bd35..9a470fa25 100644
--- a/mallinkOcr/src/main/resources/Read.txt
+++ b/mallinkOcr/src/main/resources/Read.txt
@@ -1,3 +1,14 @@
https://www.cnblogs.com/wj-1314/p/9454656.html
-https://www.cnblogs.com/pejsidney/p/9487881.html
\ No newline at end of file
+https://www.cnblogs.com/pejsidney/p/9487881.html
+
+
+https://digi.bib.uni-mannheim.de/tesseract/
+
+https://blog.csdn.net/qq_40147863/article/details/82290015
+
+https://blog.csdn.net/boonya/article/details/81325997
+
+
+合并字库 https://www.cnblogs.com/c2soft/articles/10415236.html
+完整教程 https://www.cnblogs.com/wpcnblog/p/12850590.html
diff --git a/mallinkOcr/src/main/resources/tessdata/test1.traineddata b/mallinkOcr/src/main/resources/tessdata/test1.traineddata
new file mode 100644
index 000000000..a07542f43
Binary files /dev/null and b/mallinkOcr/src/main/resources/tessdata/test1.traineddata differ