最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)輕松提取word和pdf文檔內(nèi)容

 更新時(shí)間:2025年10月15日 10:20:54   作者:Uluoyu  
這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)輕松提取word和pdf文檔內(nèi)容,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis映射文件實(shí)例詳解

    Mybatis映射文件實(shí)例詳解

    這篇文章主要介紹了 Mybatis映射文件實(shí)例詳解,需要的朋友可以參考下
    2017-02-02
  • SpringBoot?中處理接口傳參時(shí)常用的注解及使用場(chǎng)景分析

    SpringBoot?中處理接口傳參時(shí)常用的注解及使用場(chǎng)景分析

    SpringBoot提供了多種注解來處理不同位置的參數(shù),包括路徑參數(shù)、URL請(qǐng)求參數(shù)、請(qǐng)求體參數(shù)、請(qǐng)求頭參數(shù)和Cookie參數(shù),每種注解都有其特定的使用場(chǎng)景和核心用法,下面給大家介紹SpringBoot中處理接口傳參時(shí)常用的注解及使用場(chǎng)景分析,感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • Java根據(jù)Request獲取客戶端IP

    Java根據(jù)Request獲取客戶端IP

    這篇文章主要介紹了Java根據(jù)Request獲取客戶端IP的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-05-05
  • 怎么用idea創(chuàng)建一個(gè)SpringBoot項(xiàng)目

    怎么用idea創(chuàng)建一個(gè)SpringBoot項(xiàng)目

    本文介紹了在IDEA中創(chuàng)建Spring Boot項(xiàng)目的步驟,包括環(huán)境準(zhǔn)備(JDK 1.8+、Maven 3.2.5+)、使用Spring Initializr生成項(xiàng)目結(jié)構(gòu)、配置啟動(dòng)端口、創(chuàng)建控制器及測(cè)試方法,強(qiáng)調(diào)依賴管理與注解處理,感興趣的朋友一起看看吧
    2025-06-06
  • 最新評(píng)論

    丽水市| 岚皋县| 曲靖市| 海盐县| 红安县| 张北县| 扶绥县| 微博| 临高县| 蓬安县| 承德市| 吉林省| 台江县| 河北省| 峨山| 马山县| 贵德县| 迭部县| 山阳县| 绥德县| 永寿县| 黄梅县| 阳山县| 界首市| 沙湾县| 常德市| 青铜峡市| 云南省| 泗水县| 余干县| 北辰区| 自贡市| 天祝| 茂名市| 乌兰县| 二连浩特市| 南宫市| 镇平县| 申扎县| 香港 | 桦甸市|