Code 39부터 Code 128까지, 바코드를 ‘글꼴’처럼 만드는 원리와 실무 적용법
기업 전산 업무를 하다 보면 의외로 자주 만나는 요구사항이 하나 있습니다.
“바코드를 이미지가 아니라 폰트로 출력할 수 없나요?”
ERP, WMS, MES, 자산관리, 생산관리, 물류 라벨, 출하전표 같은 시스템에서는 바코드 출력이 매우 흔합니다. 그런데 매번 이미지 파일을 생성하는 방식은 관리가 번거롭고, 보고서 엔진이나 엑셀·워드 환경에서는 오히려 바코드 폰트(Barcode Font) 방식이 더 간편할 때가 많습니다.
이번 글에서는 바코드 폰트가 무엇인지, 어떤 원리로 동작하는지, 직접 제작하려면 어떤 과정을 거쳐야 하는지, 그리고 Code 39·Code 128 같은 대표 규격별 차이와 주의사항까지 실무 관점에서 정리해보겠습니다.
1. 바코드 폰트란 무엇인가?
바코드 폰트는 일반 글꼴처럼 문자에 모양을 대응시키되, 그 모양이 막대와 공백 패턴으로 되어 있는 폰트입니다.
예를 들어 일반 폰트는:
A → 알파벳 A 모양
B → 알파벳 B 모양
1 → 숫자 1 모양
으로 렌더링됩니다.
반면 바코드 폰트는:
A → 특정 막대/공백 패턴
B → 다른 막대/공백 패턴
1 → 또 다른 막대/공백 패턴
으로 렌더링됩니다.
즉, 워드나 엑셀에서 문자를 입력한 뒤 글꼴을 바코드 폰트로 변경하면 사람이 읽는 문자열 대신 바코드처럼 보이게 되는 구조입니다.
2. 바코드 폰트 제작 전에 알아야 할 핵심
가장 먼저 이해해야 할 점은 다음입니다.
바코드 폰트는 단순히 검은 막대를 그린 폰트가 아닙니다.
각 바코드 규격에는 엄격한 인코딩 규칙이 존재합니다.
대표적인 1차원 바코드는 다음과 같습니다.
| 규격 | 특징 | 폰트 제작 난이도 |
|---|---|---|
| Code 39 | 구조 단순, 영숫자 중심 | 낮음 |
| Codabar | 숫자 중심, 비교적 단순 | 낮음 |
| Interleaved 2 of 5 | 숫자 전용 | 중간 |
| EAN-13 | 상품 바코드, 체크섬 필요 | 중간 |
| UPC-A | 북미 상품 바코드 | 중간 |
| Code 128 | 고밀도, Code Set/체크섬 필요 | 높음 |
| GS1-128 | 물류·산업 표준 | 매우 높음 |
처음 제작한다면 Code 39부터 시작하는 것이 가장 현실적입니다.
3. 바코드 폰트 제작 전체 흐름
직접 바코드 폰트를 만든다고 하면 전체 과정은 대략 다음과 같습니다.
바코드 규격 선정
↓
문자별 Encoding Pattern 정리
↓
Bar / Space 폭 정의
↓
Glyph 벡터 디자인
↓
문자 코드에 Glyph 매핑
↓
TTF/OTF 생성
↓
스캐너 테스트
↓
출력 환경별 검증
핵심은 결국 문자별 바코드 패턴을 정확한 폭으로 Glyph로 만드는 것입니다.
4. 가장 만들기 쉬운 Code 39부터 이해하자
Code 39는 바코드 폰트 제작 학습용으로 매우 좋습니다.
지원 문자는 일반적으로 다음과 같습니다.
0~9
A~Z
-
.
Space
$
/
+
%
그리고 시작과 종료를 나타내는 특수 문자 *를 사용합니다.
예를 들어 데이터가:
ABC123
이라면 실제 Code 39 표현은 보통:
*ABC123*
형태가 됩니다.
따라서 Code 39 폰트를 적용할 때도 종종:
*ABC123*
을 입력해야 정상적인 바코드가 만들어집니다.
5. Code 39 패턴은 어떻게 만들어지나?
Code 39의 각 문자는 여러 개의 Bar와 Space 조합으로 구성됩니다.
핵심은 두 가지 폭입니다.
N = Narrow
W = Wide
예를 들어 어떤 문자가 아래처럼 정의된다고 가정해 보겠습니다.
N W N N W N W N N
이 패턴을 다음과 같이 그리는 것입니다.
█ ███ █ ░ ░░░ █ ...
실제 폰트 제작에서는 이를 사각형 벡터(Rectangle)의 조합으로 그립니다.
6. 바코드 폰트를 제작할 때 사용할 수 있는 프로그램
가장 대표적인 도구는 다음과 같습니다.
FontForge
오픈소스 폰트 제작 프로그램으로 가장 추천할 만합니다.
가능한 작업:
- Glyph 생성
- Unicode/ASCII 문자 매핑
- TTF/OTF 생성
- Script 자동화
- 벡터 편집
특히 Python 또는 FontForge Script를 이용하면 수십 개의 바코드 문자를 자동으로 생성할 수 있습니다.
그 외 도구
- Glyphs
- FontLab
- BirdFont
- RoboFont
기업에서 자동화를 생각한다면 FontForge가 가장 실용적입니다.
7. Glyph 설계 방법
바코드 폰트에서는 곡선이 거의 필요 없습니다.
대부분 아래처럼 직사각형만 사용합니다.
┌──┐ ┌────┐ ┌──┐
│██│ │████│ │██│
│██│ │████│ │██│
│██│ │████│ │██│
└──┘ └────┘ └──┘
즉 Glyph 하나당:
Bar 1
Space 1
Bar 2
Space 2
Bar 3
...
의 폭을 계산하여 직사각형을 배치하면 됩니다.
8. Narrow와 Wide 비율이 중요하다
바코드 인식률에서 가장 중요한 부분 중 하나입니다.
일반적으로 Wide 요소는 Narrow 요소보다 일정 비율로 넓어야 합니다.
예를 들어:
Narrow = 100 units
Wide = 250 units
과 같이 설계할 수 있습니다.
비율이 잘못되면 화면에서는 바코드처럼 보이더라도 실제 스캐너에서는 읽히지 않을 수 있습니다.
따라서 폰트는 예쁘게 보이는 것보다 규격에 맞는 것이 훨씬 중요합니다.
9. 문자 간 간격도 바코드의 일부다
일반 글꼴에서는 자간(Kerning)이 디자인 요소지만 바코드에서는 인식에 직접 영향을 줍니다.
예를 들어:
A B C
각 문자 사이에는 규격에 맞는 일정한 Inter-character Gap이 필요합니다.
따라서 바코드 폰트에서는 일반 폰트처럼 자동 Kerning을 적극적으로 사용하면 오히려 문제가 발생할 수 있습니다.
권장 방향은:
문자 폭 고정
+
자간 고정
+
Kerning 최소화
입니다.
10. FontForge를 이용한 기본 제작 과정
FontForge를 사용한다면 다음 순서로 진행할 수 있습니다.
① 새 폰트 생성
File
→ New
② 폰트 기본 정보 입력
예:
Font Name: MyCode39
Family Name: MyBarcode
Style: Regular
③ 문자 선택
예를 들어 ASCII A를 선택합니다.
④ Glyph에 Bar 패턴 그리기
사각형을 여러 개 배치하여 A에 해당하는 Code 39 패턴을 구현합니다.
⑤ Advance Width 설정
바코드 문자 전체 폭을 맞춰줍니다.
⑥ 모든 문자 반복
0~9
A~Z
특수문자
Start/Stop
⑦ Generate Fonts
File
→ Generate Fonts
→ TrueType (.ttf)
이 과정을 거치면 일반 Windows 폰트처럼 설치할 수 있습니다.
11. 수작업보다 자동 생성이 좋은 이유
Code 39 정도만 되어도 수십 개의 Glyph가 필요합니다.
하나하나 그리는 방식은 오류 가능성이 매우 높습니다.
따라서 다음과 같이 패턴 데이터를 코드로 관리하는 것이 좋습니다.
예:
patterns = {
"A": "WNNNNWNNW",
"B": "NNWNNWNNW",
"C": "WNWNNWNNN",
}
이 데이터를 이용해 자동으로:
패턴 해석
→ x 좌표 계산
→ Bar 생성
→ Glyph 저장
을 반복하면 됩니다.
이 접근이 실제 바코드 폰트 제작에서 훨씬 안정적입니다.
12. Code 128은 왜 더 어렵나?
Code 128부터는 이야기가 달라집니다.
Code 39는 비교적 문자와 패턴이 직접 연결되지만 Code 128에서는:
- Code Set A
- Code Set B
- Code Set C
- Start Character
- Stop Character
- Checksum
등이 존재합니다.
예를 들어 사용자가:
12345678
을 입력했다고 해서 단순히 숫자 각각을 특정 Glyph로 바꾸면 끝나는 것이 아닙니다.
먼저 문자열을 Code 128 규칙에 따라 인코딩해야 합니다.
Original Data
↓
Code Set 선택
↓
Character Encoding
↓
Checksum 계산
↓
Start + Data + Checksum + Stop
↓
Barcode Font
따라서 Code 128은 보통 Encoder + Barcode Font를 함께 제공합니다.
13. 그래서 Encoder가 중요하다
상용 바코드 폰트를 설치해보면 단순히 TTF 하나만 제공하지 않는 경우가 많습니다.
대개 다음이 같이 제공됩니다.
Barcode Font
+
Excel Function
+
DLL
+
Java Library
+
JavaScript
+
C# Encoder
이유가 바로 여기에 있습니다.
바코드 규격에 맞는 문자열로 먼저 변환한 다음, 그 결과에 바코드 폰트를 적용해야 하기 때문입니다.
14. Code 128 체크섬의 개념
Code 128에서는 체크문자를 계산합니다.
개념적으로는:
Checksum =
(Start Code
+ 문자값1 × 1
+ 문자값2 × 2
+ 문자값3 × 3
...)
MOD 103
형태입니다.
즉 단순 폰트 제작만으로 끝나지 않고 인코딩 로직을 프로그램에서 구현해야 합니다.
ERP나 MES에서 Code 128을 사용할 계획이라면 이 부분을 반드시 설계해야 합니다.
15. EAN-13 폰트도 단순하지 않다
마트 상품에서 많이 볼 수 있는 EAN-13 역시 체크섬이 있습니다.
예를 들어 12자리 데이터가:
880123456789
이라면 마지막 한 자리를 계산하여:
880123456789X
형태의 13자리 바코드를 만듭니다.
뿐만 아니라 EAN에는:
- Left Guard
- Center Guard
- Right Guard
- Left Encoding
- Right Encoding
이라는 별도의 구조가 존재합니다.
따라서 EAN 폰트 역시 단순히 숫자 모양을 Bar로 만드는 수준이 아닙니다.
16. 바코드 폰트가 잘 만들어졌는지 테스트하는 방법
폰트 제작 후 반드시 실제 검증이 필요합니다.
화면에서 바코드처럼 보인다고 끝이 아닙니다.
검증 과정은 다음을 권장합니다.
TTF 설치
↓
Word/Excel 테스트
↓
PDF 출력
↓
Laser Printer 출력
↓
Barcode Scanner 인식
↓
여러 크기로 재시험
특히 다음 조건을 바꿔가며 테스트해야 합니다.
- 글꼴 크기
- 프린터 해상도
- PDF 변환
- 라벨 프린터
- 203dpi / 300dpi / 600dpi
- 스캐너 종류
17. Quiet Zone을 절대 무시하면 안 된다
바코드 좌우에는 아무것도 없는 빈 영역이 필요합니다.
이를 Quiet Zone이라고 합니다.
Barcode
↓
[여백] █ ██ ███ ██ █ [여백]
문서 편집 과정에서 바코드 바로 옆에 글자나 표 테두리가 붙으면 인식률이 낮아질 수 있습니다.
폰트를 제작할 때 Glyph 폭만 신경 쓰지 말고 출력 레이아웃에서도 Quiet Zone을 확보해야 합니다.
18. 엑셀에서 활용하는 방식
Code 39처럼 단순한 바코드는 매우 편합니다.
예를 들어 A1에:
123456
이 있다면 다른 셀에서:
="*"&A1&"*"
를 사용합니다.
결과:
*123456*
그리고 해당 셀에 Code 39 폰트를 지정합니다.
바코드가 바로 표시됩니다.
이 때문에 사내 자산관리나 라벨 작업에서 Code 39 폰트가 상당히 편리합니다.
19. ERP·MES에서는 어떻게 활용할까?
기업 시스템에서는 다음 형태가 일반적입니다.
ERP / MES
↓
제품번호 생성
↓
Barcode Encoder
↓
Encoded String
↓
Report Engine
↓
Barcode Font
↓
Label Printer
예를 들어 생산 현장이라면:
품번
LOT 번호
생산일자
공정번호
등을 조합하여 바코드를 만들 수 있습니다.
20. 바코드 폰트와 이미지 방식 비교
| 구분 | 바코드 폰트 | 이미지 생성 |
|---|---|---|
| 구현 난이도 | 단순 규격은 쉬움 | 비교적 쉬움 |
| 문서 출력 | 매우 편리 | 삽입 필요 |
| Excel | 매우 편리 | 불편 |
| 체크섬 | 별도 Encoder 필요 | 라이브러리에서 처리 가능 |
| 크기 조절 | 폰트 크기로 간단 | 이미지 크기 조정 |
| 인식 안정성 | 폰트 품질에 영향 | 상대적으로 안정적 |
| QR Code | 부적합 | 적합 |
따라서 무조건 폰트 방식이 좋은 것은 아닙니다.
21. 어떤 경우 바코드 폰트를 추천할까?
바코드 폰트는 다음 환경에서 특히 유용합니다.
- Excel 기반 라벨 출력
- ERP 전표
- 생산 지시서
- 자산관리 스티커
- 물류 송장
- Crystal Reports
- JasperReports
- MS Access
- Word Mail Merge
반대로 QR Code나 DataMatrix처럼 2차원 코드는 이미지 또는 전용 라이브러리 방식이 더 적합합니다.
22. 직접 만들 것인가, 상용 폰트를 사용할 것인가?
직접 제작의 장점은 분명합니다.
- 사내 라이선스 문제 감소
- ERP에 맞게 커스터마이징 가능
- 특수 문자 매핑 가능
- 내부 배포 용이
하지만 상업 환경에서는 다음도 고려해야 합니다.
- 바코드 표준 준수
- 스캐너 호환성
- 프린터 해상도
- 장기간 유지보수
- GS1 같은 표준 요구사항
따라서 단순 Code 39 사내 자산관리 정도라면 직접 제작도 충분히 가능합니다.
반면 GS1-128, EAN, 의료·물류 표준 바코드라면 검증된 상용 라이브러리나 폰트를 사용하는 것이 안정적입니다.
23. 실제 제작 프로젝트라면 이렇게 진행하는 것이 좋다
제가 실무 프로젝트라면 다음과 같이 접근하겠습니다.
1단계
사용할 바코드 규격 결정
↓
2단계
사용 프로그램 확인
Excel / ERP / MES / Web
↓
3단계
인코딩 요구사항 확인
Checksum / Start / Stop
↓
4단계
Python으로 Encoder 작성
↓
5단계
FontForge로 TTF 자동 생성
↓
6단계
라벨 프린터 테스트
↓
7단계
10~20종 스캐너 검증
↓
8단계
ERP/MES 배포
폰트 디자인보다 오히려 인코딩 규칙과 출력 검증에 더 많은 시간을 투자해야 합니다.
결론: 바코드 폰트 제작의 핵심은 ‘그림’이 아니라 ‘규격’이다
바코드 폰트를 처음 보면 단순히 검은 선을 그린 글꼴처럼 보입니다.
하지만 안쪽을 들여다보면 이야기가 완전히 다릅니다.
바코드는 결국:
문자 → 인코딩 → 폭의 조합 → 검증 가능한 시각 패턴
으로 변환되는 하나의 정보 시스템입니다.
따라서 좋은 바코드 폰트를 만들려면 세 가지가 중요합니다.
첫째, 바코드 규격을 정확하게 이해해야 합니다.
둘째, Bar와 Space의 폭을 정확하게 구현해야 합니다.
셋째, 반드시 실제 프린터와 스캐너로 검증해야 합니다.
특히 처음 제작한다면 Code 39 + FontForge + Python 자동 생성 조합부터 시작하는 것이 가장 좋습니다. 이후 Code 128처럼 복잡한 규격으로 확장하면서 Encoder와 Font를 분리하면 ERP·MES에서도 활용할 수 있는 상당히 전문적인 바코드 시스템으로 발전시킬 수 있습니다.
