How to Print Barcodes on Thermal Label Printers: A Complete Guide
Written by Tomasz Lichosik
Ready to generate barcodes?
Create high-quality labels in seconds.
Thermal printing runs logistics, retail, and warehousing: fast, durable, no ink cartridges. But getting a genuinely scannable, compliant code out of one comes down to a few technical details that most guides skip. This walks through all of them — how thermal printing works, how to size a code for the printer you own, and the exact settings that give you crisp, error-free barcodes run after run, whether you run a Zebra, a Dymo, or a Brother.
Direct thermal or thermal transfer?
Instead of spraying or fusing ink, a thermal printer applies controlled heat to a treated label. There are two approaches, and picking the wrong one for the environment is the first mistake.
Direct thermal (DT) heats heat-sensitive paper until it darkens. No ribbon, no ink, low cost per label — the common choice for shipping labels (Dymo, many Zebra models). But the media is sensitive to heat, light, and friction: a label left in sunlight or warmth will eventually darken or fade until the code is unreadable. It is the right choice for short-life uses: shipping labels, fresh-food labels, visitor badges.
Thermal transfer (TT) melts ink from a wax, wax-resin, or resin ribbon onto the label, bonding the pigment in. It is far more durable — resistant to moisture, heat, chemicals, abrasion, and UV fading — at the cost of buying and changing ribbons. Reach for it on long-term asset tags, chemical-drum labels, outdoor storage, and lab samples. Pairing the right stock and ribbon (polyester labels with resin ribbons, for instance) is what lets a code survive being knocked about in transit.
This matters because the physics of heat transfer is what sets the sharpness of your bars, and knowing your printer type tells you how to handle the darkness setting below.
The setting that decides everything: DPI
Every thermal printer prints at a fixed resolution in dots per inch:
- 203 DPI — entry and mid-range (Zebra ZD230, Dymo LabelWriter 4XL); one dot ≈ 0.125 mm. Fine for 4×6 shipping labels and larger linear codes.
- 300 DPI — professional (Zebra ZT411, Honeywell PM45); one dot ≈ 0.085 mm. The sweet spot for retail labels, small codes on electronics, and dense text.
- 600 DPI — high-precision industrial, for tiny components like DataMatrix on circuit boards.
The key idea is the X-dimension — the width of the narrowest bar or space. Standards set a minimum per symbology (EAN-13 is 0.33 mm at 100%; Code 128 is 0.25 mm). The critical rule: your X-dimension has to be a whole-number multiple of the printer's dot size. Ask the printer for a line 1.5 dots wide and it will waver between 1 and 2 dots, giving you uneven bars — invisible to your eye, but enough to cause intermittent failures at high throughput. On a 203 DPI printer (0.125 mm dots), 0.25 mm and 0.375 mm are clean; 0.33 mm forces an approximation.
How big should the barcode be?
Sizing follows directly from the X-dimension, and the right value depends on the weakest scanner that will ever read the label, not the best one:
- Industrial scanners typically read down to about 0.25 mm.
- Handheld and mobile scanners usually want 0.33–0.5 mm to be reliable.
Sensible starting dimensions by application:
| Label type | Format | Typical width | Typical height |
|---|---|---|---|
| Small asset tag | QR / DataMatrix | 10 × 10 mm | — |
| Shipping label | Code 128 / ITF-14 | 40–60 mm | 15–25 mm |
| Retail product | EAN-13 | 30–37 mm | 20–25 mm |
| Inventory bin | Code 39 | 50 mm+ | 10–15 mm |
Two sizing habits keep you honest: never use "Fit to Page" (it nudges the X-dimension off-standard — always print at 100%), and leave 2–3 mm of extra margin around the code, because thermal labels shift a little as they feed.
Use vectors (SVG), not raster (PNG/JPG)
This is the most ignored advice in thermal printing, so plainly: never print a barcode from a PNG or JPG on a thermal printer.
When a raster image does not exactly match the DPI-scaled size, the design software resamples the pixels to fit. Even a 1% change triggers anti-aliasing, which paints grey pixels along the bar edges — and to a scanner a grey bar reads as a narrower bar, which can break the code. An SVG is a mathematical description of the shapes; your label software (ZebraDesigner, BarTender, NiceLabel, even Word) renders it at the printer's native DPI with no sampling, no approximation, no grey — the driver lines the vector edges up with the printer's physical heating elements.
| Format | Blur risk | File size | Use for |
|---|---|---|---|
| SVG | None (vector) | Small | Always preferred |
| None (vector) | Medium | Good for print dialogs | |
| PNG (300+ DPI) | Low if sized exactly | Large | Screen display only |
| PNG (72–96 DPI) | Very high | Small | Never for printing |
| JPG | Very high (compression) | Varies | Never for barcodes |
Darkness and speed: the Goldilocks settings
A clean code is a balance between how hot the head gets and how fast the label moves under it.
Darkness (burn temperature) sets the current to the heating resistors, and barcode quality lives or dies by it.
Too little and the head never reaches the activation point of the paper or the ribbon's melting point — the bars come out light grey, speckled, or patchy instead of solid black; without enough contrast between bars and spaces, scanners fail. Common triggers: a new label batch, less sensitive paper, or a cold room.
Too much and the heat bleeds sideways into the white spaces, bloating the bars. The X-dimension effectively grows and the bar-to-space ratio drifts out of tolerance — it looks fine to the eye but fails at retail checkouts and GS1 checks. Common trigger: keeping the old setting after switching to more heat-sensitive labels.
Speed (IPS) matters too: faster runs give the head less time to heat each row. For barcodes that have to scan reliably, drop to 3 or 4 IPS so the elements heat and cool cleanly and the edges stay sharp.
To dial it in: print at the factory default (usually 50–60%), scan it with a verifier or your handheld, then adjust darkness in steps of 5 and reprint until the bars are solid black with clean white gaps. Keep the lowest heat that gives an instant, effortless read, and save that as a printer profile for that label roll — then recalibrate on every new roll, since paper sensitivity varies between batches.
Label size and alignment
A frequent failure has nothing to do with the image: the software thinks the label is a different size than it is. If the driver believes it is 4×6" but the roll is actually 3.9×5.8", the code gets stretched, clipped, or mispositioned.
To set it right: measure the labels physically (calipers if you have them, don't trust the box), set that exact size in your label software (ZebraDesigner → Label Properties → Size; BarTender → Label Format), set the same size in the printer driver's page setup, and print at exactly 100% — even 99% can break compliance.
The quiet zone
Every standard requires a quiet zone — blank margin on the left and right (all four sides for 2D codes):
- Code 128 / EAN-13: 10× the X-dimension each side.
- QR Code: 4 modules on all sides.
- DataMatrix: 1 module on all sides.
The classic trap is a template that looks perfect on screen but lets a product name or logo creep too close to the bars. If your software has a quiet-zone highlight mode, check the template in it.
Look after the printhead
A single speck of dust, lint, or adhesive on the printhead insulates the elements behind it and leaves an unprinted white line down the label — and a missing line can change a code's value or break its checksum.
Make cleaning a habit on every roll change:
- Power the printer off.
- Open the printhead and let it cool.
- Use a thermal cleaning pen or a lint-free cloth with 99% isopropyl alcohol.
- Wipe the heating line (the dark strip underneath) gently in one direction.
- Let it dry fully before reloading and powering back on.
A pre-run checklist
Before every new production run:
- Format — generated as SVG or PDF, never raster.
- Size — software dimensions match the physical roll exactly.
- Scale — print dialog at 100%, no "fit to page."
- DPI — printer resolution matches what the code was optimised for.
- Darkness & speed — calibrated for this specific roll with a test print.
- Quiet zone — margins respected on all sides.
- Graphics mode — "Monochrome" or "Line Art," no dithering.
- Printhead — cleaned on the last roll change.
- Scan test — scan a sample from the run before committing the whole batch.
Common faults and fixes
| Problem | Likely cause | Fix |
|---|---|---|
| Won't scan | PNG used, low DPI | Regenerate as SVG |
| Printing cut off | Wrong label size in driver | Match software dimensions to the physical label |
| Bars too faint | Darkness too low | Raise darkness ~10%, retest |
| Bars bleeding together | Darkness too high | Lower darkness 5–10%, reduce speed, retest |
| White line down the whole label | Dead printhead element, or dust/adhesive buildup | Clean the head; if the line stays in the same spot, the head needs replacing |
| Works sometimes | X-dimension mismatched to DPI | Recalculate X-dimension to the dot size |
| Fails retail scan | Missing quiet zone | Add ≥10× X-dimension margin both sides |
| Labels skip or feed without stopping | Gap/black-mark sensor misaligned or dirty | Recalibrate the sensor or clear paper dust off it |
Get the material, format, size, DPI, darkness, and quiet zone right and keep the head clean, and A-grade scans stop being luck. BarcodeReady exports vector SVG and PDF that comply with GS1/ISO and include the correct quiet zones by default, so the file you send the printer is already correct.