Bulk Barcode Labels — CSV to Printable PDF Sheets

Import a local CSV, TSV, or text file, or paste a column straight from Excel or Sheets, and download a print-ready PDF of barcode labels — aligned to Avery 5160, Avery 5163, Avery L7651, or your own label grid in millimetres. Every row is validated first and every check digit is verified by this site's own arithmetic, independently of the barcode renderer. The whole thing runs in your browser: your product list is never uploaded anywhere.

Generate label sheets

Runs locally in your browser — nothing you paste is transmitted or stored.

Import a local CSV, TSV, or text file

UTF-8 CSV, TSV, or one-value-per-line text, up to 1 MB. The first column is the barcode value and the optional second column is label text. Import stays on this device and replaces the textarea below.

One barcode value per line. Optionally add a second column after a comma or tab — value,label text — and the text is printed under that barcode. A two-column paste from Excel works as-is.

Paste values above — every row is validated before anything is printed.

Before print or production use: print at 100% scale (never "fit to page"), test one sheet on plain paper against the label stock, and test-scan a printed label with your own scanner. This tool verifies the mathematics — it cannot verify your printer's alignment, contrast, or scale settings.

Who this is for

Anyone who needs a box of labelled products rather than one barcode at a time: a shop putting shelf labels on stock, a warehouse labelling bins and cartons, a seller preparing products for a marketplace, a library or lab sticking asset codes on equipment. The pattern is always the same — the numbers already live in a spreadsheet, and the job is getting them onto physical labels without paying for yet another subscription: paste the column, pick the sheet, download the PDF. If labels must merge live from a database or drive an industrial printer, compare this workflow with the barcode software decision guide.

Getting a column out of Excel or Sheets

Select the column of barcode numbers (click the column header, or drag over the cells), copy, and paste into the box above — each cell becomes one line. To print a name or SKU under each barcode, select two adjacent columns — values first, text second — and paste both; Excel separates the columns with a tab, which the tool reads automatically. From a CSV file, open it in any editor and paste the relevant lines; a value,text pair per line works the same way. One caution for spreadsheet users: formatting a column of long numbers as Number can make Excel display them in scientific notation and mangle the paste — format barcode columns as Text before you paste values in.

The separator rule is fixed. Each non-blank line is split at its first tab if it has one, otherwise at its first comma; what comes before is the value, everything after is the label text, commas included. Tab wins because a spreadsheet paste is tab-separated and its cells may contain commas. One pair of surrounding double quotes is stripped from either column, and blank lines print nothing but keep their line numbers.

Importing a file instead of pasting

The file import fills the same box. The delimiter follows the extension — .csv comma, .tsv tab, .txt decided by its first non-blank line — and an unclosed quoted field is refused with the reason rather than guessed at. Nor is a header guessed away: a fictional export — a quoted header row, then the two cited EAN-13 numbers with label text, saved as labels.csv — imports as 3 rows (comma-delimited), and the header then fails validation with “A EAN-13 contains digits 0–9 only (spaces and hyphens are ignored).” Imports stop at 300 non-blank rows, and a file over 1 MB is declined before it is read.

Template geometry

The three presets use the manufacturer-published sheet geometry, and the figures below are generated from the same data the PDF placement code uses, so this table cannot drift from what actually prints. Our unit tests verify that each template's margins, labels, and gaps reproduce the page dimensions exactly.

Label sheet template geometry: page size, label dimensions, grid, and margins.
Template Page Label size Grid Per sheet Top margin Side margin Column gap
Avery 5160 Letter 66.67 × 25.4 mm 3 × 10 30 12.7 mm 4.76 mm 3.17 mm
Avery 5163 Letter 101.6 × 50.8 mm 2 × 5 10 12.7 mm 3.97 mm 4.76 mm
Avery L7651 A4 38.1 × 21.2 mm 5 × 13 65 10.7 mm 4.75 mm 2.5 mm

Positions follow from that table by addition: a label's left edge is the side margin plus its column number times the pitch (label width plus column gap), its top edge the top margin plus its row number times the label height, since no preset has a vertical gap. On Avery L7651 the pitch is 40.6 mm, and the last of its 65 cells (column 5, row 13) starts at x = 167.15 mm, y = 265.1 mm, leaving 4.75 mm to the right edge and 10.7 mm to the bottom — the margins the sheet began with.

Go deeper: Label-sheet geometry walks the placement engine through every preset, position and sheet count; the guides hub has the rest.

From a row count to a sheet count

Labels per sheet is columns times rows; sheets needed is the number of labels that will print divided by that, rounded up. The summary reports it as you type. A fictional list of 72 valid rows needs:

  • Avery 5160 (30 per sheet): 3 sheets, 12 labels on the last.
  • Avery 5163 (10 per sheet): 8 sheets, 2 labels on the last.
  • Avery L7651 (65 per sheet): 2 sheets, 7 labels on the last.

The input cap is reported the same way: paste 312 non-blank lines and 300 are kept, and the summary says “Only the first 300 of 312 non-blank lines were processed” — run a longer list in batches.

A custom grid is checked, never clamped

Custom mode takes nine values in millimetres and refuses anything it cannot place. A fictional A4 grid — labels 60 × 30 mm, 3 columns by 8 rows, top margin 15 mm, left margin 10 mm, gaps 5 mm across and 3 mm down — is accepted as “Custom — A4, 60 × 30 mm, 24 per sheet”, using 200 of the page's 210 mm width and 276 of its 297 mm height. Raise the rows to 10 and the same grid is refused in the engine's words: “The grid is 342.0 mm tall but the page is only 297.0 mm — reduce rows, label height, gap, or margin.” The geometry guide explains why nothing is shrunk to fit.

Print at 100% — the one setting that ruins alignment

The PDF places every barcode at exact millimetre positions, but PDF viewers love to "help" by scaling pages. In the print dialog choose Actual size or set scale to 100% — never "Fit to page" or "Shrink to fit", which compress the layout by a few percent and walk every row progressively off its label. Print the first sheet on plain paper and hold it over the label sheet against the light before committing the real stock.

What validation happens before printing

Every row goes through the same engine as this site's single-barcode generators. GTIN-family rows (EAN-13, EAN-8, UPC-A, ITF-14) follow verify-or-compute semantics: enter the data digits and the check digit is computed and appended; enter the full number and the final digit is verified, with a mismatch failing the row — never silently "fixed". Text symbologies (Code 128, Code 39) are checked against their character sets. All of it happens before the accepted payload reaches the renderer. For check digits alone, use the check digit calculator.

That engine on a fictional paste with EAN-13 selected — a cited vector, a blank line, a spreadsheet header, the vector with a wrong check digit, and a tab-separated two-column line — every verdict computed at build time:

A fictional paste validated as EAN-13, row by row: line, value, label text, verdict.
Line Value Label text Prints? What the validator said
1 400638133393 — Yes You entered 12 digits — the check digit 1 was computed and appended, making 4006381333931.
3 SKU Description No A EAN-13 contains digits 0–9 only (spaces and hyphens are ignored).
4 4006381333936 — No Check digit mismatch: for 400638133393 the final digit must be 1, but you entered 6. Fix the number, or enter only the first 12 digits to have the check digit computed.
5 4006381333931 Shelf 3, bay 2 Yes You entered all 13 digits — the check digit 1 was verified against the first 12 and is correct.

Line 2 is absent because blank lines are skipped, not renumbered. On Avery 5160 the summary reads “2 of 4 rows valid, 2 failed. 2 labels → 1 sheet (30 per sheet).” Neither failure is repaired: the corrupted line is told the digit its first twelve require and the digit it carried, and left to you.

One honesty line: a row that passes is structurally valid — right length, right characters, check digit consistent — a property of arithmetic, not a licence. Generating an EAN or UPC barcode does not allocate or license the GTIN inside it (that is GS1's role); see do I need a GS1 barcode?

What the download checks, and what it cannot

Download is a second pass: each accepted row's check digit, where its symbology has one, is recomputed from the normalised payload, and the renderer may still decline to draw a symbol; a row stopped at either point is listed as refused with its line number and the PDF is built from the rest. Nothing reads the bars back. The methodology page is explicit that bulk PDF label sheets are the deliberate exception to the independent decode: each row is validated before rendering, but the assembled PDF rows are not individually decoded. What that decode checks and withholds is the subject of how the verifier decodes what you see; what happens after printing no browser check can certify, which is why the tool asks for one printed sheet to be test-scanned.

Bulk label FAQ

Does this really line up with Avery label sheets?

Yes — the three presets use the manufacturer-published geometry for Avery 5160, 5163 and L7651, and our layout tests verify that margins, labels, and gaps reproduce the page dimensions exactly. Stock from another brand that publishes the same geometry is placed identically — the engine only knows the numbers.

How many labels fit on a sheet, and how many can I generate at once?

Avery 5160 holds 30 labels per sheet, Avery 5163 holds 10, and Avery L7651 holds 65. The tool accepts up to 300 input lines per pass and adds PDF pages automatically, so a 300-row column on 5160 stock produces a 10-page PDF. Imports and pasted lists longer than 300 rows are cut off honestly, so process larger files in batches.

Is it really free? What is the catch?

It is free, with no signup, no watermark, and no row limit other than the honest 300-per-pass cap. There is no server-side quota to meter because there is no server involved: parsing, validation, barcode rendering, and PDF assembly all run as JavaScript in your browser, and your product list never leaves your device. The site is supported by advertising, not by charging for the tool.

Why did one of my rows fail?

Each row goes through the same validation as the single-barcode generators: EAN-13 rows need 12 or 13 digits, EAN-8 7 or 8, UPC-A 11 or 12, ITF-14 13 or 14 — and when you supply the full length, the final digit is verified as a check digit and a mismatch fails the row rather than being silently "fixed". Code 128 rows fail on characters outside printable ASCII, and Code 39 on characters outside its 43-character set. The error table names the line number and the exact reason, so you can fix the source spreadsheet instead of guessing.

Should I paste EAN numbers with or without the check digit?

Either, row by row: a 12-digit EAN-13 row has its check digit computed and appended, and the printed symbol carries that digit; a 13-digit row has its final digit verified against the first twelve, and a mismatch fails the row naming the digit it should carry. EAN-8, UPC-A and ITF-14 follow the same rule at their own lengths; the digit count decides, never a guess.

My export has a header row — what happens to it?

It is imported like any other row, fails validation with its line number and the reason, and never prints; the reader does not decide on your behalf that a first row is a header. Delete it for a clean report or leave it — the PDF is built from the rows that pass.

Can I mix barcode types in one list?

Not in one pass. The selected barcode type applies to every row, and a row that does not satisfy its rules fails with the reason. Paste one type at a time and download a PDF for each.

A row passed validation, but the download said it was refused. Why?

Download runs a second pass: where the symbology has a check digit it is recomputed from the normalised payload, and the renderer is asked to draw the symbol and can decline. A row stopped at either point is listed as refused with its line number and the PDF is built from the rest — nothing is dropped silently. If that happens on a number you believe is correct, report it; suspected verification errors are fixed in the engine and locked in with a test.

Scope, honestly: this tool validates the mathematics and places barcodes at exact template positions. It cannot verify that your printer is set to 100% scale, that your label stock matches the template you picked, or that your scanner tolerates your print quality — test one sheet before printing hundreds. Everything runs locally in your browser; see the methodology page for how the verification layer is tested.