Java poi之word文本图片内容提取

news2024/9/20 8:11:23

目录结构

    • 前言
    • 文档准备
    • 引入Maven依赖
    • 代码块
    • 提取结果验证
        • 孤勇者提取结果
        • 青鸟提取结果对比

前言

应公司需求,需实现以下功能

  1. word文本内容的替换;
  2. word文本内容的提取;
  3. word文档中图片的提取存放

此文章将使用Apache POI实现Word文档中文本内容及图片的提取;

Apache POI 是基于 Office Open XML 标准(OOXML)和 Microsoft 的 OLE 2 复合文档格式(OLE2)处理各种文件格式的开源项目。 简而言之,您可以使用 Java 读写 MS Excel 文件,可以使用 Java 读写 MS Word 和 MS PowerPoint 文件。

  • HSSF - 提供读写 Microsoft Excel XLS 格式 (Microsoft Excel 97 (-2003)) 档案的功能。
  • XSSF - 提供读写 Microsoft Excel OOXML XLSX 格式 (Microsoft Excel XML (2007+)) 档案的功能。
  • SXSSF - 提供低内存占用量读写 Microsoft Excel OOXML XLSX 格式档案的功能。
  • HWPF - 提供读写 Microsoft Word DOC97 格式 (Microsoft Word 97 (-2003)) 档案的功能。
  • XWPF - 提供读写 Microsoft Word DOC2003 格式 (WordprocessingML (2007+)) 档案的功能。
  • HSLF/XSLF - 提供读写 Microsoft PowerPoint 格式档案的功能。
  • HDGF/XDGF - 提供读 Microsoft Visio 格式档案的功能。
  • HPBF - 提供读 Microsoft Publisher 格式档案的功能。
  • HSMF - 提供读 Microsoft Outlook 格式档案的功能。

文档准备

小编准备了以下两个文档:《孤勇者.doc》《青鸟.docx》,分别代表不同版本的文档,里边分别记录了各自的歌词及宣传画,以便提取测试,如下图
在这里插入图片描述

引入Maven依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>4.1.2</version>
</dependency>

代码块

package com.bjzaxk.utils;

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.hwpf.model.PicturesTable;
import org.apache.poi.hwpf.usermodel.CharacterRun;
import org.apache.poi.hwpf.usermodel.Picture;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFPictureData;

import java.io.*;
import java.util.List;

public class Demo {
    public static void main(String[] args) {
        String filePath = "C:\\Users\\Administrator\\Desktop\\java_poi\\demo_file\\孤勇者.doc";
        String formart = "DOC";
//        String filePath = "C:\\Users\\Administrator\\Desktop\\java_poi\\demo_file\\青鸟.docx";
//        String formart = "DOCX";
        // 文本提取后存放路径及文件名
        String extractFilePath = "C:\\Users\\Administrator\\Desktop\\java_poi\\demo_file\\孤勇者.txt";
//        String extractFilePath = "C:\\Users\\Administrator\\Desktop\\java_poi\\demo_file\\青鸟.docx";
        // 图片提取后存放路径
        String imageFilePath = "C:\\Users\\Administrator\\Desktop\\java_poi\\demo_file\\";

        // 提取word中的文字
        wordTextExtract(filePath, formart, extractFilePath);
        // 提取word中的图片
        imageExtract(filePath, formart, imageFilePath);
    }

    /**
     * @description: 提取word中的文字
     * @author: Mr.Jkx
     * @time: 2023/1/10 14:17
     */
    public static void wordTextExtract(String filePath, String formart, String extractFilePath) {
        try {// 创建存放提取数据的文件
            FileWriter fw = new FileWriter(extractFilePath);
            BufferedWriter bw = new BufferedWriter(fw);

            if ("DOCX".equals(formart)) {
                // 读取docx文件
                InputStream in = new FileInputStream(filePath);
                XWPFDocument document = new XWPFDocument(in);
                XWPFWordExtractor re = new XWPFWordExtractor(document);
                re.close();

                // 将内容写入新文件中
                bw.write(re.getText());
                bw.close();

            } else if ("DOC".equals(formart)) {
                InputStream in = new FileInputStream(filePath);
                WordExtractor wordExtractor = new WordExtractor(in);
                // 将内容写入新文件中
                bw.write(wordExtractor.getText());
                bw.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @description: 提取word中的图片
     * @author: Mr.Jkx
     * @time: 2023/1/10 14:26
     */
    public static void imageExtract(String filePath, String formart, String imageFilePath) {
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream(new File(filePath));
            if ("DOCX".equals(formart)) {
                XWPFDocument document = new XWPFDocument(fileInputStream);
                List<XWPFPictureData> picList = document.getAllPictures();
                for (XWPFPictureData pic : picList) {
                    byte[] bytev = pic.getData();
                    FileOutputStream fos = new FileOutputStream(imageFilePath + pic.getFileName());
                    fos.write(bytev);
                }
                fileInputStream.close();
            } else if ("DOC".equals(formart)) {
                HWPFDocument doc = new HWPFDocument(fileInputStream);
                int length = doc.characterLength();
                PicturesTable pTable = doc.getPicturesTable();
                for (int i = 0; i < length; i++) {
                    Range range = new Range(i, i + 1, doc);
                    CharacterRun cr = range.getCharacterRun(0);
                    if (pTable.hasPicture(cr)) {
                        Picture pic = pTable.extractPicture(cr, false);

                        String afileName = pic.suggestFullFileName();
                        OutputStream out = new FileOutputStream(new File(imageFilePath + System.currentTimeMillis() + afileName));
                        pic.writeImageContent(out);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileInputStream != null) {
                try {
                    // 关闭资源
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    LoggerSetting.Instance().setWorkInfo("读取Word文件失败...");
                }
            }
        }
    }
}

提取结果验证

  • 提取文本会存放于一个txt文件中(小编工作需求,其他类型文件未尝试!);
  • 提取的图片会存放于“imageFilePath ”路径中,准备的文档中只有一张图片,多张图片的情况下,提取完成会在存放路径中有多张图片(在此不再展示);
  • 提取过程中不会改变原本word内容;

孤勇者提取结果

在这里插入图片描述

青鸟提取结果对比

  • DOCX类型的文档使用XWPF提取文字,存储后用电脑自带的“文本文档”打开是没有格式的,小编这里用的是“Notepad++”打开截图的,如默认软件打开无格式无须担心,换个软件即可;

XWPF - 提供读写 Microsoft Word DOC2003 格式 (WordprocessingML (2007+)) 档案的功能。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/197206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023-2-3 刷题情况

二叉树着色游戏 题目描述 有两位极客玩家参与了一场「二叉树着色」的游戏。游戏中&#xff0c;给出二叉树的根节点 root&#xff0c;树上总共有 n 个节点&#xff0c;且 n 为奇数&#xff0c;其中每个节点上的值从 1 到 n 各不相同。 最开始时&#xff1a; 「一号」玩家从 …

BIGEMAP GIS Office添加离线地图

BIGEMAP GIS Office添加离线地图发布时间&#xff1a;2019-01-04 版权&#xff1a;BIGEMAP添加离线地图相关应用&#xff1a;搭建 离线地图 二次开发目的&#xff1a;搭建内网地图服务器&#xff0c;内网中可多人访问的地图服务&#xff0c;无需上网工具下载&#xff1a;1、BIG…

2023年企业必不可少的私域运营系统

随着人口红利消失、流量越来越贵、公域转化越来越难&#xff0c;2023年&#xff0c;能够提升用户全生命周期的私域运营&#xff0c;已经成为企业不得不做的事。 面对这种情况&#xff0c;企业必须要引入一款专业且高效的私域运营利器&#xff0c;来实现高效率私域运营管理。快…

二叉树层次遍历的C语言实现

二叉树 树是n个节点的有限集 每个节点事多有两颗子树的树称为 二叉树 二叉树的层次遍历 使用队列的数据结构&#xff0c;从树的根结点开始&#xff0c;依次将其左孩子和右孩子入队。而后每次队列中一个结点出队&#xff0c;都将其左孩子和右孩子入队&#xff0c;直到树中所有结…

Linux——死锁概念介绍和解决方式

目录 一.死锁概念介绍 二.死锁的解决方式 &#xff08;一&#xff09;.预防死锁 方式一&#xff1a;不请求 方式二&#xff1a;强制剥夺资源 方式三&#xff1a;线性分配资源 &#xff08;二&#xff09;.避免死锁&#xff1a;银行家算法 总体流程 安全性检查&#xf…

C语言---冒泡排序和快速排序

文章目录前言一、冒泡排序1.简介2.算法思路3.代码实现二、快速排序1.简介2.算法思路2.1左右指针法2.2挖坑法2.3前后指针法总结前言 交换排序有冒泡排序和快速排序这两种&#xff0c; 基本思想&#xff1a;所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两…

多目标跟踪:文献综述

文章目录摘要1、简介1.1、与其他相关综述的区别1.2、贡献1.3、综述的结构1.4. 外延2、 MOT问题2.1、问题公式化2.2、MOT的分类2.2.1、初始化方法2.2.2、处理方式2.2.3、输出类型2.2.4. 讨论3、MOT的组成3.1、外观模型3.1.1、视觉表征3.1.2. 统计测量3.2、运动模型3.2.1. 线性运…

安装httprunner manager遇到的坑

安装httprunner manager参考博客&#xff1a;https://www.cnblogs.com/MrqiuS/p/12944481.html安装mysqlclient报错Collecting mysqlclient1.3.12Downloading https://mirrors.aliyun.com/pypi/packages/6f/86/bad31f1c1bb0cc99e88ca2adb7cb5c71f7a6540c1bb001480513de76a931/m…

maven利用springboot的配置文件进行多个环境的打包

在Spring Boot中多环境配置文件名需要满足application-{profiles.active}.properties的格式&#xff0c;其中{profiles.active}对应你的环境标识&#xff0c;可以随意命名&#xff0c;但要与pom文件中环境标识一样。至于哪个具体的配置文件会被加载&#xff0c;需要在applicati…

Docker系列 01

前言 学完这篇文章&#xff0c;你会知道Docker是什么&#xff1f;解决了什么问题以及如何安装Docker。在后续的系列文章中&#xff0c;我们会陆续介绍Docker的常用命令、镜像原理、Dockerfile以及网络管理等&#xff0c;让你对Docker有较为系统的认知&#xff0c;持续关注吧。 …

多继承的运用

//在封装一个领导类&#xff08;Leader&#xff09;:包括受保护成员&#xff1a;岗位、工资&#xff0c;完成其相关函数及show//由以上两个类共同把派生出学生干部类&#xff1a;引入私有成员&#xff1a;管辖人数&#xff0c;完成其相关函数以及show函数//在主程序中&#xff…

一刷代码随想录——动态规划

1.理论基础如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪心&#xff0c;贪心没有状态推导&#xff0c;而是从局部直接选最优的。对于动态规划问题&#xff0c;我将拆解…

24考研——高等数学的基础概念定理(一)——第一章|函数、极限、连续

今天考试&#xff0c;考定理&#xff0c;我是真没想到这些定理&#xff0c;脑袋瓜子嗡嗡的&#xff0c;害&#xff0c;废话少说&#xff0c;直接开干 文章目录一、基础概念定理1.1 收敛数列的性质&#xff08;唯一性、有界性、保号性、数列与子列关系&#xff09;1.2 函数极限的…

一款语文老师写的word办公神级插件

没错&#xff0c;正如题所说&#xff0c;这是一款语文老师开发的word办公神级插件----不坑盒子&#xff0c;小编体验了一下还真是太强大了&#xff01;双击exe文件&#xff0c;选择任意安装目录即可开始安装如果你的电脑缺少运行库&#xff0c;软件会自动帮你下载安装好安装完成…

QT模块化编程 pro pri 子工程 使用

如果工程过大时&#xff0c;就需要分子模块&#xff0c;Qt 也给我们提供了一种方式 Pri&#xff1b; 这里我们来看看Pri在项目中的使用&#xff0c;项目使用实际上也是很有主要可以模块清晰化&#xff0c;能提高程序的可扩展性。 网上这种写的很多&#xff0c;但少有写明白的&…

EGFR靶点药物研发进展-销售数据-上市药品前景分析

根据世界卫生组织的最新报告&#xff0c;与世界上其他癌症相比&#xff0c;肺癌导致的死亡率最高。非小细胞肺癌 (NSCLC) 约占肺癌病例总数的 85%。大量的风险因素归因于肺癌的发展&#xff0c;表皮生长因子受体 (EGFR) 是最常见的突变驱动基因之一&#xff0c;通过调节 PI3K/A…

Sentinel之授权规则与规则持久化

一、上集回顾上级文章地址&#xff1a;【SpringCloud】Sentinel 之隔离与降级_面向架构编程的博客-CSDN博客我们先来回顾一下Sentinel控制台上面的功能&#xff1a;所以&#xff0c;本章节就来研究 "授权规则"这一功能模块。二、授权规则授权规则可以对请求方来源做判…

XV6实验(2020)

XV6实验记录(2020) 环境搭建 参考连接 Lab guidance (mit.edu) 6.S081 / Fall 2020 (mit.edu) xv6 book中文版 Lab1:Xv6 and Unix utilities 实现几个unix实用工具&#xff0c;熟悉xv6的开发环境以及系统调用 Boot xv6 就是准备环境&#xff0c;克隆仓库&#xff0c;编…

代码随想录算法训练营第五十三天|● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划

一、1143.最长公共子序列 题目&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;也可以不…

Android 自定义控件

文章目录Canvas 画布类 画布背景 点 线 矩形 椭圆 圆 弧形 路径 字符 对画布裁剪及变形Paint 画笔类 常用方法 图形线条相关 字符相关 Path设置样式如果是一个自定义控件&#xff0c;则需要派生自 Vie…