簡體   English   中英

使用 OpenXML 將包含注釋的幻燈片從一個 PowerPoint 演示文稿復制到另一個 SDK

[英]Copy slide containing notes from one PowerPoint presentaition to another with OpenXML SDK

我正在嘗試將幻燈片從一個 PowerPoint 演示文稿復制到另一個。 我已經使用了以下文章中概述的過程,它通常工作正常。

https://learn.microsoft.com/en-us/previous-versions/office/developer/office-2007/ee361883(v=office.12)?redirectedfrom=MSDN

但是,當要復制的幻燈片包含注釋時,復制后生成的演示文稿會損壞。 我注意到代碼生成了一個新的notesMaster ,它沒有添加到 presentation.xml 中的notesMasterIdLst ,我懷疑這可能是問題所在。 但是,我無法將新的 notes master 添加到演示文稿中,因為演示文稿只能有一個notesMaster

根據Microsoft 文檔,Open XML SDK 是這樣定義的:

The Open XML SDK 2.5 simplifies the task of manipulating Open XML packages and the underlying Open XML schema elements within a package. Open XML SDK 2.5 封裝了開發人員在 Open XML 包上執行的許多常見任務,因此您只需幾行代碼即可執行復雜的操作。

使用 Open XML SDK 似乎不容易解決您的問題。 如果您將Aspose.Slides 用於 .NET ,您將復制一張帶有注釋的幻燈片,如下所示:

var sourceFileName = "example1.pptx";
var targetFileName = "example2.pptx";
var slideIndex = 0;

using (var sourcePresentation = new Presentation(sourceFileName))
using (var targetPresentation = new Presentation(targetFileName))
{
    var slide = sourcePresentation.Slides[slideIndex];
    targetPresentation.Slides.AddClone(slide);
    targetPresentation.Save(targetFileName, SaveFormat.Pptx);
}

您還可以評估Aspose.Slides Cloud以進行演示操作。 這個基於 REST 的 API 允許您每月為 API 學習和演示處理進行 150 次免費的 API 調用。 以下代碼示例向您展示了如何使用 Aspose.Slides Cloud 執行相同操作:

var slidesApi = new SlidesApi("my_client_id", "my_client_key");

var sourceFileName = "example1.pptx";
var targetFileName = "example2.pptx";
var slideIndex = 1;

using (var sourceStream = File.OpenRead(sourceFileName))
    slidesApi.UploadFile(sourceFileName, sourceStream);

using (var targetStream = File.OpenRead(targetFileName))
    slidesApi.UploadFile(targetFileName, targetStream);

slidesApi.CopySlide(targetFileName, slideIndex, null, sourceFileName);

using (var resultStream = slidesApi.DownloadFile(targetFileName))
using (var fileStream = File.OpenWrite(targetFileName))
    resultStream.CopyTo(fileStream);

我在 Aspose 擔任支持開發人員。

我相信我通過執行以下步驟設法解決了這個問題:

  1. 打開它們時使源演示文稿可編輯:

     using (PresentationDocument mySourceDeck = PresentationDocument.Open( presentationFolder + sourcePresentation, true)) { PresentationPart sourcePresPart = mySourceDeck.PresentationPart;
  2. 從幻燈片中復制備注幻燈片CommonSlideData,然后從幻燈片中刪除備注幻燈片部分:

     sp = (SlidePart)sourcePresPart.GetPartById(slideId.RelationshipId); CommonSlideData notesSlideData = null; if (sp.NotesSlidePart.= null) { notesSlideData = (CommonSlideData)sp.NotesSlidePart.NotesSlide.CommonSlideData;CloneNode(true). sp.DeletePart(sp;NotesSlidePart); }
  3. 通過將新的 NotesSlidePart 添加到復制的幻燈片(現在添加到目標演示文稿並稱為 destSp),添加關系部分和使用復制的筆記幻燈片數據初始化的新 NotesSlide object 來讀取任何現有的筆記幻燈片數據。

     if (notesSlideData.= null) { NotesSlidePart notesSlidePart1 = destSp;AddNewPart<NotesSlidePart>(). notesSlidePart1;AddPart(destSp). notesSlidePart1.AddPart(destPresPart;NotesMasterPart); NotesSlide notesSlide = new NotesSlide(notesSlideData). notesSlidePart1;NotesSlide = notesSlide; }

警告:注釋幻燈片將從源演示文稿文件中刪除,因此您可能需要先復制它們,或者在復制/合並后將它們添加回演示文稿。

這似乎至少保留了筆記幻燈片的一些現有格式,例如粗體文本。 但是,我還沒有在很多不同的演示文稿上對此進行測試,所以我想如果筆記幻燈片基於非常不同的筆記幻燈片母版,可能會出現一些問題,但我不確定。

與此相關,我在讓筆記幻燈片工作后遇到了類似的問題,這似乎是因為要復制演示文稿中存在的任何自定義 xml 部分。 這些演示文稿在添加一些代碼以將與復制的演示文稿的 CustomXmlPart 的關系添加到目標演示文稿后起作用:

foreach (var customXmlPart in destSp.GetPartsOfType<CustomXmlPart>())
{
  destPresPart.AddPart(customXmlPart);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM