Biblioteca Camelot (III)
Conversión de tablas a Excel
Para finalizar esta serie de entradas sobre Camelot, expongo en esta entrada la transcripción del script del autor de ExcelMasPro, cuyo vídeo cité como fuente en esta entrada. Sirva de reconocimiento y agradecimiento por su buen trabajo.
El objetivo de esta entrada es triple: reconocer lo que ExcelMasPro nos aporta con su trabajo, mostrar otro modo de trabajar Python y retomar la referencia a la relación entre este lenguaje y las hojas de cálculo. Y todo en el mismo paquete.
Paso sin más a presentar el script que he copiado literalmente del vídeo, aunque omito la formulación de la función y la llamada a la misma, cosa que altera el funcionamiento del código pero lo simplifica adaptándolo a mi nivel actual de conocimiento.
import camelot
import os
import pandas as pd
from tkinter import Tk
from tkinter.filedialog import askopenfilename, askdirectory
from datetime import datetime
#Ocultar ventana principal de TKinter
Tk().withdraw()
#Seleccionamos el archivo pdf
print("Seleccione el archivo PDF:")
pdf_file = askopenfilename(
title = "Seleccionar el archivo PDF",
filetypes=[("Archivos PDF","*.pdf")]
)
if not pdf_file:
print("No se seleccionó ningún archivo. Saliendo...")
#Seleccionar la carpeta de destino
print("Seleccione la carpeta donde desea guardar el archivo Excel:")
output_folder = askdirectory(title="Seleccionar carpeta de destino")
if not output_folder:
print("No se seleccionó ninguna carpeta. Saliendo...")
#Nombrar el archivo Excel
now = datetime.now().strftime("%m-%d-%y-%H-%M")
output_excel = os.path.join(output_folder, f'Import_PDF_a_Excel_{now}.xlsx')
#Extracción de las tablas del pdf mediante Camelot
print("Extrayendo tablas del PDF...")
tables = camelot.read_pdf(pdf_file,pages="all", flavor="stream")
#Guardar las tablas en Excel
if not tables:
print("No se encontraron tablas en el archivo PDF:")
#Guardando las tablas
with pd.ExcelWriter(output_excel, engine="openpyxl") as write:
for i, table in enumerate(tables):
table.df.to_excel(write, sheet_name = f'Tabla_{i+1}', index=False)
En resumen, lo que hace este script es acceder a un archivo pdf, capturar las tablas que incluye (mejor dicho, lo que Camelot identifica como tales, que no siempre lo son) y copia su contenido en una hoja de cálculo en la que crea tantas hojas como tablas encuentra.
El uso de TKinter permite al script facilitar una entrada de datos personalizada y en formato gráfico, algo que raramente he empleado por considerarlo innecesario en este nivel de aprendizaje, pero que en este caso me ha parecido interesante mantenerlo por mostrar otras formas de trabajar con Python (más cercanas al desarrollo de aplicaciones o DocAp).
Me ha parecido especialmente interesante el modo de construir el nombre del documento Excel creado, aunque he realizado un pequeño cambio en el formato (uniendo todos los elementos mediante guion bajo).
Realmente este script es más que una forma de mostrar el uso de Camelot, incluyendo el procedimiento de crear y guardar datos en una hoja de cálculo de Excel; supone además poner a nuestra disposición una pequeña aplicación que resuelve el problema de acceder a cualquier documento pdf y extraer las tablas que contenga dejándonoslas disponibles como hoja de cálculo. Por desgracia no siempre funciona correctamente (sobre todo cuando los documentos son complejos) y no siempre extrae todos los datos de las tablas (por lo que siempre será necesario comprobar el resultado), pero al menos para pdf sencillo y tablas "normales" el éxito sí está garantizado.