2016-09-23 8 views
1

저는 Eric White의 전동 공구와 함께 openxml sdk 2.5를 사용합니다. 템플릿 파일을 사용하여 동적 pptx 프레젠테이션을 만들었습니다. (In C#) 불행하게도 미리보기 이미지가 손실됩니다.
openxml 또는 전동 공구를 사용하여 pptx 파일의 축소판을 (다시) 만들 수있는 방법이 있습니까?
이미지와 함께 기존 축소판을 변경하는 코드를 작성했습니다. 그러나 썸네일이 없을 때는 System.NullReferenceException을 제공합니다. 여기 코드는 다음과 같습니다프로그래밍 방식으로 pptx 파워 포인트의 축소판을 변경/추가하십시오. 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); 
     } 
    } 
} 

편집 : 나는이 질문에 (How to generate thumbnail image for a PPTX file in C#?)하기 전에 물어와 대답은 "프레젠테이션을 저장할 때 미리보기 화면을 사용"그러나 이것은 내가해야 할 것 의미하고있다 실현 모든 pptx를 열고 수동으로이 플래그를 설정하십시오. C# 솔루션을 고맙게 생각합니다.

미리 감사드립니다.

답변

1

썸네일이 존재하지 않은 경우 ThumbnailPart이 문서에 반드시 존재하지 않아 코드의 thumbNailPart 변수가 null이됩니다. 이 시나리오에서는 ThumbnailPart의 이미지 설정뿐만 아니라 파트 자체를 추가해야합니다. OPENXML이 SDK를 사용하는 경우

은 일반적으로 당신은 new ThumbnailPart에 통과하는 AddPart 메소드를 호출 것이지만, 어떤 이유로 ThumbnailPart constructor 따라서 당신에 액세스 할 수 없습니다 protected internal입니다. 대신, 에 AddThumbnailPart 메서드가 있으며이 메서드는 ThumbnailPart을 새로 만듭니다. AddThumbnailPart 메서드는 콘텐츠 형식에 대한 문자열 또는 ThumbnailPartType 열거 형 멤버를 사용합니다.

코드에 다음을 추가하면 문제가 해결됩니다 :

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

var thumbNailPart = document.ThumbnailPart;