PHP EscPOS:如何保存原始打印数据并延后执行?
ESC/POS原始数据保存与延后打印问题解决
问题1:能否将EscPOS原始数据保存到txt文件?
可以,但不能用普通文本模式保存/读取。因为ESC/POS指令包含大量非ASCII的二进制控制字符(比如ESC、GS这类转义码),普通文本文件会默认按字符编码(如UTF-8)处理这些内容,导致二进制数据被篡改、丢失,进而打印时出现乱码。
问题2:如何让打印机正确执行保存后的命令?
核心是用二进制模式保存和读取数据,并且发送时直接传递原始二进制内容,不要让打印机类再做编码处理。修正后的代码如下:
保存原始数据的代码
$connector = new DummyPrintConnector(); $printer = new Printer($connector); $printer->text("Hello world!\n"); $printer->cut(); $data = $connector->getData(); // 用二进制模式写入文件,避免编码转换 file_put_contents('example.bin', $data, FILE_APPEND | LOCK_EX); $printer->close();
注:建议将后缀改为
.bin而非.txt,明确这是二进制文件,避免文本编辑器误打开篡改内容。
读取并打印的代码
$connector = new WindowsPrintConnector('Generic'); $printer = new Printer($connector); // 用二进制模式读取文件 $rawData = file_get_contents('example.bin'); // 使用textRaw发送原始二进制数据,不要用text(text会重新编码) $printer->textRaw($rawData); $printer->close();
关键注意点
- 保存和读取必须使用二进制模式:PHP的
file_put_contents和file_get_contents默认支持二进制处理,但要确保系统编码设置不会干扰数据; - 发送时一定要用
textRaw方法:text方法会对传入的字符串做编码转换,而textRaw会直接把二进制数据发送给打印机,符合ESC/POS的指令要求; - 避免用文本编辑器打开保存的二进制文件:很多文本编辑器会自动替换不可见字符,导致数据损坏。
内容的提问来源于stack exchange,提问作者Linesofcode
相关产品推荐
相关产品推荐

