shadow / authoring /export_pdf.py
garywelz's picture
Add reader, versioning, and export tools
b15141d
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()