Java 调用打印机来打印PDF文件

前言

Java Print Service是Java自带的打印框架,所在的包javax.print.PrintService。这种方案局限性比较大,只能打印PNG文件(廉价打印机不支持打印PDF)

代码实现

Apache PDFBox打印实现也是封装了Java Service Print框架的打印功能,支持性比较好,使用起来也较为方便。

Maven依赖

1
2
3
4
5
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.8</version>
</dependency>

Java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 使用打印机的名称
String printName = "Win32 Printer : Microsoft Print to PDF";
String pdfPath = "D:\test.pdf";
File file = new File(pdfPath);
// 读取pdf文件
PDDocument document = PDDocument.load(file);
// 创建打印任务
PrinterJob job = PrinterJob.getPrinterJob();
// 遍历所有打印机的名称
for (PrintService ps : PrinterJob.lookupPrintServices()) {
String psName = ps.toString();
// 选用指定打印机
if (psName.equals(printerName)) {
isChoose = true;
job.setPrintService(ps);
break;
}
}

job.setPageable(new PDFPageable(document));

Paper paper = new Paper();
// 设置打印纸张大小
paper.setSize(598,842); // 1/72 inch
// 设置打印位置 坐标
paper.setImageableArea(0, 0, paper.getWidth(), paper.getHeight()); // no margins
// custom page format
PageFormat pageFormat = new PageFormat();
pageFormat.setPaper(paper);
// override the page format
Book book = new Book();
// append all pages 设置一些属性 是否缩放 打印张数等
book.append(new PDFPrintable(document, Scaling.ACTUAL_SIZE), pageFormat, 1);
job.setPageable(book);
// 开始打印
job.print();

总结

此篇文章早年写于CSDN。后来有试过chrome headless模式打印PDF效果也不错。