8

这是我想出的最好的:

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;
}

有一个更好的方法吗?(这实际上很慢)

4

3 回答 3

5

所以最终的解决方案是:

public static int GetPageCount(PrintDocument printDocument)
{
    int count = 0;
    printDocument.PrintController = new PreviewPrintController();
    printDocument.PrintPage += (sender, e) => count++;
    printDocument.Print();
    return count;
}
于 2012-07-12T16:50:15.783 回答
1

将 PrintController 声明为Printing.PreviewPrintController.

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

我在 VB.NET 项目中使用它,它工作得很好!

于 2012-01-26T12:52:06.437 回答
0

检查 - http://msdn.microsoft.com/en-us/library/system.drawing.printing.printdocument.querypagesettings.aspx

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

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

希望这可以帮助

于 2011-02-22T18:52:20.543 回答