代码之家  ›  专栏  ›  技术社区  ›  HackSlash

将位图对象传递给interop word函数,该函数需要位图文件的文件名字符串

  •  2
  • HackSlash  · 技术社区  · 7 年前

    标题听起来很疯狂,但请容忍我。这是一个任何对象都可能存在的问题。

    我正在内存中生成一个位图对象,我想将它直接传递给另一个要打开位图文件的函数。简单的解决方案是将文件写入磁盘,对该文件调用函数,然后删除该文件。我不想那样做。如果我用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)
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Cindy Meister    7 年前

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

    首先,您可以使用标准的.NET方法将信息以您希望Word使用的格式放置在剪贴板上。在单词“interop”中,paste或pastespecial方法将插入它。反对这种方法的理由与以往一样是“干扰”用户的剪贴板。

    使用word open xml非常接近于使用 Range.InsertXML 方法。

    word文档(和其他office文件)本质上是xml和二进制文件的“zip包”,它们共同构成了文档。不需要在word(office)应用程序中打开这些文件就可以创建和编辑这些文件,这使得格式适合于服务器端工作。任何可以处理zip文件和xml的工具都可以用于此目的;标准的是microsoftopenxmlsdk,它提供了一个完整的office内容api。

    在所有office应用程序中,只有word允许开发人员在 开的 使用opc平面文件标准的word文档。这会将zip包的整个内容“连接”成一个xml字符串。对象模型一词 范围.insertxml 方法用于将此格式的内容写入在Word应用程序中打开的Word文档。

    有关如何将ZIP包转换为OPC平面文件的信息,请参见 blog article 是的。有关具有有效opc版本的最小word open xml的信息,请参见 this article ;其中有一节专门介绍如何使用图形。

    背景

    word是基于非常古老的技术——20世纪80年代后期。到了90年代中期,它作为一个专业的文字处理程序达到了非常高的标准,此后发生的事情大多是“糖衣”——添加了一点这个和一点那个,使它更接近html/页面布局。但应用程序的核心仍然是一样的…其中一部分意味着word无法完成现代开发人员所期望的许多事情,例如“流式”数据输入和输出。