Subir un diploma o certificado a LinkedIn o enviarlo a una convocatoria laboral o académica es algo cotidiano. Sin embargo, en países como Colombia, casi todas las instituciones imprimen la cédula de ciudadanía en el documento. ¿Cómo proteger tu privacidad sin dañar la estética del certificado?
Foto por FlyD en Unsplash
⚠️ El peligro del "recuadro negro"
Muchos usuarios abren Word, Canva o el visor de PDF y dibujan una barra negra o blanca sobre su documento. Esto no borra nada. El texto sigue exactamente debajo en el flujo del PDF. Cualquier persona puede pasar el cursor, presionar Ctrl + C y copiar tu cédula en un segundo.
1. ¿Qué es una Redacción Real (True Redaction)?
En la especificación técnica del formato PDF, el texto se almacena como secuencias de comandos vectoriales (operadores como Tj o TJ). Cuando colocas un recuadro encima, simplemente estás añadiendo un objeto gráfico en una capa superior; los caracteres originales siguen presentes en el archivo.
Una Redacción Real (True Redaction) interviene el flujo binario del documento para:
- Destruir físicamente las instrucciones de texto subyacentes.
- Sobrescribir los píxeles en documentos escaneados o imágenes rasterizadas.
- Garantizar que ninguna búsqueda por texto o extracción forense pueda recuperar el número.
2. El problema estético: Evitando el aspecto de documento clasificado
La mayoría de herramientas que hacen redacción real colocan una agresiva barra negra opaca. En un certificado de honor, un diploma o un reconocimiento académico, una barra negra parece una censura judicial o un archivo desclasificado de la CIA.
Para solucionar esto, diseñamos un enfoque en dos pasos con Python:
- Muestreo perimetral del color de fondo: El script examina los píxeles alrededor de donde estaba tu cédula y extrae el color exacto (blanco puro, crema, degradado o marca de agua).
- Adaptación tipográfica: Sustituye la cifra por la frase
Dato anonimizadoen el mismo color y tamaño de la fuente circundante.
def get_perimeter_background(page, rect, dpi=150):
pix = page.get_pixmap(dpi=dpi)
sx, sy = pix.width / page.rect.width, pix.height / page.rect.height
x0, x1 = int((rect.x0 - 2) * sx), int((rect.x1 + 2) * sx)
y0, y1 = int((rect.y0 - 2) * sy), int((rect.y1 + 2) * sy)
perim = [pix.pixel(x, y0)[:3] for x in range(x0, x1 + 1)] + \
[pix.pixel(x, y1)[:3] for x in range(x0, x1 + 1)]
perim.sort(key=lambda c: sum(c))
median = perim[len(perim) // 2]
return (median[0]/255.0, median[1]/255.0, median[2]/255.0)
3. Aplicando la redacción con PyMuPDF
Utilizando la librería PyMuPDF (fitz), podemos aplicar la redacción en dos instrucciones que ejecutan el borrado irreversible:
page.add_redact_annot(
rect,
text="Dato anonimizado",
fontname="helv",
fontsize=optimal_font_size,
align=1, # Centrado
fill=bg_color, # Fondo mimetizado
text_color=text_color # Tipografía a tono
)
# BORRADO DEFINITIVO del flujo de datos
page.apply_redactions(images=fitz.PDF_REDACT_IMAGE_PIXELS)
4. ¿Y qué pasa con los documentos escaneados?
En certificados antiguos o actas de posesión escaneadas, el texto no existe como caracteres vectoriales, sino como una imagen de mapa de bits (escaneo). Si aplicas una búsqueda convencional por texto, el visor no encontrará nada.
El parámetro images=fitz.PDF_REDACT_IMAGE_PIXELS le indica al motor de PyMuPDF que recalcule la imagen rasterizada incrustada y reemplace los píxeles del área con el color de fondo. Así, incluso si alguien aplica OCR forense a la imagen resultante, el número ya no existe.
5. Buenas prácticas: La regla de las dos carpetas
Cuando tienes decenas o cientos de archivos organizados por carpetas (SENA, Ministerio, Universidad, AWS, etc.), la mejor práctica de gestión documental es:
datos completos/: Conserva los archivos originales con toda su información para trámites notariales, judiciales o administrativos privados.datos anonimizados/: Estructura idéntica con los mismos nombres de archivo, pero procesados y auditados para publicación en la web o envío público.
🚀 Descarga el código completo en GitHub
He liberado el script completo con soporte de línea de comandos (CLI) y procesamiento en lote bajo licencia abierta MIT:
Ver Repositorio: sebastian09781/pdf-data-anonymizer