printer.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. /**
  2. * 打印模块
  3. * date:2020-02-08 License By http://easyweb.vip
  4. */
  5. layui.define(['jquery'], function (exports) {
  6. var $ = layui.jquery;
  7. var hideClass = 'hide-print'; // 打印时隐藏
  8. var printingClass = 'printing'; // 正在打印
  9. var ieWebBrowser = '<object id="WebBrowser" classid="clsid:8856F961-340A-11D0-A96B-00C04FD705A2" width="0" height="0"></object>';
  10. var printer = {
  11. // 判断是否是ie
  12. isIE: function () {
  13. return (!!window.ActiveXObject || 'ActiveXObject' in window);
  14. },
  15. // 判断是否是Edge
  16. isEdge: function () {
  17. return navigator.userAgent.indexOf('Edge') !== -1;
  18. },
  19. // 判断是否是Firefox
  20. isFirefox: function () {
  21. return navigator.userAgent.indexOf('Firefox') !== -1;
  22. }
  23. };
  24. /** 打印当前页面 */
  25. printer.print = function (param) {
  26. window.focus(); // 让当前窗口获取焦点
  27. param || (param = {});
  28. var hide = param.hide; // 需要隐藏的元素
  29. var horizontal = param.horizontal; // 纸张是否是横向
  30. var iePreview = param.iePreview; // 兼容ie打印预览
  31. var blank = param.blank; // 是否打开新窗口
  32. var close = param.close; // 如果是打开新窗口,打印完是否关闭
  33. // 设置参数默认值
  34. (iePreview === undefined) && (iePreview = true);
  35. (blank === undefined && window !== top && iePreview && printer.isIE()) && (blank = true);
  36. (close === undefined && blank && !printer.isIE()) && (close = true);
  37. // 打印方向控制
  38. $('#page-print-set').remove();
  39. var printSet = '<style type="text/css" media="print" id="page-print-set">';
  40. printSet += (' @page { size: ' + (horizontal ? 'landscape' : 'portrait') + '; }');
  41. printSet += ' </style>';
  42. $('body').append(printSet);
  43. // 隐藏打印时需要隐藏内容
  44. printer.hideElem(hide);
  45. // 打印
  46. var pWindow;
  47. if (blank) {
  48. // 创建打印窗口
  49. pWindow = window.open('', '_blank');
  50. pWindow.focus(); // 让打印窗口获取焦点
  51. // 写入内容到打印窗口
  52. var pDocument = pWindow.document;
  53. pDocument.open();
  54. var blankHtml = '<!DOCTYPE html>' + document.getElementsByTagName('html')[0].innerHTML;
  55. if (iePreview && printer.isIE()) {
  56. blankHtml += ieWebBrowser;
  57. blankHtml += ('<script>window.onload = function(){ WebBrowser.ExecWB(7, 1); ' + (close ? 'window.close();' : '') + ' }</script>');
  58. } else {
  59. blankHtml += ('<script>window.onload = function(){ window.print(); ' + (close ? 'window.close();' : '') + ' }</script>');
  60. }
  61. pDocument.write(blankHtml);
  62. pDocument.close();
  63. } else {
  64. pWindow = window;
  65. if (iePreview && printer.isIE()) {
  66. ($('#WebBrowser').length === 0) && ($('body').append(ieWebBrowser));
  67. WebBrowser.ExecWB(7, 1);
  68. } else {
  69. pWindow.print();
  70. }
  71. }
  72. printer.showElem(hide);
  73. return pWindow;
  74. };
  75. /** 打印html字符串 */
  76. printer.printHtml = function (param) {
  77. param || (param = {});
  78. var html = param.html; // 打印的html内容
  79. var blank = param.blank; // 是否打开新窗口
  80. var close = param.close; // 打印完是否关闭打印窗口
  81. var print = param.print; // 是否自动调用打印
  82. var horizontal = param.horizontal; // 纸张是否是横向
  83. var iePreview = param.iePreview; // 兼容ie打印预览
  84. // 设置参数默认值
  85. (print === undefined) && (print = true);
  86. (iePreview === undefined) && (iePreview = true);
  87. (blank === undefined && printer.isIE()) && (blank = true);
  88. (close === undefined && blank && !printer.isIE()) && (close = true);
  89. // 创建打印窗口
  90. var pWindow, pDocument;
  91. if (blank) {
  92. pWindow = window.open('', '_blank');
  93. pDocument = pWindow.document;
  94. } else {
  95. var printFrame = document.getElementById('printFrame');
  96. if (!printFrame) {
  97. $('body').append('<iframe id="printFrame" style="display: none;"></iframe>');
  98. printFrame = document.getElementById('printFrame');
  99. }
  100. pWindow = printFrame.contentWindow;
  101. pDocument = printFrame.contentDocument || printFrame.contentWindow.document;
  102. }
  103. pWindow.focus(); // 让打印窗口获取焦点
  104. // 写入内容到打印窗口
  105. if (html) {
  106. // 加入公共css
  107. html += ('<style>' + printer.getCommonCss(true) + '</style>');
  108. // 打印方向控制
  109. html += '<style type="text/css" media="print">';
  110. html += (' @page { size: ' + (horizontal ? 'landscape' : 'portrait') + '; }');
  111. html += '</style>';
  112. // 打印预览兼容ie
  113. if (iePreview && printer.isIE()) {
  114. html += ieWebBrowser;
  115. if (print) {
  116. html += ('<script>window.onload = function(){ WebBrowser.ExecWB(7, 1); ' + (close ? 'window.close();' : '') + ' }</script>');
  117. }
  118. } else if (print) {
  119. html += ('<script>window.onload = function(){ window.print(); ' + (close ? 'window.close();' : '') + ' }</script>');
  120. }
  121. // 写入html
  122. pDocument.open();
  123. pDocument.write(html);
  124. pDocument.close();
  125. }
  126. return pWindow;
  127. };
  128. /** 分页打印 */
  129. printer.printPage = function (param) {
  130. param || (param = {});
  131. var htmls = param.htmls; // 打印的内容
  132. var horizontal = param.horizontal; // 纸张是否是横向
  133. var style = param.style; // 打印的样式
  134. var padding = param.padding; // 页边距
  135. var blank = param.blank; // 是否打开新窗口
  136. var close = param.close; // 打印完是否关闭打印窗口
  137. var print = param.print; // 是否自动调用打印
  138. var width = param.width; // 页面宽度
  139. var height = param.height; // 页面高度
  140. var iePreview = param.iePreview; // 兼容ie打印预览
  141. var isDebug = param.debug; // 调试模式
  142. // 设置参数默认值
  143. (print === undefined) && (print = true);
  144. (iePreview === undefined) && (iePreview = true);
  145. (blank === undefined && printer.isIE()) && (blank = true);
  146. (close === undefined && blank && !printer.isIE()) && (close = true);
  147. // 创建打印窗口
  148. var pWindow, pDocument;
  149. if (blank) {
  150. pWindow = window.open('', '_blank');
  151. pDocument = pWindow.document;
  152. } else {
  153. var printFrame = document.getElementById('printFrame');
  154. if (!printFrame) {
  155. $('body').append('<iframe id="printFrame" style="display: none;"></iframe>');
  156. printFrame = document.getElementById('printFrame');
  157. }
  158. pWindow = printFrame.contentWindow;
  159. pDocument = printFrame.contentDocument || printFrame.contentWindow.document;
  160. }
  161. pWindow.focus(); // 让打印窗口获取焦点
  162. // 拼接打印内容
  163. var htmlStr = '<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>打印窗口</title>';
  164. style && (htmlStr += style); // 写入自定义css
  165. // 控制分页的css
  166. htmlStr += printer.getPageCss(padding, width, height);
  167. // 控制打印方向
  168. htmlStr += '<style type="text/css" media="print">';
  169. htmlStr += (' @page { size: ' + (horizontal ? 'landscape' : 'portrait') + '; }');
  170. htmlStr += '</style>';
  171. htmlStr += '</head><body>';
  172. // 拼接分页内容
  173. if (htmls) {
  174. var pageClass = isDebug ? ' page-debug' : ''; // 调试模式
  175. htmlStr += '<div class="print-page' + pageClass + '">';
  176. for (var i = 0; i < htmls.length; i++) {
  177. htmlStr += '<div class="print-page-item">';
  178. htmlStr += htmls[i];
  179. htmlStr += '</div>';
  180. }
  181. htmlStr += '</div>';
  182. }
  183. // 兼容ie打印预览
  184. if (iePreview && printer.isIE()) {
  185. htmlStr += ieWebBrowser;
  186. if (print) {
  187. htmlStr += ('<script>window.onload = function(){ WebBrowser.ExecWB(7, 1); ' + (close ? 'window.close();' : '') + ' }</script>');
  188. }
  189. } else if (print) {
  190. htmlStr += ('<script>window.onload = function(){ window.print(); ' + (close ? 'window.close();' : '') + ' }</script>');
  191. }
  192. htmlStr += '</body></html>';
  193. // 写入打印内容
  194. pDocument.open();
  195. pDocument.write(htmlStr);
  196. pDocument.close();
  197. return pWindow;
  198. };
  199. /** 分页打印的css */
  200. printer.getPageCss = function (padding, width, height) {
  201. var pageCss = '<style>';
  202. pageCss += 'body {';
  203. pageCss += ' margin: 0 !important;';
  204. pageCss += '} ';
  205. // 自定义边距竖屏样式
  206. pageCss += '.print-page .print-page-item {';
  207. pageCss += ' page-break-after: always !important;';
  208. pageCss += ' box-sizing: border-box !important;';
  209. pageCss += ' border: none !important;';
  210. padding && (pageCss += ('padding: ' + padding + ';'));
  211. width && (pageCss += (' width: ' + width + ';'));
  212. height && (pageCss += (' height: ' + height + ';'));
  213. pageCss += '} ';
  214. // 调试模式样式
  215. pageCss += '.print-page.page-debug .print-page-item {';
  216. pageCss += ' border: 1px solid red !important;';
  217. pageCss += '} ';
  218. pageCss += printer.getCommonCss(true); // 加入公共css
  219. pageCss += '</style>';
  220. return pageCss;
  221. };
  222. /** 隐藏元素 */
  223. printer.hideElem = function (elems) {
  224. $('.' + hideClass).addClass(printingClass);
  225. if (!elems) {
  226. return;
  227. }
  228. if (elems instanceof Array) {
  229. for (var i = 0; i < elems.length; i++) {
  230. $(elems[i]).addClass(hideClass + ' ' + printingClass);
  231. }
  232. } else {
  233. $(elems).addClass(printingClass);
  234. }
  235. };
  236. /** 取消隐藏 */
  237. printer.showElem = function (elems) {
  238. $('.' + hideClass).removeClass(printingClass);
  239. if (!elems) {
  240. return;
  241. }
  242. if (elems instanceof Array) {
  243. for (var i = 0; i < elems.length; i++) {
  244. $(elems[i]).removeClass(hideClass + ' ' + printingClass);
  245. }
  246. } else {
  247. $(elems).removeClass(printingClass);
  248. }
  249. };
  250. /** 打印公共样式 */
  251. printer.getCommonCss = function (isPrinting) {
  252. var cssStr = ('.' + hideClass + '.' + printingClass + ' {');
  253. cssStr += ' visibility: hidden !important;';
  254. cssStr += ' }';
  255. // 表格样式
  256. cssStr += ' .print-table {';
  257. cssStr += ' border: none;';
  258. cssStr += ' border-collapse: collapse;';
  259. cssStr += ' width: 100%;';
  260. cssStr += ' }';
  261. cssStr += ' .print-table td, .print-table th {';
  262. cssStr += ' color: #333;';
  263. cssStr += ' padding: 9px 15px;';
  264. cssStr += ' word-break: break-all;';
  265. cssStr += ' border: 1px solid #333;';
  266. cssStr += ' }';
  267. //
  268. if (isPrinting) {
  269. cssStr += ('.' + hideClass + ' {');
  270. cssStr += ' visibility: hidden !important;';
  271. cssStr += '}';
  272. }
  273. return cssStr;
  274. };
  275. /** 拼接html */
  276. printer.makeHtml = function (param) {
  277. var title = param.title;
  278. var style = param.style;
  279. var body = param.body;
  280. title == undefined && (title = '打印窗口');
  281. var htmlStr = '<!DOCTYPE html><html lang="en">';
  282. htmlStr += ' <head><meta charset="UTF-8">';
  283. htmlStr += (' <title>' + title + '</title>');
  284. style && (htmlStr += style);
  285. htmlStr += ' </head>';
  286. htmlStr += ' <body>';
  287. body && (htmlStr += body);
  288. htmlStr += ' </body>';
  289. htmlStr += ' </html>';
  290. return htmlStr;
  291. };
  292. $('head').append('<style>' + printer.getCommonCss() + '</style>');
  293. exports("printer", printer);
  294. });