---
name: clean_pdf_text
kind: function
lang: py
domain: core
version: "1.0.0"
purity: pure
signature: "def clean_pdf_text(text: str) -> str"
description: "Limpieza de artefactos PyPDF2/pdfplumber: elimina marcas de pagina (1/20), tabs, guiones de dehyphenation, saltos de linea en medio de oraciones y espacios duplicados."
tags: [pdf, text, cleaning, nlp, preprocessing, pypdf2, pendiente-usar]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: [re]
params:
  - name: text
    desc: "Texto plano extraido de un PDF (ej. via PyPDF2.PdfReader o pdfplumber). Puede contener artefactos de paginacion, guiones de dehyphenation y saltos de linea espurios."
output: "Texto limpiado con artefactos eliminados y espacios normalizados. Listo para chunking o extraccion NER."
tested: true
tests:
  - "string vacio retorna vacio"
  - "marca de pagina 1/20 se elimina"
  - "dehyphenation exa-newline-mple -> example"
  - "espacios duplicados se colapsan"
  - "salto de linea en mitad de oracion se une con espacio"
  - "salto de linea tras punto se preserva"
test_file_path: "python/functions/core/tests/test_clean_pdf_text.py"
file_path: "python/functions/core/clean_pdf_text.py"
notes: |
  Funcion pura sin dependencias externas (solo re de stdlib).
  Orden de operaciones es significativo: dehyphenation antes que colapso
  de saltos de linea para evitar falsos positivos.
  No elimina saltos de linea tras punto/exclamacion/interrogacion —
  esos marcan fin de oracion y deben preservarse para el chunker.
---

## Ejemplo

```python
from core.clean_pdf_text import clean_pdf_text

raw = "Banco Bilbao Vizcaya Argen-\ntaria, S.A. operó en 2023.\n1/20\n\nFoo  Bar"
clean = clean_pdf_text(raw)
# "Banco Bilbao Vizcaya Argentaria, S.A. operó en 2023.\nFoo Bar"
```

## Notas

Disenada para preprocesar texto antes de pasarlo a `chunk_with_overlap` +
`extract_graph_gliner2`. El pipeline completo es:
`extract_pdf_text` -> `clean_pdf_text` -> `chunk_with_overlap` -> `extract_graph_gliner2`.
