lodopUtils.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. // lodopUtils.js
  2. var CreatedOKLodopObject, CLodopIsLocal, CLodopJsState;
  3. let CLODOP = null;
  4. let needCLodop = false;
  5. // CLodop 云打印服务主机
  6. const hostList = [
  7. 'localhost:8000',
  8. 'localhost:18000',
  9. 'localhost:8001'
  10. ];
  11. // 安装提示
  12. const LODOP_INSTALL_GUIDE = {
  13. DOWNLOAD_URL: 'https://www.lodop.net/download.html',
  14. WIN_INSTALL_MSG: '请先下载和安装 Lodop 打印控件,\n 下载地址:https://www.lodop.net/download.html',
  15. OTHER_OS_MSG: '对不起,目前仅支持在 Windows 系统下进行打印操作'
  16. };
  17. //判断是否需要CLodop(那些不支持插件的浏览器)
  18. function checkNeedCLodop() {
  19. try {
  20. var ua = navigator.userAgent;
  21. if (ua.match(/Windows\sPhone/i))
  22. return true;
  23. if (ua.match(/iPhone|iPod|iPad/i))
  24. return true;
  25. if (ua.match(/Android/i))
  26. return true;
  27. if (ua.match(/Edge\D?\d+/i))
  28. return true;
  29. var verTrident = ua.match(/Trident\D?\d+/i);
  30. var verIE = ua.match(/MSIE\D?\d+/i);
  31. var verOPR = ua.match(/OPR\D?\d+/i);
  32. var verFF = ua.match(/Firefox\D?\d+/i);
  33. var x64 = ua.match(/x64/i);
  34. if ((!verTrident) && (!verIE) && (x64))
  35. return true;
  36. else if (verFF) {
  37. verFF = verFF[0].match(/\d+/);
  38. if ((verFF[0] >= 41) || (x64))
  39. return true;
  40. } else if (verOPR) {
  41. verOPR = verOPR[0].match(/\d+/);
  42. if (verOPR[0] >= 32)
  43. return true;
  44. } else if ((!verTrident) && (!verIE)) {
  45. var verChrome = ua.match(/Chrome\D?\d+/i);
  46. if (verChrome) {
  47. verChrome = verChrome[0].match(/\d+/);
  48. if (verChrome[0] >= 41)
  49. return true;
  50. }
  51. }
  52. return false;
  53. } catch (err) {
  54. return true;
  55. }
  56. }
  57. //加载引用CLodop的主JS,用双端口8000和18000(以防其中一个被占)
  58. function loadCLodop() {
  59. if (CLodopJsState == "loading" || CLodopJsState == "complete") return;
  60. CLodopJsState = "loading";
  61. var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement;
  62. var JS1 = document.createElement("script");
  63. var JS2 = document.createElement("script");
  64. JS1.src = "http://localhost:8000/CLodopfuncs.js?priority=1";
  65. JS2.src = "http://localhost:18000/CLodopfuncs.js";
  66. JS1.onload = JS2.onload = function() {CLodopJsState = "complete";}
  67. // eslint-disable-next-line no-unused-vars
  68. JS1.onerror = JS2.onerror = function(evt) {CLodopJsState = "complete";}
  69. head.insertBefore(JS1, head.firstChild);
  70. head.insertBefore(JS2, head.firstChild);
  71. CLodopIsLocal = !!((JS1.src + JS2.src).match(/\/\/localho|\/\/127.0.0./i));
  72. }
  73. /**
  74. * 检查是否已安装 Lodop
  75. */
  76. function checkLodopInstall() {
  77. try {
  78. const LODOP = window.getLodop();
  79. if (!LODOP && typeof LODOP !== 'object') return false;
  80. if (!LODOP.VERSION) return false;
  81. return true;
  82. } catch (err) {
  83. console.error('检查 Lodop 安装状态出错:', err);
  84. return false;
  85. }
  86. }
  87. /**
  88. * 显示安装提示信息
  89. */
  90. function showInstallMessage(message) {
  91. if (window.$message) {
  92. window.$message.error(message);
  93. } else {
  94. alert(message);
  95. }
  96. return null;
  97. }
  98. /**
  99. * 获取LODOP对象主过程
  100. * @param {boolean} requirePrint 是否需要打印功能
  101. * @returns {object|null} LODOP对象或null
  102. */
  103. function getLodop(oOBJECT, oEMBED, requirePrint = false) {
  104. let LODOP;
  105. try {
  106. // 判断是否需要 CLodop
  107. needCLodop = checkNeedCLodop();
  108. var ua = navigator.userAgent;
  109. var isIE = !!(ua.match(/MSIE/i)) || !!(ua.match(/Trident/i));
  110. if (needCLodop) {
  111. try {
  112. // eslint-disable-next-line no-undef
  113. LODOP = getCLodop();
  114. // eslint-disable-next-line no-empty
  115. } catch (err) {}
  116. if (!LODOP && CLodopJsState !== "complete") {
  117. if (CLodopJsState == "loading") {
  118. if (requirePrint) {
  119. return showInstallMessage("网页还没下载完毕,请稍等一下再操作.");
  120. }
  121. return null;
  122. } else {
  123. loadCLodop();
  124. if (requirePrint) {
  125. return showInstallMessage(LODOP_INSTALL_GUIDE.WIN_INSTALL_MSG);
  126. }
  127. return null;
  128. }
  129. }
  130. if (!LODOP && requirePrint) {
  131. return showInstallMessage(LODOP_INSTALL_GUIDE.WIN_INSTALL_MSG);
  132. }
  133. } else {
  134. var is64IE = isIE && !!(ua.match(/x64/i));
  135. //如果页面有Lodop就直接使用,否则新建
  136. if (oOBJECT || oEMBED) {
  137. if (isIE)
  138. LODOP = oOBJECT;
  139. else
  140. LODOP = oEMBED;
  141. } else if (!CreatedOKLodopObject) {
  142. LODOP = document.createElement("object");
  143. LODOP.setAttribute("width", 0);
  144. LODOP.setAttribute("height", 0);
  145. LODOP.setAttribute("style", "position:absolute;left:0px;top:-100px;width:0px;height:0px;");
  146. if (isIE)
  147. LODOP.setAttribute("classid", "clsid:2123C269-1E0C-4534-8141-A75355220B4CL");
  148. else
  149. LODOP.setAttribute("type", "application/x-print-lodop");
  150. document.documentElement.appendChild(LODOP);
  151. CreatedOKLodopObject = LODOP;
  152. } else
  153. LODOP = CreatedOKLodopObject;
  154. }
  155. return LODOP;
  156. } catch (err) {
  157. console.error('获取打印对象出错:', err);
  158. if (requirePrint) {
  159. return showInstallMessage('初始化打印对象失败,请检查打印服务是否正常运行');
  160. }
  161. return null;
  162. }
  163. }
  164. /**
  165. * 检查打印服务状态
  166. */
  167. function checkPrinterService() {
  168. const LODOP = getLodop(null, null, true);
  169. if (!LODOP) return false;
  170. try {
  171. const printers = LODOP.GET_PRINTER_LIST();
  172. return printers && printers.length > 0;
  173. } catch (err) {
  174. console.error('检查打印服务状态出错:', err);
  175. return false;
  176. }
  177. }
  178. /**
  179. * 获取默认打印机名称
  180. */
  181. function getDefaultPrinter() {
  182. const LODOP = getLodop(null, null, true);
  183. if (!LODOP) return '';
  184. try {
  185. return LODOP.GET_DEFAULT_PRINTER_NAME();
  186. } catch (err) {
  187. console.error('获取默认打印机出错:', err);
  188. return '';
  189. }
  190. }
  191. /**
  192. * 获取打印机列表
  193. */
  194. function getPrinterList() {
  195. const LODOP = getLodop(null, null, true);
  196. if (!LODOP) return [];
  197. try {
  198. return LODOP.GET_PRINTER_LIST();
  199. } catch (err) {
  200. console.error('获取打印机列表出错:', err);
  201. return [];
  202. }
  203. }
  204. export {
  205. getLodop,
  206. checkPrinterService,
  207. getDefaultPrinter,
  208. getPrinterList
  209. };