Files
LibreOffice-macro-for-image…/qr_script/qr_generator.py
2026-06-15 22:14:51 +02:00

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()