c# 提取word文件中的图片问题

最近遇到一个项目就是要从一份word中提取出所有的图片信息,功能看起来不是很难,只要使用office自带的Microsoft.Office.Interop.Word就可以解决问题。网上也有不少的文章来说明如何去实现。不过总体来说网上的内容分为两派一个是使用剪贴板来实现,一个是通过将图片转为byte数组来完成。个人倾向于后者,但是在实践过程中遇到了问题。

问题一:通过byte的方式来实现图片的提取会导致提取出来的图片的质量严重下降,这样的图片质量下降是无法通过修改图片质量的代码来优化和提高的。目前为止我还没有想到什么办法来很好的解决,只能是换方法来实现, 不过个人猜想是因为word中图片的dpi问题导致,因为原本很小的图片导出后就会变的很大(尺寸)。所以不得不使用剪贴板的方法来实现,但是用第一种方法也会有局限性。

下面分别的贴出实现的代码

第一种,通过byte的方式,关键语句为(byte[])shape.Range.EnhMetaFileBits;

foreach(InlineShape shape in item.Range.InlineShapes)
{
  if (shape.Type == WdInlineShapeType.wdInlineShapePicture)
  {
    //获取Word中的图片
    byte[] img = (byte[])shape.Range.EnhMetaFileBits;
    Bitmap bmp = new Bitmap(new MemoryStream(img));
  }
}

第二种,通过剪贴板,如下

foreach (InlineShape shape in item.Range.InlineShapes)
{
    //判断类型
    if (shape.Type == WdInlineShapeType.wdInlineShapePicture)
    {
        //利用剪贴板保存数据
        shape.Select(); //选定当前图片
        WordApp.Selection.Copy();//copy当前图片
        if (Clipboard.ContainsImage())
        {
            Bitmap bmp = new Bitmap(Clipboard.GetImage());
            fileName = System.Guid.NewGuid() + defaultPicExtension;
            bmp.Save(savePath + fileName, System.Drawing.Imaging.ImageFormat.Png);
        }
    }
}

问题二:通过控制台的方式编写程序可能会遇到剪贴板无法使用的事情,需要引用System.Window.Form来解决问题。

希望有经验的朋友可以帮忙解释一下第一种方法的问题所在,最后贴上实现的全部代码

private void bt_readreport_Click(object sender, EventArgs e)
{
    //初始化控件值
    ClearControl();
    StringBuilder reportContent = new StringBuilder();

object Nothing = System.Reflection.Missing.Value;
    object filename = "文件完整路径和名称";
    Microsoft.Office.Interop.Word.Application WordApp = new Microsoft.Office.Interop.Word.ApplicationClass();
    Microsoft.Office.Interop.Word.Document WordDoc = WordApp.Documents.Open(ref filename, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing);
    //循环文章中的各个章节
    foreach (Paragraph item in WordDoc.Paragraphs)
    {
        if (item != null)
        {
            if (item.Range.Text.Trim() != "")
            {
                //判断该范围内是否存在图片
                if (item.Range.InlineShapes.Count != 0)
                {
                    foreach (InlineShape shape in item.Range.InlineShapes)
                    {
                        //判断类型
                        if (shape.Type == WdInlineShapeType.wdInlineShapePicture)
                        {
                            //利用剪贴板保存数据
                            shape.Select(); //选定当前图片
                            WordApp.Selection.Copy();//copy当前图片
                            string fileName = "";
                            if (Clipboard.ContainsImage())
                            {
                                Bitmap bmp = new Bitmap(Clipboard.GetImage());
                                fileName = System.Guid.NewGuid() + ".png";
                                bmp.Save(savePath + fileName, System.Drawing.Imaging.ImageFormat.Png);
                            }
                        }
                    }
                }
                //在总目录中添加相应信息
                reportContent.AppendLine(item.Range.Text.Trim());
            }
        }
    }
    WordDoc.Close(ref Nothing, ref Nothing, ref Nothing);
    WordApp.Quit(ref Nothing, ref Nothing, ref Nothing);
}

对了,Png的效果要比JPG好,而且文件也不大,推荐使用

时间: 2025-01-11 20:02:35

c# 提取word文件中的图片问题的相关文章

电脑中如何提取PDF文件中的图片

通常,我们在一些PDF文件中看到一些好看的图片,想将图片保存下来,但是PDF文件是无法编辑的,在文件自身当中我们无法将图片完成的提取出来,因此大家都会想办法在不破坏图片完整性的情况下将图片从PDF文件中提取出来,下面就跟大家分享一下小编是从电脑中如何提取PDF文件中的图片.借助工具:×××换器1.在PDF文件中提取图片,本身也是一种对文件的编辑,知识PDF文件无法编辑,所以我们要借助工具来进行编辑,工具可以直接在百度浏览器中下载.2.下载安装好工具,打开工具,进入到操作页面,操作页面左边是功能栏

向github的README文件中添加图片

1,向README文件中添加图片,用于展示程序效果或辅助说明! 两步: 首先,向github 上传所需的图片: 然后,打开README文件,写入图片的格式为: ![image](https://github.com/secondLieutenantCoder/TableAndCollection/blob/master/resut.png?raw=true) ![image](图片的URL) 图片写入成功!

从一个word文件中读取所有的表格和标题(1)

首先讲需求: 从word文件中读表格里的数据,然后插入数据库中.word文件中的表格是带有标题的,把标题读出来,进行匹配数据库. 需求分析: word2007底层是以xml文件存储的,所以分析xml的格式,进行读取相应数据. 表格数据如下: 表 1 分类统计表 分类 总计 1类 2类 软件 4 3 7 硬件 5 6 11 word底层xml组成如下分析: <w:p w:rsidRDefault="009F1A99" w:rsidR="009F1A99" w:r

利用python 提取log 文件中的关键句子,并进行统计分析

利用python开发了一个提取sim.log 中的各个关键步骤中的时间并进行统计的程序: #!/usr/bin/python2.6 import re,datetime file_name='/home/alzhong/logs/qtat1/R2860.01.13/sim-applycommitrollback-bld1.log' file=open(file_name,'r') acnum=[];time_res=[];lnum=0 def trans_time(time): t1=datet

Silverlight读取Zip文件中的图片与视频

首先看看Demo的截图: 下面我将一步步展示实现这个Demo的过程,这个需求就是读出Zip文件中的图片与视频. Demo整体架构: 首先我们准备几张图片和视频,然后将其压缩至resource.zip文件中,做完之后,我们建立一个resource.xml文件记录压缩包内的资源 <?xml version="1.0" encoding="utf-8" ?> <files> <file type="video" name=

如何翻译word文件中的英文

现如今的不论是学生还是职员,都喜欢在网络上查找自己需要的文件资料,然后下载保存到电脑中进行浏览使用.可是有时却发现,下载的文件资料内容全是英文.可是奈何自己的英语水平不是很好,无法阅读浏览文件资料的意思.而网上很多翻译工具翻译出来的中文意思又不准确.为了帮助大家解决这个难题,浏览word文件当中的英文内容.今天小编就将教给大家如何翻译word文件中的英文. 1.双击打开电脑当中的浏览器,在浏览器内的搜索框中输入关键词word文档在线翻译.然后使用鼠标点击进入搜索到得相关页面内. 2.选择Word

PDF编辑技巧:怎么提取PDF文件中的页面

怎么提取PDF文件中的页面?有些时候我们需要提取PDF文件中的页面,不知道如何操作.想要提取PDF文件中的页面就可以选择使用迅捷PDF编辑器来进行操作,下面就为大家分享一下PDF编辑器如何提取PDF文件页面的操作. 操作软件:迅捷PDF编辑器 具体操作方法如下: 1:首先将迅捷PDF编辑器安装到自己的电脑中,打开PDF编辑器将需要提取页面的PDF文件添加到软件中. 2:在软件的顶部找到文档,点击文档在下面找到提取页面,点击提取页面在软件中会出现一个弹窗. 3:在软件的弹窗中可以找到页面范围,选择

【JAVA】在jar文件中引用图片等外部资源的问题

很多时候我们需要把java程序导出成可执行的jar包,但是往往会遇到一个问题:程序中引用的外部资源如图片等在可执行jar包中失效.笔者自己也遇到了这个问题,查阅了网上的一些资料,写得不太易懂,稍微研究了一下算是解决了这个问题,在这里记录下来. 我们以一个特别简单的程序为例,在JFrame中放置一张图片,工程的文档结构如下: 注意到图片资源是存放在src下的.代码如下: 1 package in.love1017best; 2 3 import javax.swing.*; 4 5 public

windows下,用绝对路径向html文件中插入图片

首先注意路径中是否包含中文名比如 <img src="F:\头像\小黄人.jpg" width="500" height="200"/> 如有,则应加入此句 <meta http-equiv="Content-Type" content="text/html"; charset=utf-8 /> 目的是让此html文件支持中文编码. 其次,应注意插入图片的拓展名(.jpg)等等.我在