【.net 深呼吸】导出 Office 文档中的图片
我们常用的 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 文档中的图片的更多相关文章
- VSTO 向office文档中插入内容
原文:VSTO 向office文档中插入内容 Word: Word.Selection sec = ThisAddIn.appWord.Selection; sec.Insert ...
- Java 用Freemarker完美导出word文档(带图片)
Java 用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...
- 【Java】用Freemarker完美导出word文档(带图片)
Java 用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...
- C# 提取Word文档中的图片
C# 提取Word文档中的图片 图片和文字是word文档中两种最常见的对象,在微软word中,如果我们想要提取出一个文档内的图片,只需要右击图片选择另存为然后命名保存就可以了,今天这篇文章主要是实现使 ...
- 在LaTeX文档中插入图片的几种常用的方法
LaTeX中一般只直接支持插入eps(Encapsulated PostScript)格式的图形文件, 因此在图片插入latex文档之前应先设法得到图片的eps格式的文件. 在LaTeX文档中插入图片 ...
- python、java、ruby、node等如何提取office文档中的内容?
我相信大家都有过这样的需求,把doc.ppt.excel.pdf.txt中的文本内容提取出来.提取出来的文本内容可用于文档内容的全文索引,文档的基本内容摘要等.在度娘上搜索“如何提取文档内容”,确实有 ...
- 利用POI操作不同版本号word文档中的图片以及创建word文档
我们都知道要想利用java对office操作最经常使用的技术就应该是POI了,在这里本人就不多说到底POI是什么和怎么用了. 先说本人遇到的问题,不同于利用POI去向word文档以及excel文档去写 ...
- php解析word,获得文档中的图片
背景 前段时间在写一个功能:用原生php将获得word中的内容并导入到网站系统中.因为文档中存在公式,图片,表格等,因此写的比较麻烦. 思路 大体思路是先将word中格式为doc的文档转化为docx, ...
- 第一节:python提取PDF文档中的图片
由于项目需要将PDF文档当中的图片转换成图片,所以参考了这篇文章https://blog.csdn.net/qq_15969343/article/details/81673302后项目得以解决. 1 ...
随机推荐
- 我的学习之路_第二十章_JDBC
JDBC 使用JDBC技术,通过mysql提供的驱动程序,操作数据库 ● 1. 注册驱动 告知jvm 使用的是什么驱动程序(mysql,oracle) 使用API中的类 DriverManager中的 ...
- 《javascript高级程序设计》笔记三
第三章 基本概念 任何语言的核心必然会描述这门语言最基本的工作原理.这部分内容对我们来说,读起来很乏味,甚至会产生困意,但这部分内容却是重要的!我有幸拜读<JavaScript高级程序设计> ...
- php Base64编码文件二进制流主要使用
<?php header( "Content-type: image/jpeg"); //$filename='1.jpg'; //$content=file_get_con ...
- 关于拒绝测试驱动开发(NoTDD)
今天在reddit看到微软某大牛的博客(https://blogs.msdn.microsoft.com/ericgu/2017/06/22/notdd/),说到拒绝TDD(测试驱动开发,下文统一使用 ...
- kindeditor使用入门-张国红
kindeditor是在线编辑器,比较好用,以下是使用这个插件的步骤. 下载kindeditor-4.1.10.zip 解压 asp,asp.net,php对于jsp开发没有用,可以删除 新建web工 ...
- 在ubuntu14.04上安装mono4.4 + jexus + mvc6
0.准备工作 在/usr下建立一个文件夹,方便管理源码 cd /usr mkdir opensource cd opensource 安装vim(文本编辑器,不习惯用vim可以换成其他的) apt-g ...
- 为实体类增加toJSON方法
后期子类继承该基础类即可. package com.lichmama.test; import java.io.Serializable; import java.lang.reflect.Field ...
- js通过Date获取日期
获取当前系统时间 var myDate = new Date();//获取系统当前时间 获取特定格式日期 myDate.getYear(); //获取当前年份(2位) myDate.getFullYe ...
- 【Unity与23种设计模式】状态模式(State)
定义: "让一个对象的行为随着内部状态的改变而变化,而该对象也像是换了类一样" 应用场景: 角色AI:控制角色在不同状态下的AI行为 服务器连接状态:开始连线.连线中.断线等状态 ...
- docker搭建zabbix
本次使用docker搭建zabbix的组合是mysql+docker+zabix-server 1 先安装数据库mysql docker run --name zabbix-mysql-server ...