有没有比这更好的方法从PrintDocument中获取页面数量?

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

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


不是使用PrintDocument本身来实现。您需要通过文件的行数、您将使用的边距以及每页所需的行数等信息来确定要打印的页面数量。 - Wildhorn
3个回答

5
所以最终的解决方案是:
public static int GetPageCount(PrintDocument printDocument)
{
    int count = 0;
    printDocument.PrintController = new PreviewPrintController();
    printDocument.PrintPage += (sender, e) => count++;
    printDocument.Print();
    return count;
}

1
我建议在进行虚拟打印后备份PrintController并将其恢复到原始状态。如果没有这样做,当我想要进行真正的打印时,我的打印机就无法打印。因此,在开始时应该是“PrintController pcBackup = printDocument.PrintController”,在返回计数值之前应该是“printDocument.PrintController = pcBackup”。 - joshhendo
你如何构建printDocument - huMpty duMpty

1

将PrintController声明为Printing.PreviewPrintController

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

我在VB.NET项目中使用它,效果非常完美!


0

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

有一个PrintDocument.QueryPageSettings事件,可以进行处理。如果处理,它在每个PrintDocument.PrintPage事件之前被调用。因此,您可以在此处放置计数器以计算页面数。这样,您可以避免两次传递(一次传递将文档打印到文件以计算页面数,第二次传递执行实际作业打印)。

上述URL还提供了一些计数器示例代码。

希望这会有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接