将PDF从内存加载到telerik:RadPdfViewer

时间:2014-01-29 14:21:51

标签: 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 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。

3 个答案:

答案 0 :(得分:7)

来自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,则可用于关闭流   流。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

我使用的另一种方法是:

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