2012-02-27 25 views
2

OSXで実行するために、C#.NETアプリケーションをMono .NETに移植します。アプリケーションの一部にはイメージの印刷が含まれます。 .NETではかなり簡単で、PrintDocumentのPrintPageイベントでは、主にGTKSharpでイメージを印刷する方法

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

になっています。 MonoはSystem.Drawing.Printingを完全に実装していないので、これを行う最善の方法はGtkSharpを使用することです。私はGtk.PrintOperationを使ってテキストを印刷する方法についてオンラインでいくつかの例を見つけました。 PrintOperationにはPrintPageと似たイベントDrawPageがありますが、このイベントでPangoSharpを使ってテキストを印刷する方法しか見つけられませんでした。

私が知っていることを説明するだけで十分ですが、その質問はかなり単純です。 GtkSharpの印刷がうまく文書化されていないので、誰かが助けになることを願っています。 GtkSharpの外でこれを行うより良い方法があれば、私はすべての耳です。

多くのありがとうございます。

EDIT

だから私は、印刷が、しかし、それは常に空白のページで何かを得ることができました。ここでは、コードは次のとおりです。

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を使ってPixbufをCairoContextにペイントする必要があります。タイプが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画像の横にある画像では機能しません。なぜなら、私はそれを正解とすることを躊躇しています。私は、すべての画像タイプで動作するソリューションが必要です。 –

+0

あなたはこのような私の質問を見ていただけますか?http://stackoverflow.com/questions/12873640/how-to-print-plain-text-using-monodevelop-and-c –

関連する問題