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