# 바코드

> Code128, EAN-13·8, UPC-A, Code39, ITF, ITF-14. 체크 숫자와 스캔 크기.

Source: https://82label.app/docs/barcodes/

바코드는 요소 하나입니다. 값만 적어도 됩니다: 좌표를 빼면 라벨 가운데에 너비 80% 로 들어갑니다.

```js
{ type: 'barcode', value: '{{sku}}' }                       // Code 128, 가운데
{ type: 'barcode', x: 3, y: 14, w: 44, h: 13, format: 'ean13', value: '{{ean}}', showText: true }
```

```js
Label82.barcodeSVG('880123456789', { format: 'ean13', height: 18 })
```

## 형식

| format | 값 | 쓰는 곳 |
| --- | --- | --- |
| `code128` | 숫자·영문·기호 아무 길이 | 기본값. 상품 코드(SKU), 주문번호, 택배 송장. 숫자만 길면 자동으로 촘촘한 C 세트. |
| `ean13` | 숫자 12자리(+체크 1) | 국내 유통 상품 바코드(880…). 12자리만 넣으면 체크 숫자를 계산해 붙입니다. 13자리면 체크 숫자를 검사합니다. |
| `ean8` | 숫자 7자리(+체크 1) | 작은 상품. |
| `upca` | 숫자 11자리(+체크 1) | 북미 상품 바코드. |
| `code39` | 대문자 영문·숫자·`- . 공백 $ / + %` | 오래된 사내 시스템, 자산 관리. |
| `itf14` | 숫자 13자리(+체크 1) | 물류 박스(GTIN-14). |
| `itf` | 짝수 자리 숫자 | Interleaved 2 of 5, 체크 숫자 없음. 한진·롯데 송장번호. |

## 잘못된 값

값이 형식에 맞지 않으면(EAN 자릿수가 틀림, Code39 에 소문자 등) 그 자리에 X 표시 상자를 그리고 인쇄 결과의 `errors` 에 남깁니다. 미리 검사하려면 `encodeBarcode` 를 부르세요.

```js
import { encodeBarcode, eanCheckDigit, BarcodeError } from '@82label/core';

eanCheckDigit('880123456789'); // 3 → 8801234567893
try {
  encodeBarcode('ean13', '88012345');
} catch (e) {
  if (e instanceof BarcodeError) console.log(e.message);
}

const r = await Label82.print(template, rows);
r.errors; // [{ element: 2, code: 'barcode_invalid', message: '…' }]
```

## 스캔이 잘 되는 크기

- 막대 하나(모듈)의 폭은 프린터 도트의 정수배로 맞춥니다(`paper.dpi`). 203dpi 에서 한 도트는 0.125mm.
- 좌우 여백(quiet zone)은 모듈 10개분을 비워 둡니다. 라벨 가장자리에 붙이지 마세요.
- 높이는 10mm 이상을 권합니다. 송장처럼 멀리서 읽는 바코드는 15mm 이상.
- 긴 값을 좁은 칸에 넣으면 모듈이 0.19mm 아래로 내려가 읽기 어렵습니다. 디자이너가 경고합니다.

## 바코드만 따로

라벨 없이 바코드 그림만 필요하면 `barcodeSVG` 를 쓰세요. 화면 표시나 PDF 에 넣을 SVG 문자열을 돌려줍니다.

```js
Label82.barcodeSVG('EP-2026-0412', { height: 15, showText: true });
Label82.barcodeSVG('880123456789', { format: 'ean13', moduleWidth: 0.33 });
```
