我正在使用WPF DocumentViewer预览应用程序中的XPS文档。该代码实际上实际上是从PDF转换为XPF。当我在预览过程中向下滚动时,它的行为符合预期。但是,当我到达必须显示第二页的位置时,我得到了错误:
(调度程序):[System.NotImplementedException:此类未实现此方法。 在System.Net.WebRequest.BeginGetResponse(AsyncCallback回调,对象状态) 在System.IO.Packaging.PackWebRequest.GetResponse() 在MS.Internal.WpfWebRequestHelper.GetResponse(WebRequest请求) 在MS.Internal.WpfWebRequestHelper.GetResponseStream(WebRequest请求,ContentType和contentType) 在System.Windows.Documents.PageContent._LoadPageImpl(Uri baseUri,Uri uriToLoad,FixedPage&fixedPage,Stream&pageStream) 在System.Windows.Documents.PageContentAsyncResult.Dispatch(Object arg) 在System.Windows.Threading.ExceptionWrapper.InternalRealCall(委托回调,对象args,Int32 numArgs) 在System.Windows.Threading.ExceptionWrapper.TryCatchWhen(对象源,委托回调,对象args,Int32 numArgs,委托catchHandler))。
我不了解WebRequest,因为我在不允许Internet的封闭网络中工作。我不需要预览。
我的代码如下。一些代码是根据来自this post的信息编写的。我最初在那个帖子中描述了一个错误,该错误似乎已经修复,但是现在我遇到了以上错误,无法弄清原因。该错误表明“未实现方法”,但不知道它在谈论哪种方法。滚动时似乎正在进行异步调用。有人可以解释它在做什么以及如何进行吗?
public void PreviewDocument()
{
m_documentService = GcsIocContainer.Instance.Container.Resolve<IDocumentService>();
var xpsDocument = m_documentService.ConvertPdfToXps(Convert.FromBase64String(PdfBase64String));
FixedDocumentSequence fixedDocumentSequence = GetFixedDocumentSequence(xpsDocument);
m_nativeDocumentViewer.Document = fixedDocumentSequence;
}
public class MemoryStreamUri : IWebRequestCreate
{
public WebRequest Create(Uri uri)
{
return new MemoryStreamRequest(uri);
}
}
public class MemoryStreamRequest : WebRequest
{
private Uri _uri;
public MemoryStreamRequest(Uri uri)
{
_uri = uri;
}
public override Uri RequestUri
{
get { return _uri; }
}
public override int Timeout
{
get { return System.Threading.Timeout.Infinite; }
}
}
private FixedDocumentSequence GetFixedDocumentSequence(byte[] xpsBytes)
{
Uri packageUri;
XpsDocument xpsDocument = null;
var memURi = new MemoryStreamUri();
WebRequest.RegisterPrefix("memorystream", memURi);
using (MemoryStream xpsStream = new MemoryStream(xpsBytes))
{
using (Package package = Package.Open(xpsStream))
{
packageUri = new Uri(@"memorystream://" + Path.GetFileName(Guid.NewGuid().ToString()) + ".xps");
try
{
PackageStore.AddPackage(packageUri, package);
xpsDocument = new XpsDocument(package, CompressionOption.Maximum, packageUri.AbsoluteUri);
return xpsDocument.GetFixedDocumentSequence();
}
catch (Exception ex)
{
var msg = ex.Message;
return null;
}
finally
{
if (xpsDocument != null)
{
xpsDocument.Close();
}
PackageStore.RemovePackage(packageUri);
}
}
}
}