# badge-generator

Bulk-generates print-ready employee badge PDFs laid out for Avery `8395` adhesive name badges.

The generator is built around the sample badge you provided:
- employee photo cropped to fill the center frame without stretching
- auto-sized employee name in the black band
- auto-sized job title in the blue band, wrapped to two lines if needed
- two identical labels per employee, kept on the same 8-up sheet

## Avery 8395 layout

This project uses the standard 8-up Avery 8395 / 5395-compatible layout on US Letter:
- label size: `3.375" x 2.333"`
- sheet layout: `2 across x 4 down`
- default margins: about `0.688"` left/right and `0.594"` top/bottom
- default gaps: about `0.375"` horizontal and `0.187"` vertical

Those dimensions match common Avery-compatible template specs. Printers still vary, so the CLI includes `--left-adjust` and `--top-adjust` for calibration.

## Inputs

Photos go in a directory and should be named as:
- `firstnamelastname.png`
- `firstnamelastname.jpg`

Examples:
- `jaceyplace.jpg`
- `xylaensign.png`

The CSV must include:
- `title`
- either `name` or both `first_name` and `last_name`

Optional CSV columns:
- `prefix` for text before the name, like `Dr.`
- `suffix` for credentials after the name, like `MD` or `RN, BSN`

The easiest setup is:
- keep the photo filenames based on the actual person name only, like `puneetbraich.jpg`
- put `Dr.` / `MD` / `RN, BSN` in separate CSV columns so badge text changes do not affect photo matching

Example:

```csv
prefix,name,suffix,title
,Jacey Place,,Paraoptometric Technician
Dr.,Puneet Braich,MD,Ophthalmologist
,Brandi Lourdeau,"RN, BSN",Clinical Manager
```

## Install

```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```

## Usage

```bash
python3 badge_generator.py sample-data/employees.csv photos -o output/badges.pdf
```

Optional branding and print calibration:

```bash
python3 badge_generator.py employees.csv photos \
  -o output/badges.pdf \
  --brand-text "CHITTICK\nEYE CARE" \
  --logo-path assets/logo.png \
  --left-adjust 0.02 \
  --top-adjust -0.01
```

## Output behavior

- Each employee gets exactly `2` labels.
- The two labels are placed consecutively, so both copies stay on the same sheet.
- Each sheet holds `8` labels total, which means `4 employees per sheet`.
- The output is a print-ready multi-page PDF.
