java 打印机_JAVA实现调用打印机打印PDF

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的时候设置一下,

java 打印机_JAVA实现调用打印机打印PDF_第1张图片

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

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

你可能感兴趣的:(java,打印机)