С# копировать изображение из PowerPoint в Word

Мне нужно приложение для копирования текста и изображений из PowerPoint в Word. Я использую следующие библиотеки: Microsoft.Office.Interop.PowerPoint и Microsoft.Office.Interop.Word.

Текст легко передать, но когда я нахожу в PowerPoint фигуру, содержащую только изображение, появляется эта ошибка: «Произошла общая ошибка GDI+», в этой части кода:

foreach (PowerPoint.Shape shape in slide.Shapes)
{
   if (shape.HasTextFrame != MsoTriState.msoTrue){
      shape.Copy();
      Image img = (Image)Clipboard.GetData(DataFormats.Bitmap);
      string filepath = Environment.SpecialFolder.Desktop + "\\img.jpg";
      if (File.Exists(filepath))
      {
         File.Delete(filepath);
      }
      img.Save(filepath);
      doc.Shapes.AddPicture(filepath, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
   }
}

Как я могу скопировать фигуру, содержащую изображение, из PowerPoint в Word в этих обстоятельствах? Любая помощь приветствуется. Я предпочитаю пример кода.

Спасибо.


person Emanuel    schedule 01.03.2010    source источник
comment
Это shape.Copy() или Clipboard.GetData(..), который терпит неудачу?   -  person Mikael Svenson    schedule 01.03.2010
comment
Сбой в буфере обмена.GetData(..)   -  person Emanuel    schedule 01.03.2010
comment
Код отлично работает на моем компьютере с Win7 (.Net4 и Office 2010). Под какой ОС он работает и какая версия .Net?   -  person Mikael Svenson    schedule 01.03.2010
comment
У меня .Net 3.5 и Office 2007   -  person Emanuel    schedule 01.03.2010


Ответы (1)


Если вы перепишете свой код таким образом, он будет работать? GetImage выполнит автоматическое преобразование, чтобы убедиться, что это изображение. Если вы знаете, что это растровое изображение, вы можете включить проверку, которую я имею в коде, чтобы убедиться, что буфер обмена действительно содержит изображение.

shape.Copy();
bool imgOk = Clipboard.ContainsImage();
if (imgOk)
{
    Image img = Clipboard.GetImage();
    MessageBox.Show(imgOk.ToString());
    string filepath = @"c:\temp\img.jpg";
    if (File.Exists(filepath))
    {
        File.Delete(filepath);
    }
    img.Save(filepath);
}
person Mikael Svenson    schedule 01.03.2010