Análisis de archivos PDF (especialmente con tablas) con PDFBox

Necesito analizar un archivo PDF que contiene datos tabulares. Estoy usando PDFBox para extraer el texto del archivo para analizar el resultado (cadena) más tarde. El problema es que la extracción de texto no funciona como esperaba para los datos tabulares. Por ejemplo, tengo un archivo que contiene una tabla como esta (7 columnas: las dos primeras siempre tienen datos, solo una columna de Complejidad tiene datos, solo una columna de Financiamiento tiene datos):

+----------------------------------------------------------------+ | AIH | Value | Complexity | Financing | | | | Medium | High | Not applicable | MAC/Other | FAE | +----------------------------------------------------------------+ | xyz | 12.43 | 12.34 | | | 12.34 | | +----------------------------------------------------------------+ | abc | 1.56 | | 1.56 | | | 1.56| +----------------------------------------------------------------+ 

Luego uso PDFBox:

 PDDocument document = PDDocument.load(pathToFile); PDFTextStripper s = new PDFTextStripper(); String content = s.getText(document); 

Esas dos líneas de datos se extraerían así:

 xyz 12.43 12.4312.43 abc 1.56 1.561.56 

No hay espacios en blanco entre los dos últimos números, pero este no es el mayor problema. El problema es que no sé lo que significan los dos últimos números: Medio, Alto, ¿No corresponde? MAC / Otro, FAE? No tengo la relación entre los números y sus columnas.

No es necesario que use la biblioteca PDFBox, por lo que una solución que use otra biblioteca está bien. Lo que quiero es poder analizar el archivo y saber qué significa cada número analizado.

Deberá diseñar un algoritmo para extraer los datos en un formato utilizable. Independientemente de la biblioteca de PDF que use, tendrá que hacer esto. Los personajes y los gráficos se dibujan mediante una serie de operaciones de dibujo con estado, es decir, se mueven a esta posición en la pantalla y dibujan el glifo para el carácter ‘c’.

Sugiero que extienda org.apache.pdfbox.pdfviewer.PDFPageDrawer y anule el método strokePath . Desde allí puede interceptar las operaciones de dibujo para segmentos de línea horizontales y verticales y usar esa información para determinar las posiciones de columna y fila para su tabla. Entonces es una simple cuestión de configurar regiones de texto y determinar qué números / letras / caracteres se dibujan en cada región. Como conoce el diseño de las regiones, podrá saber a qué columna pertenece el texto extraído.

Además, la razón por la que no puede haber espacios entre el texto que está visualmente separado es que, muy a menudo, el PDF no dibuja un carácter de espacio. En cambio, la matriz de texto se actualiza y se emite un comando de dibujo para “mover” para dibujar el siguiente carácter y un “ancho de espacio” aparte del último.

Buena suerte.