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)文章
Java去掉小數(shù)點(diǎn)后面無效0的方案與建議
當(dāng)前小數(shù)點(diǎn)后面的位數(shù)過多的時(shí)候,多余的0沒有實(shí)際意義,下面這篇文章主要給大家介紹了關(guān)于Java去掉小數(shù)點(diǎn)后面無效0的方案與建議,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
SpringBoot上傳文件到本服務(wù)器 目錄與jar包同級(jí)問題
這篇文章主要介紹了SpringBoot上傳文件到本服務(wù)器 目錄與jar包同級(jí)問題,需要的朋友可以參考下2018-11-11
Java 讀取網(wǎng)絡(luò)圖片存儲(chǔ)到本地并生成縮略圖
用Java做開發(fā)經(jīng)常需要處理圖片。本文就來看一下如何保存圖片到本地并生成縮略圖2021-05-05
SpringBoot?中處理接口傳參時(shí)常用的注解及使用場(chǎng)景分析
怎么用idea創(chuàng)建一個(gè)SpringBoot項(xiàng)目

