From 5bb24f8bc78f4fbce621aed340cc483ee7d63392 Mon Sep 17 00:00:00 2001 From: zhm Date: Mon, 29 Jul 2024 10:38:16 +0800 Subject: [PATCH 01/59] =?UTF-8?q?fix:=E8=A1=A8=E6=A0=BC=E9=87=8C=E9=9D=A2?= =?UTF-8?q?=E5=BD=93=E5=AD=97=E6=AE=B5=E7=B1=BB=E5=9E=8B=E4=B8=BA=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E6=97=B6=EF=BC=8C=E5=8D=95=E5=85=83=E6=A0=BC=E9=AB=98?= =?UTF-8?q?=E5=BA=A6=E8=AE=BE=E7=BD=AE=E6=97=A0=E6=95=88BUG=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=EF=BC=8C=E5=B9=B6=E8=AE=BE=E7=BD=AE=E6=9C=80=E5=B0=8F?= =?UTF-8?q?=E9=AB=98=E5=BA=A6=E9=81=BF=E5=85=8D=E8=A1=A8=E5=8D=95=E9=AB=98?= =?UTF-8?q?=E5=BA=A6=E8=AE=A1=E7=AE=97=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hiprint/hiprint.bundle.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hiprint/hiprint.bundle.js b/src/hiprint/hiprint.bundle.js index 72fc879c..58195c29 100644 --- a/src/hiprint/hiprint.bundle.js +++ b/src/hiprint/hiprint.bundle.js @@ -1990,6 +1990,7 @@ var hiprint = function (t) { var imagebox = $('
') imagebox.find('img').attr('src', p) + imagebox.find('img').attr("height", t.tableColumnHeight || 50 + 'pt') console.log(imagebox.find('img').css('width')) r.html(imagebox) } From c747a8b42eea4fc9fdd899802af170b47f9fb662 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <840054486@qq.com> Date: Mon, 29 Jul 2024 16:05:32 +0000 Subject: [PATCH 02/59] pub-beta 0.0.57-beta27 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3103deeb..0bcaea73 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vue-plugin-hiprint", "description": "hiprint for Vue2.x / Vue3.x 支持拖拽(分页(不分页)、表头表脚、样式设置、复制粘贴、缩放、撤销重做)生成打印模板、导出json模板数据、静默打印/获取MAC地址(借助客户端)", - "version": "0.0.57-beta26", + "version": "0.0.57-beta27", "author": "CcSimple", "license": "MIT", "main": "dist/vue-plugin-hiprint.js", From 8b9b31dbb3009a03dd01cdfe85e8c7996202bf42 Mon Sep 17 00:00:00 2001 From: CcSimple <840054486@qq.com> Date: Fri, 9 Aug 2024 09:58:57 +0800 Subject: [PATCH 03/59] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cde34725..b0b74493 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ provider: [【vue-plugin-hiprint】如何自定义可拖拽元素 provider](http hiprint官方文档:[http://hiprint.io/docs/start](http://hiprint.io/docs/start) -本人写的部分文档: [https://ccsimple.gitee.io/sv-print-docs/config/hiprint.html](https://ccsimple.gitee.io/sv-print-docs/config/hiprint.html) +本人写的部分文档: [https://ccsimple.github.io/sv-print-docs/config/hiprint.html](https://ccsimple.github.io/sv-print-docs/config/hiprint.html) ## 安装使用 ``` From a6f865b7590d6e36e96033f328c901e78c09a206 Mon Sep 17 00:00:00 2001 From: george-hong <15995610151@163.com> Date: Fri, 9 Aug 2024 00:36:01 +0800 Subject: [PATCH 04/59] =?UTF-8?q?feat:=20=E6=8B=93=E5=B1=95print2=E6=96=B9?= =?UTF-8?q?=E6=B3=95=EF=BC=8C=E6=94=AF=E6=8C=81=E5=88=86=E6=89=B9=E6=89=93?= =?UTF-8?q?=E5=8D=B0=EF=BC=88=E8=AE=B8=E9=85=8D=E5=90=88=E5=AF=B9=E5=BA=94?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 +++++ src/demo/design/index.vue | 58 +++++++++++++++++-------- src/hiprint/hiprint.bundle.js | 82 ++++++++++++++++++++++++++++++++++- 3 files changed, 133 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index cde34725..83a80721 100644 --- a/README.md +++ b/README.md @@ -435,6 +435,18 @@ hiprintTemplate.on('printSuccess', function (data) { hiprintTemplate.on('printError', function (data) { console.log('打印失败') }) +``` +> 大量单据连续打印 +```javascript +hiprintTemplate.print2(printDataList, { + printer: '打印机名称', + title: '打印标题', + printByFragments: true, // 是否需要分批打印,分批打印能够支持连续打印大量数据,但会增加打印所需时间 + generateHTMLInterval: 30, // 多条数据生成HTML的间隔,单位ms,默认是10 + fragmentSize: 10000, // 分片字符长度,默认50000 + sendInterval: 20, // 分片传输间隔,单位ms,默认10 +}) + ``` > 打印重叠 / 样式问题 ```javascript diff --git a/src/demo/design/index.vue b/src/demo/design/index.vue index 67936ca2..105952a4 100644 --- a/src/demo/design/index.vue +++ b/src/demo/design/index.vue @@ -43,6 +43,9 @@ 直接打印 + + 分批直接打印 + Api单独打印 @@ -889,31 +892,52 @@ export default { }); }, print() { - if (window.hiwebSocket.opened) { + this.doOperationWhenClientConnected(() => { const printerList = hiprintTemplate.getPrinterList(); console.log(printerList) hiprintTemplate.print2(printData, {printer: '', title: 'hiprint测试打印'}); + }) + }, + printByFragments() { + this.doOperationWhenClientConnected(() => { + const dataList = new Array(50).fill(printData) + // 原有方法打印不成功,原因是获取HTML的方法处理时间过长,导致超过socket心跳间隔 + // hiprintTemplate.print2(dataList, {printer: '', title: 'hiprint测试打印'}); + hiprintTemplate.print2(dataList, { + printer: '', + title: 'hiprint测试打印', + printByFragments: true, // 是否需要分批打印,分批打印能够支持连续打印大量数据,但会增加打印所需时间 + // generateHTMLInterval: 30, // 多条数据生成HTML的间隔,单位ms,默认是10 + // fragmentSize: 10000, // 分片字符长度,默认50000 + // sendInterval: 20, // 分片传输间隔,单位ms,默认10 + // type: 'pdf', + }); + }) + }, + doOperationWhenClientConnected(operation) { + if (window.hiwebSocket.opened) { + operation?.() return } this.$error({ title: "客户端未连接", content: (h) => ( -
- 连接【{hiwebSocket.host}】失败! -
- 请确保目标服务器已 - - 下载 - - 并 - - 运行 - - 打印服务! -
+
+ 连接【{hiwebSocket.host}】失败! +
+ 请确保目标服务器已 + + 下载 + + 并 + + 运行 + + 打印服务! +
), }); }, diff --git a/src/hiprint/hiprint.bundle.js b/src/hiprint/hiprint.bundle.js index 58195c29..cbab12fb 100644 --- a/src/hiprint/hiprint.bundle.js +++ b/src/hiprint/hiprint.bundle.js @@ -7717,6 +7717,39 @@ var hiprint = function (t) { console.log("send data error:" + (t || "") + JSON.stringify(e)); } }, + sendByFragments: function(content) { + try { + const { + fragmentSize = 50000, // 单片字符长度 + sendInterval = 10, // 分批传输间隔 + html, + generateHTMLInterval, // 不需要传给client,取出字段 + printByFragments, // 不需要传给client,取出字段 + ...otherFields + } = content + const contentToSplit = content.html + // 字符总数 + const charsCount = contentToSplit.length + // 片段总数 + const fragmentsCount = Math.ceil(charsCount / fragmentSize) + Array.apply(undefined, { length: fragmentsCount }).forEach((item, index) => { + const startIndex = index * fragmentSize + // 字符结束索引 + const endIndex = index + 1 === fragmentSize ? charsCount : (index + 1) * fragmentSize + // socket分段发送内容 + setTimeout(() => { + this.socket.emit('printByFragments', { + ...otherFields, + index, + total: fragmentsCount, + htmlFragment: html.slice(startIndex, endIndex) + }); + }, sendInterval * index); + }) + } catch (e) { + console.log("send data fragment error:" + (content || "") + JSON.stringify(e)); + } + }, getPrinterList: function getPrinterList() { return this.printerList; }, @@ -10549,8 +10582,43 @@ var hiprint = function (t) { } }); return e && e.imgToBase64 && this.transformImg(i.find("img")), i; + }, t.prototype.getSimpleHtmlAsync = function (dataItemOrList, e) { + return new Promise(resolve => { + var that = this; + e || (e = {}); + let rootElement = $('
'); + // 将数据转换成列表处理,简化代码 + const dataList = Array.isArray(dataItemOrList) ? dataItemOrList : [dataItemOrList] + // 生成参数列表,用于后续递归 + const paramsListToCreateHTML = [] + dataList.forEach(function (data, dataIndex) { + data && that.printPanels.forEach(function (panel, o) { + paramsListToCreateHTML.push([panel, data, e]) + }); + }); + + function appendElementByParamsList(paramsListToCreateHTML, onFinish) { + if (!paramsListToCreateHTML.length) return onFinish(); + const [panel, data, e] = paramsListToCreateHTML.shift(); + rootElement.append(panel.getHtml(data, e)); + // 每次生成Html之间留一些间隔,默认10,通过generateHTMLInterval字段控制 + console.log('e.generateHTMLInterval', e.generateHTMLInterval) + setTimeout(() => appendElementByParamsList(paramsListToCreateHTML, onFinish), e.generateHTMLInterval ?? 10) + } + + function onFinish() { + delete hinnn._paperList; + e && e.imgToBase64 && that.transformImg(rootElement.find("img")); + resolve(rootElement) + } + + appendElementByParamsList(paramsListToCreateHTML, onFinish); + }); }, t.prototype.getHtml = function (t, e) { return t || (t = {}), this.getSimpleHtml(t, e); + }, t.prototype.getHtmlAsync = function (t, e) { + // 分解生成HTML任务,留下空隙发送socket信息,避免断开连接 + return t || (t = {}), this.getSimpleHtmlAsync(t, e); }, t.prototype.getJointHtml = function (t, e, n) { var i = $('
'), o = []; @@ -10674,8 +10742,18 @@ var hiprint = function (t) { e || (e = {}); var i = $.extend({}, n || {}); i.imgToBase64 = !0; - var o = t + this.getHtml(e, i)[0].outerHTML; - i.id = s.a.instance.guid(), i.html = o, i.templateId = this.id, hiwebSocket.send(i); + if (i.printByFragments) { + // 分批打印 + this.getHtmlAsync(e, i) + .then(rootElement => { + var o = t + rootElement[0].outerHTML; + i.id = s.a.instance.guid(), i.html = o, i.templateId = this.id, hiwebSocket.sendByFragments(i, n); + }) + } else { + // 同步打印 + var o = t + this.getHtml(e, i)[0].outerHTML; + i.id = s.a.instance.guid(), i.html = o, i.templateId = this.id, hiwebSocket.send(i); + } }, t.prototype.printByHtml = function (t) { $(t).hiwprint(); }, t.prototype.printByHtml2 = function (t, e) { From ca05addfc63cae60b62bf8e1c7855a58faaa2cf1 Mon Sep 17 00:00:00 2001 From: Xavier Date: Sat, 10 Aug 2024 03:30:46 +0800 Subject: [PATCH 05/59] =?UTF-8?q?feat:=20socket=20=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E4=BA=8B=E4=BB=B6=E7=BB=9F=E4=B8=80=E4=B8=BA?= =?UTF-8?q?=20success?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hiprint/hiprint.bundle.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hiprint/hiprint.bundle.js b/src/hiprint/hiprint.bundle.js index cbab12fb..f1bcebe6 100644 --- a/src/hiprint/hiprint.bundle.js +++ b/src/hiprint/hiprint.bundle.js @@ -7824,7 +7824,8 @@ var hiprint = function (t) { token: this.token } }), this.socket.on("connect", function (e) { - t.opened = !0, console.log("Websocket opened."), _this.socket.on("successs", function (t) { + t.opened = !0, console.log("Websocket opened."), + _this.socket.on("success", function (t) { hinnn.event.trigger("printSuccess_" + t.templateId, t); }), _this.socket.on("error", function (t) { hinnn.event.trigger("printError_" + t.templateId, t); From 69e47965ad0691f1093ea937ccc06e74db1913cc Mon Sep 17 00:00:00 2001 From: Xavier Date: Sat, 10 Aug 2024 03:31:10 +0800 Subject: [PATCH 06/59] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=20readme=20?= =?UTF-8?q?=E5=92=8C=20changelog=20=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 34 +++++++++++++++++++++++++++++++++- README.md | 43 ++++++++++++++++++++++++------------------- 2 files changed, 57 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85c57409..46f1c41f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,11 +4,42 @@ ### 💐 同时自动更新 GitHub Pages 同步 Gitee; ### 💐 感谢各位贡献者的支持。 🔥 +## 0.0.57-beta28(2024-08-10) +**⚠️⚠️⚠️ 有限的破坏性更新 Breaking changes** +
+ 01. 🌈 新增支持 print2支持分批打印(需客户端 v1.0.11) + + 支持单模版大单据量连续打印 @george-hong ([#138](https://github.com/CcSimple/vue-plugin-hiprint/pull/138)) + ```js + hiprintTemplate.print2(printDataList, { + printer: '打印机名称', + title: '打印标题', + printByFragments: true, // 是否需要分批打印,分批打印能够支持连续打印大量数据,但会增加打印所需时间 + generateHTMLInterval: 30, // 多条数据生成HTML的间隔,单位ms,默认10 + fragmentSize: 10000, // 分片字符长度,默认50000 + sendInterval: 20, // 分片传输间隔,单位ms,默认10 + }) + ``` +
+ +
+ 02. ⚠️ 修改 print2 打印成功回调事件为 success + + 项目初始时 print2 打印成功回调事件即为 `successs` 事件 (手抖多打了个 s),electron-hiprint v1.0.8 重构关键代码时发现了该问题,为了标准及向下兼容,同时保留了 `succsss` 和 `success` 事件,经过 8 个多月的过渡期,现统一改为 `success` ,该改动仅对 electron-hiprint 1.0.7 及以前的客户端版本造成破坏性更新,后续版本无影响,我们也推荐大家及时更新至 1.0.11 以后的版本,体验更多优秀的功能。 +
+ +## 0.0.57-beta27(2024-07-30) +
+ 01. 🐛️ fix 表格字段为图片,单元格高度无效修复 + + 表格里面当字段类型为图片时,单元格高度设置无效 BUG 修复,并设置最小高度避免表单高度计算失败 @zhmlsj ([#131](https://github.com/CcSimple/vue-plugin-hiprint/pull/131)) +
+ ## 0.0.57-beta26(2024-07-11)
01. ✨ 调整优化 水印 打印无需在浏览器预览勾选背景图案 - 需要支持 [-webkit-print-color-adjust](https://caniuse.com/?search=-webkit-print-color-adjust) 样式 + 需要支持 [-webkit-print-color-adjust](https://caniuse.com/?search=-webkit-print-color-adjust) 样式 @Xavier ([#129](https://github.com/CcSimple/vue-plugin-hiprint/pull/129))
## 0.0.57-beta25(2024-07-10) @@ -22,6 +53,7 @@
01. 🌈 新增支持 添加 selectElementsByField 属性,通过传入field的字符串数组选中文本类型的元素 +@xiaolonggee ([#123](https://github.com/CcSimple/vue-plugin-hiprint/pull/123)) ```js hiprintTemplate.selectElementsByField(['name']) ``` diff --git a/README.md b/README.md index 83a80721..a1e32465 100644 --- a/README.md +++ b/README.md @@ -23,11 +23,13 @@ ## 关于此插件 -vue-plugin-hiprint(基于[hiprint 2.5.4](http://hiprint.io/)) 当时只是为了方便我(并非hiprint原作者) 在vue项目中引入使用,所以以此命名。 +vue-plugin-hiprint (基于 [hiprint 2.5.4](http://hiprint.io/)) 当时只是为了方便 我(并非hiprint原作者) 在vue项目中引入使用,所以以此命名。 -此插件仅仅是一个JavaScript【工具库】而非 Vue【组件库】,所以它默认是不包含demo中所见的那些组件页面的(demo代码随便复制修改拿去用)。 +此 插件 仅仅是一个 JavaScript【工具库】 而非 Vue【组件库】,所以它默认不包含demo中的那些组件页面(demo代码可复制使用)。 -由于hiprint官网最后一次更新时间为2019年【hiprint 2.5.4 是 [LGPL](#关于lgpl协议) 协议】,后在诸多使用者及反馈下进行了许多优化调整。[更新日志](CHANGELOG.md)(同时感谢各位群友支持和参与) +由于hiprint官网最后一次更新时间为2019年【hiprint 2.5.4 是 [LGPL](#关于lgpl协议) 协议】,后在诸多使用者及反馈下进行了许多优化调整。 + +[更新日志](CHANGELOG.md)(感谢各位群友支持和参与) ## vue-plugin-hiprint [更新日志](CHANGELOG.md) > hiprint for Vue2.x / Vue3.x (基于jQuery, 理论上应该也是支持其他框架的) @@ -49,7 +51,7 @@ vue-plugin-hiprint(基于[hiprint 2.5.4](http://hiprint.io/)) 当时只是为了 Demo预览:[https://ccsimple.gitee.io/vue-plugin-hiprint/](https://ccsimple.gitee.io/vue-plugin-hiprint/)(已挂,恢复看gitee官方情况) -Github Demo预览:[https://ccsimple.github.io/vue-plugin-hiprint/](https://ccsimple.github.io/vue-plugin-hiprint/)(慢,请墙) +Github Demo预览:[https://ccsimple.github.io/vue-plugin-hiprint/](https://ccsimple.github.io/vue-plugin-hiprint/)(慢,需翻墙) 更新记录:[npm包版本及更新记录](CHANGELOG.md) @@ -91,7 +93,9 @@ npm install vue-plugin-hiprint ``` ```html - + + + @@ -199,7 +203,7 @@ panel.addPrintLongText({ options: { width: 180, height: 35, top: 90, left: 20, t hiprintTemplate.print({}); ``` -## i18n 设置 +## i18n 设置 ⬆️ 0.0.55-beta8 原生为简体中文,英语、德语、西班牙语、法语、意大利语、日语、俄语、繁体中文皆为 AI 机翻,欢迎帮助 [订正](https://github.com/CcSimple/vue-plugin-hiprint/tree/main/src/i18n)。 @@ -360,8 +364,8 @@ this.$error({ import { hiprint } from 'vue-plugin-hiprint' hiprint.init({ - host: 'https://printjs.cn:17521/', // 此处输入服务启动后的地址 - token: 'vue-plugin-hiprint', // 用于鉴权的token + host: 'https://v4.printjs.cn:17521/', // 此处输入服务启动后的地址 + token: 'hiprint-17521', // 用于鉴权的token,hiprint* (*可替换为[0-9a-zA-Z\-_]字符) }); // or @@ -436,22 +440,23 @@ hiprintTemplate.on('printError', function (data) { console.log('打印失败') }) ``` -> 大量单据连续打印 +> 大量单据连续打印 ⬆️ v0.0.57-beta28 ```javascript hiprintTemplate.print2(printDataList, { printer: '打印机名称', - title: '打印标题', - printByFragments: true, // 是否需要分批打印,分批打印能够支持连续打印大量数据,但会增加打印所需时间 - generateHTMLInterval: 30, // 多条数据生成HTML的间隔,单位ms,默认是10 - fragmentSize: 10000, // 分片字符长度,默认50000 - sendInterval: 20, // 分片传输间隔,单位ms,默认10 + title: '打印标题', + printByFragments: true, // 是否需要分批打印,分批打印能够支持连续打印大量数据,但会增加打印所需时间 + generateHTMLInterval: 30, // 多条数据生成HTML的间隔,单位ms,默认是10 + fragmentSize: 10000, // 分片字符长度,默认50000 + sendInterval: 20, // 分片传输间隔,单位ms,默认10 }) - ``` -> 打印重叠 / 样式问题 +> 打印重叠 / 样式问题 ⬆️ v0.0.19 ```javascript /** - * 从 0.0.19 起, 在index.html添加: + * 从 在index.html添加: + * + * 或者 * * 以处理打印所需css, 当然你也可以自行处理 * 比如: index.html目录下放一个print-lock.css, 然后在index.html添加: @@ -481,9 +486,9 @@ hiprintTemplate.print2(this.printData, { } }) ``` -> 修改默认配置 / 显示/隐藏元素设置参数 +> 修改默认配置 / 显示/隐藏元素设置参数 ⬆️ v0.0.13 ```javascript -// 0.0.13, 新增setConfig方法 +// 新增setConfig方法 // 还原配置 hiprint.setConfig() // 替换配置 From c30747868e832a4472d95f7937e24c6eee628a17 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <840054486@qq.com> Date: Fri, 9 Aug 2024 19:33:36 +0000 Subject: [PATCH 07/59] pub-beta 0.0.57-beta28 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0bcaea73..fe28121e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vue-plugin-hiprint", "description": "hiprint for Vue2.x / Vue3.x 支持拖拽(分页(不分页)、表头表脚、样式设置、复制粘贴、缩放、撤销重做)生成打印模板、导出json模板数据、静默打印/获取MAC地址(借助客户端)", - "version": "0.0.57-beta27", + "version": "0.0.57-beta28", "author": "CcSimple", "license": "MIT", "main": "dist/vue-plugin-hiprint.js", From 39a91a13552198d6cfb6954f5e09a203ae123c23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E9=91=AB?= Date: Tue, 13 Aug 2024 09:02:51 +0800 Subject: [PATCH 08/59] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=A8=A1?= =?UTF-8?q?=E7=89=88=208?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/static/template8.png | Bin 0 -> 113007 bytes .../templates/template-files/template8.js | 290 ++++++++++++++++++ 2 files changed, 290 insertions(+) create mode 100644 public/static/template8.png create mode 100644 src/demo/templates/template-files/template8.js diff --git a/public/static/template8.png b/public/static/template8.png new file mode 100644 index 0000000000000000000000000000000000000000..faab15782c75dd583ebdd183f95eca8bfc8e711c GIT binary patch literal 113007 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�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 +.font0 + {color:#000000; + font-size:11.0pt; + font-family:宋体; + font-weight:400; + font-style:normal; + text-decoration:none;} +.font1 + {color:#000000; + font-size:20.0pt; + font-family:宋体; + font-weight:400; + font-style:normal; + text-decoration:none;} +br + {mso-data-placement:same-cell;} +td + {padding-top:1px; + padding-left:1px; + padding-right:1px; + mso-ignore:padding; + color:#000000; + font-size:11.0pt; + font-weight:400; + font-style:normal; + text-decoration:none; + mso-generic-font-family:auto; + mso-font-charset:134; + mso-number-format:General; + border:none; + mso-background-source:auto; + mso-pattern:auto; + text-align:general; + vertical-align:middle; + mso-rotate:0; + mso-protection:locked visible; + line-break: anywhere; + width: 120px;} +.et2 + {mso-generic-font-family:auto; + mso-font-charset:134; + text-align:center;} +.et3 + {font-size:20.0pt; + mso-generic-font-family:auto; + mso-font-charset:134; + text-align:center;} +.et5 + {mso-generic-font-family:auto; + mso-font-charset:134; + text-align:left;} +.et6 + {mso-generic-font-family:auto; + mso-font-charset:134; + border:.5pt solid #000000; + text-align:center;} +.et7 + {mso-generic-font-family:auto; + mso-font-charset:134; + border:.5pt solid #000000; + text-align:left;} +.et8 + {mso-generic-font-family:auto; + mso-font-charset:134; + border-top:.5pt solid #000000; + border-right:.5pt solid #000000; + border-bottom:none; + border-left:.5pt solid #000000; + text-align:center;} +.et9 + {mso-generic-font-family:auto; + mso-font-charset:134; + border-top:none; + border-right:.5pt solid #000000; + border-bottom:none; + border-left:.5pt solid #000000; + text-align:center;} +.et10 + {mso-generic-font-family:auto; + mso-font-charset:134; + border-top:none; + border-right:.5pt solid #000000; + border-bottom:.5pt solid #000000; + border-left:.5pt solid #000000; + text-align:center;} +.et11 + {mso-generic-font-family:auto; + mso-font-charset:134; + border-top:.5pt solid #000000; + border-right:none; + border-bottom:.5pt solid #000000; + border-left:.5pt solid #000000; + text-align:left;} +.et12 + {mso-generic-font-family:auto; + mso-font-charset:134; + border-top:.5pt solid #000000; + border-right:none; + border-bottom:.5pt solid #000000; + border-left:none; + text-align:left;} +.et13 + {mso-generic-font-family:auto; + mso-font-charset:134; + border-top:.5pt solid #000000; + border-right:.5pt solid #000000; + border-bottom:.5pt solid #000000; + border-left:none; + text-align:left;} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
入职信息登记表
入职部门:\\\${d.department}入职岗位:\\\${d.position}填表时间:\\\${d.form_date}
姓名\\\${d.pInfo.name}性别\\\${d.pInfo.gender}出生年月\\\${d.pInfo.birth_date}贴照片处
籍贯\\\${d.pInfo.place_of_birth}民族\\\${d.pInfo.ethnicity}政治面貌\\\${d.pInfo.political_affiliation}
文化程度\\\${d.pInfo.education_level}专业\\\${d.pInfo.major}毕业时间\\\${d.pInfo.graduation_year}
身高\\\${d.pInfo.height}体重\\\${d.pInfo.weight}血型\\\${d.pInfo.blood_type}
家庭住址\\\${d.pInfo.address}
联系电话\\\${d.pInfo.phone}电子邮箱\\\${d.pInfo.email}
期望薪资\\\${d.pInfo.expected_salary}到岗时间\\\${d.pInfo.availability}
语言能力普通话\\\${d.pInfo.mandarin_level}外语\\\${d.pInfo.foreign_language_level}
其他
\` + +// ! 这里的处理很关键 +if (d) { + return html.replace(/\\$\{(\\S+)\}/g, (match, key) => { + return eval(key); + }); +} else { + return html; +} +// ! 这里的处理很关键 + }`, + }, + printElementType: { title: "html", type: "html" }, + }, + { + options: { + left: 12, + top: 460, + height: 45, + width: 566, + title: + "说明:此处模版使用 HTML 元素生成动态表格,方便实现自定义表格,减少拖拽生成表格的繁琐操作,你可以使用 www.lingdaima.com/table 对 EXCEL 进行转换,转换前既可在 excel 中预填字段 ${prop},模板 EXCEL: https://docs.qq.com/document/DUlFUYVh5aWVHVWZX", + }, + printElementType: { title: "说明", type: "longText" }, + }, + { + options: { + left: 12, + top: 505, + height: 24, + width: 566, + color: "#FF0000", + title: + "注意:www.lingdaima.com/table 提供的转换服务会一直转圈,但你仍可从 f12 网络面板中获取到转换后的 html 代码,你需要对转换后的 td 样式进行修改,并且需要转义 模版字符串 \\\\\\\${} 否知你将无法实现该 demo 效果!", + }, + printElementType: { title: "注意", type: "longText" }, + }, + ], + paperNumberLeft: 565.5, + paperNumberTop: 819, + paperNumberContinue: true, + watermarkOptions: {}, + }, + ], +}; +export default { + preview: preview, + name: name, + desc: desc, + author: author, + link: link, + printData: printData, + json: json, +}; From 456fd0933f1c8df5fce0a9220d4eaf5c80b48717 Mon Sep 17 00:00:00 2001 From: Canim <840054486@qq.com> Date: Mon, 19 Aug 2024 23:23:04 +0800 Subject: [PATCH 09/59] =?UTF-8?q?fixup=20setConfig=20API=20&=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E9=9A=90=E8=97=8F=E5=85=A8=E9=83=A8/=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=8F=82=E6=95=B0=E5=88=86=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hiprint/hiprint.bundle.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/hiprint/hiprint.bundle.js b/src/hiprint/hiprint.bundle.js index f1bcebe6..eaf6b989 100644 --- a/src/hiprint/hiprint.bundle.js +++ b/src/hiprint/hiprint.bundle.js @@ -10297,7 +10297,7 @@ var hiprint = function (t) { var r; if (tabs.length) { r = $('
    '); - tabs.filter((e) => e.list.length > 0).forEach(function (tab) { + tabs.filter((e,idx) => e.list.length > 0 || (idx == 2 && o && o.length)).forEach(function (tab) { var item = $('
  • ' + i18n.__(tab.name) + '
  • ') r.find('.prop-tab-items').append(item) var options = $('
    ') @@ -11163,6 +11163,10 @@ var hiprint = function (t) { } function cig(t) { + if (hiprint._config == void 0) { + hiprint._config = JSON.stringify(window.HIPRINT_CONFIG); + } + const oldConfig = JSON.parse(hiprint._config); if (t) { t && Object.keys(t).forEach(function (i) { if (i == "optionItems" && t.optionItems && t.optionItems.length) { @@ -11173,7 +11177,7 @@ var hiprint = function (t) { if (tab.replace) { $.extend(p.a.instance[i].tabs[idx], tab); } else { - var options = tab.options || [], list = p.a.instance[i].tabs[idx].options; + var options = tab.options || [], list = oldConfig[i].tabs[idx].options; options && options.forEach(function (o) { var idx = list.findIndex(function (e) { return e.name == o.name @@ -11197,7 +11201,7 @@ var hiprint = function (t) { delete t[i].tabs; } else if (t[i].supportOptions && t[i].supportOptions.length) { - var options = t[i].supportOptions, list = p.a.instance[i].supportOptions; + var options = t[i].supportOptions, list = oldConfig[i].supportOptions; options.forEach(function (o) { var idx = list.findIndex(function (e) { return e.name == o.name @@ -11218,13 +11222,13 @@ var hiprint = function (t) { var keyMap = {}; keyMap[i] = t[i]; if (t[i].tabs && t[i].tabs.length == 0) { - keyMap[i].supportOptions = p.a.instance[i].supportOptions; + keyMap[i].supportOptions = oldConfig[i].supportOptions; } $.extend(p.a.instance, keyMap); } }); } else { - $.extend(p.a.instance, HIPRINT_CONFIG); + $.extend(p.a.instance, JSON.parse(hiprint._config)); } } From f052817f4d0fe9806a78298ea67f1ae978d108d7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <840054486@qq.com> Date: Mon, 19 Aug 2024 15:24:49 +0000 Subject: [PATCH 10/59] pub-beta 0.0.57-beta29 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fe28121e..eff12bfc 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vue-plugin-hiprint", "description": "hiprint for Vue2.x / Vue3.x 支持拖拽(分页(不分页)、表头表脚、样式设置、复制粘贴、缩放、撤销重做)生成打印模板、导出json模板数据、静默打印/获取MAC地址(借助客户端)", - "version": "0.0.57-beta28", + "version": "0.0.57-beta29", "author": "CcSimple", "license": "MIT", "main": "dist/vue-plugin-hiprint.js", From 842d4fd8d72daa344562173fe94872101e379d96 Mon Sep 17 00:00:00 2001 From: Canim <840054486@qq.com> Date: Mon, 26 Aug 2024 16:31:43 +0800 Subject: [PATCH 11/59] =?UTF-8?q?fix=20=E7=BC=A9=E6=94=BE=E5=90=8E=20?= =?UTF-8?q?=E8=A1=A8=E6=A0=BC=E5=88=97=E6=8B=96=E6=8B=BD=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E5=81=8F=E7=A7=BB=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hiprint/hiprint.bundle.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hiprint/hiprint.bundle.js b/src/hiprint/hiprint.bundle.js index eaf6b989..1d4e4869 100644 --- a/src/hiprint/hiprint.bundle.js +++ b/src/hiprint/hiprint.bundle.js @@ -6224,8 +6224,9 @@ var hiprint = function (t) { }), this.target.before(i), this.rgripContariner = new d(i, n), this.syncRowGrips(); }, t.prototype.syncGrips = function (t, e) { var n = t.getTarget(); + var scale = ($('.hiprint-printPaper')[0].style.transform && parseFloat($('.hiprint-printPaper')[0].style.transform.slice(6, -1))) || 1; e.cell = t, e.target.css({ - left: n.offset().left - this.target.offset().left + n.outerWidth(!1), + left: (n.offset().left / scale) - (this.target.offset().left / scale) + n.outerWidth(!1), height: 30 }); }, t.prototype.syncRowGrips = function () { From 0b1c4ba8d44f780cbd896146b354989f9f88075f Mon Sep 17 00:00:00 2001 From: Canim <840054486@qq.com> Date: Fri, 30 Aug 2024 10:30:25 +0800 Subject: [PATCH 12/59] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BC=98=E5=8C=96=20up?= =?UTF-8?q?date=20=E6=9B=B4=E6=96=B0=E6=A8=A1=E6=9D=BF=E6=97=B6=20?= =?UTF-8?q?=E5=B0=BA=E5=AF=B8=E8=B7=9F=E7=9D=80=E6=94=B9=E5=8F=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hiprint/hiprint.bundle.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/hiprint/hiprint.bundle.js b/src/hiprint/hiprint.bundle.js index 1d4e4869..705de749 100644 --- a/src/hiprint/hiprint.bundle.js +++ b/src/hiprint/hiprint.bundle.js @@ -9706,6 +9706,14 @@ var hiprint = function (t) { this.oddPaperFooter = t.oddPaperFooter, this.lastPaperFooter = t.lastPaperFooter, this.topOffset = t.topOffset, this.leftOffset = t.leftOffset; this.designPaper.setFooter(this.firstPaperFooter, this.evenPaperFooter, this.oddPaperFooter, this.lastPaperFooter), this.designPaper.setOffset(this.leftOffset, this.topOffset); + // 宽高 + this.target.css("width", t.width + "mm"), + this.target.css("height", t.height - p.a.instance.paperHeightTrim + "mm"), + this.target.attr("original-height", t.height), + this.target.parent().css("width", t.width + "mm"), + this.target.parent().css("height", t.height - p.a.instance.paperHeightTrim + "mm"), + this.designPaper.target.css("width", t.width + "mm"), + this.designPaper.target.css("height", t.height - p.a.instance.paperHeightTrim + "mm"); var end = Date.now(); console.log('更新参数 end', end) console.log('更新参数 time:', end - start) From 6c2b018a90199b52558b20b806feb3f49ca07aa3 Mon Sep 17 00:00:00 2001 From: Canim <840054486@qq.com> Date: Fri, 30 Aug 2024 11:15:55 +0800 Subject: [PATCH 13/59] =?UTF-8?q?fix=20=E8=87=AA=E5=8A=A8=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E5=AE=A2=E6=88=B7=E7=AB=AF=20=E6=8E=88=E6=9D=83?= =?UTF-8?q?=E9=94=99=E8=AF=AFbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hiprint/hiprint.bundle.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hiprint/hiprint.bundle.js b/src/hiprint/hiprint.bundle.js index 705de749..82a25344 100644 --- a/src/hiprint/hiprint.bundle.js +++ b/src/hiprint/hiprint.bundle.js @@ -7701,7 +7701,7 @@ var hiprint = function (t) { opened: !1, name: "webSockets", host: "http://localhost:17521/", - token: null, + token: 'vue-plugin-hiprint', reconnectTimeout: 6e4, reconnectWindowSetTimeout: null, reconnectDelay: 2e3, From 5a0609b7bfecc0c7686feccd23e41e4bded10527 Mon Sep 17 00:00:00 2001 From: Canim <840054486@qq.com> Date: Fri, 30 Aug 2024 11:20:37 +0800 Subject: [PATCH 14/59] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BC=98=E5=8C=96=20?= =?UTF-8?q?=E9=9D=99=E9=BB=98=E6=89=93=E5=8D=B0=20=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E4=B8=8D=E8=BD=AC=20base64?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hiprint/hiprint.bundle.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/hiprint/hiprint.bundle.js b/src/hiprint/hiprint.bundle.js index 82a25344..f66a6331 100644 --- a/src/hiprint/hiprint.bundle.js +++ b/src/hiprint/hiprint.bundle.js @@ -10751,7 +10751,7 @@ var hiprint = function (t) { }, t.prototype.sentToClient = function (t, e, n) { e || (e = {}); var i = $.extend({}, n || {}); - i.imgToBase64 = !0; + i.imgToBase64 = i.imgToBase64 ?? false; if (i.printByFragments) { // 分批打印 this.getHtmlAsync(e, i) @@ -11141,7 +11141,8 @@ var hiprint = function (t) { } function ft(t, e, n) { - $.extend({}, t || {}).imgToBase64 = !0; + $.extend({}, t || {}); + t.imgToBase64 = t.imgToBase64 ?? false; var i = new ct({}); i.on("printSuccess", e), i.on("printError", n), i.printByHtml2(this.getHtml(t), t.options); } @@ -11150,7 +11151,7 @@ var hiprint = function (t) { var e = void 0; return t && t.templates.forEach(function (n, i) { var o = $.extend({}, n.options || {}); - t.imgToBase64 && (o.imgToBase64 = !0), e ? e.append(n.template.getHtml(n.data, o).html()) : e = n.template.getHtml(n.data, o); + t.imgToBase64 && (o.imgToBase64 = o.imgToBase64 ?? false), e ? e.append(n.template.getHtml(n.data, o).html()) : e = n.template.getHtml(n.data, o); }), e; } From c9856412fcea8067cf6cbeca6e56ea800949a4cc Mon Sep 17 00:00:00 2001 From: Canim <840054486@qq.com> Date: Fri, 30 Aug 2024 13:12:20 +0800 Subject: [PATCH 15/59] =?UTF-8?q?=E8=B0=83=E6=95=B4=20=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E6=8B=96=E6=8B=BD=E8=AE=BE=E8=AE=A1=20=E6=A8=A1=E6=9D=BFjson?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/demo/design/panel.js | 1042 ++++++++++++++++++++++++++------------ 1 file changed, 730 insertions(+), 312 deletions(-) diff --git a/src/demo/design/panel.js b/src/demo/design/panel.js index 352d55dc..ffd8ad5d 100644 --- a/src/demo/design/panel.js +++ b/src/demo/design/panel.js @@ -1,313 +1,731 @@ export default { - "panels": [{ - "index": 0, - "height": 297, - "width": 210, - "paperHeader": 49.5, - "paperFooter": 780, - "watermarkOptions": { - "content": "vue-plugin-hiprint", - "rotate": 25, - "timestamp": true, - "format": "YYYY-MM-DD HH:mm" - }, - "printElements": [{ - "options": { - "left": 175.5, - "top": 10.5, - "height": 27, - "width": 259, - "title": "HiPrint自定义模块打印插件", - "fontSize": 19, - "fontWeight": "600", - "textAlign": "center", - "lineHeight": 26, - "coordinateSync": true, - "widthHeightSync": true, - "draggable": false, - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": {"left": 60, "top": 27, "height": 13, "width": 52, "title": "页眉线", "textAlign": "center"}, - "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": {"left": 25.5, "top": 57, "height": 705, "width": 9, "fixed": true, "borderStyle": "dotted"}, - "printElementType": {"type": "vline"} - }, { - "options": {"left": 60, "top": 61.5, "height": 48, "width": 87, "src": "", "fit": "contain"}, - "printElementType": {"title": "图片", "type": "image"} - }, { - "options": { - "left": 153, - "top": 64.5, - "height": 39, - "width": 276, - "title": "二维码以及条形码均采用svg格式打印。不同打印机打印不会造成失真。图片打印:不同DPI打印可能会导致失真,", - "fontFamily": "微软雅黑", - "textAlign": "center", - "lineHeight": 18 - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 457.5, - "top": 79.5, - "height": 13, - "width": 120, - "title": "姓名", - "field": "name", - "testData": "古力娜扎", - "color": "#f00808", - "textDecoration": "underline", - "textAlign": "center", - "fields": [{"text":'id',"field":'id'},{"text":'姓名',"field":'name'},{"text":'性别',"field":'gender'},{"text":'数量',"field":'count'}], - }, "printElementType": {"title": "文本", "type": "text"} - }, { - "options": { - "left": 483, - "top": 115, - "height": 60, - "width": 60, - "title": "123456789", - "textAlign": "center", - "textType": "qrcode" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 285, - "top": 125, - "height": 40, - "width": 175, - "title": "123456789", - "fontFamily": "微软雅黑", - "textAlign": "center", - "textType": "barcode" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 60, - "top": 110, - "height": 19, - "width": 213, - "title": "所有打印元素都可已拖拽的方式来改变元素大小", - "fontFamily": "微软雅黑", - "textAlign": "center", - "lineHeight": 18 - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 153, - "top": 189, - "height": 13, - "width": 238, - "title": "单击元素,右侧可自定义元素属性", - "textAlign": "center", - "fontFamily": "微软雅黑" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": {"left": 60, "top": 190.5, "height": 13, "width": 51, "title": "横线", "textAlign": "center"}, - "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 415.5, - "top": 190.5, - "height": 13, - "width": 164, - "title": "可以配置各属性的默认值", - "textAlign": "center", - "fontFamily": "微软雅黑" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": {"left": 60, "top": 214.5, "height": 10, "width": 475.5}, - "printElementType": {"title": "横线", "type": "hline"} - }, { - "options": { - "left": 235.5, - "top": 220.5, - "height": 32, - "width": 342, - "title": "自定义表格:用户可左键选中表头,右键查看可操作项,操作类似Excel,双击表头单元格可进行编辑。内容:title#field", - "fontFamily": "微软雅黑", - "textAlign": "center", - "lineHeight": 15 - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 156, - "top": 265.5, - "height": 13, - "width": 94, - "title": "表头列大小可拖动", - "fontFamily": "微软雅黑", - "textAlign": "center" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 60, - "top": 265.5, - "height": 13, - "width": 90, - "title": "红色区域可拖动", - "fontFamily": "微软雅黑", - "textAlign": "center" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 60, - "top": 285, - "height": 56, - "width": 511.5, - "field": "table", - "tableFooterRepeat": "", - "tableBorder": "noBorder", - "tableHeaderBorder": "topBorder", - "tableHeaderCellBorder": "border", - "tableBodyRowBorder": "topBorder", - "tableFooterBorder": "topBorder", - "fields": [{"text":'id',"field":'id'},{"text":'姓名',"field":'name'},{"text":'性别',"field":'gender'},{"text":'数量',"field":'count'}], - "columns": [[{"width": 85.25, "colspan": 1, "rowspan": 1, "checked": true}, { - "title": "性别", - "field": "gender", - "width": 85.25, - "colspan": 1, - "rowspan": 1, - "checked": false - }, { - "title": "姓名", - "field": "name", - "width": 85.25, - "align": "center", - "colspan": 1, - "rowspan": 1, - "checked": true, - "tableSummary": "count" - }, { - "title": "数量", - "field": "count", - "width": 85.25, - "align": "center", - "colspan": 1, - "rowspan": 1, - "checked": true, - "tableSummary": "sum" - }, { - "width": 85.25, - "colspan": 1, - "rowspan": 1, - "checked": true - }, {"width": 85.25, "colspan": 1, "rowspan": 1, "checked": true}]] - }, "printElementType": { - "title": "表格", "type": "table", - // editable: true, - // columnDisplayEditable: true,//列显示是否能编辑 - // columnDisplayIndexEditable: true,//列顺序显示是否能编辑 - // columnTitleEditable: true,//列标题是否能编辑 - // columnResizable: true, //列宽是否能调整 - // columnAlignEditable: true,//列对齐是否调整 - // isEnableEditField: true, //编辑字段 - // isEnableContextMenu: true, //开启右键菜单 默认true - // isEnableInsertRow: true, //插入行 - // isEnableDeleteRow: true, //删除行 - // isEnableInsertColumn: true, //插入列 - // isEnableDeleteColumn: true, //删除列 - // isEnableMergeCell: true, //合并单元格 - } - }, { - "options": { - "left": 21, - "top": 346.5, - "height": 61.5, - "width": 15, - "title": "装订线", - "lineHeight": 18, - "fixed": true, - "contentPaddingTop": 3.75, - "backgroundColor": "#ffffff" - }, "printElementType": {"type": "text"} - }, { - "options": { - "left": 225, - "top": 355, - "height": 13, - "width": 346.5, - "title": "自定义模块:主要为开发人员设计,能够快速,简单,实现自己功能", - "textAlign": "center" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": {"left": 60, "top": 370.5, "height": 18, "width": 79, "title": "配置项表格", "textAlign": "center"}, - "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 225, - "top": 385.5, - "height": 38, - "width": 346.5, - "title": "配置模块:主要为客户使用,开发人员可以配置属性,字段,标题等,客户直接使用,配置模块请参考实例2", - "fontFamily": "微软雅黑", - "lineHeight": 15, - "textAlign": "center", - "color": "#d93838" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 60, - "top": 487.5, - "height": 13, - "width": 123, - "title": "长文本会自动分页", - "textAlign": "center" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": {"left": 60, "top": 507, "height": 40, "width": 511.5, "field": "longText"}, - "printElementType": {"title": "长文", "type": "longText"} - }, { - "options": {"left": 475.5, "top": 565.5, "height": 100, "width": 100}, - "printElementType": {"title": "矩形", "type": "rect"} - }, { - "options": {"left": 174, "top": 568.5, "height": 13, "width": 90, "title": "竖线", "textAlign": "center"}, - "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": {"left": 60, "top": 574.5, "height": 100, "width": 10}, - "printElementType": {"title": "竖线", "type": "vline"} - }, { - "options": {"left": 210, "top": 604.5, "height": 13, "width": 120, "title": "横线", "textAlign": "center"}, - "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": {"left": 130.5, "top": 625.5, "height": 10, "width": 277}, - "printElementType": {"title": "横线", "type": "hline"} - }, { - "options": { - "left": 364.5, - "top": 649.5, - "height": 13, - "width": 101, - "title": "矩形", - "textAlign": "center" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": {"left": 525, "top": 784.5, "height": 13, "width": 63, "title": "页尾线", "textAlign": "center"}, - "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": {"left": 12, "top": 786, "height": 49, "width": 49}, - "printElementType": {"title": "html", "type": "html"} - }, { - "options": { - "left": 75, - "top": 790.5, - "height": 13, - "width": 137, - "title": "红色原型是自动定义的Html", - "textAlign": "center" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 334.5, - "top": 810, - "height": 13, - "width": 205, - "title": "页眉线已上。页尾下以下每页都会重复打印", - "textAlign": "center" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }], - "paperNumberLeft": 565.5, - "paperNumberTop": 819 - }] -} \ No newline at end of file + "panels": [ + { + "index": 0, + "name": 1, + "height": 297, + "width": 210, + "paperHeader": 49.5, + "paperFooter": 780.0000000000001, + "printElements": [ + { + "options": { + "left": 0, + "top": 0, + "height": 22.5, + "width": 114, + "title": "为了看打印边距(Safari)", + "right": 82.5, + "bottom": 9.75, + "vCenter": 41.25, + "hCenter": 4.875, + "coordinateSync": false, + "widthHeightSync": false, + "color": "#ffffff", + "backgroundColor": "#57b3ff", + "textAlign": "center", + "textContentVerticalAlign": "middle", + "qrCodeLevel": 0 + }, + "printElementType": { + "title": "这是更新后的元素", + "type": "text" + } + }, + { + "options": { + "left": 175.5, + "top": 10.5, + "height": 27, + "width": 259, + "title": "HiPrint自定义模块打印插件", + "fontSize": 19, + "fontWeight": "600", + "textAlign": "center", + "lineHeight": 26, + "coordinateSync": true, + "widthHeightSync": true, + "draggable": false + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 60, + "top": 27, + "height": 13, + "width": 52, + "title": "页眉线", + "textAlign": "center" + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 570, + "top": 51, + "height": 109.5, + "width": 24, + "title": "为了看打印边距", + "right": 597, + "bottom": 159.75, + "vCenter": 585, + "hCenter": 105, + "coordinateSync": false, + "widthHeightSync": false, + "letterSpacing": 4.5, + "color": "#ffffff", + "backgroundColor": "#57b3ff", + "textAlign": "center", + "textContentVerticalAlign": "middle", + "qrCodeLevel": 0 + }, + "printElementType": { + "title": "这是更新后的元素", + "type": "text" + } + }, + { + "options": { + "left": 0, + "top": 51, + "height": 109.5, + "width": 24, + "title": "为了看打印边距", + "right": -3, + "bottom": 154.5, + "vCenter": -15, + "hCenter": 99.75, + "coordinateSync": false, + "widthHeightSync": false, + "letterSpacing": 4.5, + "color": "#ffffff", + "backgroundColor": "#57b3ff", + "textAlign": "center", + "textContentVerticalAlign": "middle", + "qrCodeLevel": 0 + }, + "printElementType": { + "title": "这是更新后的元素", + "type": "text" + } + }, + { + "options": { + "left": 25.5, + "top": 57, + "height": 705, + "width": 9, + "fixed": true, + "borderStyle": "dotted" + }, + "printElementType": { + "type": "vline" + } + }, + { + "options": { + "left": 60, + "top": 61.5, + "height": 48, + "width": 87, + "src": "", + "fit": "contain" + }, + "printElementType": { + "title": "图片", + "type": "image" + } + }, + { + "options": { + "left": 153, + "top": 64.5, + "height": 39, + "width": 276, + "title": "二维码以及条形码均采用svg格式打印。不同打印机打印不会造成失真。图片打印:不同DPI打印可能会导致失真,", + "fontFamily": "微软雅黑", + "textAlign": "center", + "lineHeight": 18 + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 457.5, + "top": 79.5, + "height": 13, + "width": 120, + "title": "姓名", + "field": "name", + "testData": "古力娜扎", + "color": "#f00808", + "textDecoration": "underline", + "textAlign": "center", + "fields": [ + { + "text": "id", + "field": "id" + }, + { + "text": "姓名", + "field": "name" + }, + { + "text": "性别", + "field": "gender" + }, + { + "text": "数量", + "field": "count" + } + ] + }, + "printElementType": { + "title": "文本", + "type": "text" + } + }, + { + "options": { + "left": 60, + "top": 110, + "height": 19, + "width": 213, + "title": "所有打印元素都可已拖拽的方式来改变元素大小", + "fontFamily": "微软雅黑", + "textAlign": "center", + "lineHeight": 18 + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 483, + "top": 115, + "height": 60, + "width": 60, + "title": "123456789", + "textAlign": "center", + "textType": "qrcode" + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 70, + "top": 120, + "height": 19, + "width": 213, + "title": "所有打印元素都可已拖拽的方式来改变元素大小", + "fontFamily": "微软雅黑", + "textAlign": "center", + "lineHeight": 18 + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 285, + "top": 125, + "height": 40, + "width": 175, + "title": "123456789", + "fontFamily": "微软雅黑", + "textAlign": "center", + "textType": "barcode" + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 153, + "top": 189, + "height": 13, + "width": 238, + "title": "单击元素,右侧可自定义元素属性", + "textAlign": "center", + "fontFamily": "微软雅黑" + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 60, + "top": 190.5, + "height": 13, + "width": 51, + "title": "横线", + "textAlign": "center" + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 415.5, + "top": 190.5, + "height": 13, + "width": 164, + "title": "可以配置各属性的默认值", + "textAlign": "center", + "fontFamily": "微软雅黑" + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 60, + "top": 214.5, + "height": 10, + "width": 475.5, + "borderWidth": 0.75 + }, + "printElementType": { + "title": "横线", + "type": "hline" + } + }, + { + "options": { + "left": 235.5, + "top": 220.5, + "height": 32, + "width": 342, + "title": "自定义表格:用户可左键选中表头,右键查看可操作项,操作类似Excel,双击表头单元格可进行编辑。内容:title#field", + "fontFamily": "微软雅黑", + "textAlign": "center", + "lineHeight": 15 + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 156, + "top": 265.5, + "height": 13, + "width": 94, + "title": "表头列大小可拖动", + "fontFamily": "微软雅黑", + "textAlign": "center" + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 60, + "top": 265.5, + "height": 13, + "width": 90, + "title": "红色区域可拖动", + "fontFamily": "微软雅黑", + "textAlign": "center" + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 60, + "top": 285, + "height": 56, + "width": 511.5, + "field": "table", + "tableFooterRepeat": "", + "tableBorder": "noBorder", + "tableHeaderBorder": "topBorder", + "tableHeaderCellBorder": "border", + "tableBodyRowBorder": "topBorder", + "tableFooterBorder": "topBorder", + "fields": [ + { + "text": "id", + "field": "id" + }, + { + "text": "姓名", + "field": "name" + }, + { + "text": "性别", + "field": "gender" + }, + { + "text": "数量", + "field": "count" + } + ], + "columns": [ + [ + { + "width": 102.30000000000001, + "checked": true, + "fixed": false, + "rowspan": 1, + "colspan": 1 + }, + { + "width": 102.30000000000001, + "title": "姓名", + "field": "name", + "checked": true, + "columnId": "name", + "fixed": false, + "rowspan": 1, + "colspan": 1, + "align": "center", + "tableSummary": "count" + }, + { + "width": 102.30000000000001, + "title": "数量", + "field": "count", + "checked": true, + "columnId": "count", + "fixed": false, + "rowspan": 1, + "colspan": 1, + "align": "center", + "tableSummary": "sum" + }, + { + "width": 102.30000000000001, + "checked": true, + "fixed": false, + "rowspan": 1, + "colspan": 1 + }, + { + "width": 102.30000000000001, + "checked": true, + "fixed": false, + "rowspan": 1, + "colspan": 1 + }, + { + "width": 85.25, + "title": "性别", + "field": "gender", + "checked": false, + "columnId": "gender", + "fixed": false, + "rowspan": 1, + "colspan": 1 + } + ] + ] + }, + "printElementType": { + "title": "表格", + "type": "table", + "editable": true, + "columnDisplayEditable": true, + "columnDisplayIndexEditable": true, + "columnTitleEditable": true, + "columnResizable": true, + "columnAlignEditable": true, + "isEnableEditField": true, + "isEnableContextMenu": true, + "isEnableInsertRow": true, + "isEnableDeleteRow": true, + "isEnableInsertColumn": true, + "isEnableDeleteColumn": true, + "isEnableMergeCell": true + } + }, + { + "options": { + "left": 21, + "top": 346.5, + "height": 61.5, + "width": 15, + "title": "装订线", + "lineHeight": 18, + "fixed": true, + "contentPaddingTop": 3.75, + "backgroundColor": "#ffffff" + }, + "printElementType": { + "type": "text" + } + }, + { + "options": { + "left": 225, + "top": 355, + "height": 13, + "width": 346.5, + "title": "自定义模块:主要为开发人员设计,能够快速,简单,实现自己功能", + "textAlign": "center" + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 60, + "top": 370.5, + "height": 18, + "width": 79, + "title": "配置项表格", + "textAlign": "center" + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 225, + "top": 385.5, + "height": 38, + "width": 346.5, + "title": "配置模块:主要为客户使用,开发人员可以配置属性,字段,标题等,客户直接使用,配置模块请参考实例2", + "fontFamily": "微软雅黑", + "lineHeight": 15, + "textAlign": "center", + "color": "#d93838" + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 60, + "top": 487.5, + "height": 13, + "width": 123, + "title": "长文本会自动分页", + "textAlign": "center" + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 60, + "top": 507, + "height": 40, + "width": 511.5, + "field": "longText" + }, + "printElementType": { + "title": "长文", + "type": "longText" + } + }, + { + "options": { + "left": 475.5, + "top": 565.5, + "height": 100, + "width": 100 + }, + "printElementType": { + "title": "矩形", + "type": "rect" + } + }, + { + "options": { + "left": 174, + "top": 568.5, + "height": 13, + "width": 90, + "title": "竖线", + "textAlign": "center" + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 60, + "top": 574.5, + "height": 100, + "width": 10 + }, + "printElementType": { + "title": "竖线", + "type": "vline" + } + }, + { + "options": { + "left": 210, + "top": 604.5, + "height": 13, + "width": 120, + "title": "横线", + "textAlign": "center" + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 130.5, + "top": 625.5, + "height": 10, + "width": 277, + "borderWidth": 0.75 + }, + "printElementType": { + "title": "横线", + "type": "hline" + } + }, + { + "options": { + "left": 364.5, + "top": 649.5, + "height": 13, + "width": 101, + "title": "矩形", + "textAlign": "center" + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 525, + "top": 784.5, + "height": 13, + "width": 63, + "title": "页尾线", + "textAlign": "center" + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 12, + "top": 786, + "height": 49, + "width": 49 + }, + "printElementType": { + "title": "html", + "type": "html" + } + }, + { + "options": { + "left": 75, + "top": 790.5, + "height": 13, + "width": 137, + "title": "红色原型是自动定义的Html", + "textAlign": "center" + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 334.5, + "top": 810, + "height": 13, + "width": 205, + "title": "页眉线已上。页尾下以下每页都会重复打印", + "textAlign": "center" + }, + "printElementType": { + "title": "自定义文本", + "type": "text" + } + }, + { + "options": { + "left": 0, + "top": 816, + "height": 22.5, + "width": 114, + "title": "为了看打印边距(Safari)", + "right": 99.99609375, + "bottom": 845.49609375, + "vCenter": 42.99609375, + "hCenter": 834.24609375, + "coordinateSync": false, + "widthHeightSync": false, + "color": "#ffffff", + "backgroundColor": "#57b3ff", + "textAlign": "center", + "textContentVerticalAlign": "middle", + "qrCodeLevel": 0 + }, + "printElementType": { + "title": "这是更新后的元素", + "type": "text" + } + } + ], + "paperNumberLeft": 565.5, + "paperNumberTop": 573, + "paperNumberContinue": true, + "watermarkOptions": { + "content": "vue-plugin-hiprint", + "rotate": 25, + "timestamp": true, + "format": "YYYY-MM-DD HH:mm" + }, + "panelLayoutOptions": {} + } + ] +} From 148720a0d503f064c2dad018458adaf2f8024203 Mon Sep 17 00:00:00 2001 From: Canim <840054486@qq.com> Date: Fri, 30 Aug 2024 13:56:46 +0800 Subject: [PATCH 16/59] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BC=98=E5=8C=96=20te?= =?UTF-8?q?xt=E6=9D=A1=E5=BD=A2=E7=A0=81:=20=E6=94=AF=E6=8C=81=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E6=9D=A1=E7=A0=81=E6=96=87=E6=9C=AC=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?:=20=E5=8D=95=E7=8B=AC=E6=96=87=E6=9C=AC=E3=80=81svg=E6=96=87?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hiprint/hiprint.bundle.js | 30 +++++++++++++++++++++++++++--- src/hiprint/hiprint.config.js | 14 +++++++++++--- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/hiprint/hiprint.bundle.js b/src/hiprint/hiprint.bundle.js index f66a6331..0fc84956 100644 --- a/src/hiprint/hiprint.bundle.js +++ b/src/hiprint/hiprint.bundle.js @@ -2746,6 +2746,22 @@ var hiprint = function (t) { this.target.remove(); }, t; }(), + barTextMode = function () { + function t() { + this.name = "barTextMode"; + } + return t.prototype.createTarget = function() { + this.target = $(`
    ${i18n.__('条码文本模式')}
    `) + return this.target; + }, t.prototype.getValue = function() { + var t = this.target.find("select").val(); + return t || void 0; + }, t.prototype.setValue = function(t) { + this.target.find("select").val(t) + }, t.prototype.destroy = function() { + this.target.remove() + }, t; + }(), barWidth = function () { function t() { this.name = "barWidth"; @@ -5341,7 +5357,7 @@ var hiprint = function (t) { t.init(), t.printElementOptionItems[e.name] = e; }, t.getItem = function (e) { return t.init(), t.printElementOptionItems[e]; - }, t._printElementOptionItems = [new fontFamily(), new r(), new a(), new p(), new i(), new s(), new l(), new pt(), new u(), new d(), new c(), new h(), new f(), new g(), new m(), new d2(), new c2(), new v(), new y(), new b(), new E(), new qrCodeLevel(), new T(), new P(), new _(), new w(), new x(), new coordinate(), new widthHeight(), new C(), new imageFit(), new O(), new H(), new D(), new paperNumberContinue(), new watermarkOptions(), new I(), new R(), new pageBreak(), new M(), new M2(), new S(), new B(), new F(), new L(), new A(), new z(), new k(), new st(), new N(), new V(), new W(), new j(), new U(), new borderRadius(), new zIndex(), new K(), new G(), new q(), new X(), new Y(), new Q(), new J(), new Z(), new tt(), new et(), new nt(), new it(), new ot(),new textWrap(), new at(), new lt(), new panelLayoutOptions(), new ut(), new ith(), new dt(), new ct(), new ht(), new ft(), new gt(), new mt(), new rowcolumns(), new rowsColumnsMergeClean(), new groupFieldsFormatter(), new groupFormatter(), new groupFooterFormatter(), new vt(), new yt(), new bt(), new Tt(), new Et(), new Pt(), new stylerHeader(), new renderFormatter(), new _t(), new wt(), new maxRows(), new xt(), new tableColumnH(), new tableE(), new tableQRCodeLevel(), new tablept(), new tableSummaryTitle(), new tableSummaryText(), new tableSummaryColspan(), new tableSummary(), new tableSummaryAlign(), new tableSummaryNumFormat(), new tableSummaryFormatter(),new showCodeTitle(), new upperCase(), new barcodeType(), new qrcodeType(), new barColor(), new barWidth(), new barAutoWidth()], t; + }, t._printElementOptionItems = [new fontFamily(), new r(), new a(), new p(), new i(), new s(), new l(), new pt(), new u(), new d(), new c(), new h(), new f(), new g(), new m(), new d2(), new c2(), new v(), new y(), new b(), new E(), new qrCodeLevel(), new T(), new P(), new _(), new w(), new x(), new coordinate(), new widthHeight(), new C(), new imageFit(), new O(), new H(), new D(), new paperNumberContinue(), new watermarkOptions(), new I(), new R(), new pageBreak(), new M(), new M2(), new S(), new B(), new F(), new L(), new A(), new z(), new k(), new st(), new N(), new V(), new W(), new j(), new U(), new borderRadius(), new zIndex(), new K(), new G(), new q(), new X(), new Y(), new Q(), new J(), new Z(), new tt(), new et(), new nt(), new it(), new ot(),new textWrap(), new at(), new lt(), new panelLayoutOptions(), new ut(), new ith(), new dt(), new ct(), new ht(), new ft(), new gt(), new mt(), new rowcolumns(), new rowsColumnsMergeClean(), new groupFieldsFormatter(), new groupFormatter(), new groupFooterFormatter(), new vt(), new yt(), new bt(), new Tt(), new Et(), new Pt(), new stylerHeader(), new renderFormatter(), new _t(), new wt(), new maxRows(), new xt(), new tableColumnH(), new tableE(), new tableQRCodeLevel(), new tablept(), new tableSummaryTitle(), new tableSummaryText(), new tableSummaryColspan(), new tableSummary(), new tableSummaryAlign(), new tableSummaryNumFormat(), new tableSummaryFormatter(),new showCodeTitle(), new upperCase(), new barcodeType(), new qrcodeType(), new barColor(), new barTextMode(), new barWidth(), new barAutoWidth()], t; }(); }, function (t, e, n) { "use strict"; @@ -8859,6 +8875,8 @@ var hiprint = function (t) { return (null == this.fontSize ? this.defaultOptions.fontSize : this.fontSize) || 9; }, e.prototype.getbarcodeMode = function () { return (null == this.barcodeMode ? this.defaultOptions.barcodeMode : this.barcodeMode) || "CODE128"; + }, e.prototype.getBarTextMode = function () { + return (null == this.barTextMode ? this.defaultOptions.barTextMode : this.barTextMode) || 'text'; }, e.prototype.getBarWidth = function () { return (null == this.barWidth ? this.defaultOptions.barWidth : this.barWidth) || 1; }, e.prototype.getBarAutoWidth = function () { @@ -8946,8 +8964,13 @@ var hiprint = function (t) { "display": "flex", "flex-direction": "column" }) + // 分离显示条形码文本 + var divMode = this.options.getBarTextMode() == 'text'; // pub-beta 0.0.57-beta22 移除插件通过 div 添加的文本元素,默认使用 JsBarcode 生成条形码文本 a.html(''); + if (divMode) { + a.append(`
    `); + } try { n ? (JsBarcode(a.find(".hibarcode_imgcode")[0], n, { format: this.options.getbarcodeMode(), @@ -8956,8 +8979,9 @@ var hiprint = function (t) { lineColor: this.options.color || "#000000", margin: 0, height: parseInt(o.a.pt.toPx(this.options.getHeight() || 10).toString()), - displayValue: !this.options.hideTitle, - }), a.find(".hibarcode_imgcode").attr("height", "100%"), a.find(".hibarcode_imgcode").attr("width", "100%")) : a.html(""); + displayValue: divMode ? false : !this.options.hideTitle, + }), a.find(".hibarcode_imgcode").attr("height", "100%"), a.find(".hibarcode_imgcode").attr("width", "100%"), + divMode && (this.options.hideTitle || a.find(".hibarcode_displayValue").html(n))): a.html(""); // pub-beta 0.0.57-beta22 解决条形码自动宽度问题 let svgWidth = a.find(".hibarcode_imgcode rect")[0].attributes.width.value svgWidth = Math.ceil(hinnn.px.toPt(svgWidth * 1.05)); diff --git a/src/hiprint/hiprint.config.js b/src/hiprint/hiprint.config.js index 474d824c..9977dd62 100644 --- a/src/hiprint/hiprint.config.js +++ b/src/hiprint/hiprint.config.js @@ -228,6 +228,10 @@ name: 'barcodeMode', hidden: false }, + { + name: 'barTextMode', + hidden: false + }, { name: 'barWidth', hidden: false @@ -344,6 +348,10 @@ name: 'barcodeMode', hidden: false }, + { + name: 'barTextMode', + hidden: false + }, { name: 'barWidth', hidden: false @@ -1810,7 +1818,7 @@ name: 'tableSummaryNumFormat', hidden: false }, - + { name: 'tableSummaryFormatter', hidden: false @@ -1819,7 +1827,7 @@ name: 'upperCase', hidden: false }, - + { name: 'renderFormatter', hidden: false @@ -1836,7 +1844,7 @@ name: 'stylerHeader', hidden: false }, - + ], default: { height: 90, From 797c3b3f525564363ec89e3b592c8514b7a08f32 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <840054486@qq.com> Date: Fri, 30 Aug 2024 05:59:27 +0000 Subject: [PATCH 17/59] pub-beta 0.0.57-beta30 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index eff12bfc..b59c20f3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vue-plugin-hiprint", "description": "hiprint for Vue2.x / Vue3.x 支持拖拽(分页(不分页)、表头表脚、样式设置、复制粘贴、缩放、撤销重做)生成打印模板、导出json模板数据、静默打印/获取MAC地址(借助客户端)", - "version": "0.0.57-beta29", + "version": "0.0.57-beta30", "author": "CcSimple", "license": "MIT", "main": "dist/vue-plugin-hiprint.js", From 76736c8a3f89bb881c721620c0602f5d9fa38d64 Mon Sep 17 00:00:00 2001 From: Canim <840054486@qq.com> Date: Tue, 8 Oct 2024 23:08:14 +0800 Subject: [PATCH 18/59] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=96=B0=E5=A2=9E=20?= =?UTF-8?q?=E8=A1=A8=E6=A0=BC=20=E5=88=86=E7=BB=84=E5=BA=8F=E5=8F=B7?= =?UTF-8?q?=E7=BB=AD=E7=BC=96=20=E8=AE=BE=E7=BD=AE=20=E9=BB=98=E8=AE=A4=20?= =?UTF-8?q?false?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hiprint/hiprint.bundle.js | 24 +++++++++++++++++++++--- src/hiprint/hiprint.config.js | 12 ++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/hiprint/hiprint.bundle.js b/src/hiprint/hiprint.bundle.js index 0fc84956..212a4af8 100644 --- a/src/hiprint/hiprint.bundle.js +++ b/src/hiprint/hiprint.bundle.js @@ -1881,6 +1881,7 @@ var hiprint = function (t) { var o = TableExcelHelper.reconsitutionTableColumnTree(t), r = $(""); var gff = h.getGroupFieldsFormatter(n, i); + var groupRowIndex = 0; var groupFields = gff ? (n.groupFields = gff(i, n, e)) : i.groupFields ? i.groupFields : []; (e || (e = []), groupFields.length) ? _assets_plugins_hinnn__WEBPACK_IMPORTED_MODULE_1__.a.groupBy(e, groupFields, function (t) { var e = {}; @@ -1902,8 +1903,10 @@ var hiprint = function (t) { var groupFooterFormatter = h.getGroupFooterFormatter(n, i); var groupData = t; if (groupData.rows.forEach(function (t, rowIndex) { - var e = TableExcelHelper.createRowTarget(o, t, n, i, rowIndex, groupData.rows, printData); + let sequenceIndex = n.groupSequenceContinue ? groupRowIndex : rowIndex; + var e = TableExcelHelper.createRowTarget(o, t, n, i, sequenceIndex, groupData.rows, printData); r.append(e); + groupRowIndex += 1; }), groupFooterFormatter) { let result = groupFooterFormatter(o.colspan, e, printData, t, n) if ($(result).is("tr")) { @@ -5100,6 +5103,21 @@ var hiprint = function (t) { this.target.remove(); }, t; }(), + groupSequenceContinue = function () { + function t() { + this.name = "groupSequenceContinue"; + } + + return t.prototype.createTarget = function () { + return this.target = $(`
    \n
    \n ${i18n.__('分组序号续编')}\n
    \n
    \n \n
    \n
    `), this.target; + }, t.prototype.getValue = function () { + if ("true" == this.target.find("select").val()) return !0; + }, t.prototype.setValue = function (t) { + this.target.find("select").val((null == t ? "" : t).toString()); + }, t.prototype.destroy = function () { + this.target.remove(); + }, t; + }(), groupFieldsFormatter = function () { function t() { this.name = "groupFieldsFormatter"; @@ -5357,7 +5375,7 @@ var hiprint = function (t) { t.init(), t.printElementOptionItems[e.name] = e; }, t.getItem = function (e) { return t.init(), t.printElementOptionItems[e]; - }, t._printElementOptionItems = [new fontFamily(), new r(), new a(), new p(), new i(), new s(), new l(), new pt(), new u(), new d(), new c(), new h(), new f(), new g(), new m(), new d2(), new c2(), new v(), new y(), new b(), new E(), new qrCodeLevel(), new T(), new P(), new _(), new w(), new x(), new coordinate(), new widthHeight(), new C(), new imageFit(), new O(), new H(), new D(), new paperNumberContinue(), new watermarkOptions(), new I(), new R(), new pageBreak(), new M(), new M2(), new S(), new B(), new F(), new L(), new A(), new z(), new k(), new st(), new N(), new V(), new W(), new j(), new U(), new borderRadius(), new zIndex(), new K(), new G(), new q(), new X(), new Y(), new Q(), new J(), new Z(), new tt(), new et(), new nt(), new it(), new ot(),new textWrap(), new at(), new lt(), new panelLayoutOptions(), new ut(), new ith(), new dt(), new ct(), new ht(), new ft(), new gt(), new mt(), new rowcolumns(), new rowsColumnsMergeClean(), new groupFieldsFormatter(), new groupFormatter(), new groupFooterFormatter(), new vt(), new yt(), new bt(), new Tt(), new Et(), new Pt(), new stylerHeader(), new renderFormatter(), new _t(), new wt(), new maxRows(), new xt(), new tableColumnH(), new tableE(), new tableQRCodeLevel(), new tablept(), new tableSummaryTitle(), new tableSummaryText(), new tableSummaryColspan(), new tableSummary(), new tableSummaryAlign(), new tableSummaryNumFormat(), new tableSummaryFormatter(),new showCodeTitle(), new upperCase(), new barcodeType(), new qrcodeType(), new barColor(), new barTextMode(), new barWidth(), new barAutoWidth()], t; + }, t._printElementOptionItems = [new fontFamily(), new r(), new a(), new p(), new i(), new s(), new l(), new pt(), new u(), new d(), new c(), new h(), new f(), new g(), new m(), new d2(), new c2(), new v(), new y(), new b(), new E(), new qrCodeLevel(), new T(), new P(), new _(), new w(), new x(), new coordinate(), new widthHeight(), new C(), new imageFit(), new O(), new H(), new D(), new paperNumberContinue(), new watermarkOptions(), new I(), new R(), new pageBreak(), new M(), new M2(), new S(), new B(), new F(), new L(), new A(), new z(), new k(), new st(), new N(), new V(), new W(), new j(), new U(), new borderRadius(), new zIndex(), new K(), new G(), new q(), new X(), new Y(), new Q(), new J(), new Z(), new tt(), new et(), new nt(), new it(), new ot(),new textWrap(), new at(), new lt(), new panelLayoutOptions(), new ut(), new ith(), new dt(), new ct(), new ht(), new ft(), new gt(), new mt(), new rowcolumns(), new rowsColumnsMergeClean(), new groupSequenceContinue(), new groupFieldsFormatter(), new groupFormatter(), new groupFooterFormatter(), new vt(), new yt(), new bt(), new Tt(), new Et(), new Pt(), new stylerHeader(), new renderFormatter(), new _t(), new wt(), new maxRows(), new xt(), new tableColumnH(), new tableE(), new tableQRCodeLevel(), new tablept(), new tableSummaryTitle(), new tableSummaryText(), new tableSummaryColspan(), new tableSummary(), new tableSummaryAlign(), new tableSummaryNumFormat(), new tableSummaryFormatter(),new showCodeTitle(), new upperCase(), new barcodeType(), new qrcodeType(), new barColor(), new barTextMode(), new barWidth(), new barAutoWidth()], t; }(); }, function (t, e, n) { "use strict"; @@ -8328,7 +8346,7 @@ var hiprint = function (t) { var e = this; this.text = t.text, this.field = t.field, this.fields = t.fields, this.title = t.title, this.tid = t.tid, this.data = t.data, this.styler = t.styler, this.formatter = t.formatter, this.type = t.type, this.options = t.options, this.editable = t.editable != void 0 ? t.editable : !0, this.columnDisplayEditable = t.columnDisplayEditable != void 0 ? t.columnDisplayEditable : !0, this.columnDisplayIndexEditable = t.columnDisplayIndexEditable != void 0 ? t.columnDisplayIndexEditable : !0, this.columnTitleEditable = t.columnTitleEditable != void 0 ? t.columnTitleEditable : !0, this.columnResizable = t.columnResizable != void 0 ? t.columnResizable : !0, this.columnAlignEditable = t.columnAlignEditable != void 0 ? t.columnAlignEditable : !0, this.columns = [], (t.columns || []).forEach(function (t, n) { e.columns.push(e.createTableColumnArray(t)); - }), this.rowStyler = t.rowStyler, this.striped = t.striped, this.groupFields = t.groupFields || [], this.groupFormatter = t.groupFormatter, this.groupFooterFormatter = t.groupFooterFormatter, this.footerFormatter = t.footerFormatter, this.rowsColumnsMerge = t.rowsColumnsMerge, this.rowsColumnsMergeClean = t.rowsColumnsMergeClean, this.gridColumnsFooterFormatter = t.gridColumnsFooterFormatter, + }), this.rowStyler = t.rowStyler, this.striped = t.striped, this.groupFields = t.groupFields || [], this.groupFormatter = t.groupFormatter, this.groupFooterFormatter = t.groupFooterFormatter, this.footerFormatter = t.footerFormatter, this.rowsColumnsMerge = t.rowsColumnsMerge, this.rowsColumnsMergeClean = t.rowsColumnsMergeClean, this.groupSequenceContinue = t.groupSequenceContinue, this.gridColumnsFooterFormatter = t.gridColumnsFooterFormatter, this.isEnableEditField = t.isEnableEditField != void 0 ? t.isEnableEditField : !0, this.isEnableContextMenu = t.isEnableContextMenu != void 0 ? t.isEnableContextMenu : !0, this.isEnableInsertRow = t.isEnableInsertRow != void 0 ? t.isEnableInsertRow : !0, this.isEnableDeleteRow = t.isEnableDeleteRow != void 0 ? t.isEnableDeleteRow : !0, this.isEnableInsertColumn = t.isEnableInsertColumn != void 0 ? t.isEnableInsertColumn : !0, this.isEnableDeleteColumn = t.isEnableDeleteColumn != void 0 ? t.isEnableDeleteColumn : !0, this.isEnableMergeCell = t.isEnableMergeCell != void 0 ? t.isEnableMergeCell : !0, this.columnObj = this.makeColumnObj(); } diff --git a/src/hiprint/hiprint.config.js b/src/hiprint/hiprint.config.js index 9977dd62..9501cb93 100644 --- a/src/hiprint/hiprint.config.js +++ b/src/hiprint/hiprint.config.js @@ -1020,6 +1020,10 @@ name: 'rowsColumnsMergeClean', hidden: false }, + { + name: 'groupSequenceContinue', + hidden: false + }, { name: 'groupFieldsFormatter', hidden: false @@ -1168,6 +1172,14 @@ name: 'rowsColumnsMerge', hidden: false }, + { + name: 'rowsColumnsMergeClean', + hidden: false + }, + { + name: 'groupSequenceContinue', + hidden: false + }, { name: 'groupFieldsFormatter', hidden: false From 41fd950cb69417509d8af6051873225e61f31fa4 Mon Sep 17 00:00:00 2001 From: Canim <840054486@qq.com> Date: Tue, 8 Oct 2024 23:35:05 +0800 Subject: [PATCH 19/59] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BC=98=E5=8C=96=20?= =?UTF-8?q?=E8=A1=A8=E6=A0=BC=E8=84=9A=E6=96=B0=E5=A2=9E=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=20pageIndex=20(=E5=BD=93=E5=89=8D=E9=A1=B5=E7=A0=81=E4=B8=8B?= =?UTF-8?q?=E6=A0=870=E5=BC=80=E5=A7=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hiprint/hiprint.bundle.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/hiprint/hiprint.bundle.js b/src/hiprint/hiprint.bundle.js index 212a4af8..ea5d091f 100644 --- a/src/hiprint/hiprint.bundle.js +++ b/src/hiprint/hiprint.bundle.js @@ -1791,7 +1791,7 @@ var hiprint = function (t) { r(a); } return TableExcelHelper.syncTargetWidthToOption(t), [i, colgroup]; - }, TableExcelHelper.createTableFooter = function (t, e, n, i, o, r) { + }, TableExcelHelper.createTableFooter = function (t, e, n, i, o, r, pageIndex) { // n=>options e=>表格所有数据 o=>所有打印数据 r=>表格每页数据 var a = $(""), p = this.getFooterFormatter(n, i); var tst = this.tableSummaryTitle; @@ -1870,7 +1870,8 @@ var hiprint = function (t) { a.append(tableFooter); } if (p) { - a.append(p(n, e, o, r)); + // pageIndex: 当前页码(0开始) 如果表格脚最后页显示,则中间回调 undefined + a.append(p(n, e, o, r, pageIndex)); } return a; }, TableExcelHelper.tableSummaryTitle = function (column, title, data) { @@ -5093,7 +5094,7 @@ var hiprint = function (t) { } return t.prototype.createTarget = function () { - return this.target = $(`
    \n
    \n ${i18n.__('表格脚函数')}\n
    \n
    \n \n
    \n
    `), this.target; + return this.target = $(`
    \n
    \n ${i18n.__('表格脚函数')}\n
    \n
    \n \n
    \n
    `), this.target; }, t.prototype.getValue = function () { var t = this.target.find("textarea").val(); if (t) return t; @@ -5850,9 +5851,9 @@ var hiprint = function (t) { if ("last" == this.options.tableFooterRepeat && !c.isEnd) break; if ("no" !== this.options.tableFooterRepeat) { if (noPaging) { - d.find("tbody").append(_table_TableExcelHelper__WEBPACK_IMPORTED_MODULE_6__.a.createTableFooter(this.printElementType.columns, this.getData(t), this.options, this.printElementType, t, h).children()) + d.find("tbody").append(_table_TableExcelHelper__WEBPACK_IMPORTED_MODULE_6__.a.createTableFooter(this.printElementType.columns, this.getData(t), this.options, this.printElementType, t, h, o).children()) } else { - _table_TableExcelHelper__WEBPACK_IMPORTED_MODULE_6__.a.createTableFooter(this.printElementType.columns, this.getData(t), this.options, this.printElementType, t, h).insertBefore(d.find("tbody")); + _table_TableExcelHelper__WEBPACK_IMPORTED_MODULE_6__.a.createTableFooter(this.printElementType.columns, this.getData(t), this.options, this.printElementType, t, h, o).insertBefore(d.find("tbody")); } that.css(d, t); } From 1a1199104edc5d9c007037783b5791369641e8a2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <840054486@qq.com> Date: Tue, 8 Oct 2024 15:36:50 +0000 Subject: [PATCH 20/59] pub-beta 0.0.57-beta31 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b59c20f3..2b8303b1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vue-plugin-hiprint", "description": "hiprint for Vue2.x / Vue3.x 支持拖拽(分页(不分页)、表头表脚、样式设置、复制粘贴、缩放、撤销重做)生成打印模板、导出json模板数据、静默打印/获取MAC地址(借助客户端)", - "version": "0.0.57-beta30", + "version": "0.0.57-beta31", "author": "CcSimple", "license": "MIT", "main": "dist/vue-plugin-hiprint.js", From d50d3cb1dd6e1289dfed1857997fe874c615c926 Mon Sep 17 00:00:00 2001 From: Canim <840054486@qq.com> Date: Wed, 9 Oct 2024 00:03:30 +0800 Subject: [PATCH 21/59] update webpack.config.js --- webpack.config.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/webpack.config.js b/webpack.config.js index 486d7423..c789e444 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -45,9 +45,11 @@ module.exports = { amd: "socket.io-client", root: "io", }, - html2canvas: "html2canvas", + "@wtto00/html2canvas": "html2canvas", canvg: 'canvg', jspdf: "jspdf", + "bwip-js": "bwipjs", + "nzh": "Nzh", }, optimization:{ minimizer:[ From 0088a91d7cd1b4ad93c8bff3302d576e9d79da0b Mon Sep 17 00:00:00 2001 From: Canim <840054486@qq.com> Date: Wed, 9 Oct 2024 00:11:30 +0800 Subject: [PATCH 22/59] update README.md --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b933fc53..8bea8809 100644 --- a/README.md +++ b/README.md @@ -584,10 +584,12 @@ $('#hiwprint_iframe').css('visibility','hidden'); -## 状态/调整/优化 请查看[更新记录](CHANGELOG.md) - 本项目使用
    开发 +## Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=CcSimple/vue-plugin-hiprint&type=Date)](https://star-history.com/#CcSimple/vue-plugin-hiprint&Date) + ## 分支说明 > main: vue2.x + ant1.7.x融合版 及 npm包源代码 From 18286fe565f49656a37e39382231ddf1cb2eb93f Mon Sep 17 00:00:00 2001 From: Canim <840054486@qq.com> Date: Sat, 2 Nov 2024 14:56:18 +0800 Subject: [PATCH 23/59] 0.0.58-changelog --- CHANGELOG.md | 179 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 175 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 46f1c41f..3ac4e567 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,177 @@ ### 💐 同时自动更新 GitHub Pages 同步 Gitee; ### 💐 感谢各位贡献者的支持。 🔥 +## 0.0.58 (2024-10-10) +> 使用此版本 请更新最新的 print-lock.css + +> 感谢各位提交 PR 的码友们! 感谢~ + +> 同时希望各位多看看文档、文章、更新日志; 📢 本页面支持 Ctrl/Command + F 搜索 + +- 点击 ▶ 可查看详情 + +
    + 01. 🌈 新增面板排列功能 (横向、纵向 支持间距) + +- 小模板 传数组 铺满 对应纸张 +
    +
    + 02. 🌈 新增支持 barcode、qrcode 条码颜色设置 + +
    +
    + 03. 🌈 新增支持 表格列 条形码/二维码值显示设置 + +
    +
    + 04. 🌈 新增支持 全选元素API 可批量删除 + +hiprintTemplate.selectAllElements(); +
    +
    + 05. 🌈 新增支持 根据字段名 选中元素 + +hiprintTemplate.selectElementsByField(['name']); +
    +
    + 06. 🌈 新增支持 获取打印机纸张信息 API (客户端^1.0.10) + +> ❗️ node-hiprint-transit 中转暂未添加支持 + + ```js + // 获取指定打印机纸张信息 + hiprint.getPaperInfo(printerName); + // 获取所有打印机纸张信息 + hiprint.getPaperInfo(); + + // 获取纸张信息方法是异步请求的,没有返回值,你可以使用 hinnn.event.on("paperSizeInfo", () => {}) 监听数据返回 + hinnn.event.on("paperSizeInfo", (paperSize) => { + console.log(paperSize); + }); + // [ + // { + // "PrinterName": "Microsoft Print to PDF", + // "TaskNumber": 0, // 打印队列数 + // "Status": 0, // 设备状态码 + // "StatusMsg": "准备就绪(Ready)", // 设备状态信息 + // "PaperSizes": [ + // { + // "Height": 1100, // 单位 mm + // "Kind": 1, + // "PaperName": "信纸", + // "RawKind": 1, + // "Width": 850 // 单位 mm + // } + // ] + // } + // ] + ```> ❗️ node-hiprint-transit 中转暂未添加支持 + + ```js + // 获取指定打印机纸张信息 + hiprint.getPaperInfo(printerName); + // 获取所有打印机纸张信息 + hiprint.getPaperInfo(); + + // 获取纸张信息方法是异步请求的,没有返回值,你可以使用 hinnn.event.on("paperSizeInfo", () => {}) 监听数据返回 + hinnn.event.on("paperSizeInfo", (paperSize) => { + console.log(paperSize); + }); + // [ + // { + // "PrinterName": "Microsoft Print to PDF", + // "TaskNumber": 0, // 打印队列数 + // "Status": 0, // 设备状态码 + // "StatusMsg": "准备就绪(Ready)", // 设备状态信息 + // "PaperSizes": [ + // { + // "Height": 1100, // 单位 mm + // "Kind": 1, + // "PaperName": "信纸", + // "RawKind": 1, + // "Width": 850 // 单位 mm + // } + // ] + // } + // ] + ``` +
    +
    + 07. 🌈 新增支持 print2支持分批打印(需客户端 v1.0.11) + +支持单模版大单据量连续打印 @george-hong ([#138](https://github.com/CcSimple/vue-plugin-hiprint/pull/138)) + ```js + hiprintTemplate.print2(printDataList, { + printer: '打印机名称', + title: '打印标题', + printByFragments: true, // 是否需要分批打印,分批打印能够支持连续打印大量数据,但会增加打印所需时间 + generateHTMLInterval: 30, // 多条数据生成HTML的间隔,单位ms,默认10 + fragmentSize: 10000, // 分片字符长度,默认50000 + sendInterval: 20, // 分片传输间隔,单位ms,默认10 + }) + ``` +
    +
    + 08. ✨ 调整优化 text、barcode 类型条码自动增加宽度优化 + +
    +
    + 09. ✨ 调整优化 text条形码: 支持设置条码文本模式: 单独文本、svg文本 + +
    +
    + 10. ✨ 调整优化 API 更新元素时 属性同步 + +
    +
    + 11. ✨ 调整优化 缩放时 框选框 移动偏差问题 + +
    +
    + 12. ✨ 调整优化 分组头/脚函数 自动判断return是否包含 tr、td + +
    +
    + 13. ✨ 调整优化 hiprint.setConfig API + +- 支持隐藏参数分组 +- 隐藏部分参数分组 +
    +
    + 14. ✨ 调整优化 update 更新模板时 尺寸跟着改变 + +
    +
    + 15. ✨ 调整优化 静默打印 图片默认不转 base64 + +
    +
    + 16. ✨ 调整优化 表格 分组序号 支持续编 + +
    +
    + 17. ⚠️ 修改 print2 打印成功回调事件为 success + +项目初始时 print2 打印成功回调事件即为 `successs` 事件 (手抖多打了个 s),electron-hiprint v1.0.8 重构关键代码时发现了该问题,为了标准及向下兼容,同时保留了 `succsss` 和 `success` 事件,经过 8 个多月的过渡期,现统一改为 `success` ,该改动仅对 electron-hiprint 1.0.7 及以前的客户端版本造成破坏性更新,后续版本无影响,我们也推荐大家及时更新至 1.0.11 以后的版本,体验更多优秀的功能。 +
    +
    + 18. 🐛✨🐛✨🐛✨🐛 其他修复或优化见详情(或见 git history) + +- 修复选择图片后refresh方法参数real属性无效,以及回调函数可能不会执行的问题 +- i18n相关修复优化 +- fix: 修复复制元素自动聚焦的bug +- 将图片的缩放控制点从[se,r]改为[s,e,se,r] (#98) +- 修复双击文本出现冒号的bug (#102) +- fix #104 修复表格中存在多列rowSpan时多页rowSpan错误 +- 修复表格分页colspan问题 +- fix: 修复新添加的条形码/二维码元素-左右对齐参数不生效的问题 +- add 表格添加 colgroup 解决分页不显示表头时列宽各种问题 +- fix 表格 样式参数设置不生效的 bug +- fix 表格里面当字段类型为图片时,单元格高度设置无效BUG修复,并设置最小高度避免表单高度计算失败 +
    + + + ## 0.0.57-beta28(2024-08-10) **⚠️⚠️⚠️ 有限的破坏性更新 Breaking changes**
    @@ -52,7 +223,7 @@ ## 0.0.57-beta23(2024-05-17)
    01. 🌈 新增支持 添加 selectElementsByField 属性,通过传入field的字符串数组选中文本类型的元素 - + @xiaolonggee ([#123](https://github.com/CcSimple/vue-plugin-hiprint/pull/123)) ```js hiprintTemplate.selectElementsByField(['name']) @@ -66,7 +237,7 @@ 01. ✨ 调整优化 text、barcode 类型条码自动增加宽度优化 经过一段时间的测试及实验,找到了 [JsBarcode](https://github.com/lindell/JsBarcode) 与 [bwip-js](https://github.com/metafloor/bwip-js) 两个库实现条码宽度自动增加的较优方案。(感谢Q群用户 【︶ㄣ夏^熟 。】的测试) - + 现在你可以在 text[textType='barcode']、barCode 元素中设置 barAutoWidth 属性,使条码以渲染时 svg 提供的最小尺寸自动增加宽度。 > 0.0.57-beta20 版本中 条码宽度 = svg宽度 * 1.2,该倍率不是很合理,在此版本中修改为 1.05 @@ -110,7 +281,7 @@
    01. 🌈 新增支持 获取打印机纸张信息 Beta ❗️ - + 当客户端运行在 window 系统环境时可以获取打印机纸张信息,你需要自行拉取最新客户端代码[electron-hiprint](https://github.com/CcSimple/electron-hiprint),自行构建最新版本(v1.0.10) > ❗️ node-hiprint-transit 中转暂未添加支持 @@ -217,7 +388,7 @@ const template = new hiprint.PrintTemplate({ template: panel, }) - + template.selectAllElements() ```
    From daaf3dd92c2b34fa92859b93a9413c6f7e217f7d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <840054486@qq.com> Date: Sat, 2 Nov 2024 06:58:25 +0000 Subject: [PATCH 24/59] pub 0.0.58 && git tag 0.0.58 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2b8303b1..010a0acf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vue-plugin-hiprint", "description": "hiprint for Vue2.x / Vue3.x 支持拖拽(分页(不分页)、表头表脚、样式设置、复制粘贴、缩放、撤销重做)生成打印模板、导出json模板数据、静默打印/获取MAC地址(借助客户端)", - "version": "0.0.57-beta31", + "version": "0.0.58", "author": "CcSimple", "license": "MIT", "main": "dist/vue-plugin-hiprint.js", From 78c6e53d4ae064fe404288ed4fa1c4da9608aaef Mon Sep 17 00:00:00 2001 From: Canim <840054486@qq.com> Date: Sat, 2 Nov 2024 15:14:42 +0800 Subject: [PATCH 25/59] 0.0.58 changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ac4e567..6eff27a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ ### 💐 同时自动更新 GitHub Pages 同步 Gitee; ### 💐 感谢各位贡献者的支持。 🔥 -## 0.0.58 (2024-10-10) +## 0.0.58 (2024-11-02) > 使用此版本 请更新最新的 print-lock.css > 感谢各位提交 PR 的码友们! 感谢~ From 9f288fd44fac243329d0878dce43f4775ff529b3 Mon Sep 17 00:00:00 2001 From: Canim <840054486@qq.com> Date: Tue, 5 Nov 2024 21:37:27 +0800 Subject: [PATCH 26/59] fix install bwipjs error --- package.json | 4 ++-- webpack.config.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 010a0acf..1653e294 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vue-plugin-hiprint", "description": "hiprint for Vue2.x / Vue3.x 支持拖拽(分页(不分页)、表头表脚、样式设置、复制粘贴、缩放、撤销重做)生成打印模板、导出json模板数据、静默打印/获取MAC地址(借助客户端)", - "version": "0.0.58", + "version": "0.0.58-fix", "author": "CcSimple", "license": "MIT", "main": "dist/vue-plugin-hiprint.js", @@ -66,4 +66,4 @@ "nzh": "^1.0.8", "socket.io-client": "^4.5.1" } -} \ No newline at end of file +} diff --git a/webpack.config.js b/webpack.config.js index c789e444..004088f7 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -48,7 +48,7 @@ module.exports = { "@wtto00/html2canvas": "html2canvas", canvg: 'canvg', jspdf: "jspdf", - "bwip-js": "bwipjs", + "bwip-js": 'bwip-js', "nzh": "Nzh", }, optimization:{ From c8df2f67565604bc8de8878df573f0a3420d3a66 Mon Sep 17 00:00:00 2001 From: Junior125306 <37093468+Junior125306@users.noreply.github.com> Date: Sun, 22 Dec 2024 23:03:43 +0800 Subject: [PATCH 27/59] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20top/height=20?= =?UTF-8?q?=E7=9B=B8=E5=8A=A0bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 手动输入输入框数据时,数字会变成字符串,相加是会有bug 比如 2.12 + 1.2 变成了 2.121.2 获取数据时 - 0 变成数字 --- src/hiprint/hiprint.bundle.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hiprint/hiprint.bundle.js b/src/hiprint/hiprint.bundle.js index ea5d091f..ba344323 100644 --- a/src/hiprint/hiprint.bundle.js +++ b/src/hiprint/hiprint.bundle.js @@ -564,7 +564,7 @@ var hiprint = function (t) { } return d; }, t.prototype.getLeft = function () { - return this.left; + return this.left - 0; }, t.prototype.posLeft = function () { var left = this.left; if (this.transform) left += this.getRectInfo().diffW; @@ -579,7 +579,7 @@ var hiprint = function (t) { }, t.prototype.setLeft = function (t) { null != t && (this.left = t); }, t.prototype.getTop = function () { - return this.top; + return this.top - 0; }, t.prototype.posTop = function () { var top = this.top; if (this.transform) top += this.getRectInfo().diffH; @@ -600,7 +600,7 @@ var hiprint = function (t) { var i = this.getRectInfo(); return i.h + i.diffH; } - return this.height; + return this.height - 0; }, t.prototype.displayHeight = function () { return this.height + "pt"; }, t.prototype.setHeight = function (t) { @@ -610,7 +610,7 @@ var hiprint = function (t) { var i = this.getRectInfo(); return i.w + i.diffW; } - return this.width; + return this.width - 0; }, t.prototype.displayWidth = function () { return this.width + "pt"; }, t.prototype.setWidth = function (t) { From 6723fb64d1edd944917251381ba4f1737adb4bed Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <840054486@qq.com> Date: Sun, 22 Dec 2024 15:10:46 +0000 Subject: [PATCH 28/59] pub-beta 0.0.59-beta1 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 1653e294..e48384b4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vue-plugin-hiprint", "description": "hiprint for Vue2.x / Vue3.x 支持拖拽(分页(不分页)、表头表脚、样式设置、复制粘贴、缩放、撤销重做)生成打印模板、导出json模板数据、静默打印/获取MAC地址(借助客户端)", - "version": "0.0.58-fix", + "version": "0.0.59-beta1", "author": "CcSimple", "license": "MIT", "main": "dist/vue-plugin-hiprint.js", @@ -66,4 +66,4 @@ "nzh": "^1.0.8", "socket.io-client": "^4.5.1" } -} +} \ No newline at end of file From d95706e73f6643bf97f2d384ac5374e7694a45ef Mon Sep 17 00:00:00 2001 From: Junior125306 <37093468+Junior125306@users.noreply.github.com> Date: Sat, 4 Jan 2025 14:45:49 +0800 Subject: [PATCH 29/59] fix: tablerender bug --- src/hiprint/hiprint.bundle.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/hiprint/hiprint.bundle.js b/src/hiprint/hiprint.bundle.js index ba344323..34557201 100644 --- a/src/hiprint/hiprint.bundle.js +++ b/src/hiprint/hiprint.bundle.js @@ -1884,7 +1884,8 @@ var hiprint = function (t) { var gff = h.getGroupFieldsFormatter(n, i); var groupRowIndex = 0; var groupFields = gff ? (n.groupFields = gff(i, n, e)) : i.groupFields ? i.groupFields : []; - (e || (e = []), groupFields.length) ? _assets_plugins_hinnn__WEBPACK_IMPORTED_MODULE_1__.a.groupBy(e, groupFields, function (t) { + e = Array.isArray(e) ? e : []; + groupFields.length ? _assets_plugins_hinnn__WEBPACK_IMPORTED_MODULE_1__.a.groupBy(e, groupFields, function (t) { var e = {}; return groupFields.forEach(function (n) { return e[n] = t[n]; From 633fdafa6834952753fd77f3143e3bbbbb6e7c9a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <840054486@qq.com> Date: Sat, 4 Jan 2025 07:39:07 +0000 Subject: [PATCH 30/59] pub-beta 0.0.59-beta2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e48384b4..14569105 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vue-plugin-hiprint", "description": "hiprint for Vue2.x / Vue3.x 支持拖拽(分页(不分页)、表头表脚、样式设置、复制粘贴、缩放、撤销重做)生成打印模板、导出json模板数据、静默打印/获取MAC地址(借助客户端)", - "version": "0.0.59-beta1", + "version": "0.0.59-beta2", "author": "CcSimple", "license": "MIT", "main": "dist/vue-plugin-hiprint.js", From c07cf115ec427c753f1f4924e993038eafff9f7c Mon Sep 17 00:00:00 2001 From: Junior125306 <37093468+Junior125306@users.noreply.github.com> Date: Tue, 14 Jan 2025 19:18:58 +0800 Subject: [PATCH 31/59] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9F=90=E4=BA=9B?= =?UTF-8?q?=E7=89=B9=E5=AE=9A=E6=83=85=E5=86=B5=E4=B8=8B=20onload=20?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E9=87=8D=E5=A4=8D=E8=B0=83=E7=94=A8=20?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E9=87=8D=E5=A4=8D=E5=BC=B9=E5=87=BA=E6=B5=8F?= =?UTF-8?q?=E8=A7=88=E5=99=A8=E9=A2=84=E8=A7=88=E6=89=93=E5=8D=B0=E5=BC=B9?= =?UTF-8?q?=E7=AA=97=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复某些特定情况下 onload 函数重复调用 导致重复弹出浏览器预览打印弹窗的bug --- src/hiprint/plugins/jquery.hiwprint.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hiprint/plugins/jquery.hiwprint.js b/src/hiprint/plugins/jquery.hiwprint.js index eb8b0bf2..3afd0048 100644 --- a/src/hiprint/plugins/jquery.hiwprint.js +++ b/src/hiprint/plugins/jquery.hiwprint.js @@ -1,5 +1,6 @@ (function ($) { $.fn.hiwprint = function (options) { + var hasLoaded = false; var usedFrame = document.getElementById('hiwprint_iframe'); if (usedFrame) usedFrame.parentNode.removeChild(usedFrame); var opt = $.extend({}, $.fn.hiwprint.defaults, options); @@ -23,6 +24,8 @@ $iframe[0].srcdoc = '' + css + ''; $iframe[0].onload = function () { + if (hasLoaded) return; + hasLoaded = true; var printDocument = $iframe[0].contentWindow || $iframe[0].contentDocument; if (printDocument.document) printDocument = printDocument.document; if (!$iframe.attr('srcdoc')) { From 2b318a87670321e9e9d94bdf4d770fb4aa8b89c6 Mon Sep 17 00:00:00 2001 From: Xavier Date: Wed, 15 Jan 2025 15:41:43 +0800 Subject: [PATCH 32/59] Update README.md --- README.md | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 8bea8809..c27d8749 100644 --- a/README.md +++ b/README.md @@ -29,23 +29,34 @@ vue-plugin-hiprint (基于 [hiprint 2.5.4](http://hiprint.io/)) 当时只是为 由于hiprint官网最后一次更新时间为2019年【hiprint 2.5.4 是 [LGPL](#关于lgpl协议) 协议】,后在诸多使用者及反馈下进行了许多优化调整。 -[更新日志](CHANGELOG.md)(感谢各位群友支持和参与) - ## vue-plugin-hiprint [更新日志](CHANGELOG.md) -> hiprint for Vue2.x / Vue3.x (基于jQuery, 理论上应该也是支持其他框架的) -> **jQuery/uniapp** 项目 见下方 [jQuery/uniapp 项目使用](#jQuery/uniapp 项目使用) +(感谢各位群友支持和参与) + +## 关联项目矩阵 + +|项目名称| 项目地址 | 下载地址 | 描述 | +|---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------|----------------------| +|vue-plugin-hiprint| [github](https://gitee.com/CcSimple/vue-plugin-hiprint)、[gitee](https://gitee.com/CcSimple/vue-plugin-hiprint)| [npm](https://www.npmjs.com/package/vue-plugin-hiprint) | 打印设计器 | +|electron-hiprint| [github](https://gitee.com/CcSimple/electron-hiprint)、[gitee](https://gitee.com/CcSimple/electron-hiprint) | [releases](https://github.com/CcSimple/electron-hiprint/releases) | 直接打印客户端 | +|node-hiprint-transit| [github](https://github.com/Xavier9896/node-hiprint-transit)、[gitee](https://gitee.com/Xavier9896/node-hiprint-transit) | - | web与客户端中转服务 | +|uni-app-hiprint| [github](https://github.com/Xavier9896/uni-app-hiprint) | - | uni-app webview demo | + +> hiprint for Vue2.x / Vue3.x (基于jQuery, 也支持其他框架) -## 注意事项!! +> **jQuery/uniapp** 项目 见下方 [jQuery/uniapp 项目使用](#jqueryuniapp-项目使用) -- NodeJs 需要 16.x 版本 (开发使用的 16.18.1) --
    【vue-plugin-hiprint】与【hiprint.io官网】差异甚多,请忽混用!请忽混用!请忽混用!
    --
    请使用我提供的打印客户端,或者自行修改打印客户端的源码,以适配本项目的模板!
    -- 主分支是融合版本的最新代码,如果你不需要修改 hiprint 相关代码. 请使用 npm 包的方式安装. -- 使用直接客户端时,本地开发连接没问题,部署到线上出现跨域无法连接打印客户端问题: -- [线上跨域问题,请升级 https! 说明:https://www.cnblogs.com/daysme/p/15493523.html](https://www.cnblogs.com/daysme/p/15493523.html) -- 如需提交 PR 请前往 github 合并后可自动发布npm包并同步代码到 gitee -- vue-plugin-hiprint 包不包含UI界面,需要自行处理。如果想更快速引入请查看 [sv-print组件库](https://ccsimple.github.io/sv-print-docs/) +> [!IMPORTANT] +> +> **注意事项** +> - NodeJs 需要 16.x 版本 (开发使用 16.18.1) +> -
    【vue-plugin-hiprint】与【hiprint.io官网】差异甚多,请忽混用!请忽混用!请忽混用!
    +> -
    请使用项目关联的打印客户端,或者自行修改打印客户端的源码,以适配本项目的模板!
    +> - 主分支是融合版本的最新代码,如果你不需要修改 hiprint 相关代码. 请使用 npm 包的方式安装. +> - 使用直接客户端时,本地开发连接没问题,部署到线上出现跨域无法连接打印客户端问题: +> - [线上跨域问题,请升级 https! 说明:https://www.cnblogs.com/daysme/p/15493523.html](https://www.cnblogs.com/daysme/p/15493523.html) +> - 如需提交 PR 请前往 github 合并后可自动发布npm包并同步代码到 gitee +> - vue-plugin-hiprint 包不包含UI界面,需要自行处理。如果想更快速引入请查看 [sv-print组件库](https://ccsimple.github.io/sv-print-docs/) ## 快速链接 @@ -279,6 +290,10 @@ hiprintTemplate.print2({}); + + + + From 6b77c94e979a41a6be99ac32cbfaadbddea24b2a Mon Sep 17 00:00:00 2001 From: Xavier Date: Wed, 12 Feb 2025 15:43:55 +0800 Subject: [PATCH 33/59] =?UTF-8?q?build:=20=E4=BF=AE=E6=94=B9=20webpack=20?= =?UTF-8?q?=E9=85=8D=E7=BD=AE,=E8=A7=A3=E5=86=B3=20bwip-js=20demo=20?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E4=B8=A2=E5=A4=B1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vue.config.js | 1 + webpack.config.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/vue.config.js b/vue.config.js index 81425834..8eff6da7 100644 --- a/vue.config.js +++ b/vue.config.js @@ -15,6 +15,7 @@ module.exports = { let pkg = fs.readFileSync(pkgPath); pkg.dependencies = { "ant-design-vue": "^1.7.8", + "bwip-js": "^4.0.0", "core-js": "^3.6.5", "vue": "^2.5.11", "concurrent-tasks": "^1.0.7", diff --git a/webpack.config.js b/webpack.config.js index 004088f7..6ff6b6c8 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -48,7 +48,7 @@ module.exports = { "@wtto00/html2canvas": "html2canvas", canvg: 'canvg', jspdf: "jspdf", - "bwip-js": 'bwip-js', + "bwip-js": 'bwipjs', "nzh": "Nzh", }, optimization:{ From efe32d71ca12c6ab01188dab9681cdfa686ed51e Mon Sep 17 00:00:00 2001 From: Xavier Date: Thu, 6 Mar 2025 16:38:10 +0800 Subject: [PATCH 34/59] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 525 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 344 insertions(+), 181 deletions(-) diff --git a/README.md b/README.md index c27d8749..91ee93bc 100644 --- a/README.md +++ b/README.md @@ -23,11 +23,11 @@ ## 关于此插件 -vue-plugin-hiprint (基于 [hiprint 2.5.4](http://hiprint.io/)) 当时只是为了方便 我(并非hiprint原作者) 在vue项目中引入使用,所以以此命名。 +vue-plugin-hiprint (基于 [hiprint 2.5.4](http://hiprint.io/)) 当时只是为了方便 我(并非 hiprint 原作者) 在 vue 项目中引入使用,所以以此命名。 -此 插件 仅仅是一个 JavaScript【工具库】 而非 Vue【组件库】,所以它默认不包含demo中的那些组件页面(demo代码可复制使用)。 +此 插件 仅仅是一个 JavaScript【工具库】 而非 Vue【组件库】,所以它默认不包含 demo 中的那些组件页面(demo 代码可复制使用)。 -由于hiprint官网最后一次更新时间为2019年【hiprint 2.5.4 是 [LGPL](#关于lgpl协议) 协议】,后在诸多使用者及反馈下进行了许多优化调整。 +由于 hiprint 官网最后一次更新时间为 2019 年【hiprint 2.5.4 是 [LGPL](#关于lgpl协议) 协议】,后在诸多使用者及反馈下进行了许多优化调整。 ## vue-plugin-hiprint [更新日志](CHANGELOG.md) @@ -35,36 +35,39 @@ vue-plugin-hiprint (基于 [hiprint 2.5.4](http://hiprint.io/)) 当时只是为 ## 关联项目矩阵 -|项目名称| 项目地址 | 下载地址 | 描述 | -|---|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------|----------------------| -|vue-plugin-hiprint| [github](https://gitee.com/CcSimple/vue-plugin-hiprint)、[gitee](https://gitee.com/CcSimple/vue-plugin-hiprint)| [npm](https://www.npmjs.com/package/vue-plugin-hiprint) | 打印设计器 | -|electron-hiprint| [github](https://gitee.com/CcSimple/electron-hiprint)、[gitee](https://gitee.com/CcSimple/electron-hiprint) | [releases](https://github.com/CcSimple/electron-hiprint/releases) | 直接打印客户端 | -|node-hiprint-transit| [github](https://github.com/Xavier9896/node-hiprint-transit)、[gitee](https://gitee.com/Xavier9896/node-hiprint-transit) | - | web与客户端中转服务 | -|uni-app-hiprint| [github](https://github.com/Xavier9896/uni-app-hiprint) | - | uni-app webview demo | +| 项目名称 | 项目地址 | 下载地址 | 描述 | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------- | ------------------------------------------------------------------ | +| vue-plugin-hiprint | [github](https://github.com/CcSimple/vue-plugin-hiprint)、[gitee](https://gitee.com/CcSimple/vue-plugin-hiprint) | [npm](https://www.npmjs.com/package/vue-plugin-hiprint) | 打印设计器 | +| electron-hiprint | [github](https://github.com/CcSimple/electron-hiprint)、[gitee](https://gitee.com/CcSimple/electron-hiprint) | [releases](https://github.com/CcSimple/electron-hiprint/releases) | 直接打印客户端 | +| node-hiprint-transit | [github](https://github.com/Xavier9896/node-hiprint-transit)、[gitee](https://gitee.com/Xavier9896/node-hiprint-transit) | - | web 与客户端中转服务 Node 实现 | +| hiprint-transit-java | [github](https://github.com/weaponready/hiprint-transit-java) | - | web 与客户端中转服务 Java 实现 | +| uni-app-hiprint | [github](https://github.com/Xavier9896/uni-app-hiprint) | - | uni-app 项目通过 webview 使用 vue-plugin-hiprint demo | +| node-hiprint-pdf | [github](https://github.com/CcSimple/node-hiprint-pdf) | - | 提供通过 node 对 vue-plugin-hiprint 模板生成 矢量 pdf、image、html | -> hiprint for Vue2.x / Vue3.x (基于jQuery, 也支持其他框架) +> hiprint for Vue2.x / Vue3.x (基于 jQuery, 也支持其他框架) > **jQuery/uniapp** 项目 见下方 [jQuery/uniapp 项目使用](#jqueryuniapp-项目使用) > [!IMPORTANT] -> +> > **注意事项** +> > - NodeJs 需要 16.x 版本 (开发使用 16.18.1) > -
    【vue-plugin-hiprint】与【hiprint.io官网】差异甚多,请忽混用!请忽混用!请忽混用!
    > -
    请使用项目关联的打印客户端,或者自行修改打印客户端的源码,以适配本项目的模板!
    > - 主分支是融合版本的最新代码,如果你不需要修改 hiprint 相关代码. 请使用 npm 包的方式安装. > - 使用直接客户端时,本地开发连接没问题,部署到线上出现跨域无法连接打印客户端问题: > - [线上跨域问题,请升级 https! 说明:https://www.cnblogs.com/daysme/p/15493523.html](https://www.cnblogs.com/daysme/p/15493523.html) -> - 如需提交 PR 请前往 github 合并后可自动发布npm包并同步代码到 gitee -> - vue-plugin-hiprint 包不包含UI界面,需要自行处理。如果想更快速引入请查看 [sv-print组件库](https://ccsimple.github.io/sv-print-docs/) +> - 如需提交 PR 请前往 github 合并后可自动发布 npm 包并同步代码到 gitee +> - vue-plugin-hiprint 包不包含 UI 界面,需要自行处理。如果想更快速引入请查看 [sv-print 组件库](https://ccsimple.github.io/sv-print-docs/) ## 快速链接 -Demo预览:[https://ccsimple.gitee.io/vue-plugin-hiprint/](https://ccsimple.gitee.io/vue-plugin-hiprint/)(已挂,恢复看gitee官方情况) +Demo 预览:[https://ccsimple.gitee.io/vue-plugin-hiprint/](https://ccsimple.gitee.io/vue-plugin-hiprint/)(已挂,恢复看 gitee 官方情况) -Github Demo预览:[https://ccsimple.github.io/vue-plugin-hiprint/](https://ccsimple.github.io/vue-plugin-hiprint/)(慢,需翻墙) +Github Demo 预览:[https://ccsimple.github.io/vue-plugin-hiprint/](https://ccsimple.github.io/vue-plugin-hiprint/)(慢,需翻墙) -更新记录:[npm包版本及更新记录](CHANGELOG.md) +更新记录:[npm 包版本及更新记录](CHANGELOG.md) 打印客户端:[https://gitee.com/CcSimple/electron-hiprint](https://gitee.com/CcSimple/electron-hiprint) @@ -82,37 +85,49 @@ provider: [【vue-plugin-hiprint】如何自定义可拖拽元素 provider](http 参数篇: [【vue-plugin-hiprint】使用-参数篇](https://mp.weixin.qq.com/s/vfgSG62tAXn7Ot7y3x68fw) -实战动态provider: [【vue-plugin-hiprint】实战-动态provider](https://mp.weixin.qq.com/s/UVkhul1tynjaUjdC_NaHfw) +实战动态 provider: [【vue-plugin-hiprint】实战-动态 provider](https://mp.weixin.qq.com/s/UVkhul1tynjaUjdC_NaHfw) 实战动态模板: [【vue-plugin-hiprint】实战-动态模板](https://mp.weixin.qq.com/s/JXXC9Fyy_PgPXrwh1mDBTQ) -常见问题汇总①: [【vue-plugin-hiprint】常见问题汇总①](https://mp.weixin.qq.com/s/E-ZfuKLH3-GvKn4AosRvaw) +常见问题汇总 ①: [【vue-plugin-hiprint】常见问题汇总 ①](https://mp.weixin.qq.com/s/E-ZfuKLH3-GvKn4AosRvaw) -常见问题汇总②: [【vue-plugin-hiprint】常见问题汇总②](https://mp.weixin.qq.com/s/UEnr24bB_P6KmpZ7iZmYvA) +常见问题汇总 ②: [【vue-plugin-hiprint】常见问题汇总 ②](https://mp.weixin.qq.com/s/UEnr24bB_P6KmpZ7iZmYvA) -常见问题汇总③: [【vue-plugin-hiprint】常见问题汇总③](https://mp.weixin.qq.com/s/lRimQ-cjuwN3mg6RicPyag) +常见问题汇总 ③: [【vue-plugin-hiprint】常见问题汇总 ③](https://mp.weixin.qq.com/s/lRimQ-cjuwN3mg6RicPyag) ## 更多参数的文档请仔细查阅文档 -hiprint官方文档:[http://hiprint.io/docs/start](http://hiprint.io/docs/start) +hiprint 官方文档:[http://hiprint.io/docs/start](http://hiprint.io/docs/start) 本人写的部分文档: [https://ccsimple.github.io/sv-print-docs/config/hiprint.html](https://ccsimple.github.io/sv-print-docs/config/hiprint.html) ## 安装使用 + ``` npm install vue-plugin-hiprint ``` ```html - + - + - + ``` ## 项目截图 + @@ -128,20 +143,20 @@ npm install vue-plugin-hiprint
    - ## 拖拽设计使用 + ```javascript -import {hiprint,defaultElementTypeProvider} from 'vue-plugin-hiprint' +import { hiprint, defaultElementTypeProvider } from "vue-plugin-hiprint"; // 初始化可拖拽的元素 hiprint.init({ - providers: [new defaultElementTypeProvider()] -}) + providers: [new defaultElementTypeProvider()], +}); // $('.ep-draggable-item') 包含 tid, 与上边的 provider 中的 tid 对应 才能正常拖拽生成元素 -hiprint.PrintElementTypeManager.buildByHtml($('.ep-draggable-item')); +hiprint.PrintElementTypeManager.buildByHtml($(".ep-draggable-item")); hiprintTemplate = new hiprint.PrintTemplate({ template: {}, // 模板json - settingContainer: '#PrintElementOptionSetting', // 元素参数容器 - paginationContainer: '.hiprint-printPagination', // 多面板的容器, 实现多面板, 需要在添加一个
    + settingContainer: "#PrintElementOptionSetting", // 元素参数容器 + paginationContainer: ".hiprint-printPagination", // 多面板的容器, 实现多面板, 需要在添加一个
    // ------- 下列是可选功能 ------- // ------- 下列是可选功能 ------- // ------- 下列是可选功能 ------- @@ -156,13 +171,16 @@ hiprintTemplate = new hiprint.PrintTemplate({ // el.designTarget.css('width', width + "pt"); // el.designTarget.children('.resize-panel').trigger($.Event('click')); // }) - target.refresh("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtAAAAIIAQMAAAB99EudAAAABlBMVEUmf8vG2O41LStnAAABD0lEQVR42u3XQQqCQBSAYcWFS4/QUTpaHa2jdISWLUJjjMpclJoPGvq+1WsYfiJCZ4oCAAAAAAAAAAAAAAAAAHin6pL9c6H/fOzHbRrP0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0u/SY9LS0tLS0tLS0tLS0n+edm+UlpaWlpaWlpaWlpaW/tl0Ndyzbno7/+tPTJdd1wal69dNa6abx+Lq6TSeYtK7BX/Diek0XULSZZrakPRtV0i6Hu/KIt30q4fM0pvBqvR9mvsQkZaW9gyJT+f5lsnzjR54xAk8mAUeJyMPwYFH98ALx5Jr0kRLLndT7b64UX9QR/0eAAAAAAAAAAAAAAAAAAD/4gpryzr/bja4QgAAAABJRU5ErkJggg==",{ - // auto: true, // 根据图片宽高自动等比(宽>高?width:height) - // width: true, // 按宽调整高 - // height: true, // 按高调整宽 - real: true // 根据图片实际尺寸调整(转pt) - }) - }, 3000) + target.refresh( + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtAAAAIIAQMAAAB99EudAAAABlBMVEUmf8vG2O41LStnAAABD0lEQVR42u3XQQqCQBSAYcWFS4/QUTpaHa2jdISWLUJjjMpclJoPGvq+1WsYfiJCZ4oCAAAAAAAAAAAAAAAAAHin6pL9c6H/fOzHbRrP0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0u/SY9LS0tLS0tLS0tLS0n+edm+UlpaWlpaWlpaWlpaW/tl0Ndyzbno7/+tPTJdd1wal69dNa6abx+Lq6TSeYtK7BX/Diek0XULSZZrakPRtV0i6Hu/KIt30q4fM0pvBqvR9mvsQkZaW9gyJT+f5lsnzjR54xAk8mAUeJyMPwYFH98ALx5Jr0kRLLndT7b64UX9QR/0eAAAAAAAAAAAAAAAAAAD/4gpryzr/bja4QgAAAABJRU5ErkJggg==", + { + // auto: true, // 根据图片宽高自动等比(宽>高?width:height) + // width: true, // 按宽调整高 + // height: true, // 按高调整宽 + real: true, // 根据图片实际尺寸调整(转pt) + } + ); + }, 3000); // target.getValue() // target.refresh(url) }, @@ -170,46 +188,88 @@ hiprintTemplate = new hiprint.PrintTemplate({ // 或者使用 hiprintTemplate.setFontList([]) // 或元素中 options.fontList: [] fontList: [ - {title: '微软雅黑', value: 'Microsoft YaHei'}, - {title: '黑体', value: 'STHeitiSC-Light'}, - {title: '思源黑体', value: 'SourceHanSansCN-Normal'}, - {title: '王羲之书法体', value: '王羲之书法体'}, - {title: '宋体', value: 'SimSun'}, - {title: '华为楷体', value: 'STKaiti'}, - {title: 'cursive', value: 'cursive'}, + { title: "微软雅黑", value: "Microsoft YaHei" }, + { title: "黑体", value: "STHeitiSC-Light" }, + { title: "思源黑体", value: "SourceHanSansCN-Normal" }, + { title: "王羲之书法体", value: "王羲之书法体" }, + { title: "宋体", value: "SimSun" }, + { title: "华为楷体", value: "STKaiti" }, + { title: "cursive", value: "cursive" }, ], dataMode: 1, // 1:getJson 其他:getJsonTid 默认1 history: true, // 是否需要 撤销重做功能 - onDataChanged: (type, json) => { // 模板发生改变回调 + onDataChanged: (type, json) => { + // 模板发生改变回调 console.log(type); // 新增、移动、删除、修改(参数调整)、大小、旋转 console.log(json); // 返回 template }, - onUpdateError: (e) => { // 更新失败回调 + onUpdateError: (e) => { + // 更新失败回调 console.log(e); }, }); // 设计器的容器 -hiprintTemplate.design('#hiprint-printTemplate'); +hiprintTemplate.design("#hiprint-printTemplate"); ``` ## 代码模式使用 ```javascript -import {hiprint, defaultElementTypeProvider} from 'vue-plugin-hiprint' +import { hiprint, defaultElementTypeProvider } from "vue-plugin-hiprint"; // 引入后使用示例 hiprint.init(); // 下列方法都是没有拖拽设计页面的, 相当于代码模式, 使用代码设计页面 // 想要实现拖拽设计页面,请往下看 '自定义设计' var hiprintTemplate = new hiprint.PrintTemplate(); -var panel = hiprintTemplate.addPrintPanel({ width: 100, height: 130, paperFooter: 340, paperHeader: 10 }); +var panel = hiprintTemplate.addPrintPanel({ + width: 100, + height: 130, + paperFooter: 340, + paperHeader: 10, +}); //文本 -panel.addPrintText({ options: { width: 140, height: 15, top: 20, left: 20, title: 'hiprint插件手动添加text', textAlign: 'center' } }); +panel.addPrintText({ + options: { + width: 140, + height: 15, + top: 20, + left: 20, + title: "hiprint插件手动添加text", + textAlign: "center", + }, +}); //条形码 -panel.addPrintText({ options: { width: 140, height: 35, top: 40, left: 20, title: '123456', textType: 'barcode' } }); +panel.addPrintText({ + options: { + width: 140, + height: 35, + top: 40, + left: 20, + title: "123456", + textType: "barcode", + }, +}); //二维码 -panel.addPrintText({ options: { width: 35, height: 35, top: 40, left: 165, title: '123456', textType: 'qrcode' } }); +panel.addPrintText({ + options: { + width: 35, + height: 35, + top: 40, + left: 165, + title: "123456", + textType: "qrcode", + }, +}); //长文本 -panel.addPrintLongText({ options: { width: 180, height: 35, top: 90, left: 20, title: '长文本:hiprint是一个很好的webjs打印,浏览器在的地方他都可以运行' } }); +panel.addPrintLongText({ + options: { + width: 180, + height: 35, + top: 90, + left: 20, + title: "长文本:hiprint是一个很好的webjs打印,浏览器在的地方他都可以运行", + }, +}); //打印 hiprintTemplate.print({}); ``` @@ -222,7 +282,7 @@ hiprintTemplate.print({}); ```js hiprint.init({ - lang: 'en', // 设置语言 ['cn', 'en', 'de', 'es', 'fr', 'it', 'ja', 'ru', 'cn_tw'] + lang: "en", // 设置语言 ['cn', 'en', 'de', 'es', 'fr', 'it', 'ja', 'ru', 'cn_tw'] }); ``` @@ -230,8 +290,8 @@ hiprint.init({ ```js hiprint.init({ - host: 'http://localhost:17521/', // 可在此处设置连接地址与端口号 - token: 'token', // 可在此处设置连接 token 可缺省 + host: "http://localhost:17521/", // 可在此处设置连接地址与端口号 + token: "token", // 可在此处设置连接 token 可缺省 }); ``` @@ -241,8 +301,8 @@ hiprint.init({ ```javascript // main.js中 引入安装 -import {hiPrintPlugin} from 'vue-plugin-hiprint' -Vue.use(hiPrintPlugin, '$pluginName') +import { hiPrintPlugin } from "vue-plugin-hiprint"; +Vue.use(hiPrintPlugin, "$pluginName"); hiPrintPlugin.disAutoConnect(); // 取消自动连接直接打印客户端 // 下列代码为示例,不要再 main.js中 使用 @@ -251,19 +311,69 @@ this.$pluginName.init(); // 下列方法都是没有拖拽设计页面的, 相当于代码模式, 使用代码设计页面 // 想要实现拖拽设计页面,请往下看 '自定义设计' var hiprintTemplate = new this.$pluginName.PrintTemplate(); -var panel = hiprintTemplate.addPrintPanel({ width: 100, height: 130, paperFooter: 340, paperHeader: 10 }); +var panel = hiprintTemplate.addPrintPanel({ + width: 100, + height: 130, + paperFooter: 340, + paperHeader: 10, +}); //文本 -panel.addPrintText({ options: { width: 140, height: 15, top: 20, left: 20, title: 'hiprint插件手动添加text', textAlign: 'center' } }); +panel.addPrintText({ + options: { + width: 140, + height: 15, + top: 20, + left: 20, + title: "hiprint插件手动添加text", + textAlign: "center", + }, +}); //条形码 -panel.addPrintText({ options: { width: 140, height: 35, top: 40, left: 20, title: '123456', textType: 'barcode' } }); +panel.addPrintText({ + options: { + width: 140, + height: 35, + top: 40, + left: 20, + title: "123456", + textType: "barcode", + }, +}); //二维码 -panel.addPrintText({ options: { width: 35, height: 35, top: 40, left: 165, title: '123456', textType: 'qrcode' } }); +panel.addPrintText({ + options: { + width: 35, + height: 35, + top: 40, + left: 165, + title: "123456", + textType: "qrcode", + }, +}); //长文本 -panel.addPrintLongText({ options: { width: 180, height: 35, top: 90, left: 20, title: '长文本:hiprint是一个很好的webjs打印,浏览器在的地方他都可以运行' } }); +panel.addPrintLongText({ + options: { + width: 180, + height: 35, + top: 90, + left: 20, + title: "长文本:hiprint是一个很好的webjs打印,浏览器在的地方他都可以运行", + }, +}); //表格 -panel.addPrintTable({ options: { width: 252, height: 35, top: 130, left: 20, content: $('#testTable').html() } }); +panel.addPrintTable({ + options: { + width: 252, + height: 35, + top: 130, + left: 20, + content: $("#testTable").html(), + }, +}); //Html -panel.addPrintHtml({ options: { width: 140, height: 35, top: 180, left: 20, content:'' } }); +panel.addPrintHtml({ + options: { width: 140, height: 35, top: 180, left: 20, content: "" }, +}); //竖线//不设置宽度 panel.addPrintVline({ options: { height: 35, top: 230, left: 20 } }); //横线 //不设置高度 @@ -283,44 +393,51 @@ hiprintTemplate.print2({}); ```html - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - + + ``` ## 配套直接打印客户端(win/mac/linux)[源码链接](https://gitee.com/CcSimple/electron-hiprint) +
    如果使用npm包或者本项目,请使用如下样子的直接打印客户端
    @@ -332,6 +449,7 @@ hiprintTemplate.print2({}); > [https://gitee.com/CcSimple/electron-hiprint/releases](https://gitee.com/CcSimple/electron-hiprint/releases) ### URLScheme `hiprint://` + > 安装客户端时请 `以管理员身份运行` ,才能成功添加 URLScheme 使用:浏览器地址栏输入 `hiprint://` 并回车 @@ -340,10 +458,14 @@ hiprintTemplate.print2({}); ```js // js -window.open("hiprint://") +window.open("hiprint://"); // element-ui -this.$alert(`连接【${hiwebSocket.host}】失败!
    请确保目标服务器已 下载 运行 打印服务!`, "客户端未连接", {dangerouslyUseHtmlString: true}) +this.$alert( + `连接【${hiwebSocket.host}】失败!
    请确保目标服务器已 下载 运行 打印服务!`, + "客户端未连接", + { dangerouslyUseHtmlString: true } +); // ant-design this.$error({ @@ -358,8 +480,7 @@ this.$error({ target="_blank" > 下载 - - 并 + 并 运行 @@ -376,16 +497,16 @@ this.$error({ 连接中转服务只需要修改 host, 添加 token ```js -import { hiprint } from 'vue-plugin-hiprint' +import { hiprint } from "vue-plugin-hiprint"; hiprint.init({ - host: 'https://v4.printjs.cn:17521/', // 此处输入服务启动后的地址 - token: 'hiprint-17521', // 用于鉴权的token,hiprint* (*可替换为[0-9a-zA-Z\-_]字符) + host: "https://v4.printjs.cn:17521/", // 此处输入服务启动后的地址 + token: "hiprint-17521", // 用于鉴权的token,hiprint* (*可替换为[0-9a-zA-Z\-_]字符) }); // or -hiwebSocket.setHost("https://printjs.cn:17521/", "vue-plugin-hiprint") +hiwebSocket.setHost("https://printjs.cn:17521/", "vue-plugin-hiprint"); ``` 具体使用请转至 [node-hiprint-transit](https://github.com/Xavier9896/node-hiprint-transit) @@ -395,29 +516,40 @@ hiwebSocket.setHost("https://printjs.cn:17521/", "vue-plugin-hiprint") 1. 你可以从 `hiwebSocket` 中获取到 `clients`、`printerList` ,里面都将包含 `client` 信息 2. print2、ippRequest、ippRequest api options 中需要添加 `client` 指定客户端 - eg: - ```js - var clientId = "AlBaUCNs3AIMFPLZAAAh" - var client = hiwebSocket.clients[clientId] - var printer = hiwebSocket.printerList[0] + eg: + + ```js + var clientId = "AlBaUCNs3AIMFPLZAAAh"; + var client = hiwebSocket.clients[clientId]; + var printer = hiwebSocket.printerList[0]; - hiprintTemplate.print2(printData, { client: clientId, printer: client.printerList[n].name, title: 'hiprint测试打印' }); + hiprintTemplate.print2(printData, { + client: clientId, + printer: client.printerList[n].name, + title: "hiprint测试打印", + }); - hiprintTemplate.print2(printData, { client: printer.clientId, printer: printer.name, title: 'hiprint测试打印' }); - ``` - > 如果你不提供 client 中转服务将抛出一个 error + hiprintTemplate.print2(printData, { + client: printer.clientId, + printer: printer.name, + title: "hiprint测试打印", + }); + ``` + + > 如果你不提供 client 中转服务将抛出一个 error ## 常见问题 > 可能花几分钟读一读下面的文章就能找到你遇到的问题: -常见问题汇总①: [【vue-plugin-hiprint】常见问题汇总①](https://mp.weixin.qq.com/s/E-ZfuKLH3-GvKn4AosRvaw) +常见问题汇总 ①: [【vue-plugin-hiprint】常见问题汇总 ①](https://mp.weixin.qq.com/s/E-ZfuKLH3-GvKn4AosRvaw) + +常见问题汇总 ②: [【vue-plugin-hiprint】常见问题汇总 ②](https://mp.weixin.qq.com/s/UEnr24bB_P6KmpZ7iZmYvA) -常见问题汇总②: [【vue-plugin-hiprint】常见问题汇总②](https://mp.weixin.qq.com/s/UEnr24bB_P6KmpZ7iZmYvA) +常见问题汇总 ③: [【vue-plugin-hiprint】常见问题汇总 ③](https://mp.weixin.qq.com/s/lRimQ-cjuwN3mg6RicPyag) -常见问题汇总③: [【vue-plugin-hiprint】常见问题汇总③](https://mp.weixin.qq.com/s/lRimQ-cjuwN3mg6RicPyag) +> design 时怎么修改默认图片? -> design时怎么修改默认图片? ```vue ``` + > print/print2 打印回调 + ```javascript // 浏览器预览打印 -hiprintTemplate.print(this.printData, {}, { - callback: () => { - console.log('浏览器打印窗口已打开') +hiprintTemplate.print( + this.printData, + {}, + { + callback: () => { + console.log("浏览器打印窗口已打开"); + }, } -}) +); // 直接打印 // 打印机名称: 通过 hiprintTemplate.getPrinterList() 获取 其中的 name -hiprintTemplate.print2(printData, {printer: '打印机名称', title: '打印标题'}) -hiprintTemplate.on('printSuccess', function (data) { - console.log('打印完成') -}) -hiprintTemplate.on('printError', function (data) { - console.log('打印失败') -}) +hiprintTemplate.print2(printData, { printer: "打印机名称", title: "打印标题" }); +hiprintTemplate.on("printSuccess", function (data) { + console.log("打印完成"); +}); +hiprintTemplate.on("printError", function (data) { + console.log("打印失败"); +}); ``` + > 大量单据连续打印 ⬆️ v0.0.57-beta28 + ```javascript hiprintTemplate.print2(printDataList, { - printer: '打印机名称', - title: '打印标题', - printByFragments: true, // 是否需要分批打印,分批打印能够支持连续打印大量数据,但会增加打印所需时间 + printer: "打印机名称", + title: "打印标题", + printByFragments: true, // 是否需要分批打印,分批打印能够支持连续打印大量数据,但会增加打印所需时间 generateHTMLInterval: 30, // 多条数据生成HTML的间隔,单位ms,默认是10 - fragmentSize: 10000, // 分片字符长度,默认50000 + fragmentSize: 10000, // 分片字符长度,默认50000 sendInterval: 20, // 分片传输间隔,单位ms,默认10 -}) +}); ``` + > 打印重叠 / 样式问题 ⬆️ v0.0.19 + ```javascript /** * 从 在index.html添加: @@ -479,70 +621,83 @@ hiprintTemplate.print2(printDataList, { */ // 添加自定义样式 -hiprintTemplate.print(this.printData, {}, { - styleHandler: () => { - // 这里拼接成放html->head标签内的css/style - // 1.例如:使用hiprin官网的样式 - let css = '' - // 2.重写样式:所有文本红色 - css += '' - return css +hiprintTemplate.print( + this.printData, + {}, + { + styleHandler: () => { + // 这里拼接成放html->head标签内的css/style + // 1.例如:使用hiprin官网的样式 + let css = + ''; + // 2.重写样式:所有文本红色 + css += ""; + return css; + }, } -}) +); // 直接打印 hiprintTemplate.print2(this.printData, { styleHandler: () => { // 这里拼接成放html->head标签内的css/style // 1.例如:使用hiprin官网的样式 - let css = '' + let css = + ''; // 2.重写样式:所有文本红色 - css += '' - return css - } -}) + css += ""; + return css; + }, +}); ``` + > 修改默认配置 / 显示/隐藏元素设置参数 ⬆️ v0.0.13 + ```javascript // 新增setConfig方法 // 还原配置 -hiprint.setConfig() +hiprint.setConfig(); // 替换配置 hiprint.setConfig({ movingDistance: 2.5, - text:{ + text: { supportOptions: [ { - name: 'styler', - hidden: true + name: "styler", + hidden: true, }, { - name: 'formatter', - hidden: true + name: "formatter", + hidden: true, }, - ] - } -}) + ], + }, +}); ``` -> 取消自动socket连接 / socket连接报错问题 + +> 取消自动 socket 连接 / socket 连接报错问题 + ```javascript /** * 取消自动连接 */ // 在main.js中设置 -import {hiPrintPlugin} from 'vue-plugin-hiprint' -Vue.use(hiPrintPlugin,'$hiprint', false); +import { hiPrintPlugin } from "vue-plugin-hiprint"; +Vue.use(hiPrintPlugin, "$hiprint", false); // hiPrintPlugin 同时提供了 disAutoConnect 方法 hiPrintPlugin.disAutoConnect(); // 在组件中使用 见: demo/design/index.vue -import {disAutoConnect, autoConnect, hiprint} from 'vue-plugin-hiprint' +import { disAutoConnect, autoConnect, hiprint } from "vue-plugin-hiprint"; disAutoConnect(); // 同时 export了 autoConnect,disAutoConnect 方法 /** * 连接回调及打印 */ -autoConnect((status,msg) => { +autoConnect((status, msg) => { if (status) { - hiprintTemplate.print2(printData, {printer: '', title: 'hiprint测试打印'}); + hiprintTemplate.print2(printData, { + printer: "", + title: "hiprint测试打印", + }); } }); /** @@ -554,6 +709,7 @@ autoConnect((status,msg) => { ``` ## 参与项目 + ```console git clone https://gitee.com/CcSimple/vue-plugin-hiprint.git // init @@ -564,21 +720,24 @@ npm run serve // 打包 npm run build ``` -## demo调试(显示打印iframe) + +## demo 调试(显示打印 iframe) + ```javascript // 快速显示/隐藏 打印iframe 方便调试  ̄□ ̄|| // 在浏览器控制台输入: // 显示打印页面 -$('#app').css('display','none'); -$('#hiwprint_iframe').css('visibility','visible'); -$('#hiwprint_iframe').css('width','100%'); -$('#hiwprint_iframe').css('height','251.09mm'); // 这里替换个实际高度才能显示完 +$("#app").css("display", "none"); +$("#hiwprint_iframe").css("visibility", "visible"); +$("#hiwprint_iframe").css("width", "100%"); +$("#hiwprint_iframe").css("height", "251.09mm"); // 这里替换个实际高度才能显示完 // 显示vue页面 -$('#app').css('display','block'); -$('#hiwprint_iframe').css('visibility','hidden'); +$("#app").css("display", "block"); +$("#hiwprint_iframe").css("visibility", "hidden"); ``` ## 交流群 + @@ -586,11 +745,11 @@ $('#hiwprint_iframe').css('visibility','hidden');
    -> 群人数已超过200 请 '加我好友' 备注加群, 邀你进群 +> 群人数已超过 200 请 '加我好友' 备注加群, 邀你进群 -## 捐赠支持, 或者请我喝杯咖啡☕️ +## 捐赠支持, 或者请我喝杯咖啡 ☕️ -> 如果对您有帮助,请点击右上角⭐Star关注或扫码捐赠,感谢支持开源! +> 如果对您有帮助,请点击右上角 ⭐Star 关注或扫码捐赠,感谢支持开源! @@ -606,24 +765,28 @@ $('#hiwprint_iframe').css('visibility','hidden'); [![Star History Chart](https://api.star-history.com/svg?repos=CcSimple/vue-plugin-hiprint&type=Date)](https://star-history.com/#CcSimple/vue-plugin-hiprint&Date) ## 分支说明 -> main: vue2.x + ant1.7.x融合版 及 npm包源代码 -> npm_demo: vue2.x + ant1.7.x + npm包使用 示例 +> main: vue2.x + ant1.7.x 融合版 及 npm 包源代码 + +> npm_demo: vue2.x + ant1.7.x + npm 包使用 示例 -> npm_demo_ele: vue2.x + ElementUi 2.x + npm包使用 示例 +> npm_demo_ele: vue2.x + ElementUi 2.x + npm 包使用 示例 -> npm_demo_v3: vue3.x + vite + npm包(0.0.18)使用 示例 +> npm_demo_v3: vue3.x + vite + npm 包(0.0.18)使用 示例 ## 关于如何融合处理 + > 自己融合请查看 vue.config.js 对比 hiprint.bundle.js -> webpack.config.js,是npm打包需要处理的 +> webpack.config.js,是 npm 打包需要处理的 ## 开源使用说明 -> npm包是基于hiprint官网2.5.4版本基础做的调整及优化;
    + +> npm 包是基于 hiprint 官网 2.5.4 版本基础做的调整及优化;
    > 本人对开源协议理解有限,如有侵权不合理的地方,请联系告知我;
    hiprint 开源协议如下: + ``` /** * jQuery Hiprint 2.5.4 @@ -636,7 +799,7 @@ hiprint 开源协议如下: */ ``` -## 关于LGPL协议 +## 关于 LGPL 协议 ``` LGPL是GPL的一个为主要为类库使用设计的开源协议。和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同。 From ed098e7452a6cfaa1985dc4d76293269469c4965 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <840054486@qq.com> Date: Thu, 20 Mar 2025 08:24:10 +0000 Subject: [PATCH 35/59] pub-beta 0.0.59-beta3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 14569105..5a763337 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vue-plugin-hiprint", "description": "hiprint for Vue2.x / Vue3.x 支持拖拽(分页(不分页)、表头表脚、样式设置、复制粘贴、缩放、撤销重做)生成打印模板、导出json模板数据、静默打印/获取MAC地址(借助客户端)", - "version": "0.0.59-beta2", + "version": "0.0.59-beta3", "author": "CcSimple", "license": "MIT", "main": "dist/vue-plugin-hiprint.js", From 7cb56f57d1de5d64e37ac25151a7cea0e357b30d Mon Sep 17 00:00:00 2001 From: Cc <840054486@qq.com> Date: Thu, 20 Mar 2025 16:38:23 +0800 Subject: [PATCH 36/59] =?UTF-8?q?=E8=B0=83=E6=95=B4=20engines=20node=20>?= =?UTF-8?q?=3D16?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5a763337..389db610 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "pub-beta": "npm run build && npm --registry https://registry.npmjs.org/ publish --tag beta" }, "engines": { - "node": "16.x" + "node": ">=16" }, "browserslist": [ "> 1%", From 6eca1b77ef6a07ecf615db3ecaf5d947532a3747 Mon Sep 17 00:00:00 2001 From: Cc <840054486@qq.com> Date: Thu, 20 Mar 2025 17:34:47 +0800 Subject: [PATCH 37/59] update README.md --- README.md | 520 +++++++++++++++++++----------------------------------- 1 file changed, 186 insertions(+), 334 deletions(-) diff --git a/README.md b/README.md index 91ee93bc..e100f378 100644 --- a/README.md +++ b/README.md @@ -29,24 +29,15 @@ vue-plugin-hiprint (基于 [hiprint 2.5.4](http://hiprint.io/)) 当时只是为 由于 hiprint 官网最后一次更新时间为 2019 年【hiprint 2.5.4 是 [LGPL](#关于lgpl协议) 协议】,后在诸多使用者及反馈下进行了许多优化调整。 -## vue-plugin-hiprint [更新日志](CHANGELOG.md) +## vue-plugin-hiprint -(感谢各位群友支持和参与) +> [✨立即体验](https://ccsimple.github.io/vue-plugin-hiprint/)

    [🌈更新日志](CHANGELOG.md)

    [🐛常见问题(入门必看!)](#常见问题) ⚠️⚠️ [📕系列教程文章(入门必看!)](#常见问题)

    [🚀项目生态(打印客户端、node服务端、uniapp)](#插件生态) -## 关联项目矩阵 +> [🔥🔥🔥1.征集模板、2.admin模板集成示例、3.插件集成; ==> 点我🔥🔥🔥](#交流群) -| 项目名称 | 项目地址 | 下载地址 | 描述 | -| -------------------- | ------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------- | ------------------------------------------------------------------ | -| vue-plugin-hiprint | [github](https://github.com/CcSimple/vue-plugin-hiprint)、[gitee](https://gitee.com/CcSimple/vue-plugin-hiprint) | [npm](https://www.npmjs.com/package/vue-plugin-hiprint) | 打印设计器 | -| electron-hiprint | [github](https://github.com/CcSimple/electron-hiprint)、[gitee](https://gitee.com/CcSimple/electron-hiprint) | [releases](https://github.com/CcSimple/electron-hiprint/releases) | 直接打印客户端 | -| node-hiprint-transit | [github](https://github.com/Xavier9896/node-hiprint-transit)、[gitee](https://gitee.com/Xavier9896/node-hiprint-transit) | - | web 与客户端中转服务 Node 实现 | -| hiprint-transit-java | [github](https://github.com/weaponready/hiprint-transit-java) | - | web 与客户端中转服务 Java 实现 | -| uni-app-hiprint | [github](https://github.com/Xavier9896/uni-app-hiprint) | - | uni-app 项目通过 webview 使用 vue-plugin-hiprint demo | -| node-hiprint-pdf | [github](https://github.com/CcSimple/node-hiprint-pdf) | - | 提供通过 node 对 vue-plugin-hiprint 模板生成 矢量 pdf、image、html | - -> hiprint for Vue2.x / Vue3.x (基于 jQuery, 也支持其他框架) +> hiprint for Vue2.x / Vue3.x (基于 jQuery, 理论上其他框架可用。[react demo 分支](https://github.com/CcSimple/vue-plugin-hiprint/tree/react_demo)) -> **jQuery/uniapp** 项目 见下方 [jQuery/uniapp 项目使用](#jqueryuniapp-项目使用) +> **jQuery/uniapp (html/h5)** 项目 见下方 [jQuery/uniapp 项目使用](#jqueryuniapp-项目使用) > [!IMPORTANT] > @@ -61,18 +52,6 @@ vue-plugin-hiprint (基于 [hiprint 2.5.4](http://hiprint.io/)) 当时只是为 > - 如需提交 PR 请前往 github 合并后可自动发布 npm 包并同步代码到 gitee > - vue-plugin-hiprint 包不包含 UI 界面,需要自行处理。如果想更快速引入请查看 [sv-print 组件库](https://ccsimple.github.io/sv-print-docs/) -## 快速链接 - -Demo 预览:[https://ccsimple.gitee.io/vue-plugin-hiprint/](https://ccsimple.gitee.io/vue-plugin-hiprint/)(已挂,恢复看 gitee 官方情况) - -Github Demo 预览:[https://ccsimple.github.io/vue-plugin-hiprint/](https://ccsimple.github.io/vue-plugin-hiprint/)(慢,需翻墙) - -更新记录:[npm 包版本及更新记录](CHANGELOG.md) - -打印客户端:[https://gitee.com/CcSimple/electron-hiprint](https://gitee.com/CcSimple/electron-hiprint) - -中转服务:[https://github.com/Xavier9896/node-hiprint-transit](https://github.com/Xavier9896/node-hiprint-transit) - ## 文章链接 入门篇: [【vue-plugin-hiprint】使用-入门篇](https://mp.weixin.qq.com/s/4N4f7CkxodA-fuTJ_FbkOQ) @@ -95,9 +74,7 @@ provider: [【vue-plugin-hiprint】如何自定义可拖拽元素 provider](http 常见问题汇总 ③: [【vue-plugin-hiprint】常见问题汇总 ③](https://mp.weixin.qq.com/s/lRimQ-cjuwN3mg6RicPyag) -## 更多参数的文档请仔细查阅文档 - -hiprint 官方文档:[http://hiprint.io/docs/start](http://hiprint.io/docs/start) +hiprint官方文档(看基础,与本项目有较多差异):[http://hiprint.io/docs/start](http://hiprint.io/docs/start) 本人写的部分文档: [https://ccsimple.github.io/sv-print-docs/config/hiprint.html](https://ccsimple.github.io/sv-print-docs/config/hiprint.html) @@ -143,7 +120,7 @@ npm install vue-plugin-hiprint
    -## 拖拽设计使用 +## 拖拽设计使用(推荐) ```javascript import { hiprint, defaultElementTypeProvider } from "vue-plugin-hiprint"; @@ -212,14 +189,13 @@ hiprintTemplate = new hiprint.PrintTemplate({ hiprintTemplate.design("#hiprint-printTemplate"); ``` -## 代码模式使用 +## 代码模式使用(不推荐) ```javascript import { hiprint, defaultElementTypeProvider } from "vue-plugin-hiprint"; // 引入后使用示例 hiprint.init(); // 下列方法都是没有拖拽设计页面的, 相当于代码模式, 使用代码设计页面 -// 想要实现拖拽设计页面,请往下看 '自定义设计' var hiprintTemplate = new hiprint.PrintTemplate(); var panel = hiprintTemplate.addPrintPanel({ width: 100, @@ -274,116 +250,24 @@ panel.addPrintLongText({ hiprintTemplate.print({}); ``` -## i18n 设置 ⬆️ 0.0.55-beta8 - -原生为简体中文,英语、德语、西班牙语、法语、意大利语、日语、俄语、繁体中文皆为 AI 机翻,欢迎帮助 [订正](https://github.com/CcSimple/vue-plugin-hiprint/tree/main/src/i18n)。 - -可在 init 时传入语言进行设置,默认为 `cn` 。 - -```js -hiprint.init({ - lang: "en", // 设置语言 ['cn', 'en', 'de', 'es', 'fr', 'it', 'ja', 'ru', 'cn_tw'] -}); -``` - -## 直接打印 地址端口 与 Token 设置 - -```js -hiprint.init({ - host: "http://localhost:17521/", // 可在此处设置连接地址与端口号 - token: "token", // 可在此处设置连接 token 可缺省 -}); -``` - ## vue/vue3 全局引入 -> 全局引入,方便在任何地方不引入直接调用打印。示例为代码模式 (拖拽设计请往下看) +> 全局引入,方便在任何地方不引入直接调用打印 ```javascript // main.js中 引入安装 import { hiPrintPlugin } from "vue-plugin-hiprint"; -Vue.use(hiPrintPlugin, "$pluginName"); -hiPrintPlugin.disAutoConnect(); // 取消自动连接直接打印客户端 +Vue.use(hiPrintPlugin, "$pluginName");// $pluginName 为自定义名称 +hiPrintPlugin.disAutoConnect(); -// 下列代码为示例,不要再 main.js中 使用 -// 引入后使用示例 -this.$pluginName.init(); -// 下列方法都是没有拖拽设计页面的, 相当于代码模式, 使用代码设计页面 -// 想要实现拖拽设计页面,请往下看 '自定义设计' -var hiprintTemplate = new this.$pluginName.PrintTemplate(); -var panel = hiprintTemplate.addPrintPanel({ - width: 100, - height: 130, - paperFooter: 340, - paperHeader: 10, -}); -//文本 -panel.addPrintText({ - options: { - width: 140, - height: 15, - top: 20, - left: 20, - title: "hiprint插件手动添加text", - textAlign: "center", - }, -}); -//条形码 -panel.addPrintText({ - options: { - width: 140, - height: 35, - top: 40, - left: 20, - title: "123456", - textType: "barcode", - }, -}); -//二维码 -panel.addPrintText({ - options: { - width: 35, - height: 35, - top: 40, - left: 165, - title: "123456", - textType: "qrcode", - }, -}); -//长文本 -panel.addPrintLongText({ - options: { - width: 180, - height: 35, - top: 90, - left: 20, - title: "长文本:hiprint是一个很好的webjs打印,浏览器在的地方他都可以运行", - }, -}); -//表格 -panel.addPrintTable({ - options: { - width: 252, - height: 35, - top: 130, - left: 20, - content: $("#testTable").html(), - }, -}); -//Html -panel.addPrintHtml({ - options: { width: 140, height: 35, top: 180, left: 20, content: "" }, -}); -//竖线//不设置宽度 -panel.addPrintVline({ options: { height: 35, top: 230, left: 20 } }); -//横线 //不设置高度 -panel.addPrintHline({ options: { width: 140, top: 245, left: 120 } }); -//矩形 -panel.addPrintRect({ options: { width: 35, height: 35, top: 230, left: 60 } }); -//打印 -hiprintTemplate.print({}); -//直接打印,需要安装客户端 -hiprintTemplate.print2({}); +/// 提供的全局方法: + +/// provider 可为null args: 同模板对应调用 print 方法 + +// 1. 打印 +this.$pluginName.print(provider, templateJson, ...args); +// 2. 直接打印 +this.$pluginName.print2(provider, templateJson, ...args); ``` ## jQuery/uniapp 项目使用 @@ -393,7 +277,7 @@ hiprintTemplate.print2({}); ```html - + ``` -## 配套直接打印客户端(win/mac/linux)[源码链接](https://gitee.com/CcSimple/electron-hiprint) - -
    如果使用npm包或者本项目,请使用如下样子的直接打印客户端
    -
    - -![image](./res/tool.jpeg) - -
    -
    本项目需要上面样式的直接打印客户端; 下载地址:
    - -> [https://gitee.com/CcSimple/electron-hiprint/releases](https://gitee.com/CcSimple/electron-hiprint/releases) - -### URLScheme `hiprint://` - -> 安装客户端时请 `以管理员身份运行` ,才能成功添加 URLScheme - -使用:浏览器地址栏输入 `hiprint://` 并回车 - -![URLScheme](./res/URLScheme.png) - -```js -// js -window.open("hiprint://"); - -// element-ui -this.$alert( - `连接【${hiwebSocket.host}】失败!
    请确保目标服务器已 下载 运行 打印服务!`, - "客户端未连接", - { dangerouslyUseHtmlString: true } -); - -// ant-design -this.$error({ - title: "客户端未连接", - content: (h) => ( -
    - 连接【{hiwebSocket.host}】失败! -
    - 请确保目标服务器已 - - 下载 - 并 - - 运行 - - 打印服务! -
    - ), -}); -``` - -## 使用 [中转服务 node-hiprint-transit](https://github.com/Xavier9896/node-hiprint-transit) 实现代理 - -配套客户端打印一直存在跨域、无法连接局域网其余打印机、跨网段无法连接的问题,所以诞生了这个中转代理服务。在 `electron-hiprint` [v1.0.0.7](https://gitee.com/CcSimple/electron-hiprint/releases) 版本中添加了连接中转服务代理的设置,将会在 `electron-hiprint` 与 `node-hiprint-transit` 间建立通信,`vue-plugin-hiprint` 只需连接中转服务就能获取到所有连接中转服务的打印端信息,并且选择任意打印机进行打印。 - -连接中转服务只需要修改 host, 添加 token - -```js -import { hiprint } from "vue-plugin-hiprint"; - -hiprint.init({ - host: "https://v4.printjs.cn:17521/", // 此处输入服务启动后的地址 - token: "hiprint-17521", // 用于鉴权的token,hiprint* (*可替换为[0-9a-zA-Z\-_]字符) -}); - -// or - -hiwebSocket.setHost("https://printjs.cn:17521/", "vue-plugin-hiprint"); -``` - -具体使用请转至 [node-hiprint-transit](https://github.com/Xavier9896/node-hiprint-transit) - -为此你需要作出这些改变: - -1. 你可以从 `hiwebSocket` 中获取到 `clients`、`printerList` ,里面都将包含 `client` 信息 -2. print2、ippRequest、ippRequest api options 中需要添加 `client` 指定客户端 - - eg: - - ```js - var clientId = "AlBaUCNs3AIMFPLZAAAh"; - var client = hiwebSocket.clients[clientId]; - var printer = hiwebSocket.printerList[0]; - - hiprintTemplate.print2(printData, { - client: clientId, - printer: client.printerList[n].name, - title: "hiprint测试打印", - }); - - hiprintTemplate.print2(printData, { - client: printer.clientId, - printer: printer.name, - title: "hiprint测试打印", - }); - ``` - - > 如果你不提供 client 中转服务将抛出一个 error - ## 常见问题 -> 可能花几分钟读一读下面的文章就能找到你遇到的问题: - -常见问题汇总 ①: [【vue-plugin-hiprint】常见问题汇总 ①](https://mp.weixin.qq.com/s/E-ZfuKLH3-GvKn4AosRvaw) - -常见问题汇总 ②: [【vue-plugin-hiprint】常见问题汇总 ②](https://mp.weixin.qq.com/s/UEnr24bB_P6KmpZ7iZmYvA) - -常见问题汇总 ③: [【vue-plugin-hiprint】常见问题汇总 ③](https://mp.weixin.qq.com/s/lRimQ-cjuwN3mg6RicPyag) - -> design 时怎么修改默认图片? - -```vue - - - - - -``` - -> print/print2 打印回调 - -```javascript -// 浏览器预览打印 -hiprintTemplate.print( - this.printData, - {}, - { - callback: () => { - console.log("浏览器打印窗口已打开"); - }, - } -); -// 直接打印 -// 打印机名称: 通过 hiprintTemplate.getPrinterList() 获取 其中的 name -hiprintTemplate.print2(printData, { printer: "打印机名称", title: "打印标题" }); -hiprintTemplate.on("printSuccess", function (data) { - console.log("打印完成"); -}); -hiprintTemplate.on("printError", function (data) { - console.log("打印失败"); -}); -``` - -> 大量单据连续打印 ⬆️ v0.0.57-beta28 - -```javascript -hiprintTemplate.print2(printDataList, { - printer: "打印机名称", - title: "打印标题", - printByFragments: true, // 是否需要分批打印,分批打印能够支持连续打印大量数据,但会增加打印所需时间 - generateHTMLInterval: 30, // 多条数据生成HTML的间隔,单位ms,默认是10 - fragmentSize: 10000, // 分片字符长度,默认50000 - sendInterval: 20, // 分片传输间隔,单位ms,默认10 -}); -``` - -> 打印重叠 / 样式问题 ⬆️ v0.0.19 +> 打印重叠 / 样式问题 ```javascript /** @@ -650,30 +365,6 @@ hiprintTemplate.print2(this.printData, { }); ``` -> 修改默认配置 / 显示/隐藏元素设置参数 ⬆️ v0.0.13 - -```javascript -// 新增setConfig方法 -// 还原配置 -hiprint.setConfig(); -// 替换配置 -hiprint.setConfig({ - movingDistance: 2.5, - text: { - supportOptions: [ - { - name: "styler", - hidden: true, - }, - { - name: "formatter", - hidden: true, - }, - ], - }, -}); -``` - > 取消自动 socket 连接 / socket 连接报错问题 ```javascript @@ -708,16 +399,66 @@ autoConnect((status, msg) => { */ ``` +> print/print2 打印回调 + +```javascript +// 浏览器预览打印, 无法监听是否点击了 打印/取消 按钮 +hiprintTemplate.print( + this.printData, + {}, + { + callback: () => { + console.log("浏览器打印窗口已打开"); + }, + } +); +// 直接打印 +// 打印机名称: 通过 hiprintTemplate.getPrinterList() 获取 其中的 name +hiprintTemplate.print2(printData, { printer: "打印机名称", title: "打印标题" }); +hiprintTemplate.on("printSuccess", function (data) { + console.log("打印完成"); +}); +hiprintTemplate.on("printError", function (data) { + console.log("打印失败"); +}); +``` + +> i18n 设置 ⬆️ 0.0.55-beta8 + +原生为简体中文,英语、德语、西班牙语、法语、意大利语、日语、俄语、繁体中文皆为 AI 机翻,欢迎帮助 [订正](https://github.com/CcSimple/vue-plugin-hiprint/tree/main/src/i18n)。 + +可在 init 时传入语言进行设置,默认为 `cn` 。 + +```js +hiprint.init({ + lang: "en", // 设置语言 ['cn', 'en', 'de', 'es', 'fr', 'it', 'ja', 'ru', 'cn_tw'] +}); +``` + +> 直接打印 地址端口 与 Token 设置 + +```js +hiprint.init({ + host: "http://localhost:17521/", // 可在此处设置连接地址与端口号 + token: "token", // 可在此处设置连接 token 可缺省 +}); +``` + ## 参与项目 ```console git clone https://gitee.com/CcSimple/vue-plugin-hiprint.git + // init -cd vue-plugin-hiprint -npm i -// 调试预览 +cd vue-plugin-hiprint && npm i + +// 调试预览demo npm run serve -// 打包 + +// 打包demo (打包后生成在 demo 目录) +npm run build-demo + +// 打包插件(vue-plugin-hiprint 插件资源) npm run build ``` @@ -736,6 +477,117 @@ $("#app").css("display", "block"); $("#hiwprint_iframe").css("visibility", "hidden"); ``` +## 配套直接打印客户端[electron-hiprint](https://gitee.com/CcSimple/electron-hiprint) + +> 使用本项目,请使用如下样子的直接打印客户端 + +支持 win、mac、linux 系统 + +> [国内Gitee下载](https://gitee.com/CcSimple/electron-hiprint/releases)

    [Github下载](https://github.com/CcSimple/electron-hiprint/releases) + +![image](./res/tool.jpeg) + +### URLScheme `hiprint://` + +> 安装客户端时请 `以管理员身份运行` ,才能成功添加 URLScheme + +使用:浏览器地址栏输入 `hiprint://` 并回车 + +![URLScheme](./res/URLScheme.png) + +```js +// js +window.open("hiprint://"); + +// element-ui +this.$alert( + `连接【${hiwebSocket.host}】失败!
    请确保目标服务器已 下载 运行 打印服务!`, + "客户端未连接", + { dangerouslyUseHtmlString: true } +); + +// ant-design +this.$error({ + title: "客户端未连接", + content: (h) => ( +
    + 连接【{hiwebSocket.host}】失败! +
    + 请确保目标服务器已 + + 下载 + 并 + + 运行 + + 打印服务! +
    + ), +}); +``` + +## 使用 [中转服务 node-hiprint-transit](https://github.com/Xavier9896/node-hiprint-transit) 实现代理 + +配套客户端打印一直存在跨域、无法连接局域网其余打印机、跨网段无法连接的问题,所以诞生了这个中转代理服务。在 `electron-hiprint` [v1.0.0.7](https://gitee.com/CcSimple/electron-hiprint/releases) 版本中添加了连接中转服务代理的设置,将会在 `electron-hiprint` 与 `node-hiprint-transit` 间建立通信,`vue-plugin-hiprint` 只需连接中转服务就能获取到所有连接中转服务的打印端信息,并且选择任意打印机进行打印。 + +连接中转服务只需要修改 host, 添加 token + +```js +import { hiprint } from "vue-plugin-hiprint"; + +hiprint.init({ + host: "https://v4.printjs.cn:17521/", // 此处输入服务启动后的地址 + token: "hiprint-17521", // 用于鉴权的token,hiprint* (*可替换为[0-9a-zA-Z\-_]字符) +}); + +// or + +hiwebSocket.setHost("https://printjs.cn:17521/", "vue-plugin-hiprint"); +``` + +具体使用请转至 [node-hiprint-transit](https://github.com/Xavier9896/node-hiprint-transit) + +为此你需要作出这些改变: + +1. 你可以从 `hiwebSocket` 中获取到 `clients`、`printerList` ,里面都将包含 `client` 信息 +2. print2、ippRequest、ippRequest api options 中需要添加 `client` 指定客户端 + + eg: + + ```js + var clientId = "AlBaUCNs3AIMFPLZAAAh"; + var client = hiwebSocket.clients[clientId]; + var printer = hiwebSocket.printerList[0]; + + hiprintTemplate.print2(printData, { + client: clientId, + printer: client.printerList[n].name, + title: "hiprint测试打印", + }); + + hiprintTemplate.print2(printData, { + client: printer.clientId, + printer: printer.name, + title: "hiprint测试打印", + }); + ``` + + > 如果你不提供 client 中转服务将抛出一个 error + +## 插件生态 + +| 项目名称 | 项目地址 | 下载地址 | 描述 | +| -------------------- | ------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------- | ------------------------------------------------------------------ | +| vue-plugin-hiprint | [github](https://github.com/CcSimple/vue-plugin-hiprint)、[gitee](https://gitee.com/CcSimple/vue-plugin-hiprint) | [npm](https://www.npmjs.com/package/vue-plugin-hiprint) | 打印设计器 | +| electron-hiprint | [github](https://github.com/CcSimple/electron-hiprint)、[gitee](https://gitee.com/CcSimple/electron-hiprint) | [releases](https://github.com/CcSimple/electron-hiprint/releases) | 直接打印客户端 | +| node-hiprint-transit | [github](https://github.com/Xavier9896/node-hiprint-transit)、[gitee](https://gitee.com/Xavier9896/node-hiprint-transit) | - | web 与客户端中转服务 Node 实现 | +| hiprint-transit-java | [github](https://github.com/weaponready/hiprint-transit-java) | - | web 与客户端中转服务 Java 实现 | +| uni-app-hiprint | [github](https://github.com/Xavier9896/uni-app-hiprint) | - | uni-app 项目通过 webview 使用 vue-plugin-hiprint demo | +| node-hiprint-pdf | [github](https://github.com/CcSimple/node-hiprint-pdf) | - | 提供通过 node 对 vue-plugin-hiprint 模板生成 矢量 pdf、image、html | + ## 交流群 From 0a4818734aaca6472ca21906a5e54f988a739194 Mon Sep 17 00:00:00 2001 From: Cc <840054486@qq.com> Date: Fri, 21 Mar 2025 11:21:11 +0800 Subject: [PATCH 38/59] =?UTF-8?q?=E8=B0=83=E6=95=B4=20demo=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E8=AE=BE=E8=AE=A1json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/demo/design/panel-0.0.55-beta3.js | 341 -------------------------- src/demo/design/panel.js | 46 ++-- 2 files changed, 30 insertions(+), 357 deletions(-) delete mode 100644 src/demo/design/panel-0.0.55-beta3.js diff --git a/src/demo/design/panel-0.0.55-beta3.js b/src/demo/design/panel-0.0.55-beta3.js deleted file mode 100644 index cfa905d4..00000000 --- a/src/demo/design/panel-0.0.55-beta3.js +++ /dev/null @@ -1,341 +0,0 @@ -export default { - "panels": [{ - "index": 0, - "height": 297, - "width": 210, - "paperHeader": 49.5, - "paperFooter": 780, - "watermarkOptions": { - "content": "vue-plugin-hiprint", - "rotate": 25, - "timestamp": true, - "format": "YYYY-MM-DD HH:mm" - }, - "printElements": [{ - "options": { - "left": 175.5, - "top": 10.5, - "height": 27, - "width": 259, - "title": "HiPrint自定义模块打印插件", - "fontSize": 19, - "fontWeight": "600", - "textAlign": "center", - "lineHeight": 26, - "coordinateSync": true, - "widthHeightSync": true, - "draggable": false, - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": {"left": 60, "top": 27, "height": 13, "width": 52, "title": "页眉线", "textAlign": "center"}, - "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": {"left": 25.5, "top": 57, "height": 705, "width": 9, "fixed": true, "borderStyle": "dotted"}, - "printElementType": {"type": "vline"} - }, { - "options": {"left": 60, "top": 61.5, "height": 48, "width": 87, "src": "", "fit": "contain"}, - "printElementType": {"title": "图片", "type": "image"} - }, { - "options": { - "left": 153, - "top": 64.5, - "height": 39, - "width": 276, - "title": "二维码以及条形码均采用svg格式打印。不同打印机打印不会造成失真。图片打印:不同DPI打印可能会导致失真,", - "fontFamily": "微软雅黑", - "textAlign": "center", - "lineHeight": 18 - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 457.5, - "top": 79.5, - "height": 13, - "width": 120, - "title": "姓名", - "field": "name", - "testData": "古力娜扎", - "color": "#f00808", - "textDecoration": "underline", - "textAlign": "center", - "fields": [{"text":'id',"field":'id'},{"text":'姓名',"field":'name'},{"text":'性别',"field":'gender'},{"text":'数量',"field":'count'}], - }, "printElementType": {"title": "文本", "type": "text"} - }, { - "options": { - "left": 483, - "top": 115, - "height": 60, - "width": 60, - "title": "123456789", - "textAlign": "center", - "textType": "qrcode" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 285, - "top": 125, - "height": 40, - "width": 175, - "title": "123456789", - "fontFamily": "微软雅黑", - "textAlign": "center", - "textType": "barcode" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 60, - "top": 110, - "height": 19, - "width": 213, - "title": "所有打印元素都可已拖拽的方式来改变元素大小", - "fontFamily": "微软雅黑", - "textAlign": "center", - "lineHeight": 18 - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 60, - "top": 130, - "height": 40, - "width": 40, - "title": "qrcode", - "field": "qrcode", - "testData": "qrcode", - }, - "printElementType": { - "title": "二维码", - "type": "qrcode", - } - }, { - "options": { - "left": 160, - "top": 130, - "height": 40, - "width": 80, - "title": "barcode", - "field": "barcode", - "testData": "barcode", - }, - "printElementType": { - "title": "条形码", - "type": "barcode", - } - }, { - "options": { - "left": 153, - "top": 189, - "height": 13, - "width": 238, - "title": "单击元素,右侧可自定义元素属性", - "textAlign": "center", - "fontFamily": "微软雅黑" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": {"left": 60, "top": 190.5, "height": 13, "width": 51, "title": "横线", "textAlign": "center"}, - "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 415.5, - "top": 190.5, - "height": 13, - "width": 164, - "title": "可以配置各属性的默认值", - "textAlign": "center", - "fontFamily": "微软雅黑" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": {"left": 60, "top": 214.5, "height": 10, "width": 475.5}, - "printElementType": {"title": "横线", "type": "hline"} - }, { - "options": { - "left": 235.5, - "top": 220.5, - "height": 32, - "width": 342, - "title": "自定义表格:用户可左键选中表头,右键查看可操作项,操作类似Excel,双击表头单元格可进行编辑。内容:title#field", - "fontFamily": "微软雅黑", - "textAlign": "center", - "lineHeight": 15 - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 156, - "top": 265.5, - "height": 13, - "width": 94, - "title": "表头列大小可拖动", - "fontFamily": "微软雅黑", - "textAlign": "center" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 60, - "top": 265.5, - "height": 13, - "width": 90, - "title": "红色区域可拖动", - "fontFamily": "微软雅黑", - "textAlign": "center" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 60, - "top": 285, - "height": 56, - "width": 511.5, - "field": "table", - "tableFooterRepeat": "", - "tableBorder": "noBorder", - "tableHeaderBorder": "topBorder", - "tableHeaderCellBorder": "border", - "tableBodyRowBorder": "topBorder", - "tableFooterBorder": "topBorder", - "fields": [{"text":'id',"field":'id'},{"text":'姓名',"field":'name'},{"text":'性别',"field":'gender'},{"text":'数量',"field":'count'}], - "columns": [[{"width": 85.25, "colspan": 1, "rowspan": 1, "checked": true}, { - "title": "性别", - "field": "gender", - "width": 85.25, - "colspan": 1, - "rowspan": 1, - "checked": false - }, { - "title": "姓名", - "field": "name", - "width": 85.25, - "align": "center", - "colspan": 1, - "rowspan": 1, - "checked": true, - "tableSummary": "count" - }, { - "title": "数量", - "field": "count", - "width": 85.25, - "align": "center", - "colspan": 1, - "rowspan": 1, - "checked": true, - "tableSummary": "sum" - }, { - "width": 85.25, - "colspan": 1, - "rowspan": 1, - "checked": true - }, {"width": 85.25, "colspan": 1, "rowspan": 1, "checked": true}]] - }, "printElementType": { - "title": "表格", "type": "table", - // editable: true, - // columnDisplayEditable: true,//列显示是否能编辑 - // columnDisplayIndexEditable: true,//列顺序显示是否能编辑 - // columnTitleEditable: true,//列标题是否能编辑 - // columnResizable: true, //列宽是否能调整 - // columnAlignEditable: true,//列对齐是否调整 - // isEnableEditField: true, //编辑字段 - // isEnableContextMenu: true, //开启右键菜单 默认true - // isEnableInsertRow: true, //插入行 - // isEnableDeleteRow: true, //删除行 - // isEnableInsertColumn: true, //插入列 - // isEnableDeleteColumn: true, //删除列 - // isEnableMergeCell: true, //合并单元格 - } - }, { - "options": { - "left": 21, - "top": 346.5, - "height": 61.5, - "width": 15, - "title": "装订线", - "lineHeight": 18, - "fixed": true, - "contentPaddingTop": 3.75, - "backgroundColor": "#ffffff" - }, "printElementType": {"type": "text"} - }, { - "options": { - "left": 225, - "top": 355, - "height": 13, - "width": 346.5, - "title": "自定义模块:主要为开发人员设计,能够快速,简单,实现自己功能", - "textAlign": "center" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": {"left": 60, "top": 370.5, "height": 18, "width": 79, "title": "配置项表格", "textAlign": "center"}, - "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 225, - "top": 385.5, - "height": 38, - "width": 346.5, - "title": "配置模块:主要为客户使用,开发人员可以配置属性,字段,标题等,客户直接使用,配置模块请参考实例2", - "fontFamily": "微软雅黑", - "lineHeight": 15, - "textAlign": "center", - "color": "#d93838" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 60, - "top": 487.5, - "height": 13, - "width": 123, - "title": "长文本会自动分页", - "textAlign": "center" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": {"left": 60, "top": 507, "height": 40, "width": 511.5, "field": "longText"}, - "printElementType": {"title": "长文", "type": "longText"} - }, { - "options": {"left": 475.5, "top": 565.5, "height": 100, "width": 100}, - "printElementType": {"title": "矩形", "type": "rect"} - }, { - "options": {"left": 174, "top": 568.5, "height": 13, "width": 90, "title": "竖线", "textAlign": "center"}, - "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": {"left": 60, "top": 574.5, "height": 100, "width": 10}, - "printElementType": {"title": "竖线", "type": "vline"} - }, { - "options": {"left": 210, "top": 604.5, "height": 13, "width": 120, "title": "横线", "textAlign": "center"}, - "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": {"left": 130.5, "top": 625.5, "height": 10, "width": 277}, - "printElementType": {"title": "横线", "type": "hline"} - }, { - "options": { - "left": 364.5, - "top": 649.5, - "height": 13, - "width": 101, - "title": "矩形", - "textAlign": "center" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": {"left": 525, "top": 784.5, "height": 13, "width": 63, "title": "页尾线", "textAlign": "center"}, - "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": {"left": 12, "top": 786, "height": 49, "width": 49}, - "printElementType": {"title": "html", "type": "html"} - }, { - "options": { - "left": 75, - "top": 790.5, - "height": 13, - "width": 137, - "title": "红色原型是自动定义的Html", - "textAlign": "center" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }, { - "options": { - "left": 334.5, - "top": 810, - "height": 13, - "width": 205, - "title": "页眉线已上。页尾下以下每页都会重复打印", - "textAlign": "center" - }, "printElementType": {"title": "自定义文本", "type": "text"} - }], - "paperNumberLeft": 565.5, - "paperNumberTop": 819 - }] -} diff --git a/src/demo/design/panel.js b/src/demo/design/panel.js index ffd8ad5d..b29eb3ec 100644 --- a/src/demo/design/panel.js +++ b/src/demo/design/panel.js @@ -195,6 +195,36 @@ export default { "type": "text" } }, + { + options: { + left: 60, + top: 130, + height: 60, + width: 60, + title: "qrcode", + field: "qrcode", + testData: "qrcode", + }, + printElementType: { + title: "二维码", + type: "qrcode", + }, + }, + { + options: { + left: 140, + top: 130, + height: 40, + width: 120, + title: "barcode", + field: "barcode", + testData: "barcode", + }, + printElementType: { + title: "条形码", + type: "barcode", + }, + }, { "options": { "left": 60, @@ -226,22 +256,6 @@ export default { "type": "text" } }, - { - "options": { - "left": 70, - "top": 120, - "height": 19, - "width": 213, - "title": "所有打印元素都可已拖拽的方式来改变元素大小", - "fontFamily": "微软雅黑", - "textAlign": "center", - "lineHeight": 18 - }, - "printElementType": { - "title": "自定义文本", - "type": "text" - } - }, { "options": { "left": 285, From 43d4330c16f3b6f251ccf551f4bd2495520394f7 Mon Sep 17 00:00:00 2001 From: Cc <840054486@qq.com> Date: Fri, 21 Mar 2025 11:21:29 +0800 Subject: [PATCH 39/59] fix bwipjs error --- webpack.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webpack.config.js b/webpack.config.js index 6ff6b6c8..004088f7 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -48,7 +48,7 @@ module.exports = { "@wtto00/html2canvas": "html2canvas", canvg: 'canvg', jspdf: "jspdf", - "bwip-js": 'bwipjs', + "bwip-js": 'bwip-js', "nzh": "Nzh", }, optimization:{ From 000c8d7e0f4ff6dbaab67fa3f4808ecff8faf260 Mon Sep 17 00:00:00 2001 From: Cc <840054486@qq.com> Date: Fri, 21 Mar 2025 11:46:27 +0800 Subject: [PATCH 40/59] pub-beta 0.0.59-beta4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 389db610..059dbc6a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vue-plugin-hiprint", "description": "hiprint for Vue2.x / Vue3.x 支持拖拽(分页(不分页)、表头表脚、样式设置、复制粘贴、缩放、撤销重做)生成打印模板、导出json模板数据、静默打印/获取MAC地址(借助客户端)", - "version": "0.0.59-beta3", + "version": "0.0.59-beta4", "author": "CcSimple", "license": "MIT", "main": "dist/vue-plugin-hiprint.js", From 67c8a3fdc378e33e6ab03834b792b667ec15f43a Mon Sep 17 00:00:00 2001 From: Cc <840054486@qq.com> Date: Fri, 21 Mar 2025 14:01:00 +0800 Subject: [PATCH 41/59] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BC=98=E5=8C=96=20hi?= =?UTF-8?q?nnn.dateFormat=20=E6=94=AF=E6=8C=81=E6=97=B6=E9=97=B4=E6=88=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hiprint/hiprint.bundle.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hiprint/hiprint.bundle.js b/src/hiprint/hiprint.bundle.js index 34557201..2d641e9a 100644 --- a/src/hiprint/hiprint.bundle.js +++ b/src/hiprint/hiprint.bundle.js @@ -316,7 +316,7 @@ var hiprint = function (t) { return this.orderBy(o, e).concat([i], this.orderBy(r, e)); }, hinnn.dateFormat = function (t, e) { if (t) try { - var o = "string" == typeof t ? new Date(t) : t; + var o = new Date(`${t}`); var n = { "y+": o.getFullYear(), "M+": o.getMonth() + 1, From a54f920462998df30de6e34a4344e81de28d59a2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <840054486@qq.com> Date: Fri, 21 Mar 2025 07:10:01 +0000 Subject: [PATCH 42/59] pub-beta 0.0.59-beta5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 059dbc6a..f06ae87e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vue-plugin-hiprint", "description": "hiprint for Vue2.x / Vue3.x 支持拖拽(分页(不分页)、表头表脚、样式设置、复制粘贴、缩放、撤销重做)生成打印模板、导出json模板数据、静默打印/获取MAC地址(借助客户端)", - "version": "0.0.59-beta4", + "version": "0.0.59-beta5", "author": "CcSimple", "license": "MIT", "main": "dist/vue-plugin-hiprint.js", From 1911a42b1004353f865817f4643e37b755853839 Mon Sep 17 00:00:00 2001 From: Cc <840054486@qq.com> Date: Mon, 24 Mar 2025 16:44:44 +0800 Subject: [PATCH 43/59] 0.0.60-changelog --- CHANGELOG.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6eff27a7..0c40fa18 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,26 @@ ### 💐️ GitHub 提交 PR 合并后可自动发布到 npm 仓库; ### 💐 同时自动更新 GitHub Pages 同步 Gitee; ### 💐 感谢各位贡献者的支持。 🔥 +### 💐 希望各位多看看文档、文章、更新日志; 📢 本页面支持 Ctrl/Command + F 搜索 + +## 0.0.60 (2025-03-24) +> 使用此版本 请更新最新的 print-lock.css + +
    + 01. ✨ 调整优化 hinnn.dateFormat 支持时间戳 +
    +
    + 02. ✨ 调整优化 engines node >=16 +
    +
    + 03. 🐛️ fix install bwipjs error +
    +
    + 04. 🐛️ fix 某些特定情况下 onload 函数重复调用 导致重复弹出浏览器预览打印弹窗的bug +
    +
    + 05. 🐛️ fix table 数据格式问题(Array.isArray) +
    ## 0.0.58 (2024-11-02) > 使用此版本 请更新最新的 print-lock.css From 07c24ad6cc9e0dfed56da8c8137d4ea1f5f7b537 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <840054486@qq.com> Date: Mon, 24 Mar 2025 09:25:10 +0000 Subject: [PATCH 44/59] pub 0.0.60 && git tag 0.0.60 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f06ae87e..efd539c7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "vue-plugin-hiprint", "description": "hiprint for Vue2.x / Vue3.x 支持拖拽(分页(不分页)、表头表脚、样式设置、复制粘贴、缩放、撤销重做)生成打印模板、导出json模板数据、静默打印/获取MAC地址(借助客户端)", - "version": "0.0.59-beta5", + "version": "0.0.60", "author": "CcSimple", "license": "MIT", "main": "dist/vue-plugin-hiprint.js", From 1eb49fc307a63ef6211699c683275740dfe26456 Mon Sep 17 00:00:00 2001 From: Canim <840054486@qq.com> Date: Wed, 9 Apr 2025 14:33:11 +0800 Subject: [PATCH 45/59] update README.md --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e100f378..ea5372f3 100644 --- a/README.md +++ b/README.md @@ -29,11 +29,13 @@ vue-plugin-hiprint (基于 [hiprint 2.5.4](http://hiprint.io/)) 当时只是为 由于 hiprint 官网最后一次更新时间为 2019 年【hiprint 2.5.4 是 [LGPL](#关于lgpl协议) 协议】,后在诸多使用者及反馈下进行了许多优化调整。 -## vue-plugin-hiprint +## vue-plugin-hiprint > [✨立即体验](https://ccsimple.github.io/vue-plugin-hiprint/)

    [🌈更新日志](CHANGELOG.md)

    [🐛常见问题(入门必看!)](#常见问题) ⚠️⚠️ [📕系列教程文章(入门必看!)](#常见问题)

    [🚀项目生态(打印客户端、node服务端、uniapp)](#插件生态) -> [🔥🔥🔥1.征集模板、2.admin模板集成示例、3.插件集成; ==> 点我🔥🔥🔥](#交流群) +> [🔥1.征集模板、2.admin模板集成示例、3.插件集成; ==> 点我🔥](#交流群) + +> [❤️‍🔥付费技术支持、项目合作 ==> 点我❤️‍🔥❤️‍](#交流群) > hiprint for Vue2.x / Vue3.x (基于 jQuery, 理论上其他框架可用。[react demo 分支](https://github.com/CcSimple/vue-plugin-hiprint/tree/react_demo)) @@ -54,6 +56,8 @@ vue-plugin-hiprint (基于 [hiprint 2.5.4](http://hiprint.io/)) 当时只是为 ## 文章链接 +快速入门: [一文彻底入门可视化打印vue-plugin-hiprint](https://mp.weixin.qq.com/s/R8juiaQsLhMmyZebv55tUA) + 入门篇: [【vue-plugin-hiprint】使用-入门篇](https://mp.weixin.qq.com/s/4N4f7CkxodA-fuTJ_FbkOQ) 进阶篇: [【vue-plugin-hiprint】使用-进阶篇](https://mp.weixin.qq.com/s/LYZP2iqV0gy4m76mttplAw) From f35e0662cc98f320d50b900b9d43d6c96b8cbe07 Mon Sep 17 00:00:00 2001 From: Canim <840054486@qq.com> Date: Wed, 16 Apr 2025 14:28:26 +0800 Subject: [PATCH 46/59] =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=A6=96=E9=A1=B5=20?= =?UTF-8?q?=E6=96=87=E6=9C=AC=E4=B8=8D=E6=8D=A2=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/demo/design/index.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/demo/design/index.vue b/src/demo/design/index.vue index 105952a4..c158ef33 100644 --- a/src/demo/design/index.vue +++ b/src/demo/design/index.vue @@ -99,7 +99,7 @@ ipp请求 打印测试 -
    元素参数操作:
    +
    元素参数操作:
    测试隐藏参数[看代码] 隐藏[文本] "边框"、"高级" @@ -139,7 +139,7 @@ 选中元素字体Bolder -
    选中元素后点击:
    +
    选中元素后点击:
    水平间距10 垂直间距10 From 901e23e28d84a7c0fe53b39a644872df5dcba72c Mon Sep 17 00:00:00 2001 From: Canim <840054486@qq.com> Date: Wed, 16 Apr 2025 17:00:42 +0800 Subject: [PATCH 47/59] =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=A6=96=E9=A1=B5=20?= =?UTF-8?q?=E5=B8=83=E5=B1=80,=20=E5=8A=9F=E8=83=BD=E7=A4=BA=E4=BE=8B?= =?UTF-8?q?=E6=8C=89=E9=92=AE=20=E8=87=AA=E8=A1=8C=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E6=9F=A5=E7=9C=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/demo/design/index.vue | 112 ++++++++++++++++++++++++++------------ 1 file changed, 77 insertions(+), 35 deletions(-) diff --git a/src/demo/design/index.vue b/src/demo/design/index.vue index c158ef33..4f18cd71 100644 --- a/src/demo/design/index.vue +++ b/src/demo/design/index.vue @@ -40,18 +40,6 @@ 预览 - - 直接打印 - - - 分批直接打印 - - - Api单独打印 - - - Api单独直接打印 - + + + 都不看,我就不看 + {{ item.name }} + + 更多功能示例 + + + - + +
    直接打印/api打印:
    + + 直接打印 + + + 分批直接打印 + + + Api单独打印 + + + Api单独直接打印 + +
    + +
    导出PDF文件/流:
    导出获取pdf(Blob) @@ -86,7 +99,8 @@ 导出查看pdf(PdfObjectNewWindow)
    - + +
    ipp打印(需打印机支持):
    ipp获取 打印机 参数情况 @@ -99,7 +113,9 @@ ipp请求 打印测试 -
    元素参数操作:
    +
    + +
    元素参数操作:
    测试隐藏参数[看代码] 隐藏[文本] "边框"、"高级" @@ -113,7 +129,8 @@ 还原配置
    - + +
    模板导入导出:
    @@ -125,7 +142,8 @@
    - + +
    元素获取/更新参数:
    获取选中元素 @@ -139,7 +157,9 @@ 选中元素字体Bolder -
    选中元素后点击:
    +
    + +
    元素对齐/间距(需先选中):
    水平间距10 垂直间距10 @@ -328,7 +348,7 @@ import printPreview from './preview' import jsonView from "../json-view.vue"; import fontSize from "./font-size.js"; import scale from "./scale.js"; -import { decodeVer } from '@/utils' +import {decodeVer} from '@/utils' // disAutoConnect(); var hiprint, defaultElementTypeProvider, panel; let hiprintTemplate; @@ -381,6 +401,17 @@ export default { // 导入导出json jsonIn: '', jsonOut: '', + // 功能 + curKey: '', + keyList: [ + {key: 1, name: '直接打印/api打印'}, + {key: 2, name: '导出PDF文件/流'}, + {key: 3, name: 'ipp打印(需打印机支持)'}, + {key: 4, name: '元素参数操作'}, + {key: 5, name: '模板导入导出'}, + {key: 6, name: '元素获取/更新参数'}, + {key: 7, name: '元素对齐/间距(需先选中)'}, + ], } }, computed: { @@ -891,6 +922,10 @@ export default { ), }); }, + handleMenuClick(e) { + const {key} = e; + this.curKey = key; + }, print() { this.doOperationWhenClientConnected(() => { const printerList = hiprintTemplate.getPrinterList(); @@ -922,22 +957,22 @@ export default { this.$error({ title: "客户端未连接", content: (h) => ( -
    - 连接【{hiwebSocket.host}】失败! -
    - 请确保目标服务器已 - - 下载 - - 并 - - 运行 - - 打印服务! -
    +
    + 连接【{hiwebSocket.host}】失败! +
    + 请确保目标服务器已 + + 下载 + + 并 + + 运行 + + 打印服务! +
    ), }); }, @@ -1124,6 +1159,13 @@ export default {