teste_laudos / document /formatters /paragraph.py
gui-sparim's picture
Upload 44 files
8d6c767 verified
"""
Formatadores de parágrafos.
"""
from docx import Document
from docx.shared import Pt, Inches, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from typing import Optional, Tuple, Union
def aplicar_cor_run(run, cor: Optional[Union[Tuple[int, int, int], RGBColor]]) -> None:
"""
Aplica cor RGB a um run.
Args:
run: Run do python-docx
cor: tuple (r,g,b) ou RGBColor
"""
if cor:
if isinstance(cor, tuple):
run.font.color.rgb = RGBColor(cor[0], cor[1], cor[2])
else:
run.font.color.rgb = cor
def criar_paragrafo_formatado(
doc: Document,
texto: str,
negrito: bool = False,
sublinhado: bool = False,
italico: bool = False,
tamanho: int = 11,
cor: Optional[Union[Tuple[int, int, int], RGBColor]] = None,
alinhamento=WD_ALIGN_PARAGRAPH.JUSTIFY,
espaco_antes: int = 0,
espaco_depois: int = 6,
recuo_esq: float = 0,
recuo_primeira_linha: float = 0,
fonte: str = 'Arial'
):
"""
Cria um parágrafo com formatação completa.
Args:
doc: Documento python-docx
texto: Texto do parágrafo
negrito, sublinhado, italico: Formatação do texto
tamanho: Tamanho da fonte em pontos
cor: RGBColor ou tuple (r,g,b)
alinhamento: WD_ALIGN_PARAGRAPH constant
espaco_antes, espaco_depois: Espaçamento em pontos
recuo_esq: Recuo esquerdo em inches
recuo_primeira_linha: Recuo da primeira linha em cm
fonte: Nome da fonte
Returns:
Parágrafo criado
"""
p = doc.add_paragraph()
run = p.add_run(texto)
run.bold = negrito
run.underline = sublinhado
run.italic = italico
run.font.size = Pt(tamanho)
run.font.name = fonte
aplicar_cor_run(run, cor)
p.alignment = alinhamento
p.paragraph_format.space_before = Pt(espaco_antes)
p.paragraph_format.space_after = Pt(espaco_depois)
if recuo_esq:
p.paragraph_format.left_indent = Inches(recuo_esq)
if recuo_primeira_linha:
p.paragraph_format.first_line_indent = Cm(recuo_primeira_linha)
return p
def add_body_text(doc: Document, text: str, cor=None, indent: bool = True):
"""Adiciona texto do corpo com formatação padrão."""
return criar_paragrafo_formatado(
doc, text, tamanho=11, cor=cor,
espaco_depois=6, recuo_esq=0.3 if indent else 0,
recuo_primeira_linha=1.25 if indent else 0
)
def add_placeholder_text(doc: Document, text: str = "[Preencher informações]", indent: bool = True):
"""Adiciona texto placeholder em vermelho."""
return criar_paragrafo_formatado(
doc, text, tamanho=11, cor=RGBColor(255, 0, 0),
espaco_depois=6, recuo_esq=0.3 if indent else 0,
recuo_primeira_linha=1.25 if indent else 0
)
def add_bullet_text(doc: Document, text: str, indent_level: int = 1):
"""Adiciona texto com bullet/recuo."""
return criar_paragrafo_formatado(
doc, f"• {text}", tamanho=11,
espaco_depois=3, recuo_esq=0.3 + (indent_level * 0.2)
)