2016-09-23 10 views
1

Я использую openxml sdk 2.5 в сочетании с электроинструментами Эрика Уайта. Мне удалось создать динамические презентации pptx с использованием файлов шаблонов. (In C#) К сожалению, миниатюра теряется во время процесса.
Есть ли способ (re) создать миниатюру pptx-файла с помощью openxml или инструментов электропитания?
Я успешно написал код, который изменяет существующий эскиз с изображением. Но когда нет миниатюры, это дает мне System.NullReferenceException. Вот код:Программно изменить/добавить миниатюру точки pptx powerpoint. С Openxml sdk?

using OpenXmlPowerTools; 
using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using DocumentFormat.OpenXml.Packaging; 

namespace ConsoleApplication1 
{ 
    class AddThumbnail_ 
    { 
     public static void ReplaceThumbnail(ThumbnailPart thumbnailPart, string newThumbnail) 
     { 
      using (
       FileStream imgStream = new FileStream(newThumbnail, FileMode.Open, FileAccess.Read)) 
      { 
       thumbnailPart.FeedData(imgStream); 
      } 
     } 

     static void Main(string[] args) 
     { 
      var templatePresentation = "Modified.pptx"; 
      var outputPresentation = "Modified.pptx"; 
      var baPresentation = File.ReadAllBytes(templatePresentation); 
      var pmlMainPresentation = new PmlDocument("Main.pptx", baPresentation); 
      OpenXmlMemoryStreamDocument streamDoc = new OpenXmlMemoryStreamDocument(pmlMainPresentation); 
      PresentationDocument document = streamDoc.GetPresentationDocument(); 
      var thumbNailPart = document.ThumbnailPart; 
      ReplaceThumbnail(thumbNailPart, @"C:\Path\to\image\image.jpg"); 
      document.SaveAs(outputPresentation); 
     } 
    } 
} 

EDIT: Я понимаю, что этот вопрос был задан до (How to generate thumbnail image for a PPTX file in C#?) и ответ «включить скриншот предварительного просмотра при сохранении презентации», но это означало бы, что я должен откройте каждый pptx и вручную установите этот флаг. Я был бы признателен за решение C#.

Спасибо заранее!

ответ

1

Если эскиз никогда не существовал, тоне обязательно будет существовать в документе, поэтому переменная thumbNailPart в вашем коде будет равна нулю. В этом сценарии, а также для установки изображения для ThumbnailPart вам необходимо добавить часть.

Обычно при использовании OpenXml SDK вы бы назвали AddPart метод, проходящий в new ThumbnailPart, но по какой-то причине ThumbnailPart constructor является protected internal и, следовательно, не доступны для вас. Вместо этого существует метод AddThumbnailPart на PresentationDocument, который создаст новый ThumbnailPart. Метод AddThumbnailPart принимает либо строку для типа содержимого, либо элемент перечисления ThumbnailPartType.

добавив следующую строку в ваш код должен устранить проблему:

if (document.ThumbnailPart == null) 
    document.AddThumbnailPart(ThumbnailPartType.Jpeg); 

var thumbNailPart = document.ThumbnailPart;