Generate hundreds of QR codes in seconds. Upload CSV, download ZIP. Perfect for inventory, marketing campaigns, and large projects.
Generate 1,000+ QR codes in minutes
Download all codes at once
CSV format for easy data import
Compress to reduce file sizes
url,filename
https://example.com/product/1,product_1
https://example.com/product/2,product_2
https://example.com/product/3,product_3
sku,url,product_name,size
SKU001,https://example.com/1,Product A,300
SKU002,https://example.com/2,Product B,256
SKU003,https://example.com/3,Product C,400
import qrcode
import csv
import os
from pathlib import Path
def batch_generate_qr(csv_file, output_dir):
"""Generate QR codes from CSV file"""
# Create output directory
Path(output_dir).mkdir(exist_ok=True)
with open(csv_file, 'r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for idx, row in enumerate(reader, 1):
url = row.get('url') or row.get('link') or row.get('data')
filename = row.get('filename', f'qr_{idx}')
# Generate QR
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=10,
border=4,
)
qr.add_data(url)
qr.make(fit=True)
# Save image
img = qr.make_image(fill_color='black', back_color='white')
img.save(f'{output_dir}/{filename}.png')
print(f'ā Generated {idx}: {filename}.png')
print(f'\nā All {idx} QR codes generated in {output_dir}')
# Usage
batch_generate_qr('urls.csv', 'output_qrcodes')
import zipfile
import os
def create_zip(input_dir, output_zip):
"""Compress QR codes into ZIP"""
with zipfile.ZipFile(output_zip, 'w', zipfile.ZIP_DEFLATED) as zipf:
for file in os.listdir(input_dir):
file_path = os.path.join(input_dir, file)
zipf.write(file_path, arcname=file)
print(f'ā Created {output_zip}')
# Usage
create_zip('output_qrcodes', 'qrcodes.zip')
const QRCode = require('qrcode');
const csv = require('csv-parser');
const fs = require('fs');
const archiver = require('archiver');
async function batchGenerateQR(csvFile, outputDir) {
// Create output directory
fs.mkdirSync(outputDir, { recursive: true });
let count = 0;
return new Promise((resolve, reject) => {
fs.createReadStream(csvFile)
.pipe(csv())
.on('data', async (row) => {
count++;
const url = row.url || row.link;
const filename = row.filename || `qr_${count}`;
await QRCode.toFile(
`${outputDir}/${filename}.png`,
url,
{ width: 300, errorCorrectionLevel: 'H' }
);
console.log(`ā Generated ${count}: ${filename}.png`);
})
.on('end', () => {
console.log(`ā All ${count} QR codes generated!`);
resolve(count);
})
.on('error', reject);
});
}
// Create ZIP archive
function createZipArchive(sourceDir, outputZip) {
const output = fs.createWriteStream(outputZip);
const archive = archiver('zip', { zlib: { level: 9 } });
archive.pipe(output);
archive.directory(sourceDir, false);
archive.finalize();
console.log(`ā Created ${outputZip}`);
}
// Usage
(async () => {
await batchGenerateQR('urls.csv', './qrcodes');
createZipArchive('./qrcodes', 'qrcodes.zip');
})();
from multiprocessing import Pool
import qrcode
def generate_single_qr(data):
url, filename, output_dir = data
qr = qrcode.QRCode(error_correction=qrcode.constants.ERROR_CORRECT_H)
qr.add_data(url)
qr.make()
img = qr.make_image()
img.save(f'{output_dir}/{filename}.png')
return filename
# Generate in parallel (4 processes)
with Pool(4) as pool:
results = pool.map(generate_single_qr, qr_data)
print(f'ā Generated {len(results)} QR codes')