AiAnonymize_v3 / pdf /rendering /annotate_method.py
Alessandro Tomassini
deploy(hf): overlay README/Dockerfile da huggingface/, senza docs/binari/model
c42a5a1
Raw
History Blame Contribute Delete
2.02 kB
"""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)},
)