导出office文件中所有图片

原创 2017年08月14日 10:13:34
Microsoft Office 2003及以前版本的Office默认的文件格式是:
.doc (Word)
.xls (Excel) 
.ppt (PowerPoint)

Microsoft Office 2007及后续版本(2010、2013、2016)默认的文件格式是:
.docx (Word)   
.xlsx (Excel)  

.pptx (PowerPoint)


提取office文件中的图片,可以把文档的后缀名改为 .zip,然后打开,在 media 目录下就能找到文档中插入的所有的图片文件。

.net 类库自带可以操作 zip 压缩文档的 API,我们可以用代码来完成。

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 = 1; //这个值用来自增长
            // 循环,直到生成不重复的文件名
            // 如果文件名已存在,就生成 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;
        }


源码在我的“低调程序员”群中,QQ群号:234215761.

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

让C#可以像Javascript一样操作Json

让C#可以像Javascript一样操作Json

快速导出PDF文件中所有图片(使用Adobe Acrobat 10 )

1、用Adobe Acrobat  X Pro打开一个含有图片的PDF 2、点击工具->文档处理->导出所有图像,这样就完成了对PDF文件中所有图片的导出。 如果没看到“文档处理”,可以点击...

jQuery上传文件到服务器,实现量上传及压缩包导入,支持Office文档、PDF、图像、音视频和图纸等各类型文件。上传完成后系统自动为图片、音、视频类文件增加摘要及缩略图

首先用到了jQuery的一个插件   zyupload 代码中设置上传文件的格式,写好对应的url路径,以及请求的参数等数据 视图:

本地和服务器导出Excel报“Microsoft Office Excel 不能访问文件” 解决方法

最近在服务器和本地调用delphi写的导出Excel 的webservices,出现一系列配置和权限问题,现在一一记录下来。 Error 信息: Server Error in '/' Applic...

CorelDRAW中怎么实现将文件导出到Office

CorelDRAW与Office应用程序(如Microsoft Word和WordPerfect Office)高度兼容,在CorelDRAW X7中,用户可将文件导出到Office来适用不同用途

java操作office和pdf文件页面列表导出cvs,excel、pdf报表.

java操作office和pdf文件页面列表导出cvs,excel、pdf报表.         在平常的开发中我们常常遇到不仅仅只是导出excel报表的情况。有时候也需要导出p...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)