如何通过Jquery和PHP实现数据库数据热敏收据打印机无弹窗打印
关于无弹窗打印账单的可行方案
嘿,这个问题问到点子上了——谁都不想每次打账单都被打印机选择弹窗打断流程对吧?不过先得说清楚:浏览器出于安全防护的考虑,默认绝对不允许跳过打印机选择弹窗直接静默打印,这是为了防止恶意网站滥用打印功能。但咱们还是有变通办法,给你两种实用思路:
方案一:服务器端生成PDF并直接打印(最靠谱的无弹窗方案)
这个思路完全绕开浏览器,用PHP从数据库取数、生成账单PDF,然后让服务器直接调用系统打印服务。适合收银系统、内部管理系统这类服务器可控的场景。
步骤拆解:
- 从数据库拉取账单数据:用PDO或mysqli安全查询你需要的账单信息
- 生成PDF格式账单:用TCPDF、FPDF这类PHP库生成规范的账单PDF
- 服务器端触发打印:调用系统的打印命令(Linux用
lp,Windows用print)直接打印PDF
代码示例:
// 1. 安全查询数据库账单数据 $pdo = new PDO('mysql:host=localhost;dbname=your_db', 'db_user', 'db_pass'); $stmt = $pdo->prepare("SELECT id, customer_name, amount, create_time FROM bills WHERE id = ?"); $stmt->execute([$_POST['target_bill_id']]); $bill = $stmt->fetch(PDO::FETCH_ASSOC); // 2. 用TCPDF生成账单PDF require_once('tcpdf/tcpdf.php'); $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); $pdf->SetCreator(PDF_CREATOR); $pdf->SetTitle('账单 #' . $bill['id']); $pdf->AddPage(); $pdf->SetFont('stsongstdlight', '', 14); // 填充账单内容 $pdf->Cell(0, 15, '客户账单', 0, 1, 'C'); $pdf->Ln(10); $pdf->Cell(40, 10, '账单编号:', 0, 0); $pdf->Cell(0, 10, $bill['id'], 0, 1); $pdf->Cell(40, 10, '客户姓名:', 0, 0); $pdf->Cell(0, 10, $bill['customer_name'], 0, 1); $pdf->Cell(40, 10, '账单金额:', 0, 0); $pdf->Cell(0, 10, '¥' . number_format($bill['amount'], 2), 0, 1); $pdf->Cell(40, 10, '生成时间:', 0, 0); $pdf->Cell(0, 10, date('Y-m-d H:i', strtotime($bill['create_time'])), 0, 1); // 保存PDF到服务器临时目录 $tempPdfPath = '/tmp/bill_' . $bill['id'] . '.pdf'; $pdf->Output($tempPdfPath, 'F'); // 3. 服务器端触发打印(Linux环境示例) // 注意:要确保PHP有执行系统命令的权限,且服务器已配置好默认打印机 exec("lp " . escapeshellarg($tempPdfPath)); // Windows环境的话换成这条: // exec('print /D:"你的打印机名称" ' . escapeshellarg($tempPdfPath));
注意事项:
- 服务器必须提前配置好可用的打印机
- 要严格过滤传入的参数(比如
target_bill_id),防止命令注入攻击 - 需要安装TCPDF/FPDF库,可以通过Composer或者手动下载安装
方案二:浏览器端简化打印流程(无法完全无弹窗,但能优化体验)
如果是面向普通用户的网页,没法操控服务器打印,那只能尽量简化打印流程。可以用Chrome的特殊启动参数实现无弹窗,但需要用户配合配置;普通场景下则优化打印样式,让弹窗出现后用户只需点确认。
步骤拆解:
- 用jQuery/Ajax从PHP接口拉取账单数据
- 渲染出仅包含账单内容的打印专用区域
- 调用
window.print()触发打印,用CSS的@media print优化打印样式 - (可选)Chrome用户用
--kiosk-printing启动参数,实现默认打印机直接打印
代码示例:
<!-- 页面结构:隐藏的账单打印区域 --> <div id="print-bill-area" style="display: none; padding: 20px;"> <!-- 后续用JS填充内容 --> </div> <script src="jquery.min.js"></script> <script> $(function() { // 1. 从PHP接口拉取账单数据 $.ajax({ url: 'api/get-bill.php', method: 'POST', data: { bill_id: 123 }, dataType: 'json', success: function(billData) { // 2. 渲染账单内容 $('#print-bill-area').html(` <h2 style="text-align: center;">客户账单</h2> <table style="width: 100%; margin-top: 20px; border-collapse: collapse;"> <tr> <td style="border: 1px solid #000; padding: 8px;">账单编号</td> <td style="border: 1px solid #000; padding: 8px;">${billData.id}</td> </tr> <tr> <td style="border: 1px solid #000; padding: 8px;">客户姓名</td> <td style="border: 1px solid #000; padding: 8px;">${billData.customer_name}</td> </tr> <tr> <td style="border: 1px solid #000; padding: 8px;">账单金额</td> <td style="border: 1px solid #000; padding: 8px;">¥${numberFormat(billData.amount, 2)}</td> </tr> </table> `).show(); // 3. 触发打印 window.print(); // 打印完成后隐藏打印区域 $('#print-bill-area').hide(); } }); // 辅助函数:格式化金额 function numberFormat(num, decimals) { return num.toFixed(decimals).replace(/\B(?=(\d{3})+(?!\d))/g, ","); } }); </script> <!-- 打印样式优化:只显示账单区域 --> <style> @media print { body * { display: none !important; } #print-bill-area, #print-bill-area * { display: block !important; } } </style>
注意事项:
--kiosk-printing参数需要用户在启动Chrome时添加(比如快捷方式目标里加chrome.exe --kiosk-printing),适合收银台这类固定设备- 普通浏览器还是会弹出打印机选择窗口,但优化后的样式能让打印内容更规范
总结
如果是内部系统、服务器可控的场景,优先选方案一,完全实现无弹窗打印;如果是公开网页,只能用方案二优化体验,没法彻底跳过弹窗——毕竟浏览器的安全限制是绕不开的。
内容的提问来源于stack exchange,提问作者Mpwanyi Samuel
相关产品推荐
相关产品推荐

