Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将PDF从内存加载到telerik:RadPdfViewer_C#_Wpf_Database_Pdf_Telerik - Fatal编程技术网

C# 将PDF从内存加载到telerik:RadPdfViewer

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

我有一个PDF文件作为字节数组存储在数据库中。 我正在将数据库中的PDF字节数组读回应用程序

现在,我试图用RadPdfViewer显示PDF,但它不起作用

这是我的密码:

    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"));