2012-02-27 227 views
2

我將一個C#.NET應用程序移植到Mono .NET以便在OSX中執行。部分應用涉及打印圖像。在.NET中相當容易,主要歸結於PrintDocument的PrintPage事件中的如何使用GTKSharp打印圖像

e.Graphics.DrawImage(img, new Rectangle(x, y, printSize.Width, printSize.Height)); 

。 Mono沒有完全實現System.Drawing.Printing,所以看起來最好的方法是使用GtkSharp。我在網上找到了一些關於如何使用Gtk.PrintOperation打印文本的例子。 PrintOperation有一個事件DrawPage,它應該與PrintPage類似,但是我只能找到如何使用PangoSharp在這個事件中打印文本。

足夠解釋我所知道的,我認爲這個問題是相當直接的。我希望有人能夠提供幫助,因爲GtkSharp的印刷記錄不完善。如果在GtkSharp之外有更好的方法來做到這一點,我就會全神貫注。

非常感謝。

編輯

所以我設法得到的東西打印,然而,它始終是一個空白頁。下面是代碼:

var print = new PrintOperation(); 
print.BeginPrint += (obj, args) => { print.NPages = 1; }; 
print.DrawPage += (obj, args) => { 
    PrintContext context = args.Context; 
    Cairo.Context cr = context.CairoContext; 

    var imageSurface = new Cairo.ImageSurface(printImage.FileName); 
    cr.MaskSurface(imageSurface, 0, 0); 
}; 
print.EndPrint += (obj, args) => { }; 

print.Run(PrintOperationAction.Print, null); 

回答

0

通過對Dave Black的回答稍作處理,我找到了打印任何圖像類型的方法。據說,你應該可以將任何圖像類型加載到Pixbuf中,並使用Gdk CairoHelper在CairoContext上繪製Pixbuf。當類型不是PNG時,我遇到了從文件加載到Pixbuf的問題,所以我先使用System.Drawing.Image將其加載到字節數組中。

此外,請確保這發生在應用程序的主線程上。如果您的代碼出現在其他線程上,請致電

 Gtk.Application.Invoke(delegate { 

要在主線程上調用。

 var imageBit = default(byte[]); 
     var image = System.Drawing.Image.FromFile(fileName); 
     using (var memoryStream = new MemoryStream()) { 
      image.Save(memoryStream, ImageFormat.Png); 
      imageBit = memoryStream.ToArray(); 
     } 

     var print = new PrintOperation(); 
     print.BeginPrint += (obj, a) => { print.NPages = 1; }; 
     print.DrawPage += (obj, a) => { 
           using (PrintContext context = a.Context) { 
            using (var pixBuf = new Gdk.Pixbuf(imageBit, image.Width, image.Height)) { 
             Cairo.Context cr = context.CairoContext; 

             cr.MoveTo(0, 0); 
             Gdk.CairoHelper.SetSourcePixbuf(cr, pixBuf, image.Width, image.Height); 
             cr.Paint(); 

             ((IDisposable) cr).Dispose(); 
            } 
           } 
          }; 
     print.EndPrint += (obj, a) => { }; 

     print.Run(PrintOperationAction.Print, null); 
3

我一直在掙扎Gtk.PrintOperation一兩天的,但你的文章也終於走到了一起。對您的代碼示例以下變化對我的作品:

var print = new PrintOperation(); 
print.BeginPrint += (obj, args) => { print.NPages = 1; }; 
print.DrawPage += (obj, args) => { 
    PrintContext context = args.Context; 
    Cairo.Context cr = context.CairoContext; 

    var imageSurface = new Cairo.ImageSurface(printImage.FileName); 

    int w = imageSurface.Width; 
    int h = imageSurface.Height; 
    cr.Scale(256.0/w, 256.0/h); 
    cr.SetSourceSurface(imageSurface, 0,0); 
    cr.Paint();   

}; 
print.EndPrint += (obj, args) => { }; 

print.Run(PrintOperationAction.Print, null); 

而且,似乎只爲PNG類型的圖像工作。

+0

謝謝。直到我發現需要使用Gtk.Application.Invoke在主線程上調用它之前,我一直在解決這個問題。這不適用於PNG圖像旁邊的任何圖像,這就是爲什麼我猶豫是否將其標記爲正確的答案。我需要一個適用於所有圖像類型的解決方案。 – 2012-03-04 00:30:37

+0

你能否看看我的問題,類似於這個http://stackoverflow.com/questions/12873640/how-to-print-plain-text-using-monodevelop-and-c – 2012-10-17 08:40:20