¿Tablas en PDF? También hay respuesta en R🙃

Claudio Daniel Pacheco Castro
tacosdedatos
Published in
4 min readMar 2, 2022

Después de un rato de inactividad😶, volvemos con un pequeño tutorial🙌🏼. Hace un buen rato en el Twitter nos preguntábamos si existía alguna forma de convertir datos de tablas en PDF a formato editable. Claramente, para aquellos que no están muy familiarizados con la programación, herramientas como ILovePDF puede resultar muy útiles aunque a veces no se obtienen resultados tan eficientes. Los que están inmersos en los lenguajes de programación saben que Python cuenta con una librería muy buena (tabula-py) para transformar los datos de tablas en PDF a editable.

Pero, ¿qué onda con R? Hasta hace poco, existía una librería llamada tabulizer la cual era excelente para transformar los datos de tablas en pdf en editable.

Jorge Juvenal Campos Ferreira escribió sobre eso en algún momento:

Sin embargo, esa preciosa librería desapareció del CRAN de R😭 dejando un gran vacío.

Y todo esto dejó la siguiente pregunta: ¿R no nos sirve para poner datos de tablas en PDF en editable?

Pues la respuesta es… ¡SÍ!

Actualmente, R cuenta con una librería llamada pdftools que permite extraer texto y datos de PDFs. Esta librería cuenta con un gran poder porque logra extraer datos de OCR, sin embargo, para la extracción de datos en tablas sí es algo complejo pero no imposible.

Dicho lo anterior, nos disponemos a mostrar un ejemplo de cómo podemos utilizar esta librería y contar con nuestros datos editables.

Los datos que utilizaremos

Como aquí todo es promoción, utilizaremos una tabla de un documento dentro del Sistema Nacional de Información e Indicadores de Vivienda (SNIIV) (comercial: visítenlo😃)

Concretamente, usaremos la página 5 del documento Nota metodológica: Cuantificación de la Población Potencial y Objetivo del Programa de Vivienda Social S177:

La tablita del mal🔥

Bueno, van los pedazos de código. Primero, las librerías:

#Librerías
if(!require('pacman')) install.packages('pacman')
pacman::p_load(pdftools, tidyverse)

Una vez definido esto, establecemos la url del documento:

#URL del PDF
pdf_file <- "https://sistemas.sedatu.gob.mx/repositorio/proxy/alfresco-noauth/api/internal/shared/node/Vm8Q6lnjQ-am9z2of4LgcQ/content/S177_PVS_Poblacion_potencial_objetivo_2020.pdf"

Ahora, comenzaremos a trabajar con esa URL. Lo que haremos será extraer el texto de la página 5 del pdf (que es donde se encuentra la tabla). La librería nos trae los datos así:

Ya tenemos algo pero aún está feo🤢

Como pueden ver, tenemos que limpiar esa cosa. Lo primero que haremos es quitar caracteres; es decir, los bellos \n. Posteriormente, lo transformamos en un tibble. De esa cadena de texto a tibble, la cosa cambia así:

Aún está culerillo😐

Como se puede notar, esto aún requiere más limpieza. Concretamente, con base en esta variable horrorosa de texto, crearemos tres columnas con los siguientes nombres: concepto, hogares y población. Sí, los nombres de la tablita que queremos en editable. Es importante señalar que estas columnas se construyen con base en extracción de texto (similar e Extrae en Excel) por lo que hay que ir jugando con las posiciones de los caracteres para no errarle.

El resultado es este:

La cosa va tomando forma🤗

Hecho esto, eliminamos la columna de texto original denominada X y quitamos los espacios alrededor de los valores:

Ahí va💪🏼

Ya por último, notamos que los valores que necesitamos están en las filas 11 a la 16. Para esto, seleccionamos dichas filas y transformamos nuestros valores (hogares y población): quitamos coma y convertimos a numérico. Este proceso da el siguiente resultado:

Ya tenemos tabla cool😊😊😊

Todo este choro que me acabo de aventar se resume en este chunk de código:


##Etraemos texto de página 5 del pdf
df <- pdf_text(pdf_file)[[5]]%>%
#Quitamos caracteres
str_split("\n") %>%
#Pasar a tibble
as_tibble(.name_repair = make.names)%>%
##Creamos columnas extrayendo la información del texto original
mutate(
concepto = str_sub(X, 0, 20),
hogares=str_sub(X,70,80),
poblacion=str_sub(X,85,100)

)%>%
#Eliminamos texto original
select(-X) %>%
# Se quitan espacios
mutate_all(str_trim)%>%
#Seleccionamos filas donde están los datos
slice(11:16)%>%
##Se transforma a numérico
mutate(
hogares=as.numeric(gsub(",","",hogares)),
poblacion=as.numeric(gsub(",","",poblacion)))

Y bueno, así la solución. Sinceramente, creo que, ante la falta de tabulizer, la opción de tabula-py en Python es la mejor. No obstante, siempre hay quien prefiere R tanto para su limpieza de datos como para sus análisis y eso está bien.

Esta es una opción.

Hasta aquí la cosa. Y ya sabes, si llegaste hasta aquí, te dejo el código en Github para que copies, pegues y evalúes:

https://github.com/claudiodanielpc/medium/blob/main/pdftabla_R.R

Y ya.

Happy coding😊

--

--