picqer/php-barcode-generator是当前最稳的PHP Code128条形码生成方案,专为Code128设计,自动处理字符集切换、校验位与起始终止符,支持PNG/SVG纯PHP输出,无需GD或Imagick。

用 barcodegen 生成 Code128 条形码最稳
PHP 原生不带条形码生成能力,得靠第三方库。目前维护活跃、支持 Code128、无依赖、输出干净 PNG/SVG 的首选是 tecnickcom/tcpdf 里的 Barcode 类,但更轻量直接的是 picqer/php-barcode-generator —— 它专干这事,API 清晰,没 PDF 那套包袱。
常见错误是直接 `composer require tecnickcom/tcpdf` 然后翻半天文档找 Barcode::getBarcodePNG(),结果发现它默认只支持 EAN/UPC,Code128 要手动传 'c128' 类型且编码逻辑藏得深;或者用老库 dwyl/php-barcode,结果 PHP 8.1+ 报 Deprecated: preg_replace(): Passing null to parameter #3 ($subject)。
-
composer require picqer/php-barcode-generator是当前最省心的选择 - 它内置
GeneratorCode128类,专为 Code128 设计,自动处理字符集切换(A/B/C 模式)、校验位、起始终止符 - 输出支持 PNG、SVG、JPEG,不依赖 GD 或 Imagick(PNG 用纯 PHP 实现,SVG 是字符串)
- 注意:不要用它的
GeneratorIMagick,除非你真装了 ImageMagick;默认GeneratorPNG就够用
Code128 字符集选错会导致扫码失败
Code128 有 A/B/C 三个子集,不是随便传字符串就能扫出来。库会自动选最优子集,但如果你手动指定或传了非法字符(比如中文、控制符),GeneratorCode128 会静默 fallback 到子集 B,而某些老旧扫码枪只认 C 模式下的纯数字串,扫出来就是乱码或报错。
- 纯数字(≤20 位)优先走子集 C,压缩率高、条码短;混有字母/符号就切到 B;含控制字符(如
\x00)才进 A - 避免手动调
setUseChecksum(false)—— Code128 校验位是强制的,关掉会导致生成器抛InvalidArgumentException - 传入字符串里别带空格、换行、BOM;用
trim($data)和mb_convert_encoding($data, 'ISO-8859-1', 'UTF-8')预处理,防止 UTF-8 多字节字符崩掉编码逻辑
输出 PNG 时图像模糊或尺寸不准
默认生成的 PNG 是 2px 宽窄单元,看着发虚,尤其在高清屏或打印时。这不是 bug,是库把「模块宽度」和「实际像素」分开了——$generator->setThickness(30) 控制的是条高,不是条宽;真正影响清晰度的是 setBarWidth(2) 和缩放逻辑。
立即学习“PHP免费学习笔记(深入)”;
-
setBarWidth(1)最小单位,但太细易丢线;生产环境建议设2或3,再用 CSS 或imagecopyresampled()放大,别直接设10—— 会糊成一块 - 条码总宽 = 字符数 × 每字符平均模块数 ×
barWidth;Code128 平均约 10.5 模块/字符,所以 12 位数字大概占 126px 宽(12 × 10.5 × 1),预留左右空白至少各 10 模块 - 用
getBarcodePNGData()拿二进制数据,别用output()直出——后者会触发 header,容易和已有输出冲突
在 Web 页面里嵌入要防缓存和 MIME 类型错
直接 echo $generator->getBarcodePNGData(...) 输出二进制到 HTML,浏览器可能当文本渲染,显示一堆乱码;或者被 Nginx/Apache 缓存住,改数据也不刷新。
- 必须加
header('Content-Type: image/png');,且确保前面没任何输出(包括 BOM、空格、echo) - 动态生成时加缓存头:
header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0');,否则用户改个 ID,页面还是旧条码 - 更稳妥的做法是生成文件存本地(如
/barcode/12345.png),HTML 里用<img src="/barcode/12345.png?ts='.time().'" alt="php怎么生成条形码_php如何用Barcode生成Code128条形码" >,既避开输出限制,又方便 CDN 缓存静态资源
Code128 的坑不在生成,而在字符合法性判断和输出上下文——传进去的字符串是不是真能被编码,输出流有没有被截断或误解析,这两点漏一个,扫码枪就摆头。



















