PDF打印是日常Java后端和桌面开发场景中常见的业务需求,例如报表打印、文档单据打印和文档存档打印。Java本身提供了核心的打印APIjava.awt.print。但是,这个本地API不能直接解析和呈现PDF文档。第三方PDF解析库需要与它一起工作,以实现完整的打印功能。
Print PDF Documents with Java
本文结合了两种技术:Java的Spire.PDF(用于PDF解析和渲染)和java.awt.print(用于系统打印作业调度)。它实现了两种主流的PDF打印场景:在没有弹出窗口的情况下静默打印到默认打印机,以及使用对话框进行手动打印机选择的打印。提供了完整的可运行代码和底层原理的详细解释。
1.技术堆栈和环境设置
1.1核心依赖性概述
java.awt.print:内置的JDK打印工具包,不需要额外的依赖。它主要负责检索系统打印机、配置打印页面格式、调度打印作业和捕获打印异常。它是Java打印功能的基础核心。
Java的Spire.PDF:一个专业的PDF解析库,用于加载本地PDF文件和呈现PDF页面内容。它适应本地打印API的打印渲染接口,并解决了普通Java不能直接打印pdf的限制。
1.2项目依赖配置
对于Maven项目,在pom.xml:
com.e-iceblue
e-iceblue
https://www.iissbbs.com /content/groups/public/
e-iceblue
spire.pdf
12.9.0
2.场景1:默认打印机静默打印(无打印对话框)
这种情况适用于无需人工干预的后台自动打印。系统直接将打印作业发送到默认打印机,而不弹出任何打印配置窗口,在整个过程中静默运行。
核心实现逻辑:通过获取系统默认打印作业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 Silent Printing (Default Printer, No Dialog)
*/
public class PrintWithDefaultPrinter {
public static void main(String[] args) {
// 1. Get print job object for the system default printer
PrinterJob printerJob = PrinterJob.getPrinterJob();
// 2. Initialize page format and retrieve default page size and orientation
PageFormat pageFormat = printerJob.defaultPage();
// 3. Get paper object for the page and customize printable area
Paper paper = pageFormat.getPaper();
// Set full printable area of the paper (remove default margins to fit full PDF page)
paper.setImageableArea(0, 0, pageFormat.getWidth(), pageFormat.getHeight());
// Bind customized paper settings to page format
pageFormat.setPaper(paper);
// 4. Load local PDF document
PdfDocument pdf = new PdfDocument();
// Replace with your actual local PDF file path
pdf.loadFromFile(“input.pdf”);
// 5. Bind PDF document with page format to prepare print rendering
printerJob.setPrintable(pdf, pageFormat);
// 6. Execute silent print job
try {
printerJob.print();
System.out.println(“PDF silent print job completed”);
} catch (PrinterException e) {
e.printStackTrace();
System.err.println("PDF silent printing failed: " + e.getMessage());
}
}
}
关键代码解释
PrinterJob.getPrinterJob():检索系统默认打印作业实例,并自动绑定到机器的默认打印机。
paper.setImageableArea():重置纸张可打印区域并删除默认边距填充,防止PDF输出不完整或打印页面上出现过多空白。
printerJob.print():直接触发打印作业,无需交互式对话框,非常适合自动化打印工作流程。
3.场景2:使用弹出对话框打印(手动打印机配置)
这种情况适用于以下情况用户需要选择打印机和调整打印参数。程序启动后,本地系统打印对话框打开。在确认打印之前,用户可以切换打印机,设置打印份数、页面范围、纵向/横向和其他参数。
核心实现逻辑:在静默打印逻辑的基础上,增加打印对话框检查。打印作业只有在用户确认后才会执行,提供了更大的灵活性。
完全可运行代码
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 Printing with Dialog (Manual Printer Selection & Parameter Configuration)
*/
public class PrintWithPrintDialog {
public static void main(String[] args) {
// 1. Initialize print job
PrinterJob printerJob = PrinterJob.getPrinterJob();
// 2. Configure print page and paper format
PageFormat pageFormat = printerJob.defaultPage();
Paper paper = pageFormat.getPaper();
paper.setImageableArea(0, 0, pageFormat.getWidth(), pageFormat.getHeight());
pageFormat.setPaper(paper);
// 3. Load local PDF file
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile(“input.pdf”);
// 4. Bind PDF document and print format
printerJob.setPrintable(pdf, pageFormat);
// 5. Bring up system print dialog and check user confirmation
if (printerJob.printDialog()) {
try {
// Execute printing after user confirmation
printerJob.print();
System.out.println(“PDF print job with dialog completed”);
} catch (PrinterException e) {
e.printStackTrace();
System.err.println("PDF printing with dialog failed: " + e.getMessage());
}
} else {
System.out.println(“User cancelled the print job”);
}
}
}
关键代码解释
printerJob.printDialog():启动本机系统打印对话框并返回一个布尔值。true表示用户确认打印;false意味着用户取消。
所有打印参数(打印机选择、份数、页码)都通过系统对话框配置,而不是硬编码,以适应不同的打印要求。
保留自定义可打印区域配置,以确保完整无损的PDF打印布局。
4.常见问题和注意事项
4.1文件路径兼容性
该示例使用Windows绝对路径。在Linux或macOS上部署时,修改路径以匹配目标操作系统,并确保应用程序具有PDF文件的读取权限。
4.2打印内容不完整/空白边过多
主要的解决方案是paper.setImageableArea()代码中显示的方法。它重置可打印区域并覆盖默认系统边距限制,以匹配原始PDF尺寸。
4.3打印异常处理
PrinterException被捕获到代码中,它可以捕获打印故障,如脱机打印机、缺纸状态或损坏的文件,从而实现业务层警报和日志记录。
5.摘要
本文用Java实现了两个核心的PDF打印解决方案java.awt.printAPI连同Spire。PDF:
无声印刷:无对话窗口,后台自动打印任务全自动执行。
基于对话的打印:支持手动参数配置,高度灵活,可在前端进行用户发起的打印。
两个代码示例都很简洁,可重用,并且没有多余的逻辑。它们可以直接在Java桌面和后端项目中采用。该实现解决了原生Java不能直接打印pdf的核心限制,同时保证了可靠完整的打印布局渲染。