2010-06-29 17 views
8

Questo è il migliore che è venuta in mente:Esiste un modo migliore per ottenere il conteggio delle pagine da un PrintDocument rispetto a questo?

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

C'è un modo migliore per fare questo? (Questo è in realtà abbastanza lento)

+0

Non con PrintDocument stessa. Dovrai conoscere la quantità di pagina del file che vuoi stampare tramite la quantità di linea e il margine che utilizzerai e la quantità di linea che vuoi per pagina, ecc. – Wildhorn

risposta

5

Quindi la soluzione finale sarebbe:

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

Ti suggerisco di eseguire il backup di PrintController e ripristinare torna a come è stato dopo aver fatto la stampa falsa. Senza questo, il mio non stamperebbe quando volevo fare la vera stampa. Quindi sarebbe "PrintController pcBackup = printDocument.PrintController" all'inizio e "printDocument.PrintController = pcBackup" appena prima di restituire il valore di conteggio. – joshhendo

+0

Come si costruisce il 'printDocument'? –

0

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

c'è un evento PrintDocument.QueryPageSettings che può essere gestita. Se gestito, viene chiamato prima di ogni evento PrintDocument.PrintPage. Quindi puoi mettere un contatore lì per contare le pagine. In questo modo è possibile evitare due passaggi (un passaggio per stampare il documento in file per il conteggio delle pagine e il secondo passaggio per la stampa del lavoro effettivo).

L'URL in alto contiene anche un codice di esempio per un contatore.

Spero che questo aiuti

1

dichiarare il PrintController come Printing.PreviewPrintController.

In questo modo, si stampa solo sulla memoria, non su un file.

Lo uso in un progetto VB.NET e funziona perfettamente!

Problemi correlati