JAVA读取(DOC、DOCX、PDF、PPT、PPTX)文件文本内容及图片

这篇具有很好参考价值的文章主要介绍了JAVA读取(DOC、DOCX、PDF、PPT、PPTX)文件文本内容及图片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以下为瞎扯淡:

温馨提示:有很多方法均可以解析这些常见的文件,以下内容使用的是apache-poi + apache-pdfbox实现的。

        关于文档解析,在网上搜索了很久,无奈内容太过繁杂,找不到合适的代码,一大半都是只支持文本。没办法,只能自己在网上一点一点CV了,最终提取了这些代码,不能说好用吧,应该可解燃眉之急。关于doc文档以及pdf文档还是有很多问题的,后续希望大佬们能在帖子下面多多指正,能优化一下代码,那就更好了。

以下为正文内容:

首先把以下这些依赖干进去

        <dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>4.1.0</version>
		</dependency>
        <dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-scratchpad</artifactId>
			<version>4.1.0</version>
		</dependency>
        <dependency>
			<groupId>org.apache.pdfbox</groupId>
			<artifactId>pdfbox</artifactId>
			<version>2.0.22</version>
		</dependency>
要测试的话给你贴一个文档地址吧:(但是这个在线文档是没有图片滴)
public static void main(String[] args) throws IOException {
        String document = processDocumentFromFilePath("E:\\VPN系统使用手册.pptx", "E:\\临时图片");
        System.out.println(document);
        String documentFromUrl = processDocumentFromUrl("http://api.idocv.com/data/doc/manual.docx", "E:\\临时图片");
        System.out.println(documentFromUrl);
    }
然后上车:飕飕飕

doc.getparagraphs()获取不到图片,java文章来源地址https://www.toymoban.com/news/detail-776245.html

import com.alibaba.dubbo.common.utils.CollectionUtils;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.poi.hslf.usermodel.*;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.hwpf.usermodel.Picture;
import org.apache.poi.sl.usermodel.TextParagraph;
import org.apache.poi.xslf.usermodel.*;
import org.apache.poi.xwpf.usermodel.*;

import java.io.*;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

public class FileProcessorUtils {

   
    /***
     * 此方法针对本地文件
     * 提取文件信息并返回内容
     * @param filePath 文件储存地址
     * @param imgRoot 图片存储地址
     * @return
     */
    public static String processDocumentFromFilePath(String filePath,String imgRoot) throws IOException {
        File file = new File(filePath);
        FileInputStream fileInputStream = new FileInputStream(file);

        // 根据文件类型调用适当的处理方法
        switch (fileTypeName(filePath)) {
            case "doc":
                return processWordDocDocumentFromStream(fileInputStream,imgRoot);
            case "docx":
                return processWordDocxDocumentFromStream(fileInputStream,imgRoot);
            case "pdf":
                return processPdfDocumentFromStream(fileInputStream,imgRoot);
            case "ppt":
                return processPptDocumentFromStream(fileInputStream,imgRoot);
            case "pptx":
                return processPptxDocumentFromStream(fileInputStream,imgRoot);
            default:
                throw new RuntimeException("不支持的文件格式,文件解析目前只支持(DOC/DOCX/PDF/PPT/PPTX)");
        }
    }


    /***
     * 此方法针对网络文件
     * 提取文件信息并返回内容
     * @param downloadUrl 文件下载链接
     * @param imgRoot 图片存储地址
     * @return
     */
    public static String processDocumentFromUrl(String downloadUrl,String imgRoot) throws IOException {

        HttpClient httpClient = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet(downloadUrl);
        HttpResponse response = httpClient.execute(httpGet);

        //获取文件类型
        // TODO: 2023/9/14  此处并不是所有的下载链接都存在后缀信息,如果为了提升代码的健壮性,可以在此处修改代码以获取文件类型
        String typeName = fileTypeName(downloadUrl);
        // 根据文件类型调用适当的处理方法
        switch (typeName) {
            case "doc":
                return processWordDocDocumentFromStream(response.getEntity().getContent(),imgRoot);
            case "docx":
                return processWordDocxDocumentFromStream(response.getEntity().getContent(),imgRoot);
            case "pdf":
                return processPdfDocumentFromStream(response.getEntity().getContent(),imgRoot);
            case "ppt":
                return processPptDocumentFromStream(response.getEntity().getContent(),imgRoot);
            case "pptx":
                return processPptxDocumentFromStream(response.getEntity().getContent(),imgRoot);
            default:
                throw new RuntimeException("不支持的文件格式,文件解析目前只支持(DOC/DOCX/PDF/PPT/PPTX)");
        }
    }

    /***
     * word(doc)文件处理
     * @param inputStream(文件流)
     * @return
     */
    private static String processWordDocDocumentFromStream(InputStream inputStream,String imageRoot) throws IOException {
        HWPFDocument document = new HWPFDocument(inputStream);
        StringBuilder htmlText = new StringBuilder();
        WordExtractor extractor = new WordExtractor(document);

        try {
            String[] paragraphs = extractor.getParagraphText();
            for (int paragraphIndex = 0; paragraphIndex < paragraphs.length; paragraphIndex++) {
                String paragraphText = paragraphs[paragraphIndex];
                //获取文本对齐方式
                String justification = getJustification(document.getRange().getParagraph(paragraphIndex).getJustification());
                // 根据需要添加其他HTML标签
                htmlText.append("<p style='text-align:").append(justification).append("'><span>").append(paragraphText).append("</span>").append("</p>");
            }

            // 提取图片
            List<Picture> pictures = document.getPicturesTable().getAllPictures();
            for (int i = 0; i < pictures.size(); i++) {
                Picture picture = pictures.get(i);
                byte[] pictureData = picture.getContent();
                String newFileName = new Date().getTime() + i + "_image." + picture.suggestFileExtension(); // 可以根据需要更改扩展名,suggestFileExtension()方法自动获取合适的图片类型
                String imgPath = saveImageToFile(pictureData, newFileName, imageRoot);
                htmlText.append("<p><img alt='' src='").append(imgPath).append("'></p >");
            }
        } finally {
            extractor.close();
            document.close();
        }
        return htmlText.toString();
    }


    /***
     * word(docx)文件处理
     * @param inputStream(文件流)
     * @return
     */
    private static String processWordDocxDocumentFromStream(InputStream inputStream,String imageRoot) throws IOException {
        //获取文件内容
        XWPFDocument document = new XWPFDocument(inputStream);
        StringBuilder htmlText = new StringBuilder();
        try {
            //获取所有元素
            List<XWPFParagraph> paragraphs = document.getParagraphs();
            //根据元素类型追加
            for (XWPFParagraph paragraph : paragraphs) {
                //获取文本对齐方式
                ParagraphAlignment alignment = paragraph.getAlignment();
                htmlText.append("<p style='text-align:").append(alignment).append("'>");

                List<XWPFRun> runs = paragraph.getRuns();
                for (XWPFRun run : runs) {
                    // 处理字体大小、样式等信息
                    String fontSize = run.getFontSize() + "pt";
                    String fontFamily = run.getFontFamily();
                    // 添加样式信息到HTML
                    htmlText.append("<span style='font-size:" + fontSize + "; font-family:" + fontFamily +";'>" + run.text() + "</span>");
                }
                htmlText.append("</p>");

                // 检查当前行段落是否有图片存在
                List<XWPFPicture> pictures = paragraph.getRuns().stream()
                        .flatMap(run -> run.getEmbeddedPictures().stream())
                        .collect(Collectors.toList());
                if(CollectionUtils.isNotEmpty(pictures)){
                    if(pictures.size()>0){
                        pictures.forEach( bean ->{
                            XWPFPictureData pictureData = bean.getPictureData();
                            String newFileName = new Date().getTime() + "_image." + pictureData.suggestFileExtension();
                            String imgPath = null;
                            try {
                                imgPath = saveImageToFile(pictureData.getData(), newFileName, imageRoot);
                            } catch (IOException e) {
                                throw new RuntimeException(e);
                            }
                            htmlText.append("<p style='text-align:center'><img src='").append(imgPath).append("'></p>");
                        });
                    }
                }
            }
        } finally {
            document.close();
        }
        return htmlText.toString();
    }

    /***
     * Pdf文件处理
     * @param inputStream(文件流)
     * @return
     */
    private static String processPdfDocumentFromStream(InputStream inputStream,String imageRoot) throws IOException {
        PDDocument pdfDocument = PDDocument.load(inputStream);
        PDFTextStripper textStripper = new PDFTextStripper();

        StringBuilder htmlText = new StringBuilder();

        String[] lines = textStripper.getText(pdfDocument).split("\n");

        for (String line : lines) {
            htmlText.append("<p style='text-align:left'>").append(line).append("</p>");
        }

        pdfDocument.close();

        return htmlText.toString();
    }

    /**
     * 处理PPT(.ppt)文件
     * @param inputStream(文件流)
     * @return
     * @throws IOException
     */
    private static String processPptDocumentFromStream(InputStream inputStream,String imageRoot) throws IOException {
        HSLFSlideShow ppt = new HSLFSlideShow(inputStream);
        StringBuilder pptText = new StringBuilder();
        try {
            // 提取文本内容
            for (HSLFSlide slide : ppt.getSlides()) {
                for (HSLFShape shape : slide.getShapes()) {
                    //如果是文本处理文本
                    if (shape instanceof HSLFTextShape) {
                        HSLFTextShape textShape = (HSLFTextShape) shape;
                        for (HSLFTextParagraph paragraph : textShape.getTextParagraphs()) {
                            //获取文本对齐方式
                            TextParagraph.TextAlign textAlign = paragraph.getTextAlign();
                            pptText.append("<p style='text-align:").append(textAlign).append("'>");
                            for (HSLFTextRun run : paragraph.getTextRuns()) {
                                // 处理字体大小、字体样式等信息
                                String fontSize = run.getFontSize() + "pt";
                                String fontFamily = run.getFontFamily();
                                run.getRawText();
                                // 添加样式信息到HTML
                                pptText.append("<span style='font-size:" + fontSize + "; font-family:" + fontFamily + ";'>" + run.getRawText() + "</span>");
                            }
                            pptText.append("</p>"); // 换行处理


                        }
                    }else if (shape instanceof HSLFPictureShape) {
                        // 如果是图片,处理图片
                        HSLFPictureShape pictureShape = (HSLFPictureShape) shape;
                        HSLFPictureData pictureData = pictureShape.getPictureData();
                        String contentType = pictureData.getContentType();
                        String newFileName = new Date().getTime() + "_image." + imageTypeName(contentType);
                        String imgPath = saveImageToFile(pictureData.getData(), newFileName, imageRoot);
                        pptText.append("<p style='text-align:center'><img src='").append(imgPath).append("'></p>");
                    }
                }
            }
        } finally {
            ppt.close();
        }

        return pptText.toString();
    }

    /**
     * 处理PPTX(.pptx)文件
     * @param inputStream(文件流)
     * @return
     * @throws IOException
     */
    private static String processPptxDocumentFromStream(InputStream inputStream,String imageRoot) throws IOException {
        XMLSlideShow pptx = new XMLSlideShow(inputStream);
        StringBuilder pptxText = new StringBuilder();
        try {
            // 提取文本内容
            for (XSLFSlide slide : pptx.getSlides()) {
                for (XSLFShape shape : slide.getShapes()) {
                    if (shape instanceof XSLFTextShape) {
                        XSLFTextShape textShape = (XSLFTextShape) shape;
                        for (XSLFTextParagraph paragraph : textShape.getTextParagraphs()) {
                            //获取文本对齐方式
                            TextParagraph.TextAlign textAlign = paragraph.getTextAlign();
                            pptxText.append("<p style='text-align:").append(textAlign).append("'>");
                            for (XSLFTextRun run : paragraph.getTextRuns()) {
                                // 处理字体大小、字体样式等信息
                                String fontSize = run.getFontSize() + "pt";
                                String fontFamily = run.getFontFamily();

                                // 添加样式信息到HTML
                                pptxText.append("<span style='font-size:" + fontSize + "; font-family:" + fontFamily + ";'>" + run.getRawText() + "</span>");
                            }
                            pptxText.append("</p>"); // 换行处理
                        }
                    }else if (shape instanceof XSLFPictureShape) {
                        // 如果是图片,处理图片
                        XSLFPictureShape pictureShape = (XSLFPictureShape) shape;
                        XSLFPictureData pictureData = pictureShape.getPictureData();
                        String newFileName = new Date().getTime() + "_image." + pictureData.suggestFileExtension();
                        String imgPath = saveImageToFile(pictureData.getData(), newFileName, imageRoot);
                        pptxText.append("<p style='text-align:center'><img src='").append(imgPath).append("'></p>");
                    }
                }
            }
        } finally {
            pptx.close();
        }
        return pptxText.toString();
    }

    /**
     * 保存图片到指定位置,并返回引用地址
     * @param imageData
     * @param imageRoot
     * @return
     * @throws IOException
     */
    public static String saveImageToFile(byte[] imageData, String imageFileName, String imageRoot) throws IOException {
        String imagePath = imageRoot + File.separator + imageFileName;
        File file = new File(imageRoot);
        if(!file.exists()){
            file.mkdir();
        }
        try (FileOutputStream fos = new FileOutputStream(imagePath)) {
            fos.write(imageData);
        }
        return imagePath;
    }

    /**
     * 表格处理
     * @param table
     * @return
     */
    private static String getTableHtmlText(XWPFTable table) {
        StringBuilder tableHtml = new StringBuilder("<table>");
        for (XWPFTableRow row : table.getRows()) {
            tableHtml.append("<tr>");
            for (XWPFTableCell cell : row.getTableCells()) {
                tableHtml.append("<td>").append(cell.getText()).append("</td>");
            }
            tableHtml.append("</tr>");
        }
        tableHtml.append("</table>");
        return tableHtml.toString();
    }

    /***
     * 获取文件后缀
     * @param filePath
     * @return
     */
    private static String fileTypeName(String filePath) {
        int dotIndex = filePath.lastIndexOf(".");
        if (dotIndex > 0) {
            return filePath.substring(dotIndex + 1).toLowerCase();
        }
        return "";
    }

    /***
     * 获取图片类型
     * @param imagePath
     * @return
     */
    private static String imageTypeName(String imagePath) {
        int dotIndex = imagePath.lastIndexOf("/");
        if (dotIndex > 0) {
            return imagePath.substring(dotIndex + 1).toLowerCase();
        }
        return "";
    }

    /***
     * doc文档获取当前行对齐方式 默认左对齐
     * @param type
     * @return
     */
    private static String getJustification(Integer type) {
        switch (type) {
            case 0:
                return "left";
            case 1:
                return "center";
            case 2:
                return "right";
            default:
                return "left";
        }
    }
}

到了这里,关于JAVA读取(DOC、DOCX、PDF、PPT、PPTX)文件文本内容及图片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java给文件加水印,支持.pptx,.doc,.docx,.xls,.xlsx,.pdf,.png,.jpg。

    office 相关格式文档的加密主要使用微软提供的Spire.Office for Java ,free部分有针对性每个类型的API说明和示例,请自行参考以下链接。下面也会附上我在项目中的实际工具类。 Spire.Office for Java | 专业的 Java Office 套件 | 创建、修改、转换、打印 Word/PowerPoint/PDF 文档 我的策略是

    2024年02月12日
    浏览(65)
  • uniapp 在线预览各种格式文件(支持doc, xls, ppt, pdf, docx, xlsx, pptx格式) 适用于小程序 (解决了真机调试可以打开,发布体验版打不开的问题)(可设置文件名)

    代码: 参考官方文档: uni.saveFile(OBJECT) @savefile | uni-app官网 uni-app,uniCloud,serverless https://uniapp.dcloud.net.cn/api/file/file.html#opendocument tips: 问题一: 打不开         1. 文件地址须保证能正常打开(在浏览器中尝试是否能预览或正常下载)         2.注意文件名最好为数字字母(非中文) 问题

    2024年02月05日
    浏览(64)
  • Go如何自动解压缩包?如何读取docx/doc文件内容?

    在开发过程中,我们常常需要处理压缩包和文档文件。本文将介绍如何使用Go语言自动解压缩包和读取docx/doc文件。 压缩包格式 常见的压缩包格式有zip、gzip、bzip2等。在Go语言中,使用archive/zip、compress/gzip、compress/bzip2包可以轻松地处理这些格式的文件。 解压zip文件 使用arc

    2023年04月08日
    浏览(40)
  • 【PDFBox】PDFBox操作PDF文档之读取指定页面文本内容、读取所有页面文本内容、根据模板文件生成PDF文档

    这篇文章,主要介绍PDFBox操作PDF文档之读取指定页面文本内容、读取所有页面文本内容、根据模板文件生成PDF文档。 目录 一、PDFBox操作文本 1.1、读取所有页面文本内容 1.2、读取指定页面文本内容 1.3、写入文本内容 1.4、替换文本内容 (1)自定义PDTextStripper类 (2)创建Key

    2024年02月16日
    浏览(68)
  • Python - 读取pdf、word、excel、ppt、csv、txt文件提取所有文本

    本文对使用python读取pdf、word、excel、ppt、csv、txt等常用文件,并提取所有文本的方法进行分享和使用总结。 可以读取不同文件的库和方法当然不止下面分享的这些,本文的代码主要目标都是:方便提取文件中所有文本的实现方式。 这些库的更多使用方法,请到官方文档中查

    2024年02月13日
    浏览(124)
  • vue - - - - - 在线预览常见文件格式 .doc, .docx, .xls, .xlsx,.pdf

    关于一些文件的在线预览,最简易的实现方式是什么呢? 写在前面 .png, .jpg, .jpeg 等图片格式 直接预览http/https地址 即可 .pdf 文件 直接预览http/https地址 即可 .doc, .docx, .xls, .xlsx 等类型文件,需要在预览地址之前拼接上 https://view.officeapps.live.com/op/view.aspx?src= .ofd 等类型文件,需

    2024年02月09日
    浏览(77)
  • 前端vue3实现本地及在线文件预览(含pdf/txt/mp3/mp4/docx/xlsx/pptx)

    (一)微软office免费预览( 推荐 ) 支持doc/docx/xls/xlsx/ppt/pptx等多种office文件格式的免费预览 (二)XDOC文档预览云服务  移动端和PC端无插件预览PDF、OFD、Word、WPS等多种格式文档 本地或内网预览需要借助插件实现,pdf、mp3、mp4等主要靠原生标签或浏览器自带功能,尽量减少

    2024年02月05日
    浏览(74)
  • Python实现将pdf,docx,xls,doc,wps链接下载并将文件保存到本地

    前言 本文是该专栏的第31篇,后面会持续分享python的各种干货知识,值得关注。 在工作上,尤其是在处理爬虫项目中,会遇到这样的需求。访问某个网页或者在采集某个页面的时候,正文部分含有docx,或pdf,或xls,或doc,或wps,或ofd,或xlsx,或zip等链接。需要你使用python自

    2024年02月16日
    浏览(56)
  • java 读取pdf文件内容

    https://blog.csdn.net/ThinkPet/article/details/131256428

    2024年02月08日
    浏览(45)
  • Java按行读取文件文本内容

    在工作和学习中,有时候会有一些场景,代码需要配合读取文件来执行,比如:读文件数据,来进行计算、组装SQL、更新操作...... 下面我们来讨论下,在Java中按行读取文件文件内容的方式有哪些? 读取的文件内容 测试代码 输出结果 分析:虽然读取1个字符,但每行后面可能

    2024年02月15日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包