【技术】基于 SpringBoot实现 Word 和 PDF 识别

基于 SpringBoot实现 Word 和 PDF 识别

  • 基于 SpringBoot 实现 Word 和 PDF 识别
    • 识别 Word
    • 识别 PDF

基于 SpringBoot 实现 Word 和 PDF 识别

近期遇到了一个需求,要求识别 word 和 pdf 中的文字,之后对文字进行处理。感觉听好玩儿的,给大家分享一下。话不多说,直接上干货!

识别 Word

1、导包

office 的操作毋庸置疑是需要poi依赖的。注意版本号!不一致会报错!


<dependency>
	<groupId>org.apache.poigroupId>
	<artifactId>poi-scratchpadartifactId>
	<version>4.1.2version>
dependency>

<dependency>
	<groupId>org.apache.poigroupId>
	<artifactId>poi-ooxmlartifactId>
dependency>

2、工具类

工具类可以识别 word 返回内容。

import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Word 操作工具类
 */
public class WordUtil {
    // 定义静态的文件后缀
    public static final String SUFFIX_DOC = ".doc";
    public static final String SUFFIX_DOCX = ".docx";

	/**
     * 读取 Word 入口方法,根据后缀,调用方法
     * @param suffix 文件后缀
     * @param inputStream 文件输入流
     * @return
     */
    private static String readWord(String suffix, InputStream inputStream) {
        // docx 类型
        if (SUFFIX_DOCX.equals(suffix)) {
            return readDocx(inputStream);
        // doc 类型
        } else if (SUFFIX_DOC.equals(suffix)) {
            return readDoc(inputStream);
        } else {
            return null;
        }
    }

    /**
     * 读取 doc 类型,使用 WordExtractor 对象,传递输入流
     *
     * @param inputStream
     * @return
     */
    private static String readDoc(InputStream inputStream) {
        try {
            String content = "";
            WordExtractor ex = new WordExtractor(inputStream);
            content = ex.getText();
            ex.close();
            return content;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 读取 docx 类型,使用 XWPFDocument 对象,传递输入流
     *
     * @param inputStream
     * @return
     */
    private static String readDocx(InputStream inputStream) {
        try {
            String content = "";
            XWPFDocument xdoc = new XWPFDocument(inputStream);
            XWPFWordExtractor extractor = new XWPFWordExtractor(xdoc);
            content = extractor.getText();
            extractor.close();

            return content;
        } catch (Exception e) {
            return null;
        }
    }
}

3、控制层代码

控制层以 JSON 的形式返回识别到的内容。既然能拿到内容,后续的操作就方便了。根据具体需求,具体开发。

@Post("/readword")
@ResponseBody
public String readWord(MultipartFile file) throws IOException{
	// 获取文件名,目的是根据文件名字获取文件后缀
	String originalFilename = file.getOriginalFilename();
	// 获取后缀下标
	int i = originalFilename.lastIndexOf(".");
	// 截取文件后缀
	String suffix = originalFilename.subString(i);
	
	// 调用工具类
	String result = WordUtil.readWord(suffix, file.getInputStream());
	// 返回结果
	return result;
}

识别 PDF

1、导包


<dependency>
    <groupId>org.apache.pdfboxgroupId>
    <artifactId>pdfboxartifactId>
    <version>2.0.12version>
dependency>

2、工具类

工具类可以识别 word 返回内容。

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
import org.apache.pdfbox.text.PDFTextStripper;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class PdfUtil {
    // 定义静态后缀
    public static final String SUFFIX_PDF = ".pdf";

    /**
     * PDF 转 文字,传递文件输入流
     * @param inputStream
     * @return
     */
    public static String readPdf(InputStream inputStream) {
        PDDocument document = null;
        String content = "";
        try {
            document = PDDocument.load(inputStream);
            int pageSize = document.getNumberOfPages();
            // 一页一页读取
            for (int i = 0; i < pageSize; i++) {
                // 文本内容
                PDFTextStripper stripper = new PDFTextStripper();
                // 设置按顺序输出
                stripper.setSortByPosition(true);
                stripper.setStartPage(i + 1);
                stripper.setEndPage(i + 1);
                String text = stripper.getText(document);
                content += text.trim() + "\n";
            }
            return content;
        } catch (InvalidPasswordException e) {
        } catch (IOException e) {
        } finally {
            try {
                if (document != null) {
                    document.close();
                }
            } catch (IOException e) {
            }
        }
        return null;
    }
}

3、控制层代码

控制层以 JSON 的形式返回识别到的内容。既然能拿到内容,后续的操作就方便了。根据具体需求,具体开发。

@Post("/readPdf")
@ResponseBody
public String readWord(MultipartFile file) throws IOException{
	// 获取文件名,目的是根据文件名字获取文件后缀
	String originalFilename = file.getOriginalFilename();
	// 获取后缀下标
	int i = originalFilename.lastIndexOf(".");
	// 截取文件后缀
	String suffix = originalFilename.subString(i);
	
	// 调用工具类
	String result = PdfUtil .readPdf(suffix, file.getInputStream());
	// 返回结果
	return result;
}

你可能感兴趣的:(Web,Spring,Boot,Spring,spring,boot,word,pdf,poi,识别)