Code Monkey home page Code Monkey logo

vue-plugin-hiprint's Introduction

image image Gitee star Gitee fork image image image image image

关于此插件

vue-plugin-hiprint(基于hiprint 2.5.4) 当时只是为了方便我(并非hiprint原作者) 在vue项目中引入使用,所以以此命名。

插件仅仅是一个JavaScript【工具库】而非 Vue【组件库】,所以它默认是不包含demo中所见的那些组件页面的(demo代码随便复制修改拿去用)。

由于hiprint官网最后一次更新时间为2019年【hiprint 2.5.4 是 LGPL 协议】,后在诸多使用者及反馈下进行了许多优化调整。更新日志(同时感谢各位群友支持和参与)

vue-plugin-hiprint 更新日志

hiprint for Vue2.x / Vue3.x (基于jQuery, 理论上应该也是支持其他框架的)

jQuery/uniapp 项目 见下方 [jQuery/uniapp 项目使用](#jQuery/uniapp 项目使用)

注意事项!!

  • NodeJs 需要 16.x 版本 (开发使用的 16.18.1)
  • 【vue-plugin-hiprint】与【hiprint.io官网】差异甚多,请忽混用!请忽混用!请忽混用!
  • 请使用我提供的打印客户端,或者自行修改打印客户端的源码,以适配本项目的模板!
  • 主分支是融合版本的最新代码,如果你不需要修改 hiprint 相关代码. 请使用 npm 包的方式安装.
  • 使用直接客户端时,本地开发连接没问题,部署到线上出现跨域无法连接打印客户端问题:
  • 线上跨域问题,请升级 https! 说明:https://www.cnblogs.com/daysme/p/15493523.html
  • 如需提交 PR 请前往 github 合并后可自动发布npm包并同步代码到 gitee
  • vue-plugin-hiprint 包不包含UI界面,需要自行处理。如果想更快速引入请查看 sv-print组件库

快速链接

Demo预览:https://ccsimple.gitee.io/vue-plugin-hiprint/(已挂,恢复看gitee官方情况)

Github Demo预览:https://ccsimple.github.io/vue-plugin-hiprint/(慢,请墙)

更新记录:npm包版本及更新记录

打印客户端:https://gitee.com/CcSimple/electron-hiprint

文章链接

入门篇: 【vue-plugin-hiprint】使用-入门篇

进阶篇: 【vue-plugin-hiprint】使用-进阶篇

provider: 【vue-plugin-hiprint】如何自定义可拖拽元素 provider

打印篇: 【vue-plugin-hiprint】使用-打印篇

参数篇: 【vue-plugin-hiprint】使用-参数篇

实战动态provider: 【vue-plugin-hiprint】实战-动态provider

实战动态模板: 【vue-plugin-hiprint】实战-动态模板

常见问题汇总①: 【vue-plugin-hiprint】常见问题汇总①

常见问题汇总②: 【vue-plugin-hiprint】常见问题汇总②

常见问题汇总③: 【vue-plugin-hiprint】常见问题汇总③

更多参数的文档请仔细查阅文档

hiprint官方文档:http://hiprint.io/docs/start

本人写的部分文档: https://ccsimple.gitee.io/sv-print-docs/config/hiprint.html

安装使用

npm install vue-plugin-hiprint
<!--【必须】在index.html 文件中添加打印所需样式(此cdn可能不稳定):-->
<link rel="stylesheet" type="text/css" media="print" href="https://cdn.jsdelivr.net/npm/vue-plugin-hiprint@latest/dist/print-lock.css">
<!-- 可以调整成 相对链接/自有链接, 【重要】名称需要一致 【print-lock.css】-->
<link rel="stylesheet" type="text/css" media="print" href="/print-lock.css">

项目截图

拖拽设计使用

import {hiprint,defaultElementTypeProvider} from 'vue-plugin-hiprint'
// 初始化可拖拽的元素
hiprint.init({
  providers: [new defaultElementTypeProvider()]
})
// $('.ep-draggable-item') 包含 tid, 与上边的 provider 中的 tid 对应 才能正常拖拽生成元素
hiprint.PrintElementTypeManager.buildByHtml($('.ep-draggable-item'));
hiprintTemplate = new hiprint.PrintTemplate({
  template: {}, // 模板json
  settingContainer: '#PrintElementOptionSetting', // 元素参数容器
  paginationContainer: '.hiprint-printPagination', // 多面板的容器, 实现多面板, 需要在添加一个 <div class="hiprint-printPagination"/>
  // ------- 下列是可选功能 -------
  // ------- 下列是可选功能 -------
  // ------- 下列是可选功能 -------
  // 图片选择功能
  onImageChooseClick: (target) => {
    // 测试 3秒后修改图片地址值
    setTimeout(() => {
      // target.refresh(url,options,callback)
      // callback(el, width, height) // 原元素,宽,高
      // target.refresh(url,false,(el,width,height)=>{
      //   el.options.width = width;
      //   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.getValue()
    // target.refresh(url)
  },
  // 自定义可选字体
  // 或者使用 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'},
  ],
  dataMode: 1, // 1:getJson 其他:getJsonTid 默认1
  history: true, // 是否需要 撤销重做功能
  onDataChanged: (type, json) => { // 模板发生改变回调
    console.log(type); // 新增、移动、删除、修改(参数调整)、大小、旋转
    console.log(json); // 返回 template
  },
  onUpdateError: (e) => { // 更新失败回调
    console.log(e);
  },
});
// 设计器的容器
hiprintTemplate.design('#hiprint-printTemplate');

代码模式使用

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 });
//文本
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打印,浏览器在的地方他都可以运行' } });
//打印
hiprintTemplate.print({});

i18n 设置

原生为简体中文,英语、德语、西班牙语、法语、意大利语、日语、俄语、繁体中文皆为 AI 机翻,欢迎帮助 订正

可在 init 时传入语言进行设置,默认为 cn

hiprint.init({
  lang: 'en', // 设置语言 ['cn', 'en', 'de', 'es', 'fr', 'it', 'ja', 'ru', 'cn_tw']
});

直接打印 地址端口 与 Token 设置

hiprint.init({
  host: 'http://localhost:17521', // 可在此处设置连接地址与端口号
  token: 'token', // 可在此处设置连接 token 可缺省
});

vue/vue3 全局引入

全局引入,方便在任何地方不引入直接调用打印。示例为代码模式 (拖拽设计请往下看)

// main.js中 引入安装
import {hiPrintPlugin} from 'vue-plugin-hiprint'
Vue.use(hiPrintPlugin, '$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({});

jQuery/uniapp 项目使用

uniapp 需要嵌入到 web 浏览器中.(需要支持 window 全局对象环境)

<!-- index.html -->
<head>
    <!-- 打印样式是必须的,你可以调整成自由链接, 注意名称 print-lock.css -->
    <link rel="stylesheet" type="text/css" media="print" href="https://unpkg.com/vue-plugin-hiprint@latest/dist/print-lock.css" />
    <!-- 下列使用的都是 unpkg提供的 稳定性未知, 建议下载自行处理  -->
    <!-- jquery 必须 -->
    <script src="https://unpkg.com/[email protected]/dist/jquery.js"></script>
    <!-- 条形码 -->
    <script src="https://unpkg.com/[email protected]/dist/JsBarcode.all.min.js"></script>
    <!-- 颜色选择器 -->
    <script src="https://unpkg.com/@claviska/[email protected]/jquery.minicolors.min.js"></script>
    <!-- 直接打印(print2)需要 -->
    <script src="https://unpkg.com/[email protected]/dist/socket.io.min.js"></script>
    <!-- toPdf需要 -->
    <script src="https://unpkg.com/[email protected]/lib/umd.js"></script>
    <script src="https://unpkg.com/[email protected]/dist/jspdf.umd.min.js"></script>
    <script src="https://unpkg.com/[email protected]/dist/html2canvas.js"></script>
    <!-- vue-plugin-hiprint 😃 -->
    <script src="https://unpkg.com/vue-plugin-hiprint@latest/dist/vue-plugin-hiprint.js"></script>
</head>
<body>
<!-- 注意 defer -->
<script defer>
  console.log('vue-plugin-hiprint')
  console.log(window['vue-plugin-hiprint'])
  console.log('hiprint')
  // hiprint 以注入 全局
  console.log(hiprint)
  var autoConnect = window['vue-plugin-hiprint'].autoConnect,
    disAutoConnect = window['vue-plugin-hiprint'].disAutoConnect,
    defaultElementTypeProvider = window['vue-plugin-hiprint'].defaultElementTypeProvider;
</script>
</body>

配套直接打印客户端(win/mac/linux)源码链接

如果使用npm包或者本项目,请使用如下样子的直接打印客户端

image

本项目需要上面样式的直接打印客户端; 下载地址:

https://gitee.com/CcSimple/electron-hiprint/releases

URLScheme hiprint://

安装客户端时请 以管理员身份运行 ,才能成功添加 URLScheme

使用:浏览器地址栏输入 hiprint:// 并回车

URLScheme

// js
window.open("hiprint://")

// element-ui
this.$alert(`连接【${hiwebSocket.host}】失败!<br>请确保目标服务器已<a href="https://gitee.com/CcSimple/electron-hiprint/releases" target="_blank"> 下载 </a> 并 <a href="hiprint://" target="_blank"> 运行 </a> 打印服务!`, "客户端未连接", {dangerouslyUseHtmlString: true})

// ant-design
this.$error({
  title: "客户端未连接",
  content: (h) => (
    <div>
      连接【{hiwebSocket.host}】失败!
      <br />
      请确保目标服务器已
      <a
        href="https://gitee.com/CcSimple/electron-hiprint/releases"
        target="_blank"
      >
        下载
      </a><a href="hiprint://" target="_blank">
        运行
      </a>
      打印服务!
    </div>
  ),
});

配套客户端打印一直存在跨域、无法连接局域网其余打印机、跨网段无法连接的问题,所以诞生了这个中转代理服务。在 electron-hiprint v1.0.0.7 版本中添加了连接中转服务代理的设置,将会在 electron-hiprintnode-hiprint-transit 间建立通信,vue-plugin-hiprint 只需连接中转服务就能获取到所有连接中转服务的打印端信息,并且选择任意打印机进行打印。

连接中转服务只需要修改 host, 添加 token

import { hiprint } from 'vue-plugin-hiprint'

hiprint.init({
    host: 'https://printjs.cn:17521', // 此处输入服务启动后的地址
    token: 'vue-plugin-hiprint',     // 用于鉴权的token
});

// or

hiwebSocket.setHost("https://printjs.cn:17521", "vue-plugin-hiprint")

具体使用请转至 node-hiprint-transit

为此你需要作出这些改变:

  1. 你可以从 hiwebSocket 中获取到 clientsprinterList ,里面都将包含 client 信息

  2. print2、ippRequest、ippRequest api options 中需要添加 client 指定客户端

    eg:

    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】常见问题汇总①

常见问题汇总②: 【vue-plugin-hiprint】常见问题汇总②

常见问题汇总③: 【vue-plugin-hiprint】常见问题汇总③

design时怎么修改默认图片?

<!-- 组件内, 显示的图片-->
<style lang="less" scoped>
/deep/ .hiprint-printElement-image-content {
  img {
    content: url("~@/assets/logo.png");
  }
}
</style>
<!-- App.vue 拖拽时显示的图片-->
<!-- 不要 scoped, 拖拽时是添加到 html body内的-->
<style lang="less">
.hiprint-printElement-image-content {
  img {
    content: url("~@/assets/logo.png");
  }
}
</style>

print/print2 打印回调

// 浏览器预览打印
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('打印失败')
})

打印重叠 / 样式问题

/**
 * 从 0.0.19 起, 在index.html添加:
 * <link rel="stylesheet" type="text/css" media="print" href="https://cdn.jsdelivr.net/npm/vue-plugin-hiprint@latest/dist/print-lock.css">
 * 以处理打印所需css, 当然你也可以自行处理
 * 比如: index.html目录下放一个print-lock.css, 然后在index.html添加:
 * <link rel="stylesheet" type="text/css" media="print" href="/print-lock.css">
 */

// 添加自定义样式
hiprintTemplate.print(this.printData, {}, {
  styleHandler: () => {
    // 这里拼接成放html->head标签内的css/style
    // 1.例如:使用hiprin官网的样式
    let css = '<link href="http://hiprint.io/Content/hiprint/css/print-lock.css" media="print" rel="stylesheet">'
    // 2.重写样式:所有文本红色
    css += '<style>.hiprint-printElement-text{color:red !important;}</style>'
    return css
  }
})
// 直接打印
hiprintTemplate.print2(this.printData, {
  styleHandler: () => {
    // 这里拼接成放html->head标签内的css/style
    // 1.例如:使用hiprin官网的样式
    let css = '<link href="http://hiprint.io/Content/hiprint/css/print-lock.css" media="print" rel="stylesheet">'
    // 2.重写样式:所有文本红色
    css += '<style>.hiprint-printElement-text{color:red !important;}</style>'
    return css
  }
})

修改默认配置 / 显示/隐藏元素设置参数

// 0.0.13, 新增setConfig方法
// 还原配置
hiprint.setConfig()
// 替换配置
hiprint.setConfig({
  movingDistance: 2.5,
  text:{
    supportOptions: [
      {
        name: 'styler',
        hidden: true
      },
      {
        name: 'formatter',
        hidden: true
      },
    ]
  }
})

取消自动socket连接 / socket连接报错问题

/**
 * 取消自动连接
 */
// 在main.js中设置
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'
disAutoConnect();
// 同时 export了 autoConnect,disAutoConnect 方法
/**
 * 连接回调及打印
 */
autoConnect((status,msg) => {
  if (status) {
    hiprintTemplate.print2(printData, {printer: '', title: 'hiprint测试打印'});
  }
});
/**
 * socket连接报错?
 * 由于npm包更新到socket.io 3.x版本,官网提供的客户端,npm包是无法连接的
 * 请使用gitee提供的客户端, 同时gitee客户端可传更多的参数, 如是否打印颜色/打印份数/DPI等
 * 详情electron见:https://www.electronjs.org/zh/docs/latest/api/web-contents
 */

参与项目

git clone https://gitee.com/CcSimple/vue-plugin-hiprint.git
// init
cd vue-plugin-hiprint
npm i
// 调试预览
npm run serve
// 打包
npm run build

demo调试(显示打印iframe)

// 快速显示/隐藏 打印iframe  方便调试  ̄□ ̄||
// 在浏览器控制台输入:
// 显示打印页面
$('#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');

交流群

群人数已超过200 请 '加我好友' 备注加群, 邀你进群

捐赠支持, 或者请我喝杯咖啡☕️

如果对您有帮助,请点击右上角⭐Star关注或扫码捐赠,感谢支持开源!

状态/调整/优化 请查看更新记录

本项目使用 开发

分支说明

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包(0.0.18)使用 示例

关于如何融合处理

自己融合请查看 vue.config.js 对比 hiprint.bundle.js

webpack.config.js,是npm打包需要处理的

开源使用说明

npm包是基于hiprint官网2.5.4版本基础做的调整及优化;
本人对开源协议理解有限,如有侵权不合理的地方,请联系告知我;

hiprint 开源协议如下:

/**
 * jQuery Hiprint 2.5.4
 *
 * Copyright (c) 2016-2021 www.hinnn.com. All rights reserved.
 *
 * Licensed under the LGPL or commercial licenses
 * To use it on other terms please contact us: [email protected]
 *
 */

关于LGPL协议

LGPL是GPL的一个为主要为类库使用设计的开源协议。和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同。

LGPL允许商业软件通过类库引用(link)方式使用LGPL类库而不需要开源商业软件的代码。这使得采用LGPL协议的开源代码可以被商业软件作为类库引用并发布和销售。

但是如果修改LGPL协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用LGPL协议。

因此LGPL协议的开源代码很适合作为第三方类库被商业软件引用,但不适合希望以LGPL协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。

GPL/LGPL都保障原作者的知识产权,避免有人利用开源代码复制并开发类似的产品。

vue-plugin-hiprint's People

Contributors

arcadian5916 avatar ccsimple avatar george-hong avatar heiyu4585 avatar jamboy avatar jarrywong avatar kevinmoo avatar nbb2025 avatar scottman1001 avatar sunlibin730 avatar the-didi avatar tuohuang avatar weaponready avatar xavier9896 avatar xiaolonggee avatar zurrtum avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

vue-plugin-hiprint's Issues

【Bug】- 二维码设置内边距后,二维码图片超出

问题描述

二维码设置内边距后,二维码图片超出。

环境信息

  • vue-plugin-hiprint 版本:latest
  • UA: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
  • Vue/React 版本:
  • 构建工具:Vue CLI / Webpack / Rollup / Vite / 其他

复现步骤

二维码设置内边距后,二维码图片超出。

  1. 步骤一
  2. 步骤二
  3. ...

期望行为

二维码设置内边距后,二维码应该包在组件的内边距的内部。

实际行为

二维码设置内边距后,二维码图片超出。

截图、录屏(如果适用)

JW412LG__S2{~Y`J$(7B8JO

环境信息

  • 操作系统:
  • 浏览器(如果适用):
  • 项目版本或 commit 哈希:

其他信息

提供任何其他可能与问题有关的信息。


注意: 在提交问题之前,请确保已经搜索了现有的问题,以避免重复报告。

[Bug]:表格列有图片时,表格不换行,会和其它元素重叠;且单元格高度设置不生效

使用的版本

latest

版本号

No response

你的安装方式

NPM 依赖

你的操作系统

Windows

你的浏览器

Chrome

你的项目编程语言

None

问题描述

直接下载线上demo代码,将表格的打印数据其中一列换成图片地址,模板也将该列字段类型设置成图片展示,并且设置单元格高度;
首次点击预览时,会出现表格不换行,和其它元素重叠;
单元格高度设置是一直不生效

如何复现

print-data.json
template.json

预期结果

表格正常显示

实际结果

表格不换行却与其他元素重叠

截图或视频

c446184d_5451830

这个问题是否已经存在?

设计器,表格列没有绑定数据字段的属性

设计器中表格列没有绑定数据字段的属性,版本是0.5.4-fix,如果在项目里通过options设置,field属性会出现在列属性列表的最后。这个常用属性还是在最前面合适。

动态修改表格下拉 🤪

请问有没有办法,有两个下拉列表,动态修改表格字段名,更新字段对应的下拉列表。
image

[Bug]:条形码不能隐藏“条形码:”前缀。

使用的版本

latest

版本号

0.0.56

你的安装方式

NPM 依赖

你的操作系统

MacOS

你的浏览器

Chrome

你的项目编程语言

Vue 2

问题描述

条形码组件,打印的时候无法隐藏“条形码:” 前缀,只能是选择全部隐藏内容,或者全部显示内容
image
我只想显示 23432

如何复现

1.打开演示demo
2.拖拽一个条形码组件到 模版中
3.没有参数可以隐藏掉 “条形码:” 这几个字

预期结果

不应该显示“条形码:”这几个字,一般二维码中都不会 写 “条形码:xxxx”,只显示 23432

实际结果

显示 条形码:23432

截图或视频

[在这里上传图片]
image

这个问题是否已经存在?

关于浏览器直接打印几点小建议

1.当点击浏览器时直接打印时基于iframe的打印弹窗时表格没有背景色。
解决方案:
iframe引用同一css文件会导致该css无效需避免引用父窗口的同名css(换个名称即可),其次需要修改hiprint.bundle.js文件修改以下方法,代码如下

t.prototype.getPrintStyle = function () {
    return "<style printStyle>@page{border:0;padding:0cm;margin:0cm;" + this.getPrintSizeStyle() + "}\n div{-webkit-print-color-adjust: exact;print-color-adjust: exact;color-adjust: exact;}</style>";
}

image

2.基于浏览器直接打印希望增加通过批量合并HTML打印预览
说明:可以通过该方式打印较少数量模板,太多会导致浏览器性能消耗过大卡死,当大量数量时可以考虑服务器渲染截图合并成一个PDF返回给前端调用打印,或者客户端打印
解决方案:
修改jquery.hiwprint.js文件,代码如下

 // htmlList为数组,数组值来源hiprint中的getHtml方法
 $.fn.hiwprint = function (options, htmlList) {
      ...
      // 处理打印时的HTML判断是单个还是批量打印
      if (htmlList && htmlList.length > 0) printDocument.body.appendChild(batchAddHtml(htmlList))
      else printDocument.body.innerHTML = opt.printContainer ? $element[0].outerHTML : $element.html();
      ...
 }
 /**批量添加HTML节点*/
 function batchAddHtml(list) {
    let frag = document.createDocumentFragment();
    list.forEach(item => {
      let divDom = document.createElement("div");
      divDom.innerHTML = item;
      frag.appendChild(divDom);
    })
    return frag;
  }

【Bug】- 条形码的描述文字在组件的外面,而不是里面,应修改

问题描述

条形码的描述文字在组件的外面,而不是里面,应修改。

环境信息

  • vue-plugin-hiprint 版本:latest
  • UA: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
  • Vue/React 版本:
  • 构建工具:Vue CLI / Webpack / Rollup / Vite / 其他

复现步骤

条形码的描述文字在组件的外面,而不是里面,应修改。

  1. 步骤一
  2. 步骤二
  3. ...

期望行为

把条形码描述文字放到组件的里面。

实际行为

描述实际发生的问题行为。

截图、录屏(如果适用)

GEAS9X`IPDNQ93C_1CRN5

环境信息

  • 操作系统:
  • 浏览器(如果适用):
  • 项目版本或 commit 哈希:

其他信息

提供任何其他可能与问题有关的信息。


注意: 在提交问题之前,请确保已经搜索了现有的问题,以避免重复报告。

[Bug]:条形码选择旋转90度,显示效果和打印效果都发生错误

使用的版本

latest

版本号

0.0.56

你的安装方式

NPM 依赖

你的操作系统

Windows

你的浏览器

其他

你的项目编程语言

Vue 3

问题描述

我正在开发物流面单打印模板,发现竖着打条码,样式效果发生变形

如何复现

1.添加条形码
2.样式中选择旋转角度,点击确定

预期结果

应该是竖着显示,宽高收到我的控制

实际结果

宽度溢出严重溢出

截图或视频

[在这里上传图片]
企业微信截图_20240403155933

这个问题是否已经存在?

[Bug]:表格打印使用rowsColumnsMerge处理合并列,在表格打印到第二页时显示合并异常

使用的版本

latest

版本号

0.0.56

你的安装方式

NPM 依赖

你的操作系统

Windows

你的浏览器

Chrome

你的项目编程语言

Vue 2

问题描述

表格数据中使用rowType字段来区分这一行是否需要合并,rowType=‘elsetype'时处理合并,在打印只有一页时显示正常,两页时,第二页合并列显示异常

  function(data, col, colIndex, rowIndex) {
   //其他费用templateGroupItemName列合并两个列
    if (data.rowType === 'elseitem' && col.field == 'templateGroupItemName') {
      return [1,2 ];
    } else if (data.rowType === 'elseitem' && col.field == 'templateGroupItemDesc') { 
       //其他费用templateGroupItemDesc列合并6个列
      return [1, 6];
    } else if (data.rowType === 'elseitem') { //其他费用项行其他列隐藏
      return [0, 0];
    }
   //其他单元格正常显示
    return [1, 1];
  }

如何复现

提供我使用的打印模板和打印数据预览可复现
print-data.txt
template.txt

预期结果

合并列正常显示

实际结果

不正常,第二页的第一行虽然合并了,但是应该隐藏的格子却显示了

截图或视频

[在这里上传图片]
1704340133283

这个问题是否已经存在?

vite打包问题

vite打包时报错Use of eval is strongly discouraged;vite打包会出现eval安全问题;希望尽快解决

不分页BUG

  1. 含有长文本元素时过早分页
  2. 调整表格列顺序后纸张高度缩小到表格底部附近

[Bug]:自启时无法隐藏打开应用

使用的版本

latest

版本号

No response

你的安装方式

下载源码 融合

你的操作系统

Windows

你的浏览器

Chrome

你的项目编程语言

None

问题描述

自启时无法隐藏打开应用

如何复现

自启

预期结果

隐藏到托盘

实际结果

窗口无法关闭

截图或视频

[在这里上传图片]

这个问题是否已经存在?

当页眉线在页脚线下时会导致预览卡死

当调整页面尺寸后可能会导致页眉线在页脚线下,在预览时就会出现卡死情况,经过调试发现hiprintTemplate.getHtml() 该方法存在问题,猜测该方法内部出现判断错误,导致内部不停循环。

官网打印预览不显示测试数据问题

  1. 浏览器版本:
    chrome 120.0.6099.129 正式版本

  2. 出现问题:
    我在使用vue-plugin-hiprint生成打印预览的时候,我发现我生成的打印预览无法预览到控件中填入的testData:
    1703251735092
    1703251746234

同时我在gitee的demo页面中预览测试数据也不能看到测试数据:
1703251830145
1703251850167
https://ccsimple.gitee.io/vue-plugin-hiprint/

我使用的版本是: "vue-plugin-hiprint": "0.0.55-beta20"

打印出来的pdf也是没有任何信息的,请问这个情况有人遇到过吗

1.我希望有一个自定义函数列表来进行选择功能函数,然后去重构了他,但是不生效

使用的版本

latest

版本号

2.5.4

你的安装方式

NPM 依赖

你的操作系统

Windows

你的浏览器

Chrome

你的项目编程语言

Vue 2

问题描述

1.我希望有一个自定义函数列表来进行选择功能函数,然后去重构了他,但是不生效

如何复现

import { getfunction } from '@/api/design'

export default (function() {
var function_list = []
getfunction().then(response => {
if (response.code === 200) {
function_list = response.data.list
console.log(response.data.list)
console.log(function_list)
} else {
this.msgError(response.msg)
}
})
function t() {
// json模板 options 对应键值 key
this.name = 'formatter'
}
// 在这里添加你的函数
// function customFontSize(value, options, target, templateData) {
// const aa = 17.75
// const maxwidth = options.width
// const maxheight = options.height
// let fontSize = options.fontSize || aa
// const arr = value.split('·')
// let num = 0
//
// if (value.indexOf('·') !== -1) {
// for (let i = 0; i < arr.length; i++) {
// num = num > arr[i].length ? num : arr[i].length
// }
// } else {
// num = value.length
// }
//
// const fontHeight = value.split('·').length
//
// while (fontHeight * fontSize > maxheight) {
// fontSize = fontSize - 0.5
// }
//
// while (num * fontSize > maxwidth) {
// fontSize = fontSize - 0.5
// }
// return fontSize
// }
// function (value,options,target,templateData){ let aa=17.75; let maxwidth = options.width; let maxheight = options.height; let fontSize = aa?aa:options.fontSize; let arr=value.split('·'); let num=0; if (value.indexOf('·')!==-1){ for (let i=0;i<arr.length;i++){ num=num>arr[i].length?num:arr[i].length; } }else { num=value.length+1; } let fontHeight=value.split('·').length; while(fontHeightfontSize>maxheight){ fontSize=fontSize-0.5; } while (numfontSize>maxwidth){ fontSize=fontSize-0.5; } return {'font-size':fontSize+'pt'} }
// 涉及修改元素样式, 添加一个 css 方法
// t: 元素对象, e 参数值
return t.prototype.css = function(t, e, i) {
return null
},
// 创建 DOM
t.prototype.createTarget = function() {
const list = function_list
let fontSizeList = '\n 默认'
list.forEach(function(e) {
fontSizeList += '\n ' + e.title + ''
})
this.target = $('

\n
\n 自定义函数\n
\n
\n \n
\n
')
this.target.find('.auto-submit').append($(fontSizeList))
return this.target
},
// 获取值
t.prototype.getValue = function() {
var t = this.target.find('select').val()
console.log(t)
if (t) return parseFloat(t.toString())
},
// 设置值
t.prototype.setValue = function(t) { // t: options 对应键的值
t = function(title, value, options, templateData, target) {
return value.slice(-3)
}
this.target.find('select').val(t)
this.target.find('textarea').val(t ? t.toString() : null)
},
// 销毁 DOM
t.prototype.destroy = function() {
this.target.remove()
}, t
}())

预期结果

1.formatter 重构下拉框,设置函数生效

实际结果

1.formatter 重构下拉框,设置函数不生效

截图或视频

[在这里上传图片]

这个问题是否已经存在?

单模板动态打印不显示第一页了

打印模板:
"panels": [ { "index": 0, "name": 1, "height": 297, "width": 210, "paperHeader": 49.5, "paperFooter": 780, "printElements": [ { "options": { "left": 232.5, "top": 15, "height": 9.75, "width": 166, "title": "测试 Print 打印", "coordinateSync": false, "widthHeightSync": false, "fontSize": 24, "qrCodeLevel": 0 }, "printElementType": { "title": "文本", "type": "text" } }, { "options": { "left": 257.5, "top": 167.5, "height": 80, "width": 80, "title": "二维码", "qrcodeType": "qrcode", "testData": "qrcode", "right": 337.49609375, "bottom": 246.9921875, "vCenter": 297.49609375, "hCenter": 206.9921875 }, "printElementType": { "title": "二维码", "type": "qrcode" } }, { "options": { "left": 465, "top": 535, "height": 9.75, "width": 120, "title": "时间:", "field": "time", "coordinateSync": false, "widthHeightSync": false, "qrCodeLevel": 0 }, "printElementType": { "title": "文本", "type": "text" } }, { "options": { "left": 465, "top": 557.5, "height": 9.75, "width": 120, "title": "签字:", "field": "name", "coordinateSync": false, "widthHeightSync": false, "qrCodeLevel": 0 }, "printElementType": { "title": "文本", "type": "text" } } ], "paperNumberLeft": 565.5, "paperNumberTop": 819, "paperNumberContinue": true, "watermarkOptions": { "content": "vue-plugin-hiprint", "rotate": 25, "timestamp": true, "format": "YYYY-MM-DD HH:mm", "fillStyle": "rgba(184, 184, 184, 0.3)", "fontSize": "14px", "width": 200, "height": 200 } } ] }

打印代码:
image

效果:
image
image
第二页是空白的

插件存在安全问题,被建议不要使用

用node打包的时候发现警告

node_modules/vue-plugin-hiprint/dist/vue-plugin-hiprint.js (1:40429) Use of eval in "node_modules/vue-plugin-hiprint/dist/vue-plugin-hiprint.js" is strongly discouraged as it poses security risks and may cause issues with minification.
node_modules/vue-plugin-hiprint/dist/vue-plugin-hiprint.js (1:40668) Use of eval in "node_modules/vue-plugin-hiprint/dist/vue-plugin-hiprint.js" is strongly discouraged as it poses security risks and may cause issues with minification.
node_modules/vue-plugin-hiprint/dist/vue-plugin-hiprint.js (1:56939) Use of eval in "node_modules/vue-plugin-hiprint/dist/vue-plugin-hiprint.js" is strongly discouraged as it poses security risks and may cause issues with minification.

说存在安全风险,强烈不建议使用,为什么呢

!!使用时各种常见问题

1.打印重叠或者样式问题

// 在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">

2.修改默认配置 或者 显示/隐藏元素设置参数

import { hiprint } from 'vue-plugin-hiprint'
// 还原配置
hiprint.setConfig()
// 替换配置  相关配置可控制台输入 window.HIPRINT_CONFIG 查看
hiprint.setConfig({})

3.连接客户端/不自动连接客户端

import {autoConnect, disAutoConnect} from 'vue-plugin-hiprint'
// autoConnect(); // 默认会自动连接
disAutoConnect(); // 取消自动连接

4.连接局域网内其他客户端

import { hiprint } from 'vue-plugin-hiprint'
hiprint.hiwebSocket.setHost("http://192.169.0.6:17521")
// 或者
window.hiwebSocket.setHost("http://192.169.0.6:17521")

5.打印回调问题

// 浏览器预览打印
hiprintTemplate.print(this.printData, {}, {
  callback: () => {
    // 浏览器不同, 无法监听是点了 ‘打印’ 还是 ‘取消’
    console.log('浏览器打印窗口已打开')
  }
})
// 直接打印
hiprintTemplate.print2(printData, {printer: '打印机名称', title: '打印标题'})
hiprintTemplate.on('printSuccess', function (data) {
  console.log('打印完成')
})
hiprintTemplate.on('printError', function (data) {
  console.log('打印失败')
})

打印表格问题

  1. 表格每页距离页眉线和页尾线的距离不一致

image

  1. 自动补全功能autoCompletion超出页尾线

1670139653746

[Bug]:image toPdf的时候不能显示图片

使用的版本

latest

版本号

No response

你的安装方式

NPM 依赖

你的操作系统

Windows

你的浏览器

Edge

你的项目编程语言

Vue 3

问题描述

image
image
image
image
打印和预览都是正常的,但是导出图片或导出pdf是不显示,请问如何解决

如何复现

如上

预期结果

如上

实际结果

如上

截图或视频

[在这里上传图片]
image
image
image
image

这个问题是否已经存在?

[Bug]:表格中存在多列rowSpan时多页rowSpan错误

使用的版本

latest

版本号

No response

你的安装方式

NPM 依赖

你的操作系统

Windows

你的浏览器

Chrome

你的项目编程语言

Vue 2

问题描述

从左边拖过来的表格元件,如果数据超过一页,第2页的排版会错乱掉,原因是某些列的单元格的rowspan的值变成该页的行数,会纵向合并单元格,导致整个表格变形

如何复现

1、从左边拖过一个表格
2、将表格的数据记录设置得多一些(超过一页)
3、执行打印,或输出打印的html

预期结果

分页后,第2页的字段与第1页的表格保持一致,且排版正常

实际结果

分页后,第2页表格会多出几个空白列,原因是单元格的rowspan设置错误。

截图或视频

参考下面异常情况与正常情况的对比:
image
image

这个问题是否已经存在?

希望extendCss能作为配置项保存在模版配置中

这是一个什么样的功能?

希望extendCss能作为配置项保存在模版配置中

这个功能可以干什么?

像模版中心中的extendCss是否也否也能作为配置项,存储在模板信息中呢,感觉这样会好点, 内部的打印方法就可以直接使用了

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.