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['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"") # 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("
{e.summary}
") if e.achievements: parts.append("{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