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