| from __future__ import annotations |
|
|
| from io import BytesIO |
| from typing import Any |
|
|
|
|
| def export_pdf(manuscript: dict[str, Any]) -> bytes: |
| from reportlab.lib.pagesizes import LETTER |
| from reportlab.lib.styles import getSampleStyleSheet |
| from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, PageBreak |
| from reportlab.lib.units import inch |
|
|
| buf = BytesIO() |
| doc = SimpleDocTemplate( |
| buf, |
| pagesize=LETTER, |
| leftMargin=0.9 * inch, |
| rightMargin=0.9 * inch, |
| topMargin=0.9 * inch, |
| bottomMargin=0.9 * inch, |
| title=str(manuscript.get("title") or "Manuscript"), |
| ) |
| styles = getSampleStyleSheet() |
| story: list[Any] = [] |
|
|
| title = manuscript.get("title") or "Manuscript" |
| story.append(Paragraph(title, styles["Title"])) |
| story.append(Spacer(1, 0.25 * inch)) |
|
|
| chapters = manuscript.get("chapters") or [] |
| for idx, ch in enumerate(chapters, start=1): |
| ch_title = ch.get("title") or f"Chapter {idx}" |
| story.append(Paragraph(ch_title, styles["Heading1"])) |
| story.append(Spacer(1, 0.12 * inch)) |
| for seg in ch.get("segments") or []: |
| text = (seg.get("text") or "").strip() |
| if not text: |
| continue |
| for para in text.split("\n\n"): |
| story.append(Paragraph(para.strip().replace("\n", " "), styles["BodyText"])) |
| story.append(Spacer(1, 0.12 * inch)) |
| story.append(PageBreak()) |
|
|
| doc.build(story) |
| return buf.getvalue() |
|
|
|
|