文档章节

JAVA实现调用打印机打印PDF

jason_kiss
 jason_kiss
发布于 2018/12/27 16:38
字数 985
阅读 2922
收藏 12

JAVA实现调用打印机打印PDF,网上搜索了一大把资料,基本上都是重复。。。下面骂人的一大堆。。我这里来解决一下。

需求:前端调用用接口 后端根据模版生成数据联通打印机直接一键打印! 

思路:这里讲一下打印最好使用pdf去打印。不管是word.excel 都是通过转PDF 再打印出来的。所以我这里的思路就是 选择模版生成文件,并且打印。

  我这里选择html模版 也就是freemark模版。

 1、通过vm文件生成html 

 2、通过html再转成 pdf

 3、调用打印机方法打印

可能这有人问为啥不用 word模版。我这里说明一个坑。如果是模版网上解决方案基本上是 xml格式的。xml格式的word转pdf是很困难的。至少我没找到合适的方法去转。

本文的第一步第二部 就不介绍了 在我的  另一篇博客中有讲到。 html转pdf 中有讲解 本文重点介绍 调用打印机的方式!

调用打印机驱动的我目前实验了 网上所有的方法,查了很多资料。大概摸出了两种最有效的方式。

第一种 java调用打印机:在本机安装驱动,利用java代码去调用进行打印。如果你的代码是在服务器上那么就需要在服务器上安装驱动。

代码如下:

 

 /**
      * 通过本机默认打印机打印pdf文件
      * @param filePath 文件路径
      * @throws Exception
      */
	 public static void defaultPrintPDF(String filePath) throws Exception{
		 logger.info("打印工具类入參:filePath==================="+filePath);
		 File file = new File(filePath); // 获取选择的文件
	      // 构建打印请求属性集
	      HashPrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
	      // 设置打印格式,因为未确定类型,所以选择autosense
	      DocFlavor flavor = DocFlavor.INPUT_STREAM.PDF;
	      logger.info("打印文件类型为:==================="+flavor);
	      //pras.add(MediaName.ISO_A4_TRANSPARENT);//A4纸张
	      //遍历
//	      PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras); 
//	   
//	      for (PrintService printService2 : printService) {
//	    	  logger.info("本机可使用打印机列表:==================="+printService2);
//			}
	      // 定位默认的打印服务
	      PrintService defaultService = PrintServiceLookup
	              .lookupDefaultPrintService();
	      logger.info("打印工具选择打印机为:==================="+defaultService);
	          try {
	              DocPrintJob job = defaultService.createPrintJob(); // 创建打印作业
	              FileInputStream fis = new FileInputStream(file); // 构造待打印的文件流
	              DocAttributeSet das = new HashDocAttributeSet();
	              Doc doc = new SimpleDoc(fis, flavor, das);
	              job.print(doc, pras);
	          } catch (Exception e) {
	              e.printStackTrace();
	              logger.info("打印异常",e);
	             throw new Exception();
	          }
	      }

本来这种方式是OK的 但是我们的运维人员说 服务器安装打印机的纸张没办法更改,需要重启服务器。重启服务器我们都不愿意。所以改用第二种方式。

第二种:java无驱实现连接打印机打印PDF

代码如下:

 /**
	   * 通过 IP+端口 连接打印机打印文件
	   * @param filePath
	   * @throws Exception
	   */
	  public static void print2(String filePath,String ip) throws Exception{
		  File file = new File(filePath); // 获取选择的文件
		  Socket socket =  new Socket(ip, 9100);
		 
		  OutputStream out = socket.getOutputStream();  
		  FileInputStream fis = new FileInputStream(file);
		  //建立数组
	      byte[] buf = new byte[1024];  
	      int len = 0; 
	      //判断是否读到文件末尾
	      while((len=fis.read(buf)) != -1)
	          {  
	           out.write(buf, 0, len);  
	          }  
	      //告诉服务端,文件已传输完毕  
	      socket.shutdownOutput();
	      socket.close();  
	      fis.close();
	  }

 

打印的过程中:

1、 第一种方式:比如纸张设置。如果装了驱动直接叫运维人员选择纸张大小,当然代码也可以设置 尽量少动手嘛

2、第二种的纸张大小可以在html转pdf的时候设置一下,

 

以上就是我要介绍的。如果你有更好的方式可以联系我。

开发中又遇到什么问题可以在下面留言哦 我会回复的。也可以加QQ群:600922504

 

 

 

© 著作权归作者所有

上一篇: Spring5 系统架构
下一篇: 手写Springmvc
jason_kiss
粉丝 21
博文 127
码字总数 64935
作品 0
长沙
程序员
私信 提问
加载中

评论(1)

耳边轻语
耳边轻语
您好,老师问个问题,我用第二种方法连接网络打印机,socket显示已经连接成功,整个程序也未报错,但是打印机未启动,能联系我一下吗 947857208
快递、外卖、标签这类做过打印的同学帮个忙阿!

在互联网上发布了一个web浏览器的应用(linux环境 JAVA平台) 用户利用网络和浏览器登录系统后,怎么在页面上直接进行打印标签操作{ 比如佳博蓝牙\USB连接的打印机就可以打印出标签(标签数据来自...

车车来咯
2018/05/12
467
2
还在为打印PDF文件发愁?文档开发工具Spire.PDF 6种方式帮你搞定!

Spire.PDF(点击下载)是一个专业的PDF组件,能够独立地创建、编写、编辑、操作和阅读PDF文件,支持 .NET、Java、WPF和Silverlight。Spire.PDF的PDF API拥有丰富的功能,如安全设置(包括数字...

mnrssj
09/19
85
0
通过linux 的pc端网站,连接(usb或者内网的)标签打印机进行打印 !

在互联网上发布了一个web浏览器的应用(linux环境 JAVA平台) 用户利用网络和浏览器登录系统后,怎么在页面上直接进行打印标签操作{ 比如佳博蓝牙\USB连接的打印机就可以打印出标签(标签数据来自...

车车来咯
2018/05/12
575
2
java 调用不干胶条码机打印条码

最近接了一个物流系统单, java web开发 业务开始就是货物入库。这个货物入库时。由系统生成订单号并用不干胶条码机打印条码 但是现在。这个java web冒似。没办法直接调用本地打印机打印。调...

壹爱
2015/06/12
924
3
如何用Java调用打印机打印docx、PDF文档?

最近想做一个WebService提供在线打印服务,要求是可以使用网络打印机(如果较难实现可以退而求其次,使用在本机系统注册过的网络打印机)打印Office文档和PDF文档。 目前我倾向于使用docx4j和...

Cherrot
2011/12/24
4.5K
3

没有更多内容

加载失败,请刷新页面

加载更多

技术分享 | MySQL 8.0:字符集从 utf8 转换成 utf8mb4

作者:胡呈清 整理 MySQL 8.0 文档时发现一个变更:默认字符集由 latin1 变为 utf8mb4。想起以前整理过字符集转换文档,升级到 MySQL 8.0 后大概率会有字符集转换的需求,在此正好分享一下。...

爱可生
15分钟前
2
0
不管单机还是集群的限流实现已经给你准备好了

限流算法 计数器算法 维护一个counter,规定在单位时间内counter的大小不能超过最大值,每隔固定时间就将counter的值置零。如果这个counter大于设定的阈值,那么系统就拒绝请求 漏桶算法 维护...

阿提说说
26分钟前
3
0
文件管理

通过CLI登录进行文件管理 .表示当前目录,..表示父目录,具有隐藏文件。支持缩写与TAB键补全 1、目录操作 pwd#打印工作目录 cd <directory>#改变工作目录 dir [/all][<directory>]#查看目录内...

悠悠子佩
28分钟前
3
0
Netty学习笔记(10)——Netty中的Channel组件

1. Channel的功能 1. 与NIO中的Channel一样,它实现了网络操作的抽象类,聚合了一系列的网络IO功能,包括读写数据、建立连接、关闭连接等功能。通过外观模式,将数据读写、连接建立与断开等操...

江左煤郎
32分钟前
2
0
二叉树的深度

从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 public int TreeDepth(TreeNode root) { return root == null ? 0 : 1 + Math.max(Tree...

Garphy
40分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部