블로그

PDF의 벡터 바코드와 래스터 바코드: 예상 못 한 차지백

Acrobat에서 완벽해 보이는 바코드도 창고 스캐너에서는 실패할 수 있습니다. 리테일러 차지백이라는 실제 비용으로 이어지는 이유, 비용 규모, 3분 안에 PDF를 확인하는 방법을 정리합니다. 구매 담당자, 운영 리드, 엔지니어를 위한 글입니다.

사무실 프린터에서는 선명하게 출력되고 사내 테스트에서도 잘 읽힌 바코드가 약 8,000 km 떨어진 3PL의 열전사 프린터에서는 실패할 수 있습니다. 그리고 어떤 테스트 환경에서도 그 실패 양상이 보이지 않을 수 있습니다. CI에서도 잡히지 않고, Adobe Acrobat QA에서도 실패하지 않으며, 4K 모니터에서는 흠잡을 데 없이 보입니다. 하지만 공급망 팀에는 조용히 비용을 남깁니다. Amazon FBA 입고에서 개당 0.25달러, Walmart에서 비준수 카톤당 5-10달러, 때로는 입고 도크에서 팔레트 전체가 거부되는 비용입니다. 문제는 PDF 안의 바코드가 실제 바코드 그리기 명령이 아니라 바코드 그림이라는 점입니다. 그 그림이 인쇄 처리 과정에서 크기 조정을 거치는 동안 막대 폭은 스캐너가 요구하는 정밀도를 잃습니다.

이 글은 세 독자를 위해 썼습니다. 누구나 첫 섹션만 읽어도 무엇이 위험한지, PDF 벤더에게 무엇을 물어야 하는지 알 수 있습니다. QA와 운영 리드는 인쇄 품질 등급이 어떻게 무너지는지 설명하는 두 번째 섹션이 필요할 것입니다. 엔지니어는 PDF 내부에 실제로 무엇이 들어 있는지, 어떤 파일이든 3분 안에 확인하는 방법을 다루는 세 번째 섹션이 필요할 것입니다. 각 층은 명확한 요약으로 끝나므로 필요한 곳에서 멈춰도 됩니다.

한 표로 보기

질문 바코드가 그리기 명령일 때(벡터) 바코드가 그림일 때(래스터 PNG)
PDF 안의 크기 약 1 KB 약 50-300 KB
어떤 프린터용 크기 조정도 견딤 예. 프린터가 수학적으로 다시 그림 아니요. 크기 조정마다 선명도가 떨어짐
ISO 15416 인쇄 품질 등급 A 유지 운영 환경에서 C/D로 하락
Walmart SSCC-18 차지백 위험 낮음 높음
Amazon FBA 개당 0.25달러 재라벨 비용 드묾 나쁜 템플릿에서는 일상적
전환 노력 path를 출력하는 PDF 생성기 선택 엔지니어링 프로젝트

스캔으로 끝나는 업무 흐름에 PDF 생성 서비스를 평가한다면, 이 표의 중심 질문이 가장 진단적입니다. 그 결과가 그리기 명령인가, 아니면 그림인가? 이 글의 나머지는 그 질문의 긴 버전입니다.

모두를 위해: 실제로 무슨 일이 생기고 비용은 얼마인가

이야기 1 — 아무도 읽을 수 없었던 Walmart 팔레트

한 공급사의 제품 매니저가 새 배송 라벨 템플릿을 승인합니다. Adobe Acrobat에서는 좋아 보입니다. 사무실 프린터에서도 잘 출력됩니다. 첫 적재분, 팔레트 50개와 카톤 200개가 Walmart 물류 센터로 출발합니다.

입고 도크에서 하역 대행 팀(lumper team) 이 각 팔레트의 SSCC-18을 스캔합니다. SSCC-18은 해당 물리 팔레트를 유일하게 식별하는 18자리 일련번호입니다. 50개 팔레트 중 3개가 첫 번째와 두 번째 스캔에서 읽히지 않습니다. 하역 팀은 입고 리드에게 에스컬레이션합니다. 리드는 EDI 856 ASN을 엽니다. 공급사가 미리 보낸 전자 적하목록이며, 이 적재분에 있어야 할 모든 SSCC가 들어 있습니다. WMS는 적하목록의 SSCC 3개가 물리적으로는 도착했지만 읽을 수 없다는 사실을 봅니다. 불일치입니다.

그다음은 극적이지 않습니다. 절차적입니다. EDI 824 application advice가 공급사로 되돌아가 적재분에 플래그를 세웁니다. 입고 담당자는 바코드 아래 사람이 읽는 텍스트에서 읽히지 않는 SSCC를 수동 입력해야 합니다. 해당 적재분은 입고 슬롯을 놓칩니다. “라벨링 위반” 항목의 컴플라이언스 차지백이 공급사 계정에 붙습니다. 2026년 기준 주요 리테일러 대부분은 비준수 카톤당 5-10달러를 청구하며, 때로는 팔레트 단위로 청구합니다. 이 적재분에서는 직접 비용이 30-60달러입니다. 반올림 오차처럼 보일 수 있습니다.

진짜 비용은 그다음입니다. 라벨링 위반이 반복되면 공급사는 구매자 검토 상태로 이동하고, 이후 PO는 더 엄격한 컴플라이언스 감사를 거치며 선호도가 낮은 라우팅 등급으로 밀립니다. 분기당 몇 개 나쁜 팔레트만으로는 보통 이런 일이 생기지 않습니다. 하지만 잘못 설정된 PDF 스택에서 같은 템플릿이 매 적재분에 반복되면 시스템 문제로 잡힙니다.

그 공급사의 엔지니어링 사후 분석은 종종 몇 주가 걸립니다. 팀 안의 누구도 “PDF 안의 바코드“가 의미 있는 내부 구조를 가진다고 생각하지 않기 때문입니다. 그냥 바코드라고 생각합니다. 발견은 보통 첫 차지백 요약이 더 깊은 조사를 강제한 뒤에야 옵니다. PDF에 300 dpi PNG 비트맵이 들어 있었고, 물류 센터의 열전사 프린터가 이를 203 dpi로 다시 샘플링하면서 막대 폭이 허용오차 밖으로 번졌다는 사실입니다.

이야기 2 — 천천히 새는 Amazon FBA 차지백

이 사례는 더 조용하고, 더 크며, 더 발견하기 어렵습니다.

Fulfilled-by-Amazon 판매자가 SKU 하나의 5만 개를 FBA 입고로 보냅니다. 각 상품에는 Amazon의 SKU별 식별자인 FNSKU가 바코드로 인쇄된 라벨이 붙어 있습니다. 나쁜 템플릿에서는 보통 2-5%의 상품이 FBA 창고에서 스캔할 수 없는 바코드로 도착합니다. 막대가 너무 번져 첫 입고 스캔에서 읽히지 않는 것입니다. Amazon은 출하를 거부하지 않습니다. 영향을 받은 상품을 수동 재라벨 처리로 보내고 판매자에게 재라벨 1건당 고정 비용을 청구합니다. 2026년 기준 그 비용은 개당 0.25달러입니다.

5만 개 입고분에서 실패율이 5%라면 직접 차지백은 625달러입니다. 매달 반복하는 판매자에게는 연 7,500달러의 순수한 낭비입니다. 이것은 명시적으로 보이는 차지백 라인일 뿐입니다. 더 큰 숨은 비용은 재라벨된 상품이 FBA 입고 완료까지 더 오래 걸리고, 그동안 buy box에 올라오지 못하며, 프로모션 트래픽이 밀리고, 출시 주기에서 가장 나쁜 순간에 매출이 빠지는 것입니다.

판매자는 Amazon Seller Central의 FBA inbound defect & reimbursement 리포트를 파고들기 전까지 이 사실을 모르는 경우가 많습니다. 그전까지는 항목이 “Amazon 쪽 이상함“으로 처리됩니다. 실제 원인, 즉 벡터 바코드가 아니라 300 dpi PNG를 내보내는 바코드 생성기는 몇 달 전 상위 단계에 있고, 이런 조사를 해본 사람이 아니라면 차지백 리포트와 연결하기 어렵습니다.

이야기 3 — UPS / FedEx의 예외 처리 라인

세 번째 사례에는 직접 차지백이 없습니다. 그래서 가장 보이지 않습니다.

소포가 UPS나 FedEx 분류 시설에 도착하면 컨베이어 스캐너가 운송장 추적 바코드를 밀리초 단위로 읽습니다. 판독이 실패하면, 예를 들어 막대가 허용오차 밖으로 번졌거나 quiet zone이 잘렸거나 modulation 등급이 D라면, 소포는 거부되지 않습니다. 메인 벨트에서 빠져 예외 처리 라인으로 이동하고, 사람이 사람이 읽는 텍스트에서 추적 번호를 입력합니다. 소포는 12-24시간 지연된 채 네트워크로 다시 들어갑니다.

운송사는 보통 여기에 직접 차지백을 걸지 않습니다. 비용은 다른 곳에 나타납니다.

  • 고객 지원 티켓이 “발송했다면서 어디 있나요?“로 증가합니다.
  • 실제로는 제때 발송됐지만 수동 처리 라인을 거친 배송에서 고객 NPS가 떨어집니다.
  • 시간이 지나면서 운송사 계정 감사가 해당 공급사를 라벨링 우려 대상으로 표시합니다. 이후 픽업이 더 면밀히 확인되고, 계약 갱신은 더 까다로워지며, 운임 협상은 더 나빠집니다.

나쁜 소포 하나는 측정 가능한 비용이 없습니다. 한 달에 나쁜 소포 1만 개가 1년 이어지면 관계 비용이 됩니다.

세 이야기의 공통된 실

모든 이야기에서 버그는 데이터, 디자인, 프린터, 스캐너에 있지 않습니다. 상위 단계의 선택 하나에 있습니다. 바코드가 프린터에 그림으로 도착했고, 그리기 명령으로 도착하지 않았습니다. 그림은 낯선 프린터용 크기 조정을 견디지 못합니다. 그리기 명령은 견딥니다.

왜 이렇게 흔한가

분리된 상태에서 벡터 바코드를 만드는 것은 어려운 일이 아닙니다. 현대 바코드 라이브러리는 정밀한 SVG 출력을 만들 수 있습니다. 어려운 부분은 그 벡터 바코드를 임베드 이미지가 아니라 PDF 기본 path 연산자로 PDF에 넣는 것입니다. SVG path를 PDF path 연산자로 번역하려면 PDF 생성기와 바코드 엔진이 함께 설계되어야 합니다. 쉬운 지름길은 바코드 라이브러리를 호출하고, 그 PNG 출력을 받아 Image XObject로 PDF에 넣는 것입니다. 프레임워크 수준에서 연결하기가 훨씬 쉽습니다. 그래서 대부분의 PDF 스택이 그 길을 택합니다. 창고 입장에서 보면, 그 하나의 아키텍처 지름길이 열전사 프린터에 도착해 차지백을 만듭니다.

여기까지가 비전문가를 위한 요약입니다. 여기서 읽기를 멈춰도 PDF 벤더에게 올바른 질문을 던지고, 엔지니어링 팀에 이 글 하단의 3분 검증을 요청할 만큼의 정보는 충분합니다.

QA와 운영 리드를 위해: 등급이 실제로 어떻게 무너지는가

창고 스캐너가 이미 쓰고 있는 표준

입고 도크에서 “좋은 바코드“가 무엇인지 정의하는 ISO 표준은 두 가지입니다.

  • ISO/IEC 15416 — Code 128, GS1-128, ITF-14, EAN, UPC 같은 1D 선형 코드.
  • ISO/IEC 15415 — QR, DataMatrix, PDF417, Aztec 같은 2D 매트릭스 코드.

실험실 검증 장비는 인쇄된 심볼에서 7개 파라미터를 측정하고 A(4.0) 부터 F(0.0) 까지 하나의 종합 등급을 냅니다. ANSI 척도도 같은 내용을 다른 문자로 표시한 것입니다. Walmart, Amazon, Target, Costco, 주요 운송사의 벤더 매뉴얼은 모두 이 표준을 참조하며 보통 C 등급 이상을 요구합니다. C 아래는 사양 밖으로 취급되고, D 아래는 앞에서 본 차지백 절차를 작동시킵니다.

7개 파라미터와 래스터 바코드가 각각에 주는 영향은 다음과 같습니다.

Parameter 검증 장비가 확인하는 것 래스터 PNG가 해치는 이유
Decodability 막대 폭이 사양 허용오차 안에 있는가? 재샘플링이 폭을 사양 밖으로 밀어냅니다. 보통 가장 먼저 떨어지는 파라미터입니다
Edge contrast 막대/공백 전이가 날카로운가? 크기 조정 중 안티앨리어싱이 회색 전이 픽셀을 만듭니다
Modulation 심볼 전체의 밝음/어두움 대비가 균일한가? 프린트 드라이버 디더링이 단색 막대를 점 패턴으로 바꿉니다
Defects 불필요한 점이나 빈 구멍이 있는가? 재샘플링 아티팩트가 라벨 위 실제 잉크 점이 됩니다
Min reflectance 막대가 충분히 어두운가? 재샘플링이 좁은 막대 안에 내부 공백을 남길 수 있습니다
Symbol contrast 전체 막대와 배경 대비가 충분한가? 손실 PDF 압축이 대비를 평평하게 만듭니다
Quiet zone 심볼 주변의 필수 흰 여백이 있는가? 자동 자르기 도구가 여백을 먹어 들어갑니다

벡터 바코드는 다시 샘플링할 원본 픽셀 격자가 없기 때문에 모든 파라미터가 A에 가깝게 유지됩니다. 래스터 바코드는 보통 파라미터마다 반 등급씩 잃습니다. 그런 손실이 다섯, 여섯 개 쌓이면 평균은 C나 D에 도달합니다. 데이터는 같습니다. 인코딩도 같습니다. 화면에서는 바코드가 같아 보입니다. 다른 것은 인쇄된 심볼뿐입니다. 그리고 검증 장비와 창고 스캐너는 Acrobat에서 QA 팀이 보는 것이 아니라 인쇄된 심볼을 측정합니다.

프린터가 손상을 더 키우는 이유

PDF 안에 들어간 래스터 PNG는 “인쇄“를 누른 순간부터 라벨이 프린터를 빠져나오기까지 여섯 번의 재샘플링 단계를 지납니다. 각 단계는 대략 반 등급의 비용을 냅니다.

  1. 뷰어가 화면용으로 래스터화합니다. Acrobat이나 PDF 리더가 원본 PNG를 모니터 픽셀 격자에 보간합니다. 좋아 보입니다. 그래서 QA가 속습니다.
  2. 프린트 드라이버가 종이용으로 래스터화합니다. 드라이버는 원본 픽셀을 프린터 격자에 맞추려고 bilinear 또는 bicubic 보간을 고릅니다. Edge contrast가 무너집니다.
  3. 색상 변환. CMYK나 그레이스케일 변환을 거치는 경로는 보통 하프톤 디더링과 함께 또 한 번 재샘플링을 적용합니다. Modulation이 무너집니다.
  4. “인쇄 가능 영역에 맞춤”. 많은 드라이버는 가장자리 잘림을 피하려고 기본값으로 99% 페이지 스케일링을 씁니다. Decodability가 한 등급의 일부만큼 흔들립니다.
  5. PDF/A 평탄화. 보존용 PDF 변환은 투명도가 포함된 영역을 다시 래스터화하는 경우가 많습니다. 또 반 등급이 사라집니다.
  6. 열전사 헤드 번짐. 리본과 direct-thermal 매체는 열 아래에서 2-4 mil 정도 번집니다. 벡터 방식은 보정할 수 있지만, 래스터 원본은 그럴 수 없습니다.

비용을 쌓아 보면 A 등급으로 생성기를 떠난 바코드가 스캐너 앞에서는 C-D 등급에 도달합니다. 이것이 운영 산수입니다. 벡터 path 연산자는 2-4단계를 통째로 건너뜁니다. 다시 샘플링할 원본 픽셀 격자가 없고, 프린터 자체 래스터화 단계가 수학적 사양에서 native DPI의 막대를 계산하기 때문입니다.

QA 리드라면 여기서의 실행 항목은 ISO 15416 검증 장비를 한 번 빌리는 것입니다(주당 1-2천 달러, Cognex, Keyence, REA VeriCube 같은 벤더). 가장 물량이 큰 리테일러 흐름에서 생산 라벨 50장을 샘플링하세요. 평균 등급이 B보다 낮다면 래스터 바코드 문제가 있습니다.

엔지니어를 위해: PDF 안에는 실제로 무엇이 있는가

바코드가 페이지 위에 놓이는 두 가지 방식

PDF는 보이는 객체를 정확히 두 종류로 정의합니다.

  • Path — 부동소수점 좌표의 그리기 연산 목록입니다(re 사각형, f 채우기, m/l 이동/선, S stroke). 프린터 자체 래스터화 단계가 이를 장치 native 해상도에서 계산합니다.
  • Image XObject — 픽셀 단위의 너비/높이를 가진 임베드 비트맵입니다. PNG / JPEG / raw stream으로 인코딩됩니다. 생성기는 원본 픽셀 격자를 장치 픽셀 격자에 매핑해야 하며, 이 과정에는 항상 재샘플링이 필요합니다.

막대 60개짜리 벡터 Code 128은 콘텐츠 스트림에 약 60개의 re/f 쌍을 만듭니다. 전체가 1 KB 미만입니다. 부동소수점 좌표는 0.001 mm 정확도입니다. 래스터 Code 128은 임베드 PNG를 가리키는 Do /Im0 연산자 하나를 만들며, 300 dpi 기준 보통 270 KB입니다.

% Vector — expected barcode drawing output
0 0 0.40 22 re f       % bar 1: 0.40mm wide, 22mm tall
0.99 0 0.40 22 re f    % bar 2 ...
1.97 0 0.40 22 re f    % ~60 lines like this, ~1 KB total

% Raster — typical bitmap barcode output
348 0 0 84 0 0 cm      % scale a 348×84 pixel image to 92mm × 22mm
/Im0 Do                % insert the embedded PNG (~270 KB)

벡터는 원래 사양을 프린터까지 그대로 가져갑니다. 래스터는 원본 DPI에서 막대를 얼려 놓고, 이후 모든 프린터가 추측하게 만듭니다.

어떤 PDF든 3분 안에 확인하기

poppler-utilsqpdf만 있으면 됩니다. 둘 다 모든 Linux/Mac/WSL에서 무료로 쓸 수 있습니다.

1. 800%로 확대합니다. 벡터 바코드는 어떤 확대율에서도 선명합니다. 래스터는 크게 픽셀화되어 원본 픽셀을 셀 수 있습니다. 가장 빠른 비공식 확인입니다.

2. 임베드 이미지를 나열합니다:

$ pdfimages -list shipping-label.pdf
page  num  type    width  height color comp bpc enc      object  x-ppi  size
─────────────────────────────────────────────────────────────────────────────
   1    0  image     348      84  gray    1   1 ccitt     8 0     300   270K

바코드 비율과 맞는 행이 보이면(예: 넓은 1D 코드의 348 × 84, 또는 2D 코드의 정사각형), 그 바코드는 래스터 이미지입니다. 벡터 바코드는 이 출력에 전혀 나타나지 않습니다.

3. 콘텐츠 스트림을 검사합니다:

$ qpdf --qdf shipping-label.pdf - | grep -A2 -B2 ' re$'

막대 60개짜리 벡터 Code 128은 re/f 연산자가 촘촘한 군집을 만듭니다. 바코드가 있어야 할 근처에 사각형이 없고 Do /Im0 연산자 하나만 보이면 래스터 이미지입니다.

전문 검증 장비(Cognex, Keyence, REA VeriCube)는 5천 달러 이상이며 공식 ISO 15416 리포트를 제공합니다. 대부분의 팀은 이미 차지백이 조사를 촉발한 뒤에야 그 단계까지 갑니다. 위의 세 검사는 무료로 어느 쪽 문제인지 알려줍니다.

gPdf가 하는 일

gPdf의 바코드 생성은 같은 팀이 만든 자매 제품 xBarcode에서 옵니다. xBarcode는 Rust 바코드 엔진입니다. 제3자 라이브러리를 감싼 래퍼가 아니라 완전히 자체 개발한 엔진이며, gPdf 생성기가 직접 호출합니다. Code 128, GS1-128, QR, Data Matrix, PDF417, Aztec, ITF, EAN, UPC와 그 밖의 30개 이상 지원 포맷처럼 매트릭스와 선형 심볼 모두에 대해 xBarcode가 막대/셀 패턴을 계산하고, gPdf가 이를 PDF 콘텐츠 스트림에 부동소수점 좌표의 re/f 사각형 연산자로 씁니다. 중간 PNG도, 원본 DPI도, 래스터 표면도 없습니다.

짚고 넘어갈 만한 결과는 두 가지입니다.

  • 엔진을 공개적으로 검증할 수 있습니다. xBarcode는 독립 무료 온라인 도구인 xbarcode.ai에서도 동작합니다. 누구나 요청 데이터를 붙여 넣고 SVG / PNG / EPS를 내려받아 path 출력을 확인한 뒤 gPdf가 무엇을 만든다고 믿을지 판단할 수 있습니다. 그 path 출력이 gPdf PDF 안에 들어가는 결과입니다. “우리는 벡터 바코드를 출력한다“는 주장이 보통 버티지 못하는 신뢰성 확인 지점입니다.
  • 성능을 측정할 수 있습니다. xBarcode는 표준 1D 코드를 단일 코어에서 약 4 µs(v1.5.4)에 생성합니다. 공개 벤치마크 기준 fast_qr보다 6배, rxing보다 30배 빠릅니다. gPdf의 Cloudflare Workers 실행 환경을 끝까지 거치면 전 세계 p50이 약 30 ms입니다.

path 출력 외에도 xBarcode는 대다수 제3자 바코드 라이브러리가 통째로 건너뛰는 GS1 계층을 처리합니다. 750개 이상의 응용 식별자(AI) 레지스트리, 엄격/완화 검증 모드, FNC1 구분자 자동 삽입, AI별 길이와 문자 집합 검사가 포함됩니다. (01)09504000059101(17)260315 요소 문자열은 차지백 이후가 아니라 인코딩 전에 사양에 맞는지 검증됩니다.

PDF/A-1b부터 PDF/A-4까지는 구조적으로 호환됩니다. 별도 평탄화 단계가 필요 없습니다. 결정성도 정확합니다. 같은 DocumentRequest는 isolate와 릴리스가 달라도 바이트가 동일한 콘텐츠 스트림을 만듭니다.

래스터가 그래도 허용될 수 있는 경우

실제 사례는 두 가지입니다.

  • 안정적인 스캔이 필요 없는 내부 전용 문서. 래스터여도 상관없습니다. 다만 벡터도 추가 비용이 없으므로 래스터가 절약해 주는 것도 없습니다.
  • 마케팅 이유로 바코드가 사진형 로고나 아트워크 안에 고정된 경우. 스캔 신뢰성은 실수가 아니라 의식적인 기술 부채가 됩니다.

그 밖의 배송 라벨, FNSKU 라벨, 급여명세서, 인보이스 품목 바코드, 바우처 PDF, 티켓 QR 코드, 리테일 거래 품목 라벨, 의약품 일련번호 표기에는 벡터가 하류 인쇄 처리 과정에 도박을 떠넘기지 않는 유일한 선택입니다.

결론

스캔으로 끝나는 업무 흐름에 PDF 스택을 고를 때 물어야 할 질문은 “QR / Code 128 / GS1-128을 지원하나요?“가 아닙니다. 질문은 이것입니다.

바코드를 요청하면 결과가 그리기 명령인가요, 아니면 임베드된 그림인가요?

답이 그림이라면, 어떤 X-dimension 보정, 폰트 대체 주의, 프린터 유지보수로도 낮출 수 없는 스캔 실패율의 바닥이 생깁니다. Walmart 차지백, Amazon의 0.25달러 라인 항목, 운송사 예외 처리 지연은 벤더 문제나 창고 문제가 아닙니다. 생성기를 떠나는 바이트의 속성입니다.

오늘 할 수 있는 가장 싼 조치는 최근 100개의 출고 라벨 PDF에 pdfimages -list를 돌리는 것입니다. 바코드처럼 생긴 이미지 객체로 돌아오는 행을 세세요. 그 숫자를 아직 발표되지 않은 컴플라이언스 감사의 크기로 보면 됩니다.

See also