¿Cómo funciona la extracción de estructura de un PDF? PDF etiquetado y detección de títulos
9 min de lectura
Generar Markdown a partir de un PDF es en realidad un problema de inferencia bastante difícil. Porque dentro del PDF casi nunca está la información de "esto es un título" o "este párrafo se lee después de aquel". En este artículo explicamos qué hacen los conversores, qué pistas usan y por qué tienen éxito con unos documentos y fracasan con otros.
Qué guarda y qué no guarda un PDF
El contenido de una página de PDF consta de instrucciones de dibujo:
BT
/F2 18 Tf % selecciona tipografía de 18 puntos
72 720 Td % ve a la posición
(Introduccion) Tj % escribe "Introduccion"
ET
BT
/F1 11 Tf % selecciona tipografía de 11 puntos
72 690 Td
(El tema abordado en este trabajo...) Tj
ET
Lo que hay en esas instrucciones: qué letras se dibujan, con qué tipografía, a qué tamaño y en qué coordenada.
Lo que no hay: que la palabra "Introducción" es un título. Que el texto que la sigue es el párrafo que va bajo ese título. Dónde termina el párrafo y empieza el siguiente.
Cuando una persona mira la página lo entiende al instante, porque ver una palabra de 18 puntos en negrita sola en una línea significa "título". El conversor tiene que hacer esa misma inferencia.
PDF etiquetado: el caso que no requiere inferencia
Un PDF etiquetado (tagged) lleva, además del contenido de la página, la estructura semántica del documento. En el archivo hay un árbol de estructura:
Document
├── H1 "Introducción"
│ └── P "El tema abordado en este trabajo..."
├── H2 "Método"
│ ├── P "La investigación se desarrolla en estos pasos..."
│ └── L (lista)
│ ├── LI "Primer paso"
│ └── LI "Segundo paso"
└── Table
├── TR
│ ├── TH "Año"
│ └── TH "Valor"
└── TR ...
Ese árbol es exactamente la información que necesita Markdown. Generar Markdown desde un PDF etiquetado no es inferencia sino correspondencia directa:
| Etiqueta PDF | Markdown |
|---|---|
| H1, H2, H3 | #, ##, ### |
| P | Párrafo |
| L / LI | Lista con - |
| Table / TR / TD | Tabla Markdown |
| Link | [texto](url) |
| Figure |  |
El resultado es dramáticamente mejor que con los PDF sin etiquetar.
¿De dónde vienen los PDF etiquetados?
- PDF generados desde Word con la opción de "Etiquetas de la estructura del documento" activada
- Documentos corporativos preparados según requisitos de accesibilidad
- Documentos conformes al estándar PDF/UA (Universal Accessibility)
¿De dónde no vienen?
- Archivos generados por la vía de "Imprimir como PDF"
- La mayoría de las salidas de programas de diseño (si no se configura expresamente)
- Documentos escaneados
- PDF antiguos
Puedes ver si tu documento está etiquetado en la ventana de propiedades del documento del visor de PDF.
El proceso de inferencia en un PDF sin etiquetar
Si no hay etiquetas, el conversor hace lo siguiente por orden.
1. Reunir los fragmentos de texto
El PDF guarda el texto en fragmentos pequeños. A veces una palabra, a veces unas pocas letras y a veces un solo carácter pueden ser una instrucción de dibujo independiente, sobre todo en textos con el espaciado entre caracteres ajustado.
El conversor forma palabras y líneas uniendo los fragmentos que están en la misma línea y próximos entre sí.
La dificultad: encontrar los límites de palabra. En un PDF no siempre se escribe el carácter de espacio; a veces solo se desplaza el cursor hacia delante. El conversor tiene que decidir "aquí hay un espacio" mirando la distancia entre fragmentos. Si el umbral se elige mal, o las palabras se pegan o aparece un espacio en mitad de una palabra.
2. Agrupar las líneas en párrafos
¿Las líneas consecutivas pertenecen al mismo párrafo? Las pistas:
- Distancia vertical: ¿el espacio entre líneas es el normal o mayor?
- Sangría de la primera línea: un párrafo nuevo puede empezar con sangría.
- El final de la línea anterior: si la línea llega hasta el final del ancho de página, continúa; si termina antes, puede ser final de párrafo.
- Puntuación: una línea corta terminada en punto es una señal de final de párrafo.
3. Determinar el orden de lectura
Este es el paso más difícil.
En un PDF sin etiquetar, los fragmentos de texto se guardan en el orden de dibujo, y ese orden no tiene por qué coincidir con el orden visual de lectura. Un programa de diseño puede haber dibujado primero todos los títulos y después el texto del cuerpo.
El conversor intenta establecer un orden razonable mirando las coordenadas de los fragmentos. En una página a una columna eso es fácil: de arriba abajo y de izquierda a derecha.
El problema empieza en las maquetaciones a varias columnas. En una página a dos columnas, si ordenas las líneas simplemente de arriba abajo, la primera línea de la columna izquierda y la primera de la derecha quedan juntas y los textos se entrelazan:
"El objetivo de este trabajo los resultados obtenidos muestran que en las muestras analizadas..."
Una mezcla sin sentido. Los buenos conversores hacen detección de columnas: miran la distribución horizontal de los bloques de texto, encuentran los corredores de espacio en blanco y separan las columnas. Pero eso también es una conjetura y falla en maquetaciones complejas.
4. Detección de títulos
El conversor valora estas pistas:
| Pista | Peso | |---|---| | Cuerpo de letra (mayor que el del texto) | Alto | | Tipografía en negrita | Medio | | Cambio de familia tipográfica | Medio | | Lo corta que es la línea | Medio | | Mucho espacio encima o debajo | Medio | | Patrón de numeración (1., 1.1.) | Alto | | Estar escrito en mayúsculas | Bajo | | Estar al principio de la página | Bajo |
Después, esos candidatos se reparten en niveles: si en el documento hay cinco tamaños de título distintos, el mayor será H1, el siguiente H2 y así sucesivamente.
Errores típicos:
- Una frase destacada en negrita se toma por un título.
- Un subtítulo de cuerpo pequeño se toma por texto del cuerpo.
- Si en un mismo documento se han usado estilos de título distintos en secciones distintas, los niveles se mezclan.
- Los pies de figura y de tabla se toman por títulos.
5. Detección de listas
Se detectan las viñetas (•, -, ▪) y los números (1., a), i.). El nivel de sangrado determina las listas anidadas.
El problema: en un PDF, la viñeta a veces es un objeto de dibujo aparte (no texto), a veces es un carácter especial y a veces es solo una alineación visual creada con espacios. En el tercer caso, la detección se vuelve imposible.
6. Detección de tablas
Una de las estructuras más difíciles. Se usan dos enfoques:
Basado en líneas: encontrar las líneas horizontales y verticales de la página y formar una rejilla. Funciona bien en tablas con líneas.
Basado en alineación: mirar la alineación vertical de los fragmentos de texto y deducir columnas. Es la única vía en tablas sin líneas, pero es frágil: un párrafo corriente también se puede tomar por una tabla.
Aunque se detecte, la sintaxis de tablas de Markdown es limitada: no se pueden expresar celdas combinadas, tablas anidadas ni formato multilínea dentro de una celda.
Encabezados, pies y ruido
Arriba y abajo de cada página hay elementos que se repiten: el título del documento, el nombre de la sección, el número de página, el aviso de copyright, la fecha.
Forman parte del contenido de la página y el conversor puede tomarlos por contenido. El resultado son líneas de ruido que se repiten cada pocos párrafos.
Los buenos conversores usan una heurística: el texto que se repite en la misma posición en varias páginas es un encabezado o un pie. Esa detección suele funcionar, pero falla con los números de página, porque son distintos en cada página.
El problema de la codificación tipográfica
En algunos PDF, la extracción de texto da resultados extraños: caracteres sin sentido, letras que faltan, idiomas mezclados.
La causa es el mecanismo de codificación tipográfica del PDF. En un PDF, las letras se pueden guardar con los números de glifo internos de la tipografía, y debe existir una tabla de correspondencia (ToUnicode CMap) que dé el equivalente Unicode de esos números.
Si esa tabla falta o está corrupta, el conversor no puede traducir los números de glifo a las letras correctas. La página se ve bien en pantalla (porque el dibujo es correcto), pero la extracción de texto da una salida sin sentido.
En documentos con caracteres acentuados, este problema puede aparecer sobre todo en letras como á, é, í, ó, ú y ñ.
Por qué algunos PDF se convierten bien y otros mal
El factor decisivo es cómo se generó el PDF:
| Origen | Calidad de conversión | Motivo | |---|---|---| | Word (etiquetado) | Excelente | La información de estructura está en el archivo | | Word (sin etiquetar) | Buena | Estilos ordenados, una columna | | LaTeX | Buena-media | Ordenado pero sin etiquetar | | Programa de diseño (informe) | Media | Sin etiquetar, maquetación compleja | | Programa de diseño (folleto) | Mala | Varias columnas, cuadros, maquetación libre | | Escaneado + OCR | Débil | Capa de texto artificial | | Escaneado (sin OCR) | Imposible | No hay texto |
En resumen
Generar Markdown desde un PDF consiste en extraer estructura semántica de instrucciones de dibujo. En los PDF etiquetados esa estructura ya está en el archivo y la conversión se reduce a una correspondencia directa: el resultado sale casi sin errores. En los PDF sin etiquetar, en cambio, el conversor tiene que deducirlo todo a partir de pistas visuales: agrupar los fragmentos de texto, determinar el orden de lectura, deducir el nivel de título por el cuerpo de letra y detectar tablas por la alineación. Esas conjeturas funcionan bien en documentos ordenados a una columna y flojean en los de varias columnas y muy diseñados. Por eso lo correcto es ver la conversión no como un final, sino como un punto de partida que requiere limpieza manual.
Preguntas frecuentes
¿Qué es un PDF etiquetado (tagged) y cómo lo reconozco?
Un PDF etiquetado es un PDF que, además del contenido de la página, lleva la estructura semántica del documento: esto es un título, esto es un párrafo, esto es una celda de tabla, este es el orden de lectura. En la ventana de propiedades del documento de los visores de PDF suele haber una línea que dice 'PDF etiquetado: Sí/No'. Los PDF generados desde Word con la opción de 'etiquetas de la estructura del documento' activada están etiquetados.
¿Por qué el orden de lectura da problemas?
Porque en un PDF sin etiquetar los fragmentos de texto se guardan en el orden en que se dibujaron en la página, y ese orden no tiene por qué coincidir con el orden visual de lectura. Un programa de diseño puede haber dibujado primero todos los títulos y después el texto del cuerpo. El conversor tiene que deducir un orden razonable a partir de las coordenadas de los fragmentos, y en maquetaciones a varias columnas esa deducción falla a menudo.
¿En qué pistas se basa la detección de títulos?
El cuerpo de letra es la pista principal: las líneas claramente más grandes que el texto del cuerpo son candidatas a título. Además se valoran el grosor, el cambio de familia tipográfica, lo corta que es la línea, el espacio que se deja encima y debajo, la posición en la página y el patrón de numeración (1., 1.1., 1.1.1.). Ninguna de esas pistas es concluyente; todas juntas forman un cálculo de probabilidad.
¿Por qué de algunos PDF sale un Markdown perfecto y de otros sale mal?
El factor decisivo es cómo se generó el PDF. Un informe generado desde Word con etiquetas lleva la información estructural dentro del archivo y la conversión sale casi sin errores. Un folleto salido de un programa de diseño, a varias columnas y con cuadros, no lleva ninguna información estructural y el conversor tiene que deducirlo todo a partir de pistas visuales.
Pruébalo ahora mismo con PDF → Markdown.
Probar PDF → Markdown