在日常 Java 后端、桌面开发场景中,PDF 打印是非常常见的业务需求,例如报表打印、单据打印、文档归档打印等。Java 原生提供了 java.awt.print 打印核心 API,但原生 API 无法直接解析渲染 PDF 文档,需要借助第三方 PDF 解析类库配合实现完整打印能力。

本文将结合 Spire.PDF for Java (PDF 文档解析渲染)与 java.awt.print (系统打印调度)两套技术,实现两种主流的 PDF 打印场景:无弹窗默认打印机静默打印、带打印弹窗手动选择打印机打印,提供完整可运行代码及详细原理说明。
若使用 Maven 项目,需在 pom.xml 中引入 Spire.PDF 依赖:
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf</artifactId>
<version>12.9.0</version>
</dependency>
</dependencies>该场景适用于后台自动打印、无需人工干预的业务场景,系统直接调用默认打印机执行打印任务,不弹出任何打印配置窗口,全程静默执行。
核心实现逻辑:通过 PrinterJob 获取系统默认打印任务,自定义打印页面纸张区域,加载 PDF 文档并绑定打印任务,直接执行打印操作。
import com.spire.pdf.PdfDocument;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
/**
* PDF 静默打印(默认打印机,无弹窗)
*/
public class PrintWithDefaultPrinter {
public static void main(String[] args) {
// 1. 获取系统默认打印机的打印任务对象
PrinterJob printerJob = PrinterJob.getPrinterJob();
// 2. 初始化页面格式,获取默认页面尺寸和排版方向
PageFormat pageFormat = printerJob.defaultPage();
// 3. 获取页面对应的纸张对象,自定义打印可渲染区域
Paper paper = pageFormat.getPaper();
// 设置纸张完整可打印区域(去除默认边距,适配完整PDF页面)
paper.setImageableArea(0, 0, pageFormat.getWidth(), pageFormat.getHeight());
// 将自定义纸张配置绑定到页面格式中
pageFormat.setPaper(paper);
// 4. 加载本地PDF文档
PdfDocument pdf = new PdfDocument();
// 替换为本地实际PDF文件路径
pdf.loadFromFile("input.pdf");
// 5. 绑定PDF文档与打印页面格式,准备打印渲染
printerJob.setPrintable(pdf, pageFormat);
// 6. 执行静默打印任务
try {
printerJob.print();
System.out.println("PDF静默打印任务执行完成");
} catch (PrinterException e) {
e.printStackTrace();
System.err.println("PDF静默打印失败:" + e.getMessage());
}
}
}PrinterJob.getPrinterJob():获取系统默认的打印任务实例,自动绑定本机默认打印机。paper.setImageableArea():重置纸张可打印区域,取消系统默认的留白边距,避免 PDF 内容打印不完整、留白过大的问题。printerJob.print():直接触发打印任务,无任何交互弹窗,适合自动化打印场景。该场景适用于需要人工选择打印机、调整打印参数的场景,程序启动后会弹出系统标准打印弹窗,支持手动切换打印机、设置打印份数、页码范围、横竖排版等参数,确认后执行打印。
核心实现逻辑:在静默打印的基础上,增加打印弹窗判断,用户确认打印后才执行打印任务,灵活性更高。
import com.spire.pdf.PdfDocument;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
/**
* PDF 弹窗选择打印(手动选择打印机、配置参数)
*/
public class PrintWithPrintDialog {
public static void main(String[] args) {
// 1. 初始化打印任务
PrinterJob printerJob = PrinterJob.getPrinterJob();
// 2. 配置打印页面与纸张格式
PageFormat pageFormat = printerJob.defaultPage();
Paper paper = pageFormat.getPaper();
paper.setImageableArea(0, 0, pageFormat.getWidth(), pageFormat.getHeight());
pageFormat.setPaper(paper);
// 3. 加载本地PDF文件
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("input.pdf");
// 4. 绑定PDF文档与打印格式
printerJob.setPrintable(pdf, pageFormat);
// 5. 弹出系统打印弹窗,判断用户是否确认打印
if (printerJob.printDialog()) {
try {
// 用户确认后执行打印
printerJob.print();
System.out.println("PDF弹窗打印任务执行完成");
} catch (PrinterException e) {
e.printStackTrace();
System.err.println("PDF弹窗打印失败:" + e.getMessage());
}
} else {
System.out.println("用户取消打印任务");
}
}
}printerJob.printDialog():唤起系统原生打印弹窗,返回布尔值,true 表示用户确认打印,false 表示用户取消打印。示例中使用 Windows 绝对路径,若部署在 Linux、Mac 系统,需修改为对应系统的文件路径,同时保证程序对 PDF 文件有读取权限。
核心解决方式就是代码中 paper.setImageableArea() 方法,重置纸张可打印区域,覆盖系统默认的边距限制,适配 PDF 原始尺寸。
代码中捕获了 PrinterException,可拦截打印机离线、纸张不足、文件损坏等打印异常,便于业务层做异常提示与日志记录。
本文基于 java.awt.print 原生打印 API + Spire.PDF 实现了 Java 环境下两种核心的 PDF 打印方案:
两套代码均简洁通用、无冗余逻辑,可直接复用至 Java 桌面、后端项目中,解决了 Java 原生无法直接打印 PDF 的核心问题,同时保证了打印排版的完整性与稳定性。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。