gpt4 book ai didi

c# - WPF : PdfDocument not rendering

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:41 25 4
gpt4 key购买 nike

我遇到一些用 C# 编写的 Windows 应用商店应用程序的问题。

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

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 页面?

非常感谢!

最佳答案

你必须倒回你的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);
}

我应该注意到,通过将它写入临时文件,您正在创建一个不需要倒带的新流,这就是它起作用的原因。

关于c# - WPF : PdfDocument not rendering,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22347771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com