我正在尝试在 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 属性,但这似乎在其他一些最大限制上默默地失败了。
标识符需要在保存/加载之间保留,随文档中的图像移动,并且不可见(我不能只在带有标识符的图像之后添加文本)。