标题听起来很疯狂,但请忍受我。这是任何对象都可能存在的问题。
我正在内存中生成一个位图对象,我想将其直接传递给另一个要打开位图文件的函数。简单的解决方案是将文件写入磁盘,针对文件调用函数,然后删除文件。我不想那样做。如果我使用VSTO加载项将大量图像对象推入Word文档中,那么在整个事情都可以在内存中完成的情况下,无缘无故地敲打磁盘毫无意义。
我想我正在寻找一种不同的功能,以将图片插入接受位图对象的Word文档中。或者一种传递实际上指向内存的文件系统对象的方法(不是RAMDisk,而是RAMFile?)。或直接将“ Image.Save”连接到“ AddPicture”功能的读取器的方法,而无需实际在磁盘上制作文件。
希望有一种更好的方法。
这是代码示例:
Dim newImage = GenerateImage(InputString, SelectedFormat)
Dim imagePath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName())
newImage.Save(imagePath, ImageFormat.Png)
With Globals.ThisAddIn.Application
.Selection.InlineShapes.AddPicture(imagePath)
End With
File.Delete(imagePath)
答案 0 :(得分:2)
Word无法“流式传输”(请参见下面的“背景”)内容,因此您的选择是1)剪贴板或2)以有效的Word Open XML OPC平面文件格式包装位图,这意味着首先转换位图到base64。
首先,您可以使用标准.NET方法以您希望Word使用的格式将信息放置在剪贴板上。在单词“互操作”中,Paste或PasteSpecial方法将插入它。与以往一样,反对这种方法的观点是“干扰”用户的剪贴板。
使用Word Open XML尽可能接近使用Range.InsertXML
方法将内容“流化”到Word中。
Word文档(和其他Office文件)本质上是一起构成文档的XML和二进制文件的“ zip包”。无需在Word(Office)应用程序中打开文件就可以创建和编辑这些文件,这使得该格式适合服务器端工作。任何可以与zip文件和xml一起使用的工具都可以用于此目的。标准是Microsoft Open XML SDK,它提供了Office内容的完整API。
在所有Office应用程序中,单独的 Word都使开发人员可以使用OPC平面文件标准在打开的 Word文档中读写内容。这会将zip包的全部内容“连接”到XML字符串中。 Word对象模型的Range.InsertXML
方法用于将这种格式的内容写入在Word应用程序中打开的Word文档中。
有关如何将zip包转换为OPC平面文件的信息,可以在此blog article中找到。 this article中介绍了有关具有有效OPC版本的最小Word Open XML的信息;其中有专门讨论图形的部分。
背景
Word基于非常古老的技术-1980年代后期。到1990年代中期,它已经达到了非常高的标准,成为专业的文字处理程序,此后所发生的事情主要是“糖衣”-加上了这一点,使之更接近HTML /页面布局。但是应用程序的核心保持不变...这部分意味着Word无法执行现代开发人员期望的许多功能,例如“流式处理”数据。