Recortar un PDF no elimina nada

Recortas el membrete de un PDF, la página se ve bien y lo envías. El texto que has recortado sigue en el archivo — cada byte, en el mismo sitio, dibujado en las mismas coordenadas. Recortar movió la ventana, no el contenido.

La comprobación que da un falso visto bueno

Quien se preocupa lo bastante como para comprobarlo suele ejecutar algo así como strings informe.pdf | grep -i confidencial, no obtiene nada y concluye que el recorte funcionó. No funcionó. El contenido de una página va en un stream comprimido con Flate, y el texto de dentro se escribe a menudo en hexadecimal en lugar de ASCII: una línea que dice CONFIDENTIAL-PAYROLL se almacena como <434F4E464944454E5449414C…> Tj, dentro de un bloque deflate. strings no atraviesa ninguna de las dos capas, así que informa exactamente de lo que esperabas oír.

Eso es lo que hace duradera a esta trampa. La comprobación ingenua no se limita a no encontrar el problema: confirma activamente la respuesta equivocada.

Dos órdenes que enseñan la verdad

qpdf puede reescribir un PDF con sus streams sin comprimir y su estructura en forma legible:

qpdf --qdf --object-streams=disable recortado.pdf recortado.qdf
grep -a 'Tj' recortado.qdf | head

Ahí están todas las instrucciones de dibujo, incluidas las del contenido que ahora queda fuera de la ventana visible. Si el texto sale en hexadecimal, decodifícalo: echo 434F4E464944454E5449414C | xxd -r -p. Ejecuta las mismas dos órdenes sobre el original y compara el stream de contenido con el del recortado: son idénticos, byte a byte. Lo único que cambió fue /CropBox.

Eso lo afirmamos en la propia batería de pruebas de este proyecto en lugar de darlo por supuesto: los tests de pdf-crop dibujan una línea de texto arriba en la página, recortan 100 puntos de ese borde, descomprimen ambos streams y exigen que coincidan — mientras la altura visible baja de 800 a 700. Un aviso que nadie verifica no es más que un descargo de responsabilidad.

Por qué: la ventana y el dibujo son cosas distintas

Una página PDF lleva un /MediaBox (la hoja) y opcionalmente un /CropBox (la región que un visor debe mostrar). Las herramientas de recorte fijan el CropBox. El stream de contenido — la secuencia real de operadores de dibujo — queda intacto, porque editarlo significaría recomponer el texto, remapear las fuentes y reescribir las posiciones, que es una operación distinta y bastante más difícil.

Así que el recorte es una instrucción de visualización, y todo consumidor que la ignore lo ve todo: extractores de texto, indexadores, conversores, cualquiera que abra el archivo con una librería en vez de con un lector, y cualquiera que simplemente vuelva a poner el CropBox.

Qué lo elimina de verdad

Renderizar la página a píxeles y reconstruir el documento a partir de ellos. La región recortada nunca llega a dibujarse en el ráster, así que no puede sobrevivir:

  1. Recorta a la región que quieres conservar.
  2. Renderiza cada página a PNG: la ventana visible se convierte en imagen.
  3. Reensambla las imágenes en un PDF.

El coste es real y conviene decirlo: el texto ahora son píxeles. No se puede seleccionar, buscar ni copiar, un lector de pantalla no lo lee, y el archivo suele pesar bastante más. Es una pérdida de verdad, no una nota al pie — pero es el intercambio que elimina el contenido, y elegirlo a sabiendas es mejor que creer que el recorte hizo el trabajo.

La misma trampa, tres puertas más allá

Dibujar un rectángulo negro sobre el texto es el mismo fallo con mejor marketing: el rectángulo es una instrucción de dibujo más encima del texto, y el texto de debajo se extrae igual de limpio que siempre.

Los metadatos son un canal aparte. Autor, título, productor y el paquete XMP viajan con el archivo y sobreviven a cualquier edición visual: léelos y bórralos explícitamente. Ojo: un documento puede llevar sus metadatos por duplicado, en el diccionario de información y en XMP, y los lectores modernos prefieren la copia que no editaste.

Recortar una imagen no es la misma operación. Recortar una imagen ráster sí descarta de verdad los píxeles de fuera del rectángulo: no hay distinción entre ventana y contenido donde esconderse. Las dos herramientas comparten nombre y no comportamiento, que es justo por lo que nuestra página de pdf-crop dice «recortar oculta el contenido; no lo elimina» y la de imagen no.

Lo que no hacemos

La redacción de verdad — eliminar el texto que hay bajo un recuadro negro conservando el resto del documento como texto — exige reescribir streams de contenido. No la implementamos, y preferimos decirlo a publicar algo que parezca redacción sin serlo. Si tu documento es realmente sensible, toma la vía de rasterizar y reconstruir como el mínimo, verifica el resultado con las órdenes de qpdf y no con strings, y recuerda que el historial del archivo también vive en sus metadatos.