2011-07-05 6 views
2

바이트 배열에서 새 System.Windows.Xps.Packaging.XpsDocument 개체를 만들고 싶습니다. 로컬 컴퓨터에 바로 저장하지 않으려합니다. 임시 파일을 사용하여바이트 배열에서 XpsDocument를 만드는 방법은 무엇입니까?

잘 작동 : 나는 더이 같다 달성하고 싶은 그러나

public static XpsDocument OpenXpsDocument(string url) 
{ 
    WebClient webClient = new System.Net.WebClient(); 
    byte[] data = webClient.DownloadData(url); 

    using (BinaryWriter writer = new System.IO.BinaryWriter(File.OpenWrite(xpsTempFilePath))) 
    { 
     writer.Write(data); 
     writer.Flush(); 
    } 

    XpsDocument xpsDocument = new System.Windows.Xps.Packaging.XpsDocument(xpsTempFilePath, FileAccess.Read); 
    return xpsDocument; 
} 

: 상기 방법의

public static XpsDocument OpenXpsDocument(string url) 
{ 
    WebClient webClient = new WebClient(); 
    byte[] data = webClient.DownloadData(url); 
    Package package; 
    using (Stream stream = new MemoryStream(data)) 
    { 
     package = System.IO.Packaging.Package.Open(stream); 
    } 
    XpsDocument xpsDocument = new XpsDocument(package, CompressionOption.SuperFast, url); 
    return xpsDocument; 
} 

사용 그런 간다 :

XpsDocument xps = TaxReturnCreator.OpenXpsDocument(tempFileUrl); 
documentViewer1.Document = xps.GetFixedDocumentSequence(); 

마지막으로 설명한 방법을 사용하여 WPF 창에 XPS 콘텐츠를 표시하려고합니다 (저장하지 않고) System.ObjectDisposedException ("닫힌 스트림에 액세스 할 수 없습니다.")과 충돌합니다 (첫 번째 방법은 잘 작동 함).

XpsDocument를 만든 후에도 스트림을 계속 열어 두어야할까요, 아니면 다른 것을 놓치고 있습니까? 누군가 네트워크를 통해 바이트로 XPS 데이터를 검색하고 데이터에서 XpsDocument 개체를 만드는 완전히 다른 방법을 알고 있습니까?

답변

7

만약 XpsDocument 역행 스트림을 닫을 수 없다. 이 패키지를 수집하면 패키지가 Backing MemoryStream을 관리하도록 허용해야합니다. 다음을 수행하는 약간의 이단처럼 보일 수 있습니다.

public static XpsDocument OpenXpsDocument(string url) 
{ 
    var webClient = new WebClient(); 
    var data = webClient.DownloadData(url); 
    var package = System.IO.Packaging.Package.Open(new MemoryStream(data)); 
    var xpsDocument = new XpsDocument(package, 
             CompressionOption.SuperFast, 
             url); 
    return xpsDocument; 
} 

그러나이 방법을 수행해야합니다.

+0

고마워요, 그렇게 작동합니다! – cccec

+0

MemoryStream은 어떻게 폐기됩니까? –

+0

@LeoLorenzoLuis : 일반적으로 패키지 저장소에서 관리합니다. 열려있는 패키지는 IDisposable을 구현하므로 메모리와 스트림을 제거 할 시간이되면 언제든지 제거 할 수 있습니다. 해당 URI를 기억하는 한 저장소에서 패키지를 가져올 수 있습니다. http://msdn.microsoft.com/en-us/library/system.io.packaging.packagestore.getpackage.aspx – Will

0

당신은 using 블록으로

XpsDocument xpsDocument = new XpsDocument(package, CompressionOption.SuperFast, url); 

포함하려고한다 즉

Package package; 
using (Stream stream = new MemoryStream(data)) 
{ 
    package = System.IO.Packaging.Package.Open(stream); 
    XpsDocument xpsDocument = new XpsDocument(package, CompressionOption.SuperFast, url); 
} 
return xpsDocument; 
+1

은 작동하지 않습니다. 문서에 대한 모든 작업은 닫힌 스트림에 액세스하게됩니다. – Will

관련 문제