Puntos clave:
- Python puede ayudarte a automatizar la extracción de datos de facturas.
- Parseur utiliza Python para extraer datos de facturas por ti.
- El PDF no es un formato de datos, sino una representación tipográfica de un documento en papel.
El formato PDF
El formato PDF es versátil y permite representar con precisión documentos en papel, como facturas, sin limitar su diseño. Proviene del mundo de la impresión y está diseñado para ser una representación digital de una página impresa. Esta flexibilidad ofrece una libertad significativa, ya que permite a los creadores de PDF expresarse y adherirse a diversas normas y reglamentos.
Sin embargo, el reto surge cuando los datos están bloqueados dentro de un PDF. La naturaleza compleja y de formato libre del formato puede entrar en conflicto con el enfoque estructurado y coherente necesario para gestionar la gran cantidad de datos que una empresa procesa a diario.
![Capas del formato de archivo PDF Una captura de pantalla de las capas del formato de archivo PDF](/images/pdf-data-format-layers.webp)
¿Cómo extraer datos de una factura con Python?
Una factura es un documento que suele venir en formato PDF. Una factura formaliza una transacción entre un proveedor y un cliente, en la que se intercambia un producto o servicio por una cantidad precisa de dinero. Estos son los pasos necesarios para extraer datos de este documento:
- Definir un esquema para los datos que deseas extraer de tus facturas
- Convertir tu factura de imagen a texto
- Extraer el texto de tu factura según tu esquema de datos
- Recopilar los datos extraídos
![Proceso de extracción de datos de la factura Una captura de pantalla del proceso de extracción de datos de la factura](/images/invoice-data-extraction-process_1024.png)
Definir un esquema para los datos de tu factura
Las facturas proceden de diferentes proveedores y cada proveedor tiende a personalizar el aspecto de sus facturas. A pesar de esta diversidad en la forma, la sustancia de todas las facturas es básicamente la misma: se necesita un proveedor, un cliente, una referencia de factura, una fecha y una lista de artículos con su cantidad, descripción y coste asociados.
Una buena manera de empezar a definir el formato de tus facturas sería tu software de contabilidad, ya que lo más probable es que sea ahí donde quieras almacenar los datos de las facturas extraídas al final. Si solo quieres un formato de datos que pueda cubrir todos los casos especiales, te recomendamos el sitio web schema.org, que define convenientemente una serie de formatos de datos estándar del sector para muchas cosas, incluidas las facturas. Parseur define un esquema de datos predeterminado para tus facturas, pero puedes cambiarlo para que se ajuste a tu caso de uso renombrando los campos en el buzón de tu factura, como se explica aquí.
Una vez definido el formato de datos, puedes convertir tu factura de imagen a texto.
Por ejemplo, puedes definir los siguientes campos para tu factura utilizando el formato JSON Swagger:
{
"InvoiceNumber": {
"type": "string",
"description": "El número de factura"
},
"InvoiceIssueDate": {
"type": "string",
"description": "La fecha de la factura"
},
"Items": {
"type": "array",
"description": "La lista de artículos de la factura",
"items": {
"type": "object",
"properties": {
"quantity": {
"type": "number",
"description": "La cantidad del artículo"
},
"description": {
"type": "string",
"description": "La descripción del artículo"
},
"unit_price": {
"type": "number",
"description": "El precio unitario del artículo"
},
"price": {
"type": "number",
"description": "El precio total del artículo"
}
}
}
}
}
Convertir tu factura de imagen a texto
![Imagen de una factura tomada desde un smartphone Una captura de pantalla de una factura tomada desde un smartphone](/images/invoice-camera-scan.webp)
Un archivo PDF puede contener una imagen. Por ejemplo, tu empleado puede hacer una foto rápida de una factura con la cámara de su smartphone. Luego la guarda como PDF y la envía a tu departamento de contabilidad. Tu equipo de contabilidad se encarga de extraer los datos de esta factura e introducirlos en tu sistema de contabilidad sin ningún error.
El siguiente paso es convertir esta imagen a texto utilizando un sistema de Reconocimiento Óptico de Caracteres. Uno de los sistemas OCR más populares es Tesseract. Tesseract está escrito en C y C++. Para utilizar Tesseract desde nuestro programa Python, necesitaremos utilizar un enlace como PyTesseract. Un enlace es una forma de llamar a una biblioteca de software (en este caso, Tesseract) desde un lenguaje en el que no está escrita (en este caso, Python).
Existen muchos sistemas de este tipo y sus resultados varían enormemente en función de la tecnología subyacente y de la calidad del escaneado del documento. Parseur detecta de forma transparente si tu documento es una imagen y lo convierte automáticamente a texto internamente. Una vez que los datos del documento están en forma de texto, están listos para ser extraídos.
Extraer el texto de tu factura con Python
Una vez que tu PDF está en formato de texto (o se puede buscar en él), puedes utilizar la biblioteca de Python pdftotext para obtener los datos del archivo PDF como texto. Aquí tienes un fragmento de código para extraer el texto de un archivo PDF:
import pdftotext
# Cargar tu factura
with open("invoice.pdf", "rb") as file_handle:
pdf = pdftotext.PDF(file_handle)
# Iterar sobre todas las páginas
for page in pdf:
print(page)
Nombra a este script convert_pdf_to_text.py
y ejecútalo, obtendrás la factura como texto en la salida estándar.
Si quieres redirigir la salida a un archivo, puedes ejecutar:
$ python convert_pdf_to_text.py > invoice.txt
Ahora que ya tienes la factura en formato de texto, puedes extraer de ella los datos que desees utilizando Python. Algunas técnicas comunes son:
- Expresiones regulares: Puedes utilizar una expresión regular para extraer los datos que desees. Las expresiones regulares son una forma poderosa de extraer datos de un texto, pero también pueden ser frágiles si el formato de la factura cambia.
- Plantillas visuales: Puedes utilizar un sistema de plantillas visuales, idealmente aprovechando el OCR Dinámico y el OCR Zonal. Esta es una forma más avanzada de extraer datos del texto y es más robusta que las expresiones regulares.
- Aprendizaje automático: Puedes utilizar un sistema de aprendizaje automático. El aprendizaje automático es una forma muy poderosa de extraer datos del texto, pero requiere un conjunto de datos de entrenamiento y puede ser complejo de implementar.
Veamos un ejemplo de cómo extraer datos de tu factura con el módulo re de expresiones regulares de Python. Aquí tienes un fragmento de código para extraer el número de factura de tu factura:
import re
# Cargar tu factura
with open("invoice.txt", "r") as file_handle:
invoice = file_handle.read()
# Extraer el número de factura
invoice_number = re.search(r"Invoice number: (\w+)", invoice).group(1)
print(invoice_number)
Nombra a este script extract.py
y ejecútalo, obtendrás el número de factura en la salida estándar:
$ python extract.py
Y obtendrás algo como:
INV-1234
Ten en cuenta que esto solo funciona para las facturas que están formateadas con una línea como Invoice number: INV-1234
.
Si el formato de la factura cambia, tendrás que actualizar tu expresión regular.
Esto puede convertirse rápidamente en una pérdida de tiempo si tienes que lidiar con muchos formatos de factura diferentes.
Parseur puede ayudarte con eso.
Si decides utilizar el análisis de expresiones regulares, nuestro motor de plantillas te ayudará a gestionarlas, y también te damos acceso a una biblioteca de plantillas que hemos ido creando a lo largo de los años. Te permitimos seleccionar el mejor método de extracción para tu caso de uso: Puedes utilizar expresiones regulares, pero también la creación y coincidencia de plantillas visuales (motor OCR) o el aprendizaje automático (motor de IA). Incluso puedes combinarlos para obtener lo mejor de cada uno de ellos. Parseur también te permite revisar los resultados de la extracción y corregirlos si es necesario. Este es un paso muy importante, ya que te ayudará a mejorar la precisión de la extracción con el tiempo.
Recopilar los datos extraídos con Python
Con Python, puedes iterar sobre los archivos de facturas de una carpeta determinada y extraer los datos de los mismos. Digamos que extraemos el número de factura y el importe total, y generamos el resultado en formato CSV:
import os
import re
import pdftotext
# Iterar sobre todos los archivos PDF de la carpeta
for filename in os.listdir("invoices/"):
if not filename.endswith(".pdf"):
continue
# Cargar tu factura
with open("invoices/" + filename, "rb") as file_handle:
pdf = pdftotext.PDF(file_handle)
# Imprimir la cabecera de la columna CSV
print("InvoiceNumber,TotalAmount")
# Iterar sobre todas las páginas
for page in pdf:
# Extraer el número de factura
invoice_number = re.search(r"Invoice number: (\w+)", page).group(1)
total_amount = re.search(r"Total amount: (\w+)", page).group(1)
print(invoice_number, total_amount, sep=",")
Nombra a este script extract_to_csv.py
y ejecútalo, obtendrás el número de factura y el importe total en la salida estándar,
que podrás redirigir a un archivo CSV que luego podrás abrir con tu software de hoja de cálculo favorito, como Excel:
$ python extract_to_csv.py > invoices.csv
En Parseur, una vez que hayas extraído los datos de tus facturas, puedes descargarlos todos como una hoja de cálculo o exportarlos directamente a tu software de contabilidad, utilizando la integración directa de webhooks, Make, Zapier o Microsoft Power Automate. También puedes utilizar nuestra API para recuperar los datos en formato JSON.
Conclusión
En este artículo, hemos visto cómo extraer datos de facturas con Python. Es un proceso complejo, pero se puede hacer, siempre y cuando tus facturas sean consistentes y tengas mucho tiempo que dedicar a ello. En caso de que tu tiempo sea limitado, puedes utilizar la experiencia y los conocimientos acumulados que se han ido incorporando a Parseur a lo largo de los años, para llegar a tu destino más rápidamente y extraer datos de todas tus facturas con flexibilidad y precisión.
Última actualización el