import os from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Frame, PageTemplate from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.units import cm # --- 1. Настройка шрифтов (Кириллица) --- # Пытаемся найти стандартный шрифт с кириллицей в Linux окружении font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf" bold_font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf" if not os.path.exists(font_path): # Фолбек, если шрифта нет (обычно в Colab/Linux есть) font_path = "DejaVuSans.ttf" try: pdfmetrics.registerFont(TTFont('Normal', font_path)) pdfmetrics.registerFont(TTFont('Bold', bold_font_path)) except: # Если шрифтов нет, используем стандартные (но кириллица может слететь без TTF) # В реальной среде лучше подгрузить свой шрифт pass # --- 2. Контент Чек-листа --- title_text = "ЧЕК-ЛИСТ: 7 ДЕТАЛЕЙ ОБРАЗА «НА МИЛЛИОН»" subtitle_text = "Истинная роскошь — тихая. Ей не нужны кричащие бирки." items = [ { "title": "1. «ВОЗДУХ» МЕЖДУ ТЕЛОМ И ТКАНЬЮ", "text": "Вещи в облипку часто выглядят дешево. Оверсайз или полуприлегание всегда смотрятся статуснее.", "rule": "Покупайте вещи на размер больше и ушивайте в талии. Это эффект «индивидуального пошива»." }, { "title": "2. ДОРОГАЯ ФУРНИТУРА", "text": "Дешевый пластик убивает любой крой. Срежьте родные пуговицы масс-маркета и пришейте качественные.", "rule": "Жакет за 5.000 ₽ с дорогими пуговицами начинает выглядеть на 50.000 ₽." }, { "title": "3. «НЕВИДИМОЕ» БЕЛЬЕ", "text": "Контуры белья или пережатая кожа удешевляют образ мгновенно.", "rule": "Только бесшовное белье телесного цвета. Гладкий силуэт — база элегантности." }, { "title": "4. ИНТЕЛЛЕКТУАЛЬНАЯ ПАЛИТРА (МОНОХРОМ)", "text": "Образ, собранный в одном цвете (бежевый, шоколадный, серый), всегда выглядит выше по классу.", "rule": "Разбавляйте образ не цветом, а фактурами (шелк + шерсть, кожа + кашемир)." }, { "title": "5. СОСТОЯНИЕ «НИЖНЕГО ЭТАЖА»", "text": "Сбитые набойки и солевые разводы — это приговор. Обувь должна быть идеально чистой.", "rule": "Носите с собой губку. Цоканье стертого каблука разрушает магию." }, { "title": "6. УХОЖЕННОСТЬ (ГОЛОВА И РУКИ)", "text": "Секущиеся концы или отросший гель-лак испортят даже Chanel.", "rule": "«Дорого» — это про здоровье волос и свежий маникюр (лучше нюд, чем отросший дизайн)." }, { "title": "7. КОРОЛЕВСКАЯ ОСАНКА", "text": "Сутулая спина превращает любой костюм в мешок.", "rule": "Подбородок параллельно полу. Уверенная походка — самый дорогой аксессуар." } ] footer_text = "Хочешь узнать, какие фасоны подходят именно тебе?
Нажми кнопку «Хочу разбор» в боте." # --- 3. Генерация PDF --- def create_luxury_pdf(filename): doc = SimpleDocTemplate( filename, pagesize=A4, rightMargin=2*cm, leftMargin=2*cm, topMargin=2*cm, bottomMargin=2*cm ) styles = getSampleStyleSheet() # Стили "Тихая Роскошь" # Цвета: Dark Grey #333333, Gold #C5A065 style_title = ParagraphStyle( 'LuxuryTitle', parent=styles['Heading1'], fontName='Bold', fontSize=20, leading=24, alignment=1, # Center textColor=colors.HexColor("#333333"), spaceAfter=10 ) style_subtitle = ParagraphStyle( 'LuxurySubtitle', parent=styles['Normal'], fontName='Normal', fontSize=12, leading=14, alignment=1, # Center textColor=colors.HexColor("#666666"), spaceAfter=30 ) style_item_title = ParagraphStyle( 'ItemTitle', parent=styles['Heading3'], fontName='Bold', fontSize=12, leading=14, textColor=colors.HexColor("#C5A065"), # Gold accent spaceBefore=15, spaceAfter=5 ) style_body = ParagraphStyle( 'BodyText', parent=styles['Normal'], fontName='Normal', fontSize=10, leading=14, textColor=colors.HexColor("#333333"), spaceAfter=5 ) style_rule = ParagraphStyle( 'RuleText', parent=styles['Normal'], fontName='Normal', # Можно Bold если есть шрифт fontSize=10, leading=14, textColor=colors.HexColor("#000000"), backColor=colors.HexColor("#F5F5F5"), # Light grey bg borderPadding=5, spaceAfter=10 ) style_footer = ParagraphStyle( 'Footer', parent=styles['Normal'], fontName='Normal', fontSize=11, alignment=1, textColor=colors.HexColor("#C5A065"), spaceBefore=30 ) story = [] # Заголовок story.append(Paragraph(title_text, style_title)) story.append(Paragraph(subtitle_text, style_subtitle)) story.append(Spacer(1, 0.5*cm)) # Линия разделитель # (В reportlab сложно просто линию, делаем пустой блок или используем графику в канвасе, но для простоты пропустим) # Пункты for item in items: story.append(Paragraph(item['title'], style_item_title)) story.append(Paragraph(item['text'], style_body)) story.append(Paragraph(f"ПРАВИЛО: {item['rule']}", style_rule)) # Футер story.append(Spacer(1, 1*cm)) story.append(Paragraph(footer_text, style_footer)) doc.build(story) # Создаем файл create_luxury_pdf("Checklist_DNA_Successful_Woman.pdf")