Skip to content

条形码生成器 — 免费在线生成条码

在线免费生成 EAN-13、UPC-A、Code 128、Code 39 等 15 种条形码,导出无损 SVG 或高清 PNG。输入 12 位自动补校验位;末位写错会直接告诉你应该是几,并一键改好。支持批量生成打包下载。

无追踪 浏览器中运行 免费
条形码在你的浏览器里生成,任何内容都不上传。

外观与打印尺寸

批量生成(一行一个值)

校验不通过的行会连同原因一起写进 ZIP 里的 skipped.txt。

能在零售渠道流通的条形码,其号码须由 GS1 成员组织(中国大陆为中国物品编码中心)分配。本工具只画图形,不分配号码;自用标签无需申请。

页面上每一个数字都先算一遍、再核两遍。校验位既对着真实已出版的条码验证过——一本印刷教材的 ISBN-13、一罐 330 毫升可口可乐,以及 UPC-A 和 EAN-8 的参考示例——也独立对着编码器自己的计算结果比对过。Code 128 的模块数来自一个逐样本与渲染结果对账过的公式,奇数位的切换符代价正是这样被发现的。「GS1 前缀不代表产地」这一条是 GS1 官方自己的公开立场。 — Go Tools 工程团队 · 2026年9月24日

由构建 Go Tools 编码类工具的开发者撰写与复核。页面上的模块数、校验位算式与编码器行为,都是对着真实运行的引擎量出来的,而不是抄自别人的二手总结。

速查

这里生成的条形码能直接拿去卖货吗?

号码是你申请来的才行。 本页画出的图形是正确的、能扫出来,但里面那串**号码**必须先由 GS1 成员组织(中国大陆是中国物品编码中心)分配给你,零售系统才会认。随便编一个以已注册前缀开头的号,有可能和别人已分到的号撞车。货架、货位、资产、工单这类自用标签不需要任何分配,直接用 Code 128。

EAN-13 要输 12 位还是 13 位?

都可以。 第 13 位是由前 12 位算出来的校验位,所以两种都能输。输 12 位会替你补上并明确告诉你补的是几;输 13 位会被验证,对不上时直接指出应该是几。

690 开头是不是就代表中国制造?

不是。 690–699 以及 680–681 确实是 GS1 China 管理的前缀段,489 是香港、471 是台湾、958 是澳门。但 GS1 自己明确说明:成员企业可以在世界任何地方生产,也可以向自己选择的任一成员组织申请前缀,所以前缀标识的是**谁发的号**,不是货从哪来。

为什么屏幕上能扫,打印出来就扫不出来?

多半是静空区,或者图被缩放过。 按发生频率排:静空区被标签边缘或边框切掉了;图片在排版软件里被缩放过,一个模块不再是整数个打印 dot;模块宽度对该扫描器和该打印分辨率来说太小。三件事都在打印之前就定了,而且本页都会显示出来。

一维条形码里到底装了什么

一维条形码是一串字符的游程编码:每个字符对应一组固定的条与空,宽度以模块为单位——最窄那根条的宽度,记作 X。Code 128 每个符号占 11 个模块,所以九个字符的串宽 134 个模块,因为总数是 11 × (字符数 + 2) + 13:一个起始符、一个校验符,加上 13 个模块的终止符。

真正让自制条码失败的两样东西,看上去都像空白。一是静空区,也就是两侧的空白边距;扫描器靠它找到条码的边界,logo 或表格线伸进去,整个码就读不出来了。二是零售码制里的校验位,由前面几位算出来的一位数字,作用是让扫描器在读错时直接拒绝,而不是报出一个错误的商品号。

Code 128   text = "HELLO-123"

  symbols = 1 (start) + 9 (data) + 1 (check)   = 11
  modules = 11 × 11 + 13 (stop)                = 134
  X = 3px                                      = 402 px
  + quiet zone 10X + 10X                       = 462 px

这个生成器做了什么

把校验位的算式摆出来

每一位的数字、权重、乘积,加权和,以及取模那一步。贴进 13 位而末位不对时,页面直接指出它应该是几,并给一个一键改好的按钮——而不是回你一句「无效」。

静空区画在预览图上

不只是表格里的一个数字。规范要求的空白边距会在预览上用浅色块标出来,而且规范不对称的地方我们也不对称——EAN-13 要求左 11X、右 7X,不是两边都 10X。

模块宽度按你的打印机分辨率折算

203dpi 下一个 dot 是 0.125 mm,300dpi 是 0.085 mm,600dpi 是 0.042 mm。面板会把你选的模块宽度换算成该分辨率下的毫米数,打印出来多大是个决定,不是个意外。

Code 128 的宽度和它选了哪个子集

纯数字在子集 C 里两位压成一个符号,所以 8 位数字只要 79 个模块,逐字符编码则要 123 个——窄 35.8%。读数会显示实际走的子集和省下了多少。

15 种码制,全部本地生成

EAN-13、EAN-8、UPC-A、UPC-E、ITF-14、交叉二五码、Code 128(含 A/B/C 子集)、Code 39、Code 93、Codabar、MSI、Pharmacode。全部由页面里的 JavaScript 画出来,任何内容都不上传。

批量打包,失败的行有交代

一行一个值,按 SVG 或 PNG 打成 ZIP。校验不通过的行不会被悄悄丢掉——它们连同原因一起写进 skipped.txt,所以 100 个值只出 97 个文件时,你知道是哪三个、为什么。

生成同样条码的其他办法

bwip-js

npx bwip-js --bcid=ean13 --text=9780306406157 --scale=3 out.png

一套源自 BWIPP 的引擎,码制覆盖面目前最广——超过一百种,含二维码和邮政码——同时提供 CLI 和库两种形态。条码由构建流程生成、或需要本页未覆盖的码制时,值得用它。注意两点:不传 paddingleft/paddingright 就一个静空区都没有;height 的单位是毫米,不是像素。

python-barcode

python -m barcode ean13 9780306406157 -o out.svg

在 Python 流水线里很顺手,默认输出 SVG。覆盖 EAN/UPC 家族、Code 39 和 Code 128;更冷门的码制以及 GS1 应用标识符不在范围内。

ZXing / zxing-cpp

Java 与 C++ 库,生成与识别都有

同一个代码库既要生成又要识别时的常规选择。它出名的是识别那一半;就生成而言,码制覆盖面比 BWIPP 窄。

Excel / Word 里的条码字体

装一个 Code 39 或 Code 128 的 TrueType 字体,直接打字

因为不需要任何工具而流行,也是扫不出来的标签的常见来源。Code 39 字体要你自己加 * 定界符,Code 128 字体要你自己算校验字符,而字体只会按文档里的字号渲染,模块宽度完全不受控。

中国物品编码中心(GS1 China)

申请厂商识别代码

它不是生成器,但如果条码要在零售渠道里流通,这一步没法跳过:号码由 GS1 成员组织分配,画条形码反而是容易的部分。仓库和资产这类自用标签则完全不需要申请。

实算示例

EAN-13:输入 12 位,校验位算出来

978030640615
9780306406157

digit    9  7  8  0  3  0  6  4  0  6  1  5
weight  ×1 ×3 ×1 ×3 ×1 ×3 ×1 ×3 ×1 ×3 ×1 ×3
product  9 21  8  0  3  0  6 12  0 18  1 15

sum = 93,  93 mod 10 = 3,  check = (10 - 3) mod 10 = 7

权重是 3 和 1 交替,从 payload 最右一位开始数。教科书通常按「奇数位、偶数位」讲,那样每换一种长度就要换一个公式;从右往左数则一条规则通吃 EAN-13 的 12 位、UPC-A 的 11 位和 EAN-8 的 7 位。这个号码是一本已出版教材的 ISBN-13,答案可以拿实体书核对。

校验位写错时,直接点名是哪一位

9780306406158
The last digit should be 7, not 8.
[ Use 9780306406157 ]

底层编码器会直接拒绝这个号码——它抛出 ean13badCheckDigit。这没错,但没用:从包装上抄来的号码,「打错一位」远比「结构性错误」常见,而人真正需要的只有「那一位应该是几」。所以校验发生在调用编码器之前。

Code 128 子集 C 把数字的宽度砍一半

12345678
subset C:  4 symbols  ->  79 modules
subset B:  8 symbols  -> 123 modules

saving: 35.8%

子集 C 每个符号装两位数字。模块数遵循 11 × 符号数 + 35,所以符号数减半,宽度也几乎减半。这就是为什么自用编码值得保持纯数字——只要加进一个字母,整串就会被打回一个字符一个符号。

位数是奇数要多花一个切换符

12345
12345    (5 digits)  -> 79 modules
123456   (6 digits)  -> 68 modules
12345678 (8 digits)  -> 79 modules

子集 C 凑不成对的那一位没法压缩,于是奇数长度的数字串要多付一个子集切换符。结论相当反直觉,而且在设计编码规则之前知道很值:6 位比 5 位更窄,而 5 位和 8 位占的宽度完全一样。自用数字编码保持偶数位,等于白捡一截宽度。

模块宽度、dot 与毫米

X = 3 modules px, printer = 203 dpi
1 dot @ 203 dpi = 0.125 mm
X = 3 dot        = 0.375 mm
EAN-13 symbol    = 95 modules
+ quiet 11X + 7X = 113 X  = 42.4 mm

热敏打印机只能落整颗 dot。按 1× 导出、再按同一分辨率打印,每个模块都正好是整数个 dot。事后在排版软件里缩放则不然:模块变成小数个 dot,打印机对每根条各自取整,条空比逐渐失真,直到扫描器开始读不出来。

怎么生成条形码

  1. 1

    选码制

    零售商品用 EAN-13(小包装用 EAN-8,北美用 UPC-A),外箱用 ITF-14。仓库货位、固定资产、工单这类自用标签一律选 Code 128——不用申请号码,而且纯数字会被两位压成一个符号。

  2. 2

    输入数据

    EAN-13 收 12 或 13 位,UPC-A 收 11 或 12 位,EAN-8 收 7 或 8 位;输入短的那种时校验位会替你补上。Code 128 与 Code 39 收变长文本。

  3. 3

    先定打印尺寸,别事后缩放

    选好模块宽度和你真正要用的打印机分辨率,面板会算出一个模块在该分辨率下是多少毫米。在排版软件里拖拽缩放图片才是扫不出来的主因,尺寸请在这里定。

  4. 4

    导出

    SVG 放大到任何尺寸都不糊,标签软件也更认它;PNG 的 2× / 4× 留给不收矢量的地方。批量面板一行一个值,打包成 ZIP,被拒绝的行会连同原因一起附在包里。

这些错误我们会解释,而不是只说一句无效

只打错一位,却被告知「无效条形码」

13 位 EAN-13 里末位与前 12 位对不上,是现实中最常见的输入。被告知「那一位应该是几」只需要看一眼;被告知「无效」则要再去找一个校验位计算器。

✗ 错误
9780306406158  ->  无效的 EAN-13
✓ 正确
9780306406158  ->  末位应该是 7,不是 8
                   [ 用 9780306406157 ]

工具悄悄补了一位校验位却不告诉你

输入 12 位输出 13 位是你要的行为,但前提是你被告知了——否则印出来的号码和表格里的号码不一致,而没人知道该以哪个为准。

✗ 错误
入:978030640615
出:条形码(13 位,只字未提)
✓ 正确
入:978030640615
出:条形码 +「已自动补校验位 7」

把中文放进 Code 128

编码器不会拦你。出来的东西能扫,但解码结果不是你输入的字,而且条码明显比字数该有的宽度宽得多。

✗ 错误
Code 128 <- 订单(2 个字,134 模块——和 9 个 ASCII 字符一样宽)
✓ 正确
Code 128 <- ORDER-2026-0042(ASCII,宽度与内容相称)

静空区被标签边框吃掉

生成器默认根本不留边距。贴在窄标签的边缘上、或者被装进一个方框里,条码就失去了扫描器用来定位的那段空白,于是干脆读不出来。

✗ 错误
|▐▌▐▐▌ ▐▌▐ ▌▐▐▌|   <- 标签边缘紧贴着条
✓ 正确
|    ▐▌▐▐▌ ▐▌▐ ▌▐▐▌    |   <- 左 11X、右 7X 保持空白

为了排版好看把导出的图缩放一下

缩到一个「整齐」的物理尺寸,会让一个模块变成小数个打印 dot。打印机对每根条各自取整,条空比逐渐失真,条码是慢慢坏掉的——这比直接失败更糟,因为它能通过办公桌上的测试,却在现场出问题。

✗ 错误
按 1× 导出,再在排版软件里缩到 38 mm
✓ 正确
把模块宽度设成 300dpi 下正好 38 mm,按 1× 导出,100% 置入

什么场景会用到

印 5000 张标签之前先验一下号
手上是从表格里拷来的 13 位数字,没法判断最后一位对不对。贴进来:加权和完整摊开,末位不对会被直接点名,而不是笼统地归进「无效」。
仓库货位、资产、工单标签
货位号、固定资产标签、工单号根本不需要申请任何号码。Code 128 收字母和数字,而且纯数字会两位压一个符号,所以数字型货位码能做得很紧凑。
发货外箱标签
ITF-14 编的是由商品 GTIN 派生出来的 14 位储运单元代码。本页收 13 位或 14 位,校验位规则与 EAN-13 完全相同。
照着包装上的条码重新做一个
把条码下面印的数字读出来输入进去即可。因为校验位会被验证,读错一位会在这里被发现,而不是到收银台才发现。
生成一批连号条码
把表格里的一整列粘进批量面板,整批下成 SVG。矢量文件可以直接丢进标签软件,不需要重新采样。

各码制是怎么编码的

EAN-13 —— 13 位,而且静空区左右不等
12 位正文加 1 位校验位。静空区是左 11X、右 7X;两边一样宽的做法要么浪费地方,要么把左边切掉。下方那排人眼可读数字是规范布局的一部分,首位数字落在条码左侧之外——所以某些生成器把这行文字居中,实际上是悄悄吃掉了左侧静空区。
UPC-A 与 UPC-E —— 同一个号,两种长度
UPC-A 是 11 位加 1 位校验位,校验规则与 EAN-13 相同;一个 UPC-A 号码就是前面补一个 0 的 EAN-13。UPC-E 是给小包装用的 6 位压缩形式,扫描器会把它还原成完整号码,而不是另一个号。
Code 128 —— 三个子集,自动替你选
子集 A 覆盖控制字符和大写字母,B 覆盖含小写的可打印 ASCII,C 每个符号装两位数字。自动模式在三者间切换以取得最短编码,所以读数会显示它最终落在哪个子集:偶数位纯数字是 C,奇数位被迫切换是 CB,含非数字字符是 B。
Code 128 装不下中文、日文、韩文
它的字符集止于 Latin-1。把中文喂给编码器并不会报错——它会悄悄产出一个更宽的条码,而内容已经不是你输入的东西了(一个汉字占掉五个 ASCII 字符的符号宽度)。正因为这种失败是静默的,本页在生成之前就把这类输入拦下来,而不是画出一个印完才发现是错的条码。
Code 39 与 Code 93 —— 自校验,不用申请
Code 39 收数字、大写字母和七个符号,不需要校验字符,几乎任何年代的扫描器都认得;代价是宽,每个字符约 13 个模块。Code 93 更紧凑,但强制带两个校验字符。两者在工业和军工标识里仍然常见。
ITF-14 与交叉二五码 —— 数字成对编码
交叉二五码把数字两两成对编码——一位在条里、下一位在空里——所以只收偶数个数字;奇数长度会被补一个前导 0,而那会改变被编码的号码。ITF-14 是固定 14 位的外箱形式,通常印一圈粗边框(承印框),作用是防止边缘破损后被读成一个更短的码。

让条形码真的扫得出来

打印尺寸在这里定,之后不要再缩放图片
在外观面板里设好模块宽度和分辨率,按 1× 导出。在 Word、Illustrator 或标签软件里拖拽图片边角,会把模块重采样成小数个打印 dot;条宽不均是「屏幕上能扫、纸上扫不出」的头号成因。
静空区必须是真的空白
预览上那两条浅色带是符号的一部分。里面不能有任何东西——边框、logo、相邻文字,以及标签本身的边缘都不行。如果标签窄到放不下,应该把模块宽度调小,而不是把静空区裁掉。
要打印就优先用 SVG
矢量输出没有自己的分辨率,打印驱动会按设备自身的分辨率一次性栅格化。PNG 已经把像素网格定死了,如果这个网格和打印机对不上,条就会被重新采样。
自用数字编码尽量做成偶数位
Code 128 把数字两位压一个符号,奇数位要多付一个切换符,所以 5 位编码比 6 位更宽。如果编码规则还在设计阶段,这截宽度是白给的。
用真正要用的那台扫描枪测一次
用真打印机、真尺寸、真耗材印一张,再用真设备扫。手机扫码 App 比固定焦距的激光扫描枪宽容得多,而不同热敏纸与碳带组合的墨迹扩散程度差别很大。

常见问题

这里生成的条形码能贴到商品上进商超吗?
图形本身是有效的、能扫出来,但零售条码能不能用,取决于里面那串号码是不是分配给你的。号码由 GS1 成员组织发放——中国大陆是中国物品编码中心,其他市场各有对应机构。本工具只画条形码,不分配号码,任何在线生成器都不可能分配号码。如果标签只在自家仓库、货架或固定资产上用,那根本不需要申请,选 Code 128 就对了。
EAN-13 的校验位是怎么算的?
把 12 位数字从最右边那位开始,交替乘 3 和 1,再把乘积全部相加。校验位就是让这个和凑到下一个 10 的倍数所需要的那个数,写成公式是 (10 - 加权和 mod 10) mod 10。以 978030640615 为例,加权和是 93,所以校验位是 7。本页会把整个算式摊在输入框下面。同一条规则也适用于 UPC-A 的 11 位、EAN-8 的 7 位和 ITF-14 的 13 位——因为权重从右往左数,长度就无关紧要了。
690、489 这样的前缀说明了什么?
它标识的是发放这个号码的 GS1 成员组织。690–699 与 680–681 由 GS1 China 管理,489 是香港,471 是台湾,958 是澳门,978–979 则留给 ISBN。它不能说明产地:GS1 自己的立场是成员企业可以在任何地方生产,也可以向自己选的任一成员组织申请前缀。「690 开头就是中国制造」这个流传很广的说法,正因如此被多家事实核查机构判为错误。
我该选哪个码制?
如果商品要在零售渠道里卖,选择其实是被规定好的:EAN-13,包装太小就用 EAN-8,北美用 UPC-A,发货外箱上用 ITF-14。自用场景一律选 Code 128——收字母和数字、不用申请,而且纯数字会被压成两位一个符号。只有在必须照顾很老的扫描枪时才考虑 Code 39,因为同样内容它要宽出约 40%。
为什么我 5 位数字的 Code 128 比 6 位的还宽?
因为子集 C 把两位数字装进一个符号,而落单的那一位凑不成对,于是奇数长度的数字串要多付一个子集切换符。5 位出来是 79 个模块,6 位是 68 个——而 5 位和 8 位正好一样宽。如果你的编码规则还在设计阶段,把位数做成偶数不花任何代价,却能换来更窄的标签。
静空区是什么,要留多宽?
它是条码两侧的空白边距,以模块(X)为单位度量。扫描器靠这段空白判断条码从哪里开始,所以它是符号的一部分,不是装饰。EAN-13 要求左 11X、右 7X——左右不对称,凡是两边用同一个边距的生成器都会在这里出错。UPC-A 是两侧各 9X,EAN-8 是 7X,Code 128、Code 39 和 ITF-14 至少 10X。本页会把要求的边距在预览上标成浅色块,标签够不够宽一眼就能看出来。
条形码里能放中文吗?
常见的一维码都放不了。Code 128 止于 Latin-1,Code 39 的字符集更窄。更麻烦的是大多数编码器不会拒绝中文输入——它们会产出一个能扫、但解码结果和你输入的内容不一致的条码,而且宽度明显超出字数应有的样子。本页会直接拦下这类输入。如果确实需要用可扫描的码承载中文,请用 二维码生成器——QR 有专门的模式,没有这个限制。
该下 SVG 还是 PNG?
要打印就下 SVG。它没有自己的分辨率,打印机会按自身的原生分辨率一次性栅格化,每个模块都落在整颗 dot 上。PNG 已经把像素网格定死了,如果那个网格和打印机对不上,条就会被重新采样,条空比随之失真。只有在对方不收矢量文件时才用 PNG,并且按 2× 或 4× 导出,留出余量。
怎么一次生成很多个条形码?
打开批量面板,一行贴一个值——从表格里直接复制一整列过来就行——选 SVG 或 PNG,就能拿到一个按值命名的 ZIP。校验不通过的行不会被悄悄跳过:它们连同原因一起收在 skipped.txt 里,所以 100 个值只出 97 个文件时,你知道是哪三个、因为什么。整个过程都在浏览器里完成,批量的上限取决于你的机器,而不是服务器配额。
该按多少分辨率打印?
按你打印机实际的分辨率——在这里选它的意义,是让页面能告诉你一个模块到底是多少毫米。203dpi 是常见的热敏分辨率,一个 dot 是 0.125 mm,所以三个 dot 的模块是 0.375 mm;300dpi 下一个 dot 是 0.085 mm,600dpi 是 0.042 mm。分辨率越高,能用的模块就越小,这在标签面积紧张时很关键;但它并不能让一个尺寸本身就不对的条码变得好扫。
这个页面能识别图片里的条形码吗?
不能,它只负责生成。从照片里识别印刷的一维条码是另一个问题,需要另一个工具。本站的二维码识别只处理 QR 码,不会解 EAN-13 或 Code 128。本页同样无法查询某个号码对应的是什么商品——那需要 GS1 的商品数据库。
内容会被上传吗?
不会。编码器是加载进页面的一个 JavaScript 模块,每一个条形码——包括整批生成和打包出的 ZIP——都在你自己的机器上完成。你输入的任何内容都不会被发送出去、不会写进 URL,也不会在关闭标签页后留存;只有外观设置(模块宽度、条高、分辨率)会保存在本地,省得你每次重设。