【问题标题】:Creating an XPS document from a byte array从字节数组创建 XPS 文档
【发布时间】:2018-01-09 07:50:30
【问题描述】:

我有一个存储在 sql server 中的 xps 文件内容的字节数组,我正在尝试检索它并将其显示到 DocumentViewer 控件中。

cmd.CommandText = "select text from [table] where docName = '" + selectedText + "'";
using (SqlDataReader read = cmd.ExecuteReader())
{
    while (read.Read())
    {
        byte[] retrieve = ((byte[])read["text"]); //text is column name for the byte array
        var package = System.IO.Packaging.Package.Open(new MemoryStream(retrieve));
        var xpsDocument = new XpsDocument(package, System.IO.Packaging.CompressionOption.Maximum);
        pptViewer.Visibility = System.Windows.Visibility.Visible;
        pptViewer.Document = xpsDocument.GetFixedDocumentSequence();
    }
}

问题是这一行new XpsDocument(package, System.IO.Packaging.CompressionOption.Maximum) 需要一个额外的参数——文件的Uri。我没有它,因为它没有存储在本地 - 我将它转换为字节数组然后存储它,所以原来的 xps 文件不见了。

是否可以将字节数组转换为没有任何 uri 的 xps 文档?如果没有,我还能如何在我的 wpf 应用程序中显示文档(来自一个字节数组,当然)?

【问题讨论】:

标签: c# arrays wpf


【解决方案1】:

您可以使用一种方法从字节数组中提取FixedDocumentSequence,例如:

private FixedDocumentSequence GetFixedDocumentSequence(byte[] xpsBytes)
{
    Uri packageUri;
    XpsDocument xpsDocument = null;

    using (MemoryStream xpsStream = new MemoryStream(xpsBytes))
    {
        using (Package package = Package.Open(xpsStream))
        {
            packageUri = new Uri("memorystream://myXps.xps");

            try
            {
                PackageStore.AddPackage(packageUri, package);
                xpsDocument = new XpsDocument(package, CompressionOption.Maximum, packageUri.AbsoluteUri);

                return xpsDocument.GetFixedDocumentSequence();
            }
            finally
            {
                if (xpsDocument != null)
                {
                    xpsDocument.Close();
                }
                PackageStore.RemovePackage(packageUri);
            }
        }
    }
}

然后调用它在你的代码中设置你的DocumentViewer

pptViewer.Document = GetFixedDocumentSequence(retrieve);

【讨论】:

  • 为什么尝试最终包装添加包而不是在 try 之前?您不想尝试在 finally 中删除从未添加的包,对吗?
  • 是的,你是对的@Maslow。事实上,你也可以使用GetPackage 方法来检查是否添加了包。
猜你喜欢
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 2014-03-20
  • 2012-03-15
  • 2017-10-09
  • 1970-01-01
  • 2011-10-05
相关资源
最近更新 更多