2014-03-12 93 views
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页面?

非常感谢!

回答

2

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

我要指出,通过写入一个临时文件,要创建哪些不需要倒带,这就是为什么它的工作原理新的数据流。

+0

当然!谢谢!这是合乎逻辑的,而有趣的事实是,我已经这样做了PDF加载后渲染页面。但是,我很抱歉,白页再次罢工。 :(+1无论如何 – JordiVilaplana

+0

我注意到,在底部你调用'ms.WriteAsync'然后'ms.FlushAsync',但在顶部你只调用'WriteAsync'。也许尝试刷新? –