2010-06-29 28 views
8

Đây là tốt nhất mà tôi đã đi lên với:Có cách nào tốt hơn để lấy số trang từ PrintDocument không?

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ó cách nào tốt hơn để làm điều này? (Đây là thực tế khá chậm)

+0

Không phải với PrintDocument riêng của mình. Bạn sẽ cần phải biết số lượng trang của tệp bạn muốn in qua số lượng dòng và lề bạn sẽ sử dụng và số lượng dòng bạn muốn trên mỗi trang, v.v. – Wildhorn

Trả lời

5

Vì vậy, giải pháp cuối cùng sẽ là:

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

Tôi khuyên bạn nên sao lưu PrintController và khôi phục nó trở lại như thế nào sau khi bạn đã thực hiện in giả. Nếu không có điều này, tôi sẽ không in khi tôi muốn in thật. Vì vậy, nó sẽ là "PrintController pcBackup = printDocument.PrintController" ở đầu và "printDocument.PrintController = pcBackup" ngay trước khi trả về giá trị đếm. – joshhendo

+0

Bạn xây dựng 'printDocument' như thế nào? –

0

Kiểm tra - http://msdn.microsoft.com/en-us/library/system.drawing.printing.printdocument.querypagesettings.aspx

Có một sự kiện PrintDocument.QueryPageSettings mà có thể bị xử lý. Nếu được xử lý, nó được gọi trước mỗi sự kiện PrintDocument.PrintPage. Vì vậy, bạn có thể đặt một truy cập ở đó để đếm các trang. Bằng cách này, bạn có thể tránh hai lần vượt qua (một lần để in tài liệu vào tập tin để đếm các trang và lần truy cập thứ hai cho việc in thực tế).

URL ở trên cũng có một số mã ví dụ cho bộ đếm.

Hy vọng điều này sẽ giúp

1

Tuyên bố PrintController là Printing.PreviewPrintController.

Bằng cách này, bạn chỉ in vào bộ nhớ chứ không phải vào tệp.

Tôi sử dụng tính năng này trong dự án VB.NET và hoạt động hoàn hảo!

Các vấn đề liên quan