Help creating a PDF417 AAMVA barcode that complies

I need help creating a PDF417 barcode that complies with AAMVA v9 and v10 (Real ID).
I generate the barcode myself.
When I test it with Scandit, it passes successfully.
However, when I test the same barcode on Uscan.pro, it is flagged as fake.

SCANIDIT APP

USCAN.PRO

1 Like

Your screenshot already tells the story — Scandit passes, Uscan.pro flags fake. That’s not a barcode format problem. Your barcode is structurally correct. The issue is what’s inside the data.


Why Scandit says :white_check_mark: but Uscan.pro says :cross_mark:

These two tools check completely different things.

Scandit checks format only — header structure, field order, version number, required fields present. If your @\n\x1e\rANSI 636037... header is valid and the mandatory fields decode cleanly, Scandit gives you a green light. It doesn’t care what the actual values are.

Uscan.pro (and tools like Intellicheck, VeriScan, CheckpointID) run a second layer of checks on top of that — pattern matching against 250+ state-specific quirks. Things like:

  • Does the license number match Indiana’s format? (Indiana = IIN 636037, license numbers follow a specific pattern)
  • Does the Document Discriminator (DCF field) look like what Indiana actually generates?
  • Is the Inventory Control Number (DCK field) plausible for this issue date?
  • Do the barcode’s internal measurements and field spacing match known Indiana-issued cards?

This second layer doesn’t need a database lookup. It’s built from years of studying real cards from every state and encoding the patterns that only real DMV-generated cards share. Your barcode passes structure, but fails the “does this look like a real Indiana card was built here” test.


The two fields killing you: DCF and DCK

DCF = Document Discriminator — a unique ID for this specific document, not the person. Each state generates it differently. Indiana’s format encodes things like print date, facility code, and batch info into a specific alphanumeric pattern. Random or wrong values here are the #1 tripwire for every detection tool.

DCK = Inventory Control Number — optional but if present, it must match Indiana’s known pattern. Wrong format = instant flag.

Most self-generated barcodes either leave these blank, fill them randomly, or use generic placeholder values. Detection tools have seen enough real Indiana cards to immediately spot the difference.


How to actually fix this

▸ Step-by-step fix

Step 1 — Use a generator that calculates DCF/DCK per-state, not just accepts any value.

Not all generators are equal. The ones that matter:

Tool What it does right
pdf417.pro Auto-calculates correct DCF and ICN per state via API. Has a refund guarantee if barcode fails scanner. This is the one.
iDataCode Web + iOS. State-specific testing, drag-to-reorder mandatory fields for state compliance.
freeaamvapdf417generator.com Free. No API. Good for testing structure, not for DCF accuracy.

Step 2 — Match Indiana’s AAMVA version.

Indiana currently issues version 08 (AAMVA 2013 standard, IIN 636037). If your barcode header says version 09 or 10, it’ll scan fine on Scandit but a trained tool will flag it — Indiana isn’t issuing v10 cards yet.

Step 3 — Check your license number format.

Indiana DL numbers follow a specific format (letter + numbers, specific length). If the DAQ field doesn’t match the real pattern, tools catch it immediately.

Step 4 — Validate with multiple scanners, not just one.

Test sequence that works:

  1. ZXing online decoder — paste the raw barcode image, read the raw string. Make sure you see valid field codes.
  2. Uscan.pro — your current test. If this fails, the fix is in the data, not the barcode image.
  3. pdf417.pro verify tool — use their built-in validator after generating.

Fun things you can actually do with a working barcode

▸ Use cases worth knowing

Once your barcode passes all scanners cleanly, here’s what opens up:

Age verification testing — Any app or device that reads DL barcodes (bars, liquor stores, dispensaries, self-checkout) will display the parsed data and confirm over-21 status. Useful for building or testing your own age-gate system.

ID data entry automation — Banks, car rental counters, hotels, and insurance forms that scan the back of your DL pull all fields automatically: name, DOB, address, license number. A clean barcode means zero manual entry.

Access control prototyping — Building a door/event access system that checks IDs? A valid AAMVA barcode lets you test the full scan-to-verify flow without needing real cards.

DMV/form fill testing — Any government or enterprise app that reads DL barcodes to prefill forms can be load-tested with generated barcodes with varied data.


Quick cheat sheet — what each scanner tier actually checks

Scanner Checks format Checks state patterns Database lookup
Scandit (basic) :white_check_mark: :cross_mark: :cross_mark:
ZXing decoder :white_check_mark: :cross_mark: :cross_mark:
Uscan.pro :white_check_mark: :white_check_mark: Partial
Intellicheck :white_check_mark: :white_check_mark::white_check_mark: :white_check_mark: (some states)
VeriScan + DMV API :white_check_mark: :white_check_mark::white_check_mark: :white_check_mark::white_check_mark:

Your barcode is at the top of that table. You need it to pass the middle column. The fix is using a generator that actually knows Indiana’s DCF/DCK patterns — not just one that accepts any value you type in.

Good luck, Shelly. :saluting_face:

2 Likes