html打印成功回调,web前端打印实现
8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
背景需求基于 web 现代浏览器实现批量打印电子面单(规格固定),各种带条码的单据(规格范围不固定);如下所示
web 打印技术调研
浏览器的菜单打印功能
这是最简单的,只需点击页面上的打印菜单,但是也是问题最多的,基本上是不能满足用户需要。比如:不能精确分页,有出现打出半行字的风险;改变纸型后打印出的格式和页面显示的格式相差太大;页眉页脚也需要从菜单中去设置,等等等等。这种方案最大的优势就是不需要做任何代码,点击打印就可以了。
window.print()
这实际上,是浏览器打印功能菜单的一种程序调用。与点击打印功能菜单一样,不能精确分页,不能设置纸型,套打的问题更加无从谈起,只不过,可以让用户不用去点菜单,直接点击网页中的一个按钮,或一个链接里面调用罢了。
需要指出的是这种方法提供一个打印前和打印后的事件 onbeforeprint、onafterprint。可以在打印前的时候重新编辑一些格式,专门送去打印,打印后又处理回来。1
2
3
4
5
6
7
8function .onbeforeprint()
{
}
function .onafterprint()
{
//放开隐藏的元素
}
事实上,很多用户都是采用这种方式打印,但是这种方式最致命的缺点是不能设置打印参数,比如纸型,页边距,选择打印机等等。
导出 excel 导出 pdf 文件的打印
将需要打印的数据导出 excel 文件或者导出 pdf 文件,然后打开 excel 文件或者 pdf 文件重新打印,用这种方案能实现精确的打印,套打也能实现,但是需要客户端安装 excel 和 adobe 软件,操作起来也有些麻烦,并且导出的 excel 文件可以重新修改编辑,一般用户都会要求系统提供这种导出的方案,也同时需要直接打印的功能,所以个人觉得这种方案也不能很好的解决打印的问题。
纯 activex 控件
这种方案其实就是编写一个 c/s 的打印控件,然后嵌入到页面里面,将要打印的数据装入到控件中,然后打印。这种方案的优点是打印精度高,分页,设置打印参数等等都能实现。但是缺点也是很明显的,嵌入 activex 控件破坏了 web 应用的整体 html 风格,且这样的控件通常都比较大,一般都超过 1m,下载很慢。
applet 方式
采用 applet 方式,分页或精确打印,都可以做到完美,但缺点也很明显,表现在:
安装 applet 成本巨大。需要下载十几 m 的文件。
applet 本身可能并不大,但运行 applet 所需的 jre 一般>10m。用户需要极大的耐心,来进行打印。
打印报表时,需要重新向服务器检索数据,效率低。
因为 applet 方案,一般采用 html 方式呈现数据,打印时 applet 必须向服务器检索同一张票据的数据,看上去,是打印了当前页的票据,实际上,applet 根本不会用当前 html 页的数据来打印,而是向服务器下载数据到 applet 中来打印。也就是说,打印的话,必须两次请求,一次 html 呈现,一次用来打印。
市场上 java 类的报表工具,一般推荐 applet 方式来实现打印。
轻量级的 activex 插件+ dhtml + javascript +后台代码(动态获取数据)
轻量级 activex 插件:设置打印参数,比如预定义纸型,设置打印方向,打印边距,指定打印机,不弹出打印对话框直接打印等等。
dhtml + javascript 编辑打印数据的格式展现,实现格式的自定义。
后台代码,可以是 java,dotnet 等等的,实现动态获取打印数据。
这种方案是比较理想的,只需要客户端下载一个很小的打印插件,客户端无需安装任何 c/s 的格式设计以上来源:
主要有如下主流控件:ScriptX
PAZU
jatoolsPrinter
lodop
国内主要是 jatoolsPrinter 和 lodop,对比后 lodop 最合适——技术支持,免费的开放功能丰富
lodop 实现打印
打印工具说明
Web 打印控件Lodop
以插件形式扩展 JavaScript 打印编程接口,使得 web 可以操作控制打印,支持超文本打印或自定义指令打印
打印设计流程页面检测打印控件安装状态并提示
用户设置打印机、打印格式、字体等
勾选表格数据并点击打印弹框预览
打印状态返回并修改单据打印状态
项目实现
基本流程打印控件引入及引导安装控件 JS 文件——LodopFuncs.js
对该文件的主函数 getLodop 模块化导出,修改相关文件里安装、调用和升级的程序代码为项目的弹框提示,去除升级检测。1export function getLodop(oOBJECT, oEMBED){}
控件在页面内以 object 元素形式被引用。设置元素的 width 和 height 等于 0 来隐藏控件。
采用 js 动态拼接字符串生成 html+css 的超文本并发送到打印插件进行打印1LODOP.ADD_PRINT_HTM('0mm', '0mm', '100%', '100%', strFormHtml)
设置定时器监听回调捕获打印状态1
2
3
4LODOP.On_Return_Remain = true
LODOP.On_Return = function(TaskID, Value){
// 根据TaskID和Value判断打印状态
}
模块化封装并设置打印回调模块化各个打印单据类型
项目里面有多个单据,打印的排版,指定打印机,内容等都有所不同,通过定义一个打印主函数,模块化封装各个单据及对应对应参数。我们只需在页面中调用函数并传入单据类型、打印数据及相关参数就可以实现具体单据的打印。1
2
3
4
5
6
7
8
9
10
11
12
13
14export printDemo1 = function(data){
printStyle = `样式控制`
printHtml = `填入数据的html模板`
const params = {
type: `Demo1`,
printStyle: printStyle,
printHtml: printHtml,
size: {
width: 800,
height: 600
}
}
return params
}
主函数流程控制
根据传入不同单据类型做处理并执行打印指令1
2
3
4
5
6
7
8
9
10
11import printDemo1 from './printModule/demo1'
export function print(type, data){
switch (type) {
case 'Demo1':
{
let params = printDemo1(data)
return doPrint(params)
}
case 'Demo2': ...
}
}
doPrint 函数执行打印返回一个 promise 对象,打印取消、成功或失败后的回调1
2
3
4
5
6
7
8
9
10function doPrint(params){
return new Promise(function (resolve, reject){
// 打印取消
reject('cancel')
// 打印成功
resolve('success')
// 打印失败
reject('error')
}
}
实际调用1
2
3
4
5
6
7
8
9
10
11print(data)
.then(res => {
console.info('打印成功')
})
.catch(err => {
if (err === 'cancel') {
console.warning('打印取消')
} else {
console.error('打印失败')
}
})
电子面单打印——菜鸟打印组件
打印工具说明菜鸟打印组件——模板设计器、打印客户端以及相应的接口和协议(菜鸟物流接入的电子面单都可以打除了顺丰)
模板设计可自定义设置电子面单模板并生成相关代码
打印机客户端用于 web 交互通讯打印相关电子面单
相关接口协议用于前端 web 调用并控制打印设置
打印流程
菜鸟打印 demo 文档
大致流程如下,相关代码均可写在一个 cainiaoChat.js 文件中并像 lodop 打印那样子模块化并做相关回调处理,打印的实现效果也和上文一致。相关的接口文档比较完善这里就大致讲解一下。
连接打印机
打印组件客户机soket接口为13528(https的话,端口是13529)
新建websoket连接打印组件并设置相关websoket监听事件
配置打印机,可配置项如下:
打印机名称
模板上下联logo
水平和垂直偏移量
页面有无空边
打印机纸张宽高
获取电子面单数据并构建打印请求
异步请求获取到要打印的电子面单数据=>按照格式要求构造request对象=>把request用websoket发送至菜鸟组件生成电子面单=>打印或预览设置
html打印成功回调,web前端打印实现相关推荐
- web前端打印页面,并在图片上加水印
在不影响页面显示的情况下,单一的前端打印页面,使用下面的方法,交互是比较顺畅的,代码撸给大家做参考.解决的问题点如下: 1.纯前端打印页面,并且保证打印的页面数据显示不会被篡改. 2.不影响页面显示, ...
- html打印表格自动分页,Web分页打印 细线表格+分页打印之终极攻略
Web分页打印 细线表格+分页打印之终极攻略 发布时间:2009-03-01 23:46:40 作者:佚名 我要评论 最近给客户做打印的时候,客户提出打印时不要打印该页面的头,只是打印表格里面 ...
- WEB前端打印使用记录
一.window.print(); 1.使用记录 printTable(){//获取body页面内容const bdhtml = window.document.body.innerHTML;//根据 ...
- Lopod 前端打印插件基础用法
Lopod 前端打印插件 一款前端打印插件,可实现各个前端打印功能,并且跨浏览器.官网:[http://www.lodop.net/index.html] (http://www.lodop.net/ ...
- Web 前端通过调用ActiveX实现LPT1端口小票机打印功能。
最近项目中发现Web前端通过javascript是无法实现调用LPT1端口进行特定格式的打印的.而直接采用浏览器的打印会导致打印的全部为乱码. 后经查阅各方资料可以采用调用ActiveX方法实现小票机 ...
- html文本打印lt;igt;字段,Web前端学习第九课,使用文本格式化标签
1.如何给元素添加样式? 通过前面的学习大家知道,在web前端中,元素所显示出来样子称为表现,专业处理元素长什么样子的技术主要是CSS(层叠样式表). 不过在HTML语言中,你可以用以下两种方式先进行 ...
- 写一个php web符号打印成沙漏的形状,打印
测试类中很常见,出现这个异常不要惊慌- - 原因:就是单纯的测试结束了 解决:自己在控制台上翻,可看见打印的测试结果,无打印的也完成了测试,强迫症患者可以在测试方法后加个while(true){} 没 ...
- 前端为什么有的接口明明是成功回调却执行了.catch失败回调_Web前端:ES6是干什么的?(下)...
大家好,我来了!本期为大家带来的Web前端学习知识是"Web前端:ES6是干什么的?(下)",喜欢Web前端的小伙伴,一起看看吧! 主要内容 Promise Generator A ...
- VUE使用lodop实现前端打印页面指定内容
最近做项目,遇到一个需要页面无需下载在线打印Word的功能,最初尝试直接打印页面,会导致将整个页面都打印出来,不符合要求.后期客户要求要使用lodop,这样打印与页面展示Word两个方面都是未知的东西 ...
- 发现了一个好用的WEB项目打印控件--四方打印
PAZU 与WEB打印 PAZU 组件应用于基于WEB的开发 PAZU 提供以下三大类功能: 1.控制IE窗口的外观和行为 1.1 通过 JavaScript 隐藏IE的地 ...
最新文章
- LeetCode:Merge Intervals
- legend3---Homestead中Laravel项目502 Bad Gateway
- 034_webpack中的加载器
- mysql 缓存监控_MySQL监控性能的一些方法总结
- Nslookup-查dns
- 对你的的应用程序进行Debug
- C++ —— C++运算符与表达式
- Html中解决点击 a 标签刷新的问题,实现点击时不刷新
- 如何远程调试zookeeper集群
- 第二章节 ASP.NET 验证控件(二)
- C#获取IP和整数IP方法
- 「leetcode」98. 验证二叉搜索树:中序遍历【递归】【迭代】详解
- Android签名机制学习笔记
- 这场直播,我们把 Apache 顶级项目盛会搬来了!
- ffmpeg把YUV转换为H264
- 【读书笔记】《向上管理:如何正确汇报工作》
- 第四届CCF计算机职业资格认证考试题解(C++)
- 燃烧的远征恢复英文语音的方法
- flex effect
- 这样的男人有几个;1.会为你哭的男人2.喜欢欺负你的男人3.会主动亲你的男人4.喜欢叫你傻瓜