我只想将一些幻灯片合并到使用OpenXML SDK的主演示文稿中,我不想使用Introp,因为它在服务器环境中并不理想,我尝试了许多代码示例,但合并的演示文稿总是显示我修复信息,当我比较损坏的文件和修复的文件时,我发现ID不能正确生成。使用OpenXML合并PowerPoint幻灯片
是否有任何实际工作的开源库或示例代码。我听说过Aspose,但它是一个付费图书馆。
我只想将一些幻灯片合并到使用OpenXML SDK的主演示文稿中,我不想使用Introp,因为它在服务器环境中并不理想,我尝试了许多代码示例,但合并的演示文稿总是显示我修复信息,当我比较损坏的文件和修复的文件时,我发现ID不能正确生成。使用OpenXML合并PowerPoint幻灯片
是否有任何实际工作的开源库或示例代码。我听说过Aspose,但它是一个付费图书馆。
微软MSDN文章
http://msdn.microsoft.com/en-us/library/office/ee361883(v=office.12).aspx
对如何Powerpoint展示合并在一起,一步步指令。
它负责确保ID的唯一性。唯一的缺点是它也会为每张幻灯片复制幻灯片母版,导致最终的幻灯片文件比预期的要大。
尝试演示文稿生成器代码,在http://openxmldeveloper.org/。
是的你面对的问题,如果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();
}
}
未命中GetMaxSlideMasterId和GetMaxSlideId方法的定义。 –
Java是您的选择吗?我已经写了一些代码,它使用pptx4j来做到这一点。你可以随时IKVM它,我猜... – JasonPlutext