V2: Added Webserver for faster formatting
This commit is contained in:
@@ -1,102 +1,72 @@
|
||||
from modules.adjust_layout import adjust_layout
|
||||
from modules.add_logo import add_logo
|
||||
from pathlib import Path
|
||||
from modules.add_date import add_date
|
||||
from datetime import datetime
|
||||
from dateutil.relativedelta import relativedelta # type: ignore
|
||||
"""Command-line entry point for the roster formatter."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import fitz # type: ignore
|
||||
from pathlib import Path
|
||||
|
||||
def convert_pdf_to_png(pdf_path, output_path, dpi=150):
|
||||
doc = fitz.open(pdf_path)
|
||||
page = doc.load_page(0)
|
||||
pix = page.get_pixmap(dpi=dpi)
|
||||
pix.save(output_path)
|
||||
doc.close()
|
||||
|
||||
parser = argparse.ArgumentParser(description="Generate formatted roster")
|
||||
parser.add_argument("--month", type=str, help="Override the month/year label (e.g., 'September 2025')")
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.month:
|
||||
month_year = args.month.upper()
|
||||
else:
|
||||
today = datetime.now()
|
||||
target = today if today.day < 15 else today + relativedelta(months=1)
|
||||
month_year = target.strftime("%B %Y").upper()
|
||||
|
||||
|
||||
# Define paths
|
||||
base = Path(__file__).parent
|
||||
input_pdf = base / "input/original.pdf"
|
||||
shifted_pdf = base / "output/shifted.pdf"
|
||||
|
||||
# Apply layout adjustment
|
||||
adjust_layout(input_pdf, shifted_pdf, shift_amount=100)
|
||||
|
||||
# Paths
|
||||
logo_input = shifted_pdf
|
||||
logo_output = base / "output/with_logo.pdf"
|
||||
logo_file = base / "assets/logo.png"
|
||||
|
||||
add_logo(logo_input, logo_output, logo_file, position=(50, -10), scale=0.27)
|
||||
|
||||
|
||||
|
||||
# Determine month/year label
|
||||
if args.month:
|
||||
parts = args.month.strip().split()
|
||||
full_month = parts[0].capitalize()
|
||||
year = parts[1] if len(parts) > 1 else str(datetime.now().year)
|
||||
|
||||
# Smart abbreviation
|
||||
if len(full_month) > 5:
|
||||
month = full_month[:3].upper() # "September" → "SEP"
|
||||
else:
|
||||
month = full_month.upper() # "June" → "JUNE"
|
||||
|
||||
month_year = f"{month} {year}"
|
||||
else:
|
||||
today = datetime.now()
|
||||
target = today if today.day < 15 else today + relativedelta(months=1)
|
||||
full_month = target.strftime("%B")
|
||||
year = target.strftime("%Y")
|
||||
|
||||
if len(full_month) > 5:
|
||||
month = target.strftime("%b").upper()
|
||||
else:
|
||||
month = full_month.upper()
|
||||
|
||||
month_year = f"{month} {year}"
|
||||
|
||||
final_pdf_name = f"{month} {year} Roster.pdf"
|
||||
final_pdf_path = base / "output" / final_pdf_name
|
||||
final_png_path = final_pdf_path.with_suffix(".png")
|
||||
date_output = final_pdf_path
|
||||
|
||||
# Paths
|
||||
date_input = logo_output
|
||||
font_file = base / "assets/fonts/Roboto-Variable.ttf"
|
||||
|
||||
add_date(
|
||||
input_path=date_input,
|
||||
output_path=date_output,
|
||||
month_year=month_year,
|
||||
font_path=font_file,
|
||||
position=(460, 88),
|
||||
font_size=48
|
||||
from roster_formatter import (
|
||||
BASE_DIR,
|
||||
LayoutSettings,
|
||||
RosterFormatError,
|
||||
RosterPeriod,
|
||||
format_roster,
|
||||
)
|
||||
|
||||
convert_pdf_to_png(final_pdf_path, final_png_path)
|
||||
|
||||
final_pdf_name = f"{month} {year} Roster.pdf"
|
||||
final_pdf_path = base / "output" / final_pdf_name
|
||||
def build_parser() -> argparse.ArgumentParser:
|
||||
parser = argparse.ArgumentParser(description="Generate a formatted roster PNG")
|
||||
parser.add_argument(
|
||||
"--input",
|
||||
type=Path,
|
||||
default=BASE_DIR / "input" / "original.pdf",
|
||||
help="one-page landscape Letter roster PDF",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--output-dir",
|
||||
type=Path,
|
||||
default=BASE_DIR / "output",
|
||||
help="directory for the formatted PNG",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--month",
|
||||
help="override the month/year label (for example, 'September 2026' or '2026-09')",
|
||||
)
|
||||
|
||||
final_png_name = final_pdf_name.replace(".pdf", ".png")
|
||||
final_png_path = base / "output" / final_png_name
|
||||
advanced = parser.add_argument_group("advanced layout adjustments")
|
||||
advanced.add_argument("--content-shift", type=float, default=100)
|
||||
advanced.add_argument("--bottom-margin", type=float, default=60)
|
||||
advanced.add_argument("--logo-x", type=float, default=50)
|
||||
advanced.add_argument("--logo-y", type=float, default=-10)
|
||||
advanced.add_argument("--logo-scale", type=float, default=0.27)
|
||||
advanced.add_argument("--date-x", type=float, default=460)
|
||||
advanced.add_argument("--date-y", type=float, default=88)
|
||||
advanced.add_argument("--date-font-size", type=int, default=48)
|
||||
return parser
|
||||
|
||||
|
||||
# Clean up intermediate PDFs
|
||||
for path in [shifted_pdf, logo_output, final_pdf_path]:
|
||||
if path.exists():
|
||||
path.unlink()
|
||||
def main() -> int:
|
||||
args = build_parser().parse_args()
|
||||
try:
|
||||
period = RosterPeriod.parse(args.month)
|
||||
settings = LayoutSettings(
|
||||
content_shift=args.content_shift,
|
||||
bottom_margin=args.bottom_margin,
|
||||
logo_x=args.logo_x,
|
||||
logo_y=args.logo_y,
|
||||
logo_scale=args.logo_scale,
|
||||
date_x=args.date_x,
|
||||
date_y=args.date_y,
|
||||
date_font_size=args.date_font_size,
|
||||
)
|
||||
output_path = args.output_dir / period.output_filename
|
||||
result = format_roster(args.input, output_path, period, settings)
|
||||
except RosterFormatError as exc:
|
||||
raise SystemExit(f"error: {exc}") from exc
|
||||
|
||||
print(f"Created {result.path}")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
|
||||
Reference in New Issue
Block a user