2017-08-02 70 views
1

我有一个字节数组的xps文件内容存储在一个SQL服务器,我试图找回它,并显示它到一个DocumentViewer控制。从一个字节数组创建一个XPS文档

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文件不见了。

是否可以将字节数组转换为xps文档而不使用任何URI?如果没有,我还可以如何显示我的wpf应用程序中的文档(来自coruse的字节数组)?

+0

File.WriteAllBytes(字符串路径,字节[]字节)与正确的扩展将做? – Hybridzz

+0

https://stackoverflow.com/questions/381508/can-a-byte-array-be-written-to-a-file-in-c – Hybridzz

回答

2

可以使用的方法从您的字节数组提取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);