using System; using System.Collections; using System.ComponentModel; using System.Drawing.Printing; using System.Runtime.InteropServices; using System.Security; using System.Text; using System.Windows.Forms; using Microsoft.VisualBasic; using Microsoft.VisualBasic.CompilerServices; namespace Dongke.IBOSS.PRD.Framework.Controls { [EditorBrowsable(EditorBrowsableState.Never)] public class definepaper { [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] private struct structPrinterDefaults { [MarshalAs(UnmanagedType.LPTStr)] public string pDatatype; public IntPtr pDevMode; [MarshalAs(UnmanagedType.I4)] public int DesiredAccess; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] private struct structSize { public int width; public int height; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] private struct structRect { public int left; public int top; public int right; public int bottom; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] private struct structFormInfo1 { [MarshalAs(UnmanagedType.I4)] public int Flags; [MarshalAs(UnmanagedType.LPTStr)] public string pName; public structSize size; public structRect ImageableArea; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] private struct structDevMode { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string dmDeviceName; [MarshalAs(UnmanagedType.U2)] public short dmSpecVersion; [MarshalAs(UnmanagedType.U2)] public short dmDriverVersion; [MarshalAs(UnmanagedType.U2)] public short dmSize; [MarshalAs(UnmanagedType.U2)] public short dmDriverExtra; [MarshalAs(UnmanagedType.U4)] public int dmFields; [MarshalAs(UnmanagedType.I2)] public short dmOrientation; [MarshalAs(UnmanagedType.I2)] public short dmPaperSize; [MarshalAs(UnmanagedType.I2)] public short dmPaperLength; [MarshalAs(UnmanagedType.I2)] public short dmPaperWidth; [MarshalAs(UnmanagedType.I2)] public short dmScale; [MarshalAs(UnmanagedType.I2)] public short dmCopies; [MarshalAs(UnmanagedType.I2)] public short dmDefaultSource; [MarshalAs(UnmanagedType.I2)] public short dmPrintQuality; [MarshalAs(UnmanagedType.I2)] public short dmColor; [MarshalAs(UnmanagedType.I2)] public short dmDuplex; [MarshalAs(UnmanagedType.I2)] public short dmYResolution; [MarshalAs(UnmanagedType.I2)] public short dmTTOption; [MarshalAs(UnmanagedType.I2)] public short dmCollate; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string dmFormName; [MarshalAs(UnmanagedType.U2)] public short dmLogPixels; [MarshalAs(UnmanagedType.U4)] public int dmBitsPerPel; [MarshalAs(UnmanagedType.U4)] public int dmPelsWidth; [MarshalAs(UnmanagedType.U4)] public int dmPelsHeight; [MarshalAs(UnmanagedType.U4)] public int dmNup; [MarshalAs(UnmanagedType.U4)] public int dmDisplayFrequency; [MarshalAs(UnmanagedType.U4)] public int dmICMMethod; [MarshalAs(UnmanagedType.U4)] public int dmICMIntent; [MarshalAs(UnmanagedType.U4)] public int dmMediaType; [MarshalAs(UnmanagedType.U4)] public int dmDitherType; [MarshalAs(UnmanagedType.U4)] public int dmReserved1; [MarshalAs(UnmanagedType.U4)] public int dmReserved2; } [DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)] [SuppressUnmanagedCodeSecurity] [return: MarshalAs(UnmanagedType.I4)] private static extern int OpenPrinter([MarshalAs(UnmanagedType.LPTStr)] string printername, ref IntPtr phPrinter, ref structPrinterDefaults pd); [DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)] [SuppressUnmanagedCodeSecurity] [return: MarshalAs(UnmanagedType.I4)] private static extern int ClosePrinter(IntPtr phPrinter); [DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)] [SuppressUnmanagedCodeSecurity] [return: MarshalAs(UnmanagedType.I4)] private static extern int AddForm(IntPtr hPrinter, [MarshalAs(UnmanagedType.I4)] int Level, ref structFormInfo1 pForm); [DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)] [SuppressUnmanagedCodeSecurity] [return: MarshalAs(UnmanagedType.I4)] private static extern int DeleteForm(IntPtr hPrinter, [MarshalAs(UnmanagedType.LPTStr)] string pFormName); [DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)] [SuppressUnmanagedCodeSecurity] [return: MarshalAs(UnmanagedType.I4)] private static extern int SetForm(IntPtr hPrinter, [MarshalAs(UnmanagedType.LPTStr)] string pFormName, [MarshalAs(UnmanagedType.I4)] int Level, ref structFormInfo1 pForm); [DllImport("kernel32.dll", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)] [SuppressUnmanagedCodeSecurity] [return: MarshalAs(UnmanagedType.I4)] private static extern int GetLastError(); [DllImport("GDI32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)] [SuppressUnmanagedCodeSecurity] private static extern IntPtr CreateDC([MarshalAs(UnmanagedType.LPTStr)] string lpDriverName, [MarshalAs(UnmanagedType.LPTStr)] string lpDeviceName, [MarshalAs(UnmanagedType.LPTStr)] string lpOutput, ref structDevMode lpInitData); [DllImport("GDI32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)] [SuppressUnmanagedCodeSecurity] private static extern IntPtr ResetDC(IntPtr hdc, ref structDevMode lpInitData); [DllImport("GDI32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)] [SuppressUnmanagedCodeSecurity] [return: MarshalAs(UnmanagedType.I4)] private static extern int DeleteDC(IntPtr hdc); public static PaperSize GetPrintForm(string printerName, PaperKind paperkind) { PaperSize result = null; PrinterSettings printerSettings = new PrinterSettings(); printerSettings.PrinterName = printerName; try { IEnumerator enumerator = printerSettings.PaperSizes.GetEnumerator(); while (enumerator.MoveNext()) { PaperSize paperSize = (PaperSize)enumerator.Current; if (paperSize.Kind == paperkind) { result = paperSize; break; } } } finally { IEnumerator enumerator2 = null; if (enumerator2 is IDisposable) { (enumerator2 as IDisposable).Dispose(); } } return result; } public static PaperSize GetPrintForm(string printerName, string paperName) { PaperSize result = null; PrinterSettings printerSettings = new PrinterSettings(); if (Module1.IsValidPrinterName(printerName)) { printerSettings.PrinterName = printerName; } try { IEnumerator enumerator = printerSettings.PaperSizes.GetEnumerator(); while (enumerator.MoveNext()) { PaperSize paperSize = (PaperSize)enumerator.Current; if (Operators.CompareString(paperSize.PaperName.ToLower(), paperName.ToLower(), TextCompare: false) == 0) { result = paperSize; break; } } } finally { IEnumerator enumerator2 = null; if (enumerator2 is IDisposable) { (enumerator2 as IDisposable).Dispose(); } } return result; } public static void SetPrintForm(string printerName, string paperName, float width, float height) { if (!Module1.IsValidPrinterName(printerName)) { PrinterSettings printerSettings = new PrinterSettings(); printerName = printerSettings.PrinterName; } paperName = Strings.Trim(paperName); if (PlatformID.Win32NT != Environment.OSVersion.Platform) { return; } structPrinterDefaults pd = default(structPrinterDefaults); pd.pDatatype = null; pd.pDevMode = IntPtr.Zero; pd.DesiredAccess = 12; IntPtr phPrinter = IntPtr.Zero; long num = OpenPrinter(printerName, ref phPrinter, ref pd); if (num == 0) { return; } checked { try { structFormInfo1 pForm = default(structFormInfo1); pForm.Flags = 0; pForm.pName = paperName; pForm.size.width = (int)Math.Round(width * 1000f); pForm.size.height = (int)Math.Round(height * 1000f); pForm.ImageableArea.left = 0; pForm.ImageableArea.right = pForm.size.width; pForm.ImageableArea.top = 0; pForm.ImageableArea.bottom = pForm.size.height; bool flag; if (GetPrintForm(printerName, paperName) != null) { flag = SetForm(phPrinter, paperName, 1, ref pForm) != 0; } else { AddCustomPaperSize(printerName, paperName, width, height); flag = true; } if (!flag) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendFormat("添加纸张{0}时发生错误!, 系统错误号: {1}", paperName, GetLastError()); MessageBox.Show(stringBuilder.ToString()); } } finally { ClosePrinter(phPrinter); } } } public static void AddCustomPaperSize(string printerName, string paperName, float width, float height) { checked { if (PlatformID.Win32NT == Environment.OSVersion.Platform) { structPrinterDefaults pd = default(structPrinterDefaults); pd.pDatatype = null; pd.pDevMode = IntPtr.Zero; pd.DesiredAccess = 12; IntPtr phPrinter = IntPtr.Zero; if (OpenPrinter(printerName, ref phPrinter, ref pd) == 0) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendFormat("打开打印机{0} 时出现异常!, 系统错误号: {1}", printerName, GetLastError()); throw new ApplicationException(stringBuilder.ToString()); } try { DeleteForm(phPrinter, paperName); structFormInfo1 pForm = default(structFormInfo1); pForm.Flags = 0; pForm.pName = paperName; pForm.size.width = (int)Math.Round((double)width * 1000.0); pForm.size.height = (int)Math.Round((double)height * 1000.0); pForm.ImageableArea.left = 0; pForm.ImageableArea.right = pForm.size.width; pForm.ImageableArea.top = 0; pForm.ImageableArea.bottom = pForm.size.height; try { if (AddForm(phPrinter, 1, ref pForm) == 0) { StringBuilder stringBuilder2 = new StringBuilder(); stringBuilder2.AppendFormat("添加纸张{0}时发生错误!, 系统错误号: {1}", paperName, GetLastError()); throw new ApplicationException(stringBuilder2.ToString()); } return; } catch (Exception projectError) { ProjectData.SetProjectError(projectError); ProjectData.ClearProjectError(); return; } } finally { ClosePrinter(phPrinter); } } structDevMode lpInitData = default(structDevMode); IntPtr intPtr = CreateDC(null, printerName, null, ref lpInitData); if (intPtr != IntPtr.Zero) { lpInitData.dmFields = 14; lpInitData.dmPaperSize = 256; lpInitData.dmPaperWidth = (short)Math.Round((double)width * 2.54 * 1000.0); lpInitData.dmPaperLength = (short)Math.Round((double)height * 2.54 * 1000.0); ResetDC(intPtr, ref lpInitData); DeleteDC(intPtr); } } } } }