Printer.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System;
  2. using System.Collections;
  3. using System.Windows.Forms;
  4. using System.Drawing;
  5. using System.Collections.Generic;
  6. using System.Drawing.Printing;
  7. using FastReport.Preview;
  8. using FastReport.Forms;
  9. using FastReport.Utils;
  10. namespace FastReport.Print
  11. {
  12. internal class Printer
  13. {
  14. private Report report;
  15. public void Print(PrinterSettings printerSettings, int curPage)
  16. {
  17. if (report.PrintSettings.CopyNames.Length > 0)
  18. {
  19. // copy names are set, handle copies in code
  20. int copies = report.PrintSettings.Copies;
  21. try
  22. {
  23. report.PrintSettings.Copies = 1;
  24. for (int copyIndex = 1; copyIndex <= copies; copyIndex++)
  25. {
  26. report.PreparedPages.MacroValues["Copy#"] = copyIndex;
  27. PrintInternal(printerSettings, curPage);
  28. }
  29. }
  30. finally
  31. {
  32. report.PrintSettings.Copies = copies;
  33. report.PreparedPages.MacroValues.Remove("Copy#");
  34. }
  35. }
  36. else
  37. {
  38. // just print
  39. PrintInternal(printerSettings, curPage);
  40. }
  41. }
  42. private void PrintInternal(PrinterSettings printerSettings, int curPage)
  43. {
  44. using (PrintDocument doc = new PrintDocument())
  45. {
  46. if (printerSettings != null)
  47. doc.PrinterSettings = printerSettings;
  48. PrintControllerBase controller = null;
  49. switch (report.PrintSettings.PrintMode)
  50. {
  51. case PrintMode.Default:
  52. controller = new DefaultPrintController(report, doc, curPage);
  53. break;
  54. case PrintMode.Split:
  55. controller = new SplitPrintController(report, doc, curPage);
  56. break;
  57. case PrintMode.Scale:
  58. controller = new ScalePrintController(report, doc, curPage);
  59. break;
  60. }
  61. doc.PrintController = new StandardPrintController();
  62. doc.PrintPage += new PrintPageEventHandler(controller.PrintPage);
  63. doc.QueryPageSettings += new QueryPageSettingsEventHandler(controller.QueryPageSettings);
  64. Duplex duplex = report.PrintSettings.Duplex;
  65. if (duplex != Duplex.Default)
  66. doc.PrinterSettings.Duplex = duplex;
  67. try
  68. {
  69. report.SetOperation(ReportOperation.Printing);
  70. Config.ReportSettings.OnStartProgress(report);
  71. doc.Print();
  72. Config.ReportSettings.OnReportPrinted(report);
  73. }
  74. finally
  75. {
  76. Config.ReportSettings.OnFinishProgress(report);
  77. report.SetOperation(ReportOperation.None);
  78. }
  79. }
  80. }
  81. public Printer(Report report)
  82. {
  83. this.report = report;
  84. }
  85. }
  86. }