本文目录导读:

我来详细介绍Java中文字提取的几种常见实现方案,包含完整示例代码。
从PDF中提取文字
使用Apache PDFBox
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import java.io.File;
import java.io.IOException;
public class PDFTextExtractor {
public static String extractTextFromPDF(String filePath) {
StringBuilder text = new StringBuilder();
try (PDDocument document = PDDocument.load(new File(filePath))) {
PDFTextStripper stripper = new PDFTextStripper();
text.append(stripper.getText(document));
} catch (IOException e) {
e.printStackTrace();
}
return text.toString();
}
// 按页提取
public static void extractTextByPage(String filePath) throws IOException {
try (PDDocument document = PDDocument.load(new File(filePath))) {
PDFTextStripper stripper = new PDFTextStripper();
for (int i = 1; i <= document.getNumberOfPages(); i++) {
stripper.setStartPage(i);
stripper.setEndPage(i);
String pageText = stripper.getText(document);
System.out.println("第" + i + "页内容:");
System.out.println(pageText);
}
}
}
public static void main(String[] args) {
String text = extractTextFromPDF("example.pdf");
System.out.println(text);
}
}
Maven依赖
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.27</version>
</dependency>
从Word文档中提取文字
使用Apache POI
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import java.io.FileInputStream;
import java.io.IOException;
public class WordTextExtractor {
public static String extractFromDocx(String filePath) {
try (FileInputStream fis = new FileInputStream(filePath);
XWPFDocument document = new XWPFDocument(fis)) {
XWPFWordExtractor extractor = new XWPFWordExtractor(document);
return extractor.getText();
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
public static String extractFromDoc(String filePath) {
try (FileInputStream fis = new FileInputStream(filePath);
WordExtractor extractor = new WordExtractor(fis)) {
return extractor.getText();
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
public static void main(String[] args) {
// 处理.docx文件
String docxText = extractFromDocx("example.docx");
System.out.println("DOCX内容:\n" + docxText);
// 处理.doc文件
String docText = extractFromDoc("example.doc");
System.out.println("DOC内容:\n" + docText);
}
}
Maven依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
从图片中提取文字(OCR)
使用Tesseract OCR
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import java.io.File;
public class ImageTextExtractor {
public static String extractTextFromImage(String imagePath) {
Tesseract tesseract = new Tesseract();
try {
// 设置语言包路径(需要下载中文语言包)
tesseract.setDatapath("C:/Program Files/Tesseract-OCR/tessdata");
// 设置识别语言(中文简体)
tesseract.setLanguage("chi_sim+eng");
// 执行OCR识别
String result = tesseract.doOCR(new File(imagePath));
return result;
} catch (TesseractException e) {
e.printStackTrace();
return "";
}
}
// 图片预处理(提高识别率)
public static String extractWithPreprocessing(String imagePath) {
// 1. 读取图片
// 2. 灰度化
// 3. 二值化
// 4. 去噪
// 5. OCR识别
// 这里简化处理,实际项目中可使用OpenCV等库进行预处理
return extractTextFromImage(imagePath);
}
public static void main(String[] args) {
String text = extractTextFromImage("screenshot.png");
System.out.println("识别结果:\n" + text);
}
}
Maven依赖
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>5.4.0</version>
</dependency>
从HTML中提取文字
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
public class HTMLTextExtractor {
// 从URL提取文字
public static String extractFromUrl(String url) {
try {
Document doc = Jsoup.connect(url)
.userAgent("Mozilla/5.0")
.timeout(5000)
.get();
// 获取纯文本(去掉标签)
return doc.body().text();
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
// 从HTML文件提取文字
public static String extractFromFile(String filePath) {
try {
File input = new File(filePath);
Document doc = Jsoup.parse(input, "UTF-8");
// 移除不需要的标签
doc.select("script, style, nav, footer").remove();
return doc.body().text();
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
// 提取特定元素中的文字
public static String extractSpecificElements(String url, String cssSelector) {
try {
Document doc = Jsoup.connect(url).get();
Elements elements = doc.select(cssSelector);
StringBuilder text = new StringBuilder();
for (Element element : elements) {
text.append(element.text()).append("\n");
}
return text.toString();
} catch (IOException e) {
e.printStackTrace();
return "";
}
}
public static void main(String[] args) {
String urlText = extractFromUrl("https://example.com");
System.out.println(urlText);
}
}
通用工具类
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class UniversalTextExtractor {
// 检测文件编码
public static String detectEncoding(String filePath) throws IOException {
try (InputStream is = new FileInputStream(filePath)) {
byte[] bytes = new byte[4];
is.read(bytes);
if (bytes[0] == (byte)0xEF && bytes[1] == (byte)0xBB && bytes[2] == (byte)0xBF) {
return "UTF-8 BOM";
} else if (bytes[0] == (byte)0xFF && bytes[1] == (byte)0xFE) {
return "UTF-16LE";
} else if (bytes[0] == (byte)0xFE && bytes[1] == (byte)0xFF) {
return "UTF-16BE";
}
return "UTF-8";
}
}
// 从文本文件中提取文字
public static String extractFromTextFile(String filePath) {
StringBuilder content = new StringBuilder();
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(
new FileInputStream(filePath),
StandardCharsets.UTF_8))) {
String line;
while ((line = reader.readLine()) != null) {
content.append(line).append("\n");
}
} catch (IOException e) {
e.printStackTrace();
}
return content.toString();
}
// 清理特殊字符
public static String cleanText(String text) {
// 移除多余空白
text = text.replaceAll("\\s+", " ").trim();
// 移除控制字符
text = text.replaceAll("[\\p{Cntrl}&&[^\\r\\n\\t]]", "");
// 移除不可见字符
text = text.replaceAll("\\p{C}", "");
return text;
}
// 按关键字提取
public static String extractByKeyword(String text, String keyword) {
Pattern pattern = Pattern.compile(keyword + ".*?[\\.\\!\\?]");
Matcher matcher = pattern.matcher(text);
StringBuilder result = new StringBuilder();
while (matcher.find()) {
result.append(matcher.group()).append("\n");
}
return result.toString();
}
}
完整使用示例
public class TextExtractionDemo {
public static void main(String[] args) {
// 1. PDF提取
String pdfText = PDFTextExtractor.extractTextFromPDF("document.pdf");
System.out.println("PDF内容:\n" + pdfText);
// 2. Word提取
String wordText = WordTextExtractor.extractFromDocx("document.docx");
System.out.println("Word内容:\n" + wordText);
// 3. 图片OCR
String ocrText = ImageTextExtractor.extractTextFromImage("screenshot.png");
System.out.println("OCR结果:\n" + ocrText);
// 4. HTML提取
String htmlText = HTMLTextExtractor.extractFromUrl("https://example.com");
System.out.println("HTML内容:\n" + htmlText);
// 5. 文字清理
String cleanedText = UniversalTextExtractor.cleanText(htmlText);
System.out.println("清理后:\n" + cleanedText);
}
}
使用建议
- PDF提取:Apache PDFBox适合简单文本,复杂格式建议用iText
- Word提取:Apache POI支持.doc和.docx格式
- OCR技术:Tesseract需要安装语言包,中文识别可能需要额外训练
- 性能优化:大文件建议分页或分段处理
- 编码问题:注意文件的编码格式,避免乱码
选择哪种方法取决于你的具体需求:文件类型、识别精度、处理速度等因素。