2017-07-21 12 views
0

私はGhostscript.Netを実験しようとしています。私の目標は、GhostscriptViewerをWPF MVVM Modular環境に適応させることですが、XAML Imageコントロールにページを表示することはできません。私は自分の問題がGhostscript.Netに関する私の不十分な知識にあるか、画像パラメータを画像コントロールにバインドする方法を理解していないことに疑いを持っています。WPF MVVM Ghostscript.NETビューアを適用しても、PdfページがImageSourceとして表示されない

このアプリケーションでは、UnityContainerでPrismを使用しています。 PdfViewModelのPdfPageImageプロパティは、ビューXAMLのイメージコントロールにバインドされています。 _viewer_displaypageメソッドで行われる変換は、PdfPageImageにSystem.Windows.Interop.InteropBitmap型のオブジェクトを与えます。私は、RaisePropertyChangedEventメソッドによってコントロールがImageSourceオブジェクトで更新されると考えていました。

  <Image x:Name="PdfDocumentImage" Grid.Column="1" Grid.Row="0" 
        Source="{Binding PdfPageImage}" 
        Height="100" 
        Width="100"> 
      </Image> 

    public class PdfViewModel : ViewModelBase, IPdfViewModel 
{ 
    private readonly IBitmapToImageSourceConverter _imageSourceConverter; 

    private readonly GhostscriptViewer _ghostscriptViewer; 
    private readonly GhostscriptVersionInfo _gsVersion = 
     GhostscriptVersionInfo.GetLastInstalledVersion(GhostscriptLicense.GPL | 
      GhostscriptLicense.AFPL, GhostscriptLicense.GPL); 

    private ImageSource _pdfPageImage; 
    public ImageSource PdfPageImage 
    { 
     get => _pdfPageImage; 

     set 
     { 
      if (value == _pdfPageImage) return; 
      _pdfPageImage = value; 
      RaisePropertyChangedEvent(nameof(PdfPageImage)); 
     } 
    } 

    public PdfViewModel(IPdfView view, 
     IEventAggregator eventAggregator, 
     IBitmapToImageSourceConverter imageSourceConverter, 
     GhostscriptViewer ghostscriptViewer) 
     : base(view) 
    { 
     _ghostscriptViewer = ghostscriptViewer; 
     _imageSourceConverter = imageSourceConverter; 

     _ghostscriptViewer.DisplayPage += _viewer_DisplayPage; 

     eventAggregator.GetEvent<PdfDocumentOpenedEvent>().Subscribe(OpenPdfDocument, ThreadOption.UIThread); 
    } 

    private void _viewer_DisplayPage(object sender, GhostscriptViewerViewEventArgs e) 
    { 
     PdfPageImage = _imageSourceConverter.ImageSourceForBitmap(e.Image); 
    } 

    private void OpenPdfDocument(string path) 
    { 
     _ghostscriptViewer.Open(path, _gsVersion, false); 
    } 
} 

    public class BitmapToImageSourceConverter : IBitmapToImageSourceConverter 
{ 
    [DllImport("gdi32.dll", EntryPoint = "DeleteObject")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool DeleteObject(IntPtr hObject); 
    public ImageSource ImageSourceForBitmap(Bitmap bmp) 
    { 
     var handle = bmp.GetHbitmap(); 
     try 
     { 
      return Imaging.CreateBitmapSourceFromHBitmap(handle, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); 
     } 
     finally { DeleteObject(handle); } 
    } 
} 

答えて

0

いいえ。だから私はそれを理解した。私の解決策は完璧ではありません。 pdfドキュメントをページングしている間、ページの向きは正しくありませんが、それ以外は動作します。

キーは、BitmapImageの作成でのMemoryStreamを使用していた:

 public static BitmapImage ConvertBitmapToImage(System.Drawing.Image image) 
    { 
     using (MemoryStream memoryStream = new MemoryStream()) 
     { 
      image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png); 
      memoryStream.Position = 0; 

      var bitmapImage = new BitmapImage(); 
      bitmapImage.BeginInit(); 
      memoryStream.Seek(0, SeekOrigin.Begin); 
      bitmapImage.StreamSource = memoryStream; 
      bitmapImage.CacheOption = BitmapCacheOption.OnLoad; 
      bitmapImage.EndInit(); 

      return bitmapImage; 
     } 
    } 

他の多くの変更が、私のWPF MVVMアプリでGhostscrip.NETビューアを動作させるために行われました。誰かが詳細に興味があるなら、私はもっとポストします。

関連する問題