我正在将一个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);
答案 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);