1

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

0 回答 0