利用 iText 庫將 JavaScript 列印腳本嵌入 PDF 文件,當用戶開啟 PDF 時自動觸發列印對話框或靜默列印,適用於報表自動列印、單據批量輸出等場景。
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import java.io.ByteArrayOutputStream;
public byte[] autoPrintPdf(byte[] pdfBytes) {
ByteArrayOutputStream bos = null;
try {
// 讀取原始 PDF
PdfReader reader = new PdfReader(pdfBytes);
bos = new ByteArrayOutputStream();
PdfStamper stamper = new PdfStamper(reader, bos);
// 建構自動列印 JavaScript
StringBuilder script = new StringBuilder();
script.append("this.print({bUI: false, bSilent: true, bShrinkToFit: false});")
.append("\r\nthis.closeDoc();");
// 嵌入 JavaScript 並扁平化表單
stamper.addJavaScript(script.toString());
stamper.setFormFlattening(true);
stamper.close();
} catch (Exception e) {
e.printStackTrace();
}
return bos != null ? bos.toByteArray() : new byte[0];
}
| 參數 | 說明 | 可選值 |
|---|---|---|
bUI | 是否顯示列印對話框 | false 靜默列印 / true 顯示對話框 |
bSilent | 是否靜默模式(不提示) | true 完全背景列印 |
bShrinkToFit | 是否縮放適應頁面 | false 保持原始尺寸 |
script.append("var pp = this.getPrintParams();");
script.append("pp.printerName = 'HP LaserJet Pro';");
script.append("this.print(pp);");
script.append("this.print({bUI: false, nStart: 0, nEnd: 2});"); // 僅列印第 1-3 頁
addJavaScript、檢查 setFormFlattening 設定| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| PDF 嵌入 JS | 無需額外服務、客戶端直連印表機 | 依賴 PDF 檢視器支援度 | 內網報表、單據自動列印 |
| Java Print Service API | 伺服器端控制、支援所有印表機 | 需伺服器連接印表機、佇列管理複雜 | 集中式列印中心 |
| 轉圖片後列印 | 相容性最好 | 品質損失、效能較差 | 特殊格式需求 |
透過 iText 嵌入 JavaScript 實現 PDF 自動列印,程式碼簡潔且部署輕量。關鍵在於 bUI: false 與 bSilent: true 參數組合實現真正無感列印,搭配 setFormFlattening(true) 確保表單欄位正確渲染。實際部署前務必在目標環境驗證 PDF 檢視器相容性。