What Code 16K is
Code 16K is a stacked variant of Code 128: instead of one wide row of bars, it re-flows the same Code 128 character set (all 128 ASCII values, plus FNC1-FNC4 function codes) into 2 to 16 short rows stacked on top of each other, separated by thin guard bars. This gives it Code 128's full character set and checksum discipline in a much narrower, taller footprint -- useful when a label has little horizontal room but more vertical room. bwip-js draws it with its own dedicated matrix renderer -- confirmed directly: bwipp_code16k builds its own row/codeword layout and calls bwipp_renmatrix() itself, with no delegation to the separately-covered Code 128 capability's own function.
Generate it now
Enter any text or data to see a live preview -- Code 16K accepts the same character range as Code 128.
Valid input
Up to 500 characters of any byte value 0-255 is accepted (bwipp.code16kinputTooLong rejects longer input). How many rows that data needs depends on the row count: leaving rows on its automatic default lets bwip-js pick the smallest row count (2-16) that fits; fixing rows to a value too small for the payload is rejected outright rather than silently re-encoded.
Key options
Supported options include rows, rowheight, and sepheight. Real, literal defaults: rows 0 (auto-select the smallest row count, 2-16, that fits), rowheight 8 (points per data row), sepheight 1 (points for the thin separator bar drawn between rows). There is no includetext option at all -- Code 16K has no human-readable text line of its own.
Output and printing
Export SVG for vector-precise label artwork or PNG for a quick proof.
Common uses
Code 16K is an AIM-standardized symbology used for small-item marking (electronics components, small pharmaceutical packaging) where the item is too narrow for a full-length linear Code 128 barcode but tall enough to accept a multi-row stack.
Example
See the live preview above, seeded with a bwip-js-verified valid value.
Size guidance
Each row uses the same fixed 81-module width as every other row; only the number of rows (2 to 16) and the row/separator heights change the overall bounding box.
Troubleshooting
A rejected value with a fixed rows setting usually means the payload needs more rows than the fixed count allows -- either raise rows or leave it on its automatic default.
Related formats
Related formats: the separately-covered Code 128 generator (the same character set and checksum discipline, drawn as a single linear row instead of a stack).
FAQ
Why was my value rejected when a fixed row count is set?
A fixed row count must have enough capacity for the encoded payload -- Code 16K's own automatic default already picks the smallest row count that fits, so a fixed value lower than that is rejected rather than silently overridden.
Does Code 16K have a human-readable text line like Code 128?
No -- Code 16K has no includetext option at all; the encoded data is only ever represented as the stacked bar rows themselves.