相关文章推荐
腼腆的甘蔗  ·  在svg ...·  6 月前    · 
坏坏的金针菇  ·  C++ ...·  1 年前    · 

优声云小票打印机是国内知名的小票打印机厂商,在对接优声云智能打印机的过程中,需要使用CODE128C编码,那么我们需要把条形码数据转换成打印机ESCPOS指令。接下来,我们介绍使用PHP把条码内容转换成ESC指令集。

code128c介绍

CODE128有三个版本:

  • A(数字、大写字母、控制字符)
  • B(数字、大小字母、字符)
  • C(双位数字)

CODE128A:标准数字和大写字母,控制符,特殊字符
CODE128B:标准数字和大写字母,小写字母,特殊字符
CODE128C:[00]-[99]的数字对集合,共100个

●可用128个字符分别在A、B或C三个字符串集合中。

我们使用的CODE128C条码内容必须是偶数个字节长度,且只能为纯数字。
类似于下面这种

$code = '12345678';

我们需要把code变量分成两个字节长度的字符串,可分为4份

$arr = str_split($code, 2);

打印arr变量可看到code变量已经被分割了。

array(4) {
  [0]=>
  string(2) "12"
  [1]=>
  string(2) "34"
  [2]=>
  string(2) "56"
  [3]=>
  string(2) "78"

我们需要把这些2字节的内容当做ASCII码来处理,并取得对应的字符。把这些字符依次串联起来。
使用chr函数取得字符串:

$result = '';
$arr = str_split($str, 2);
foreach ($arr as $v) {
	$result .= chr($v);

得到result变量后,我们使用CODE128C指令集来拼接:

$esc = '{C'.$result

由此得到code条码内容的esc指令,下发给对应的云打印机打印即可。

code变量为偶数长度,那么分割成2字节字符串是可以均分的,但是如果code是奇数长度呢
假如:

$code = '1234567';

那么分割成2个字节字符串为:

array(4) {
  [0]=>
  string(2) "12"
  [1]=>
  string(2) "34"
  [2]=>
  string(2) "56"
  [3]=>
  string(1) "7"

此时数组内第四个值则为一个长度

chr(7) == chr('07');

上述等式是完全相等的,那么可以发现
‘12345607’和’1234567’的条形码指令是完全一样的,这个时候该怎么办呢。

奇数长度处理

针对上述情况,不同的软件有不同的处理方法,通常有以下两种:
1、事先检测数字位数,如果是奇数位,则在首位补0,如
1234567→01234567
2、在最后一个单个数字前转换字符集,如

//前面的两个字节字符串按照CODE128C标准,最后一个不足2字节的字符按照CODE128B标准
start C 12 34 56 code B 7 check stop
  • 第一种方法由于改变了数据内容,困此并不是最好的解决方案,对于纯粹表示数值是可以接受的,如果是表示数字串则不合适,实际上编写一个通用程序无法预见要编制的条码究竟是数值型数据还是字符型数据。

  • 第二种方法是大多数生成条码软件使用的方法,虽然并没有严格遵循使用C字符集,但这并不违反CODE 128的规则,因为CODE-128并没有限制三个字符集的使用范围。只要根据数据型类选择最优方案即可。

按照第一种方法:
code变量改变为:

$code = '01234567';

再来计算code的esc指令即可。

第二种方法

$result = chr(12).chr(34).chr(56);

拼接指令:

$esc = '{C'.$result.'{B'.7;

如此,则完成了任意数字转换为CODE128C标准的ESC/POS指令。

优声云小票打印机是国内知名的小票打印机厂商,在对接优声云智能打印机的过程中,需要使用CODE128C编码,那么我们需要把条形码数据转换成打印机ESCPOS指令。接下来,我们介绍使用PHP把条码内容转换成ESC指令集。code128c介绍CODE128有三个版本:A(数字、大写字母、控制字符)B(数字、大小字母、字符)C(双位数字)CODE128A:标准数字和大写字母,控制符,特殊字符CODE128B:标准数字和大写字母,小写字母,特殊字符CODE128C:[00]-[99]的数字对集合,
爱普生ESCPOS-PHP 该项目允许您通过 PHP 打印到您的 EPSON 热敏打印机。 这已经在 Windows XP、Windows 7、Centos 和 Debian 以及 Raspberry PI 上进行了测试 我当前的设置是带有 ABElectronics 的 PI 串行适配器的 Raspberry PI 2 就软件而言,我已经在 Linux 上的 Apache2、Windows 上的 XAMPP 和 WAMP 上进行了这项工作 - 所有其他网络服务器都应该支持这一点! 这支持所有版本的 EPSON 串行打印机。 在我测试的主要部分,我使用的是 TM88III、TM88IV 打印机。 #安装和配置#Windows:COM1 #LINUX: /dev/ttyS1 For linux devices it is best to do: dmesg |
热敏小票/标签打印机,使用ESC/POS指令打印,常用指令封装,适用于GBK编码 const PER_MM=8,//每毫米像素数 fontSize=12,//每字符像素数 gbk=require('./gbk'),//兼容中文的字符转换库,文末附链接 /*计算字符串长度(1个中文=2个字符)*/ charLen=str=>{ let width=0; for(let i=0;i<str.length;i++){ width+=gbk.isAscii(str.charCodeAt(
private $unit_width = 1; //单位宽度 缺省1个象素 private $is_set_height = false; private $width = -1; private $heith = 35; private $quiet
适用于PHPESC / POS打印驱动程序 该项目为热敏票据打印机实现了Epson ESC / POS协议的子集。 它使您可以在兼容的打印机上生成和打印带有基本格式,剪切和条形码的收据。 开发该库是为了向任何PHP应用程序(包括基于Web的销售点(POS)应用程序)添加对收据打印的直接支持。 接口和操作系统 已知此驱动程序可用于以下OS /接口组合: Linux USB串行 SMB分享了 托管CUPS 许多热敏票据打印机在某种程度上都支持ESC / POS。 已知该驱动程序可用于: 3nStar RPT-008 约APPPOS80AM AURES ODP-333 AURES ODP-500 Bematech-4200-TH Bematech LR2000E 桦木PRP-085III Bixolon SRP-350III Bixolon SRP-350Plus 黑铜BC-85AC 冠泰TH-305N 公民CBM1000-II 公民CT-S
一:插件安装 在php中我们可以使用php-barcode-generator插件来生成条形码php-barcode-generator插件github地址:https://github.com/picqer/php-barcode-generator composer require picqer/php-barcode-generator 二:php-barcode-generato...
因工作需要,需要在pos结款小票上打印条码,一开始想到控件方式实现,但是这种方式不太稳定,而且速度较慢。因为使用的热敏打印机是EPSON TM-58型打印机,所以想到了可以使用ESC/POS命令来实现条码的打印,这种方式不但速度快,而且可以在所有兼容ESC/POS指令集的打印机上通用,并且不涉及控件调用的问题,方便移植到不同的平台。 本文主要以CODE128 C编码举例,其他编码大同小异,需要了
const ESC="\x1b";//设置 const GS="\x1d";//页面设置 字体大小17倍数 const HT="\x09";//跳格设置 9,17,25,33,41 const CUT="\x1d";//切纸 const LF="\x0a";//打印缓冲区并换行 //网口小票打印机IP,连接端口 const PRINTER_IP="192.168.1.150"... string printerName = "Your Printer Name"; // 创建打印对象 PrintDocument pd = new PrintDocument(); pd.PrinterSettings.PrinterName = printerName; // 设置打印事件 pd.PrintPage += (sender, e) => // 设置打印区域 int x = 0, y = 0; int width = 500, height = 600; // 画边框 e.Graphics.DrawRectangle(Pens.Black, x, y, width, height); // 打印条码 string barcodeData = "1234567890"; Code128BarcodeDraw barcodeDraw = BarcodeDrawFactory.Code128WithChecksum; Image barcodeImage = barcodeDraw.Draw(barcodeData, 60); // 计算条码位置 int barcodeX = x + (width - barcodeImage.Width) / 2; int barcodeY = y + (height - barcodeImage.Height) / 2 - 50; // 绘制条码 e.Graphics.DrawImage(barcodeImage, barcodeX, barcodeY); // 打印文字 Font font = new Font("Arial", 12); string text = "Label Text"; SizeF textSize = e.Graphics.MeasureString(text, font); int textX = x + (width - (int)textSize.Width) / 2; int textY = y + height - (int)textSize.Height - 10; e.Graphics.DrawString(text, font, Brushes.Black, textX, textY); // 开始打印 pd.Print(); public static class BarcodeDrawFactory private static Lazy<BarcodeDraw> lazy = new Lazy<BarcodeDraw>(() => BarcodeDrawFactory.SVGDrawer); public static BarcodeDraw Default get { return lazy.Value; } public static BarcodeDraw Code128WithChecksum get { return new BarcodeDrawCode128Checksum(); } public static BarcodeDraw SVGDrawer get { return new BarcodeDrawSVG(); } 这段代码使用了一个名为 `BarcodeDraw` 的库,它可以帮助我们创建条码。在这个例子中,我们创建了一个 CODE128 条码,并将其放置在标签的中央。同时,我们还打印了一些文本,以及一个边框。 请注意将 `Your Printer Name` 替换为您的打印机名称。另外,您需要在项目中导入 `BarcodeLib` 库。您可以通过 NuGet 安装它。