2010-06-29 11 views
8

Este es el mejor que he llegado con:¿Existe una mejor manera de obtener el recuento de páginas de PrintDocument que esta?

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

¿Hay una mejor manera de hacer esto? (Esto es en realidad bastante lenta)

+0

No consigo misma PrintDocument. Necesitará saber la cantidad de página del archivo que desea imprimir a través de la cantidad de línea y el margen que usará y la cantidad de línea que desea por página, etc. – Wildhorn

Respuesta

5

Así que la solución final sería:

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

Sugiero que haga una copia de seguridad del PrintController y restaure volver a cómo era después de haber hecho la impresión falsa. Sin esto, el mío no se imprimiría cuando quisiera hacer la impresión real. Entonces sería "PrintController pcBackup = printDocument.PrintController" al principio y "printDocument.PrintController = pcBackup" justo antes de devolver el valor de conteo. – joshhendo

+0

¿Cómo construyes el 'printDocument'? –

0

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

hay un evento PrintDocument.QueryPageSettings que podría ser manejado. Si se maneja, se llama antes de cada evento PrintDocument.PrintPage. Entonces puedes poner un contador allí para contar las páginas. De esta forma, podría evitar dos pasadas (una pasada para imprimir el documento al archivo para contar las páginas y el segundo pase para la impresión del trabajo real).

La URL anterior también tiene un código de ejemplo para un contador.

Esperanza esto ayuda

1

declarar la PrintController como Printing.PreviewPrintController.

De esta manera, solo está imprimiendo en la memoria, no en un archivo.

Lo uso en un proyecto VB.NET, ¡y funciona perfectamente!

Cuestiones relacionadas