java实现自动静默打印功能
最近接到一个需求,要求实现自动打印功能,一般网页打印pdf需要借助浏览器的pdf组件,而且还要弹出打印窗口,再点击打印才能实现。
那么如何实现自动打印了,从点击自己网页上3次缩减到点击一次了?
一.实现思路:
1.读取本地打印机服务
2. 服务端打印肯定不行需要一个客户端
3.应用程序需要和本地打印服务通信,发送不同的打印指令
本想自己用Python写一个打印控件的,但是时间来不及啊。。
二.采用技术知识
(以自动打印pdf为例)
- java操作文件流
- javascripte
- pdfjs
- Lodop打印控件 http://www.lodop.net/
三.技术细节
- 关于lodop预览打印是开源免费,但是静默打印是需要收费的,直接使用静默打印会在打印纸张最下面出现水印,我们只需要将打印机纸张大小就可以将水印打印在无效位置,这样在打印的结果上就不会出现水印了
- pdfjs使用版本不能太高,我这里使用 1.4.137。ps:如果找不到对应版本请与评论与我联系,我分享给大家
四.上代码
一.后端核心方法主要是将pdf文件转成base64编码
public static String encodeBase64File(File file) throws Exception {
FileInputStream inputFile = new FileInputStream(file);
byte[] buffer = new byte[(int)file.length()];
inputFile.read(buffer);
inputFile.close();
return new BASE64Encoder().encode(buffer);
}

二.前端核心代码
1.在html文件body需要插入
<canvas id="thepdfcanvas2" style="display:none;"></canvas>

2. 需要在html页面引入lodop打印js,pdfjs
<script type="text/javascript" src="../static/js/print/LodopFuncs.js"></script>
<script type="text/javascript" src="../static/js/pdfjs-dist/build/pdf.js"></script>
<script type="text/javascript">
var LODOP=getLodop(document.getElementById('LODOP_OB'),document.getElementById('LODOP_EM'));
</script>

3.发送ajax请求向后端返回pdf文件流,通过pdfjs绘制pdf成图片可以进行属性调节,进而调用print静默打印
function printOneURL(pdfUrl,preview){
var params = {"path": pdfUrl};
$.sendDefaultAjax(jsPPath + "/printModel/print.do", params,function (data) {
if (data.code === 0) {
var pdfData = atob(data.msg);
PDFJS.workerSrc =
'../static/js/pdfjs-dist/build/pdf.worker.js';
//从pdf文件对象逐页获取page,并调用toImageAndPrint函数打印内容
PDFJS.getDocument({data: pdfData}).then(function getPdfHelloWorld(pdf) {
//此适用pdf只有一个page情况
pdf.getPage(1).then(function getPageHelloWorld(page) {
//scale调节生成的画布图片大小,与清晰度有关,需要调整。
var scale = 5.5;
var viewport = page.getViewport(scale);
//将生成的page对象加载到canvas中
var canvas = document.getElementById('thepdfcanvas2');
var context = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
var renderContext = {
canvasContext: context,
viewport: viewport
};
//此处开始画画布
page.render(renderContext).promise.then(function(){
//回调函数,此处画布已加载完,调用后续的打印或预览函数
simplePrint(preview); //直接打印
});
});
});
}else {
layer.msg(data.msg, {icon: 2});
}
});
};
//preview为true就是预览打印,默认是直接打印
function simplePrint(preview) {
var canvasEle = document.getElementById("thepdfcanvas2");
var dataURL = canvasEle.toDataURL();
LODOP.PRINT_INIT();
LODOP.SET_PRINT_PAGESIZE(1, 0, 0, "A6");
LODOP.SET_PRINT_STYLE("Stretch", 2);
LODOP.ADD_PRINT_IMAGE("0mm", "0mm", "RightMargin:0mm", "BottomMargin:0mm", dataURL);
if (preview) {
LODOP.PREVIEW();
} else {
LODOP.PRINT();
}
}
如果大家有什么问题可以提出来,一起交流,学习。有什么不对的地方也指出来,我也虚心学习。
自己也是又开始写博客了,您们的赞是我写博客的动力,谢谢大家。

java实现自动静默打印功能的更多相关文章
- 【转】HP laserjet p2055dn的自动双面打印功能
原文网址:http://zhidao.baidu.com/link?url=n_NW7Qfa_7HlrEhLucdvKO43jj3SpFXJhGAfQ-WqF979jm80eUv8s1atqtxE7w ...
- Atitit.java swing打印功能 api attilax总结
Atitit.java swing打印功能 api attilax总结 1. 打印方式有三种:2 1.1. 一是不经过任何修改,直接调用javascript中的window.print()打印.2 ...
- Atitit.收银机小票打印功能的设计 java php c#.net版本
Atitit.收银机小票打印功能的设计 java php c#.net版本 1. 1. 打印方式有4种:1 1.1. 1.1. 一是不经过任何修改,直接调用javascript中的window.pr ...
- java整合Elasticsearch,实现crud以及高级查询的分页,范围,排序功能,泰文分词器的使用,分组,最大,最小,平均值,以及自动补全功能
//为index创建mapping,index相当于mysql的数据库,数据库里的表也要给各个字段创建类型,所以index也要给字段事先设置好类型: 使用postMan或者其他工具创建:(此处我使用p ...
- Java实现打印功能-AWT Graphics2D
Java实现打印功能 用java实现打印,java.awt中提供了一些打印的API,要实现打印,首先要获得打印对象,然后继承Printable实现接口方法print,以便打印机进行打印,最后用用Gra ...
- 突破技术限制,实现Web端静默打印
作为Web开发的同僚们,估计都有一个共同的烦恼,Web端为什么不能够像 CS端那样直接打印预览?直接移除掉打印预览界面不就可以了? 真实情况是Web端受限于浏览器的权限,无法直接访问打印机等本机资源. ...
- [Android Pro] Android 4.1 使用 Accessibility实现免Root自动批量安装功能
reference to : http://www.infoq.com/cn/articles/android-accessibility-installing?utm_campaign=info ...
- vc 实现打印功能
Visual C++6.0是开发Windows应用程序的强大工具,但是要通过它实现程序的打印功能,一直是初学者的一个难点,经常有朋友询问如何在VC中实现打印功能,他们往往感到在MFC提供的框架内实现这 ...
- Eclipse自动补全功能和自动生成作者、日期注释等功能设置
修改作者.日期注释格式:打开Windows->Preferences->Java->Code Style->Code Templates,点击右边窗口中的Comments,可以 ...
随机推荐
- Pytorch线性规划模型 学习笔记(一)
Pytorch线性规划模型 学习笔记(一) Pytorch视频学习资料参考:<PyTorch深度学习实践>完结合集 Pytorch搭建神经网络的四大部分 1. 准备数据 Prepare d ...
- 彻底删除Docker
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-la ...
- Eclipse安装Pydev插件时所遇到的问题
安装pydev插件折腾了半天,因为总是安装不成功,不成功的表现就是:windows-preferences设置里没有pydev 由于第一次安装这个插件所以不了解安装pydev插件的版本是有要求的,根据 ...
- SVN报错“Failed to run the WC DB work queue associated with”解决办法
最近在更新SVN上的ISO代码时,失败报错: Failed to run the WC DB work queue associated with "目录/文件",clean u ...
- 31.qt quick-使用SwipeView添加滑动视图-高仿微信V2版本
在上章我们学习了ListView,然后实现了: 28.qt quick-ListView高仿微信好友列表和聊天列表,本章我们来学习SwipeView滑动视图,并出高仿微信V2版本: 1.Contain ...
- 树莓派FRP内网穿透及自启动
内网穿透的步骤和文件存档 实验室在远方部署了电脑主机来采集数据和图片,每次去调试会很麻烦,因而使用FRP内网穿透使得我们可以在实验室访问主机. 主要功能 实现远程可访问和开机自启FRP程序服务 安装和 ...
- Mysql优化_第十三篇(HashJoin篇)
Mysql优化_第十三篇(HashJoin篇) 目录 Mysql优化_第十三篇(HashJoin篇) 1 适用场景 纯等值查询,不能使用索引 等值查询,使用到索引 多个join条件中至少包含一个等值查 ...
- 一次性讲清楚spring中bean的生命周期之一:getSingleton方法
要想讲清楚spring中bean的生命周期,真的是不容易,以AnnotationConfigApplicationContext上下文为基础来讲解bean的生命周期,AnnotationConfigA ...
- Redisson 分布式锁源码 01:可重入锁加锁
前言 相信小伙伴都是使用分布式服务,那一定绕不开分布式服务中数据并发更新问题! 单系统很容易想到 Java 的各种锁,像 synchronize.ReentrantLock 等等等,那分布式系统如何处 ...
- Kubernetes的亲和性和反亲和性
节点亲缘性规则可以影响pod被调度到哪个节点.但是,这些规则只影响了pod和节点之间的亲缘性.然而,有些时候也希望能有能力指定pod自身之间的亲缘性. 举例来说,想象一下有一个前端pod和一个后端po ...