PDF417 is a stacked 2D barcode — it looks like a tall, fat 1D code rather than a square QR. The structure is a stack of small 1D rows, which lets older 1D-style laser scanners read it with a 'raster' scan motion.
You see PDF417 on driver licenses (the AAMVA standard), TSA boarding passes, FedEx tracking labels, and many shipping documents.
Generated by JavaScript in your browser. Nothing is uploaded; nothing is stored on our servers.
At a glance
| Standard | ISO/IEC 15438 (2015) — ISO/IEC 15438 |
|---|---|
| Symbology family | Stacked 2D; multi-row, variable-length |
| Maximum capacity | 1,850 ASCII text · 2,710 numeric digits · 1,108 binary bytes |
| Codeword structure | 17 modules wide × 4 bars + 4 spaces per codeword (hence the name) |
| Error correction | Reed-Solomon, 9 user-selectable levels (0–8); level 5 = ~25% damage recovery |
| Required by | AAMVA driver licenses (US/CA), IATA BCBP boarding passes (Section 4) — IATA BCBP standard |
| Year introduced | 1991 (Symbol Technologies); ISO standardized 2001, revised 2015 |
“PDF417 codewords are 17 modules wide and contain 4 bars and 4 spaces. The symbol contains between 3 and 90 rows, each row containing between 1 and 30 codewords.”
Why PDF417 is still around
Two reasons. First: laser scanners with a 2D raster head can read PDF417 — they cannot read Data Matrix or QR. Many legacy systems can't be upgraded. Second: the stacked rectangular shape fits more naturally on long thin labels like boarding passes.
For greenfield 2D applications without a laser-scanner constraint, Data Matrix or QR is usually denser per square millimeter.
Capacity
Up to about 1,800 ASCII characters per code. Higher-error-correction levels reduce capacity in exchange for damage tolerance.
Frequently asked questions
- Why is PDF417 long and thin instead of square?
- Because it's stacked: each row is a 1D-style barcode. This lets old laser scanners read it line-by-line. Square 2D codes need a camera scanner.
- Can I encode binary data?
- Yes — PDF417 supports a binary compaction mode. Our default encoder picks the right mode automatically based on your input.