上一篇
在Java中实现网页打印,通常有两种方式:,1. 客户端:使用JavaScript调用浏览器打印功能(window.print())。,2. 服务端:通过Java生成PDF(如iText库)或HTML转PDF(如Flying Saucer),发送给用户打印,后者适合复杂排版或后台静默打印需求。
核心实现思路
- 后端:生成打印内容(HTML/PDF格式)
- 前端:调用浏览器打印接口(
window.print()) - 样式控制:通过CSS定义打印专用样式
具体实现方法
方法1:纯前端打印(简单场景)打印,直接调用浏览器功能:
<button onclick="window.print()">打印页面</button>
<!-- 隐藏非打印区域 -->
<style>
@media print {
.no-print { display: none; } /* 隐藏不需要打印的元素 */
body { font-size: 12pt; } /* 调整打印字体 */
}
</style>
方法2:后端生成HTML模板打印
步骤:
-
Java生成动态HTML
// Spring Boot示例 @GetMapping("/print/receipt") public String getReceipt(Model model) { model.addAttribute("orderNo", "2025-12345"); model.addAttribute("items", Arrays.asList("商品A", "商品B")); return "print-template"; // 返回Thymeleaf/FreeMarker模板 } -
HTML模板(print-template.html)
<div class="print-area"> <h2>订单号: [[${orderNo}]]</h2> <ul> <li th:each="item : ${items}" th:text="${item}"></li> </ul> </div>
“`
方法3:后端生成PDF打印(推荐)
使用库:
- Apache PDFBox
- iText
- 推荐方案: Flying Saucer(将HTML转PDF)
示例代码:
// Flying Saucer + Thymeleaf
public void generatePdf(HttpServletResponse response) throws Exception {
// 1. 渲染HTML
Context ctx = new Context();
ctx.setVariable("content", "打印内容");
String html = templateEngine.process("template", ctx);
// 2. 转换PDF
OutputStream out = response.getOutputStream();
ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(html);
renderer.layout();
renderer.createPDF(out);
// 3. 设置响应头
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "inline; filename=print.pdf");
out.close();
}
前端调用:
<a href="/generate-pdf" target="_blank">打印PDF</a> <!-- 浏览器自动打开打印预览 -->
高级功能实现
打印分页控制
@media print {
.page-break {
page-break-after: always; /* 强制分页 */
}
}
页眉页脚
@page {
@top-center { content: "公司名称"; }
@bottom-right { content: "页码 " counter(page); }
}
二维码打印(结合Java)
// 使用ZXing生成二维码 String qrUrl = "https://example.com/order123"; BufferedImage qrCode = new QRCodeWriter().encode(qrUrl, BarcodeFormat.QR_CODE, 200, 200); // 将图片插入HTML模板
避坑指南
-
样式失效问题
- 打印样式必须用
@media print - 避免使用Flex/Grid布局(部分浏览器不支持打印)
- 打印样式必须用
-
跨浏览器兼容
- 测试Chrome/Firefox/Edge
- Safari需启用打印背景色:
-webkit-print-color-adjust: exact;
-
安全限制
- 浏览器可能拦截弹窗,需用户主动触发打印操作
- PDF文件建议用
inline模式而非下载
方案选型建议
| 场景 | 推荐方案 |
|---|---|
| 简单页面打印 | 纯前端window.print() |
| 动态数据报表 | 后端HTML模板+打印样式 |
| 格式严格的合同/票据 | 后端生成PDF |
专业提示:银行/医院等系统推荐使用PDF方案,确保打印格式零误差。
引用说明:
- Apache PDFBox:PDF生成库
- Flying Saucer:HTML转PDF工具
- PrintCSS:打印样式标准参考
- Paged.js:高级打印布局方案(开源)
