求教参数为Stream类型的文件流和int类型的文件格式,如何在不将文件流保存到本地的情况下,获取到其中的XpsDocument或者Document属性,且无乱码,附上代码片段
private void PreviewFile(Stream fileStr, int fileType)
{
try
{
using (fileStr)
{
switch (fileType)
{
case 1:
moonPdfPanel.Visibility = Visibility.Collapsed;
toolBar.Visibility = Visibility.Collapsed;
documentViewer.Visibility = Visibility.Visible;
byte[] buffer = new byte[fileStr.Length];
fileStr.Read(buffer, 0, buffer.Length);
var doc = new FlowDocument();
MemoryStream memoryStream = new MemoryStream(buffer);
var textRange = new TextRange(doc.ContentStart, doc.ContentEnd);
textRange.Load(memoryStream, DataFormats.Rtf);
MemoryStream ms = new MemoryStream();
Package package = Package.Open(ms, FileMode.Create, FileAccess.ReadWrite);
Uri DocumentUri = new Uri("pack://InMemoryDocument.xps");
PackageStore.RemovePackage(DocumentUri);
PackageStore.AddPackage(DocumentUri, package);
XpsDocument xpsDocument = new XpsDocument(package, CompressionOption.NotCompressed, DocumentUri.AbsoluteUri);
XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(xpsDocument);
writer.Write(((IDocumentPaginatorSource)doc).DocumentPaginator);
documentViewer.Document = xpsDocument.GetFixedDocumentSequence();
xpsDocument.Close();
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
default:
break;
}
}
}
catch (Exception ex)
{
_isLoaded = false;
throw;
}
}
把这个当临时文件了,操作完把文件删除
我目前就是这样处理的,获取一个系统临时文件,然后操作,领导说不能存到本地,只能使用内存,为了安全着想,我人有点麻
自带的XpsDocument接口粒度不够小,可能无法满足你的要求。你可以尝试GemBox.Spreadsheet,也许能满足你们的要求,不过免费版有页数限制。
开源的有PdfSharp.XPS,其他的你可以再找找。
功能实现要求越高是有代价的。也可以找到 XPS 文档格式协议,自己去解析,有一些这样的paper可以参考。