2010-06-29 58 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 2010-08-27 18:30:32

回答

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 2014-01-31 02:17:42

+0

如何構建'printDocument'? – 2014-07-09 12:36:04

0

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

有一個PrintDocument.QueryPageSettings事件能夠處理。如果處理,它會在每個PrintDocument.PrintPage事件之前調用。所以你可以在那裏設置一個計數器來計算頁數。通過這種方式,您可以避免兩次傳遞(一次傳遞打印文檔以記錄頁數,第二次傳遞實際打印作業)。

上面的URL也有一些計數器的示例代碼。

希望這有助於

1

聲明PrintController爲Printing.PreviewPrintController

這樣,您只打印到內存,而不是打印到文件。

我在VB.NET項目中使用它,它完美的工作!

相關問題