Esta es una guía paso a paso para el parser simple que escribí para parsear PDFs intencionalmente ofuscados por la Municipalidad de Asunción con el único objetivo de minimizar la transparencia de las gestiones.
Qué software instalar:
El parser es un parser de texto, y no un parser de imágenes. Para obtener el texto, necesitamos instalar dos herramientas gratuitas que nos sirven para un proceso de dos pasos:
- Transformar el PDF a imágenes (una imagen por página)
- Detectar el texto en las imágenes, manteniendo los espacios entre las columnas.
El primer paso lo hacemos con el comando pdftopng, para lo cual debemos instalar XpdfReader (o alguna herramienta que pueda transformar pdf a imágenes hay muchas opciones. Instrucciones para instalar XpdfReader (en inglés) en este link.
El segundo paso lo hacemos con un software que reconoce caracteres en imágenes. Esto se conoce como OCR, del inglés Optical Character Recognition. Yo elegí usar tesseract, ya que es gratis y open source, pero existen [muchas alternativas] para este propósito. Lo único que necesitamos es transformar las imágenes a texto.
Paso 1 – Transformar pdf a varias imágenes
Usando pdftopng
el comando a correr (en una terminal) es el siguiente:
~$ pdftopng -r 600 Febrero_2022.pdf febrero-2022
Este comando generará una imagen por cada página a 600 DPI, y las va a nombrar febrero-2022-000001.png
, febrero-2022-000002.png
, etc. Desde luego, el nombre del PDF va a cambiar dependiendo del PDF que uno quiera analizar, y lo mismo con el último argumento.
Los archivos de la Municipalidad tienen cientos de páginas, y 600 DPI es una imagen de alta calidad, por lo tanto el comando puede tardar varios minutos, dependiendo de la capacidad de la computadora.
Una vez que el comando termine, estamos listos para reconocer el texto usando tesseract.
Paso 2 – Reconocimiento de caracteres
Como estamos lidiando con cientos de imágenes, antes de correr tesseract en si, es conveniente crear primero un archivo para indicarle a tesseract los archivos que debe procesar. Para esto, corremos el siguiente comando en la carpeta donde corrimos pdftopng
:
~$ ls -d $PWD/febrero-2022-*.png > tesseract_input.txt
Con este comando, estamos indicando a la computadora que liste todas las imágenes que creamos usando pdftopng
, y que guarde esta lista en el archivo tesseract_input.txt
. Una vez que este archivo exista en la computadora, podemos llamar a tesseract:
~$ tesseract -l spa tesseract_input.txt febrero-2022 --psm 6 -c preserve_interword_spaces=1
En este comando le decimos a tesseract
que:
- Procese la lista que escribimos en
tesseract_input.txt
- Guarde los resultados en
febrero-2022.txt
(la extensión.txt
se agrega sola) --psm 6
indica que queremos que la imagen se interprete como un bloque de texto único (es decir, va a leer cada línea hasta el final, en lugar de intentar detectar columnas)-c preserve_interword_spaces=1
indica que queremos mantener la separación entre palabras, incluso si eso significa agregar una cantidad anormal de espacios.
Posiblemente esta sea la parte más lenta del proceso, ya que procesar la imágenes se hace con un modelo de machine learning que require relativamente mucho poder computacional.
Paso 3 – Usar el parser para extraer los datos a excel
El parser está escrito en python, y requiere de que se instalen algunas bibliotecas específicas para funcionar. Para instalar las bibliotecas requeridas, en la terminal se debe escribir:
~$ pip install -r requirements.txt
IMPORTANTE: dependiendo de tu experiencia con python puede ser una buena idea crear un entorno virtual primero
Una vez que las dependencias están instaladas, para exportar un excel
La estructura de las imágenes de Hesaka.
La estructura de todas las páginas de los archivos de Hesaka se ven como la siguiente imágen:
Es decir, tenemos las columnas:
- Cédula (un número)
- Nombre
- Relación Laboral
- Monto
- Concepto
- Dependencia
- Cargo (opcional)
- Año de Ingreso (completa en esta figura, pero a veces no está especificado, entonces también opcional)