最近接到一个需求,要求实现自动打印功能,一般网页打印pdf需要借助浏览器的pdf组件,而且还要弹出打印窗口,再点击打印才能实现。

那么如何实现自动打印了,从点击自己网页上3次缩减到点击一次了?

一.实现思路:

1.读取本地打印机服务

2. 服务端打印肯定不行需要一个客户端

3.应用程序需要和本地打印服务通信,发送不同的打印指令

本想自己用Python写一个打印控件的,但是时间来不及啊。。

二.采用技术知识

(以自动打印pdf为例)

  1. java操作文件流
  2. javascripte
  3. pdfjs
  4. Lodop打印控件       http://www.lodop.net/

三.技术细节

  1. 关于lodop预览打印是开源免费,但是静默打印是需要收费的,直接使用静默打印会在打印纸张最下面出现水印,我们只需要将打印机纸张大小就可以将水印打印在无效位置,这样在打印的结果上就不会出现水印了
  2. 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实现自动静默打印功能的更多相关文章

  1. 【转】HP laserjet p2055dn的自动双面打印功能

    原文网址:http://zhidao.baidu.com/link?url=n_NW7Qfa_7HlrEhLucdvKO43jj3SpFXJhGAfQ-WqF979jm80eUv8s1atqtxE7w ...

  2. Atitit.java swing打印功能 api  attilax总结

    Atitit.java swing打印功能 api  attilax总结 1. 打印方式有三种:2 1.1. 一是不经过任何修改,直接调用javascript中的window.print()打印.2 ...

  3. Atitit.收银机小票打印功能的设计  java php c#.net版本

    Atitit.收银机小票打印功能的设计  java php c#.net版本 1. 1. 打印方式有4种:1 1.1. 1.1. 一是不经过任何修改,直接调用javascript中的window.pr ...

  4. java整合Elasticsearch,实现crud以及高级查询的分页,范围,排序功能,泰文分词器的使用,分组,最大,最小,平均值,以及自动补全功能

    //为index创建mapping,index相当于mysql的数据库,数据库里的表也要给各个字段创建类型,所以index也要给字段事先设置好类型: 使用postMan或者其他工具创建:(此处我使用p ...

  5. Java实现打印功能-AWT Graphics2D

    Java实现打印功能 用java实现打印,java.awt中提供了一些打印的API,要实现打印,首先要获得打印对象,然后继承Printable实现接口方法print,以便打印机进行打印,最后用用Gra ...

  6. 突破技术限制,实现Web端静默打印

    作为Web开发的同僚们,估计都有一个共同的烦恼,Web端为什么不能够像 CS端那样直接打印预览?直接移除掉打印预览界面不就可以了? 真实情况是Web端受限于浏览器的权限,无法直接访问打印机等本机资源. ...

  7. [Android Pro] Android 4.1 使用 Accessibility实现免Root自动批量安装功能

    reference to  :  http://www.infoq.com/cn/articles/android-accessibility-installing?utm_campaign=info ...

  8. vc 实现打印功能

    Visual C++6.0是开发Windows应用程序的强大工具,但是要通过它实现程序的打印功能,一直是初学者的一个难点,经常有朋友询问如何在VC中实现打印功能,他们往往感到在MFC提供的框架内实现这 ...

  9. Eclipse自动补全功能和自动生成作者、日期注释等功能设置

    修改作者.日期注释格式:打开Windows->Preferences->Java->Code Style->Code Templates,点击右边窗口中的Comments,可以 ...

随机推荐

  1. Padavan安装使用ZeroTier实现组建虚拟局域网的方法

    首先到这个网站ZeroTier – Global Area Networking注册登陆,注册及创建网络的过程可以参考网上及其他UP主的教程,我就不重复了. 本篇主要讲述的是hiboy大佬编译的固件在 ...

  2. 强烈推荐!15 个Github 顶级Java教程类开源项目

    大家好,我是 Guide 哥!今天给大家推荐 15 个新手也能看懂的 Java 教程方向的开源项目.这些项目无论是对于你学习 Java 还是准备 Java 方向的面试都非常有帮助. 正如我第一个要推荐 ...

  3. bzoj2839 集合计数(容斥+组合)

    集合计数 内存限制:128 MiB 时间限制:1000 ms 标准输入输出     题目描述 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 ...

  4. .NET Core/.NET5/.NET6 开源项目汇总5:权限管理系统项目

    系列目录     [已更新最新开发文章,点击查看详细] 企业管理系统一般包含后台管理UI.组织机构管理.权限管理.日志.数据访问.表单.工作流等常用必备功能.下面收集的几款优秀开源的管理系统,值得大家 ...

  5. Linkerd 2.10(Step by Step)—设置服务配置文件

    Linkerd 2.10 系列 快速上手 Linkerd v2.10 Service Mesh 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 部署 ...

  6. C++容器类插入和删除时迭代器的失效情况总结

    容器底层数据结构类型 包含的具体容器 内存分配特点 insert操作后迭代器失效情况 erase操作后迭代器失效情况 数组型数据结构 vector, string, deque, array 元素分配 ...

  7. Redisson 分布式锁实现之源码篇 → 为什么推荐用 Redisson 客户端

    开心一刻 一男人站在楼顶准备跳楼,楼下有个劝解员拿个喇叭准备劝解 劝解员:兄弟,别跳 跳楼人:我不想活了 劝解员:你想想你媳妇 跳楼人:媳妇跟人跑了 劝解员:你还有兄弟 跳楼人:就是跟我兄弟跑的 劝解 ...

  8. 21、oracle打开和关闭归档日志的方法

    21.1.介绍: 在实际应用中,我们需要实现对数据的备份,其实现方式主要有冷备份和热备份两种,现在我们主要讨论热备份的具体操作. 热备份也称为联机备份,在数据库的存档模式下进行备份,oracel数据库 ...

  9. UI自动化学习笔记- Selenium一些特殊操作的处理

    一.特殊操作处理 1. 下拉选择框操作 1.1 如何操作下拉选择框 实现方式一 思路:先定位到要操作的option元素,然后执行点击操作 driver.find_element_by_css_sele ...

  10. centos 安装es

    第一步:必须要有jre支持 elasticsearch是用Java实现的,跑elasticsearch必须要有jre支持,所以必须先安装jre 第二步:下载elasticsearch 进入官方下载 h ...