如何在 Java 中列印 PDF 檔案

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

IronPDF for Java 讓您能夠透過程式化方式列印 PDF 檔案,無論是否需要使用者互動。 您可以直接將 PDF 檔案傳送至實體印表機、控制列印設定(例如份數和頁碼範圍),並在 Java 應用程式中自動化文件列印工作流程。 無論您是建置 Enterprise 文件管理系統,還是自動化發票生成流程,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.*;

public class PrintPDFQuickstart { public static void main(String[] args) { // 套用您的授權金鑰 License.setLicenseKey("您的授權金鑰");

    // 從 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 或渲染新文件</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 Java 與系統列印對話方塊整合的列印對話方塊,呈現印表機選擇、頁碼範圍及複印張數選項

何時應使用對話框式列印?

透過對話框進行列印,可讓使用者控制列印設定,例如印表機選擇、頁碼範圍、份數及紙張方向。 此方法適用於桌面應用程式、文件管理系統,或任何需要使用者在任務發送前檢視並調整設定的場景。

常見需使用 print() 的情況:

  • 具備列印預覽功能的桌面應用程式
  • 文件工作流程系統,使用者可在其中選取特定的頁碼範圍
  • 辦公室環境中,不同印表機用於不同用途
  • 需要使用者在列印敏感文件前進行確認的應用程式

對於需要先合併多個 PDF 檔案再進行列印的應用情境,請先將文件合併,然後將合併後的結果傳遞至 PRINT 對話方塊。 請參閱 IronPDF for JavaHTML 轉 PDF 教學指南,了解如何從網頁內容生成可直接列印的 PDF 檔案。

"PRINT對話方塊"提供了哪些設定選項?

標準的 Java 列印對話方塊會顯示完整的作業系統層級列印屬性,包括頁面方向、紙張尺寸、列印品質及排序方式。 IronPDF 會交由底層的 javax.print API 進行屬性協商,因此可用的選項取決於各印表機所回報的功能。 在 Windows 系統上,會顯示原生的 Win32 列印對話方塊; 在 Linux 和 macOS 上,則改用 GTK 或 Cocoa 對話方塊。 您的 Java 應用程式無需編寫自訂 UI 程式碼,因為作業系統會自動處理介面呈現。


如何在不提示使用者介入的情況下 PRINT 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 for JavaPDF 壓縮功能來縮小檔案大小,再將其傳送至印表機,如此既能縮短列印時間,也能降低資源消耗。

何時直接列印最為有效?

請在需要自動化文件工作流程、排程列印任務,或後端服務(即列印過程必須在無需人工干預的情況下進行)時,使用 printWithoutDialog()。 常見的使用情境包括:

  • 銷售點系統:交易完成後自動列印收據
  • 報表生成:排程並列印每日或每週報表
  • 標籤列印:在倉儲管理系統中列印運送標籤
  • 文件處理:批次列印合約或法律文件

對於需要在 Java 中添加浮水印或在列印前對內容加蓋印章的應用程式,請先處理 PDF 檔案,然後將其直接傳送至印表機。


如何處理自動化工作流程中的列印錯誤?

在不使用對話方塊進行列印時,妥善的錯誤處理至關重要。 印表機可用性問題、卡紙及連線問題都可能中斷批次作業。 將 PRINT 呼叫封裝在 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 文件。)}]

您應遵循哪些記錄與監控實務?

在實作生產環境的PRINT工作流程時,請參考以下實務建議:

  1. 印表機監控:在傳送列印工作前檢查印表機狀態,以避免將工作排入離線裝置的佇列中
  2. 排程管理:監控列印排程,以防止單一印表機過載
  3. 稽核記錄:為符合合規要求,記錄每項列印工作(包含時間戳記、文件名稱、印表機及結果)
  4. 備用選項:當主要印表機無法使用時,可設定替代印表機或"儲存至檔案"的備用方案

若需處理複雜的列印需求,請探索 IronPDF 的功能,例如在 Java 中建立 PDF 表單,或於列印前透過 HTML 範本產生文件。 Apache PDFBox 專案也是理解 Java 如何與底層 PDF 規格互動的實用參考。

該如何規劃PRINT工作排程?

對於高吞吐量系統而言,將列印工作提交與執行解耦,可防止印表機過載。 透過生產者-消費者模式,您的應用程式將 PdfDocument 物件加入佇列,再由專用的 PRINT 執行緒從佇列中取出並分派處理,即使在高負載下,也能確保主應用程式的響應性。 Java 的 BlockingQueuejava.util.concurrent 傳入此處運作良好:PRINT 執行緒在迴圈中呼叫 queue.take(),於文件送達時立即列印,並記錄結果。 此模式亦能輕鬆為任務新增優先級、速率限制,或針對已耗盡重試配額的任務建立死信佇列。


在 Java 中 PRINT PDF 的下一步該怎麼做?

本指南涵蓋兩種方法:透過 print() 進行互動式列印,適用於需要使用者控制的桌面應用程式;以及透過 printWithoutDialog() 進行靜默列印,適用於自動化批次工作流程。 這兩種方法皆與 Java 的標準列印基礎架構整合,並可與作業系統上安裝的任何印表機配合使用。

若要將 IronPDF 加入您的專案並開始列印,請立即開始免費試用。 無需信用卡。 當您準備部署時,請查看適用於您的團隊或組織的授權選項

準備好探索 IronPDF 的更多功能了嗎? 點此查看完整教學頁面:Java PRINT PDF 教學

常見問題

如何在 Java 中使用列印對話方塊列印 PDF 檔案?

請使用 PdfDocument.fromFile() 載入 PDF 檔案,或透過 renderHtmlAsPdf() 建立 PDF 檔案,接著呼叫 pdf.print()。此操作將開啟標準系統列印對話方塊,使用者可在工作送印前,在此選取印表機、頁碼範圍、印製份數及其他設定。

如何在 Java 中列印 PDF 而不顯示對話方塊?

請使用 IronPDF 的 printWithoutDialog() 方法。此方法會將 PDF 直接傳送至預設印表機,無需使用者互動,因此非常適合用於批次處理、伺服器端服務及排程列印工作。

在 Java 中使用 IronPDF 列印 PDF 的先決條件有哪些?

請透過 Maven 或 Gradle 將 IronPDF 加入您的 Java 專案作為依賴項,然後在列印前呼叫 License.setLicenseKey()。此函式庫整合了 Java 的 javax.print 基礎架構,並可與您作業系統上安裝的所有印表機配合使用。

如何在列印前將 HTML 轉為 PDF?

呼叫 PdfDocument.renderHtmlAsPdf() 並傳入 HTML 字串或 URL。此方法會傳回一個 PdfDocument 物件,您可立即將其傳遞給 PRINT()PRINTWithoutDialog(),無需先儲存至磁碟。

在 IronPDF for Java 中,print() 與 printWithoutDialog() 之間有何差異?

PRINT() 會開啟一個互動式系統對話方塊,讓使用者能在工作執行前選擇印表機並設定參數。PRINTWithoutDialog() 則會跳過所有對話方塊,並將工作直接傳送至預設印表機。請在桌面應用程式中使用 PRINT(),並在自動化或伺服器端工作流程中使用 PRINTWithoutDialog()

我可以使用 IronPDF 載入現有的 PDF 檔案並進行列印嗎?

是的。請使用 PdfDocument.fromFile(Paths.get("yourfile.pdf")) 載入任何標準 PDF 檔案,然後呼叫任一列印方法。IronPDF 支援從檔案路徑、位元組陣列及輸入串流載入 PDF 檔案。

在 Java 批次工作流程中,該如何處理 PRINT 錯誤與重試機制?

請將 printWithoutDialog() 封裝在 try-catch 區塊中。若發生錯誤,請記錄錯誤並使用 Thread.sleep() 稍作暫停後重新嘗試。請追蹤嘗試次數計數器,當達到最大重試次數時,記錄嚴重級別的訊息,以便您的監控系統能針對持續性失敗發出警示。

IronPDF for Java 能在無頭 Linux 伺服器上運作嗎?

是的。在無顯示器的伺服器上,請設定一個虛擬印表機(例如 CUPS),並將輸出目標設為 PDF 或「列印至檔案」。IronPDF 的 printWithoutDialog() 會將列印工作傳送至作業系統中定義的預設印表機,因此支援任何由 CUPS 管理的印表機目標。

Curtis Chau
技術撰稿人

Curtis Chau 擁有卡爾頓大學(Carleton University)的電腦科學學士學位,專精於前端開發,並精通 Node.js、TypeScript、JavaScript 及 React。他熱衷於打造直觀且美觀的用戶介面,喜歡運用現代框架,並創建結構完善、視覺上吸引人的手冊。

除了開發工作之外,Curtis 對物聯網(IoT)抱有濃厚興趣,致力於探索整合硬體與軟體的創新方法。閒暇時,他喜歡玩遊戲和開發 Discord 機器人,將對科技的熱愛與創意相結合。

準備開始了嗎?
版本: 2026.5 just released
Still Scrolling Icon

還在捲動嗎?

想要快速證明?
執行範例 觀看您的 HTML 變成 PDF。