2

标题听起来很疯狂,但请耐心等待。这是任何对象都可能存在的问题。

我正在内存中生成一个位图对象,我想将它直接传递给另一个想要打开位图文件的函数。简单的解决方案是将文件写入磁盘,针对文件调用函数,然后删除文件。我不想那样做。如果我将大量图像对象推送到带有 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)
4

1 回答 1

2

Word 无法“流式传输”(参见下面的“背景”)内容,因此您的选择是 1) 剪贴板或 2) 将位图包装为有效的 Word Open XML OPC 平面文件格式,这意味着首先将位图转换为基数 64。

首先,您可以使用标准的 .NET 方法以您希望 Word 使用的格式将信息放在剪贴板上。在 Word“互操作”中,Paste 或 PasteSpecial 方法将插入它。与以往一样,反对这种方法的论点是“干扰”用户的剪贴板。

使用 Word Open XML 尽可能接近使用该Range.InsertXML方法将内容“流式传输”到 Word 中。

Word 文档(和其他 Office 文件)本质上是共同构成文档的 XML 和二进制文件的“压缩包”。无需在 Word (Office) 应用程序中打开它们就可以创建和编辑这些文件,这使得该格式适用于服务器端工作。任何可以处理 zip 文件和 xml 的工具都可以用于此;标准是 Microsoft Open XML SDK,它提供了 Office 内容的完整 API。

在所有 Office 应用程序中,仅 Word 就使开发人员能够使用 OPC 平面文件标准在打开的 Word 文档中读取和写入内容。这会将 zip 包的全部内容“连接”成一个 XML 字符串。Word 对象模型的Range.InsertXML方法用于将这种格式的内容写入在 Word 应用程序中打开的 Word 文档。

有关如何将 zip 包转换为 OPC 平面文件的信息,请参阅此博客文章本文介绍了有关具有有效 OPC 版本的最小 Word Open XML 的信息;那里有一个专门关于使用图形的部分。

背景

Word 基于非常古老的技术 - 1980 年代后期。到 1990 年代中期,它作为专业的文字处理器达到了非常高的标准,此后发生的事情主要是“糖衣”——添加一些这样和那样的东西,使其更接近 HTML / 页面布局. 但应用程序的核心保持不变......这部分意味着 Word 无法完成现代开发人员所期望的许多事情 - 例如“流式传输”数据输入和输出。

于 2018-07-11T10:13:27.127 回答