Data Matrix and QR codes
Generate Data Matrix (ECC 200, all 30 sizes) and QR Code (versions 1–40, levels L–H) symbols, with GS1 element strings and FNC1, as SVG or PNG at a module size that prints in whole printer dots, one at a time or in batches for A4 label sheets and ZIP files. Check GS1 element strings against the GS1 Barcode Syntax Dictionary and read codes from a camera or a keyboard-wedge scanner. Everything runs in your browser.
Everything runs in this browser: nothing is uploaded or stored, and the camera picture never leaves the page. The encoders are FactoKit’s own (no library) and are checked by decoding thousands of their symbols with zxing-cpp and libdmtx; see the Method.
Content and symbol
GS1: AIs in brackets, (01)…(17)…(10)…, or unbracketed with separators typed as <GS>, ␝ or ^. FNC1 is added first and after every variable-length AI that is not last; the brackets are never encoded.
Print size
A printer can only print whole dots: at 300 dpi a module of 0.5 mm is 5.9 dots and is printed as 6 (0.508 mm). With “Whole printer dots” the module is rounded to whole dots so that every module prints the same width; the size and the PNG follow it.
Runs in this browser. Data is not uploaded or stored.
Symbol
GS1 DataMatrix 20 × 20 (ECC 200): 19 of 22 data codewords used (86 %), 18 error correction codewords; they correct up to 9 codewords in error. Module (X dimension) 6 printer dots at 300 dpi = 0.508 mm (0.5 mm requested); with the quiet zone of 1 module the code needs 11.18 × 11.18 mm.
SVG: vector, sized in millimetres, for label software and print shops. PNG: whole pixels per module at the printer resolution (marked in the file), for printers that take images. Test-print the code and read it with the scanner it is meant for.
| Scheme | Characters | Codewords | Note |
|---|---|---|---|
| ASCII | 0 | 1 | FNC1 in first position (GS1) |
| ASCII | 32 | 18 | 1 codeword per character, 2 digits per codeword |
| AI | Title | Format | Value | Meaning | Check |
|---|---|---|---|---|---|
| (01) | GTIN | N14 (predefined length) | 09506000134352 | GTIN-13 9506000134352; check digit 2 correct | OK |
| (17) | USE BY or EXPIRY | N6 (predefined length) | 271231 | 2027-12-31 | OK |
| (10) | BATCH/LOT | X..20 | ABC123 | OK |
GS1 element string
Bracketed: (01)09506000134352(10)ABC123, a “(” inside a value written as \(. Unbracketed: 010950600013435210ABC123 with the separator typed as <GS>, {GS}, ␝, \x1D or ^; a symbology identifier (]d2, ]Q3, ]C1) at the start is removed.
Check digit calculator
- As GTIN-13 / GLN without its check digit: check digit 2 → 9506000134352
- As a complete GTIN-12 (UPC-A): check digit 5 is wrong; the digits before it give 9
Runs in this browser. Data is not uploaded or stored.
Check
Valid: 5 elements, 1 FNC1 separator after variable-length AIs, 51 data characters.
- Human-readable (HRI)
- (01)09506000134352(3103)001250(17)271200(10)ABC123(21)S-0042
- Data for the symbol (␝ = FNC1 separator)
- 010950600013435231030012501727120010ABC123␝21S-0042
- GS1 syntax engine notation (^ = FNC1)
- ^010950600013435231030012501727120010ABC123^21S-0042
| AI | Title | Format | Value | Meaning | Check |
|---|---|---|---|---|---|
| (01) | GTIN | N14 (predefined length) | 09506000134352 | GTIN-13 9506000134352; check digit 2 correct | OK |
| (3103) | NET WEIGHT (kg) | N6 (predefined length) | 001250 | 1.250 kg | OK |
| (17) | USE BY or EXPIRY | N6 (predefined length) | 271200 | 2027-12 (day 00: end of the month, 2027-12-31) | OK |
| (10) | BATCH/LOT | X..20 | ABC123 | OK | |
| (21) | SERIAL | X..20 | S-0042 | OK |
Camera
Reading from the camera needs JavaScript and a browser with BarcodeDetector (Shape Detection API); the scanner field below works in every browser.
Scanner (keyboard wedge)
USB and Bluetooth scanners type the code and press Enter. GS cannot be typed: a scanner sends it as Ctrl+] (shown here as ␝) or, if set up so, as text such as <GS>. A symbology identifier at the start (]d2 GS1 DataMatrix, ]Q3 GS1 QR Code …) is read and removed.
Runs in this browser. Data is not uploaded or stored.
Reads
No reads yet. Start the camera, scan into the field, or try the example scan.
Codes
Paste, open a CSV, TSV, TXT or XLSX file (up to 20 MB), or drop it on the field. Files are read in this browser only.
Data Label (01)09506000134352(21)S-0001 Carton 1
1 row = 1 code
Columns: tab, ; or ,
Decimals: 12,5 or 12.5
Read as: tab-separated · whole numbers · 6 rows · header row skipped
| # | Data | Label |
|---|---|---|
| 1 | (01)09506000134352(17)271231(10)ABC123(21)S-0001 | Carton 1 |
| 2 | (01)09506000134352(17)271231(10)ABC123(21)S-0002 | Carton 2 |
| 3 | (01)09506000134352(17)271231(10)ABC123(21)S-0003 | Carton 3 |
| 4 | (01)09506000134352(17)271231(10)ABC123(21)S-0004 | Carton 4 |
| 5 | (01)09506000134352(17)271231(10)ABC123(21)S-0005 | Carton 5 |
| 6 | (01)09506000134352(17)271231(10)ABC123(21)S-0006 | Carton 6 |
{0001..0500}: a counter from 1 to 500, zero-padded to 4 digits because the start or end is written with a leading zero; {1..500..5} counts in steps of 5, {500..1} down. One counter per template, at most 10,000 codes. {date:YYMMDD} is the batch date, {date+730:YYMMDD} that date plus 730 days (YYYY, YY, MM, DD and separators); write {{ and }} for literal braces.
21 codes
First: (01)09506000134352(17)280930(10)LOT42(21)SN0001
Last: (01)09506000134352(17)280930(10)LOT42(21)SN0021
Paste, open a CSV, TSV, TXT or XLSX file (up to 20 MB), or drop it on the field. Files are read in this browser only.
{GTIN} takes the column with that header (case, spaces, “_” and “-” ignored), {C3} the third column; {date:YYMMDD} as in the serial generator. Every placeholder needs a column; an empty cell is an error in that row.
Symbol: one setting for the whole batch
Print size
Runs in this browser. Data is not uploaded or stored.
Check
21 codes checked: 21 OK, 0 warnings, 0 errors. Symbol size: 22 × 22.
| Row | Label | Data | Symbol | Size (mm) | Status | Message |
|---|---|---|---|---|---|---|
| 1 | 0001 | (01)09506000134352(17)280930(10)LOT42(21)SN0001 | 22 × 22 | 11.18 × 11.18 | OK | |
| 2 | 0002 | (01)09506000134352(17)280930(10)LOT42(21)SN0002 | 22 × 22 | 11.18 × 11.18 | OK | |
| 3 | 0003 | (01)09506000134352(17)280930(10)LOT42(21)SN0003 | 22 × 22 | 11.18 × 11.18 | OK | |
| 4 | 0004 | (01)09506000134352(17)280930(10)LOT42(21)SN0004 | 22 × 22 | 11.18 × 11.18 | OK | |
| 5 | 0005 | (01)09506000134352(17)280930(10)LOT42(21)SN0005 | 22 × 22 | 11.18 × 11.18 | OK | |
| 6 | 0006 | (01)09506000134352(17)280930(10)LOT42(21)SN0006 | 22 × 22 | 11.18 × 11.18 | OK | |
| 7 | 0007 | (01)09506000134352(17)280930(10)LOT42(21)SN0007 | 22 × 22 | 11.18 × 11.18 | OK | |
| 8 | 0008 | (01)09506000134352(17)280930(10)LOT42(21)SN0008 | 22 × 22 | 11.18 × 11.18 | OK | |
| 9 | 0009 | (01)09506000134352(17)280930(10)LOT42(21)SN0009 | 22 × 22 | 11.18 × 11.18 | OK | |
| 10 | 0010 | (01)09506000134352(17)280930(10)LOT42(21)SN0010 | 22 × 22 | 11.18 × 11.18 | OK | |
| 11 | 0011 | (01)09506000134352(17)280930(10)LOT42(21)SN0011 | 22 × 22 | 11.18 × 11.18 | OK | |
| 12 | 0012 | (01)09506000134352(17)280930(10)LOT42(21)SN0012 | 22 × 22 | 11.18 × 11.18 | OK | |
| 13 | 0013 | (01)09506000134352(17)280930(10)LOT42(21)SN0013 | 22 × 22 | 11.18 × 11.18 | OK | |
| 14 | 0014 | (01)09506000134352(17)280930(10)LOT42(21)SN0014 | 22 × 22 | 11.18 × 11.18 | OK | |
| 15 | 0015 | (01)09506000134352(17)280930(10)LOT42(21)SN0015 | 22 × 22 | 11.18 × 11.18 | OK | |
| 16 | 0016 | (01)09506000134352(17)280930(10)LOT42(21)SN0016 | 22 × 22 | 11.18 × 11.18 | OK | |
| 17 | 0017 | (01)09506000134352(17)280930(10)LOT42(21)SN0017 | 22 × 22 | 11.18 × 11.18 | OK | |
| 18 | 0018 | (01)09506000134352(17)280930(10)LOT42(21)SN0018 | 22 × 22 | 11.18 × 11.18 | OK | |
| 19 | 0019 | (01)09506000134352(17)280930(10)LOT42(21)SN0019 | 22 × 22 | 11.18 × 11.18 | OK | |
| 20 | 0020 | (01)09506000134352(17)280930(10)LOT42(21)SN0020 | 22 × 22 | 11.18 × 11.18 | OK | |
| 21 | 0021 | (01)09506000134352(17)280930(10)LOT42(21)SN0021 | 22 × 22 | 11.18 × 11.18 | OK |
A4 label sheets
Label grid in millimetres
Common A4 label sheet layouts with the margins and gaps as these layouts are commonly published, written from memory and checked only for adding up to 210 × 297 mm. Measure your sheet or check its data sheet before a large print run.
Code width: the largest code with its quiet zone that fits this width in whole printer dots per module (codes of different sizes then get different modules). A code that does not fit its label is an error, never shrunk.
The sheets print through the browser on A4 without page margins: choose 100 % or “Actual size”, margins “None” and no headers or footers, and print one test sheet on plain paper held against the label sheet first. Every module starts on a printer dot of the chosen resolution.
ZIP download
File names from {row} (zero-padded row number), {label} and {data}: letters other than A–Z, a–z and 0–9 become “_”, and a repeated name gets -2, -3 …. The ZIP also holds manifest.csv (file, row, label, data, symbol, size). One batch is at most 10,000 codes.
Download offline versionSingle HTML file · v1.6 · 752 KB · works without internet
How the codes are made and read
Two-dimensional codes for traceability labels, part marking and packaging: Data Matrix ECC 200 and QR Code model 2 are generated by FactoKit’s own encoders (no library), GS1 element strings are checked against GS1’s machine-readable Application Identifier table, and codes are read with the browser’s BarcodeDetector or a keyboard-wedge scanner. Everything runs in this browser.
Worked example: GS1 DataMatrix with GTIN, expiry date and batch
- Element string (illustrative; 09506000134352 is the example GTIN GS1 uses in its documentation):
(01)09506000134352(17)271231(10)ABC123. (01) GTIN and (17) expiry date have a predefined length, so no separator follows them; (10) is variable but last, so none follows it either. - Data: FNC1 (codeword 232), then the 32 digits and letters in ASCII encodation, digit pairs in one codeword each: 19 codewords. The smallest square symbol that holds them is 20 × 20 (22 data codewords, 18 error correction codewords; the 3 left over are pads).
- Print: 0.5 mm requested at 300 dpi is 5.9 printer dots, rounded to 6 dots = 0.508 mm. The symbol is 20 × 0.508 = 10.16 mm square, 11.18 mm with the 1-module quiet zone.
Data Matrix ECC 200
- Sizes: the 24 square sizes from 10 × 10 to 144 × 144 and the 6 rectangular ones from 8 × 18 to 16 × 48, with their data regions, finder pattern (solid left and bottom edges) and clock track (alternating top and right edges), error correction codewords and interleaved blocks (2 to 10 blocks from 52 × 52 up). Auto chooses the smallest symbol of the chosen shape that holds the data.
- Encodation: ASCII (two digits per codeword, Upper Shift for bytes 128–255), C40, Text, X12, EDIFACT and Base256 (with its 255-state randomization), switched by latch and unlatch codewords. Auto finds the mix with the fewest codewords by dynamic programming over every character and every scheme state (C40 / Text / X12 triplets, EDIFACT groups of four); a plan that ends in C40, Text, X12 or EDIFACT is also tried where the symbol ends right after it (no unlatch needed, and EDIFACT characters in the last two codewords are written in ASCII, as readers expect). The choice is never larger than zxing-cpp’s encoder’s and is often smaller. A chosen scheme (ASCII + C40 …) restricts the mix to ASCII and that scheme.
- FNC1 and ECI: GS1 DataMatrix starts with FNC1 (232) and uses it as the separator; FNC1 is always written in ASCII, because libdmtx misreads it inside C40 and Text (where the standard allows it as Shift 2, value 27). Text beyond ASCII is written as ISO 8859-1 (the standard’s default), or as UTF-8 with ECI 26 (codewords 241, 27), or as UTF-8 without ECI.
- Padding and error correction: pad 129, then the 253-state randomized pads; Reed–Solomon over GF(256) with the field polynomial x⁸ + x⁵ + x³ + x² + 1 (0x12D), generator roots α¹ … αⁿ, codewords spread over the blocks in turn. Placement: the “utah” shapes of ISO/IEC 16022 Annex F with the four corner cases, and the fixed pattern in the bottom-right corner where a module is left.
- Checks: every size matches libdmtx’s encoder module by module (ASCII, 90 symbols); 1,500+ symbols with random text in every scheme, shape and character set, GS1 strings and ECI are decoded by zxing-cpp to exactly the encoded bytes with no error corrected, and by libdmtx (which leaves FNC1 out of its output).
QR Code model 2
- Versions 1–40, levels L, M, Q, H (about 7, 15, 25 and 30 % of the codewords can be restored). Auto chooses the smallest version for the chosen level; a chosen version that is too small is refused with the number of bits needed.
- Segments: numeric (3 digits in 10 bits), alphanumeric (2 characters in 11 bits) and byte; the shortest mix is found by dynamic programming with the exact bit counts (character count field length by version range). Text beyond ASCII is UTF-8 (what phones expect), UTF-8 with ECI 26, or ISO 8859-1 (only up to U+00FF; zxing-cpp guessed Shift JIS for such bytes without ECI in tests, so UTF-8 is safer). Kanji mode is not used.
- GS1 QR Code: the FNC1 in first position mode indicator (0101) starts the data; a separator is “%” in alphanumeric segments (a literal “%” becomes “%%”) and GS (29) in byte segments.
- Mask: all eight masks are applied and scored with the four penalty rules (runs of five or more, 2 × 2 blocks, 1:1:3:1:1 finder-like patterns with four light modules before or after, dark proportion) on the whole symbol with its format and version information; the lowest score wins. Format information: level and mask with the BCH(15,5) code, XOR 101010000010010; version information from version 7 with the BCH(18,6) code.
- Checks: all 160 version and level combinations match segno module by module at a fixed mask (segno pads a bit stream that already ends on a byte boundary with an extra zero byte; the reference applies the ISO rule instead); the automatic version and mask equal zxing-cpp’s encoder on 240 texts; 600+ symbols with mixed text, every level, ECI and GS1 are decoded by zxing-cpp exactly, with no error corrected.
GS1 element strings
- Source of the AI table: the GS1 Barcode Syntax Dictionary, release 2026-01-27 (commit 8ad003f83a4b), Apache License 2.0 (license text): 541 AIs with their titles, formats (N numeric, X the GS1 character set 82, Y set 39, Z base64url), fixed or variable lengths, whether an FNC1 separator must follow, the checks of each component and the AIs they require or exclude. A FactoKit script derives the tool’s table from the file and the code lists (countries, currencies, package and media types) from the dictionary’s own compiled checks.
- Checks as GS1’s reference linters: check digits (GTIN-8/12/13/14, GLN, SSCC, GSIN: mod 10), check character pairs (GMN, MUDI), dates YYMMDD (day 00 allowed where the AI allows it: the end of the month), times, ISO country and currency codes, piece of total, IBAN, percent-encoding, and more; then mutually exclusive AIs, required AIs (e.g. a batch needs a GTIN), repeated AIs with different values. Not checked: the GS1 Company Prefix against GS1’s registry (it needs online data; only the four leading digits are checked, as the reference does) and the North American coupon codes (AI 8110, 8112).
- Compared with the GS1 Barcode Syntax Engine itself (GS1’s C library, called from the reference script) on 2,545 element strings, bracketed and unbracketed, valid and broken on purpose: the same verdict, the same encoded data, and the engine’s first error is always among the problems listed here (the engine stops at the first; this tool lists all of them).
- Meanings: GTIN-8/12/13/14 from the leading zeros, dates with the century by the GS1 rule (51 or more years ahead of the current year means the previous century), implied decimals of the measure AIs (3103 001250 = 1.250 kg), amounts and percentages.
Print size
- Size = modules × module size (X dimension), plus the quiet zone on every side (standard minimum: 1 module for Data Matrix, 4 for QR Code). With “Whole printer dots” the module becomes round(X × dpi / 25.4) dots, at least 1: every module then prints equally wide. The PNG has exactly that many pixels per module and its pHYs chunk carries the resolution; the SVG is sized in millimetres.
- The module size your application needs comes from its specification (for GS1 the symbol specification tables of the GS1 General Specifications) and from the scanners in use; the tool does not choose it. Print a test and read it with those scanners.
Reading
- Camera: where the browser offers BarcodeDetector with the formats data_matrix or qr_code, Start opens the camera (after your permission), frames go to the detector a few times per second, and each new value is listed; Stop, or the first code when chosen, closes the camera. Frames are not stored, drawn elsewhere or sent. The page’s security policy needs no change for this (checked in Chromium with a simulated camera, on the website and from the offline file).
- Without BarcodeDetector, codes cannot be read from the camera, and reading from image files is not available: a QR / Data Matrix image decoder is not part of this tool. A USB or Bluetooth scanner in keyboard mode works in every browser through the scanner field.
- Scanner field: Enter ends a scan; Ctrl+] (how a keyboard-mode scanner sends GS) is shown as ␝; <GS>, {GS}, [GS], \x1D and ^ are read as GS; a symbology identifier at the start (]d2, ]Q3, ]C1 …) is shown and removed. The text is checked as a GS1 element string when the identifier says GS1 or when it reads as a valid one.
Batch
- Inputs: a list (one code per row, typed, pasted or from CSV, TSV, TXT or XLSX, with an optional Label column found by its header); a serial generator, a template with one counter {0001..0500} (start, end and an optional step {1..500..5}; zero padding when the start or end is written with a leading zero, to the width of the longer one, as shell brace expansion does; counting down when the end is lower) and dates {date:YYMMDD} or {date+730:YYMMDD} from one batch date; or a table whose columns fill a template, {GTIN} by header name (case, spaces, “_” and “-” ignored) or {C3} by number, each placeholder’s column changeable by hand. At most 10,000 codes per batch.
- One setting for the whole batch: symbology, content, size, error correction and print size are the generator’s options, and every row goes through the generator’s own code, so a batch code is the same symbol the generator makes from the same text.
- Checks before any output: GS1 errors (all of them counted, the first named), data too long for a fixed size or version, empty data or empty table cells are errors; the same encoded data twice and, for GS1, a GTIN with the same serial number (01)+(21), the same SSCC (00) or GIAI (8004) are warnings, because these must be unique. Nothing is printed or saved while errors remain, unless “Leave out the rows with errors” is ticked. The table shows the first 500 rows; the results CSV has every row. Long batches are checked in chunks with progress and Cancel.
- A4 sheets: a label grid (columns, rows, label size, top and left margin, gaps) from a preset or typed; the start position skips used labels on the first sheet. The code prints at the module size in whole printer dots, or, with a code width, at the largest whole-dot module whose code (with its quiet zone) fits that width. The text under it (the GS1 bracketed form, the data or the label) is IBM Plex Mono, 0.6 em per character, so the tool knows its width: it wraps before “(” or at spaces and is cut with “…” when it needs more lines than allowed (flagged). A code and text that do not fit inside the label’s padding are an error: nothing is shrunk. Each sheet is one A4 page without page margins; every module starts on the printer’s dot grid; optional crop marks 3 mm long, 1 mm outside the corners.
- ZIP: one PNG (1 bit per pixel, whole dots per module, the resolution in its pHYs chunk) or SVG (millimetres) per code, named from {row}, {label} and {data} (ASCII letters, digits, “.”, “-”, “_”; repeated names get -2, -3 … without regard to case), plus manifest.csv. The archive is written by FactoKit’s own ZIP writer without compression (PNG files of codes are small) and without ZIP64, which the 10,000-code limit keeps well within.
Not verified
- The label sheet presets give margins and gaps as these A4 layouts are commonly published, from memory; they only add up to 210 × 297 mm. Measure the sheet or read its data sheet, and print a test on plain paper first. How exactly a printer places the page depends on its driver: print at 100 % without page margins.
- The ISO/IEC 16022 and 18004 standards and the GS1 General Specifications were not read here. The encoders were written from memory and are confirmed by the independent implementations above (libdmtx, segno, zxing-cpp), not by the texts; the same holds for the standard quiet zones, the QR recovery percentages, the meanings of the symbology identifiers and the Reed–Solomon examples recalled from the standards (01234567 at 1-M; 123456 in 10 × 10), which the encoders reproduce.
Questions
- Data Matrix or QR Code: which one should I use?
- For marking parts and packs in manufacturing and healthcare, Data Matrix is the usual choice: it is smaller for the same data, works well on small labels and direct part marking, and GS1 DataMatrix is widely used for healthcare items. QR Code is the one phones read without an app, so it suits web addresses and GS1 Digital Link. Both can carry GS1 element strings with FNC1. Follow your customer’s or your industry’s labelling specification when it names one.
- What are FNC1 and the GS separator in a GS1 code?
- A GS1 symbol starts with FNC1, which tells the reader that the data are GS1 Application Identifiers. AIs with a predefined length (such as (01) GTIN or (17) expiry date) need nothing after them; a variable-length AI (such as (10) batch or (21) serial number) that is not the last one is ended by another FNC1. Readers pass that separator on as the ASCII character GS (29). The brackets of the human-readable text are never encoded. The tool adds every FNC1 for you, and putting the fixed-length AIs first saves separators.
- How large should the code be printed?
- The size follows from the module size (the X dimension) times the number of modules, plus the quiet zone. Choose the module size your specification and your scanners need, then let the tool round it to whole printer dots: a 300 dpi printer can print 0.508 mm (6 dots) exactly, but not 0.5 mm (5.9 dots), and uneven modules read worse. Keep the quiet zone free: at least 1 module for Data Matrix and 4 modules for QR Code. Test-print and read the code with the scanner it is meant for.
- Why does the camera not read codes in my browser?
- The camera part uses the browser’s BarcodeDetector (Shape Detection API), which only some browsers offer; the page says whether yours does. The camera also needs your permission and a secure page (https or the downloaded offline file). Where it is missing, use a USB or Bluetooth barcode scanner with the scanner field: it works in every browser. Reading codes from image files is not offered.
- My scanner adds ]d2 or strange characters. What are they?
- Scanners can send a symbology identifier before the data: ]d2 means GS1 DataMatrix, ]Q3 GS1 QR Code, ]C1 GS1-128. The tool reads and removes it. GS (ASCII 29), the GS1 separator, cannot be typed on a keyboard, so a scanner in keyboard mode sends it as Ctrl+] or as text such as <GS>, depending on its set-up; the scanner field shows it as ␝ and understands the usual forms.
- How do I print many codes, for example serial numbers, on label sheets?
- Use the Batch part: paste a list, open a CSV or Excel table, or write a template with a counter such as (01)09506000134352(21)SN{0001..0500}. Every code is checked first (GS1 errors, data too long, repeated codes and serial numbers). Then choose an A4 label layout, the text under the code and the label to start on, and print the sheets at 100 % without page margins, or download a ZIP with one PNG or SVG file per code and a manifest. Print one test sheet on plain paper and hold it against the labels first.
- Are my data or the camera picture uploaded?
- No. The codes are generated, checked and read in your browser. The camera picture goes only to the browser’s BarcodeDetector on your device; frames are not stored or sent. The results leave the page only as the files you download.
Related tools
- Food label generator: make the label the code is printed on.
- IPC-CFX message workbench: send the scanned unit identifiers in CFX messages.
- JSON and XML tools: check the interface files that carry the scanned data.