1

我正在尝试在 Visual Studio 2010 和 C# 上使用 VSTO 为 Microsoft Word(2007 及更高版本)编写 Office 插件。

该插件会将图像插入从 Internet 下载的文档(来自自定义 CGI 脚本)。这些图像每天都会更新,因此我添加了一个按钮,可根据请求从服务器“刷新”所有图像。但是,我不确定如何“存储”图像的原始标识符以及嵌入在文档中的图像,以了解从服务器获取哪个图像。标识符的长度可以从几个字符到几百 (~200) 个字符不等,但它是一个 ASCII 标识符。

目前我像这样插入图片:

    public void InsertPictureFromIdentifier(String identifier)
    {
        Document vstoDocument = Globals.Factory.GetVstoObject(this.Application.ActiveDocument);

        Word.Selection selection = this.Application.Selection;
        if (selection != null && selection.Range != null)
        {
            // Insert the picture control
            var picture = vstoDocument.Controls.AddPictureContentControl(selection.Range, "mypic");
            // And update the image
            UpdatePicture(picture, identifier);
         }
    }

然后在初始插入和刷新时都调用 UpdatePicture 来更新图像:

    public void UpdatePicture(PictureContentControl picture, string identifier)
    {
        const int BytesToRead = 1000000;

        // Download the image from the scrip
        var request = WebRequest.Create("http://my.server.com/graph.cgi?"+identifier);
        var response = request.GetResponse();
        var responseStream = response.GetResponseStream();
        var reader = new BinaryReader(responseStream);
        var memoryStream = new MemoryStream();
        Byte[] byteBuffer = new byte[BytesToRead];

        // Transfer to a memory stream
        var bytesRead = reader.Read(byteBuffer, 0, BytesToRead);
        while (bytesRead > 0)
        {
            memoryStream.Write(byteBuffer, 0, bytesRead);
            bytesRead = reader.Read(byteBuffer, 0, BytesToRead);
        }

        // Set the image from the memory stream
        picture.Image = new System.Drawing.Bitmap(memoryStream);
    }

如您所见,我将标识符传递给更新 - 但问题是如何从第二天刷新时插入的“图片”中取回该标识符。我试过使用图片的标签,但仅限于 64 个字符。我什至尝试过使用图片的 Title 属性,但这似乎在其他一些最大限制上默默地失败了。

标识符需要在保存/加载之间保留,随文档中的图像移动,并且不可见(我不能只在带有标识符的图像之后添加文本)。

4

0 回答 0