将PDF从内存加载到telerik:RadPdfViewer

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将PDF从内存加载到telerik:RadPdfViewer相关的知识,希望对你有一定的参考价值。

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

现在,我正在尝试使用RadPdfViewer显示PDF但它无法正常工作。

这是我的代码:

    byte[] pdfAsByteArray= File.ReadAllBytes(@"C:UsersUsernameDesktopTestfile.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);

我不知道teleriks RadPdfViewer组件是如何工作的,但我不想处理Stream。

答案

从Telerik documentation(特别是关于“注意”表示此加载是异步完成的),我相信这应该工作,同时仍然提供一种方法来关闭流(不像你能够使用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,这也是一种方便的方法,可用于关闭流。

另一答案

您需要实现PdfDocumentSource Loaded事件。这是当流加载并用完时,并且可以在那时关闭/处理。

以上是关于将PDF从内存加载到telerik:RadPdfViewer的主要内容,如果未能解决你的问题,请参考以下文章

将 PDF 文档从远程服务器加载到 base64 编码数据中

Telerik报告只有PDF选项,没有Excel和Word选项

如何将图像、pdf、音频、视频和任何文件系统从 iphone 本地内存上传到服务器(API)

尝试使用 PDF 加载 Webview,从 Parse 接收链接

如何将从 http 调用收到的 pdf 加载到查看器中?

如何将 swf 文件从内存加载到 QWebEngineView