将位图 object 传递给需要位图文件的文件名字符串的 Interop Word 函数
Pass a bitmap object to Interop Word function that is expecting a filename string for a bitmap file
标题听起来很疯狂,但请耐心等待。这是任何 object 都可能存在的问题。
我正在内存中生成一个位图 object,我想将它直接传递给另一个想要打开位图文件的函数。简单的解决方案是将文件写入磁盘,针对文件调用函数,然后删除文件。我不想那样做。如果我将大量图像 object 推送到带有 VSTO add-in 的 Word 文档中,那么当整个事情可以在内存中完成时,无缘无故地破坏我的磁盘是没有意义的.
我想我正在寻找一个不同的函数来将图片插入到接受位图的 Word 文档中 object。或者一种传递文件系统 object 的方法,它实际上指向内存(不是 RAMDisk,而是 RAMFile?)。或者将 "Image.Save" 直接连接到 "AddPicture" 函数的 reader 而无需实际在磁盘上创建文件的方法。
希望有更好的方法。
代码示例如下:
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)
Word 无法 "stream"(见下文 "Background")内容,因此您的选择是 1) 剪贴板或 2) 将位图包装在有效的 Word 打开 XML OPC 平面文件格式,即首先将位图转换为 base64。
首先,您可以使用标准 .NET 方法以您希望 Word 使用的格式将信息放在剪贴板上。在 Word "interop" 中,Paste 或 PasteSpecial 方法将插入它。与以往一样,反对这种方法的理由是 "interfering" 用户的剪贴板。
使用 Word 打开 XML 是您可以使用 Range.InsertXML
方法将 "streaming" 内容尽可能接近于 Word。
Word 文档(和其他 Office 文件)本质上是 "zip packages" 的 XML 和二进制文件一起构成文档。无需在 Word (Office) 应用程序中打开它们就可以创建和编辑这些文件,这使得该格式适合服务器端工作。任何可以处理 zip 文件和 xml 的工具都可以用于此;标准是 Microsoft Open XML SDK,它提供完整的 API Office 内容。
在所有 Office 应用程序中,只有 Word 使开发人员能够使用 OPC 平面文件标准在 opened Word 文档中读取和写入内容。这个 "concatenates" 压缩包的全部内容变成了一个 XML 字符串。 Word 对象模型的 Range.InsertXML
方法用于将此格式的内容写入在 Word 应用程序中打开的 Word 文档。
有关如何将 zip 包转换为 OPC 平面文件的信息可以在此 blog article. Information concerning minimal Word Open XML to have a valid OPC version is described in this article 中找到;其中有一节专门介绍如何处理图形。
背景
Word 基于非常古老的技术 - 1980 年代后期。到 1990 年代中期,它作为专业文字处理器达到了非常高的标准,从那以后它所发生的事情主要是 "sugar coating" - 添加一点这个和一点那个以使其更接近 HTML / 页面布局。但应用程序的核心保持不变......这部分意味着 Word 无法完成现代开发人员期望的许多事情 - 例如 "streaming" 数据输入和输出。
标题听起来很疯狂,但请耐心等待。这是任何 object 都可能存在的问题。
我正在内存中生成一个位图 object,我想将它直接传递给另一个想要打开位图文件的函数。简单的解决方案是将文件写入磁盘,针对文件调用函数,然后删除文件。我不想那样做。如果我将大量图像 object 推送到带有 VSTO add-in 的 Word 文档中,那么当整个事情可以在内存中完成时,无缘无故地破坏我的磁盘是没有意义的.
我想我正在寻找一个不同的函数来将图片插入到接受位图的 Word 文档中 object。或者一种传递文件系统 object 的方法,它实际上指向内存(不是 RAMDisk,而是 RAMFile?)。或者将 "Image.Save" 直接连接到 "AddPicture" 函数的 reader 而无需实际在磁盘上创建文件的方法。
希望有更好的方法。
代码示例如下:
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)
Word 无法 "stream"(见下文 "Background")内容,因此您的选择是 1) 剪贴板或 2) 将位图包装在有效的 Word 打开 XML OPC 平面文件格式,即首先将位图转换为 base64。
首先,您可以使用标准 .NET 方法以您希望 Word 使用的格式将信息放在剪贴板上。在 Word "interop" 中,Paste 或 PasteSpecial 方法将插入它。与以往一样,反对这种方法的理由是 "interfering" 用户的剪贴板。
使用 Word 打开 XML 是您可以使用 Range.InsertXML
方法将 "streaming" 内容尽可能接近于 Word。
Word 文档(和其他 Office 文件)本质上是 "zip packages" 的 XML 和二进制文件一起构成文档。无需在 Word (Office) 应用程序中打开它们就可以创建和编辑这些文件,这使得该格式适合服务器端工作。任何可以处理 zip 文件和 xml 的工具都可以用于此;标准是 Microsoft Open XML SDK,它提供完整的 API Office 内容。
在所有 Office 应用程序中,只有 Word 使开发人员能够使用 OPC 平面文件标准在 opened Word 文档中读取和写入内容。这个 "concatenates" 压缩包的全部内容变成了一个 XML 字符串。 Word 对象模型的 Range.InsertXML
方法用于将此格式的内容写入在 Word 应用程序中打开的 Word 文档。
有关如何将 zip 包转换为 OPC 平面文件的信息可以在此 blog article. Information concerning minimal Word Open XML to have a valid OPC version is described in this article 中找到;其中有一节专门介绍如何处理图形。
背景
Word 基于非常古老的技术 - 1980 年代后期。到 1990 年代中期,它作为专业文字处理器达到了非常高的标准,从那以后它所发生的事情主要是 "sugar coating" - 添加一点这个和一点那个以使其更接近 HTML / 页面布局。但应用程序的核心保持不变......这部分意味着 Word 无法完成现代开发人员期望的许多事情 - 例如 "streaming" 数据输入和输出。