首页 技术 正文
技术 2022年11月23日
0 收藏 386 点赞 4,791 浏览 1842 个字

我们常用的 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;
}

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

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

点击下载源代码

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,910
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,435
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,250
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,061
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,693
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,731