Spaces:
Sleeping
Sleeping
Alessandro Tomassini
deploy(hf): overlay README/Dockerfile da huggingface/, senza docs/binari/model
c42a5a1 | """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)}, | |
| ) | |