【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
// 获取打印生成的 html (返回的是个 jq 对象)
var jqObj = hiprintTemplate.getHtml(printData);
// 构建到 容器:$('#preview')
$('#preview').html(jqObj);
注意:使用环境需要支持 window 对象
1 如何运行本项目
首先项目有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
2 怎么融合处理?
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,
}
3 打印重叠?
全部打印重叠在一页?那基本就是样式问题了。
需要在入口文件(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="/print-lock.css">
4 取消自动连接?
如果你看到与下图连接错误:
这就是默认的 socket.io 自动连接打印客户端失败的报错
。 因为没有打开客户端。
如若不需要直接打印功能,或者不自动连接。 在入口文件
添加以下代码:
// main.js
import {autoConnect, disAutoConnect} from 'vue-plugin-hiprint'
console.log('disAutoConnect'); // 为了检验执行顺序
disAutoConnect(); // 取消自动连接
注意:入口文件!入口文件!入口文件!
原理看下图:
你可以在控制台查看
,当你你执行disAutoConnect
时,是否先输出
了 document ready
。
如果是,那么请调整你代码执行位置。
5 线上无法自动连接客户端?
网站需要升级 https
。 原因请阅读以下链接文章:
当然,如果你有其他办法,那也是可以的。
6 如何自定义可以拖拽的元素?
详见我的另外两篇文章:
如何自定义可拖拽元素provider: https://mp.weixin.qq.com/s/n9i1j8hhVJvnlfJRPRtWog
实战-动态provider: https://mp.weixin.qq.com/s/UVkhul1tynjaUjdC_NaHfw
7 如何动态更新拖拽元素?
插件提供了一个hiprint.updateElementType
API。 使用方式如下:
// tid 是定义可以拖拽的元素时自己 定义的
var tid = 'defaultModule.text';
hiprint.updateElementType(tid, (type) => {
type.title = '这是更新后的元素';
return type;
})
8 如何查看元素支持哪些参数?
- 查看文档
我的文档:ccsimple.gitee.io/sv-print-do…
- 我写的 使用-参数篇文章
使用-参数篇:mp.weixin.qq.com/s/vfgSG62tA…
9 如何重新参数/自定义参数?
使用插件提供的hiprint.setConfig
API。 参见文章:
使用-参数篇:mp.weixin.qq.com/s/vfgSG62tA…
10 打印回调问题?
浏览器打印,无法监听
是否点击了弹出预览窗口中
的 打印
或是 取消
按钮。
如果可以实现,那就不至于开发个打印客户端了~
// 浏览器预览打印
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('打印失败')
})
11 设计器编辑/快捷键问题?
支持的快捷键如下:
- 删除元素(BackSpace/Delete)
- 多选元素(按住Ctrl/Command 点击鼠标左键)
- 拖拽元素(按住Ctrl/Command 可拖出设计器外)
- 二维码/条形码 大小调整(按住Shift 自由调整)
- 横向拖拽(按住Shift 拖拽)
- 纵向拖拽(按住Shift+Alt 拖拽)
- 取消元素吸附(按住按住Ctrl/Command 拖拽)
- 元素位置微调(选中元素 方向键 调整)
- 撤销(Ctrl/Command + Z)
- 重做(Ctrl/Command + Shift + Z)
- 复制元素(选中元素 Ctrl/Command + C)
- 粘贴复制的元素(Ctrl/Command + V)
其他编辑操作:
- 框选元素:(空白处开始拖拽,出现矩形选区)
- 框选元素微调:(矩形选区 方向键 调整)
- 多选元素对齐:(调用 hiprintTemplate.setElsAlign)
- 多选元素间隙:(调用 hiprintTemplate.setElsSpace)
- 获取多选元素:(调用 hiprintTemplate.getSelectEls)
- 更新多选元素参数:(调用 hiprintTemplate.updateOption)
示例:
// 多选元素对齐: 支持 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);
12 保存模板/导入模板?
// 保存模板
var json = hiprintTemplate.getJson();
// 保存模板 tid 模式 (数据相对少一些,但是一定需要先 init 对应 provider)
var jsonTid = hiprintTemplate.getJsonTid();
// 导入模板
hiprintTemplate.updata(json);
// 多面板模板导入,选中第二个面板
hiprintTemplate.updata(json,1);
13 图片元素选择图片?
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();
}
});
14 关于打印纸张大小问题?
插件只是模拟一个打印的纸张大小的画布
, 实际打印
还是需要打印机支持
对应的纸张大小
才行。
浏览器打印
,需要勾选对应的纸张大小
,(需要打印机先设置,不会就百度)
直接打印
,需要设置打印机默认为该模板的纸张大小
,这是由于 electron API 的 bug
转pdf打印
这是一个预览功能
,请下载最新打印客户端源码
测试
// 关键是两个参数: type:'pdf', pageSize:'80x80'
var options = {type:'pdf',pageSize:'打印机自定义的纸张大小名称', printer: '打印机名称', title: '打印标题'}
iprintTemplate.print2(printData, options);
15 关于提问的问题?
吐槽一下😂~ 有些小伙伴在群里,发的问题,真的是不太容易理解,或者说是看不懂。所以...
1 不要连 “截图” 都没有
为什么最好带上截图
呢? 因为每个人的表达能力和理解能力都不一样
。当然也不能只发
个截图
,描述都没有。
有时你觉得你描述的很清楚
了,换个角度,别人就一定能理解清楚你说的是什么了吗
?
所以提问的时候
尽可能的,表达清楚你遇到的问题,带上截图或许是麻烦了一些,但是对于大多数码仔来说,有图,或许就有真相。我相信大多
技术圈的码友
看到BUG截图
,还是会好奇
去点开看看
的。
至少,我看到截图的时候,会想着点开看看这是个什么 BUG
2 不要愚蠢的 “反问/确认“
有时候
确实“需要反问/确认
”一下,比如你跟客户/老板沟通需求
的时候,没太理解的时候。
但是我觉得这不适合在技术圈子里
,当你反问的时候
,你应该去实践操作
一下,而不是在这里等着别人,回复没错,是的
。至少在我看来,更喜欢看到
你回复
,好的,谢谢,我试试
。
“反问/确认”
这看着没毛病
,实际好像感觉是别人没跟你讲清楚一样
😂
当别人指出了问题,或者提出建议之后,动手实践去吧。
总结
以上是只是部分使用过程中
的一些常见问题
。 实际开发中,可能还会有
更多的使用问题
。
有问题不要怕,要仔细翻阅文档! 有问题不要怕,要仔细翻阅文档! 有问题不要怕,要仔细翻阅文档!
下一篇,将会罗列一些常用元素
使用参数问题
。或者说是实际开发
过程中,一些需求的处理
。
敬请期待下一篇😄~
欢迎各位码友转发
及留言反馈
,觉得不错就点个赞
再走咯~