java按顺序读取docx文件中的内容(包括图片)

使用ApachePOI读取docx文件,首先引入maven:

xml 复制代码
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.0.0</version>
        </dependency>

可以对元素进行遍历,获取内容(段落和表格)

如下:

java 复制代码
        try {
            FileInputStream fis = new FileInputStream("xxxx.docx");
            XWPFDocument document = new XWPFDocument(fis);

            // 遍历文档中的所有元素(段落和表格)
            List<IBodyElement> bodyElements = document.getBodyElements();
            for (IBodyElement bodyElement : bodyElements) {
                if (bodyElement instanceof XWPFParagraph) {
                    XWPFParagraph paragraph = (XWPFParagraph) bodyElement;
                    System.out.println(paragraph.getStyleID() + ":" + paragraph.getText());
                } else if (bodyElement instanceof XWPFTable) {
                    System.out.println(((XWPFTable) bodyElement).getText());
                } else if (bodyElement instanceof XWPFPicture) {
                    System.out.println(Arrays.toString(((XWPFPicture) bodyElement).getPictureData().getData()));
                }
            }

            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

发现此遍历方式不能读取到图片,只能通过getAllPictures方法得到所有图片,但失去了段落和图片之间的顺序。经过探索,改正遍历方式:

java 复制代码
            for (IBodyElement element : bodyElements) {
                if (element instanceof XWPFParagraph) {
                    XWPFParagraph paragraph = (XWPFParagraph) element;
                    String text = paragraph.getText();
                    if (text != null && !text.isEmpty()) {
                      //处理段落或正文
                    } else {
                        // 顺序遍历图片
                        paragraph.getIRuns().forEach(run -> {
                            if (run instanceof XWPFRun) {
                                XWPFRun xWPFRun = (XWPFRun) run;
                                for (XWPFPicture picture : xWPFRun.getEmbeddedPictures()) {
                                    XWPFPictureData pictureData = picture.getPictureData();
                                    String base64Image = "<img src='data:image/png;base64," + Base64.getEncoder().encodeToString((pictureData.getData())) + "'/>";       
                                }
                            }
                        });
                    }
                } else if (element instanceof XWPFTable) {
                //处理表格
                    XWPFTable table = (XWPFTable) element;
                    String text = table.getText();
                }
            }

这样遍历就可以按顺序读取docx文件的内容了。

参考:stackoverflow

相关推荐
凤凰院凶涛QAQ3 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
H.莓飛3 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
wangchunyu1143 小时前
JAVA AQS与Lock实现原理(含CAS)
java·开发语言·word
爱喝水的鱼丶4 小时前
SAP-ABAP:ECC→S/4HANA ABAP 迁移升级指南——程序改造、语法兼容与性能优化 导语
运维·开发语言·性能优化·sap·abap·经验交流·开发交流
w_zero_one4 小时前
算法--模拟
java·数据结构·算法
小灰灰搞电子5 小时前
Rust+Slint 实现FTP客户端调试助手源码分享
开发语言·后端·rust
外收内放5 小时前
面向对象高级(实战案例)
开发语言·python·学习
Javatutouhouduan5 小时前
阿里1658页Java面试题总结(含答案)
java·高并发·java面试·java面试题·后端开发·java程序员·java八股文
秋天的怀念_David5 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
专业程序开发源5 小时前
springboot欧缇蔓月子中心管理系统82697-计算机课程设计、毕业设计
java·spring boot·后端·python·spring·django·课程设计