如何从 PresentationDocument 对象获取字节数组或流
How to Obtain a Byte Array or Stream from a PresentationDocument object
我有 Open Office XML 代码可以对 PowerPoint 文件进行切片和切块。
由于 Open XML SDK 的性质,此代码的大部分读取和写入文件系统上的文件。目标是完全消除这些临时文件,并用字节数组替换它们 and/or 内存流。
部分代码将来自不同幻灯片源的 PowerPoint 合并在一起。此代码的示例如下。想象一个包含 PowerPoint 演示文稿的数据库。 PmlDocument
是 class 打开 XML Power Tools:
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,然后我可以将其保存回数据库。
这段代码工作得很好,因为我已经在这个例子中使用了字节数组。当我必须处理 PresentationDocument
个对象时,就会出现问题。我们的程序中已经对这些对象进行了大量的处理,目前从这些对象中获取字节数组的方法是这样做的:
presentationDocument.SaveAs(fileName);
byte[] array = File.ReadAllBytes(fileName);
这不是我想要的。
不幸的是,似乎没有更好的方法从 PresentationDocument
中提取字节。有谁知道如何在内存中执行此操作,也许使用 MemoryStream
对象?
注意:我已阅读 OfficeTalk: Working with In-Memory Open XML Documents,但它似乎假定您已经拥有正确文档格式的字节数组。
查看源代码 here, PresentationDocument
inherits from 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);
}
}
当您知道它在那里时,您最终可以在 documentation!
中找到它
All-in-all,这使您能够直接保存到 字节 ,而无需先去归档。
我有 Open Office XML 代码可以对 PowerPoint 文件进行切片和切块。
由于 Open XML SDK 的性质,此代码的大部分读取和写入文件系统上的文件。目标是完全消除这些临时文件,并用字节数组替换它们 and/or 内存流。
部分代码将来自不同幻灯片源的 PowerPoint 合并在一起。此代码的示例如下。想象一个包含 PowerPoint 演示文稿的数据库。 PmlDocument
是 class 打开 XML Power Tools:
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,然后我可以将其保存回数据库。
这段代码工作得很好,因为我已经在这个例子中使用了字节数组。当我必须处理 PresentationDocument
个对象时,就会出现问题。我们的程序中已经对这些对象进行了大量的处理,目前从这些对象中获取字节数组的方法是这样做的:
presentationDocument.SaveAs(fileName);
byte[] array = File.ReadAllBytes(fileName);
这不是我想要的。
不幸的是,似乎没有更好的方法从 PresentationDocument
中提取字节。有谁知道如何在内存中执行此操作,也许使用 MemoryStream
对象?
注意:我已阅读 OfficeTalk: Working with In-Memory Open XML Documents,但它似乎假定您已经拥有正确文档格式的字节数组。
查看源代码 here, PresentationDocument
inherits from 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);
}
}
当您知道它在那里时,您最终可以在 documentation!
中找到它All-in-all,这使您能够直接保存到 字节 ,而无需先去归档。