❝【vue-plugin-hiprint】系列文章
❞已发布7篇啦🌈!
本篇主要罗列
各位小伙伴使用过程
中的一些常见问题①
。希望对你们有所帮助😄。
首先希望各位清楚一点:【vue-plugin-hiprint】 是基于hiprint官网 2.5.4版本
开发的一个打印插件
。我并非hiprint原作者
。当时只是为了方便
我在 vue 项目
中引用
所以以此命名
。
其次它底层是基于 jQuery
开发的,插件中
也没有引入其他前端框架
。所以它是可以在其他非 vue项目
中使用
。插件的打包开发环境
是webpack4.x
。
npm i vue-plugin-hiprint
是不包含任何UI组件的。
关键就三个 API 构建 UI。分别是:
// 设计器 构建 到容器:$('#hiprint-printTemplate');
// grid: true // 显示网格线
hiprintTemplate.design('#hiprint-printTemplate',{ grid: true });
// 构建 可拖拽元素 到容器:$('.hiprintEpContainer');
// provider 的键: addPrintElementTypes('defaultModule', [...]);
var providerName = 'defaultModule';
hiprint.PrintElementTypeManager.build('.hiprintEpContainer', providerName);
// 获取打印生成的 html (返回的是个 jq 对象)
var jqObj = hiprintTemplate.getHtml(printData);
// 构建到 容器:$('#preview')
$('#preview').html(jqObj);
注意:使用环境需要支持 window 对象
首先项目有4个分支
:
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_v3
vue3.x + vite + npm包使用 示例「除主分支main
,其他分支的代码合示例demo可能较旧,升级插件的版本即可」。
clone项目到本地,或者下载最新的压缩包。
git clone https://gitee.com/CcSimple/vue-plugin-hiprint.git
cd vue-plugin-hiprint
npm i
# 运行
npm run serve
# 打包示例demo
npm run build-demo
# 打包npm包代码
npm run build
vue.config.js
关键代码如下:// vue.config.js
module.exports = {
configureWebpack: {
plugins: [
// 全局 jQuery
new webpack.ProvidePlugin({
jQuery: "jquery",
$: "jquery"
}),
],
}
src/hiprint/hiprint.bundle.js
融合引入相关资源,再导出关键模块import $ from "jquery";
// js颜色选择
import "@claviska/jquery-minicolors/jquery.minicolors.min";
// 条形码
import JsBarcode from "jsbarcode";
// 二维码
import "./plugins/qrcode.js";
// 水印
import watermark from "./plugins/watermark.js";
// 直接打印需要
import {io} from "socket.io-client";
//引入标尺
import lImg from "./css/image/l_img.svg";
import vImg from "./css/image/v_img.svg";
// pdf
import {jsPDF} from "jspdf";
import html2canvas from "html2canvas";
import Nzh from "nzh/dist/nzh.min.js"
// 解析svg 到 canvas, 二维码条形码需要
import Canvg from 'canvg';
// 默认自定义拖拽列表
import defaultTypeProvider from "./etypes/default-etyps-provider";
// ...省略
// 最后导出关键模块
var defaultElementTypeProvider = defaultTypeProvider(hiprint)
export {
hiprint,
defaultElementTypeProvider
}
src/index.js
定义融合引入的入口文件。// 引入关键模块
import {hiprint, defaultElementTypeProvider} from './hiprint/hiprint.bundle.js'
// 调用浏览器打印js
import "./hiprint/plugins/jquery.hiwprint.js";
// 默认配置
import "./hiprint/hiprint.config";
// 样式
import "./hiprint/css/hiprint.css"
import "./hiprint/css/print-lock.css"
// ...省略
// 挂载到全局 (其他环境引入)
window.hiprint = hiprint;
// 导出 自定义的一些方法 / hiPrintPlugin vue插件
export {
autoConnect,
disAutoConnect,
hiprint,
hiPrintPlugin,
defaultElementTypeProvider,
}
全部打印重叠在一页?那基本就是样式问题了。
需要在入口文件(index.html) 引入 print-lock.css
如域名:www.abc.com
, 那么请确保 www.abc.com/print-lock.css
能够正常访问!
「名称必须是 print-lock.css 并且需要时 link 标签」
// 在index.html 名称必须为 print-lock.css
<link rel="stylesheet" type="text/css" media="print" href="https://cdn.jsdelivr.net/npm/vue-plugin-hiprint@latest/dist/print-lock.css">
// 也可为相对链接/自有链接 eg: public/print-lock.css
<link rel="stylesheet" type="text/css" media="print" href="https://mp.weixin.qq.com/print-lock.css">
如果你看到与下图连接错误:
这就是默认的 socket.io 自动连接打印客户端失败的报错
。因为没有打开客户端。
如若不需要直接打印功能,或者不自动连接。在入口文件
添加以下代码:
// main.js
import {autoConnect, disAutoConnect} from 'vue-plugin-hiprint'
console.log('disAutoConnect'); // 为了检验执行顺序
disAutoConnect(); // 取消自动连接
注意:入口文件!入口文件!入口文件!
原理看下图:
你可以在控制台查看
,当你你执行disAutoConnect
时,是否先输出
了 document ready
。
如果是,那么请调整你代码执行位置。
网站需要升级 https
。原因请阅读以下链接文章:
https://www.cnblogs.com/daysme/p/15493523.html
当然,如果你有其他办法,那也是可以的。
详见我的另外两篇文章:
如何自定义可拖拽元素provider:https://mp.weixin.qq.com/s/n9i1j8hhVJvnlfJRPRtWog
实战-动态provider:https://mp.weixin.qq.com/s/UVkhul1tynjaUjdC_NaHfw
插件提供了一个hiprint.updateElementType
API。使用方式如下:
// tid 是定义可以拖拽的元素时自己 定义的
var tid = 'defaultModule.text';
hiprint.updateElementType(tid, (type) => {
type.title = '这是更新后的元素';
return type;
})
官网文档:https://hiprint.io/docs/start
我的文档:https://ccsimple.gitee.io/sv-print-docs/config/hiprint.html
使用-参数篇:https://mp.weixin.qq.com/s/vfgSG62tAXn7Ot7y3x68fw
使用插件提供的hiprint.setConfig
API。参见文章:
使用-参数篇:https://mp.weixin.qq.com/s/vfgSG62tAXn7Ot7y3x68fw
浏览器打印,无法监听
是否点击了弹出预览窗口中
的 打印
或是 取消
按钮。
如果可以实现,那就不至于开发个打印客户端了~
// 浏览器预览打印
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('打印失败')
})
支持的快捷键如下:
其他编辑操作:
示例:
// 多选元素对齐:支持 left、vertical、right、top、horizontal、bottom、distributeHor、distributeVer
// 左对齐
hiprintTemplate.setElsAlign(‘left’);
// 间隙
hiprintTemplate.setElsSpace(10); // 垂直
hiprintTemplate.setElsSpace(10,true); // 水平
// 获取多选元素 (没有table)
var eles = hiprintTemplate.getSelectEls();
// 更新多选元素参数
// fontSize 是指元素支持的那些参数, 12 是值
hiprintTemplate.updateOption('fontSize', 12);
// 保存模板
var json = hiprintTemplate.getJson();
// 保存模板 tid 模式 (数据相对少一些,但是一定需要先 init 对应 provider)
var jsonTid = hiprintTemplate.getJsonTid();
// 导入模板
hiprintTemplate.update(json);
// 多面板模板导入,选中第二个面板
hiprintTemplate.update(json,1);
hiprintTemplate = new hiprint.PrintTemplate({
template: {}, // 模板json对象
settingContainer: '#PrintElementOptionSetting', // 元素参数容器
onImageChooseClick: (target) => {
// 创建input,模拟点击,然后 target.refresh 更新
let input = document.createElement("input");
input.setAttribute("type", "file");
input.click();
input.onchange = function () {
var file = this.files[0];
var reader = new FileReader();
if (file) {
var reader = new FileReader();
//通过文件流行文件转换成Base64字行串
reader.readAsDataURL(file);
//转换成功后
reader.onloadend = function () {
// 通过 target.refresh 更新图片元素
target.refresh(reader.result);
}
}
}
input.remove();
}
});
插件只是模拟一个打印的纸张大小的画布
, 实际打印
还是需要打印机支持
对应的纸张大小
才行。
浏览器打印
,需要勾选对应的纸张大小
,(需要打印机先设置,不会就百度)直接打印
,需要设置打印机默认为该模板的纸张大小
,这是由于 electron API 的 bug转pdf打印
这是一个预览功能
,请下载最新打印客户端源码
测试// 关键是两个参数: type:'pdf', pageSize:'80x80'
var options = {type:'pdf',pageSize:'打印机自定义的纸张大小名称', printer: '打印机名称', title: '打印标题'}
iprintTemplate.print2(printData, options);
吐槽一下😂~ 有些小伙伴在群里,发的问题,真的是不太容易理解,或者说是看不懂。所以...
为什么最好带上截图
呢?因为每个人的表达能力和理解能力都不一样
。当然也不能只发
个截图
,描述都没有。
有时你觉得你描述的很清楚
了,换个角度,别人就一定能理解清楚你说的是什么了吗
?
所以提问的时候
尽可能的,表达清楚你遇到的问题,带上截图或许是麻烦了一些,但是对于大多数码仔来说,有图,或许就有真相。我相信大多
技术圈的码友
看到BUG截图
,还是会好奇
去点开看看
的。
「至少,我看到截图的时候,会想着点开看看这是个什么 BUG」
有时候
确实“需要反问/确认
”一下,比如你跟客户/老板沟通需求
的时候,没太理解的时候。
但是我觉得这不适合在技术圈子里
,当你反问的时候
,你应该去实践操作
一下,而不是在这里等着别人,回复没错,是的
。至少在我看来,更喜欢看到
你回复
,好的,谢谢,我试试
。
“反问/确认”
这看着没毛病
,实际好像感觉是别人没跟你讲清楚一样
😂
「当别人指出了问题,或者提出建议之后,动手实践去吧。」
以上是只是部分使用过程中
的一些常见问题
。实际开发中,可能还会有
更多的使用问题
。
有问题不要怕,要仔细翻阅文档!有问题不要怕,要仔细翻阅文档!有问题不要怕,要仔细翻阅文档!
下一篇,将会罗列一些常用元素
使用参数问题
。或者说是实际开发
过程中,一些需求的处理
。
敬请期待下一篇😄~
❝【vue-plugin-hiprint】系列文章
❞已发布7篇啦🌈!
本篇主要罗列
各位小伙伴使用过程
中的一些常见问题①
。希望对你们有所帮助😄。
首先希望各位清楚一点:【vue-plugin-hiprint】 是基于hiprint官网 2.5.4版本
开发的一个打印插件
。我并非hiprint原作者
。当时只是为了方便
我在 vue 项目
中引用
所以以此命名
。
其次它底层是基于 jQuery
开发的,插件中
也没有引入其他前端框架
。所以它是可以在其他非 vue项目
中使用
。插件的打包开发环境
是webpack4.x
。
npm i vue-plugin-hiprint
是不包含任何UI组件的。
关键就三个 API 构建 UI。分别是:
// 设计器 构建 到容器:$('#hiprint-printTemplate');
// grid: true // 显示网格线
hiprintTemplate.design('#hiprint-printTemplate',{ grid: true });
// 构建 可拖拽元素 到容器:$('.hiprintEpContainer');
// provider 的键: addPrintElementTypes('defaultModule', [...]);
var providerName = 'defaultModule';
hiprint.PrintElementTypeManager.build('.hiprintEpContainer', providerName);
// 获取打印生成的 html (返回的是个 jq 对象)
var jqObj = hiprintTemplate.getHtml(printData);
// 构建到 容器:$('#preview')
$('#preview').html(jqObj);
注意:使用环境需要支持 window 对象
首先项目有4个分支
:
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_v3
vue3.x + vite + npm包使用 示例「除主分支main
,其他分支的代码合示例demo可能较旧,升级插件的版本即可」。
clone项目到本地,或者下载最新的压缩包。
git clone https://gitee.com/CcSimple/vue-plugin-hiprint.git
cd vue-plugin-hiprint
npm i
# 运行
npm run serve
# 打包示例demo
npm run build-demo
# 打包npm包代码
npm run build
vue.config.js
关键代码如下:// vue.config.js
module.exports = {
configureWebpack: {
plugins: [
// 全局 jQuery
new webpack.ProvidePlugin({
jQuery: "jquery",
$: "jquery"
}),
],
}
src/hiprint/hiprint.bundle.js
融合引入相关资源,再导出关键模块import $ from "jquery";
// js颜色选择
import "@claviska/jquery-minicolors/jquery.minicolors.min";
// 条形码
import JsBarcode from "jsbarcode";
// 二维码
import "./plugins/qrcode.js";
// 水印
import watermark from "./plugins/watermark.js";
// 直接打印需要
import {io} from "socket.io-client";
//引入标尺
import lImg from "./css/image/l_img.svg";
import vImg from "./css/image/v_img.svg";
// pdf
import {jsPDF} from "jspdf";
import html2canvas from "html2canvas";
import Nzh from "nzh/dist/nzh.min.js"
// 解析svg 到 canvas, 二维码条形码需要
import Canvg from 'canvg';
// 默认自定义拖拽列表
import defaultTypeProvider from "./etypes/default-etyps-provider";
// ...省略
// 最后导出关键模块
var defaultElementTypeProvider = defaultTypeProvider(hiprint)
export {
hiprint,
defaultElementTypeProvider
}
src/index.js
定义融合引入的入口文件。// 引入关键模块
import {hiprint, defaultElementTypeProvider} from './hiprint/hiprint.bundle.js'
// 调用浏览器打印js
import "./hiprint/plugins/jquery.hiwprint.js";
// 默认配置
import "./hiprint/hiprint.config";
// 样式
import "./hiprint/css/hiprint.css"
import "./hiprint/css/print-lock.css"
// ...省略
// 挂载到全局 (其他环境引入)
window.hiprint = hiprint;
// 导出 自定义的一些方法 / hiPrintPlugin vue插件
export {
autoConnect,
disAutoConnect,
hiprint,
hiPrintPlugin,
defaultElementTypeProvider,
}
全部打印重叠在一页?那基本就是样式问题了。
需要在入口文件(index.html) 引入 print-lock.css
如域名: www.abc.com
, 那么请确保 www.abc.com/print-lock.css
能够正常访问!
「名称必须是 print-lock.css 并且需要时 link 标签」
// 在index.html 名称必须为 print-lock.css
<link rel="stylesheet" type="text/css" media="print" href="https://cdn.jsdelivr.net/npm/vue-plugin-hiprint@latest/dist/print-lock.css">
// 也可为相对链接/自有链接 eg: public/print-lock.css
<link rel="stylesheet" type="text/css" media="print" href="https://mp.weixin.qq.com/print-lock.css">
如果你看到与下图连接错误:
这就是默认的 socket.io 自动连接打印客户端失败的报错
。 因为没有打开客户端。
如若不需要直接打印功能,或者不自动连接。 在入口文件
添加以下代码:
// main.js
import {autoConnect, disAutoConnect} from 'vue-plugin-hiprint'
console.log('disAutoConnect'); // 为了检验执行顺序
disAutoConnect(); // 取消自动连接
注意:入口文件!入口文件!入口文件!
原理看下图:
你可以在控制台查看
,当你你执行disAutoConnect
时,是否先输出
了 document ready
。
如果是,那么请调整你代码执行位置。
网站需要升级 https
。 原因请阅读以下链接文章:
https://www.cnblogs.com/daysme/p/15493523.html
当然,如果你有其他办法,那也是可以的。
详见我的另外两篇文章:
如何自定义可拖拽元素provider: https://mp.weixin.qq.com/s/n9i1j8hhVJvnlfJRPRtWog
实战-动态provider: https://mp.weixin.qq.com/s/UVkhul1tynjaUjdC_NaHfw
插件提供了一个hiprint.updateElementType
API。 使用方式如下:
// tid 是定义可以拖拽的元素时自己 定义的
var tid = 'defaultModule.text';
hiprint.updateElementType(tid, (type) => {
type.title = '这是更新后的元素';
return type;
})
官网文档:https://hiprint.io/docs/start
我的文档:https://ccsimple.gitee.io/sv-print-docs/config/hiprint.html
使用-参数篇:https://mp.weixin.qq.com/s/vfgSG62tAXn7Ot7y3x68fw
使用插件提供的hiprint.setConfig
API。 参见文章:
使用-参数篇:https://mp.weixin.qq.com/s/vfgSG62tAXn7Ot7y3x68fw
浏览器打印,无法监听
是否点击了弹出预览窗口中
的 打印
或是 取消
按钮。
如果可以实现,那就不至于开发个打印客户端了~
// 浏览器预览打印
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('打印失败')
})
支持的快捷键如下:
其他编辑操作:
示例:
// 多选元素对齐: 支持 left、vertical、right、top、horizontal、bottom、distributeHor、distributeVer
// 左对齐
hiprintTemplate.setElsAlign(‘left’);
// 间隙
hiprintTemplate.setElsSpace(10); // 垂直
hiprintTemplate.setElsSpace(10,true); // 水平
// 获取多选元素 (没有table)
var eles = hiprintTemplate.getSelectEls();
// 更新多选元素参数
// fontSize 是指元素支持的那些参数, 12 是值
hiprintTemplate.updateOption('fontSize', 12);
// 保存模板
var json = hiprintTemplate.getJson();
// 保存模板 tid 模式 (数据相对少一些,但是一定需要先 init 对应 provider)
var jsonTid = hiprintTemplate.getJsonTid();
// 导入模板
hiprintTemplate.updata(json);
// 多面板模板导入,选中第二个面板
hiprintTemplate.updata(json,1);
hiprintTemplate = new hiprint.PrintTemplate({
template: {}, // 模板json对象
settingContainer: '#PrintElementOptionSetting', // 元素参数容器
onImageChooseClick: (target) => {
// 创建input,模拟点击,然后 target.refresh 更新
let input = document.createElement("input");
input.setAttribute("type", "file");
input.click();
input.onchange = function () {
var file = this.files[0];
var reader = new FileReader();
if (file) {
var reader = new FileReader();
//通过文件流行文件转换成Base64字行串
reader.readAsDataURL(file);
//转换成功后
reader.onloadend = function () {
// 通过 target.refresh 更新图片元素
target.refresh(reader.result);
}
}
}
input.remove();
}
});
插件只是模拟一个打印的纸张大小的画布
, 实际打印
还是需要打印机支持
对应的纸张大小
才行。
浏览器打印
,需要勾选对应的纸张大小
,(需要打印机先设置,不会就百度)直接打印
,需要设置打印机默认为该模板的纸张大小
,这是由于 electron API 的 bug转pdf打印
这是一个预览功能
,请下载最新打印客户端源码
测试// 关键是两个参数: type:'pdf', pageSize:'80x80'
var options = {type:'pdf',pageSize:'打印机自定义的纸张大小名称', printer: '打印机名称', title: '打印标题'}
iprintTemplate.print2(printData, options);
吐槽一下😂~ 有些小伙伴在群里,发的问题,真的是不太容易理解,或者说是看不懂。所以...
为什么最好带上截图
呢? 因为每个人的表达能力和理解能力都不一样
。当然也不能只发
个截图
,描述都没有。
有时你觉得你描述的很清楚
了,换个角度,别人就一定能理解清楚你说的是什么了吗
?
所以提问的时候
尽可能的,表达清楚你遇到的问题,带上截图或许是麻烦了一些,但是对于大多数码仔来说,有图,或许就有真相。我相信大多
技术圈的码友
看到BUG截图
,还是会好奇
去点开看看
的。
「至少,我看到截图的时候,会想着点开看看这是个什么 BUG」
有时候
确实“需要反问/确认
”一下,比如你跟客户/老板沟通需求
的时候,没太理解的时候。
但是我觉得这不适合在技术圈子里
,当你反问的时候
,你应该去实践操作
一下,而不是在这里等着别人,回复没错,是的
。至少在我看来,更喜欢看到
你回复
,好的,谢谢,我试试
。
“反问/确认”
这看着没毛病
,实际好像感觉是别人没跟你讲清楚一样
😂
「当别人指出了问题,或者提出建议之后,动手实践去吧。」
以上是只是部分使用过程中
的一些常见问题
。 实际开发中,可能还会有
更多的使用问题
。
有问题不要怕,要仔细翻阅文档!有问题不要怕,要仔细翻阅文档!有问题不要怕,要仔细翻阅文档!
下一篇,将会罗列一些常用元素
使用参数问题
。或者说是实际开发
过程中,一些需求的处理
。
敬请期待下一篇😄~
欢迎各位码友转发
及留言反馈
,觉得不错就点个赞
再走咯~