Извлечение имени изображения из файла PowerPoint

#c# #.net #openxml-sdk #presentation

#c# #.net #openxml-sdk #презентация

Вопрос:

Мне нужно получить имя файла изображения из изображения в файле pptx. Я уже получил поток из изображения, но у меня не было имени файла изображения… Вот мой код:

 private static Stream GetParagraphImage(DocumentFormat.OpenXml.Presentation.Picture     picture, DocumentFormat.OpenXml.Packaging.PresentationDocument presentation, ref     MyProject.Import.Office.PowerPoint.Presentation.Paragraph paragraph)
{
        // Getting the image id
        var imageId = picture.BlipFill.Blip.Embed.Value;
        // Getting the stream of the image
        var part = apresentacao.PresentationPart.GetPartById(idImagem);
        var stream = part.GetStream();
        // Getting the image name
        var imageName = GetImageName(imageId, presentation);  
/* Here i need a method that returns the image file name based on the id of the image and the presentation object.*/
        // Setting my custom object ImageName property
        paragraph.ImageName = imageName;
        // Returning the stream
        return stream;
}
  

Кто-нибудь знает, как я могу это сделать?
Спасибо!!

Ответ №1:

На самом деле существует два имени файла для изображения / изображения в файле pptx:

Если вам нужно имя файла изображения, поскольку оно встроено в файл pptx, вы можете использовать следующую функцию:

 public static string GetEmbeddedFileName(ImagePart part)
{
  return part.Uri.ToString();
}
  

Если вам нужно исходное имя файловой системы вашего изображения, вы можете использовать следующую функцию:

 public static string GetOriginalFileSystemName(DocumentFormat.OpenXml.Presentation.Picture pic)
{
  return pic.NonVisualPictureProperties.NonVisualDrawingProperties.Description;
}
  

НАЧАТЬ РЕДАКТИРОВАНИЕ:

Вот полный пример кода:

 using (var doc = PresentationDocument.Open(fileName, false))
{
  var presentation = doc.PresentationPart.Presentation;

  foreach (SlideId slide_id in presentation.SlideIdList)
  {
    SlidePart slide_part = doc.PresentationPart.GetPartById(slide_id.RelationshipId) as SlidePart;
    if (slide_part == null || slide_part.Slide == null)
        continue;
    Slide slide = slide_part.Slide;

    foreach (var pic in slide.Descendants<DocumentFormat.OpenXml.Presentation.Picture>())
    {
      string id = pic.NonVisualPictureProperties.NonVisualDrawingProperties.Id;
      string desc = pic.NonVisualPictureProperties.NonVisualDrawingProperties.Description;

      Console.Out.WriteLine(desc);
    }
  }
}
  

ЗАВЕРШЕНИЕ РЕДАКТИРОВАНИЯ

Надеюсь, это поможет.

Комментарии:

1. Hii, спасибо за ответ, но свойство NonVisualDrawingProperties не существует непосредственно в объекте Picture … Сначала мне нужно получить NonVisualPictureProperties, а затем NonVisualDrawingProperties. Описание, но когда я обращаюсь к этому свойству, она возвращает null… Есть какое-то использование или что-то еще, что мне нужно ввести раньше?

2. @mnatan.brito: Ты прав. Свойство NonVisualDrawingProperties не существует непосредственно в классе picture. Я обновил свой ответ более полным образцом кода. Я снова запустил его в документе power point 2007, и он печатает исходные имена файлов. Надеюсь, это поможет.

3. @mnatan.brito: Другим вариантом было бы переименовать ваш file.pptx в file.zip . Затем откройте zip-архив и выполните поиск оригинального имени файла одного из ваших встроенных изображений во всех файлах, содержащихся в архиве. Если вы его не найдете, значит, ваш pptx не содержит исходной информации об имени файла.