Java實(shí)現(xiàn)輕松提取word和pdf文檔內(nèi)容
1.添加依賴
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>5.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.5</version> <!-- 如果有 DOCX 相關(guān) -->
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>3.0.5</version>
</dependency>
2.java代碼
import cn.hutool.core.util.StrUtil;
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Locale;
/**
* @Description 文檔提取工具類
* @Date 2025/9/29 17:32
*/
public class DocumentTextExtractUtil {
public static String extractText(InputStream inputStream, String fileType) throws IOException {
if (inputStream == null) return "";
if (StrUtil.isBlank(fileType)) throw new IllegalArgumentException("文件類型不能為空");
String ft = normalizeFileType(fileType);
byte[] data = toByteArray(inputStream);
return switch (ft) {
case "pdf" -> extractPdfText(data);
case "docx" -> extractDocxText(data);
case "doc" -> extractDocText(data);
default -> new String(data, StandardCharsets.UTF_8);
};
}
private static String normalizeFileType(String fileType) {
String ft = fileType.trim().toLowerCase(Locale.ROOT);
if (ft.startsWith(".")) ft = ft.substring(1);
if (ft.contains("/")) {
ft = ft.substring(ft.indexOf('/') + 1);
if (ft.contains("+")) ft = ft.substring(0, ft.indexOf('+'));
}
return ft;
}
private static String extractPdfText(byte[] data) throws IOException {
try (PDDocument doc = Loader.loadPDF(data)) { // 3.x 用 Loader.loadPDF
PDFTextStripper stripper = new PDFTextStripper();
stripper.setSortByPosition(true);
String text = stripper.getText(doc);
return text == null ? "" : text.trim();
}
}
private static String extractDocxText(byte[] data) throws IOException {
try (XWPFDocument doc = new XWPFDocument(new ByteArrayInputStream(data))) {
StringBuilder sb = new StringBuilder();
List<XWPFParagraph> paragraphs = doc.getParagraphs();
for (XWPFParagraph p : paragraphs) {
String t = p.getText();
if (t != null && !t.isEmpty()) {
sb.append(t).append('\n');
}
}
return sb.toString().trim();
}
}
private static String extractDocText(byte[] data) throws IOException {
try (HWPFDocument doc = new HWPFDocument(new ByteArrayInputStream(data))) {
WordExtractor extractor = new WordExtractor(doc);
String[] paragraphs = extractor.getParagraphText();
StringBuilder sb = new StringBuilder();
if (paragraphs != null) {
for (String p : paragraphs) {
if (p == null) continue;
String clean = p.replaceAll("\\u0000", "").trim();
if (!clean.isEmpty()) sb.append(clean).append('\n');
}
}
return sb.toString().trim();
}
}
private static byte[] toByteArray(InputStream in) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream(8192);
byte[] buf = new byte[8192];
int r;
while ((r = in.read(buf)) != -1) {
baos.write(buf, 0, r);
}
return baos.toByteArray();
}
}
3.如何使用
try (InputStream textStream = new ByteArrayInputStream(content)) {
String text = DocumentTextExtractUtil.extractText(textStream, fileType.toLowerCase());
} catch (Exception e) {
log.warn("文本提取失敗,文件: {},類型: {}", fileName, fileType, e);
}
到此這篇關(guān)于Java實(shí)現(xiàn)輕松提取word和pdf文檔內(nèi)容的文章就介紹到這了,更多相關(guān)Java提取word和pdf內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 利用Java實(shí)現(xiàn)Word文檔自動(dòng)編號(hào)提取的方法詳解
- Java按順序提取Word內(nèi)容的方法步驟(文本+數(shù)學(xué)公式)
- Java實(shí)現(xiàn)提取Word文檔表格數(shù)據(jù)
- java讀取word文檔,提取標(biāo)題和內(nèi)容的實(shí)例
- Java自動(dòng)化實(shí)現(xiàn)提取PDF表格數(shù)據(jù)
- Java高效提取PDF文件指定坐標(biāo)的文本內(nèi)容實(shí)戰(zhàn)代碼
- java利用Tabula實(shí)現(xiàn)對(duì)PDF內(nèi)表格數(shù)據(jù)提取
相關(guān)文章
Win10系統(tǒng)下配置Java環(huán)境變量
今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著Win10系統(tǒng)下配置Java環(huán)境變量展開(kāi),文中有非常詳細(xì)的介紹及圖文示例,需要的朋友可以參考下2021-06-06
Java實(shí)現(xiàn)excel動(dòng)態(tài)列導(dǎo)出的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)excel動(dòng)態(tài)列導(dǎo)出,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
MyBatis插件開(kāi)發(fā)的完整詳細(xì)例子(附注釋和總結(jié))
這篇文章主要介紹了MyBatis插件開(kāi)發(fā)的完整詳細(xì)例子,通過(guò)示例代碼和詳細(xì)注釋,展示了如何在不同接口和方法中實(shí)現(xiàn)自定義邏輯,如日志記錄、SQL修改、參數(shù)處理和結(jié)果集處理,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2025-04-04
java實(shí)現(xiàn)基于UDP協(xié)議網(wǎng)絡(luò)Socket編程(C/S通信)
這篇文章主要介紹了java實(shí)現(xiàn)基于UDP協(xié)議網(wǎng)絡(luò)Socket編程(C/S通信),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
SpringMVC核心DispatcherServlet處理流程分步詳解
這篇文章主要介紹了SpringMVC核心之中央調(diào)度器DispatcherServlet的相關(guān)知識(shí),包括SpringMVC請(qǐng)求處理過(guò)程及SrpingMVC容器和spring IOC容器關(guān)系,需要的朋友可以參考下2023-04-04

