uni-app实现商米硬件打印
本文档用到的设备型号:商米(sunmi)V2,2G+16G。
需要引用商米打印插件(每个APP项目需要花费1元购买该插件),插件地址:ext.dcloud.net.cn/plugin?id=8…。
文档上基本打印指令的参考案例,针对于打印图片该文档并没有提供方法直接使用,要通过ESC指令内容来执行打印,参考方法sunmi_print.printRawData(data)。其中,data为图片转化成的ESC指令,此处在服务器端进行转换(用户端的转换效率太低)。
ESCPOS指令文档参考商米的官方文档:docs.sunmi.com/general-fun…
/*
* @param $file_path 本地图片路径,图片进行大小整合thumb(400,210)长为400宽为210以符合打印要求
* @return $data 打印插件直接使用的数据
*/
public function imageFileToEsc($file_path)
{
$image = Image::open($file_path);
$image->thumb(400, 210)->save($file_path);
//规范化图片
$i = imagecreatefrompng($file_path);
$width = ceil(imagesx($i) / 8) * 8 - 8;
$height = imagesy($i);
$data = [];
$data[0] = 0x1D;
$data[1] = 0x76;
$data[2] = 0x30;
$data[3] = 0;
$data[4] = $width / 8 % 256;
$data[5] = (int)($width / 8 / 256);
$data[6] = $height % 256;
$data[7] = (int)($height / 256);
$index = 8;
for ($y = 0; $y < $height; $y++) {
for ($x = 0; $x < $width; $x += 8) {
$part = [];
for ($j = 0; $j < 8; $j++) {
$read_width = $x + $j >= $width ? $width : $x + $j;
$rgb = imagecolorat($i, $read_width, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$gray = (int)($r * 0.3 + $g * 0.59 + $b * 0.11);
if ($gray > 127) {
$part[] = 0;
} else {
$part[] = 1;
}
}
$temp = $part[0] * 128 +
$part[1] * 64 +
$part[2] * 32 +
$part[3] * 16 +
$part[4] * 8 +
$part[5] * 4 +
$part[6] * 2 +
$part[7] * 1;
$data[$index++] = $temp;
}
}
return $data;
}复制代码
//引用插件
const sunmi_print= uni.requireNativePlugin('Sunmi-Print');
//连接打印机
//首次启动app时调用此方法,使app可以连上打印机,从而可以操作打印
sunmi_print.init();
//打印图片
sunmi_print.printRawData(data);
//断开打印机
sunmi_print.destroy();