2010-06-29 25 views
8

est le meilleur que je suis venu avec:Existe-t-il un meilleur moyen d'obtenir le nombre de pages à partir d'un PrintDocument que cela? Ce

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

est-il une meilleure façon de le faire? (Ce qui est assez lent)

+0

pas avec PrintDocument lui-même. Vous aurez besoin de connaître la quantité de page du fichier que vous voulez imprimer en fonction du nombre de lignes et de la marge que vous utiliserez et de la quantité de ligne que vous voulez par page, etc. – Wildhorn

Répondre

5

donc la solution finale serait:

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

Je suggère de sauvegarder le PrintController et de le restaurer retour à la façon dont il était après que vous avez fait la fausse impression. Sans cela, le mien ne s'imprimerait pas quand je voulais faire la vraie impression. Ce serait donc "PrintController pcBackup = printDocument.PrintController" au début et "printDocument.PrintController = pcBackup" juste avant de renvoyer la valeur de comptage. – joshhendo

+0

Comment construisez-vous 'printDocument'? –

0

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

Il y a un événement PrintDocument.QueryPageSettings qui pourrait être manipulé. S'il est géré, il est appelé avant chaque événement PrintDocument.PrintPage. Vous pouvez donc y mettre un compteur pour compter les pages. De cette façon, vous pouvez éviter un double passage (un passage pour imprimer le document dans le fichier pour le comptage des pages et un deuxième pour l'impression du travail).

L'URL ci-dessus contient également un exemple de code pour un compteur.

Hope this helps

1

Donne la PrintController comme Printing.PreviewPrintController. De cette façon, vous imprimez seulement en mémoire, pas dans un fichier. Je l'utilise dans un projet VB.NET, et cela fonctionne parfaitement!