zouyu
2025-06-05 4960c8975807c39be4b6ee97aac20e95b789df9a
init commit
已添加16个文件
913 ■■■■■ 文件已修改
.gitignore 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/chinaztt/mes/docx/DataAcquisitionApplication.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/chinaztt/mes/docx/constant/CommonConstants.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/chinaztt/mes/docx/constant/TomcatConfig.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/chinaztt/mes/docx/controller/DocxController.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/chinaztt/mes/docx/dto/GetFileDto.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/chinaztt/mes/docx/handler/GlobalExceptionHandler.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/chinaztt/mes/docx/service/DocxService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/chinaztt/mes/docx/service/impl/DocxServiceImpl.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/chinaztt/mes/docx/util/CharsetChangeUtil.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/chinaztt/mes/docx/util/R.java 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/chinaztt/mes/docx/util/TakeWords.java 258 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/logback-spring.xml 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/chinaztt/mes/docx/DataAcquisitionApplicationTests.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
logs
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
pom.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,129 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.chinaztt.mes.data-acquisition</groupId>
    <artifactId>data-acquisition</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>data-acquisition</name>
    <description>data-acquisition</description>
    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.3</spring-boot.version>
    </properties>
    <dependencies>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.tess4j</groupId>
            <artifactId>tess4j</artifactId>
            <version>5.12.0</version>
        </dependency>
        <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
            <version>3.34.0</version> <!-- Use the latest version -->
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>net.sf.ucanaccess</groupId>
            <artifactId>ucanaccess</artifactId>
            <version>5.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-scratchpad -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.16</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <finalName>${project.name}</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.chinaztt.mes.docx.DataAcquisitionApplication</mainClass>
                    <skip>false</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
src/main/java/com/chinaztt/mes/docx/DataAcquisitionApplication.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.chinaztt.mes.docx;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DataAcquisitionApplication {
    public static void main(String[] args) {
        SpringApplication.run(DataAcquisitionApplication.class, args);
    }
}
src/main/java/com/chinaztt/mes/docx/constant/CommonConstants.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
package com.chinaztt.mes.docx.constant;
public interface CommonConstants {
    Integer SUCCESS = 0;
    Integer FAIL = 1;
}
src/main/java/com/chinaztt/mes/docx/constant/TomcatConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.chinaztt.mes.docx.constant;
import org.apache.catalina.connector.Connector;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class TomcatConfig {
    @Bean
    public TomcatServletWebServerFactory webServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addConnectorCustomizers((Connector connector) -> {
            connector.setProperty("relaxedPathChars", "\"<>[\\]^`{|}.");
            connector.setProperty("relaxedQueryChars", "\"<>[\\]^`{|}.");
        });
        return factory;
    }
}
src/main/java/com/chinaztt/mes/docx/controller/DocxController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.chinaztt.mes.docx.controller;
import com.chinaztt.mes.docx.dto.GetFileDto;
import com.chinaztt.mes.docx.service.DocxService;
import com.chinaztt.mes.docx.util.R;
import net.sourceforge.tess4j.TesseractException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.sql.SQLException;
@RestController
@RequestMapping("/lims")
public class DocxController {
    @Autowired
    private DocxService docxService;
    @GetMapping("/getFile")
    public R<?> getFile(GetFileDto getFileDto) throws IOException, SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException, TesseractException {
        return docxService.getFile(getFileDto);
    }
    @GetMapping("/moveFile")
    public R<?> moveFile(String startFilePath, String endFilePath, String fileType) {
        return docxService.moveFile(startFilePath, endFilePath, fileType);
    }
}
src/main/java/com/chinaztt/mes/docx/dto/GetFileDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.chinaztt.mes.docx.dto;
import lombok.Data;
@Data
public class GetFileDto {
    // é‡‡é›†è·¯å¾„
    private String filePath;
    // æ–‡ä»¶åŽç¼€
    private String fileExtension;
    // å§”托单号
    private String entrustCode;
    // æ ·å“ç¼–号
    private String sampleCode;
    // å§”托编号字段
    private String mdbEntrustCode;
    // æ ·å“ç¼–号字段
    private String mdbSampleCode;
    // db文件名称
    private String dbFileName;
    // å…‰çº¤å¸¦å­—段
    private String fiberOpticRibbonCode;
    // å…‰çº¤å¸¦æ•°æ®
    private String fiberOpticRibbon;
}
src/main/java/com/chinaztt/mes/docx/handler/GlobalExceptionHandler.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.chinaztt.mes.docx.handler;
import com.chinaztt.mes.docx.util.R;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler({Exception.class})
    public R<?> exception(Exception e) {
        return R.failed(e.getMessage());
    }
}
src/main/java/com/chinaztt/mes/docx/service/DocxService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.chinaztt.mes.docx.service;
import com.chinaztt.mes.docx.dto.GetFileDto;
import com.chinaztt.mes.docx.util.R;
import net.sourceforge.tess4j.TesseractException;
import java.io.IOException;
import java.sql.SQLException;
public interface DocxService {
    R<?> getFile(GetFileDto getFileDto) throws IOException, SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException, TesseractException;
    R<?> moveFile(String startFilePath, String endFilePath, String fileType);
}
src/main/java/com/chinaztt/mes/docx/service/impl/DocxServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,120 @@
package com.chinaztt.mes.docx.service.impl;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ObjectUtil;
import com.chinaztt.mes.docx.dto.GetFileDto;
import com.chinaztt.mes.docx.service.DocxService;
import com.chinaztt.mes.docx.util.R;
import com.chinaztt.mes.docx.util.TakeWords;
import net.sourceforge.tess4j.TesseractException;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;
import java.io.*;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@Service
public class DocxServiceImpl implements DocxService {
    @Override
    public R<?> getFile(GetFileDto getFileDto) throws IOException, SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException, TesseractException {
        File file = getFileStart(getFileDto.getFilePath(), getFileDto.getFileExtension());
        if (!file.exists()) {
            return R.failed("未查询到该路径:" + getFileDto.getFilePath() + "下存在:" + getFileDto.getFileExtension() + "结尾的文件!");
        }
        switch (getFileDto.getFileExtension()) {
            case ".docx":
                return R.ok(TakeWords.readWordFile(file));
            case ".xlsx":
                try {
                    return R.ok(TakeWords.readExcelFile(file));
                } catch (FileNotFoundException e) {
                    return R.failed("另一个程序正在使用此文件,无法进行数据采集。");
                }
            case ".txt":
                return R.ok(TakeWords.readTxtFile(file));
            case ".csv":
                return R.ok(TakeWords.readCsvFile(file));
            case ".mdb":
                if (ObjectUtil.isEmpty(getFileDto.getDbFileName()) || Objects.equals(getFileDto.getDbFileName(), "null")) {
                    return R.failed("未配置.mdb采集文件名称!");
                }
                return R.ok(TakeWords.readMdbFile(file, getFileDto));
            case ".db":
                if (ObjectUtil.isEmpty(getFileDto.getDbFileName()) || Objects.equals(getFileDto.getDbFileName(), "null")) {
                    return R.failed("未配置.db采集文件名称!");
                }
                return R.ok(TakeWords.readDbFile(file, getFileDto));
            case ".png":
                return R.ok(TakeWords.readPngFile(file));
            default:
                return R.failed("后缀名配置错误!");
        }
    }
    @Override
    public R<?> moveFile(String startFilePath, String endFilePath, String fileType) {
        // æºæ–‡ä»¶è·¯å¾„
        File startFile= getFileStart(startFilePath, fileType);
        // ç›®çš„目录路径
        File endDirection=new File(endFilePath);
        // å¦‚果目的目录路径不存在,则进行创建
        if(!endDirection.exists()) {
            endDirection.mkdirs();
        }
        // ç›®çš„æ–‡ä»¶è·¯å¾„=目的目录路径+源文件名称
        File endFile=new File(endDirection+ File.separator+ startFile.getName());
        try {
        // è°ƒç”¨File类的核心方法renameTo
            if (startFile.renameTo(endFile)) {
                return R.ok("文件移动成功!");
            } else {
                return R.failed("文件移动失败!");
            }
        }catch(Exception e) {
            return R.failed("文件移动出现异常!");
        }
    }
    public static File getLatestFile(List<File> files) {
        File latestFile = null;
        long latestTime = 0;
        for (File file : files) {
            long lastModified = file.lastModified();
            if (lastModified > latestTime) {
                latestTime = lastModified;
                latestFile = file;
            }
        }
        return latestFile;
    }
    public static File getFileStart(String filePath, String fileExtension) {
        List<File> files = FileUtil.loopFiles(filePath);
        List<File> list = new ArrayList<>();
        files.forEach(i -> {
            boolean b;
            switch (fileExtension) {
                case ".docx":
                    b = i.getName().endsWith(".docx") || i.getName().endsWith(".doc");
                    break;
                case ".xlsx":
                    b = i.getName().endsWith(".xlsx") || i.getName().endsWith(".xls");
                    break;
                default:
                    b = i.getName().endsWith(fileExtension);
                    break;
            }
            if (b) {
                list.add(i);
            }
        });
        return getLatestFile(list);
    }
}
src/main/java/com/chinaztt/mes/docx/util/CharsetChangeUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.chinaztt.mes.docx.util;
import java.io.UnsupportedEncodingException;
import java.util.Objects;
/**
 * å­—符串编码转换工具类
 */
public class CharsetChangeUtil {
    private static final String UTF8 = "UTF-8";
    private static final String GB2312 = "GB2312";
}
src/main/java/com/chinaztt/mes/docx/util/R.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,132 @@
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package com.chinaztt.mes.docx.util;
import com.chinaztt.mes.docx.constant.CommonConstants;
import java.io.Serializable;
public class R<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    // "返回标记:成功标记=0,失败标记=1"
    private int code;
    // "返回信息"
    private String msg;
    // "数据"
    private T data;
    public static <T> R<T> ok() {
        return restResult(null, CommonConstants.SUCCESS, (String) null);
    }
    public static <T> R<T> ok(T data) {
        return restResult(data, CommonConstants.SUCCESS, (String) null);
    }
    public static <T> R<T> ok(T data, String msg) {
        return restResult(data, CommonConstants.SUCCESS, msg);
    }
    public static <T> R<T> failed() {
        return restResult(null, CommonConstants.FAIL, (String) null);
    }
    public static <T> R<T> failed(String msg) {
        return restResult(null, CommonConstants.FAIL, msg);
    }
    public static <T> R<T> failed(T data) {
        return restResult(data, CommonConstants.FAIL, (String) null);
    }
    public static <T> R<T> failed(T data, String msg) {
        return restResult(data, CommonConstants.FAIL, msg);
    }
    private static <T> R<T> restResult(T data, int code, String msg) {
        R<T> apiResult = new R();
        apiResult.setCode(code);
        apiResult.setData(data);
        apiResult.setMsg(msg);
        return apiResult;
    }
    public static <T> RBuilder<T> builder() {
        return new RBuilder();
    }
    public String toString() {
        return "R(code=" + this.getCode() + ", msg=" + this.getMsg() + ", data=" + this.getData() + ")";
    }
    public R() {
    }
    public R(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
    public int getCode() {
        return this.code;
    }
    public R<T> setCode(int code) {
        this.code = code;
        return this;
    }
    public String getMsg() {
        return this.msg;
    }
    public R<T> setMsg(String msg) {
        this.msg = msg;
        return this;
    }
    public T getData() {
        return this.data;
    }
    public R<T> setData(T data) {
        this.data = data;
        return this;
    }
    public static class RBuilder<T> {
        private int code;
        private String msg;
        private T data;
        RBuilder() {
        }
        public RBuilder<T> code(int code) {
            this.code = code;
            return this;
        }
        public RBuilder<T> msg(String msg) {
            this.msg = msg;
            return this;
        }
        public RBuilder<T> data(T data) {
            this.data = data;
            return this;
        }
        public R<T> build() {
            return new R(this.code, this.msg, this.data);
        }
        public String toString() {
            return "R.RBuilder(code=" + this.code + ", msg=" + this.msg + ", data=" + this.data + ")";
        }
    }
}
src/main/java/com/chinaztt/mes/docx/util/TakeWords.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,258 @@
package com.chinaztt.mes.docx.util;
import cn.hutool.core.io.FileUtil;
import com.chinaztt.mes.docx.dto.GetFileDto;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.POIXMLDocument;
import org.apache.poi.POIXMLTextExtractor;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import java.io.*;
import java.nio.file.Files;
import java.sql.*;
import java.util.*;
public class TakeWords {
    private static final String splitIdentifier = "@-@"; // è‡ªå®šä¹‰å”¯ä¸€æ ‡è¯†ç¬¦
    public static Object readWordFile(File file) {
        String result = "";
        //首先判断文件中的是doc/docx
        try {
            if (file.getName().endsWith(".doc")) {
                InputStream is = new FileInputStream(file);
                WordExtractor re = new WordExtractor(is);
                result = re.getText();
                re.close();
            } else if (file.getName().endsWith(".docx")) {
                OPCPackage opcPackage = POIXMLDocument.openPackage(file.getPath());
                POIXMLTextExtractor extractor = new XWPFWordExtractor(opcPackage);
                result = extractor.getText();
                extractor.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    public static Object readExcelFile(File file) throws FileNotFoundException, IOException {
        StringBuilder result = new StringBuilder();
        //创建工作簿对象
        XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream(file));
        //获取工作簿下sheet的个数 åªè¯»å–第一个sheet
//            int sheetNum = xssfWorkbook.getNumberOfSheets();
        //遍历工作簿中的所有数据
        for (int i = 0; i < 1; i++) {
            XSSFSheet sheet = xssfWorkbook.getSheetAt(i);
            //获取最后一行的num,即总行数。此处从0开始
            int maxRow = sheet.getLastRowNum();
            for (int row = 0; row <= maxRow; row++) {
                //获取最后单元格num,即总单元格数 ***注意:此处从1开始计数***
                int maxRol = sheet.getRow(row).getLastCellNum();
                StringBuilder aLine = new StringBuilder();
                for (int rol = 0; rol < maxRol; rol++) {
                    aLine.append(sheet.getRow(row).getCell(rol)).append(splitIdentifier);
                }
                result.append(aLine).append("\n");
            }
        }
        return result.toString();
    }
    public static Object readTxtFile(File file) throws IOException {
        FileInputStream fin = new FileInputStream(file);
        InputStreamReader reader = new InputStreamReader(fin);
        BufferedReader buffReader = new BufferedReader(reader);
        StringBuilder stringBuilder = new StringBuilder();
        String strTmp = "";
        while ((strTmp = buffReader.readLine()) != null) {
            stringBuilder.append(strTmp).append("\n");
        }
        buffReader.close();
        return stringBuilder.toString();
    }
    public static Object readCsvFile(File file) {
        StringBuilder stringBuilder = new StringBuilder();
        // åˆ›å»º reader
        try (BufferedReader br = Files.newBufferedReader(file.toPath())) {
            // CSV文件的分隔符
            String DELIMITER = ",";
            // æŒ‰è¡Œè¯»å–
            String line;
            while ((line = br.readLine()) != null) {
                // åˆ†å‰²
                String[] columns = line.split(DELIMITER);
                // æ‰“印行
                stringBuilder.append(String.join(splitIdentifier, columns)).append("\n");
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return stringBuilder.toString();
    }
    public static Object readMdbFile(File file, GetFileDto getFileDto) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        Map<String, Object> tableMap = new HashMap<>(16);
        Properties prop = new Properties();
        //设置编码
        prop.put("charSet", "UTF-8");
        prop.put("user", "");
        prop.put("password", "");
        //数据地址
        String dbUrl = "jdbc:ucanaccess://" + file.getPath();
        //引入驱动
        Class.forName("net.ucanaccess.jdbc.UcanaccessDriver").newInstance();
        Connection conn = null;
        PreparedStatement preparedStatement = null;
        ResultSet rs = null;
        //连接数据库资源
        conn = DriverManager.getConnection(dbUrl, prop);
        try {
            List<Object> list = new ArrayList<>();
            //遍历获取多张表数据
//            String s = "select * from " + getFileDto.getDbFileName() + " where 1=1" + getFileDto.getMdbEntrustCode() + " = '" + getFileDto.getEntrustCode() +
//                    "' and " + getFileDto.getMdbSampleCode() + " = '" + getFileDto.getSampleCode() + "'";
            String s = "select * from " + getFileDto.getDbFileName() + " where 1=1";
            if(StringUtils.isNotBlank(getFileDto.getMdbEntrustCode())){
                s+=" and " + getFileDto.getMdbEntrustCode() + " = '" + getFileDto.getEntrustCode()+ "'";
            }
            if(StringUtils.isNotBlank(getFileDto.getMdbSampleCode())){
                s+=" and " + getFileDto.getMdbSampleCode() + " = '" + getFileDto.getSampleCode() + "'";
            }
            preparedStatement = conn.prepareStatement(s);
            rs = preparedStatement.executeQuery();
            ResultSetMetaData data = rs.getMetaData();
            while (rs.next()) {
                Map<String, String> map = new HashMap<>();
                for (int i = 1; i <= data.getColumnCount(); i++) {
                    //列名
                    String columnName = data.getColumnName(i);
                    map.put(columnName, rs.getString(i));
                }
                list.add(map);
            }
            tableMap.put("data", list);
        } catch (Exception e) {
        } finally {
            closeA1l(conn, preparedStatement, rs);
        }
        return tableMap;
    }
    private static void closeA1l(Connection conn, PreparedStatement preparedStatement, ResultSet rs) {
        try {
            if (null != rs) {
                rs.close();
            }
            if (null != preparedStatement) {
                preparedStatement.close();
            }
            if (null != conn) {
                conn.close();
            }
        } catch (Exception ignore) {
        }
    }
    public static Object readDbFile(File file, GetFileDto getFileDto) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        Map<String, Object> tableMap = new HashMap<>(16);
        Properties prop = new Properties();
        //设置编码
        prop.put("charSet", "GBK");
        prop.put("user", "");
        prop.put("password", "");
        //数据地址
        String dbUrl = "jdbc:sqlite:" + file.getPath();
        //引入驱动
        Class.forName("org.sqlite.JDBC").newInstance();
        Connection conn = null;
        PreparedStatement preparedStatement = null;
        ResultSet rs = null;
        //连接数据库资源
        conn = DriverManager.getConnection(dbUrl, prop);
        try {
            List<Object> list = new ArrayList<>();
            //转义中文
            String sampleCode = changeCharset(getFileDto.getSampleCode(), "GBK");
            String sql = "select * from " + getFileDto.getDbFileName() +
                    " where " + getFileDto.getMdbEntrustCode() + " = '" + getFileDto.getEntrustCode() +
                    "' and " + getFileDto.getMdbSampleCode() + " = '" + sampleCode + "'";
            if (ObjectUtils.allNotNull(getFileDto.getFiberOpticRibbonCode(), getFileDto.getFiberOpticRibbon()) && !getFileDto.getFiberOpticRibbonCode().equals("null")) {
                sql = sql + " and " + getFileDto.getFiberOpticRibbonCode() + " = '" + getFileDto.getFiberOpticRibbon() + "'";
            }
            //遍历获取多张表数据
            preparedStatement = conn.prepareStatement(sql);
            rs = preparedStatement.executeQuery();
            ResultSetMetaData data = rs.getMetaData();
            while (rs.next()) {
                Map<String, String> map = new HashMap<>();
                for (int i = 1; i <= data.getColumnCount(); i++) {
                    //列名
                    String columnName = data.getColumnName(i);
                    //将返回的结果转换从utf-8编码
                    map.put(columnName, changeCharset(rs.getString(i),"UTF-8"));
                }
                list.add(map);
            }
            tableMap.put("data", list);
        } catch (Exception e) {
        } finally {
            closeA1l(conn, preparedStatement, rs);
        }
        return tableMap;
    }
    public static Object readPngFile(File file) throws IOException, TesseractException {
        String canonicalPath32 = FileUtil.file(".", "/jre_32/tessdata").getCanonicalPath();
        String canonicalPath64 = FileUtil.file(".", "/jre_64/tessdata").getCanonicalPath();
        String path;
        // åˆ¤æ–­ç”µè„‘是32位还是64位
        String arch = System.getProperty("sun.arch.data.model");
        if (arch.contains("32")) {
            path = canonicalPath32.replaceAll("/chi_sim.traineddata", "").replaceAll("\\\\", "/");
        } else {
            path = canonicalPath64.replaceAll("/chi_sim.traineddata", "").replaceAll("\\\\", "/");
        }
        //设置配置文件夹微视、识别语言、识别模式
        Tesseract tesseract = new Tesseract();
        tesseract.setDatapath(path);
        //设置识别语言为中文简体,(如果要设置为英文可改为"eng")
        tesseract.setLanguage("chi_sim");
        //使用 OSD è¿›è¡Œè‡ªåŠ¨é¡µé¢åˆ†å‰²ä»¥è¿›è¡Œå›¾åƒå¤„ç†
        tesseract.setPageSegMode(1);
        //设置引擎模式是神经网络LSTM引擎
        tesseract.setOcrEngineMode(1);
        //开始识别整张图片中的文字
        return tesseract.doOCR(file);
    }
    /**
     * å­—符串编码转换
     *
     * @param str è¦è½¬æ¢çš„字符串
     * @param unicode å­—符编码
     * @return
     */
    public static String changeCharset(String str, String unicode) {
        if(Objects.isNull(str)){
            return "";
        }
        try {
            return new String(str.getBytes(), unicode);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }
}
src/main/resources/application.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2 @@
server:
  port: 9527
src/main/resources/logback-spring.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
    å°æŠ€å·§: åœ¨æ ¹pom里面设置统一存放路径,统一管理方便维护
    <properties>
        <log-path>/Users/ztt</log-path>
    </properties>
    1. å…¶ä»–模块加日志输出,直接copy本文件放在resources ç›®å½•即可
    2. æ³¨æ„ä¿®æ”¹ <property name="${log-path}/log.path" value=""/> çš„value模块
-->
<configuration debug="false" scan="false">
    <property name="log.path" value="logs/${project.artifactId}"/>
    <!-- å½©è‰²æ—¥å¿—格式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <!-- å½©è‰²æ—¥å¿—依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    <!-- Console log output -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    <!-- Log file debug output -->
    <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/debug.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM, aux}/debug.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>50MB</maxFileSize>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- Log file error output -->
    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/%d{yyyy-MM}/error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <maxFileSize>50MB</maxFileSize>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%date [%thread] %-5level [%logger{50}] %file:%line - %msg%n</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
    </appender>
    <logger name="org.activiti.engine.impl.db" level="DEBUG">
        <appender-ref ref="debug"/>
    </logger>
    <!--nacos å¿ƒè·³ INFO å±è”½-->
    <logger name="com.alibaba.nacos" level="OFF">
        <appender-ref ref="error"/>
    </logger>
    <logger name="com.chinaztt.mes.common.aop" level="ERROR">
        <appender-ref ref="error"/>
    </logger>
    <!-- Level: FATAL 0  ERROR 3  WARN 4  INFO 6  DEBUG 7 -->
    <root level="INFO">
        <appender-ref ref="console"/>
        <appender-ref ref="debug"/>
    </root>
</configuration>
src/test/java/com/chinaztt/mes/docx/DataAcquisitionApplicationTests.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.chinaztt.mes.docx;
import org.apache.commons.lang3.ObjectUtils;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
@SpringBootTest
class DataAcquisitionApplicationTests {
    @Test
    void  contextLoads() {
        if (ObjectUtils.allNotNull("null")) {
            System.out.println("成功");
        } else {
            System.out.println("失败");
        }
    }
}