2017-08-02 17 views
1

xpsファイルコンテンツのバイト配列がSQL Serverに格納されていますが、これを取得して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ファイルがなくなった。

バイト配列をURIなしでxpsドキュメントに変換することは可能ですか?もしそうでなければ、どうすれば私の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); 
関連する問題