当前位置: 首页 > news >正文

提取word文档里面的图片

  大家好,我是阿赵。
  阿赵我写博客的时候的习惯是,先用word文档写好,然后再把word文档里面的图片另存,最后再在博客里面复制正文和上传图片。
  而我写的文章一般配图都比较多,所以经常要做的一个功能就是另存图片。由于我没有买正版的Office工具,我用的是WPS工具来编辑word文档的。wps虽然是免费的,但它保存文档里面的所有图片是需要会员收费的,不然就只能一张一张图片手动保存。
  然而作为程序员,在觉得不该花钱的地方,我也是不会乱花的。我自己写了一个小程序,把文档里面的所有图片提取并保存,这里分享一下,这是一个用C#写的winform程序:
在这里插入图片描述

using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
using System;
using System.Windows.Forms;
using Tools;namespace PickWordTexture
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private string wordPath = "";private string savePath = "";private void ShowTips(string content){MessageBox.Show(content);}private bool ShowTipsSelect(string content){DialogResult result = MessageBox.Show(content, "提示", MessageBoxButtons.OKCancel);if(result == DialogResult.OK){return true;}else{return false;}}private void SetWordPath(string path){wordPath = path;string fullFileName = FilePathHelper.GetFileName(path);string fileName = FilePathHelper.RemoveExName(fullFileName);savePath = path.Replace(fullFileName,"")+fileName+"\\";UpdateView();}private void UpdateView(){wordPathTxt.Text = wordPath;savePathTxt.Text = savePath;}private void PickTextureFun(){if(string.IsNullOrEmpty(wordPath)||string.IsNullOrEmpty(savePath)){ShowTips("请先把需要提取的word文档拖动到窗口内");return;}if(FileManager.IsDirectoryExists(savePath)){if(ShowTipsSelect("保存的文件夹已经存在,将会覆盖,原有内容将会被删除,是否继续?")==true){FileManager.DelFolder(savePath);}else{return;}}Document document;string exName = FilePathHelper.GetExName(wordPath).ToLower();if(exName == "doc"){document = new Document(wordPath, FileFormat.Doc);}else{document = new Document(wordPath, FileFormat.Docx);}int count = 0;foreach(Section section in document.Sections){foreach(Paragraph paragraph in section.Paragraphs){foreach(DocumentObject docObject in paragraph.ChildObjects){if(docObject.DocumentObjectType == DocumentObjectType.Picture){DocPicture picture = docObject as DocPicture;string imgName = savePath + "Image_" + (count + 1) + ".png";FileManager.CheckFileSavePath(imgName);picture.Image.Save(imgName, System.Drawing.Imaging.ImageFormat.Png);count++;}}}}if(count == 0){ShowTips("文档里面没有图片");}else{ShowTips("提取到图片:" + count + "张");}}private void Form1_DragDrop(object sender, DragEventArgs e){string inputPath = ((Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString();string exName = FilePathHelper.GetExName(inputPath).ToLower();if(exName!="doc"&&exName!="docx"){ShowTips("只能拖动word文档(扩展名是doc或者docx)");}else{SetWordPath(inputPath);}}private void Form1_DragEnter(object sender, DragEventArgs e){if (e.Data.GetDataPresent(DataFormats.FileDrop)){e.Effect = DragDropEffects.Link;}else{e.Effect = DragDropEffects.None;}}private void pickTextureBtn_Click(object sender, EventArgs e){PickTextureFun();}}
}

  里面主要用到了Spire.Doc。然后还有一些我自己写的保存文件的工具类。这些工具类你们可以自己写IO方法替代一下,或者以后我再分享。
  把文档拖到工具上:
在这里插入图片描述

  工具会自动文档路径和保存路径
在这里插入图片描述

  点击提取所有图片,就提取完成了:
在这里插入图片描述

  在原来的文档旁边会新生成一个文件夹
在这里插入图片描述

  里面就是提取完的图片:
在这里插入图片描述

相关文章:

提取word文档里面的图片

大家好,我是阿赵。   阿赵我写博客的时候的习惯是,先用word文档写好,然后再把word文档里面的图片另存,最后再在博客里面复制正文和上传图片。   而我写的文章一般配图都比较多,所以经常要做的一个功能就是另存图片…...

MybatisPlus总结

一、MyBatis回顾 (1)什么是MyBatis:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映…...

使用 mitmproxy 抓包 grpc

昨天在本地执行 grpc 的 quick start(python版本的),我了解 grpc 内部使用的是 HTTP2,所以我就想着抓包来试试,下面就来记录一下这个过程中的探索。 注意:我的电脑上面安装了 Fiddler Classic,…...

【解决Jetson Nano 内存不足问题】纯命令行将 Conda 环境迁移到 SD 卡

前言 Jetson Nano 板载只有 16GB 的存储空间,在安装完 Ubuntu 和 Conda 环境后,剩余空间就捉襟见肘了,无法满足安装 PyTorch 等大型包的需求。此时如果你有一张SD卡,那么可以考虑将 Conda 环境迁移到 SD 卡上。 但网上的教程基本…...

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(七)- 向量算术指令格式

1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容: 这是一份关于向量扩展的详细技术文档,内容覆盖了向量指令集的多个关键方面,如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…...

顺序表的应用

文章目录 目录1. 基于动态顺序表实现通讯录项目2.顺序表经典算法2.1 [移除元素](https://leetcode.cn/problems/remove-element/description/)2.2 [合并两个有序数组](https://leetcode.cn/problems/merge-sorted-array/description/) 3. 顺序表的问题及思考 目录 基于动态顺序…...

2024-04-03-代码随想录算法训练营第一天[LeetCode704二分查找、LeetCode27移除元素]

文章目录 第一题解法一[左闭右开]解法二[左闭右闭]总结 第二题解法一[暴力解法]解法二[双指针法]总结 第一题 LeetCode704二分查找 解法一[左闭右开] class Solution { public:int search(vector<int>& nums, int target) {int size nums.size();int right size…...

[Go运行问题]/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_xx‘ not found

问题描述 在一台ubuntu 20的机器上通过go 编译生成的可执行程序(使用了cgo)&#xff0c;在其他ubuntu机器上运行时出现如下问题 /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32 not found 问题分析 因为go代码里的依赖库使用到了sndfile&#xff0c;它必须使用cgo了…...

matrix-breakout-2-morpheus 靶机渗透

信息收集&#xff1a; 1.nmap存活探测&#xff1a; nmap -sn -r 192.168.10.1/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-06 12:13 CST Nmap scan report for 192.168.10.1 Host is up (0.00056s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap…...

爬虫 新闻网站 以湖南法治报为例(含详细注释) V1.0

目标网站&#xff1a;湖南法治报 爬取目的&#xff1a;为了获取某一地区更全面的在湖南法治报已发布的宣传新闻稿&#xff0c;同时也让自己的工作更便捷 环境&#xff1a;Pycharm2021&#xff0c;Python3.10&#xff0c; 安装的包&#xff1a;requests&#xff0c;csv&#xff…...

物联网实战--入门篇之(十)安卓QT--后端开发

目录 一、项目配置 二、MQTT连接 三、数据解析 四、数据更新 五、数据发送 六、指令下发 一、项目配置 按常规新建一个Quick空项目后&#xff0c;我们需要对项目内容稍微改造、规划下。 首先根据我们的需要在.pro文件内添加必要的模块&#xff0c;其中quick就是qml了&…...

[Java]网络编程

网络编程概述 计算机网络&#xff1a; 把分布在不同地理区域的具有独立功能的计算机,通过通信设备与线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统。 Java是 Internet 上的语言&#xff0c;它从语言级上提供了对网络应用程序的支持&#xff0c;程序…...

重读Java设计模式: 适配器模式解析

引言 在软件开发中&#xff0c;经常会遇到不同接口之间的兼容性问题。当需要使用一个已有的类&#xff0c;但其接口与我们所需的不兼容时&#xff0c;我们可以通过适配器模式来解决这一问题。适配器模式是一种结构型设计模式&#xff0c;它允许接口不兼容的类之间进行合作。本…...

MySQL面试题系列-9

MySQL是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的RDBMS (Relational Database Management System&#xff0c;关系数据…...

书生·浦语训练营二期第二次笔记

文章目录 1. 部署 InternLM2-Chat-1.8B 模型进行智能对话1.1 配置环境1.2 下载 InternLM2-Chat-1.8B 模型 2. 实战&#xff1a;部署实战营优秀作品 八戒-Chat-1.8B 模型2.1 配置基础环境2.2 使用 git 命令来获得仓库内的 Demo 文件&#xff1a;2.3 下载运行 Chat-八戒 Demo 3. …...

python_3

文章目录 题目运行结果模式A模式B模式C模式D 题目 mode input("请选择模式:") n int(input("请输入数字:"))if mode "A" or mode "a":# 模式A n:输入的层数 i:当前的层数# 每行数字循环次数 ifor i in range(1, n 1):for j in r…...

【Python】 使用Apache Tika和Python实现zip、csv、xls等多格式文件文本内容提取

时间的电影 结局才知道 原来大人已没有童谣 最后的叮咛 最后的拥抱 我们红着眼笑 我们都要把自己照顾好 好到遗憾无法打扰 好好的生活 好好的变老 好好假装我 已经把你忘掉 &#x1f3b5; 五月天《好好》 在进行数据分析、搜索引擎优化或任何需要处理大量…...

C语言如何将多维数组名作为函数参数?

一、问题 ⼦函数执⾏时&#xff0c;整个多维数组是由主函数决定的&#xff0c;这时就要把多维数组的数组名作为函数参数传递给⼦函数。那么在C程序中&#xff0c;怎样将多维数组名作函数参数进⾏传递&#xff1f; 二、解答 以⼆维数组为例&#xff0c;其格式如下。 形参定义&…...

2013年认证杯SPSSPRO杯数学建模C题(第二阶段)公路运输业对于国内生产总值的影响分析全过程文档及程序

2013年认证杯SPSSPRO杯数学建模 C题 公路运输业对于国内生产总值的影响分析 原题再现&#xff1a; 交通运输作为国民经济的载体&#xff0c;沟通生产和消费&#xff0c;在经济发展中扮演着极其重要的角色。纵观几百年来交通运输与经济发展的相互关系&#xff0c;生产水平越高…...

《LeetCode力扣练习》代码随想录——二叉树(合并二叉树---Java)

《LeetCode力扣练习》代码随想录——二叉树&#xff08;合并二叉树—Java&#xff09; 刷题思路来源于 代码随想录 617. 合并二叉树 二叉树-前序遍历 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode…...

openstack云计算(二)——使用Packstack安装器安装一体化OpenStack云平台

初步掌握OpenStack快捷安装的方法。掌握OpenStack图形界面的基本操作。 一【准备阶段】 &#xff08;1&#xff09;准备一台能够安装OpenStack的实验用计算机&#xff0c;建议使用VMware虚拟机。 &#xff08;2&#xff09;该计算机应安装CentOS 7&#xff0c;建议采用CentO…...

Flutter Don‘t use ‘BuildContext‘s across async gaps.

Flutter提示Don‘t use ‘BuildContext‘s across async gaps.的解决办法—flutter里state的mounted属性...

基于SSM+Jsp+Mysql的个性化影片推荐系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…...

循环队列的实现及应用——桶排序bucket_sort、基数排序radix_sort

一、循环队列的实现 代码解释 1、完成初始化 2、定义方法 3、测试实例 4、完整代码 class AQueue:def __init__(self, size=10):self.__mSize = sizeself.__front=0self.__rear = 0self.__listArray = [None] * size#清空元素def clear(self):self.__front = 0self.__rear =…...

ubuntu16如何使用高版本cmake

1.引言 最近在尝试ubuntu16.04下编译开源项目vsome&#xff0c;发现使用apt命令默认安装cmake的的版本太低。如下 最终得知&#xff0c;ubuntu16默认安装确实只能到3.5.1。解决办法只能是源码安装更高版本。 2.源码下载3.20 //定位到opt目录 cd /opt 下载 wget https://cmak…...

电商-广告投放效果分析(KMeans聚类、数据分析-pyhton数据分析

电商-广告投放效果分析&#xff08;KMeans聚类、数据分析&#xff09; 文章目录 电商-广告投放效果分析&#xff08;KMeans聚类、数据分析&#xff09;项目介绍数据数据维度概况数据13个维度介绍 导入库&#xff0c;加载数据数据审查相关性分析数据处理建立模型聚类结果特征分析…...

练习 16 Web [极客大挑战 2019]LoveSQL

extractvalue(1,concat(‘~’, (‘your sql’) ) )报错注入&#xff0c;注意爆破字段的时候表名有可能是table_name不是table_schema 有登录输入框 常规尝试一下 常规的万能密码&#xff0c;返回了一个“admin的密码”&#xff1a; Hello admin&#xff01; Your password is…...

C++——栈和队列容器

前言&#xff1a;这篇文章我们将栈和队列两个容器放在一起进行分享&#xff0c;因为这两个要分享的知识较少&#xff0c;而且两者在结构上有很多相似之处&#xff0c;比如栈只能在栈顶操作&#xff0c;队列只能在队头和队尾操作。 不同于前边所分享的三种容器&#xff0c;这篇…...

Java集合(个人整理笔记)

目录 1. 常见的集合有哪些&#xff1f; 2. 线程安全的集合有哪些&#xff1f;线程不安全的呢&#xff1f; 3. Arraylist与 LinkedList 异同点&#xff1f; 4. ArrayList 与 Vector 区别&#xff1f; 5. Array 和 ArrayList 有什么区别&#xff1f;什么时候该应 Array而不是…...

Redis -- 缓存穿透问题解决思路

缓存穿透 &#xff1a;缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库。 常见的解决方案有两种&#xff1a; 缓存空对象 优点&#xff1a;实现简单&#xff0c;维护方便 缺点&#xff1a; 额外…...

盐城滨海建设局网站/百度极速版推广员怎么申请

转载&#xff1a;http://www.layui.com/doc/modules/layer.html 弹层组件文档 - layui.layerlayer 至今仍作为 layui 的代表作&#xff0c;她的受众广泛并非偶然&#xff0c;而是这数年来的坚持、不弃的执念&#xff0c;将那些不屑的眼光转化为应得的尊重&#xff0c;不断完善和…...

时时彩网站开发教程/外贸展示型网站建设公司

The Castle城堡 IOI94 - Day 1 我们憨厚的USACO主人公农夫约翰(Farmer John)以无法想象的运气,在他生日那天收到了一份特别的礼物&#xff1a;一张“幸运爱尔兰”&#xff08;一种彩票&#xff09;。结果这张彩票让他获得了这次比赛唯一的奖品——坐落于爱尔兰郊外的一座梦幻般…...

wordpress 树状目录结构/百度小说排行榜前十名

泰勒公式的通俗理解 1. 泰勒公式在做什么&#xff1f; 泰勒公式在用多项式函数&#xff0c;逼近一个复杂函数 f(x)f(x)f(x) 2. 泰勒公式是如何做的&#xff1f; 多项式中的 aaa 表示泰勒公式的展开位置 若 a2a2a2 则在 x2x2x2 处展开&#xff0c;即这个多项式函数在 x2x2x2 处…...

网站建设学费/长沙官网seo收费标准

文档部分代码不常用&#xff0c;所以整理一份常用的代码&#xff0c;便于CV 目录 ElementUI&#xff1a;组件库之Loading 加载...

沧州网站的公众号/公司网址怎么制作

前缀和对 K 取模&#xff0c;统计答案的时候就是前面有多少个前缀和与该位置前缀和 % K 下相等&#xff0c;这样相减之后这些区间和 % K 下等于 0&#xff0c;也就是 K 的倍数了&#xff0c;我用分块来维护(数据结构学傻了&#xff0c;其实只需要开一个桶统计一个位置加入一个计…...

农八师建设兵团社保网站/厦门seo网络推广

Parameter xxx not found. Available parameters are [...] 1.Dao.java中 方法传入参数字段前添加Param("xxx") 2.注意&#xff01;&#xff01;&#xff01; Param的包别导错了 ---import org.apache.ibatis.annotations.Param; 千万别导入spring的。。转载于:htt…...