"""Metodo E — PDF annotato non distruttivo (testo conservato).""" from __future__ import annotations import io from pdf.rendering.base import MethodInfo, RenderKind, RenderMethod, RenderOutput, RenderParams from pdf.rendering.styles import fit_fontsize, severity_rgb class AnnotatePdfMethod(RenderMethod): info = MethodInfo( key="annotate", label="E · PDF annotato", kind=RenderKind.DOWNLOAD, media_type="application/pdf", styles=("fill", "outline", "label"), default_style="fill", description=( "PDF scaricabile con box cosmetici: il testo resta nel file " "(solo anteprima, NON adatto alla consegna)." ), destructive=False, ) def render(self, params: RenderParams) -> RenderOutput: import fitz doc = fitz.open(stream=params.pdf_bytes, filetype="pdf") n = 0 for b in params.boxes: page = doc.load_page(b.get("page", 0)) rect = fitz.Rect(b["x0"], b["y0"], b["x1"], b["y1"]) color = severity_rgb(b.get("severity", "media")) if params.style == "outline": page.draw_rect(rect, color=color, width=1.2) elif params.style == "label": page.draw_rect(rect, color=color, fill=color, fill_opacity=params.opacity) text = str(b.get("label", "")) page.insert_textbox( rect, text, fontsize=fit_fontsize(text, rect), color=(1, 1, 1), align=fitz.TEXT_ALIGN_CENTER, ) else: # fill page.draw_rect(rect, color=color, fill=color, fill_opacity=params.opacity) n += 1 buf = io.BytesIO() doc.save(buf, garbage=4, deflate=True) doc.close() return RenderOutput( data=buf.getvalue(), media_type=self.info.media_type, filename="anteprima.pdf", headers={"X-Entities-Annotated": str(n)}, )