使用wpf渲染pdf

时间:2017-05-30 09:32:36

标签: c# wpf pdf pdfviewer

我需要编写自己的pdf查看器(UserControl)。我使用pdfium.dll。它的包装是PdfiumService。此服务可以将页面呈现给BitmapSource。 PdfViewer在ScrollViewer中的VirtualizingStackPanel中显示页面。 任何想法我怎么能懒惰渲染pdf?问题是如果pdf大约是20mb(1000页),渲染页面需要大约2GB RAM。

VirtualizingStackPanel可以帮助我吗?我没有找到“BeginVirtualizing”或其他任何事件。有什么简单的方法可以知道现在正在显示什么项目吗?

也许是这样的:

  1. 计算一次可以显示的页数。
  2. 请参阅ScrollViewer的偏移量。
  3. 计算现在正在显示的页面索引。
  4. 在当前页面旁边呈现5页。
  5. 是否有任何现成的解决方案或一些提示或想法?

1 个答案:

答案 0 :(得分:0)

好吧,我对书中的图片有点了解......麻烦并不是你放置位图的gui,而是你如何从图书馆获取图像......是一个接一个,顺序还是随机?

事实上,如果你使用VirtualizingStackPanel它只会管理gui元素来创建或销毁,但是如果你在内存中有一个完整的位图集合,你就死定了。

一种方法是创建页面对象whitout位图,并在需要时创建图像+添加一个清除所有“最旧图像”的计时器

我在CBR做了类似的事情。我使用custom控件来显示页面

private BitmapImage _Image = null;
    /// <summary>
    /// the image 
    /// </summary>
    public BitmapImage Image
    {
        get
        {
            if (_Image == null)
                _Image = (DocumentFactory.Instance.GetService(Parent) as BookService).GetImageFromStream(Parent.FilePath, FilePath);

            ImageLastAcces = DateTime.Now;
            return _Image;
        }
        set { _Image = value; }
    }