2016-09-23 8 views
1

私はopenxml sdk 2.5をEric Whiteの電動工具と組み合わせて使用​​しています。テンプレートファイルを使って動的なpptxプレゼンテーションを作成しました。 (In C#) 残念ながら、サムネイルは処理中に失われます。
openxmlやパワーツールを使ってpptxファイルのサムネイルを(再)作成する方法はありますか?
イメージで既存のサムネイルを変更するコードを書きました。しかし、サムネイルがない場合は、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変数は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; 
関連する問題