C# 将PDF从内存加载到telerik:RadPdfViewer
我有一个PDF文件作为字节数组存储在数据库中。 我正在将数据库中的PDF字节数组读回应用程序 现在,我试图用RadPdfViewer显示PDF,但它不起作用 这是我的密码:C# 将PDF从内存加载到telerik:RadPdfViewer,c#,wpf,database,pdf,telerik,C#,Wpf,Database,Pdf,Telerik,我有一个PDF文件作为字节数组存储在数据库中。 我正在将数据库中的PDF字节数组读回应用程序 现在,我试图用RadPdfViewer显示PDF,但它不起作用 这是我的密码: byte[] pdfAsByteArray= File.ReadAllBytes(@"C:\Users\Username\Desktop\Testfile.pdf"); //Save "pdfAsByteArray" into database //... //Load pdf from d
byte[] pdfAsByteArray= File.ReadAllBytes(@"C:\Users\Username\Desktop\Testfile.pdf");
//Save "pdfAsByteArray" into database
//...
//Load pdf from database into byte[] variable "pdfAsByteArray"
using (var memoryStream = new MemoryStream(pdfAsByteArray))
{
this.PdfViewer.DocumentSource = new PdfDocumentSource(memoryStream);
}
当我执行应用程序时,我只得到一个空的PdfViewer
问题:如何正确设置文档源
问题:如何处理流?(请注意,使用
不起作用)
注意:我不想避免将临时文件写入磁盘之类的事情
编辑: 我找到了答案,但我对这个解决方案并不完全满意: 不工作:
using (var memoryStream = new MemoryStream(pdfAsByteArray))
{
this.PdfViewer.DocumentSource = new PdfDocumentSource(memoryStream);
}
工作:
var memoryStream = new MemoryStream(pdfAsByteArray);
this.PdfViewer.DocumentSource = new PdfDocumentSource(memoryStream);
我不知道teleriks RadPdfViewer组件是如何工作的,但我不想处理流。您需要实现PdfDocumentSource加载事件。这是当流被加载并用完时,可以在那个时候关闭/处理。从Telerik(特别是关于“注意”声明此加载是异步完成的),我相信这应该可以工作,同时仍然为您提供关闭流的方法(不像您能够使用块使用
那样干净,但仍然比将其打开要好):
我是徒手操作的,没有访问Telerik API的权限,因此无法获得加载事件的确切细节
编辑
以下是我找到的文档中的相关细节(我的重点):
PdfDocumentSource异步加载文档。如果需要
在导入文档后获取对DocumentSource的引用
文档,则应使用PdfDocumentSource的已加载事件
对象获取加载的文档。这也是一种方便的方法
如果您正在从数据库加载PDF,则可以使用它来关闭流
流。
我使用的另一种方法是:
this.PdfViewer.PdfjsProcessingSettings.FileSettings.Data = Convert.ToBase64String(File.ReadAllBytes(@"C:\Users\Username\Desktop\Testfile.pdf"));
令人尴尬的是,它只在没有使用块的情况下工作。我不知道telerik组件是否会在加载完成后自动处理流。我有一个支持请求等待澄清这个问题。@DavidKhaykin我看到了您的原始答案,做了一些挖掘,发现了关于加载的事件的趣闻,u写道p/提交了我的例子,看到你也提出了同样的建议。伟人所见略同。
this.PdfViewer.PdfjsProcessingSettings.FileSettings.Data = Convert.ToBase64String(File.ReadAllBytes(@"C:\Users\Username\Desktop\Testfile.pdf"));