cómo funciona la extracción de texto de un pdf
Cómo funciona la extracción de texto de un PDF
Dentro de un PDF no hay palabras. Hay glifos numerados en coordenadas. Todo lo que te devuelve un extractor de texto es una reconstrucción razonada, y por eso a veces es asombrosamente buena y a veces es un galimatías.
01
Paso uno: encontrar las instrucciones de dibujo
El extractor descomprime el flujo de contenido de cada página y lo recorre buscando operadores de texto. El texto vive entre `BT` y `ET` — begin text, end text — y dentro de ese bloque un puñado de operadores hacen todo el trabajo. `Tf` selecciona tipografía y cuerpo. `Tm` y `Td` fijan la posición. `Tj` y `TJ` dibujan una cadena.
Así que la materia prima es una lista del estilo: en (72, 720), con la tipografía F1 a 12 puntos, dibuja estos bytes. Repetido unos cuantos miles de veces. Eso es literalmente todo lo que contiene el archivo.
02
Paso dos: convertir códigos de glifo en caracteres — la parte difícil
Los bytes de dentro de un `Tj` no son Unicode. Son índices de la tabla interna de glifos de una tipografía. El byte 0x44 significa "dibuja el glifo 68 de esta tipografía", y el glifo 68 solo es la letra D si la tipografía lo dice.
Hay dos maneras de averiguarlo. Las tipografías simples llevan una codificación — a menudo una estándar como WinAnsi, a veces una matriz Differences propia que reasigna casillas sueltas. Las tipografías compuestas, que son casi todas las incrustadas modernas, necesitan un CMap `ToUnicode`: una tabla explícita dentro del archivo que asigna cada código de glifo a un carácter Unicode.
Cuando ese CMap está y es correcto, la extracción es exacta. Cuando falta, el extractor adivina — normalmente recurriendo a los nombres de glifo de la tipografía y, si eso falla, a los códigos en bruto. De ahí sale el texto extraído que aparece como una tirada de consonantes acentuadas o de caracteres chinos en un documento claramente en español. No hay nada roto: el archivo sencillamente nunca dijo qué significaban sus glifos.
Las tipografías subconjunto empeoran esto. Para ahorrar espacio, el programa que escribe incrusta solo los glifos usados y los renumera, así que la correspondencia es completamente arbitraria y depende por entero del CMap que ese programa se haya molestado o no en incluir.
- Con CMap ToUnicode
- Extracción exacta. El archivo declara qué significa cada glifo.
- Codificación estándar, sin CMap
- Suele salir bien con texto latino corriente. Los acentos y los símbolos empiezan a resbalar.
- Tipografía subconjunto, sin CMap
- Galimatías. La numeración de glifos es arbitraria y nada dentro del archivo la descifra.
- Texto convertido a contornos
- No hay texto en absoluto: las letras son formas vectoriales. Solo el OCR puede leerlo, igual que con un escaneo.
03
Paso tres: inventarse los espacios
Esto sorprende a la gente. Un PDF no tiene por qué guardar los espacios. Dos palabras se dibujan a menudo como dos cadenas separadas con un salto de posición entre medias, o como una única matriz `TJ` con un número negativo en el centro — `[(Ho) -20 (la)] TJ` — donde el número es un ajuste de kerning en milésimas de eme.
Así que el extractor mide. Sabe el ancho de avance de cada glifo por la tipografía, así que sabe dónde *debería* haber terminado un carácter. Si el siguiente empieza bastante más a la derecha de eso, inserta un espacio. Si el hueco es pequeño, no.
El umbral es una heurística, y es la razón de que el texto extraído llegue a veces como `E s t o e s t á s e p a r a d o` o, en el otro sentido, como `palabraspegadas`. El texto justificado es el culpable habitual: estirar una línea para que llegue al margen ensancha los espacios reales hasta que el kerning de dentro de una palabra empieza a parecerse a uno.
04
Paso cuatro: reconstruir líneas, columnas y orden de lectura
Ahora el extractor tiene caracteres con coordenadas y ninguna noción de línea. Agrupa por posición vertical — los glifos que comparten una línea base, dentro de una tolerancia, son una línea —, ordena cada línea de izquierda a derecha y luego ordena las líneas de arriba abajo.
Eso funciona con una sola columna. Falla estrepitosamente con dos, porque el orden del flujo de contenido es orden de dibujo y el orden por coordenadas baja por la página cruzando el medianil. Línea uno de la columna uno, línea uno de la columna dos, línea dos de la columna uno. El resultado son palabras legibles en un orden ilegible.
Los extractores buenos hacen primero un análisis de maquetación: encuentran los medianiles en blanco, parten la página en bloques de columna y extraen cada bloque entero antes de pasar al siguiente. Las tablas reciben el mismo trato una dimensión más arriba: las celdas se agrupan en filas y columnas por alineación, porque nada en el archivo dice "tabla". Un borde rayado son cuatro líneas dibujadas en la página, y para el extractor no significan nada.
Aquí es también donde ocurre la reconstrucción de párrafos y donde hay que deshacer los guiones de partición. Una palabra partida en un salto de línea son dos tiradas de glifos y un guion; volver a juntarlas exige una regla sobre cuándo un guion final es una partición y cuándo forma parte de una palabra compuesta.
05
Los modos de fallo, y qué significa cada uno
Porque ahora ya puedes leer el síntoma hacia atrás hasta la causa:
- No sale nada de nada
- No hay capa de texto. La página es una imagen, o el texto se convirtió a contornos. Pásale el OCR.
- Caracteres ilegibles
- Un CMap ToUnicode ausente o equivocado. Los glifos se dibujaron bien; nada los descifra.
- Texto en el orden equivocado
- Maquetación a varias columnas, o un orden de dibujo que no coincide con el de lectura.
- Espacios de más o de menos
- La heurística del hueco. Habitual en texto justificado y en titulares con mucho interletraje.
- "fi" y "fl" en el resultado
- Ligaduras. Dos letras dibujadas como un solo glifo, y el CMap lo asignó al carácter de ligadura en lugar de al par.
06
Por qué este es el mismo problema que PDF a Word
Convertir a Word es extracción de texto más una capa extra de deducción. Una vez reconstruidos caracteres, espacios, líneas y columnas, el conversor tiene que adivinar la semántica: esta tirada va a 18 puntos, en negrita y sola encima de un párrafo, así que probablemente es un título; estas líneas empiezan todas con la misma sangría y un glifo de viñeta, así que probablemente esto es una lista.
Cada una de esas cosas es una conjetura hecha a partir de evidencia visual, porque el archivo registra la apariencia y nada más. Por eso la calidad de la conversión varía tanto según el origen. Un PDF exportado desde Word, que todavía puede llevar etiquetado, se convierte bien. Un PDF salido de un motor de composición no lleva ninguna estructura, y el conversor lo está leyendo exactamente como lo leerías tú de un papel impreso.