114 lines
3.2 KiB
Python
114 lines
3.2 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
QR Code Generator
|
|
|
|
Reads a CSV/TSV file where:
|
|
- First row is a header (skipped).
|
|
- First column contains the data/text to encode into a QR code.
|
|
- Second column contains the base name for the output PNG file.
|
|
|
|
Uses the `qrencode` command-line tool to generate QR codes.
|
|
"""
|
|
|
|
import argparse
|
|
import csv
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(
|
|
description="Generate QR codes from a data file using qrencode."
|
|
)
|
|
parser.add_argument(
|
|
"input_file",
|
|
help="Path to the input file (CSV or TSV). The first row is treated as a header and skipped.",
|
|
)
|
|
parser.add_argument(
|
|
"-d",
|
|
"--delimiter",
|
|
default=None,
|
|
help="Column delimiter (default: auto-detect — comma for .csv, tab otherwise).",
|
|
)
|
|
parser.add_argument(
|
|
"-o",
|
|
"--output-dir",
|
|
default=".",
|
|
help="Directory to write PNG files into (default: current directory).",
|
|
)
|
|
parser.add_argument(
|
|
"--qrencode",
|
|
default="qrencode",
|
|
help="Path to the qrencode binary (default: qrencode).",
|
|
)
|
|
parser.add_argument(
|
|
"--size",
|
|
type=int,
|
|
default=10,
|
|
help="Module size in pixels (qrencode -s, default: 10).",
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
|
|
# --- auto-detect delimiter ---
|
|
if args.delimiter is None:
|
|
if args.input_file.lower().endswith(".csv"):
|
|
args.delimiter = ","
|
|
else:
|
|
args.delimiter = "\t"
|
|
|
|
# --- check qrencode ---
|
|
try:
|
|
subprocess.run(
|
|
[args.qrencode, "--version"],
|
|
capture_output=True,
|
|
check=True,
|
|
)
|
|
except (FileNotFoundError, subprocess.CalledProcessError):
|
|
print(
|
|
f"Error: '{args.qrencode}' not found or not working. Install qrencode (e.g. apt install qrencode).",
|
|
file=sys.stderr,
|
|
)
|
|
sys.exit(1)
|
|
|
|
os.makedirs(args.output_dir, exist_ok=True)
|
|
|
|
# --- read file and generate QR codes ---
|
|
with open(args.input_file, "r", encoding="utf-8") as fh:
|
|
reader = csv.reader(fh, delimiter=args.delimiter)
|
|
header = next(reader) # skip header row
|
|
print(f"Skipped header: {header}")
|
|
|
|
count = 0
|
|
for row_num, row in enumerate(reader, start=2): # row 2 = first data row
|
|
if not row or len(row) < 2:
|
|
print(f"Row {row_num}: skipping (needs at least 2 columns)", file=sys.stderr)
|
|
continue
|
|
|
|
data = row[0].strip()
|
|
name = row[1].strip()
|
|
|
|
if not data or not name:
|
|
print(f"Row {row_num}: skipping (empty column)", file=sys.stderr)
|
|
continue
|
|
|
|
output_path = os.path.join(args.output_dir, f"{name}.png")
|
|
|
|
cmd = [
|
|
args.qrencode,
|
|
"-s", str(args.size),
|
|
"-o", output_path,
|
|
data,
|
|
]
|
|
|
|
print(f"Row {row_num}: encoding '{data}' -> {output_path}")
|
|
subprocess.run(cmd, check=True)
|
|
count += 1
|
|
|
|
print(f"\nDone. Generated {count} QR code(s) in '{args.output_dir}'.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|