# 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