我们有一个WinForm程序,它将当前显示的页面发送到打印机。 这非常简单:我们创建一个PrintDocument对象,在PrintPage事件中我们填充图形对象:
private void PrintPage(object sender, PrintPageEventArgs e)
{
_renderObject.RenderPrinter(e.Graphics);
}
我不确定这种方法是否仍然是最先进的,但程序已经很老了并且仍在运行,所以它似乎有用。 现在的问题是:我们需要创建一个双面页面并在背面打印一些东西。
我的第一种方法是创建第一个表单初始化的第二个表单,然后在PrintPage事件中编写图形内容,如下所示:
public static class Printer
{
private static Graphics _e1;
private static Graphics _e2;
public static void Print(Graphics e1, Graphics e2)
{
PrintDocument pd = new PrintDocument();
_e1 = e1;
_e2 = e2;
pd.PrinterSettings.Duplex = Duplex.Horizontal;
pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
}
static void pd_PrintPage(object sender, PrintPageEventArgs e)
{
_renderObject.RenderPrinter(_e1);
_renderObject.RenderPrinter(_e2);
}
}
我想我必须基本上将第一页的大小设置为A4,以确保第二个对象打印在背面。
但这真的是正确的方法吗?现在是否更容易创建双面页面而无需手动设置每个控件?或者我的方法是唯一可能使事情发生的方法?
像往常一样感谢提前
的Matthias
答案 0 :(得分:2)
从我到目前为止看到的情况来看,背面基本上只是另一页,双面打印设置使其背面打印(如果打印机支持它)。
每个页面都会调用一次PrintPage
回调。 PrintPageEventArgs
对象具有HasMorePages
属性,您可以将其设置为true以表示有更多页面必须打印。请注意,它还具有Graphics
属性,因此无需传递额外的Graphics
个对象。
因此,只需在第一次调用PrintPage
时渲染正面,然后将HasMorePages
设置为true。第二次调用PrintPage
时,您将渲染背面并将HasMorePages
设置为false。这确实意味着您必须跟踪您正在打印的那一面。遗憾的是,PrintPageEventArgs
不包含任何自定义状态,因此可能有点棘手。你可以使用一个静态变量,但是如果你开始打印作业而另一个仍然被渲染,那么它将会中断。
要解决这个问题,我会使用一个闭包,一个捕获局部变量page
的匿名函数:
int page = 0;
pd.PrintPage += (sender, e) =>
{
if (page == 0)
{
// Print front side
_renderObject.RenderPrinter(e.Graphics);
e.HasMorePages = true;
}
else if (page == 1)
{
// TODO: Print back side
e.HasMorePages = false;
}
page += 1;
};