基于 SpringBoot实现 Word 和 PDF 识别
基于 SpringBoot 实现 Word 和 PDF 识别
近期遇到了一个需求,要求识别 word 和 pdf 中的文字,之后对文字进行处理。感觉听好玩儿的,给大家分享一下。话不多说,直接上干货!
识别 Word
1、导包
office 的操作毋庸置疑是需要poi依赖的。注意版本号!不一致会报错!
<!-- 这个依赖会自动下载 poi依赖,可以操作doc后缀 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>4.1.2</version>
</dependency>
<!-- 这个依赖用于操作 docx 后缀 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</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、导包
<!-- PDF 识别 -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.12</version>
</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;
}