definepaper.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. using System;
  2. using System.Collections;
  3. using System.ComponentModel;
  4. using System.Drawing.Printing;
  5. using System.Runtime.InteropServices;
  6. using System.Security;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using Microsoft.VisualBasic;
  10. using Microsoft.VisualBasic.CompilerServices;
  11. namespace Dongke.IBOSS.PRD.Framework.Controls
  12. {
  13. [EditorBrowsable(EditorBrowsableState.Never)]
  14. public class definepaper
  15. {
  16. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
  17. private struct structPrinterDefaults
  18. {
  19. [MarshalAs(UnmanagedType.LPTStr)]
  20. public string pDatatype;
  21. public IntPtr pDevMode;
  22. [MarshalAs(UnmanagedType.I4)]
  23. public int DesiredAccess;
  24. }
  25. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
  26. private struct structSize
  27. {
  28. public int width;
  29. public int height;
  30. }
  31. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
  32. private struct structRect
  33. {
  34. public int left;
  35. public int top;
  36. public int right;
  37. public int bottom;
  38. }
  39. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
  40. private struct structFormInfo1
  41. {
  42. [MarshalAs(UnmanagedType.I4)]
  43. public int Flags;
  44. [MarshalAs(UnmanagedType.LPTStr)]
  45. public string pName;
  46. public structSize size;
  47. public structRect ImageableArea;
  48. }
  49. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
  50. private struct structDevMode
  51. {
  52. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
  53. public string dmDeviceName;
  54. [MarshalAs(UnmanagedType.U2)]
  55. public short dmSpecVersion;
  56. [MarshalAs(UnmanagedType.U2)]
  57. public short dmDriverVersion;
  58. [MarshalAs(UnmanagedType.U2)]
  59. public short dmSize;
  60. [MarshalAs(UnmanagedType.U2)]
  61. public short dmDriverExtra;
  62. [MarshalAs(UnmanagedType.U4)]
  63. public int dmFields;
  64. [MarshalAs(UnmanagedType.I2)]
  65. public short dmOrientation;
  66. [MarshalAs(UnmanagedType.I2)]
  67. public short dmPaperSize;
  68. [MarshalAs(UnmanagedType.I2)]
  69. public short dmPaperLength;
  70. [MarshalAs(UnmanagedType.I2)]
  71. public short dmPaperWidth;
  72. [MarshalAs(UnmanagedType.I2)]
  73. public short dmScale;
  74. [MarshalAs(UnmanagedType.I2)]
  75. public short dmCopies;
  76. [MarshalAs(UnmanagedType.I2)]
  77. public short dmDefaultSource;
  78. [MarshalAs(UnmanagedType.I2)]
  79. public short dmPrintQuality;
  80. [MarshalAs(UnmanagedType.I2)]
  81. public short dmColor;
  82. [MarshalAs(UnmanagedType.I2)]
  83. public short dmDuplex;
  84. [MarshalAs(UnmanagedType.I2)]
  85. public short dmYResolution;
  86. [MarshalAs(UnmanagedType.I2)]
  87. public short dmTTOption;
  88. [MarshalAs(UnmanagedType.I2)]
  89. public short dmCollate;
  90. [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
  91. public string dmFormName;
  92. [MarshalAs(UnmanagedType.U2)]
  93. public short dmLogPixels;
  94. [MarshalAs(UnmanagedType.U4)]
  95. public int dmBitsPerPel;
  96. [MarshalAs(UnmanagedType.U4)]
  97. public int dmPelsWidth;
  98. [MarshalAs(UnmanagedType.U4)]
  99. public int dmPelsHeight;
  100. [MarshalAs(UnmanagedType.U4)]
  101. public int dmNup;
  102. [MarshalAs(UnmanagedType.U4)]
  103. public int dmDisplayFrequency;
  104. [MarshalAs(UnmanagedType.U4)]
  105. public int dmICMMethod;
  106. [MarshalAs(UnmanagedType.U4)]
  107. public int dmICMIntent;
  108. [MarshalAs(UnmanagedType.U4)]
  109. public int dmMediaType;
  110. [MarshalAs(UnmanagedType.U4)]
  111. public int dmDitherType;
  112. [MarshalAs(UnmanagedType.U4)]
  113. public int dmReserved1;
  114. [MarshalAs(UnmanagedType.U4)]
  115. public int dmReserved2;
  116. }
  117. [DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
  118. [SuppressUnmanagedCodeSecurity]
  119. [return: MarshalAs(UnmanagedType.I4)]
  120. private static extern int OpenPrinter([MarshalAs(UnmanagedType.LPTStr)] string printername, ref IntPtr phPrinter, ref structPrinterDefaults pd);
  121. [DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
  122. [SuppressUnmanagedCodeSecurity]
  123. [return: MarshalAs(UnmanagedType.I4)]
  124. private static extern int ClosePrinter(IntPtr phPrinter);
  125. [DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
  126. [SuppressUnmanagedCodeSecurity]
  127. [return: MarshalAs(UnmanagedType.I4)]
  128. private static extern int AddForm(IntPtr hPrinter, [MarshalAs(UnmanagedType.I4)] int Level, ref structFormInfo1 pForm);
  129. [DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
  130. [SuppressUnmanagedCodeSecurity]
  131. [return: MarshalAs(UnmanagedType.I4)]
  132. private static extern int DeleteForm(IntPtr hPrinter, [MarshalAs(UnmanagedType.LPTStr)] string pFormName);
  133. [DllImport("winspool.Drv", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
  134. [SuppressUnmanagedCodeSecurity]
  135. [return: MarshalAs(UnmanagedType.I4)]
  136. private static extern int SetForm(IntPtr hPrinter, [MarshalAs(UnmanagedType.LPTStr)] string pFormName, [MarshalAs(UnmanagedType.I4)] int Level, ref structFormInfo1 pForm);
  137. [DllImport("kernel32.dll", CallingConvention = CallingConvention.StdCall, ExactSpelling = true)]
  138. [SuppressUnmanagedCodeSecurity]
  139. [return: MarshalAs(UnmanagedType.I4)]
  140. private static extern int GetLastError();
  141. [DllImport("GDI32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
  142. [SuppressUnmanagedCodeSecurity]
  143. private static extern IntPtr CreateDC([MarshalAs(UnmanagedType.LPTStr)] string lpDriverName, [MarshalAs(UnmanagedType.LPTStr)] string lpDeviceName, [MarshalAs(UnmanagedType.LPTStr)] string lpOutput, ref structDevMode lpInitData);
  144. [DllImport("GDI32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
  145. [SuppressUnmanagedCodeSecurity]
  146. private static extern IntPtr ResetDC(IntPtr hdc, ref structDevMode lpInitData);
  147. [DllImport("GDI32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
  148. [SuppressUnmanagedCodeSecurity]
  149. [return: MarshalAs(UnmanagedType.I4)]
  150. private static extern int DeleteDC(IntPtr hdc);
  151. public static PaperSize GetPrintForm(string printerName, PaperKind paperkind)
  152. {
  153. PaperSize result = null;
  154. PrinterSettings printerSettings = new PrinterSettings();
  155. printerSettings.PrinterName = printerName;
  156. try
  157. {
  158. IEnumerator enumerator = printerSettings.PaperSizes.GetEnumerator();
  159. while (enumerator.MoveNext())
  160. {
  161. PaperSize paperSize = (PaperSize)enumerator.Current;
  162. if (paperSize.Kind == paperkind)
  163. {
  164. result = paperSize;
  165. break;
  166. }
  167. }
  168. }
  169. finally
  170. {
  171. IEnumerator enumerator2 = null;
  172. if (enumerator2 is IDisposable)
  173. {
  174. (enumerator2 as IDisposable).Dispose();
  175. }
  176. }
  177. return result;
  178. }
  179. public static PaperSize GetPrintForm(string printerName, string paperName)
  180. {
  181. PaperSize result = null;
  182. PrinterSettings printerSettings = new PrinterSettings();
  183. if (Module1.IsValidPrinterName(printerName))
  184. {
  185. printerSettings.PrinterName = printerName;
  186. }
  187. try
  188. {
  189. IEnumerator enumerator = printerSettings.PaperSizes.GetEnumerator();
  190. while (enumerator.MoveNext())
  191. {
  192. PaperSize paperSize = (PaperSize)enumerator.Current;
  193. if (Operators.CompareString(paperSize.PaperName.ToLower(), paperName.ToLower(), TextCompare: false) == 0)
  194. {
  195. result = paperSize;
  196. break;
  197. }
  198. }
  199. }
  200. finally
  201. {
  202. IEnumerator enumerator2 = null;
  203. if (enumerator2 is IDisposable)
  204. {
  205. (enumerator2 as IDisposable).Dispose();
  206. }
  207. }
  208. return result;
  209. }
  210. public static void SetPrintForm(string printerName, string paperName, float width, float height)
  211. {
  212. if (!Module1.IsValidPrinterName(printerName))
  213. {
  214. PrinterSettings printerSettings = new PrinterSettings();
  215. printerName = printerSettings.PrinterName;
  216. }
  217. paperName = Strings.Trim(paperName);
  218. if (PlatformID.Win32NT != Environment.OSVersion.Platform)
  219. {
  220. return;
  221. }
  222. structPrinterDefaults pd = default(structPrinterDefaults);
  223. pd.pDatatype = null;
  224. pd.pDevMode = IntPtr.Zero;
  225. pd.DesiredAccess = 12;
  226. IntPtr phPrinter = IntPtr.Zero;
  227. long num = OpenPrinter(printerName, ref phPrinter, ref pd);
  228. if (num == 0)
  229. {
  230. return;
  231. }
  232. checked
  233. {
  234. try
  235. {
  236. structFormInfo1 pForm = default(structFormInfo1);
  237. pForm.Flags = 0;
  238. pForm.pName = paperName;
  239. pForm.size.width = (int)Math.Round(width * 1000f);
  240. pForm.size.height = (int)Math.Round(height * 1000f);
  241. pForm.ImageableArea.left = 0;
  242. pForm.ImageableArea.right = pForm.size.width;
  243. pForm.ImageableArea.top = 0;
  244. pForm.ImageableArea.bottom = pForm.size.height;
  245. bool flag;
  246. if (GetPrintForm(printerName, paperName) != null)
  247. {
  248. flag = SetForm(phPrinter, paperName, 1, ref pForm) != 0;
  249. }
  250. else
  251. {
  252. AddCustomPaperSize(printerName, paperName, width, height);
  253. flag = true;
  254. }
  255. if (!flag)
  256. {
  257. StringBuilder stringBuilder = new StringBuilder();
  258. stringBuilder.AppendFormat("添加纸张{0}时发生错误!, 系统错误号: {1}", paperName, GetLastError());
  259. MessageBox.Show(stringBuilder.ToString());
  260. }
  261. }
  262. finally
  263. {
  264. ClosePrinter(phPrinter);
  265. }
  266. }
  267. }
  268. public static void AddCustomPaperSize(string printerName, string paperName, float width, float height)
  269. {
  270. checked
  271. {
  272. if (PlatformID.Win32NT == Environment.OSVersion.Platform)
  273. {
  274. structPrinterDefaults pd = default(structPrinterDefaults);
  275. pd.pDatatype = null;
  276. pd.pDevMode = IntPtr.Zero;
  277. pd.DesiredAccess = 12;
  278. IntPtr phPrinter = IntPtr.Zero;
  279. if (OpenPrinter(printerName, ref phPrinter, ref pd) == 0)
  280. {
  281. StringBuilder stringBuilder = new StringBuilder();
  282. stringBuilder.AppendFormat("打开打印机{0} 时出现异常!, 系统错误号: {1}", printerName, GetLastError());
  283. throw new ApplicationException(stringBuilder.ToString());
  284. }
  285. try
  286. {
  287. DeleteForm(phPrinter, paperName);
  288. structFormInfo1 pForm = default(structFormInfo1);
  289. pForm.Flags = 0;
  290. pForm.pName = paperName;
  291. pForm.size.width = (int)Math.Round((double)width * 1000.0);
  292. pForm.size.height = (int)Math.Round((double)height * 1000.0);
  293. pForm.ImageableArea.left = 0;
  294. pForm.ImageableArea.right = pForm.size.width;
  295. pForm.ImageableArea.top = 0;
  296. pForm.ImageableArea.bottom = pForm.size.height;
  297. try
  298. {
  299. if (AddForm(phPrinter, 1, ref pForm) == 0)
  300. {
  301. StringBuilder stringBuilder2 = new StringBuilder();
  302. stringBuilder2.AppendFormat("添加纸张{0}时发生错误!, 系统错误号: {1}", paperName, GetLastError());
  303. throw new ApplicationException(stringBuilder2.ToString());
  304. }
  305. return;
  306. }
  307. catch (Exception projectError)
  308. {
  309. ProjectData.SetProjectError(projectError);
  310. ProjectData.ClearProjectError();
  311. return;
  312. }
  313. }
  314. finally
  315. {
  316. ClosePrinter(phPrinter);
  317. }
  318. }
  319. structDevMode lpInitData = default(structDevMode);
  320. IntPtr intPtr = CreateDC(null, printerName, null, ref lpInitData);
  321. if (intPtr != IntPtr.Zero)
  322. {
  323. lpInitData.dmFields = 14;
  324. lpInitData.dmPaperSize = 256;
  325. lpInitData.dmPaperWidth = (short)Math.Round((double)width * 2.54 * 1000.0);
  326. lpInitData.dmPaperLength = (short)Math.Round((double)height * 2.54 * 1000.0);
  327. ResetDC(intPtr, ref lpInitData);
  328. DeleteDC(intPtr);
  329. }
  330. }
  331. }
  332. }
  333. }