将内存中的PDF加载到Telerik:RadPdfViewer中

5

我有一个以字节数组形式存储在数据库中的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为空。
问题:如何正确设置DocumentSource?
问题:如何清除流?(注意,使用“using”无效)
注:我想避免像将临时文件写入磁盘这样的操作。
编辑:
我找到了解决方法,但对这个解决方案并不完全满意。
不起作用:
using (var memoryStream = new MemoryStream(pdfAsByteArray))
{
    this.PdfViewer.DocumentSource = new PdfDocumentSource(memoryStream);
}

工作中:

var memoryStream = new MemoryStream(pdfAsByteArray);
this.PdfViewer.DocumentSource = new PdfDocumentSource(memoryStream);

我不知道telerik的RadPdfViewer组件是如何工作的,但我想要释放这个流。

3个回答

8

根据Telerik 文档,特别是关于“警告”的部分(指出加载是异步完成的),我相信这个方法可以正常工作,同时仍然提供了一种关闭流的方式(虽然没有using块那么干净,但比保持打开状态要好):

//class variable
private MemoryStream _stream;

_stream = new MemoryStream(pdfAsByteArray);
var docSource = new PdfDocumentSource(memoryStream);
docSource.Loaded += (sender, args) => { if (_stream != null) _stream.Dispose();};
this.PdfViewer.DocumentSource = docSource;

我是免费手工完成这项工作的,并且没有访问Telerik API的权限,因此我无法获得Loaded事件的确切细节。
编辑: 以下是我找到的相关文档细节(重点在于强调):
PdfDocumentSource异步加载文档。如果您想在导入文档后获取对DocumentSource的引用,则应使用PdfDocumentSource对象的Loaded事件来获取已加载的文档。 这也是一种方便的方法,可用于关闭流,如果您正在从流加载PDF。

我想知道当加载完成后,Telerik组件是否会自动释放流。我有一个支持请求待解决这个问题。 - Joel
2
@DavidKhaykin,我看到了你的原始答案,进行了一些调查,并发现了关于“Loaded”事件的细节,写了一个示例并提交了它,然后发现你也建议了同样的事情。英雄所见略同。 - Sven Grosen

2
你需要实现PdfDocumentSource的已加载事件。这是在流被加载并使用后,可以在该时间关闭/释放。

尴尬的是,它只能在没有使用块的情况下工作。 - Joel

0

我使用的另一种方法是:

this.PdfViewer.PdfjsProcessingSettings.FileSettings.Data = Convert.ToBase64String(File.ReadAllBytes(@"C:\Users\Username\Desktop\Testfile.pdf"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接