条码印出来扫不动,原因几乎从不是「生成工具不好」,而是选错了制式、把静空区压没了、或者为了配色把明度对比做没了。这几件事在设计稿上都看不出问题,要到打样甚至铺货之后才暴露,返工成本很高。
这篇按「选制式、算校验、定纠错、定尺寸、做核对」的顺序把决策点过一遍,每一步都给出可执行的判断标准。
一、一维还是二维:先看要放什么内容
一维条码只能编码一串短字符,靠条与空的宽度组合表达,信息密度低,但扫码枪读得快、对倾斜宽容、印刷成本低。二维码在平面两个方向上编码,能放几百到几千个字符,还自带纠错。
按用途选,条码生成器里这几个是真正会用到的:
- EAN-13:零售商品条码,13 位纯数字,最后一位是校验位。它的前缀需要向 GS1 申请,自己随手编的 13 位数字虽然能生成出图,但进不了任何零售结算系统,只是一串「能扫出来的数字」。
- EAN-8:EAN-13 的短版,8 位,用在口香糖、化妆品小样这类实在印不下 13 位的小包装上。UPC-A 是 12 位的北美体系,UPC-E 是它的压缩版。
- CODE128:内部编号的首选。可编字母、数字、常见符号,长度可变,密度比 CODE39 高得多。资产标签、仓位号、批次号、物流面单上的运单号基本都是它。子集里 CODE128C 专门做纯数字的两位一压,同样位数的数字比 CODE128B 短近一半。GS1-128 是在 CODE128 基础上用应用标识符组织字段,比如
(01)后跟商品代码、(3103)后跟净重。 - ITF-14:外箱码。它的条特别粗、容错高,专为直接印在瓦楞纸箱这种粗糙且会变形的表面设计,还常配一个粗黑边框来保护条空边界。
- CODE39:老设备兼容性最好,但密度低、同样内容比 CODE128 长很多,只在对接旧系统时才选。
- Codabar:血库、图书馆、快递单的历史遗留体系。
- Pharmacode:药品包装专用,只编数字,靠条的宽窄区分,允许在高速印刷线上做在线检测。
- Data Matrix:二维码里的极小面积方案,几毫米见方也能读,用在电子元件、手术器械的激光打标上。
- PDF417:堆叠式,容量大,证件、驾照、登机牌里放持证人信息的就是它。
- Aztec Code:不需要静空区,交通票务用得多。
工具里的选项是条码长度(像素)、条码高度(像素)、是否显示下方文本、条码间距。选到 QR Code、Data Matrix、PDF417、Aztec 这类二维制式时高度会被锁定,因为它们的宽高比由编码结构决定,不能随意拉伸。
二、EAN-13 的校验位是怎么算出来的
很多人输入 13 位数字却生成失败,或者印出来扫码枪完全不响应,原因是校验位不对。这个算法很短,手算一遍就不会再错:
check = (10 - sum % 10) % 10
其中 sum 是前 12 位的加权和:从左边第一位起,奇数位权重 1、偶数位权重 3,相乘后累加。
以工具里的默认示例 590123412345 为例,加权和是 5+27+0+3+2+9+4+3+2+9+4+15,等于 83。83 除以 10 余 3,10 - 3 等于 7,所以校验位是 7,完整条码就是 5901234123457。
这个校验位的作用是让扫描设备能自己发现读错。所以校验位不对时,多数扫码枪的行为是完全不响应,而不是读出一个错的数字,这在排查时反而是好事:不响应说明数据不合法,读出错值才是灾难。ISBN 用的也是 EAN-13 结构,前缀是 978 或 979,所以书号的最后一位同样是按这个公式算出来的。
一维条码还有两个位数硬约束容易踩:EAN-13 必须正好 13 位(或给 12 位由工具补校验位),EAN-8 必须 8 位,UPC-A 必须 12 位,位数不对就不是「凑合能用」而是直接生成失败;ITF 类要求偶数位数,奇数位时需要前置补零。CODE128 没有位数限制,但内容越长条码越宽,标签宽度装不下时要么换 CODE128C、要么改用二维码。
三、纠错等级不是越高越好
二维码的纠错基于里德-所罗门码,四个等级对应大致可恢复的码字比例:
- **L 约 7%**:容错最弱。适合屏幕显示、电子渠道传递、PDF 里的链接,这些场景码面不会脏也不会破。
- **M 约 15%**:默认值,也是绝大多数纸质场景的正确选择,宣传单、名片、包装说明。
- **Q 约 25%**:会被磨损、被手指反复触摸、贴在户外或设备外壳上的码。
- **H 约 30%**:中间要压 Logo,或者印在会脏、会刮、可能被局部遮挡的表面。
之所以不建议一律选 H,是因为纠错数据也要占容量。同一段内容,纠错等级越高需要的码字越多,符号版本就越大,码点数量增加。在印刷尺寸固定的情况下,码点数量增加意味着单个码点的物理尺寸变小,而扫描设备能分辨的最小码点是有下限的。结果就是纠错等级从 M 提到 H 之后,理论容错变强了,实际识别率反而下降。
正确的搭配逻辑是:先看码面会不会受损,再决定等级;如果因为提高等级导致码点变密,就同步把印刷尺寸放大,不能只调等级不调尺寸。
有一个例外必须提到高等级:中间压 Logo。Logo 是人为制造的一块永久损坏区,遮挡面积必须落在纠错能力覆盖范围内。二维码生成工具里 Logo 占比调大而纠错等级不是「高 (30%)」时,页面会直接给出提示,建议把等级调到 H;选了「低 (7%)」再加 Logo 时也会提示至少改到「中 (15%)」。这个提示不是形式主义,Logo 盖住定位图案或过多数据区时,很多手机会直接扫不出来。工具还支持给 Logo 加圆角,圆角只影响 Logo 自身外形,不改变遮挡面积的量级。
四、尺寸与静空区:印小了、贴满了都扫不动
静空区是码周围必须留出的纯背景空白,它的作用是让扫描算法找到码的边界。国际标准要求二维码四周至少留 4 个码点的空白,注意单位是码点而不是像素——同一个 4 码点的空白,在稀疏的码上是很窄一圈,在密集的码上就宽得多。二维码生成工具的静默区滑块默认就是 4,调小虽然版面更紧凑,但贴在深色背景上极易失败。
一维条码的静空区在左右两侧,经验值是各留至少 10 倍窄条宽度的空白,EAN-13 的右侧静空区尤其重要。把条码贴到包装边缘、压到底纹图案上、或者紧挨着一段文字,都会让扫描器找不到起始与终止符。设计稿上「留白太多不好看」于是把静空区吃掉,是印刷条码失败的头号原因。
尺寸方面有几条可以直接照用的下限:
- 单个码点不小于 0.33 mm。这是常规扫描设备的分辨极限,倒推回去就能得到最小印刷边长:码点数乘 0.33 mm,再加上四周静空区。
- 常规海报、宣传页上放 URL 的二维码印 2.5 到 3 cm 见方比较稳妥,桌贴点单码建议 3 到 4 cm,因为顾客举手机的距离更远、角度更歪。
- 一维条码的高度不要为了排版压扁。高度给扫描线提供了容错空间,压得太扁会导致必须精准对齐才能读到。EAN-13 的标准尺寸有明确规格,缩放建议控制在标准的 80% 到 200% 之间。
还有一条能直接改善识别率的做法与工具无关:让内容更短。二维码的码点密度由内容长度决定,URL 里的 utm 参数、跳转中间页、超长路径都会让码变密。同样的落地页,用短链或去掉跟踪参数,码点可能从密密麻麻变成清晰可数。另外中文按 UTF-8 编码,每个汉字占 3 个字节,而纯大写字母加数字能走更省空间的编码模式,所以能用英文数字表达就别放中文。
五、彩色、反色与批量核对
扫描的本质是区分「深」和「浅」,所以配色只有一条铁律:浅底深码,并且明度差要足够大。常见的失败原因是:
- 反色(深底浅码):相当多的扫码器和收银枪不支持这种极性,直接读不出。批量二维码生成的说明里明确要求保持浅底深码方向,就是这个原因。
- 明度对比不足:浅灰码点配白底、深蓝码点配深灰底,人眼觉得「有区别」,设备的阈值判断却会失败。挑颜色时把画面转成灰度看一眼,如果灰度下已经分不清,扫码器也分不清。
- 红色系码点遇上红光扫码枪:一维扫码枪多用 650 nm 左右的红光,红色物体对红光的反射率接近白色,红色条在它眼里等于消失。条码请用单色黑,别用红、橙、亮黄。
- 渐变与图案底:渐变会让某些区域对比不足,底纹会被误判成码点。二维码的底必须是纯色。
- 码点圆角过大:圆角能让码好看一些,但过大会让相邻码点之间该连的地方断开、该断的地方粘连,识别率明显下降。批量生成时圆角建议保守设置,并且一定要实际打印后试扫。
- 印刷叠印导致边缘发虚:四色叠印套印不准时条空边界会毛,条码建议指定单色黑印刷。
批量场景的核对方法比生成本身更值得花心思。批量二维码生成每行一条内容,单次最多 500 条,可以用竖线按「内容 | 文件名」指定导出名,重名会自动追加序号,也可以从 txt 或 csv 导入(csv 取第一列为内容、第二列为文件名)。参数包括 200 到 800 像素的尺寸、L/M/Q/H 纠错、静默区码点数、码点圆角、前景色与背景色、PNG 或 JPEG 导出。有几个功能是专为核对准备的:
- 图片下方的文字标签可以设为文件名或二维码内容。打印出来之后人眼就能核对这张纸上的码对应哪个座位、哪台设备,不用靠扫。这是最省事的一条,批量打印务必打开。
- 打包 ZIP 里附带的对照表 CSV 记录了文件名与内容的映射,带 BOM,Excel 双击就能正常显示中文,用来做逐行核对。对照表也可以单独导出。
- 生成前先点「去重」,剔除完全重复的行。重复内容会导致文件名自动追加序号,最后核对时很难分清哪个是多余的。
命名规则也建议提前定好:用定长编号,比如 A-001 而不是 A1,这样在文件管理器、Excel、打印软件里排序都是正确顺序,不会出现 A10 排在 A2 前面。抽检策略上,打印后至少扫首张、末张,以及每 20 张抽一张,重点确认内容对应关系而不只是「能扫出来」。条数很多时浏览器内存占用较高,建议每批不超过 300 条分批处理,生成过程中每 20 条会主动让出主线程,所以页面不会卡死,但也别在同一个标签页里连续跑几千条。
常见问题
我输入的 13 位数字为什么生成不了 EAN-13?
先检查是不是有非数字字符或空格,EAN-13 只接受纯数字;再检查校验位。最后一位必须等于前 12 位按「奇数位权 1、偶数位权 3」加权求和后,用 (10 - 和 % 10) % 10 算出的值。位数够但校验位不对时,规范的生成器会拒绝出图,这是在帮你,因为强行印出来扫码枪也读不了。如果你只是要内部编号、不进零售系统,直接改用 CODE128,它不做这类校验也不限制位数。
二维码加了 Logo 之后有的手机扫不出来,怎么救? 按三步调。第一步把纠错等级提到「高 (30%)」,这是容错预算最直接的来源。第二步把 Logo 占比调小,Logo 只应盖住中间的数据区,绝对不能压到四个角的定位图案和边缘的对齐图案。第三步把整体尺寸放大,或者缩短二维码承载的内容让码点变稀。三步都做完仍然有个别机型失败,就说明遮挡面积超出了纠错能力,只能取消 Logo 或改成把 Logo 放在码的下方。
二维码印在深色包装上,能不能做成白色码点? 不建议做反色。可靠的做法是在深色包装上放一块白色或浅色的底块,把二维码印在这块底上,并保证底块比码本身四周各多出至少 4 个码点的空白。这样既保留了深色包装的整体设计,又让码处于标准的浅底深码环境里。如果版面实在不允许加底块,就把码移到包装的浅色区域,不要冒险用反色。
批量生成几百张之后,怎么快速确认没有错位? 靠两样东西交叉验证。一是打开「图片下方文字」显示内容或文件名,打印后人眼直接看对应关系;二是用 ZIP 包里的对照表 CSV,在 Excel 里按文件名排序后逐行核对内容。真正容易出错的环节不是生成,而是把图片交给印刷时的排序和拼版,所以定长编号命名加上图下文字这两条一起做,能挡掉绝大多数错位事故。