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", "Zutaten: Wodka, frischer Limettensaft, Ginger Beer, Minzzweig & Limettenspalte.
Geschmack: Scharf-würzig, erfrischend und spritzig."),
("2. Gin & Tonic", "Zutaten: Klassischer Gin, Tonic Water, Limettenscheibe.
Geschmack: Der elegante Klassiker – herb, bitter und ohne Zuckerüberhang."),
("3. Mojito", "Zutaten: Weißer Rum, frische Minzblätter, Zuckersirup, Limettensaft, Sprudelwasser.
Geschmack: Aromatisches Bar-Feeling mit frischer Minze."),
("4. Cuba Libre", "Zutaten: Weißer Rum, erfrischende Cola, frischer Limettensaft, Limette.
Geschmack: Der süße, vertraute Party-Dauerbrenner."),
("5. Vodka Cranberry", "Zutaten: Wodka, Cranberrysaft, Soda, frischer Limettensaft, Limettenscheibe.
Geschmack: Angenehm säuerlich-herb statt klebrig-süß."),
("6. Skinny Bitch", "Zutaten: Wodka, spritziges Mineralwasser, viel frischer Limettensaft.
Geschmack: 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)
]
cell_right = [
Paragraph(cocktails[i+1][0], drink_title_style),
Paragraph(cocktails[i+1][1], drink_text_style)
]
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), 8),
('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"{m[0]}", 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, 6*mm))
story.append(Paragraph("✨ Cheers! Cheers to great drinks and good vibes! ✨", footer_style))
doc.build(story, canvasmaker=NumberedCanvas)
print("PDF updated.")
if __name__ == "__main__":
out_path = r"C:\Users\Danie\.gemini\antigravity-ide\scratch\Getraenkekarte.pdf"
generate_pdf(out_path)