2017-05-30 9 views
0

私自身のPDFビューア(UserControl)を作成する必要があります。私はpdfium.dllを使っています。そのラッパーはPdfiumServiceです。このサービスは、ページをBitmapSourceにレンダリングできます。 PdfViewerはScrollViewerのVirtualizingStackPanelにページを表示します。 どのように私は怠惰なPDFのレンダリングを行うことができますか?問題は、pdfが約20MB(1000ページ)でレンダリングされたページが約2GBのRAMを占める場合です。wpfを使用してPDFをレンダーする

VirtualizingStackPanelは私を助けますか?私は "BeginVirtualizing"または何か他の何らかのイベントを見つけませんでした。どのアイテムが現在表示されているかを簡単に知る方法は?

たぶんそのような何か:一度に表示することができますどのように多くのページ

  1. 計算。
  2. ScrollViewerのオフセットを参照してください。
  3. ページのインデックスが表示されていることを計算します。
  4. 現在のページの横に5ページをレンダリングします。

解決策やヒント、またはこれに関するアイデアはありますか?

+0

表示ページへcustomコントロールを使用しますが、仮想化を作成することができますオフセット。 –

+0

はい、確かです。質問はそれに関するものではありません。私はそれでScrollViewerとItemsControlを使用し、それ以外のItemsControl.ItemsPanelはVirtualizingStackPanelです。データをコンテナにバインドする方法はわかっています。私が欲しいことをやり遂げる方法がありますか?または、オフセットと画像のサイズを手だけで計算しますか? – DdarkSideE

+0

私はあなたがそれに基づいて計算することができるように、表示されているページだけをロードする必要があるので、簡単な方法はないと思う。 –

答えて

0

よく、私は本からのイメージでそれを少し持っていました....問題はあなたがビットマップを置いたGUIではなく、ライブラリからイメージを取得する方法です。 、連続的にまたはランダムに?

実際、VirtualizingStackPanelを使用すると、作成または破棄するGUI要素のみが管理されますが、メモリ内に完全なビットマップのコレクションがある場合、あなたは死んでいます。

一つの方法は、私がCBRでそのような何かを

すべて「最古の画像を」クリアされますタイマーを追加したビットマップwhitout Pageオブジェクトを作成し、必要なときに+画像を作成することです。そして、私はあなたがScrollViewerの内部にあるどのItemConrolを使用して、ScrollViewerの垂直使用できる

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; } 
    } 
+0

あなたのアプリに埋め込むことのできるwinformビューアがあることに注意してください。https://github.com/pvginkel/PdfiumViewer – GCamel

+0

私はPDFページを順番にレンダリングすると思います。 VirtualizingStackPanelについて私はビットマップがメモリに格納されていることを理解しました。それは問題です。私は既にページサイズ、コントロールサイズ、およびScrollViewerのオフセットに基づいて、表示されたページだけをレンダリングするコードを作成しました。まあ、すべての古いiamgesをクリアします。何が良いですか?時間またはスクロールオフセットに基づいてクリーンアップしますか? – DdarkSideE

+0

スクロールビューアで矢印やページダウンキーを使用すると、非常に短時間でメモリをいっぱいにして時間を掃除することができないため、おそらくインデックス上にあると言えます。ところで、あなたは私にCBRでのPDF表示を含めて良いソリューション(pdfium)をくれました。ありがとうございます。 – GCamel

関連する問題