如何解决如何从PresentationDocument对象获取字节数组或流
我有Open Office XML代码,可对PowerPoint文件进行切片和切块。
由于Open XML SDK的性质,该代码大部分都在文件系统上的文件中读取和写入。目标是完全消除这些临时文件,并用字节数组和/或内存中的流替换它们。
其中一些代码将来自不同幻灯片源的PowerPoint合并在一起。此代码的示例如下。想象一个包含PowerPoint演示文稿的数据库。 PmlDocument
是Open 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
继承自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中找到它!
全部,这使您无需直接归档即可直接保存到 bytes 。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。