我希望能够在我从应用程序打印的页面上放置“第1页,共7页”等页码。因此,我实施了双程打印程序。第一遍打印到文件,并在完成后自动取消。第一遍的总页数用于第二遍,我将数据发送到打印机。
以下是生成两种类型的PrintDocuments
的代码 public static PrintDocument CreatePrintDocument(PrinterConfiguration printerConfig)
{
PrintDocument document = new PrintDocument();
document.PrinterSettings.PrinterName = printerConfig.PrinterName;
document.DefaultPageSettings.Landscape = printerConfig.IsLandscape;
document.PrintController = new StandardPrintController();
return document;
}
public static PrintDocument CreatePrintDocumentThatCancelsPrint(PrinterConfiguration printerConfig)
{
PrintDocument document = CreatePrintDocument(printerConfig);
document.PrinterSettings.PrintToFile = true;
document.PrinterSettings.PrintFileName = CreateTempFileName();
document.EndPrint += (sender, e) => { e.Cancel = true; };
return document;
}
问题是PrintToFile并不总是有效。在一台Windows XP测试计算机上,我得到一个Win32Exception - 执行第一次传递时无效的句柄。所以经过一些谷歌搜索后,我发现不支持从代码设置PrintDocument.PrintToFile。
“PrintToFile属性仅由PrintDialog使用,无法以编程方式设置。” http://msdn.microsoft.com/en-us/library/system.drawing.printing.printersettings.printtofile.aspx
那么,为什么不直接打印到打印机并在EndPrint事件中取消它呢?那么,如果打印到“XPS Document Writer”打印机,用户将获得第一遍和第二遍的“另存为”问题。
所以问题是;打印到“XPS Document Writer”时,如何在没有看到“另存为”对话框的情况下进行两遍打印?
解决
正如JonB指出的那样,我需要查看PreviewPrintController,因为这是一个打印控制器,允许我与所选打印机进行静默交互。
public static PrintDocument CreatePrintDocument(PrinterConfiguration printerConfig)
{
PrintDocument document = new PrintDocument();
document.PrinterSettings.PrinterName = printerConfig.PrinterName;
document.DefaultPageSettings.Landscape = printerConfig.IsLandscape;
document.PrintController = new StandardPrintController();
return document;
}
public static PrintDocument CreatePrintDocumentThatCancelsPrint(PrinterConfiguration printerConfig)
{
PrintDocument document = new PrintDocument();
document.PrinterSettings.PrinterName = printerConfig.PrinterName;
document.DefaultPageSettings.Landscape = printerConfig.IsLandscape;
document.PrintController = new PreviewPrintController();
document.EndPrint += (sender, e) => { e.Cancel = true; };
return document;
}