2
我用C#编写的一些Windows应用商店应用程序有问题。WPF:PdfDocument not rendering
该应用程序在数据库中加载以字节数组形式存储的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页面?
非常感谢!
当然!谢谢!这是合乎逻辑的,而有趣的事实是,我已经这样做了PDF加载后渲染页面。但是,我很抱歉,白页再次罢工。 :(+1无论如何 – JordiVilaplana
我注意到,在底部你调用'ms.WriteAsync'然后'ms.FlushAsync',但在顶部你只调用'WriteAsync'。也许尝试刷新? –