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,可以 ...
随机推荐
- mybatis设置自动提交事务
我们想要mybatis帮助我们自动提交事务其实很简单,只需要在SqlSessionFactory对象的openSession方法中设置参数为true就可以了,mybatis工具类如下: public ...
- yum install php-bcmath-5.4.16-42.el7.x86_64.rpm安装报错
[root@zabbixserver lnmp_soft]# yum install php-bcmath-5.4.16-42.el7.x86_64.rpm 已加载插件:langpacks, prod ...
- 【Android编程实战】源码级免杀_Dex动态加载技术_Metasploit安卓载荷傀儡机代码复现
/文章作者:MG193.7 CNBLOG博客ID:ALDYS4 QQ:3496925334/ 在读者阅读本文章前,建议先阅读笔者之前写的一篇对安卓载荷的分析文章 [逆向&编程实战]Metasp ...
- Java算法面试题(史上最强、持续更新、吐血推荐)
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- Spring Boot WebFlux-导读
背景 大家都知道,Spring Framework 是 Java/Spring 应用程序跨平台开发框架,也是 Java EE(Java Enterprise Edition) 轻量级框架,其 Spri ...
- Reactive 理解 SpringBoot 响应式的核心-Reactor
Reactive 理解 SpringBoot 响应式的核心-Reactor bestcoding 2020-02-23 17:26:43 一.前言 关于 响应式 Reactive,前面的两篇文章谈了不 ...
- 『心善渊』Selenium3.0基础 — 11、Selenium对元素常用操作
目录 1.Selenium对元素常用操作 2.Selenium对元素的其他操作 1.Selenium对元素常用操作 操作 说明 click() 单击元素 send_keys() 模拟输入 clear( ...
- Vue(12)组件的组织结构和组件注册
组件的组织 通常一个应用会以一棵嵌套的组件树的形式来组织: 例如,你可能会有页头.侧边栏.内容区等组件,每个组件又包含了其它的像导航链接.博文之类的组件. 为了能在模板中使用,这些组件必须先注册以便 ...
- 在Linux/Unix系统下用iconv命令处理文本文件中文乱码问题
iconv命令是运行于linux/unix平台的文件编码装换工具.当我们在linux/unix系统shell查看文本文件时,常常会发现文件的中文是乱码的,这是由于文本文件的编码与当前操作系统设置的编码 ...
- 三代码使用QScrollArea
QScrollArea是QT封装好的一个滑动界面类 构造函数如下: 指定一个父对象就行,构造函数提供一个滑动的区域,但是这个区域里是没有内容的,构造函数介绍里面让我们看setWidget()这个函数, ...