teste_docs / document /formatters /paragraph.py
Guilherme Silberfarb Costa
Initial deployment for Hugging Face Space
5240148
Raw
History Blame Contribute Delete
3.09 kB
"""
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)
)