# Generate a styled PDF based on the provided project sheet from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, Image from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.pagesizes import A4 from reportlab.lib.units import mm from reportlab.lib import colors from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont import os # Try to register a Unicode font for Cyrillic support font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf" font_name = "DejaVuSans" if os.path.exists(font_path): pdfmetrics.registerFont(TTFont(font_name, font_path)) else: font_name = "Helvetica" file_path = "/mnt/data/titul_town_project_sheet.pdf" styles = getSampleStyleSheet() title_style = ParagraphStyle( "Title", parent=styles["Heading1"], fontName=font_name, fontSize=28, leading=32, spaceAfter=16, ) section_style = ParagraphStyle( "Section", parent=styles["Heading3"], fontName=font_name, fontSize=16, leading=20, spaceAfter=8, ) text_style = ParagraphStyle( "Text", parent=styles["BodyText"], fontName=font_name, fontSize=11, leading=15, ) bold_style = ParagraphStyle( "Bold", parent=text_style, fontName=font_name, fontSize=11, ) gold = colors.HexColor("#C79A4A") light_bg = colors.HexColor("#F5F5F5") elements = [] # Header header = Table( [[Paragraph("TITUL TOWN", ParagraphStyle("h", fontName=font_name, fontSize=20, alignment=1, textColor=colors.white))]], colWidths=[180*mm], rowHeights=[25*mm], ) header.setStyle( TableStyle([ ("BACKGROUND", (0,0), (-1,-1), gold), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ]) ) elements.append(header) elements.append(Spacer(1, 12)) # Title elements.append(Paragraph("Строительство четвертой очереди", title_style)) # Left column content description = """ Строительство четвертой очереди Многоквартирного жилого комплекса TITUL TOWN, Комфорт-класс с чистовой отделкой по программе Наурыз (Отбасы Банк), четыре пятиэтажных дома с тремя подъездами, 275 квартир от 43 м2 до 65 м2 в г. Алматы, Алатауский р-н. """ tech_list = """ • Железобетонный каркас
• Заполнение наружных стен — газоблок
• Фасад — Хризатилцементная плита производства QazFiberCement
• Пластиковые окна
• Кровля с применением материалов Технониколь
• Межкомнатные перегородки — по технологии ЛСТК со звукоизоляционным материалом Акустик Кнауф """ left_content = [ Paragraph("Описание проекта:", section_style), Paragraph(description, text_style), Spacer(1,10), Paragraph("Применяемая технология", section_style), Paragraph(tech_list, text_style), Spacer(1,10), Paragraph("Рынок сбыта:
Отбасы Банк по программе Наурыз", text_style), Spacer(1,8), Paragraph("Местоположение:
Республика Казахстан, г. Алматы, Алатауский район, 20-ый микрорайон.", text_style), Spacer(1,8), Paragraph('Инициатор проекта:
Компания ТОО "IQONIQ Construction"', text_style), ] # KPI table kpi_data = [ ["Период реализации проекта", "18 месяцев"], ["Количество м2", "14 575"], ["Себестоимость 1 м2", "450 000"], ["Себестоимость четвертой очереди", "6 558 750 000"], ["Реализация 1м2", "595 000"], ["Сумма реализации проекта", "8 672 125 000"], ["Прибыль до вычета налогов", "2 113 375 000"], ] kpi_table = Table( [[Paragraph("Ключевые показатели проекта", section_style), ""]] + kpi_data, colWidths=[85*mm, 35*mm] ) kpi_table.setStyle( TableStyle([ ("FONTNAME", (0,0), (-1,-1), font_name), ("FONTSIZE", (0,1), (-1,-1), 11), ("BOTTOMPADDING", (0,0), (-1,-1), 6), ("LINEBELOW", (0,0), (-1,0), 1, gold), ("ALIGN", (1,1), (1,-1), "RIGHT"), ]) ) # Try to include the provided image if available img_path = "/mnt/data/Снимок экрана 2026-03-11 в 18.40.13.png" right_items = [kpi_table, Spacer(1,12)] if os.path.exists(img_path): right_items.append(Image(img_path, width=120*mm, height=70*mm)) # Build columns main_table = Table( [[left_content, right_items]], colWidths=[90*mm, 90*mm] ) main_table.setStyle( TableStyle([ ("VALIGN", (0,0), (-1,-1), "TOP"), ("LEFTPADDING", (0,0), (-1,-1), 10), ("RIGHTPADDING", (0,0), (-1,-1), 10), ]) ) elements.append(main_table) doc = SimpleDocTemplate( file_path, pagesize=A4, rightMargin=20, leftMargin=20, topMargin=20, bottomMargin=20, ) doc.build(elements) file_path