188 lines
6.5 KiB
Python
188 lines
6.5 KiB
Python
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. Gin & Tonic", "<b>Zutaten:</b> Klassischer Gin, Tonic Water, Limettenscheibe.<br/><b>Geschmack:</b> Der elegante Klassiker – herb, bitter und ohne Zuckerüberhang."),
|
||
("3. Mojito", "<b>Zutaten:</b> Weißer Rum, frische Minzblätter, Zuckersirup, Limettensaft, Sprudelwasser.<br/><b>Geschmack:</b> Aromatisches Bar-Feeling mit frischer Minze."),
|
||
("4. Cuba Libre", "<b>Zutaten:</b> Weißer Rum, erfrischende Cola, frischer Limettensaft, Limette.<br/><b>Geschmack:</b> Der süße, vertraute Party-Dauerbrenner."),
|
||
("5. Vodka Cranberry", "<b>Zutaten:</b> Wodka, Cranberrysaft, Soda, frischer Limettensaft, Limettenscheibe.<br/><b>Geschmack:</b> Angenehm säuerlich-herb statt klebrig-süß."),
|
||
("6. 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)
|
||
]
|
||
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"<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, 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)
|