Blog

Mã vạch vector và raster trong PDF: khoản chargeback bạn không thấy trước

Một mã vạch trông hoàn hảo trong Acrobat vẫn có thể fail ở scanner kho và tạo chargeback thật. Vì sao điều đó xảy ra, tốn bao nhiêu, và cách kiểm tra PDF trong ba phút. Dành cho buyer, ops lead và engineer.

Một mã vạch in sắc nét trên printer văn phòng và scan sạch trong test nội bộ vẫn có thể fail trên máy in nhiệt của một 3PL cách bạn 8.000 km, và bạn sẽ không thấy failure mode đó trong bất kỳ môi trường test nào. Bug không xuất hiện trong CI, không làm QA fail trong Adobe Acrobat, và nhìn hoàn hảo trên màn hình 4K. Nó âm thầm khiến đội supply chain mất 0,25 USD mỗi đơn vị ở Amazon FBA inbound, 5-10 USD cho mỗi carton không compliant ở Walmart, và đôi khi cả pallet bị từ chối tại receiving dock. Bug nằm ở chỗ mã vạch trong PDF là một bức ảnh của mã vạch, không phải drawing instructions thật của mã vạch. Khi bức ảnh đó bị resize qua print pipeline, độ rộng thanh không còn đủ chính xác cho scanner.

Bài này dành cho ba nhóm độc giả. Bất kỳ ai có thể đọc phần đầu để biết rủi ro là gì và nên hỏi vendor PDF câu nào. QA và ops lead sẽ cần phần thứ hai về cách print-quality grade sụp xuống. Engineer sẽ cần phần thứ ba về thứ thật sự nằm bên trong PDF và cách kiểm tra bất kỳ file nào trong ba phút. Mỗi tầng đều kết thúc bằng takeaway rõ, nên bạn có thể dừng khi đã có phần mình cần.

Trong một bảng

Câu hỏi Nếu mã vạch là drawing instructions (vector) Nếu mã vạch là một bức ảnh (raster PNG)
Kích thước trong PDF khoảng 1 KB khoảng 50-300 KB
Sống sót qua resize cho mọi printer Có, printer vẽ lại từ toán học Không, mỗi lần resize đều mất nét
ISO 15416 print-quality grade Giữ ở A Rơi từ A xuống C/D trong production
Rủi ro chargeback Walmart SSCC-18 Thấp Cao
Amazon FBA relabel 0,25 USD/đơn vị Hiếm Thường xuyên với template xấu
Công sức chuyển đổi Chọn renderer emit paths Dự án engineering

Nếu đội của bạn đang đánh giá dịch vụ tạo PDF cho bất kỳ workflow nào kết thúc bằng scan, câu hỏi chẩn đoán nhất chính là hàng mà bảng này xây trên: nó tạo drawing instructions, hay một bức ảnh? Phần còn lại của bài là phiên bản đầy đủ của câu hỏi đó.

Cho mọi người: chuyện gì thật sự xảy ra, và tốn bao nhiêu

Câu chuyện 1: pallet Walmart không ai đọc được

Product manager của một supplier ký duyệt một template shipping label mới. Nó trông rất đẹp trong Adobe Acrobat. In trên printer văn phòng cũng ổn. Lô đầu tiên, 50 pallet, 200 carton, đi tới distribution centre của Walmart.

Tại receiving dock, lumper team (đội bốc dỡ thuê ngoài) scan SSCC-18 của từng pallet, tức serial 18 chữ số định danh duy nhất pallet vật lý đó. Ba pallet trong 50 pallet không đọc được ở lần scan thứ nhất hoặc thứ hai. Lumper team escalation cho receiving lead. Receiving lead mở EDI 856 ASN, tức manifest điện tử supplier gửi trước, liệt kê mọi SSCC đáng lẽ có trên lô hàng. WMS thấy ba SSCC từ manifest hiện đã có mặt vật lý nhưng không đọc được. Đó là discrepancy.

Phần tiếp theo không kịch tính; nó là quy trình. Một EDI 824 application advice được gửi ngược về supplier để flag lô hàng. Receiving phải nhập tay các SSCC không đọc được từ phần human-readable text dưới mã vạch. Lô hàng trượt receiving slot. Một compliance chargeback theo nhóm “labelling violation” đánh vào tài khoản supplier: trong năm 2026, phần lớn retailer lớn tính 5-10 USD cho mỗi carton không compliant, đôi khi tính theo pallet. Với lô này, chi phí trực tiếp là 30-60 USD, chỉ như lỗi làm tròn.

Chi phí thật nằm ở phần sau. Vi phạm labelling lặp lại đẩy supplier vào buyer review status, làm PO tương lai đi qua audit compliance chặt hơn và đẩy họ xuống routing tier kém thuận lợi hơn. Một vài pallet lỗi mỗi quý chưa kích hoạt điều này; một vấn đề có hệ thống từ PDF stack cấu hình sai thì có, vì cùng template đi theo mọi lô hàng.

Post-mortem phía engineering của supplier thường mất nhiều tuần vì không ai trong đội nghĩ “mã vạch trong PDF” là một thứ có cấu trúc nội bộ đáng kể. Họ nghĩ nó chỉ là mã vạch. Phát hiện rằng PDF chứa bitmap PNG 300 dpi, rồi printer nhiệt tại DC phải resample xuống 203 dpi và làm nhòe độ rộng thanh quá tolerance, thường chỉ xuất hiện sau khi báo cáo chargeback đầu tiên buộc đội phải điều tra sâu hơn.

Câu chuyện 2: lô Amazon FBA với chargeback âm thầm

Trường hợp này yên lặng hơn, lớn hơn và khó phát hiện hơn.

Một seller Fulfilled-by-Amazon gửi 50.000 đơn vị của một SKU vào FBA inbound. Mỗi đơn vị có label chứa FNSKU (định danh per-SKU của Amazon) được in thành mã vạch. Với một template xấu điển hình, 2-5% đơn vị đến kho FBA có barcode không scan được ở lần inbound scan đầu tiên, vì thanh bị nhòe quá mức. Amazon không từ chối shipment. Họ route các đơn vị bị ảnh hưởng sang relabel thủ công và charge seller một khoản cố định mỗi relabel. Tính đến 2026, phí đó là 0,25 USD mỗi đơn vị.

Với một shipment 50.000 đơn vị và tỷ lệ fail 5%, chi phí chargeback trực tiếp là 625 USD. Với seller làm việc này mỗi tháng, đó là 7.500 USD/năm lãng phí thuần, và đó mới là dòng chargeback rõ ràng. Chi phí ẩn lớn hơn: hàng bị relabel mất nhiều thời gian hơn để nhận vào FBA, nên chưa sẵn sàng cho buy box, traffic khuyến mãi trượt, doanh thu giảm đúng lúc launch cycle cần nhất.

Seller thường chỉ phát hiện khi đào sâu báo cáo FBA inbound defect & reimbursement trong Amazon Seller Central. Trước đó, line item thường bị ghi nhận như “Amazon kỳ lạ”. Root cause thật, một barcode generator emit PNG 300 dpi thay vì barcode vector, nằm cách đó nhiều tháng ở upstream và hiếm khi được nối với báo cáo chargeback, trừ khi có người từng điều tra kiểu này.

Câu chuyện 3: dòng exception ở UPS / FedEx

Trường hợp thứ ba không có chargeback trực tiếp, chính vì vậy nó vô hình nhất.

Khi một parcel đi vào facility phân loại của UPS hoặc FedEx, scanner trên băng chuyền đọc mã tracking của carrier trong vài millisecond. Nếu đọc fail, vì thanh bị nhòe quá tolerance, quiet zone bị crop hoặc modulation grade D, parcel không bị từ chối. Nó bị kéo khỏi main belt và route sang exception-handling line, nơi một người nhập tay tracking number từ human-readable text. Parcel quay lại mạng lưới với độ trễ 12-24 giờ.

Carrier thường không chargeback trực tiếp cho việc này. Chi phí xuất hiện ở nơi khác:

  • Ticket chăm sóc khách hàng tăng với câu hỏi “bạn nói đã gửi, hàng tôi ở đâu?”
  • NPS khách hàng giảm trên các shipment thật ra đúng giờ, nhưng bị route qua manual.
  • Audit tài khoản carrier theo thời gian flag supplier là vấn đề labelling. Pickup tương lai bị soi kỹ hơn, gia hạn contract khó hơn, đàm phán rate tệ hơn.

Một parcel xấu không tốn gì đo được. Mười nghìn parcel xấu mỗi tháng trong một năm sẽ làm tổn hại quan hệ.

Điểm chung của cả ba câu chuyện

Trong mọi câu chuyện, bug không nằm ở dữ liệu, thiết kế, printer hay scanner. Nó nằm ở một lựa chọn upstream: mã vạch đến printer dưới dạng một bức ảnh, không phải drawing instructions. Ảnh không sống sót tốt khi bị resize cho printer lạ. Drawing instructions thì có.

Vì sao điều này phổ biến

Phần khó không phải tạo barcode vector riêng lẻ; thư viện barcode hiện đại có thể emit SVG chính xác. Phần khó là embed barcode vector đó vào PDF như native PDF path operators, thay vì embed như image. Dịch SVG paths thành PDF path operators đòi hỏi PDF generator và barcode engine được thiết kế cùng nhau. Lối tắt là gọi thư viện barcode, lấy output PNG của nó, rồi embed PNG như một Image XObject. Ở tầng framework, cách này dễ nối dây hơn rất nhiều. Vì vậy phần lớn PDF stack chọn nó. Từ góc nhìn của kho, chính lối tắt kiến trúc đó là thứ đi tới thermal printer và tạo chargeback.

Đó là takeaway cho người không chuyên. Nếu bạn dừng ở đây, bạn đã đủ để hỏi bất kỳ vendor PDF nào câu đúng và yêu cầu đội engineering chạy kiểm tra ba phút ở cuối bài.

Cho QA và ops lead: grade sụp xuống như thế nào

Các chuẩn mà scanner kho của bạn đã dùng

Hai chuẩn ISO định nghĩa “barcode tốt” nghĩa là gì ở receiving dock:

  • ISO/IEC 15416 cho mã tuyến tính 1D như Code 128, GS1-128, ITF-14, EAN, UPC.
  • ISO/IEC 15415 cho mã ma trận 2D như QR, DataMatrix, PDF417, Aztec.

Một verifier trong phòng lab đo bảy tham số trên symbol đã in và trả một grade tổng thể từ A (4.0) xuống F (0.0). Thang ANSI là cùng một thứ với chữ cái khác. Manual của Walmart, Amazon, Target, Costco và các carrier lớn đều tham chiếu các chuẩn này và thường yêu cầu grade C trở lên. Dưới C được xem là out-of-spec; dưới D bắt đầu kích hoạt bộ máy chargeback bạn đã đọc ở trên.

Bảy tham số và tác động của raster barcode lên từng tham số:

Tham số Verifier kiểm tra gì Vì sao raster PNG làm hỏng
Decodability Độ rộng thanh có nằm trong tolerance spec không? Resampling làm độ rộng lệch khỏi spec, thường là tham số rơi đầu tiên
Edge contrast Chuyển tiếp thanh/khoảng trắng có sắc không? Anti-aliasing khi resize tạo pixel xám ở mép
Modulation Tương phản sáng/tối có đều trên toàn symbol không? Dithering của print driver biến thanh đặc thành dot pattern
Defects Có chấm lạ hoặc lỗ trắng không? Artifact resample trở thành chấm mực thật trên label
Min reflectance Thanh có đủ tối không? Resampling có thể để lại lỗ bên trong thanh hẹp
Symbol contrast Tương phản tổng thể giữa thanh và nền? Nén PDF lossy làm phẳng contrast
Quiet zone Khoảng trắng bắt buộc quanh symbol? Tool auto-crop ăn vào đó

Barcode vector giữ mọi tham số gần A vì không có lưới pixel nguồn để resample. Barcode raster thường mất nửa grade ở mỗi tham số; cộng năm hoặc sáu tham số như vậy, trung bình sẽ rơi xuống C hoặc D. Dữ liệu giống nhau. Encoding giống nhau. Barcode nhìn giống nhau trên màn hình. Chỉ symbol đã in khác, và verifier cũng như scanner kho đo symbol đã in, không đo thứ QA nhìn trong Acrobat.

Vì sao printer làm hỏng thêm

Một PNG raster embed trong PDF đi qua sáu giai đoạn resampling từ lúc “click Print” đến lúc label ra khỏi printer. Mỗi giai đoạn có thể lấy đi khoảng nửa grade.

  1. Viewer rasterize cho màn hình. Acrobat hoặc PDF reader interpolate PNG nguồn lên lưới pixel màn hình. Nhìn vẫn ổn, và đó là thứ đánh lừa QA.
  2. Print driver rasterize cho giấy. Driver chọn bilinear hoặc bicubic interpolation để fit pixel nguồn vào lưới printer. Edge contrast sụp xuống.
  3. Color conversion. Pipeline đi qua CMYK hoặc grayscale conversion áp thêm một resample, thường kèm halftone dithering. Modulation sụp xuống.
  4. “Fit to printable area”. Nhiều driver mặc định scale trang 99% để tránh cắt mép. Decodability trôi thêm một phần grade.
  5. PDF/A flattening. Chuyển đổi archival PDF thường re-rasterize vùng có transparency. Mất thêm nửa grade.
  6. Thermal head smear. Ribbon và direct-thermal media nhòe 2-4 mil dưới nhiệt. Renderer vector có thể bù; raster source thì không.

Cộng các chi phí lại, barcode rời renderer ở grade A có thể tới scanner ở grade C-D. Đó là phép tính vận hành. Vector path operators bỏ qua hoàn toàn giai đoạn 2-4, vì không có lưới pixel nguồn để resample; rasterizer của printer tự tính thanh ở native DPI từ đặc tả toán học.

Nếu bạn là QA lead và dừng ở đây, action item là thuê một ISO 15416 verifier trong một tuần, khoảng 1.000-2.000 USD, từ vendor như Cognex, Keyence hoặc REA VeriCube. Lấy mẫu 50 nhãn production từ flow retailer volume cao nhất. Nếu grade trung bình dưới B, bạn có vấn đề raster barcode.

Cho engineer: bên trong PDF thật sự có gì

Hai cách barcode nằm trên trang

PDF định nghĩa đúng hai loại object nhìn thấy được:

  • Path: danh sách drawing operators (re rectangle, f fill, m/l move/line, S stroke) ở tọa độ floating-point. Rasterizer của printer tự đánh giá chúng ở độ phân giải native của thiết bị.
  • Image XObject: bitmap embed có width/height theo pixel, encode dưới dạng PNG / JPEG / raw stream. Renderer phải map lưới pixel nguồn lên lưới pixel thiết bị, và điều đó luôn cần resampling.

Một Code 128 vector với 60 thanh tạo khoảng 60 cặp re/f trong content stream, tổng dưới 1 KB. Tọa độ float chính xác tới 0,001 mm. Một Code 128 raster tạo một operator Do /Im0 trỏ tới PNG embed, thường khoảng 270 KB ở 300 dpi.

% Vector — what the renderer should produce
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 — what most stacks actually produce
348 0 0 84 0 0 cm      % scale a 348×84 pixel image to 92mm × 22mm
/Im0 Do                % insert the embedded PNG (~270 KB)

Vector giữ đặc tả gốc tới tận printer. Raster đóng băng thanh ở DPI nguồn và buộc mọi printer downstream phải đoán.

Kiểm tra bất kỳ PDF nào trong 3 phút

Ba check, không cần công cụ đặc biệt ngoài poppler-utilsqpdf (miễn phí trên Linux/Mac/WSL):

1. Zoom lên 800%. Barcode vector vẫn sắc ở mọi mức zoom. Raster pixelate rõ rệt, bạn có thể đếm pixel nguồn. Đây là kiểm tra không chính thức nhanh nhất.

2. Liệt kê ảnh embed:

$ 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

Nếu bạn thấy một dòng khớp aspect ratio của barcode, ví dụ 348 x 84 cho mã 1D rộng hoặc hình vuông cho mã 2D, barcode đó là ảnh raster. Barcode vector không xuất hiện trong output này.

3. Inspect content stream:

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

Một Code 128 vector với 60 thanh tạo cụm dày đặc các operator re/f. Nếu bạn thấy một operator Do /Im0 mà không có cụm rectangle gần vị trí barcode, đó là ảnh raster.

Verifier chuyên nghiệp như Cognex, Keyence hoặc REA VeriCube có giá 5.000 USD+ và trả report ISO 15416 chính thức. Phần lớn đội chỉ đến bước đó sau khi chargeback đã kích hoạt điều tra; ba check ở trên cho bạn biết miễn phí mình đang ở phía nào của vấn đề.

gPdf làm gì

Barcode rendering của gPdf đến từ xBarcode, một sản phẩm chị em do cùng đội xây dựng. xBarcode là engine barcode bằng Rust, tự phát triển hoàn toàn, không bọc thư viện bên thứ ba, và renderer gPdf gọi trực tiếp. Với symbology tuyến tính và ma trận như Code 128, GS1-128, QR, Data Matrix, PDF417, Aztec, ITF, EAN, UPC và phần lớn hơn 30 format được hỗ trợ, xBarcode tính pattern thanh/cell rồi gPdf emit vào PDF content stream dưới dạng rectangle operators re/f ở tọa độ float. Không PNG trung gian, không DPI nguồn, không raster surface.

Hai hệ quả đáng chú ý:

  • Engine có thể kiểm chứng public. xBarcode cũng chạy như một công cụ online miễn phí độc lập tại xbarcode.ai. Bất kỳ ai cũng có thể paste payload, tải SVG / PNG / EPS và inspect path output trước khi tin bất kỳ claim nào về gPdf. Path output đó là thứ đi vào PDF của gPdf. Đây là cách kiểm tra credibility mà claim “chúng tôi emit vector barcode” thường không vượt qua được.
  • Hiệu năng đo được. xBarcode tạo một mã 1D chuẩn trong khoảng 4 µs trên một core (v1.5.4). Benchmark đã công bố cho thấy nhanh hơn fast_qr 6 lần và nhanh hơn rxing 30 lần. End-to-end qua runtime Cloudflare Workers của gPdf, điều đó chuyển thành khoảng 30 ms p50 toàn cầu.

Ngoài path output, xBarcode xử lý lớp GS1 mà hầu hết thư viện barcode bên thứ ba bỏ qua: registry 750+ Application Identifiers với mode validation strict / lenient, tự động chèn FNC1 separator, và check độ dài cùng character set theo từng AI. Chuỗi element (01)09504000059101(17)260315 của bạn được validate với spec trước khi encode, không phải sau chargeback.

PDF/A-1b đến 4 compatible theo thiết kế; không cần flattener pass. Determinism chính xác: cùng một DocumentRequest tạo content stream byte-identical giữa isolates và releases.

Khi raster vẫn có thể chấp nhận

Hai trường hợp thật:

  • Tài liệu chỉ dùng nội bộ và không cần scan đáng tin cậy. Raster không quan trọng, nhưng cũng không tiết kiệm gì vì vector cũng miễn phí.
  • Logo ảnh có barcode khóa trong artwork vì lý do marketing. Khi đó scan reliability là technical debt có ý thức, không phải oversight.

Với mọi thứ còn lại, như shipping labels, FNSKU labels, payslips, barcode dòng hóa đơn, voucher PDF, QR code vé, retail trade-item labels, pharmaceutical serialisation, vector là lựa chọn duy nhất không đẩy rủi ro print pipeline xuống downstream.

Kết luận

Khi chọn PDF stack cho bất kỳ workflow nào kết thúc bằng scan, câu hỏi không phải “nó có hỗ trợ QR / Code 128 / GS1-128 không”. Câu hỏi là:

Khi tôi yêu cầu một barcode, kết quả là drawing instructions hay một ảnh embed?

Nếu câu trả lời là ảnh, tỷ lệ scan failure của bạn có một đáy mà không calibration X-dimension, thay font hay bảo trì printer nào có thể hạ thấp. Chargeback Walmart, line item 0,25 USD của Amazon, độ trễ exception của carrier: đó không phải vấn đề vendor hay kho. Đó là tính chất của bytes rời renderer của bạn.

Việc rẻ nhất hôm nay là chạy pdfimages -list trên 100 PDF label outbound gần nhất. Đếm số dòng trả về image object có hình barcode. Hãy xem con số đó là kích thước của một cuộc audit compliance chưa được thông báo đang chờ xảy ra.

Xem thêm