Title above image, manifest table on first page

Page 1 (Manifest):
  - Header with title, source, date, count
  - Table listing all products: #, name, SKU, price, stock qty

Product pages:
  - Title (bold, top)
  - Product image (bordered, centered)
  - Stock + price
  - UPC-A barcode (bordered, centered)
  - SKU / UPC text
This commit is contained in:
2026-03-21 23:14:12 -07:00
parent ecc026d07b
commit dddfbe7355

View File

@@ -265,13 +265,34 @@ def generate_catalog_pdf(products: list[dict]) -> Path | None:
r"\pagestyle{empty}", r"\pagestyle{empty}",
r"\begin{document}", r"\begin{document}",
"", "",
# Title page # Manifest page
r"\begin{center}", r"\begin{center}",
r"{\Huge\bfseries Pokemon TCG Product Catalog}\\[0.5cm]", r"{\Huge\bfseries Pokemon TCG Product Catalog}\\[0.4cm]",
r"{\Large Dollar General}\\[0.3cm]", r"{\Large Dollar General}\\[0.2cm]",
r"{\large Generated: " + timestamp_label + r"}\\[0.2cm]", r"{\large Generated: " + timestamp_label + r"}\\[0.2cm]",
r"{\large " + str(len(products)) + r" Cards \& Tins}", r"{\large " + str(len(products)) + r" Cards \& Tins}",
r"\end{center}", r"\end{center}",
r"\vspace{0.8cm}",
r"\begin{tabular}{r l l r r}",
r"\hline",
r"\textbf{\#} & \textbf{Product} & \textbf{SKU} & \textbf{Price} & \textbf{Stock} \\",
r"\hline",
]
for i, prod in enumerate(products, 1):
safe = (
prod["title"][:50]
.replace("&", r"\&").replace("%", r"\%").replace("$", r"\$")
.replace("#", r"\#").replace("_", r"\_").replace("é", r"\'e")
)
price = prod["price"].replace("$", r"\$")
qty = prod.get("quantity", 0)
stock_short = str(qty) if qty else "---"
latex_lines.append(
f"{i} & {safe} & \\texttt{{{prod['sku']}}} & {price} & {stock_short} \\\\"
)
latex_lines += [
r"\hline",
r"\end{tabular}",
r"\newpage", r"\newpage",
"", "",
] ]
@@ -311,18 +332,18 @@ def generate_catalog_pdf(products: list[dict]) -> Path | None:
abs_bc = str(bc_path.resolve()) if bc_path else None abs_bc = str(bc_path.resolve()) if bc_path else None
latex_lines += [ latex_lines += [
# Name — bold, large, above the image
r"{\Large\bfseries " + safe_title + r"}",
"",
r"\vspace{0.3cm}",
"",
r"\begin{center}", r"\begin{center}",
# Product image — large, centered, with border # Product image — large, centered, with border
r"\fbox{\includegraphics[width=0.7\textwidth,height=0.45\textheight,keepaspectratio]{" r"\fbox{\includegraphics[width=0.7\textwidth,height=0.42\textheight,keepaspectratio]{"
+ abs_img + abs_img
+ r"}}", + r"}}",
r"\end{center}", r"\end{center}",
r"\vspace{0.4cm}", r"\vspace{0.3cm}",
"",
# Name — bold, large
r"{\Large\bfseries " + safe_title + r"}",
"",
r"\vspace{0.15cm}",
"", "",
# Stock and price # Stock and price
r"{\large " + safe_stock + r" \hfill " + safe_price + r"}", r"{\large " + safe_stock + r" \hfill " + safe_price + r"}",