我们常用的 Office 文档其实就三种——Word、Excel、PowerPoint,分别对应的扩展名为:.docx、.pptx、.xlsx。

许多教程都告诉我们,要提取这些文件中的图片(其实像视频之类的媒体文件也一样),可以把文档的后缀名改为 .zip,然后打开,在 media 目录下就能找到文档中插入的图片文件。

要是嫌手动操作麻烦,其实我们完全可以用代码来完成。.net 类库自带可以操作 zip 压缩文档的 API,所以,我们不需要去找第六方组件。

好,F话少说,咱们开始吧,其实很是简单的。

            try
{
ZipArchive zdoc = ZipFile.OpenRead(txtInput.Text);
// 搜索
foreach (ZipArchiveEntry et in zdoc.Entries)
{
// 分析文件后缀
if (et.Name.Contains(".jpg") || et.Name.Contains(".jpeg") || et.Name.Contains(".png"))
{
listBox1.Items.Add(et.FullName);
// 把文件实体复制到外部文件中
using (Stream strm = et.Open())
{
string path = BuildPath(txtOutput.Text, et.Name);
FileStream fsout = File.Open(path, FileMode.OpenOrCreate);
strm.CopyTo(fsout);
fsout.Close();
}
}
}
}
catch(Exception ex)
{
System.Diagnostics.Debug.WriteLine($"EXCEPTION: {ex.Message}");
MessageBox.Show("你的人品值不足,请及时充值。");
}
finally
{
……
}

注意,你要引入以下两个程序集:

System.IO.Compression

System.IO.Compression.FileSystem

我们直接把 Office 文件当成zip文件来处理就行了,调用 ZipFile 类的 OpenRead 方法(静态),可以以只读方式打开文件,我们这里只要读出图片文件就行了,所以只读方式打开就够了。打开文件后,返回一个 ZipArchive 实例,它表示一个zip文档的实例。

压缩档中的文件是以一个个实体的形式存放的,每个实体用一个 ZipArchiveEntry 实例封装,所以我们要通过循环,筛选出后缀为 .jpg、.jpeg、.png的文件。

找出相关的实体后就好办了,直接将文件流复制到输出流中即可。

                        using (Stream strm = et.Open())
{
string path = BuildPath(txtOutput.Text, et.Name);
FileStream fsout = File.Open(path, FileMode.OpenOrCreate);
strm.CopyTo(fsout);
fsout.Close();
}

这里用到一个 BuildPath 方法,是个自定义方法,目的是组装文件名,如果文件已存在,就生成像 abc(1)  abc(2) 这样的文件名。代码如下。

        /// <summary>
/// 该方法用来生成新的路径
/// </summary>
/// <param name="dir">要存放的目录</param>
/// <param name="fn">实体文件名</param>
/// <returns></returns>
string BuildPath(string dir, string fn)
{
string tmpPath = Path.Combine(dir, fn);
int i = ; //这个值用来自增长
// 循环,直到生成不重复的文件名
// 如果文件名已存在,就生成 xxx(1)、xxx(2)、xxx(3)这样的文件名
while (File.Exists(tmpPath))
{
// 不含后缀的文件名
string fn_1 = Path.GetFileNameWithoutExtension(fn);
// 扩展名,如.txt
string fn_ext = Path.GetExtension(fn);
// 重组文件名
string _fn = $"{fn_1}({i}){fn_ext}";
// 重组路径
tmpPath = Path.Combine(dir, _fn);
i++;
}
return tmpPath;
}

好了,就这么简单,完事了。

具体的,大家可以看源代码。

点击下载源代码

【.net 深呼吸】导出 Office 文档中的图片的更多相关文章

  1. VSTO 向office文档中插入内容

    原文:VSTO 向office文档中插入内容 Word: Word.Selection sec = ThisAddIn.appWord.Selection;            sec.Insert ...

  2. Java 用Freemarker完美导出word文档(带图片)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  3. 【Java】用Freemarker完美导出word文档(带图片)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  4. C# 提取Word文档中的图片

    C# 提取Word文档中的图片 图片和文字是word文档中两种最常见的对象,在微软word中,如果我们想要提取出一个文档内的图片,只需要右击图片选择另存为然后命名保存就可以了,今天这篇文章主要是实现使 ...

  5. 在LaTeX文档中插入图片的几种常用的方法

    LaTeX中一般只直接支持插入eps(Encapsulated PostScript)格式的图形文件, 因此在图片插入latex文档之前应先设法得到图片的eps格式的文件. 在LaTeX文档中插入图片 ...

  6. python、java、ruby、node等如何提取office文档中的内容?

    我相信大家都有过这样的需求,把doc.ppt.excel.pdf.txt中的文本内容提取出来.提取出来的文本内容可用于文档内容的全文索引,文档的基本内容摘要等.在度娘上搜索“如何提取文档内容”,确实有 ...

  7. 利用POI操作不同版本号word文档中的图片以及创建word文档

    我们都知道要想利用java对office操作最经常使用的技术就应该是POI了,在这里本人就不多说到底POI是什么和怎么用了. 先说本人遇到的问题,不同于利用POI去向word文档以及excel文档去写 ...

  8. php解析word,获得文档中的图片

    背景 前段时间在写一个功能:用原生php将获得word中的内容并导入到网站系统中.因为文档中存在公式,图片,表格等,因此写的比较麻烦. 思路 大体思路是先将word中格式为doc的文档转化为docx, ...

  9. 第一节:python提取PDF文档中的图片

    由于项目需要将PDF文档当中的图片转换成图片,所以参考了这篇文章https://blog.csdn.net/qq_15969343/article/details/81673302后项目得以解决. 1 ...

随机推荐

  1. dubbo与zookeeper的关系

    Dubbo建议使用Zookeeper作为服务的注册中心. 1.   Zookeeper的作用: zookeeper用来注册服务和进行负载均衡,哪一个服务由哪一个机器来提供必需让调用者知道,简单来说就是 ...

  2. webpack前端工程化构建工具的使用

    一.模块打包机 1.创建文件 在目标文件下建立一个src文件夹作为js代码区:作为例子,我创建了两个js文件,并利用commonJS规范require引入到index.js中: moduleA.js: ...

  3. docker 初识之二(简单发布ASP.NET Core 网站)

    在发布ASP.NET Core网站以前,先介绍一下DaoCloud 一个免费的docker云容器服务平台.登陆官方网站,创建一台docker主机,这台主机有120分钟的使用时间,对于鄙人学习使用正好合 ...

  4. tomcat7的web.xml的xml片段与注解资源的发现处理逻辑

    1.metadata-complete 属性 Servlet 3.0 的部署描述文件 web.xml 的顶层标签 <web-app> 有一个 metadata-complete 属性,该属 ...

  5. JQuery事件机制笔记

    一.事件绑定及移除 1.bind() bind()为每个匹配的元素绑定一个或多个事件处理函数: 语法:bind(event,fn)//不能给未来元素添加事件: bind(event,fn); bind ...

  6. Spring+SpringMVC+MyBatis深入学习及搭建(十七)——SpringMVC拦截器

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7098753.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十六)--S ...

  7. java基础(11) -JDBC

    java基础(11) -JDBC jdbc 1.装载驱动 载入跟数据库建立连接的驱动 /* sql server: String className ="com.microsoft.sqls ...

  8. 优雅的封装ajax,含跨域

    之前写过一篇 先定一个小目标,自己封装个ajax,是基于原生js的,也就是jquery中ajax的简化版本实现的思路.众所周知,jquery的ajax是项目中最常用的请求后台的方式,也算是封装的很完美 ...

  9. 关于Calendar中设置月份比实际小1的问题

    有如下程序,转化两个字符串数字为date类型,并判断是历史上的星期几,是否同为星期一 代码如下: public static void main(String[] args) throws Parse ...

  10. Java Jpa 规范

    Jpa最早是EJB3.0里面的内容,JSR 220: Enterprise JavaBeansTM 3.0 https://www.jcp.org/en/jsr/detail?id=220 后来大约在 ...