Extrae texto de imágenes automáticamente con GCP Vision y Python
En el panorama digital actual, automatizar la extracción de texto de imágenes y documentos es fundamental para el procesamiento, el archivado y el análisis de datos. El reconocimiento óptico de caracteres (OCR, por sus siglas en inglés) con la API de Google Cloud Vision ofrece una solución potente para convertir documentos físicos en formatos digitales en los que se puede buscar. Esta guía muestra cómo implementar OCR con Python para digitalizar documentos de forma eficiente.
Requisitos
- Python 3.10+ (compatible con el cliente actual de Google Cloud Vision para Python)
- Cuenta de Google Cloud Platform con la facturación habilitada y la CLI de Google Cloud instalada
- Conocimientos básicos de Python
Configura el entorno de Google Cloud
- Crea un proyecto en Google Cloud Console
- Habilita la API de Cloud Vision
- Configura la autenticación:
Configuración para desarrollo
gcloud auth application-default login
gcloud auth application-default set-quota-project PROJECT_ID
Autenticación en producción
Prefiere una cuenta de servicio adjunta en Google Cloud, o Workload Identity Federation fuera de Google Cloud, para que las Application Default Credentials puedan autenticarse sin una clave descargada. Si tu despliegue requiere una clave JSON de cuenta de servicio, guárdala de forma segura fuera de tu árbol de código y define:
export GOOGLE_APPLICATION_CREDENTIALS="path/to/service-account-key.json"
Configura el entorno de Python
- Crea un entorno virtual:
python3 -m venv venv
source venv/bin/activate # Linux/macOS
venv\Scripts\activate # Windows
- Instala la biblioteca cliente:
python -m pip install 'google-cloud-vision>=3.10,<4'
Implementa la solución de OCR
Implementación robusta con manejo de errores y posprocesamiento de texto:
from google.cloud import vision
from google.api_core import retry
import io
import sys
def extract_text(image_path: str) -> str:
"""Extracts text from an image using GCP Vision API.
Args:
image_path: Path to a JPEG or PNG image file
Returns:
Extracted text as single string
Raises:
Exception: API errors or file processing issues
"""
with io.open(image_path, 'rb') as image_file:
content = image_file.read()
with vision.ImageAnnotatorClient() as client:
image = vision.Image(content=content)
response = client.document_text_detection(
image=image,
retry=retry.Retry(initial=1.0, maximum=10.0, timeout=60.0),
timeout=30.0
)
if response.error.code:
raise RuntimeError(f'Vision OCR failed (code {response.error.code})')
return response.full_text_annotation.text
if __name__ == '__main__':
if len(sys.argv) != 2:
print('Usage: python extract_text.py <image_path>')
sys.exit(1)
try:
print(extract_text(sys.argv[1]))
except Exception as e:
print(f'OCR failed ({type(e).__name__})', file=sys.stderr)
sys.exit(1)
Consideraciones para producción
- Formatos de archivo: este ejemplo envía una sola imagen rasterizada al endpoint de OCR de
imágenes. Para PDF/TIFF, usa las API de anotación de archivos con
InputConfig; la anotación asíncrona de archivos admite hasta 2000 páginas y usa Cloud Storage para la entrada y la salida. - Límites de tasa: la cuota de solicitudes predeterminada es de 1800 solicitudes por minuto, con cuotas independientes por función. Consulta las cuotas actuales de tu proyecto.
- Costos: las solicitudes por lotes reducen la sobrecarga de las solicitudes, no la cantidad de imágenes facturables. Cada página PDF/TIFF se factura como una imagen; consulta los precios de Vision.
- Localización de texto: maneja más de 100 idiomas automáticamente
Técnicas avanzadas de procesamiento
Mejora los resultados del OCR con normalización de texto y extracción de la estructura:
def process_ocr_text(raw_text: str) -> dict:
"""Structure raw OCR output into organized data"""
return {
'full_text': raw_text,
'paragraphs': raw_text.split('\n\n'),
'line_count': len(raw_text.split('\n')),
'word_count': len(raw_text.split()),
'cleaned_text': raw_text.replace('\n', ' ').strip()
}
Mejoras en el manejo de errores
Para personalizar los reintentos, pasa el cliente de forma explícita. Este wrapper reintenta los fallos de transporte transitorios; los errores incrustados de cada imagen se comprueban por separado y se comunican a quien hace la llamada:
from google.api_core import retry
from google.api_core.exceptions import ResourceExhausted, ServiceUnavailable
from google.cloud import vision
def safe_ocr_call(
client: vision.ImageAnnotatorClient, image: vision.Image
) -> vision.AnnotateImageResponse:
response = client.document_text_detection(
image=image,
retry=retry.Retry(
predicate=retry.if_exception_type(ResourceExhausted, ServiceUnavailable),
initial=1.0, maximum=10.0, timeout=60.0
),
timeout=30.0
)
if response.error.code:
raise RuntimeError(f'Vision OCR failed (code {response.error.code})')
return response
with vision.ImageAnnotatorClient() as client:
with open('invoice.png', 'rb') as image_file:
image = vision.Image(content=image_file.read())
response = safe_ocr_call(client, image)
print(response.full_text_annotation.text)
El código 7 significa permiso denegado; el código 8 significa agotamiento de recursos. Reintentar no puede corregir permisos faltantes ni cuotas diarias agotadas, así que investiga los fallos repetidos antes de reintentar un trabajo.
Conclusión
Implementar OCR con la API de Google Cloud Vision y Python ofrece una solución escalable para la digitalización de documentos. Las técnicas que se muestran aquí funcionan con distintos tipos de documentos y mantienen la fiabilidad necesaria en producción. Si tus flujos de trabajo avanzados de procesamiento de documentos requieren manipulación de PDF u operaciones con varios archivos, considera explorar las soluciones de procesamiento de documentos de Transloadit.
¡Feliz programación!
