如何使用GTKSharp打印图像

时间:2012-02-27 03:29:15

标签: c# printing mono gtk#

我正在将一个C#.NET应用程序移植到Mono .NET,以便在OSX中执行。部分应用涉及打印图像。在.NET中相当容易,主要归结为

e.Graphics.DrawImage(img, new Rectangle(x, y, printSize.Width, printSize.Height));
PrintDocument的PrintPage事件中的

。 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);

2 个答案:

答案 0 :(得分: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类型的图像。

答案 1 :(得分: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);