TextExportPrint.cs 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using System;
  2. using System.Text;
  3. using System.Runtime.InteropServices;
  4. using System.IO;
  5. namespace FastReport.Export.Text
  6. {
  7. [StructLayout(LayoutKind.Sequential)]
  8. internal struct DOCINFO
  9. {
  10. [MarshalAs(UnmanagedType.LPWStr)]
  11. public string pDocName;
  12. [MarshalAs(UnmanagedType.LPWStr)]
  13. public string pOutputFile;
  14. [MarshalAs(UnmanagedType.LPWStr)]
  15. public string pDataType;
  16. }
  17. /// <summary>
  18. /// Represents supplement class for print of any stream directly in printer.
  19. /// </summary>
  20. public static class TextExportPrint
  21. {
  22. [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  23. internal static extern long OpenPrinter(string pPrinterName, ref IntPtr phPrinter, int pDefault);
  24. [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  25. internal static extern long StartDocPrinter(IntPtr hPrinter, int Level, ref DOCINFO pDocInfo);
  26. [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  27. internal static extern long StartPagePrinter(IntPtr hPrinter);
  28. [DllImport("winspool.drv", CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  29. internal static extern long WritePrinter(IntPtr hPrinter, byte[] data, int buf, ref int pcWritten);
  30. [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  31. internal static extern long EndPagePrinter(IntPtr hPrinter);
  32. [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  33. internal static extern long EndDocPrinter(IntPtr hPrinter);
  34. [DllImport("winspool.drv", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
  35. internal static extern long ClosePrinter(IntPtr hPrinter);
  36. /// <summary>
  37. /// Prints a stream.
  38. /// </summary>
  39. /// <param name="PrinterName">Printer name on which should be print.</param>
  40. /// <param name="DocName">Document title for printer spooler.</param>
  41. /// <param name="Copies">Count of copies.</param>
  42. /// <param name="Stream">Stream that will be printed.</param>
  43. /// <example>This example demonstrates the printing of Stream.
  44. /// <code>
  45. /// TextExportPrint.PrintStream("EPSON FX-1000", "My Report", 1, txtStream)</code>
  46. /// </example>
  47. public static void PrintStream(string PrinterName, string DocName, int Copies, Stream Stream)
  48. {
  49. System.IntPtr lhPrinter = new System.IntPtr();
  50. DOCINFO di = new DOCINFO();
  51. int pcWritten = 0;
  52. di.pDocName = DocName;
  53. di.pDataType = "RAW";
  54. OpenPrinter(PrinterName, ref lhPrinter, 0);
  55. StartDocPrinter(lhPrinter, 1, ref di);
  56. StartPagePrinter(lhPrinter);
  57. try
  58. {
  59. int buffSize = 2048;
  60. byte[] buff = new byte[buffSize];
  61. for (int c = 0; c < Copies; c++)
  62. {
  63. Stream.Position = 0;
  64. int i = buffSize;
  65. while (i == buffSize)
  66. {
  67. i = Stream.Read(buff, 0, buffSize);
  68. WritePrinter(lhPrinter, buff, i, ref pcWritten);
  69. }
  70. }
  71. }
  72. finally
  73. {
  74. EndPagePrinter(lhPrinter);
  75. EndDocPrinter(lhPrinter);
  76. ClosePrinter(lhPrinter);
  77. }
  78. }
  79. }
  80. }