本文目录导读:

我来详细介绍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需要安装语言包,中文识别可能需要额外训练
- 性能优化:大文件建议分页或分段处理
- 编码问题:注意文件的编码格式,避免乱码
选择哪种方法取决于你的具体需求:文件类型、识别精度、处理速度等因素。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播