我希望能够在我从我的应用程序打印的页面上放置诸如“第 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;
}