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好,而且文件也不大,推荐使用
c# 提取word文件中的图片问题的更多相关文章
- Java 使用PDFBox提取PDF文件中的图片
今天做PDF文件解析,遇到一个需求:提取文件中的图片并保存.使用的是流行的apache开源jar包pdfbox, 但还是遇到坑了,比如pdfbox版本太高或太低都不能用!!这个包竟然没有很好地做好兼容 ...
- Servlet从本地文件中读取图片,并显示在页面中
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpSer ...
- Silverlight读取Zip文件中的图片与视频
首先看看Demo的截图: 下面我将一步步展示实现这个Demo的过程,这个需求就是读出Zip文件中的图片与视频. Demo整体架构: 首先我们准备几张图片和视频,然后将其压缩至resource.zip文 ...
- 从一个word文件中读取所有的表格和标题(1)
首先讲需求: 从word文件中读表格里的数据,然后插入数据库中.word文件中的表格是带有标题的,把标题读出来,进行匹配数据库. 需求分析: word2007底层是以xml文件存储的,所以分析xml的 ...
- 提取PPT文件中的Vba ProjectStg Compressed Atom。Extract PPT VBA Compress Stream
http://msdn.microsoft.com/en-us/library/cc313106(v=office.12).aspx 微软文档 PartI ********************* ...
- 借助python工具从word文件中抽取相关表的定义,最后组装建表语句-非常好
借助python工具从word文件中抽取表的定义,最后组装建表语句-非常好 --如有转载请以超链接的方式注明原文章出处,谢谢大家.请尊重每一位乐于分享的原创者 1.python脚本 ## -*- co ...
- C#如何提取.txt文件中的每个字符串
C#如何提取.txt文件中的每个字符串,并将其存放到一个类中. 将其中的编号 菜名 价格 分别存入不同的数组中. 注:在用ReadLine读取一行信息时为什么读取的中文字符变成了乱码. 20 满意答案 ...
- 吴裕雄--天生自然python学习笔记:python文档操作批量替换 Word 文件中的文字
我们经常会遇到在不同的 Word 文件中的需要做相同的文字替换,若是一个一个 文件操作,会花费大量时间 . 本节案例可以找出指定目录中的所有 Word 文件(包含 子目录),并对每一个文件进行指定的文 ...
- 吴裕雄--天生自然python学习笔记:python文档操作自动查找替换 Word 文件中的指定文字
Win32com 组件提供了自动替换 Word 文件中指定文字 的功能 .在使用“查找” 功能替换文字之前,可先清除源文字及目标文字的格式,以免影响替换效果,语法为 : 替换 Word 文件特定文字的 ...
随机推荐
- 1. Window环境下 - 开发环境的配置: (安装Android Studio 2.1)
0. Java简介: 1990年Sun公司预料嵌入式系统将在未来家用电器领域大显生手, 于是成立了一个由James Gosling领导的"Green计划"(首席科学家Bill Jo ...
- ZeroMQ/jzmq安装使用
环境: No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 12.04.2 LTS Release: 12 ...
- 【BZOJ】1053: [HAOI2007]反素数ant
1053: [HAOI2007]反素数ant Description: g(x)表示x的约数个数,反素数:对于任意的i (i < x),均有g(i) < g(x),则x为反素数:现在输入不 ...
- sublime c++ builder
rt, mark { "cmd": ["g++", "${file}", "-o", "${file_path ...
- TCO 2014 Round 1A
顺利搞出 A B 两题,然后压线晋级了,手速场. A 题 , 求排列最小的,肯定从后往前来做,维护一个最小的set,只是第一个字母要特判一下. 1: #line 5 "EllysSorti ...
- asp.net中下载功能
//流方式下载 protected void ButtonButtonDownload_Click(object sender, EventArgs e) { //string fileName = ...
- 当页面编辑或运行提交时,出现“从客户端中检测到有潜在危险的request.form值”问题,该怎么办呢?
最近在学习highcharts时,关于其中的导出功能,本来是想把导出的图片存放在本地,发现只有在电脑联网的情况下才可以一下导出图片,后来查阅了一番资料,才发现highcharts中的导出默认的官网服务 ...
- 练习--LINUX进程间通信之有名管理FIFO
从FIFO中读取数据: 约定:如果一个进程为了从FIFO中读取数据而阻塞打开FIFO,那么称该进程内的读操作为设置了阻塞标志的读操作. 如果有进程写打开FIFO,且当前FIFO内没有数据,则对于设置了 ...
- Altium Designer学习: 允许闭合回路
使用AltiumDesigner画PCB时,顶层和底层都有电源线走 但是通过过孔链接的,主要是因为我这里可使用了几个相同的电源接口,把这些上下层的电源接口连在一起就很容易画出闭合回路,这自身没有太大的 ...
- 131. Palindrome Partitioning
题目: Given a string s, partition s such that every substring of the partition is a palindrome. Return ...