WPF: pdf文档不呈现

本文关键字:文档 pdf WPF | 更新日期: 2023-09-27 17:49:35

我有一个用c#编写的Windows Store应用程序的问题。

应用程序加载一个以字节数组形式存储在数据库中的PDF文件,并尝试在其自己的XAML视图中以Image对象的形式呈现第一页。代码如下:

PdfDocument _pdf = null;
#region Load PDF
using (InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream()) {
    await ms.WriteAsync(getPdfByteArrayFromDB().AsBuffer());
    _pdf = await PdfDocument.LoadFromStreamAsync(ms);
}
#endregion
if (_pdf != null && _pdf.PageCount > 0)
{
    PdfPage _page = _pdf.GetPage(0);
    if (_page != null)
    {
        #region Render page
        using (InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream()) {
            await _page.RenderToStreamAsync(ms);
            BitmapImage bmi = new BitmapImage();
            ms.Seek(0);
            await bmi.SetSourceAsync(ms);
            this.PdfPageImage.Source = bm;
        }
        #endregion
    }
}

不幸的是,它呈现的是白色图像。我试着写一个临时文件,将页面呈现为图像并读取它。

#region Render page
StorageFile cachedPage = await ApplicationData.Current.TemporaryFolder
        .CreateFileAsync("page.png", CreationCollisionOption.ReplaceExisting);
if (cachedPage != null)
{
    IRandomAccessStream randomStream 
            = await cachedPage.OpenAsync(FileAccessMode.ReadWrite);
    await _page.RenderToStreamAsync(randomStream);
    await randomStream.FlushAsync();
    randomStream.Dispose();
    _page.Dispose();
    BitmapImage bmi = new BitmapImage();
    bmi.SetSource(await cachedPage.OpenAsync(FileAccessMode.Read));
    this.PdfPageImage.Source = bmi;
}
#endregion

探索临时文件夹,有与原始PDF大小相同的临时图像,它们只是白色图像。因此,我尝试将存储的PDF写入临时文件。

#region Load PDF
StorageFile cachedPDF = await ApplicationData.Current.TemporaryFolder
        .CreateFileAsync("myPdf.pdf", CreationCollisionOption.ReplaceExisting);
if (cachedPDF != null)
{
    IRandomAccessStream randomStream = await cachedPDF.OpenAsync(FileAccessMode.ReadWrite);
    await randomStream.WriteAsync(getPdfByteArrayFromDB().AsBuffer());
    await randomStream.FlushAsync();
    randomStream.Dispose();
    _pdf = await PdfDocument.LoadFromFileAsync(cachedPDF);
}
#endregion

这两种方式都可以很好地呈现页面,所以存储的PDF很好,麻烦的是试图直接从内存流中读取字节数组。有没有一种方法来呈现PDF页面不写任何临时文件?

非常感谢!

WPF: pdf文档不呈现

你得倒带你的MemoryStream

using (InMemoryRandomAccessStream ms = new InMemoryRandomAccessStream()) {
    await ms.WriteAsync(getPdfByteArrayFromDB().AsBuffer());
    // The current position is at the end. Rewind to 0.
    ms.Seek(0);
    _pdf = await PdfDocument.LoadFromStreamAsync(ms);
}

我应该注意的是,通过将它写入临时文件,您创建了一个新的流,不需要重绕,这就是为什么它可以工作。