Files
getrankekarte/create_pdf.py
DanielS b58f65963c
Some checks failed
Build and Deploy / build (push) Has been cancelled
feat: update PDF with Aperol Spritz
2026-09-20 23:46:39 +02:00

194 lines
6.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import os
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.pdfgen import canvas
class NumberedCanvas(canvas.Canvas):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._saved_page_states = []
def showPage(self):
self._saved_page_states.append(dict(self.__dict__))
self._startPage()
def save(self):
num_pages = len(self._saved_page_states)
for state in self._saved_page_states:
self.__dict__.update(state)
self.draw_page_decorations()
super().showPage()
super().save()
def draw_page_decorations(self):
self.saveState()
self.setStrokeColor(colors.HexColor("#D4AF37"))
self.setLineWidth(2)
self.rect(10*mm, 10*mm, 190*mm, 277*mm)
self.setLineWidth(0.7)
self.rect(11.5*mm, 11.5*mm, 187*mm, 274*mm)
self.restoreState()
def generate_pdf(filename):
doc = SimpleDocTemplate(
filename,
pagesize=A4,
leftMargin=16*mm,
rightMargin=16*mm,
topMargin=16*mm,
bottomMargin=16*mm
)
styles = getSampleStyleSheet()
title_style = ParagraphStyle(
'MainTitle',
fontName='Helvetica-Bold',
fontSize=22,
leading=26,
alignment=1,
textColor=colors.HexColor("#1A1A1A"),
spaceAfter=3
)
subtitle_style = ParagraphStyle(
'SubTitle',
fontName='Helvetica-Oblique',
fontSize=10,
leading=13,
alignment=1,
textColor=colors.HexColor("#555555"),
spaceAfter=10
)
section_style = ParagraphStyle(
'SectionHeader',
fontName='Helvetica-Bold',
fontSize=12,
leading=15,
textColor=colors.HexColor("#8A6D1C"),
spaceBefore=6,
spaceAfter=6,
alignment=0
)
drink_title_style = ParagraphStyle(
'DrinkTitle',
fontName='Helvetica-Bold',
fontSize=10,
leading=12,
textColor=colors.HexColor("#111111"),
spaceAfter=2
)
drink_text_style = ParagraphStyle(
'DrinkText',
fontName='Helvetica',
fontSize=8.5,
leading=11,
textColor=colors.HexColor("#333333")
)
footer_style = ParagraphStyle(
'Footer',
fontName='Helvetica-Oblique',
fontSize=9,
leading=12,
alignment=1,
textColor=colors.HexColor("#777777"),
spaceBefore=8
)
story = []
# Header
story.append(Paragraph("🍸 GETRÄNKEKARTE 🍸", title_style))
story.append(Paragraph("Frisch zubereitet an der Bar auf Eis.", subtitle_style))
# Line
line_table = Table([[""]], colWidths=[178*mm], rowHeights=[1])
line_table.setStyle(TableStyle([('LINEABOVE', (0,0), (-1,-1), 1, colors.HexColor("#D4AF37"))]))
story.append(line_table)
story.append(Spacer(1, 4*mm))
# Cocktails
story.append(Paragraph("🍹 SIGNATURE COCKTAILS", section_style))
cocktails = [
("1. Moscow Mule", "<b>Zutaten:</b> Wodka, frischer Limettensaft, Ginger Beer, Minzzweig & Limettenspalte.<br/><b>Geschmack:</b> Scharf-würzig, erfrischend und spritzig."),
("2. Aperol Spritz", "<b>Zutaten:</b> Aperol, Prosecco, Spritzer Soda, frische Orangenscheibe.<br/><b>Geschmack:</b> Fruchtig-bitter, spritzig und herrlich erfrischend."),
("3. Gin & Tonic", "<b>Zutaten:</b> Klassischer Gin, Tonic Water, Limettenscheibe.<br/><b>Geschmack:</b> Der elegante Klassiker – herb, bitter und ohne Zuckerüberhang."),
("4. Mojito", "<b>Zutaten:</b> Weißer Rum, frische Minzblätter, Zuckersirup, Limettensaft, Sprudelwasser.<br/><b>Geschmack:</b> Aromatisches Bar-Feeling mit frischer Minze."),
("5. Cuba Libre", "<b>Zutaten:</b> Weißer Rum, erfrischende Cola, frischer Limettensaft, Limette.<br/><b>Geschmack:</b> Der süße, vertraute Party-Dauerbrenner."),
("6. Vodka Cranberry", "<b>Zutaten:</b> Wodka, Cranberrysaft, Soda, frischer Limettensaft, Limettenscheibe.<br/><b>Geschmack:</b> Angenehm säuerlich-herb statt klebrig-süß."),
("7. Skinny Bitch", "<b>Zutaten:</b> Wodka, spritziges Mineralwasser, viel frischer Limettensaft.<br/><b>Geschmack:</b> Der leichte, komplett zucker- und kalorienfreie Drink.")
]
col_width = 87 * mm
table_data = []
for i in range(0, len(cocktails), 2):
cell_left = [
Paragraph(cocktails[i][0], drink_title_style),
Paragraph(cocktails[i][1], drink_text_style)
]
if i + 1 < len(cocktails):
cell_right = [
Paragraph(cocktails[i+1][0], drink_title_style),
Paragraph(cocktails[i+1][1], drink_text_style)
]
else:
cell_right = []
table_data.append([cell_left, cell_right])
cocktail_table = Table(table_data, colWidths=[col_width, col_width])
cocktail_table.setStyle(TableStyle([
('VALIGN', (0,0), (-1,-1), 'TOP'),
('BOTTOMPADDING', (0,0), (-1,-1), 6),
('RIGHTPADDING', (0,0), (0,-1), 6),
('LEFTPADDING', (1,0), (1,-1), 6),
]))
story.append(cocktail_table)
story.append(Spacer(1, 2*mm))
story.append(Paragraph("🍃 0.0% MOCKTAILS (ALKOHOLFREI)", section_style))
mocktails = [
("Virgin Mojito", "Frische Minze, Zuckersirup, Limettensaft, aufgegossen mit Ginger Beer & Sprudelwasser."),
("Cranberry Ginger Splash", "Feinherber Cranberrysaft, frischer Limettensaft & würziges Ginger Beer."),
("Homemade Lime Soda", "Frischer Limettensaft, süßer Zuckersirup, Minze & eiskaltes Sprudelwasser.")
]
m_data = []
m_col_width = 58 * mm
row_cells = []
for m in mocktails:
cell = [
Paragraph(f"<b>{m[0]}</b>", drink_title_style),
Paragraph(m[1], drink_text_style)
]
row_cells.append(cell)
m_data.append(row_cells)
mocktail_table = Table(m_data, colWidths=[m_col_width, m_col_width, m_col_width])
mocktail_table.setStyle(TableStyle([
('VALIGN', (0,0), (-1,-1), 'TOP'),
('RIGHTPADDING', (0,0), (-1,-1), 4),
('LEFTPADDING', (0,0), (-1,-1), 4),
]))
story.append(mocktail_table)
story.append(Spacer(1, 4*mm))
story.append(Paragraph("✨ Cheers! Cheers to great drinks and good vibes! ✨", footer_style))
doc.build(story, canvasmaker=NumberedCanvas)
print(f"PDF generated: {filename}")
if __name__ == "__main__":
import sys
base_dir = os.path.dirname(os.path.abspath(__file__))
target_file = os.path.join(base_dir, "Getraenkekarte.pdf")
generate_pdf(target_file)