如何在 Java 中打印 PDF 文件

This article was translated from English: Does it need improvement?
Translated
View the article in English

IronPDF for Java 使您能够在有或没有用户交互的情况下以编程方式打印 PDF 文件。 您可以将PDF直接发送到物理打印机,控制打印设置如份数和页面范围,并在Java应用程序中自动化文档打印工作流程。 无论您是在构建企业文档管理系统还是自动化发票生成,IronPDF提供的打印功能可以与Java的打印基础设施实现无缝集成。 您还可以将其与其他PDF任务一起使用,例如数字签名PDF将图像转换为PDF,作为更广泛的文档处理流水线的一部分。

IronPDF for Java 打印工作流,展示通过编程方式将 PDF 文档发送至打印机

快速入门:在Java中打印PDF文件

  1. 将IronPDF依赖项添加到您的项目中
  2. 使用 License.setLicenseKey() 设置您的许可证密钥
  3. 使用 PdfDocument 加载或创建 PDF
  4. 调用 pdf.print() 进行基于对话框的打印,或调用 pdf.printWithoutDialog() 进行直接打印
  5. PDF被发送到您选择的或默认的打印机

```java :title=快速入门 //:path=/static-assets/ironpdf-java/content-code-examples/how-to/print-pdf/quickstart.java import com.ironsoftware.IronPDF.*;

公共类 PrintPDFQuickstart { public static void main(String[] args) { // 申请许可证密钥 License.setLicenseKey("YOUR-LICENSE-KEY");

    // 从 HTML 创建 PDF
    PdfDocument pdf = PdfDocument.renderHtmlAsPdf("<h1>Invoice #12345</h1><p>Total: $100.00</p>");

    // 带对话框打印(交互式)
    pdf.print();

    // 或无对话框打印(自动)
    // pdf.printWithoutDialog();
}

}


<div class="hsg-featured-snippet">
    <h3>如何在 Java 中打印 PDF 文件</h3>
    <ol>
        <li><a class="js-modal-open" data-modal-id="download-modal" href="#download-modal">安装 Java 库以打印 PDF 文件</a>。</li>
        <li>加载现有的PDF或渲染一个新PDF</li>
        <li>使用 <code>print</code> 方法打印对话框</li>
        <li>使用 <code>printWithoutDialog</code> 方法进行无对话框打印</li>
        <li>检查打印的 PDF 文档</li>
    </ol>
</div>

<hr>

## 如何通过用户交互打印 PDF?

加载您要打印的 PDF 文档,然后调用 `pdf.print()`。 该方法打开标准打印对话框,允许用户选择打印机、页面范围和其他选项,然后再将作业发送。 此功能集成了操作系统的本地打印功能,因此安装在机器上的每台打印机(包括网络打印机和虚拟打印机)都会自动出现在对话框中。

```java
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/print-pdf/interactive-printing.java
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import java.io.IOException;

public class InteractivePrinting {
public static void main(String[] args) {
        // Set the license key for IronPDF
        License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");

        try {
            // Option 1: Create a new PDF from HTML
            PdfDocument pdf = PdfDocument.renderHtmlAsPdf("<h1>Monthly Report</h1><p>Sales data...</p>");

            // Option 2: Load an existing PDF file
            // PdfDocument pdf = PdfDocument.fromFile(Paths.get("report.pdf"));

            // Print the PDF with a print dialog for user interaction
            pdf.print();

            System.out.println("Print job sent to selected printer");

        } catch (IOException e) {
            System.err.println("Error printing PDF: " + e.getMessage());
        }
    }
}

打印对话框在将作业发送到打印机之前接受用户选择的设置。

显示 IronPDF for Java 与系统打印对话框集成的打印对话框,其中包含打印机选择、页码范围和复印份数选项

何时应该使用基于对话框的打印?

基于对话框的打印让用户可以控制设置,如打印机选择、页面范围、份数和纸张方向。 这种方法适合桌面应用程序、文档管理系统或任何需要用户在作业发送之前查看和调整设置的场景。

需要使用 print() 的常见情况:

  • 具有打印预览功能的桌面应用程序
  • 用户选择特定页面范围的文档工作流系统
  • 不同用途的办公室环境中使用不同的打印机
  • 应用程序在打印敏感文档之前需要用户确认

对于需要在打印之前合并多个PDF的应用程序,请先合并文档,然后将统一的结果传递给打印对话框。 查看IronPDF的HTML到PDF教程以获取如何从网页内容生成可打印PDF的指导。

打印对话框暴露了哪些配置?

标准的Java打印对话框显示了操作系统级别打印属性的完整集,包括页面方向、介质尺寸、打印质量和拼订顺序。 IronPDF 依赖底层的 javax.print API 进行属性协商,因此可用的选项取决于各打印机报告的功能。 在Windows上,显示本机Win32打印对话框; 在Linux和macOS上,则使用GTK或Cocoa对话框。 您的Java应用程序无需编写自定义UI代码,因为操作系统会自动处理展示。


如何在没有用户提示的情况下打印 PDF?

printWithoutDialog() 方法会绕过打印对话框,将文档直接发送至默认打印机。 在流程的任何阶段都不需要用户交互。 这使其成为服务器端应用程序、批处理系统和计划工作流的正确选择,目标是在无人值守的情况下实现一致的输出。

//:path=/static-assets/ironpdf-java/content-code-examples/how-to/print-pdf/automated-printing.java
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import java.io.IOException;
import java.nio.file.Paths;
import java.time.LocalDateTime;

public class AutomatedPrinting {
public static void main(String[] args) {
        // Set the license key for IronPDF
        License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");

        try {
            // Create a batch of invoices
            for (int i = 1; i <= 10; i++) {
                String html = String.format(
                    "<h1>Invoice #%d</h1>" +
                    "<p>Date: %s</p>" +
                    "<p>Amount: $%.2f</p>",
                    i, LocalDateTime.now(), i * 100.0
                );

                // Render HTML to PDF
                PdfDocument pdf = PdfDocument.renderHtmlAsPdf(html);

                // Print directly without showing dialog
                pdf.printWithoutDialog();

                System.out.println("Printed invoice #" + i);

                // Save a copy for records
                pdf.saveAs(Paths.get("invoices/invoice_" + i + ".pdf"));
            }

        } catch (IOException e) {
            System.err.println("Printing error: " + e.getMessage());
        }
    }
}
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/print-pdf/automated-printing.java
import com.ironsoftware.ironpdf.License;
import com.ironsoftware.ironpdf.PdfDocument;
import java.io.IOException;
import java.nio.file.Paths;
import java.time.LocalDateTime;

public class AutomatedPrinting {
public static void main(String[] args) {
        // Set the license key for IronPDF
        License.setLicenseKey("IRONPDF-MYLICENSE-KEY-1EF01");

        try {
            // Create a batch of invoices
            for (int i = 1; i <= 10; i++) {
                String html = String.format(
                    "<h1>Invoice #%d</h1>" +
                    "<p>Date: %s</p>" +
                    "<p>Amount: $%.2f</p>",
                    i, LocalDateTime.now(), i * 100.0
                );

                // Render HTML to PDF
                PdfDocument pdf = PdfDocument.renderHtmlAsPdf(html);

                // Print directly without showing dialog
                pdf.printWithoutDialog();

                System.out.println("Printed invoice #" + i);

                // Save a copy for records
                pdf.saveAs(Paths.get("invoices/invoice_" + i + ".pdf"));
            }

        } catch (IOException e) {
            System.err.println("Printing error: " + e.getMessage());
        }
    }
}
JAVA

上面的循环从HTML模板中渲染每个发票,并立即将其派送到默认打印机。 因为没有对话框阻塞循环,整个批处理在不中断的情况下完成。

提示在将自动化打印部署到服务器之前,请验证目标机器上配置了默认打印机。在无头的Linux服务器上,诸如CUPS或PDF打印到文件目的地的虚拟打印机效果良好。

静音打印有哪些优点?

无声打印消除了用户提示,实现了完全自动化的工作流程。 主要的优点是:

  • 速度:无用户交互意味着大批量处理速度更快
  • 一致性:每次应用相同的打印设置
  • 自动化:适用于计划任务和后台服务
  • 集成:无需修改即可适应现有的自动化工作流

处理大型文档时,首先应用IronPDF的PDF压缩技术,以在发送到打印机之前减小文件大小,从而降低打印时间和资源使用。

什么时候直接打印最有效?

在自动化文档工作流、定时打印任务或需要无人工干预的后端服务中,请使用 printWithoutDialog()。 常见的用例包括:

  • 销售点系统:交易后自动打印收据
  • 报告生成:计划并打印每日或每周报告
  • 标签打印:在仓库管理系统中打印运输标签
  • 文档处理:批量打印合同或法律文件

对于需要在Java中添加水印或在打印前标记内容的应用程序,首先处理PDF,然后直接发送到打印机。


我该如何处理自动化工作流中的打印错误?

在没有对话框的情况下打印时,正确的错误处理是必不可少的。 打印机可用性问题、纸张卡住和连接问题都可能中断批处理。 将打印调用包装在try-catch块中并实现重试策略,以在发生短期错误时保持工作流运行。

//:path=/static-assets/ironpdf-java/content-code-examples/how-to/print-pdf/retry-print-handler.java
import com.ironsoftware.IronPDF.*;
import java.io.IOException;
import java.util.logging.*;

public class RobustPrintHandler {
    private static final Logger logger = Logger.getLogger(RobustPrintHandler.class.getName());

    public static void safePrint(PdfDocument pdf, int maxRetries) {
        int attempts = 0;
        boolean success = false;

        while (attempts < maxRetries && !success) {
            try {
                attempts++;
                pdf.printWithoutDialog();
                success = true;
                logger.info("Print successful on attempt " + attempts);

            } catch (Exception e) {
                logger.warning("Print attempt " + attempts + " failed: " + e.getMessage());

                if (attempts < maxRetries) {
                    try {
                        // Wait before retrying
                        Thread.sleep(2000);
                    } catch (InterruptedException ie) {
                        Thread.currentThread().interrupt();
                    }
                } else {
                    // Max retries reached
                    logger.severe("Print failed after " + maxRetries + " attempts");
                }
            }
        }
    }
}
//:path=/static-assets/ironpdf-java/content-code-examples/how-to/print-pdf/retry-print-handler.java
import com.ironsoftware.IronPDF.*;
import java.io.IOException;
import java.util.logging.*;

public class RobustPrintHandler {
    private static final Logger logger = Logger.getLogger(RobustPrintHandler.class.getName());

    public static void safePrint(PdfDocument pdf, int maxRetries) {
        int attempts = 0;
        boolean success = false;

        while (attempts < maxRetries && !success) {
            try {
                attempts++;
                pdf.printWithoutDialog();
                success = true;
                logger.info("Print successful on attempt " + attempts);

            } catch (Exception e) {
                logger.warning("Print attempt " + attempts + " failed: " + e.getMessage());

                if (attempts < maxRetries) {
                    try {
                        // Wait before retrying
                        Thread.sleep(2000);
                    } catch (InterruptedException ie) {
                        Thread.currentThread().interrupt();
                    }
                } else {
                    // Max retries reached
                    logger.severe("Print failed after " + maxRetries + " attempts");
                }
            }
        }
    }
}
JAVA

safePrint 方法最多会重试 maxRetries 次,每次尝试之间间隔两秒。每次尝试都会被记录,以便您将失败追溯到具体的作业。 一旦达到重试限制,该方法会记录一条严重消息。 从那里,您的应用程序可以将文档保存到磁盘、排队等待稍后处理或通知管理员。

重要作为 Java 标准库组成部分的 javax.print API,是 IronPDF 打印集成的技术基础。 有关低级打印机发现和属性配置,请参阅 Oracle 网站上的 Java SE javax.print 文档。)}]

您应该遵循哪些日志记录和监控实践?

在实施生产打印工作流时,请考虑这些做法:

  1. 打印机监控:在发送作业之前检查打印机状态,以避免排队至离线设备
  2. 队列管理:监控打印队列以防止单一打印机超载
  3. 审计日志:记录每个打印作业(时间戳、文档名称、打印机和结果)以供合规之用
  4. 备用选项:配置备用打印机或保存到文件的备用方案,以备主要打印机不可用时使用

对于复杂的打印需求,请探索IronPDF创建PDF表单或在打印前从HTML模板生成文档的功能。 Apache PDFBox项目也是了解Java如何与底层PDF规范交互的有用参考。

您应该如何构建打印作业队列?

对于高吞吐量系统,将打印作业的提交和执行解耦可以防止打印机饱和。 生产者-消费者模式下,您的应用程序将 PdfDocument 对象加入队列,由专用的 PRINT 线程负责从队列中取出并分发这些对象,从而确保主应用程序即使在高负载下也能保持响应。 Java 的 BlockingQueue 来自 java.util.concurrent 在此处效果良好:PRINT 线程在循环中调用 queue.take(),在文档到达时立即打印并记录结果。 这种模式还使添加优先级、速率限制或用于耗尽重试预算的作业的死信队列变得简单。


在Java中打印PDF的下一步是什么?

本指南介绍了两种方法:针对需要用户控制的桌面应用程序,通过 print() 实现交互式PRINT;针对自动化批处理工作流,通过 printWithoutDialog() 实现静默PRINT。 两种方法均可与Java的标准打印基础设施集成,并适用于操作系统上安装的任何打印机。

要将IronPDF添加到您的项目中并开始打印,开始您的免费试用。 无需信用卡。 准备部署时,为您的团队或组织查看许可选项

准备看看IronPDF还能做些什么吗? 在这里查看完整的教程页面:Java打印PDF教程

常见问题解答

如何在 Java 中使用打印对话框打印 PDF 文件?

PdfDocument.fromFile()加载您的PDF或用renderHtmlAsPdf()创建一个,然后调用pdf.print()。这样将打开标准系统打印对话框,用户可以在调度作业之前选择打印机、页面范围、复本数和其他设置。

如何在Java中不显示对话框打印PDF?

使用IronPDF的printWithoutDialog()方法。它将PDF直接发送到默认打印机,无需用户交互,非常适合批处理、服务器端服务和定时打印作业。

使用IronPDF在Java中打印PDF的先决条件是什么?

通过Maven或Gradle将IronPDF添加为您的Java项目的依赖项,然后在打印之前调用License.setLicenseKey()。该库与Java的javax.print基础架构集成,并适用于您操作系统上安装的所有打印机。

我如何创建HTML生成的PDF以供打印?

用HTML字符串或URL调用PdfDocument.renderHtmlAsPdf()。该方法返回一个您无需先保存到磁盘即可立即传递给print()printWithoutDialog()PdfDocument

在IronPDF for Java中,print()和printWithoutDialog()有什么区别?

print()打开一个交互式系统对话框,让用户在作业运行前选择打印机并配置设置。printWithoutDialog()跳过所有对话框,将作业直接发送到默认打印机。在桌面应用程序中使用print(),在自动化或服务器端工作流中使用printWithoutDialog()

我能加载现有的PDF文件并用IronPDF打印它吗?

可以。用PdfDocument.fromFile(Paths.get("yourfile.pdf"))加载任何标准PDF,然后调用任何打印方法。IronPDF支持从文件路径、字节数组和输入流加载PDF。

我如何在Java批处理工作流中处理打印错误和重试?

printWithoutDialog()包裹在try-catch块中。失败时,记录错误并在短暂停顿后重试,使用Thread.sleep()。跟踪尝试计数,并当达到最大重试计数时记录一个严重级别消息,以便您的监控系统能够对持久性故障发出警报。

IronPDF for Java是否在无界面的Linux服务器上运行?

是的。在无界面服务器上,配置一个虚拟打印机,如CUPS,到PDF或打印到文件目标。IronPDF的printWithoutDialog()将作业发送到OS定义的默认打印机,因此支持由CUPS管理的任何打印机目标。

Darrius Serrant
全栈软件工程师(WebOps)

Darrius Serrant 拥有迈阿密大学的计算机科学学士学位,目前在 Iron Software 担任全栈 WebOps 市场工程师。从小就被编码吸引,他认为计算机既神秘又易于接触,使其成为创意和问题解决的理想媒介。

在 Iron Software,Darrius 喜欢创造新事物,并简化复杂概念以使其更易理解。作为我们常驻的开发者之一,他还自愿教授学生,与下一代分享他的专业知识。

对于 Darrius 来说,他的工作令人满意,因为它被重视并产生真正的影响。

准备开始了吗?
版本: 2026.5 just released
Still Scrolling Icon

还在滚动吗?

想快速获得证据?
运行示例看着你的HTML代码变成PDF文件。