2012-09-07 117 views
2

我只想将一些幻灯片合并到使用OpenXML SDK的主演示文稿中,我不想使用Introp,因为它在服务器环境中并不理想,我尝试了许多代码示例,但合并的演示文稿总是显示我修复信息,当我比较损坏的文件和修复的文件时,我发现ID不能正确生成。使用OpenXML合并PowerPoint幻灯片

是否有任何实际工作的开源库或示例代码。我听说过Aspose,但它是一个付费图书馆。

+0

Java是您的选择吗?我已经写了一些代码,它使用pptx4j来做到这一点。你可以随时IKVM它,我猜... – JasonPlutext

回答

-1

是的你面对的问题,如果id的不唯一,下面是我正在使用的代码。 我知道它的旧线程,但如果有人正在寻找答案,

public static void MergeSlides(string presentationFolder, string sourcePresentation, string destPresentation) 
{ 
    int id = 0; 

    // Open the destination presentation. 
    using (PresentationDocument myDestDeck = PresentationDocument.Open(presentationFolder + destPresentation, true)) 
    { 
     PresentationPart destPresPart = myDestDeck.PresentationPart; 

     // If the merged presentation does not have a SlideIdList element yet, add it. 
     if (destPresPart.Presentation.SlideIdList == null) 
      destPresPart.Presentation.SlideIdList = new SlideIdList(); 

     // Open the source presentation. This will throw an exception if the source presentation does not exist. 
     using (PresentationDocument mySourceDeck = PresentationDocument.Open(presentationFolder + sourcePresentation, false)) 
     { 
      PresentationPart sourcePresPart = mySourceDeck.PresentationPart; 

      // Get unique ids for the slide master and slide lists for use later. 
      uniqueId = GetMaxSlideMasterId(destPresPart.Presentation.SlideMasterIdList); 

      uint maxSlideId = GetMaxSlideId(destPresPart.Presentation.SlideIdList); 

      // Copy each slide in the source presentation, in order, to the destination presentation. 
      foreach (SlideId slideId in sourcePresPart.Presentation.SlideIdList) 
      { 
       SlidePart sp; 
       SlidePart destSp; 
       SlideMasterPart destMasterPart; 
       string relId; 
       SlideMasterId newSlideMasterId; 
       SlideId newSlideId; 

       // Create a unique relationship id. 
       id++; 
       sp = (SlidePart)sourcePresPart.GetPartById(slideId.RelationshipId); 

       relId = sourcePresentation.Remove(sourcePresentation.IndexOf('.')) + id; 

       // Add the slide part to the destination presentation. 
       destSp = destPresPart.AddPart<SlidePart>(sp, relId); 

       // The slide master part was added. Make sure the relationship between the main presentation part and 
       // the slide master part is in place. 
       destMasterPart = destSp.SlideLayoutPart.SlideMasterPart; 
       destPresPart.AddPart(destMasterPart); 

       // Add the slide master id to the slide master id list. 
       uniqueId++; 
       newSlideMasterId = new SlideMasterId(); 
       newSlideMasterId.RelationshipId = destPresPart.GetIdOfPart(destMasterPart); 
       newSlideMasterId.Id = uniqueId; 

       destPresPart.Presentation.SlideMasterIdList.Append(newSlideMasterId); 

       // Add the slide id to the slide id list. 
       maxSlideId++; 
       newSlideId = new SlideId(); 
       newSlideId.RelationshipId = relId; 
       newSlideId.Id = maxSlideId; 

       destPresPart.Presentation.SlideIdList.Append(newSlideId); 
      } 

      // Make sure that all slide layout ids are unique. 
      FixSlideLayoutIds(destPresPart); 
     } 

     // Save the changes to the destination deck. 
     destPresPart.Presentation.Save(); 
    } 
} 

    public static void FixSlideLayoutIds(PresentationPart presPart) 
    { 
     //Need to make sure all slide layouts have unique ids 
     foreach (SlideMasterPart slideMasterPart in presPart.SlideMasterParts) 
     { 
      foreach (SlideLayoutId slideLayoutId in slideMasterPart.SlideMaster.SlideLayoutIdList) 
      { 
       uniqueId++; 
       slideLayoutId.Id = (uint)uniqueId; 
      } 
      slideMasterPart.SlideMaster.Save(); 
     } 
    } 
+0

未命中GetMaxSlideMasterId和GetMaxSlideId方法的定义。 –