C# 有没有比这更好的方法从PrintDocument获取页数?

C# 有没有比这更好的方法从PrintDocument获取页数?,c#,printing,printdocument,C#,Printing,Printdocument,这是我想到的最好的: public static int GetPageCount( PrintDocument printDocument ) { printDocument.PrinterSettings.PrintFileName = Path.GetTempFileName(); printDocument.PrinterSettings.PrintToFile = true; int count = 0; printDocument.PrintCon

这是我想到的最好的:

public static int GetPageCount( PrintDocument printDocument )
{
    printDocument.PrinterSettings.PrintFileName = Path.GetTempFileName();
    printDocument.PrinterSettings.PrintToFile = true;

    int count = 0;

    printDocument.PrintController = new StandardPrintController();
    printDocument.PrintPage += (sender, e) => count++;

    printDocument.Print();

    File.Delete( printDocument.PrinterSettings.PrintFileName );

    return count;
}
有更好的方法吗?(这实际上相当慢)

检查-

存在可以处理的PrintDocument.QueryPageSettings事件。如果已处理,则在每个PrintDocument.PrintPage事件之前调用它。所以你可以在那里放一个计数器来计算页数。通过这种方式,您可以避免两次通过(一次通过将文档打印到文件以计数页面,另一次通过实际作业打印)

上面的URL还有一些计数器的示例代码


希望这有助于将PrintController声明为
打印。PreviewPrintController

这样,您只需打印到内存,而不是文件


我在一个VB.NET项目中使用了它,它工作得非常好

所以最终的解决方案是:

public static int GetPageCount(PrintDocument printDocument)
{
    int count = 0;
    printDocument.PrintController = new PreviewPrintController();
    printDocument.PrintPage += (sender, e) => count++;
    printDocument.Print();
    return count;
}

而不是打印文档本身。您需要通过行数、边距以及每页所需行数等来了解要打印的文件页数。我建议备份PrintController,并在完成伪打印后将其恢复原状。没有这个,当我想做真正的印刷时,我的就不会印刷了。因此,在开始时是“PrintController pcBackup=printDocument.PrintController”,在返回计数值之前是“printDocument.PrintController=pcBackup”。如何构造
printDocument