簡體   English   中英

如何從 PresentationDocument object 中獲取字節數組或 Stream

[英]How to Obtain a Byte Array or Stream from a PresentationDocument object

我有 Open Office XML 代碼,可以對 PowerPoint 文件進行切片和切塊。

由於 Open XML SDK 的性質,此代碼的大部分讀取和寫入文件系統上的文件。 目標是完全消除這些臨時文件,並用字節 arrays 和/或內存流替換它們。

其中一些代碼將來自不同幻燈片源的 PowerPoint 合並在一起。 此代碼的示例如下。 想象一個包含 PowerPoint 演示文稿的數據庫。 PmlDocument在Open XML Power Tools中是一個class:

foreach (var item in database)
{
    var openXmlDocument = new OpenXmlPowerToolsDocument(item.data);
    var document = new PmlDocument(openXmlDocument);
    sources.Add(new SlideSource(document, false));
}

PmlDocument newDocument = PresentationBuilder.BuildPresentation(sources);
byte[] data = newDocument.DocumentByteArray;

其中byte[] data代表一個新的 PowerPoint PPTX,然后我可以將其保存回數據庫。

這段代碼工作得很好,因為我已經在這個例子中使用了字節 arrays。 當我必須處理PresentationDocument對象時會出現問題。 我們的程序中已經對這些對象進行了大量處理,目前從這些對象中獲取字節數組的方法是這樣做的:

presentationDocument.SaveAs(fileName);
byte[] array = File.ReadAllBytes(fileName);

這不是我想要的。

不幸的是,似乎沒有更好的方法從PresentationDocument中提取字節。 有誰知道如何在 memory 中執行此操作,也許使用MemoryStream object?

注意:我已閱讀OfficeTalk: Working with In-Memory Open XML Documents ,但它似乎假定您已經擁有正確文檔格式的字節數組。

這里的源碼, PresentationDocument繼承自OpenXmlPackage ,它實現了SaveAs方法,當遵循最終調用時:

/// <summary>
/// Creates a clone of this OpenXml package, opened on the given stream.
/// The cloned OpenXml package is opened with the same settings, i.e.,
/// FileOpenAccess and OpenSettings, as this OpenXml package.
/// </summary>
/// <param name="stream">The IO stream on which to open the OpenXml package.</param>
/// <returns>The cloned OpenXml package.</returns>
public OpenXmlPackage Clone(Stream stream)`

最后,這只是將OpenXmlPart復制到stream

using (OpenXmlPackage clone = CreateClone(stream))
{
     foreach (var part in Parts)
     {
         clone.AddPart(part.OpenXmlPart, part.RelationshipId);
     }
}

當您知道它在那里時,您最終可以在文檔中找到它!

總而言之,這使您能夠直接保存到字節,而無需先歸檔。

暫無
暫無

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

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