/// /// 设置打印纸类型的尺寸,如果没有参数提供的类型则新建一个类型, /// /// 打印机名称 /// 打印纸类型名称 /// 宽度,单位0.1毫米,需要在打印机允许的尺寸之内,否则按照默认打印纸类型打印 /// 高度,单位0.1毫米,需要在打印机允许的尺寸之内,否则按照默认打印纸类型打印 public void SetPrintForm(string printerName, string paperName, float width, float height) { if (PlatformID.Win32NT == Environment.OSVersion.Platform) { const int PRINTER_ACCESS_USE = 0x00000008; const int PRINTER_ACCESS_ADMINISTER = 0x00000004; structPrinterDefaults defaults = new structPrinterDefaults(); defaults.pDatatype = null; defaults.pDevMode = IntPtr.Zero; defaults.DesiredAccess = PRINTER_ACCESS_ADMINISTER | PRINTER_ACCESS_USE; IntPtr hPrinter = IntPtr.Zero; if (OpenPrinter(printerName, out hPrinter, ref defaults)) { try { structFormInfo1 formInfo = new structFormInfo1(); formInfo.Flags = 0; formInfo.pName = paperName; formInfo.Size.width = (int)(width * 100.0); formInfo.Size.height = (int)(height * 100.0); formInfo.ImageableArea.left = 0; formInfo.ImageableArea.right = formInfo.Size.width; formInfo.ImageableArea.top = 0; formInfo.ImageableArea.bottom = formInfo.Size.height; bool rslt = false; if (GetPrintForm(printerName, paperName) != null) { rslt = SetForm(hPrinter, paperName, 1, ref formInfo); } else { this.AddCustomPaperSize(printerName, paperName, width, height); rslt = true; } if (!rslt) { StringBuilder strBuilder = new StringBuilder(); strBuilder.AppendFormat("添加纸张{0}时发生错误!, 系统错误号: {1}", paperName, GetLastError()); //throw new ApplicationException(strBuilder.ToString()); MessageBox.Show(strBuilder.ToString()); } } finally { ClosePrinter(hPrinter); } } } }
internal static extern bool AddForm(IntPtr phPrinter, [MarshalAs(UnmanagedType.I4)] int level, ref structFormInfo1 form);
internal static extern bool SetForm(IntPtr phPrinter, [MarshalAs(UnmanagedType.LPTStr)] string pName, [MarshalAs(UnmanagedType.I4)] int level, ref structFormInfo1 form);
/// /// 增加打印纸类型 /// /// 打印机名称 /// 打印纸类型名称 /// 宽度,单位0.1毫米,需要在打印机允许的尺寸之内,否则按照默认打印纸类型打印 /// 高度,单位0.1毫米,需要在打印机允许的尺寸之内,否则按照默认打印纸类型打印 public void AddCustomPaperSize(string printerName, string paperName, float width, float height) { if (PlatformID.Win32NT == Environment.OSVersion.Platform) { const int PRINTER_ACCESS_USE = 0x00000008; const int PRINTER_ACCESS_ADMINISTER = 0x00000004; structPrinterDefaults defaults = new structPrinterDefaults(); defaults.pDatatype = null; defaults.pDevMode = IntPtr.Zero; defaults.DesiredAccess = PRINTER_ACCESS_ADMINISTER | PRINTER_ACCESS_USE; IntPtr hPrinter = IntPtr.Zero; if (OpenPrinter(printerName, out hPrinter, ref defaults)) { try { DeleteForm(hPrinter, paperName); structFormInfo1 formInfo = new structFormInfo1(); formInfo.Flags = 0; formInfo.pName = paperName; formInfo.Size.width = (int)(width * 100.0); formInfo.Size.height = (int)(height * 100.0); formInfo.ImageableArea.left = 0; formInfo.ImageableArea.right = formInfo.Size.width; formInfo.ImageableArea.top = 0; formInfo.ImageableArea.bottom = formInfo.Size.height; if (!AddForm(hPrinter, 1, ref formInfo)) { StringBuilder strBuilder = new StringBuilder(); strBuilder.AppendFormat("添加纸张{0}时发生错误!, 系统错误号: {1}", paperName, GetLastError()); throw new ApplicationException(strBuilder.ToString()); } } finally { ClosePrinter(hPrinter); } } else { StringBuilder strBuilder = new StringBuilder(); strBuilder.AppendFormat("打开打印机{0} 时出现异常!, 系统错误号: {1}", printerName, GetLastError()); throw new ApplicationException(strBuilder.ToString()); } } else { structDevMode pDevMode = new structDevMode(); IntPtr hDC = CreateDC(null, printerName, null, ref pDevMode); if (hDC != IntPtr.Zero) { const long DM_PAPERSIZE = 0x00000002L; const long DM_PAPERLENGTH = 0x00000004L; const long DM_PAPERWIDTH = 0x00000008L; pDevMode.dmFields = (int)(DM_PAPERSIZE | DM_PAPERWIDTH | DM_PAPERLENGTH); pDevMode.dmPaperSize = 256; pDevMode.dmPaperWidth = (short)(width * 2.54 * 10000.0); pDevMode.dmPaperLength = (short)(height * 2.54 * 10000.0); ResetDC(hDC, ref pDevMode); DeleteDC(hDC); } } }