php实现小票打印
PHP实现小票打印的方法
方法一:使用ESC/POS指令直接控制打印机
通过PHP发送原始ESC/POS指令到热敏打印机,适用于USB、网络或串口连接的POS打印机。需要安装打印机驱动并配置好连接。
// 连接网络打印机示例
$printerIP = "192.168.1.100";
$printerPort = 9100;
$fp = fsockopen($printerIP, $printerPort, $errno, $errstr, 10);
if (!$fp) {
echo "连接失败: $errno - $errstr";
} else {
// ESC/POS指令
$commands = "";
$commands .= chr(27)."@"; // 初始化
$commands .= "=== 销售小票 ===\n";
$commands .= chr(27)."E".chr(1)."商品名称\t单价\t数量\n"; // 加粗
$commands .= chr(27)."E".chr(0); // 取消加粗
$commands .= "------------------------\n";
$commands .= "可乐\t15.00\t2\n";
$commands .= "薯片\t8.50\t1\n";
$commands .= "------------------------\n";
$commands .= "总计: 38.50元\n";
$commands .= chr(29)."V".chr(65).chr(0); // 切纸
fwrite($fp, $commands);
fclose($fp);
}
方法二:通过打印服务中间件
使用如PrintNode、CUPS等打印服务,通过API发送打印任务。适用于云服务器或需要远程打印的场景。
// 使用PrintNode API示例
$printJob = [
'printerId' => 'your_printer_id',
'title' => 'Sales Receipt',
'contentType' => 'raw_base64',
'content' => base64_encode("=== 销售小票 ===\n商品1\t10.00\n商品2\t20.00")
];
$ch = curl_init('https://api.printnode.com/printjobs');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Basic '.base64_encode('your_api_key:'),
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($printJob));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
方法三:生成PDF/图片后打印
使用TCPDF、FPDF或GD库生成小票的PDF/图片文件,再通过系统命令打印。
// 使用TCPDF生成PDF小票
require_once('tcpdf/tcpdf.php');
$pdf = new TCPDF('P', 'mm', array(80, 200), true, 'UTF-8', false);
$pdf->AddPage();
$pdf->SetFont('helvetica', '', 10);
$pdf->Cell(0, 0, '=== 销售小票 ===', 0, 1);
$pdf->Cell(0, 0, '商品名称 单价 数量', 0, 1);
$pdf->Cell(0, 0, '可乐 15.00 2', 0, 1);
$pdf->Cell(0, 0, '总计: 30.00元', 0, 1);
$pdfContent = $pdf->Output('receipt.pdf', 'S');
// 打印PDF(Linux系统)
exec('lp receipt.pdf');
方法四:浏览器直接打印
通过HTML/CSS设计小票模板,使用JavaScript的window.print()触发浏览器打印。
// PHP生成HTML小票
echo '<!DOCTYPE html>
<html>
<head>
<style>
@media print {
body { width: 80mm; font-size: 12px; }
.item { display: flex; justify-content: space-between; }
}
</style>
</head>
<body>
<h3>=== 销售小票 ===</h3>
<div class="item"><span>商品名称</span><span>价格</span></div>
<div class="item"><span>可乐</span><span>15.00</span></div>
<div class="item"><span>总计:</span><span>15.00元</span></div>
<script>window.print();</script>
</body>
</html>';
注意事项
- 热敏打印机通常需要特定驱动和连接配置,确保设备支持ESC/POS指令集
- 网络打印需开放对应端口,考虑防火墙设置
- 云打印服务可能有API调用限制和费用
- 浏览器打印依赖用户端打印机配置,适合本地POS系统
- 小票内容应简洁,宽度通常限制在58-80mm之间
扩展功能建议
- 添加条形码/二维码生成功能用于促销或订单追踪
- 实现自动切纸指令(ESC/POS: GS V 66 0)
- 考虑多联打印需求,设置打印浓度
- 添加打印状态回执确认机制
- 设计模板系统支持不同商户的小票格式







