from __future__ import annotations from io import BytesIO from weasyprint import HTML from cv.services.dowload.base import ProfileSerializer class PdfRenderer: """Формирует HTML на лету (без шаблона) и конвертирует в PDF.""" def __init__(self): # template не используется, оставлен для совместимости интерфейса self.serializer = ProfileSerializer() def render(self, profile) -> BytesIO: data = self.serializer.serialize(profile) # Минимальный, печатный HTML с безопасными стилями parts = [] parts.append("") parts.append(f"{data['full_name']} — Резюме (PDF)") parts.append(""" """) # Header parts.append(f"

{data['full_name']}

") if data["role"]: parts.append(f"

{data['role']}

") if data["summary"]: parts.append(f"

{data['summary']}

") meta_tags = [] if data["location"]: meta_tags.append(f"{data['location']}") if data["languages"]: meta_tags.append(f"Языки: {', '.join(data['languages'])}") if meta_tags: parts.append(f"

{' '.join(meta_tags)}

") # Contacts contacts = data["contacts"] parts.append("

Контакты

") if contacts.get("email"): parts.append(f"Email: {contacts['email']}
") if contacts.get("phone"): parts.append(f"Телефон: {contacts['phone']}
") if contacts.get("telegram"): parts.append(f"Telegram: {contacts['telegram']}") parts.append("

") # Experience parts.append("

Опыт работы

") exp = data["experience"] if exp: for e in exp: parts.append("
") parts.append(f"
{e.company}
") period = "" if getattr(e, 'start_date', None): period += e.start_date.strftime("%B %Y") period += " — " period += e.end_date.strftime("%B %Y") if getattr(e, 'end_date', None) else "настоящее время" parts.append(f"
{period}
") if e.summary: parts.append(f"

{e.summary}

") if e.achievements: parts.append("") if e.tech: parts.append(f"

Технологии: {', '.join(e.tech)}

") parts.append("
") else: parts.append("

Нет записей.

") # Skills parts.append("

Навыки

") skills = data["skills_map"] if skills: for g in skills: if g.items: parts.append(f"

{g.group}: {', '.join([i for i in g.items if i])}

") else: parts.append("

Нет данных.

") parts.append("") html = "".join(parts) pdf = HTML(string=html).write_pdf() out = BytesIO(pdf) out.seek(0) return out