.Net中打印页面的页数

时间:2012-11-26 14:32:59

标签: .net printing

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

0 个答案:

没有答案