2010-06-29 5 views
8

Это лучшее, что я придумал:Есть ли лучший способ получить количество страниц из PrintDocument, чем это?

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

Есть ли лучший способ сделать это? (Это на самом деле довольно медленно)

+0

Не с самого PrintDocument. Вам нужно будет узнать количество страниц файла, который вы хотите распечатать, по количеству строк и маржи, которую вы будете использовать, и количеству строки, которую вы хотите на странице, и т. Д. – Wildhorn

ответ

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» непосредственно перед возвратом значения count. – joshhendo

+0

Как вы создаете 'printDocument'? –

0

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

Существует PrintDocument.QueryPageSettings Событие, которое может быть обработано. Если обрабатывается, он вызывается перед каждым событием PrintDocument.PrintPage. Таким образом, вы можете поставить счетчик для подсчета страниц. Таким образом, вы можете избежать двух пропусков (один проход для печати документа в файл для подсчета страниц и второго прохода для фактической печати задания).

В приведенном выше URL-адресе также есть пример кода для счетчика.

Надеется, что это помогает

1

Объявите PrintController как Printing.PreviewPrintController.

Таким образом, вы печатаете только в памяти, а не в файл.

Я использую это в проекте VB.NET, и он отлично работает!