You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CodeIgniter中实现点击打印直接输出无弹窗(POS场景)

在CodeIgniter中实现POS订单直接打印(无弹窗)

要实现点击打印按钮直接完成打印,核心要解决浏览器安全限制或后端直接调用打印机的问题,以下是三种可行方案:


方案一:固定终端浏览器静默打印(最简单)

浏览器默认会弹出打印预览窗口,但可以通过启动参数强制静默打印,适合固定的POS终端设备:

  1. 配置浏览器启动参数
    • 针对Chrome浏览器,创建快捷方式,在目标路径后添加参数:
      chrome.exe --kiosk-printing --disable-print-preview
      
    • 这样启动的Chrome调用window.print()时会直接触发打印,无弹窗。
  2. 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调用系统命令直接打印:

  1. 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']));
        }
    }
    
  2. 前端调用
    <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>
    
    注意:服务器需开启PHP的exec函数权限,且确保服务器能访问目标打印机。

方案三:客户端本地打印机(需浏览器授权)

如果打印机连接在客户端电脑上,可借助浏览器的打印权限设置:

  1. 打开Chrome的chrome://settings/content/printers,开启“允许网站无需询问即可打印”。
  2. 前端依然使用window.print(),此时浏览器会直接调用默认打印机,无弹窗。

内容的提问来源于stack exchange,提问作者Pradeep Bisht

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 10:50:17