首页 > 基础资料 博客日记

Java 解析常见文本文件数据

2024-09-21 22:00:07基础资料围观126

这篇文章介绍了Java 解析常见文本文件数据,分享给大家做个参考,收藏Java资料网收获更多编程知识


前言

请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i


提示:以下是本篇文章正文内容,下面案例可供参考

简介

在日常开发中我们经常会解析各类文件如:.docx、pdf、txt 读取文件内容进行下一步逻辑处理,本文例举解析上述文件

第一步:引入依赖

友情链接:创建Springboot 项目请移步 点我!点我!点我!

		<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.5</version>
        </dependency>
		 <!--  提取pdf中的文字-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.6</version>
        </dependency>
        <!--获取pdf文件的总页数-->
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>1.8.11</version>
        </dependency>

        <!-- poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>4.0.0</version>
        </dependency>

        <!-- FileUtils依赖-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>

第二步:编写文件解析处理类

 	// 定义静态的文件后缀
    private static final String SUFFIX_DOC = ".doc";
    private static final String SUFFIX_DOCX = ".docx";
    private static final String SUFFIX_PDF = ".pdf";
    private static final String SUFFIX_TXT = ".txt";

	/**
     * .
     * 根据文件类型解析文件内容
     *
     * @param file 文件
     * @return 解析内容
     */
    private static String readFileToString(File file) {
        StringBuilder readStr = new StringBuilder();
        String fileType = file.getName().substring(file.getName().lastIndexOf("."));
        log.debug("解析文件类型为[{}]文件", fileType);
        switch (fileType) {
            case SUFFIX_DOC: {
                readStr.append(WordUtil.readWord(SUFFIX_DOC, file.getAbsolutePath()));
                break;
            }
            case SUFFIX_DOCX: {
                readStr.append(WordUtil.readWord(SUFFIX_DOCX, file.getAbsolutePath()));
                break;
            }
            case SUFFIX_PDF: {
                readStr.append(PDFToWordUtil.getTextFromPdf(file.getAbsolutePath()));
                break;
            }
            case SUFFIX_TXT: {
                readStr.append(TxtUtil.readTxtFile(file.getAbsolutePath()));
                break;
            }
            default: {
                log.error("文件类型不正确,请上传.doc、.docx、.pdf、.txt后缀文件");
                throw new RuntimeException("文件类型不正确,请上传.doc、.docx、.pdf、.txt后缀文件");
            }
        }
        return readStr.toString();
    }

第三步:Word解析类


import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

import java.io.FileInputStream;
import java.io.InputStream;

/**
 * Word 操作工具类
 */
@Slf4j
public class WordUtil {
    // 定义静态的文件后缀
    public static final String SUFFIX_DOC = ".doc";
    public static final String SUFFIX_DOCX = ".docx";

    /**
     * 读取 Word 入口方法,根据后缀,调用方法
     *
     * @param suffix   文件后缀
     * @param filePath 文件路径
     * @return
     */
    public static String readWord(String suffix, String filePath) {
        String wordStr = "";
        try (InputStream input = new FileInputStream(filePath)) {
            // docx 类型
            if (SUFFIX_DOCX.equals(suffix)) {
                wordStr = readDocx(input);
                // doc 类型
            } else if (SUFFIX_DOC.equals(suffix)) {
                wordStr = readDoc(input);
            }
        } catch (Exception e) {
            log.error("readWord [{}] is error", filePath);
        }
        wordStr = wordStr.replace("\n", "");
        wordStr = wordStr.replace("\\\\r", "");
        wordStr = wordStr.replace("\\\\t", "");
        return wordStr;
    }

    /**
     * 读取 doc 类型,使用 WordExtractor 对象,传递输入流
     *
     * @param inputStream
     * @return
     */
    private static String readDoc(InputStream inputStream) {
        try {
            String content = "";
            WordExtractor ex = new WordExtractor(inputStream);
            content = ex.getText();
            ex.close();
            return content;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 读取 docx 类型,使用 XWPFDocument 对象,传递输入流
     *
     * @param inputStream
     * @return
     */
    private static String readDocx(InputStream inputStream) {
        try {
            String content = "";
            XWPFDocument xdoc = new XWPFDocument(inputStream);
            XWPFWordExtractor extractor = new XWPFWordExtractor(xdoc);
            content = extractor.getText();
            extractor.close();
            return content;
        } catch (Exception e) {
            return null;
        }
    }
}

第四步:PDF解析类


@Slf4j
public class PDFToWordUtil {

    /**
     * @Description: 提取pdf中的文字 第一种方法
     * @Param: fileUrlList:地址
     * @Param: pages:页码
     * @return: content:提取的文字
     */
    public static String PDFToWord(String fileUrlList) throws IOException {
        //linux---start---
        fileUrlList = fileUrlList.replaceAll("\\\\", File.separator);
        //linux--end----
        Integer pages = PDFToPage(fileUrlList);
        String fileName = fileUrlList;//源文件的位置
        PdfReader reader = null;//PDF读取器
        reader = new PdfReader(fileName);
        String content = "";
        for (int i = 1; i <= pages; i++) {
            content += PdfTextExtractor.getTextFromPage(reader, i); // 读取PDF中第i页(用哪一页就写几)的文档内容,并转成String
        }
        content = content.replace("\n", "");
        content = content.replace("\\\\r", "");
        content = content.replace("\\\\t", "");
        log.debug(content);//控制台打印PDF第一页的内容
        return content;
    }

    /**
     * @Description: 提取pdf中的页码
     * @Param: fileUrlList:地址
     * @return: pages:页码数
     */
    public static int PDFToPage(String fileUrlList) {
        //linux---start---
        fileUrlList = fileUrlList.replaceAll("\\\\", File.separator);
        //linux--end----
        File file = new File(fileUrlList);
        PdfReader pdfReader = null;
        try {
            pdfReader = new PdfReader(new FileInputStream(file));
        } catch (IOException e) {
            e.printStackTrace();
        }
        int pages = pdfReader.getNumberOfPages();
        log.debug("pdf文件的总页数为:" + pages);
        return pages;
    }

    /**
     * @Description: 提取pdf中的文字 第二种方法
     * @Param: pdfPath:地址
     * @return: content:提取的文字
     */
    public static String getTextFromPdf(String pdfPath) {
        String content = null;
        try {
            // 是否排序
            boolean sort = false;
            // 开始提取页数
            int startPage = 1;
            // 结束提取页数
            int endPage = Integer.MAX_VALUE;
            //InputStream input = null;
            //linux---start---
            // pdfPath = pdfPath.replaceAll("\\\\", File.separator);
            //linux--end----
            File pdfFile = new File(pdfPath);
            PDDocument document = null;

            try (InputStream input = new FileInputStream(pdfFile)) {
                // 加载 pdf 文档
                PDFParser parser = new PDFParser(input);
                parser.parse();
                document = parser.getPDDocument();
                // 获取内容信息
                PDFTextStripper pts = new PDFTextStripper();
                pts.setSortByPosition(sort);
                endPage = document.getNumberOfPages();
                log.debug("Total Page: " + endPage);
                pts.setStartPage(startPage);
                pts.setEndPage(endPage);
                try {
                    content = pts.getText(document);
                } catch (Exception e) {
                    throw e;
                }
                log.debug("Get PDF Content ...");
            } catch (Exception e) {
                throw e;
            } finally {
                if (null != document)
                    document.close();
            }
            content = content.replace("\n", "");
            content = content.replace("\\\\r", "");
            content = content.replace("\\\\t", "");
        } catch (Exception e) {
            log.error("getTextFromPdf [{}] is error", pdfPath);
        }
        return content;

    }

}

第五步:Txt解析类


@Slf4j
public class TxtUtil {

    /**
     * .
     * 获取文本内容
     *
     * @return 文件内容
     */
    public static String readTxtFile(String filePath) {
        String txtStr = "";
        try {
            File file = new File(filePath);
            if (!file.exists()) {
                log.error("可读文件不存在[{}]", file.getAbsolutePath());
            }
            txtStr = FileUtils.readFileToString(file, CharsetUtil.UTF_8);
        } catch (IOException e) {
            log.error("readTxtFile [{}] is error", filePath);
        }
        txtStr = txtStr.replace("\n", "");
        txtStr = txtStr.replace("\\\\r", "");
        txtStr = txtStr.replace("\\\\t", "");
        return txtStr;
    }


    /**
     * .
     * 写入数据
     *
     * @param outPath 输出路径
     * @param context 内容
     */
    public static void writeFile(String outPath, String context) {
        try {
            File file = new File(outPath);
            FileUtils.write(file, context, CharsetUtil.UTF_8, false);
        } catch (IOException e) {
            log.error("writeFile is error {}", e);
        }
    }
}

总结

我是南国以南i记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!


文章来源:https://blog.csdn.net/springhub/article/details/132165371
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐

标签云