Visual Studio 2010 および C# で VSTO を使用して、Microsoft Word (2007 以降) 用の Office アドインを作成しようとしています。
アドインは、インターネットから (カスタム 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);
}
ご覧のとおり、識別子を update に渡しますが、問題は、翌日の更新時に挿入した「画像」からその識別子を取得する方法です。写真のタグを使用してみましたが、64 文字に制限されています。画像の Title プロパティを使用してみましたが、他の最大制限で静かに失敗するようです。
識別子は、保存/読み込み間で永続化され、ドキュメント内の画像とともに移動し、非表示になる必要があります (識別子を使用して画像の後にテキストを追加することはできません)。