Java文字提取案例如何实现

wen java案例 28

本文目录导读:

Java文字提取案例如何实现

  1. 从PDF中提取文字
  2. 从Word文档中提取文字
  3. 从图片中提取文字(OCR)
  4. 从HTML中提取文字
  5. 通用工具类
  6. 完整使用示例
  7. 使用建议

我来详细介绍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);
    }
}

使用建议

  1. PDF提取:Apache PDFBox适合简单文本,复杂格式建议用iText
  2. Word提取:Apache POI支持.doc和.docx格式
  3. OCR技术:Tesseract需要安装语言包,中文识别可能需要额外训练
  4. 性能优化:大文件建议分页或分段处理
  5. 编码问题:注意文件的编码格式,避免乱码

选择哪种方法取决于你的具体需求:文件类型、识别精度、处理速度等因素。

抱歉,评论功能暂时关闭!