private static void Print(string printerName, byte[] document) { try { NativeMethods.DOC_INFO_1 documentInfo; IntPtr printerHandle; documentInfo = new NativeMethods.DOC_INFO_1(); documentInfo.pDataType = "RAW"; documentInfo.pDocName = "Receipt"; printerHandle = new IntPtr(0); if (NativeMethods.OpenPrinter(printerName.Normalize(), out printerHandle, IntPtr.Zero)) { if (NativeMethods.StartDocPrinter(printerHandle, 1, documentInfo)) { int bytesWritten; byte[] managedData; IntPtr unmanagedData; managedData = document; unmanagedData = Marshal.AllocCoTaskMem(managedData.Length); Marshal.Copy(managedData, 0, unmanagedData, managedData.Length); if (NativeMethods.StartPagePrinter(printerHandle)) { NativeMethods.WritePrinter( printerHandle, unmanagedData, managedData.Length, out bytesWritten); NativeMethods.EndPagePrinter(printerHandle); } else { throw new Win32Exception(); } Marshal.FreeCoTaskMem(unmanagedData); NativeMethods.EndDocPrinter(printerHandle); } else { throw new Win32Exception(); } NativeMethods.ClosePrinter(printerHandle); } else { throw new Win32Exception(); } } catch (Exception ex) { MessageBox.Show(ex.Message, "Visitor Detail : Print : " + ex.Source, MessageBoxButtons.OK, MessageBoxIcon.Error); } }
/// <summary> /// Create a print job with a string datatype /// </summary> /// <param name="PrinterName"></param> /// <param name="dataType"></param> /// <param name="jobName"></param> /// <param name="outputFileName"></param> public GdiPrintJob(string PrinterName, string dataType, string jobName, string outputFileName) { if (string.IsNullOrWhiteSpace(PrinterName)) throw new ArgumentNullException("PrinterName"); if (string.IsNullOrWhiteSpace(dataType)) throw new ArgumentNullException("PrinterName"); IntPtr hPrinter; if (!NativeMethods.OpenPrinter(PrinterName, out hPrinter, IntPtr.Zero)) throw new Win32Exception(); this.PrinterHandle = hPrinter; NativeMethods.DOC_INFO_1 docInfo = new NativeMethods.DOC_INFO_1() { DocName = jobName, Datatype = dataType, OutputFile = outputFileName }; IntPtr pDocInfo = Marshal.AllocHGlobal(Marshal.SizeOf(docInfo)); RuntimeHelpers.PrepareConstrainedRegions(); try { Marshal.StructureToPtr(docInfo, pDocInfo, false); UInt32 docid = NativeMethods.StartDocPrinter(hPrinter, 1, pDocInfo); if (docid == 0) throw new Win32Exception(); this.PrintJobID = docid; } finally { Marshal.FreeHGlobal(pDocInfo); } }
public static void PrintRaw(string printerName, byte[] data) { NativeMethods.DOC_INFO_1 documentInfo; IntPtr printerHandle = new IntPtr(0); documentInfo = new NativeMethods.DOC_INFO_1(); documentInfo.pDataType = "RAW"; documentInfo.pDocName = "Etiqueta"; if (NativeMethods.OpenPrinter(printerName.Normalize(), out printerHandle, IntPtr.Zero)) { if (NativeMethods.StartDocPrinter(printerHandle, 1, documentInfo)) { int bytesWritten; IntPtr unmanagedData = Marshal.AllocCoTaskMem(data.Length); Marshal.Copy(data, 0, unmanagedData, data.Length); if (NativeMethods.StartPagePrinter(printerHandle)) { NativeMethods.WritePrinter( printerHandle, unmanagedData, data.Length, out bytesWritten); NativeMethods.EndPagePrinter(printerHandle); } else { throw new Win32Exception(); } Marshal.FreeCoTaskMem(unmanagedData); NativeMethods.EndDocPrinter(printerHandle); } else { throw new Win32Exception(); } NativeMethods.ClosePrinter(printerHandle); } else { throw new Win32Exception(); } }