最近在做一个项目要求word 中的图片与文字分离 ,找了好久终于找到一个完美的方法

c#实现word中的图文分离

 

part 1: class define



Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

-->publicclass WordSeparator:IDisposable
{

#region Constructor

public WordSeparator()

{

WordApp =new Microsoft.Office.Interop.Word.Application();

}

#endregion

#region Fields

private Microsoft.Office.Interop.Word.Application WordApp;

privateobject missing = System.Reflection.Missing.Value;

privateobject yes =true;

privateobject no =false;

private Microsoft.Office.Interop.Word.Document d;

privateobject filename =@"C:\example.rtf";

#endregion

#region Methods

publicvoid UpdateDoc()

{

d = WordApp.Documents.Open(ref filename, ref missing, ref no, ref missing,

ref missing, ref missing, ref missing, ref missing, ref missing,

ref missing, ref missing, ref yes, ref missing, ref missing, ref missing, ref missing);

List<Microsoft.Office.Interop.Word.Range> ranges =

new List<Microsoft.Office.Interop.Word.Range>();

foreach (Microsoft.Office.Interop.Word.InlineShape s in d.InlineShapes)

{

if (s.Type ==

Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapePicture)

{

ranges.Add(s.Range);

s.Delete();

}

}

foreach (Microsoft.Office.Interop.Word.Range r in ranges)

{

r.InlineShapes.AddPicture(

@"c:\PathToNewImage\Image.jpg", ref missing, ref missing, ref missing);

}

WordApp.Quit(ref yes, ref missing, ref missing);

}

publicvoid SeparateImageText()

{

//初始化程序

d = WordApp.Documents.Open(ref filename, ref missing, ref no, ref missing,

ref missing, ref missing, ref missing, ref missing, ref missing,

ref missing, ref missing, ref yes, ref missing, ref missing, ref missing, ref missing);

List<Microsoft.Office.Interop.Word.Range> ranges =

new List<Microsoft.Office.Interop.Word.Range>();

List<string> files =new List<string>();

foreach (Microsoft.Office.Interop.Word.InlineShape s in d.InlineShapes)

{

if (s.Type == Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapePicture

|| s.Type ==

Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapeEmbeddedOLEObject)

{

//获取图片数据

byte[] imgData = (byte[])s.Range.EnhMetaFileBits;

string file =string.Concat(Guid.NewGuid().ToString(), ".gif");

files.Add(file);

//构造图形

MemoryStream mStream =new MemoryStream(imgData);

Bitmap bmp =new Bitmap(mStream);

//保存到磁盘

bmp.Save(file);

mStream.Dispose();

bmp.Dispose();

ranges.Add(s.Range);

s.Delete();

}

}

; i < ranges.Count; i ++ )

{

Microsoft.Office.Interop.Word.Range r = ranges[i];

//替换图片

r.InsertBefore("<img src='"+ files[i] +"'>");

r.InsertAfter("</img>");

}

//退出程序

WordApp.Quit(ref yes, ref missing, ref missing);

}

///<summary>

/// 替换word中的图片

///</summary>

///<param name="serverPath">图片文件的存储物理路径</param>

///<param name="virtualPath">图片文件的标签虚拟路径</param>

publicvoid SeparateImageText(string serverPath, string virtualPath)

{

//初始化程序

d = WordApp.Documents.Open(ref filename, ref missing, ref no, ref missing,

ref missing, ref missing, ref missing, ref missing, ref missing,

ref missing, ref missing, ref yes, ref missing, ref missing, ref missing, ref missing);

List<Microsoft.Office.Interop.Word.Range> ranges =new List<Microsoft.Office.Interop.Word.Range>();

List<string> files =new List<string>();

foreach (Microsoft.Office.Interop.Word.InlineShape s in d.InlineShapes)

{

if (s.Type == Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapePicture

|| s.Type == Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapeEmbeddedOLEObject)

{

//获取图片数据

byte[] imgData = (byte[])s.Range.EnhMetaFileBits;

string file =string.Concat(Guid.NewGuid().ToString(), ".gif");

files.Add(file);

//构造图形

MemoryStream mStream =new MemoryStream(imgData);

Bitmap bmp =new Bitmap(mStream);

//保存到磁盘

bmp.Save(string.Concat(serverPath, "\\", file));

mStream.Dispose();

bmp.Dispose();

ranges.Add(s.Range);

s.Delete();

}

}

; i < ranges.Count; i++)

{

Microsoft.Office.Interop.Word.Range r = ranges[i];

//替换图片

r.InsertBefore("<img src='"+string.Concat(virtualPath,"//",files[i]) +"'>");

r.InsertAfter("</img>");

}

//退出程序

WordApp.Quit(ref yes, ref missing, ref missing);

}

///<summary>

/// 替换word中的图片

///</summary>

///<param name="targetFile">目标文件</param>

///<param name="serverPath">图片文件的存储物理路径</param>

///<param name="virtualPath">图片文件的标签虚拟路径</param>

publicvoid SeparateImageText(string targetFile,string serverPath, string virtualPath)

{

filename = targetFile;

//初始化程序

d = WordApp.Documents.Open(ref filename, ref missing, ref no, ref missing,

ref missing, ref missing, ref missing, ref missing, ref missing,

ref missing, ref missing, ref yes, ref missing, ref missing, ref missing, ref missing);

List<Microsoft.Office.Interop.Word.Range> ranges =new List<Microsoft.Office.Interop.Word.Range>();

List<string> files =new List<string>();

foreach (Microsoft.Office.Interop.Word.InlineShape s in d.InlineShapes)

{

if (s.Type == Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapePicture

|| s.Type == Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapeEmbeddedOLEObject)

{

//获取图片数据

byte[] imgData = (byte[])s.Range.EnhMetaFileBits;

string file =string.Concat(Guid.NewGuid().ToString(), ".gif");

files.Add(file);

//构造图形

MemoryStream mStream =new MemoryStream(imgData);

Bitmap bmp =new Bitmap(mStream);

//保存到磁盘

bmp.Save(string.Concat(serverPath, "\\", file));

mStream.Dispose();

bmp.Dispose();

ranges.Add(s.Range);

s.Delete();

}

}

; i < ranges.Count; i++)

{

Microsoft.Office.Interop.Word.Range r = ranges[i];

//替换图片

r.InsertBefore("<img src='"+string.Concat(virtualPath, "//", files[i]) +"'>");

r.InsertAfter("</img>");

}

//退出程序

WordApp.Quit(ref yes, ref missing, ref missing);

}

#endregion

#region IDisposable 成员

publicvoid Dispose()

{

if (d !=null)

{

System.Runtime.InteropServices.Marshal.ReleaseComObject(d);

d =null;

}

if (WordApp !=null)

{

System.Runtime.InteropServices.Marshal.ReleaseComObject(WordApp);

WordApp =null;

}

}

#endregion

}

part 2: usage code:



Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/

-->WordSeparator w =new WordSeparator();

w.SeparateImageText();

 
 
 
Shape 对象代表文档中的图形对象,
InlineShape 代表文档中的嵌入式图形对象,
但是我又遇到了另外一种问题,word 中的图片除了InlineShape  的图片外还有  Shape 
 如果将 Shape  转化为  InlineShape  就会报错
 对于shape 还是没法做到完全分离,希望大神指点一二
 

.net 下word 中的图片与文字分离的更多相关文章

  1. 如何将word中的图片和文字导入自己的博客中

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

  2. 怎样将word中的图片插入到CSDN博客中

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

  3. 在RichTextBox控件中添加图片和文字

    public void SetText(RichTextBox rtb) { rtb.Text = "在RichTextBox控件中添加图片和文字" + Environment.N ...

  4. 如何把word中的图片怎么导出来呢?

    在办公使用word的过程中你可能经常会遇到这个问题:插入到word中的图片找不到导出来的方法,是不是很郁闷呢,别急,今天咱们研究一下把word中的图片导出来的方法(把"我的"变成你 ...

  5. Java 添加、删除、格式化Word中的图片

    本文介绍使用Spire.Cloud.SDK for Java提供的ImagesApi接口来操作Word中的图片.具体可通过addImage()方法添加图片.deleteImage()方法删除图片.up ...

  6. iOS开发小技巧--即时通讯项目:使用富文本在UILabel中显示图片和文字;使用富文本占位显示图片

    Label借助富文本显示图片 1.即时通讯项目中语音消息UI的实现,样式如图: 借助富文本在UILabel中显示图片和文字 // 1.创建一个可变的富文本 NSMutableAttributedStr ...

  7. 写带有清晰图片的博客:如何将word中的图片复制到windows live writer保持大小不变--清晰度不变

    写blog的习惯,先在word写了,复制到windows live writer,再发布到博客园.word中的文章,图片有缩放比例,复制到windows live writer后图片变得不清晰.除了一 ...

  8. word中更改图片和标题之间的垂直距离

    word中插入图片后.往往须要给图片加上标题. 你插入图片和给图片插入标题时,word用的是默认的格式给你插入的图片和标题. 假如原来的paragraph是2倍行距.你的图片和标题之间的距离也是2倍行 ...

  9. 利用POI抽取word中的图片并保存在文件中

    利用POI抽取word中的图片并保存在文件中 poi.apache.org/hwpf/quick-guide.html 1.抽取word doc中的图片 package parse; import j ...

随机推荐

  1. MAC读取希捷移动硬盘ntfs

    希捷提供了mac读取ntfs磁盘的软件,Paragon. 搜索关键词 "希捷" "mac" 或者通过以下链接进入 https://www.seagate.com ...

  2. 西门子 SINAMICS S120 Web server 用户名和默认密码

    sinamics web server可以通过浏览器查看驱动器故障等信息,是一个比较方便的辅助工具. 1. 一般用户 SINAMICS 密码 无 2. 管理员 Administrator 密码 Adm ...

  3. ARM实验6——ADC实验

    实验内容: 编写ADC程序,通过FS4412开发板上的电位器,改变ADC通道输入的电压值,经过ADC转换的值打印到终端. 实验目的: 熟悉开发环境: 掌握猎户座4412处理器ADC模块的使用和编程. ...

  4. 关于安卓手机访问一些网站或者Fiori应用弹出安装证书的提示

    有朋友问遇到在安卓手机上安装Fiori Client,打开的时候提示需要安装证书,如下图所示: 我在自己的Android手机试了试,因为我没有装Fiori Client,所以就用手机浏览器直接访问ht ...

  5. C++之string基本字符系列容器

    string基本字符系列容器 C语言只提供了一个插入类型用来处理字符, 而对于字符串, 只能通过字符串数组来处理, 显得十分不便. C++STL提供了string基本字符系列容器来处理字符串, 可以把 ...

  6. TeamCity实战(2):NuGet服务器

    如果有在内网架设NuGet服务器的需要,比如说公司要求所有开发人员的开发机与外网隔离,但是项目开发又必须要通过NuGet获取开发包的情况. 打开选项其实很简单,但是打开之后怎么样更新开发包要复杂些了. ...

  7. N76E003---输入捕获

    输入捕获 根据芯片手册,定时器2可以作为输入捕获使用,设置非常简单,官方也提供了宏给我们使用 void Time2_cap_init(void) { /******* 输入捕获CF设置 ******* ...

  8. spring中使用i18n(国际化)

    简单了解i18n i18n(其来源是英文单词internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称.在资讯领域,国际化(i18n)指让产品(出版物,软件,硬件 ...

  9. 【洛谷P1314】[NOIP2011]聪明的质监员

    聪明的质监员 题目链接:https://www.luogu.org/problemnew/show/P1314 Y(W)随W的值增大而减小 二分W的值,找到最小的W使得Y(W)>S: 比较Y(W ...

  10. CDH4.5.0下安装snappy

    编译源代码 http://www.cnblogs.com/chengxin1982/p/3862289.html 测试参考 http://blog.jeoygin.org/2012/03/java-c ...