首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 打印不再難:DocumentRenderer 輕鬆實現高質量文檔列印

     編輯:Java 相關知識

傳統打印 API 的痛點

標準 java.awt.print.Printable 要求開發者手動:

  1. 計算字體度量、行高、分頁邏輯
  2. 解析文本、處理換行、斷詞
  3. 在 Graphics 上逐字繪製

代碼量大、易出錯、且與螢幕顯示邏輯重複度高。

DocumentRenderer:複用 Swing 文本引擎

核心思想

Swing 的 JEditorPane 已內建完整的文本排版引擎(View 樹、分頁、樣式、圖片)。DocumentRenderer 將文檔放入隱形 JEditorPane,直接複用其 View 體系進行分頁繪製,「所見即所得」從螢幕延伸到紙張。

支援文檔類型

  • HTMLDocument(HTML 3.2/4.0 子集)
  • PlainDocument(純文本)
  • RTFDocument(Rich Text Format)
  • 其他 JEditorPane 識別的類型(微調即可支援)

兩行代碼完成打印

DocumentRenderer renderer = new DocumentRenderer();
renderer.print(htmlDocument); // 自動彈出打印對話框、分頁、縮放

RTF 需包裝在 JEditorPane 中:

renderer.print(rtfEditorPane);

核心功能特性

特性說明
智能分頁不在行中間斷開,不切割字符,自動計算分頁符位置
樣式保真字體、顏色、圖標、表格、多欄佈局完整保留
縮放適配setScaleWidthToFit(true) 自動縮放寬度超紙寬的內容
頁面設置pageDialog() 彈出標準頁面設置對話框(紙張、邊距、方向)
取消支援打印對話框提供取消按鈕,用戶可隨時中止

內部原理:View 樹遍歷與繪製

  1. 構建隱形 JEditorPane,設置文檔,寬度 = 打印區寬度,調用 validate() 觸發佈局生成 View 樹。
  2. 獲取根視圖:View root = pane.getUI().getRootView(pane)。
  3. 遞歸遍歷 View 樹,尋找葉視圖(View.getViewCount() == 0)。
  4. 對每個葉視圖,檢查其 getPreferredSpan(View.Y_AXIS) 是否超出頁面剩餘高度。
  5. 完全放得下 → view.paint(g, allocation) 直接繪製;放不下 → 記錄分頁位置,換頁後繼續。
  6. 視圖自帶字體/顏色/圖片渲染邏輯,無需手動設置 Graphics 屬性。

已知限制

  • Windows 下文本度量微小偏差,右對齊可能明顯錯位,建議避免右對齊排版。
  • 大尺寸圖標(> 幾百像素)可能無法繪製,小圖標正常。
  • 依賴 Swing 文本引擎,JEditorPane 不支援的 CSS/HTML 特性同樣無法打印。
  • 測試環境:JDK 1.3/1.4,理論適用所有支援 Swing 的版本。

獲取與使用

完整源碼(< 200 行,含詳細註釋)可從文章附件下載。將 DocumentRenderer.java 放入項目,即可為任何 Swing 文本組件添加專業級打印能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved