如何在CodeIgniter中实现点击打印直接输出无弹窗(POS场景)
在CodeIgniter中实现POS订单直接打印(无弹窗)
要实现点击打印按钮直接完成打印,核心要解决浏览器安全限制或后端直接调用打印机的问题,以下是三种可行方案:
方案一:固定终端浏览器静默打印(最简单)
浏览器默认会弹出打印预览窗口,但可以通过启动参数强制静默打印,适合固定的POS终端设备:
- 配置浏览器启动参数
- 针对Chrome浏览器,创建快捷方式,在目标路径后添加参数:
chrome.exe --kiosk-printing --disable-print-preview - 这样启动的Chrome调用
window.print()时会直接触发打印,无弹窗。
- 针对Chrome浏览器,创建快捷方式,在目标路径后添加参数:
- CodeIgniter前端实现
在订单页面准备好打印专用内容,点击按钮触发打印:<!-- 页面中单独的打印内容区块 --> <div id="print-content" style="display:none;"> <h3>订单小票</h3> <p>订单号:<?= $order['id'] ?></p> <p>时间:<?= $order['created_at'] ?></p> <!-- 订单商品、金额等内容 --> </div> <button onclick="triggerPrint()">打印订单</button> <script> function triggerPrint() { // 显示打印内容,隐藏页面其他元素 document.body.style.display = 'none'; const printArea = document.getElementById('print-content'); printArea.style.display = 'block'; // 触发打印 window.print(); // 恢复页面显示 document.body.style.display = 'block'; printArea.style.display = 'none'; } </script>
方案二:后端直接调用打印机(适合共享打印机场景)
如果POS服务器直接连接打印机,或打印机是网络共享设备,可以通过PHP调用系统命令直接打印:
- CodeIgniter控制器代码
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Pos extends CI_Controller { public function print_order($order_id) { // 从数据库获取订单数据 $order = $this->db->get_where('orders', ['id' => $order_id])->row_array(); $items = $this->db->get_where('order_items', ['order_id' => $order_id])->result_array(); // 生成小票格式的打印内容 $print_text = "===== 收银小票 =====\n"; $print_text .= "订单号:{$order['id']}\n"; $print_text .= "时间:{$order['created_at']}\n"; $print_text .= "-------------------\n"; foreach ($items as $item) { $print_text .= "{$item['goods_name']} x {$item['quantity']} ¥{$item['price']}\n"; } $print_text .= "-------------------\n"; $print_text .= "总计:¥{$order['total_amount']}\n"; $print_text .= "===== 谢谢惠顾 =====\n"; // 保存为临时文件 $temp_file = FCPATH . 'temp_print.txt'; file_put_contents($temp_file, $print_text); // 调用系统打印命令(根据服务器系统选择) // Windows系统(打印机名称需匹配本地共享名) exec("print /D:\"POS小票打印机\" $temp_file"); // Linux系统(需安装cups服务,打印机名称用lpstat -p查看) // exec("lp -d pos_printer $temp_file"); // 删除临时文件 unlink($temp_file); // 返回成功响应 $this->output->set_content_type('application/json')->set_output(json_encode(['status' => 'success'])); } } - 前端调用
注意:服务器需开启PHP的<button onclick="directPrint(<?= $order['id'] ?>)">直接打印</button> <script> function directPrint(orderId) { fetch('<?= base_url('pos/print_order/') ?>' + orderId) .then(res => res.json()) .then(data => { alert(data.status === 'success' ? '打印已触发' : '打印失败'); }); } </script>exec函数权限,且确保服务器能访问目标打印机。
方案三:客户端本地打印机(需浏览器授权)
如果打印机连接在客户端电脑上,可借助浏览器的打印权限设置:
- 打开Chrome的
chrome://settings/content/printers,开启“允许网站无需询问即可打印”。 - 前端依然使用
window.print(),此时浏览器会直接调用默认打印机,无弹窗。
内容的提问来源于stack exchange,提问作者Pradeep Bisht
相关产品推荐
相关产品推荐

