C # Interop.Word Добавление изображения из папки ресурсов проекта - PullRequest
2 голосов
/ 06 января 2011

Возникли проблемы с изображением в Interop.Word и C #. Я хочу добавить изображение в заголовок документа, который я собираюсь сгенерировать. У меня этот код работает отлично

section.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Shapes.AddPicture(@"C:\Logo.jpg", ref x, ref x, ref x, ref x, ref x, ref x, ref x);

Проблема в том, что у меня не может быть "C:\Logo.jpg" в коде, поскольку после публикации проекта, скорее всего, не будет Logo.jpg в папке C пользователя. Изображение уже находится в папке ресурсов моего проекта. Я использовал Image.FromFile("Logo.jpg") раньше, но .AddPicture требует строку, а не изображение.

Есть идеи?

- редактировать -

Увидел это по сети:

string anyPath = @"C:\logo.jpg";
Properties.Resources.logo.Save(anyPath);
section.Headers.[...].Shapes.AddPicture(anyPath, ...

но потом я все еще получаю общую ошибку в GDI +, или ExternalException не обрабатывается.

Ответы [ 5 ]

1 голос
/ 06 января 2011

Не можете ли вы использовать ...

section.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Shapes.AddPicture(@"Logo.jpg", ref x, ref x, ref x, ref x, ref x, ref x, ref x);

Используйте относительное расположение файла изображения в папке bin вместо файла с абсолютным позиционированием

EDIT

Вы можете использовать это для создания абсолютного местоположения файла на основе относительной ссылки. Полагается на использование WinForms

string relative = @"images\Logo.jpg";
System.IO.FileInfo fi = new System.IO.FileInfo(Application.ExecutablePath);
string absolute = System.IO.Path.Combine(fi.Directory.FullName, relative);

Я не думаю, что ваш обновленный метод будет работать слишком хорошо на vista / windows7, так как они имеют различные разрешения на запись (возможно), не говоря уже о том, что никому не нравятся случайные файлы, добавляемые на их диск C.

Я думаю, это плохая практика, когда такие важные файлы не находятся в папке приложения ...

0 голосов
/ 02 мая 2018

Вы можете использовать ресурс проекта. Попробуйте это.

// Copy image to clickboard.
System.Windows.Forms.Clipboard.SetImage( Properties.Resources.your_resource_name);

//Select an location where you want to put the image
section.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range.Select();

// Page onto the document. wordApp is the instance of Microsoft.Office.Interop.Word.Application
wordApp.Selection.Paste();
0 голосов
/ 01 августа 2015

Я случайно вижу этот пост и добавляю изображение из файла ресурсов.Нашел способ и работай для меня, не сохраняя его на локальном компьютере.

 // PictureContentContorl                        
    Microsoft.Office.Tools.Word.PictureContentControl ct;
    // Removing the control if already exists
                       Globals.Factory.GetVstoObject(Globals.ThisAddIn.Application.ActiveDocument).Controls.Remove("HeaderLogo");
    // adding control to a range rng
                            ct = Globals.Factory.GetVstoObject(Globals.ThisAddIn.Application.ActiveDocument).Controls.AddPictureContentControl(rng, "HeaderLogo");
                            ct.Image = Properties.Resources.my_logo;
                            ct = null;

Может быть, это кому-нибудь пригодится.

0 голосов
/ 29 декабря 2014

Я застрял в той же ситуации, и я не смог найти способ напрямую использовать ресурс изображения с InlineShapes без необходимости сохранять его ранее.

Хорошей папкой для сохранения этих файлов является My.Computer.FileSystem.SpecialDirectories.Temp.

0 голосов
/ 12 апреля 2013

Я неохотно - но успешно - сделал:

if (!File.Exists("singleright.png"))
{
object obj = Properties.Resources.singleright;
System.Drawing.Bitmap rs = (System.Drawing.Bitmap)(obj);
rs.Save("singleright.png");
}
insertionPoint.InlineShapes.AddPicture("singleright.png", ref LinkToFile, ref SaveWithDocument);

Это работает - и работает на чужом компьютере, когда я опубликовал свой Word - Addin. Но мне все еще не нравится это. Не должно быть необходимости сохранять файл образа из ресурсов на клиентском компьютере, он должен иметь возможность использовать ресурс напрямую.

...