Extraer texto de imágenes en Node.js con AWS Rekognition
Extraer texto de imágenes es un requisito común en las aplicaciones modernas, ya sea para procesar documentos escaneados, mejorar la accesibilidad o automatizar la entrada de datos. AWS Rekognition ofrece sólidas capacidades de detección de texto que se pueden integrar sin problemas en tus aplicaciones Node.js. El servicio admite imágenes JPEG y PNG de hasta 5 MB cuando se envían como bytes sin procesar, o de 15 MB cuando se referencian en S3, y puede detectar hasta 100 palabras por imagen.
Introducción a AWS Rekognition y la detección de texto
AWS Rekognition es un potente servicio de análisis de imágenes y videos que aprovecha el aprendizaje profundo para identificar objetos, escenas, texto y rostros dentro de las imágenes. Su funcionalidad de detección de texto es ideal para automatizar la entrada de datos, mejorar la accesibilidad y procesar documentos escaneados. En esta guía aprenderás a integrar AWS Rekognition en tu aplicación Node.js para extraer texto de forma confiable.
Configurar AWS Rekognition
Antes de empezar, asegúrate de configurar tus credenciales de AWS y de contar con los permisos de
IAM necesarios. Usa un rol de IAM o un perfil local de AWS configurado con una política como la
siguiente para permitir el acceso a la acción rekognition:DetectText:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["rekognition:DetectText"],
"Resource": "*"
}
]
}
Configura tus credenciales de AWS con uno de estos métodos:
- Variables de entorno (define
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEYyAWS_REGION, además deAWS_SESSION_TOKENpara credenciales temporales). - Archivo de credenciales de AWS (ubicado en
~/.aws/credentialsen Linux/Mac o enC:\Users\YourUser\.aws\credentialsen Windows). - Un rol de IAM asociado al servicio de AWS que ejecuta tu aplicación.
Instalar el AWS SDK para Node.js
Usa Node.js 22 o una versión posterior e instala AWS SDK v3 para Rekognition. Guarda los ejemplos de
JavaScript como archivos .mjs, o define "type": "module" en el package.json de tu proyecto:
npm install @aws-sdk/client-rekognition@3
Integrar el AWS SDK en una aplicación Node.js
Importa las clases necesarias y configura la región. Si dejas credentials sin definir, la
cadena de proveedores de credenciales predeterminada
resuelve perfiles, credenciales temporales y roles de IAM:
import { RekognitionClient, DetectTextCommand } from '@aws-sdk/client-rekognition'
const client = new RekognitionClient({
region: process.env.AWS_REGION || 'us-west-2',
})
Realizar la detección de texto con AWS Rekognition
Puedes detectar texto tanto en archivos locales como en imágenes almacenadas en S3. A continuación se muestra una función de ejemplo que carga un archivo de imagen local y devuelve las líneas de texto detectadas con sus puntuaciones de confianza y la información del cuadro delimitador:
import fs from 'fs'
// Assumes 'client' is already configured as shown above
const detectTextFromImage = async (imagePath) => {
const imageBytes = fs.readFileSync(imagePath)
const params = {
Image: { Bytes: imageBytes },
}
try {
const data = await client.send(new DetectTextCommand(params))
const textLines = (data.TextDetections ?? []).filter((text) => text.Type === 'LINE').map((text) => ({
text: text.DetectedText,
confidence: text.Confidence,
boundingBox: text.Geometry?.BoundingBox,
}))
return textLines
} catch (err) {
if (err.name === 'InvalidImageFormatException') {
throw new Error('Invalid image format. Only JPEG and PNG are supported.', { cause: err })
} else if (err.name === 'ImageTooLargeException') {
throw new Error('Image size exceeds the 5MB limit for raw bytes.', { cause: err })
} else if (err.name === 'ThrottlingException') {
throw new Error('API request rate exceeded. Please retry with backoff.', { cause: err })
}
throw err
}
}
Analizar imágenes desde S3
Si tu imagen está almacenada en un bucket de S3, reutiliza client y DetectTextCommand
configurados más arriba. El bucket debe estar en la misma región que el cliente de Rekognition, y la
identidad que hace la llamada necesita el permiso s3:GetObject sobre la imagen:
const detectTextFromS3Image = async (bucket, key) => {
const params = {
Image: {
S3Object: {
Bucket: bucket,
Name: key,
},
},
}
try {
const data = await client.send(new DetectTextCommand(params))
const textLines = (data.TextDetections ?? []).filter((text) => text.Type === 'LINE').map((text) => ({
text: text.DetectedText,
confidence: text.Confidence,
boundingBox: text.Geometry?.BoundingBox,
}))
return textLines
} catch (err) {
if (err.name === 'InvalidImageFormatException') {
throw new Error('Invalid image format. Only JPEG and PNG are supported.', { cause: err })
} else if (err.name === 'ImageTooLargeException') {
throw new Error('Image exceeds the 15MB limit for S3 objects.', { cause: err })
} else if (err.name === 'ThrottlingException') {
throw new Error('API request rate exceeded. Please retry with backoff.', { cause: err })
}
throw err
}
}
Ejemplo práctico y fragmentos de código
El siguiente ejemplo completo procesa un archivo de imagen local. Verifica que el archivo exista, envía la imagen a AWS Rekognition para la detección de texto y registra las líneas de texto detectadas junto con sus puntuaciones de confianza y sus posiciones.
import { RekognitionClient, DetectTextCommand } from '@aws-sdk/client-rekognition'
import fs from 'fs'
const client = new RekognitionClient({
region: process.env.AWS_REGION || 'us-west-2',
})
const processImage = async (imagePath) => {
if (!fs.existsSync(imagePath)) {
throw new Error('Image file not found.')
}
const imageBytes = fs.readFileSync(imagePath)
const params = {
Image: { Bytes: imageBytes },
}
try {
const data = await client.send(new DetectTextCommand(params))
console.log('Detected text lines:')
const detections = data.TextDetections ?? []
for (const text of detections.filter((text) => text.Type === 'LINE')) {
console.log(`- Text: ${text.DetectedText}`)
if (text.Confidence != null) console.log(` Confidence: ${text.Confidence.toFixed(2)}%`)
const box = text.Geometry?.BoundingBox
if (box?.Left != null && box.Top != null) {
console.log(` Position: (${box.Left.toFixed(2)}, ${box.Top.toFixed(2)})`)
}
}
return detections
} catch (err) {
if (err.name === 'InvalidImageFormatException') {
console.error('Error: Invalid image format. Only JPEG and PNG are supported.')
} else if (err.name === 'ImageTooLargeException') {
console.error('Error: Image size exceeds the 5MB limit for raw bytes.')
} else if (err.name === 'ThrottlingException') {
console.error('Error: API request rate exceeded. Please retry with backoff.')
} else {
console.error('Error detecting text:', err.message)
}
throw err
}
}
// Usage example
processImage('path/to/your/image.jpg')
.then((results) => {
console.log(`Found ${results.length} text elements`)
})
.catch((err) => {
console.error('Failed to process image:', err.message)
process.exitCode = 1
})
Límites del servicio y precios de AWS Rekognition
Cuando uses AWS Rekognition para detectar texto, ten en cuenta estos puntos clave:
- La entrada de bytes sin procesar está limitada a 5 MB; los objetos de S3 están limitados a 15 MB.
- Los formatos de imagen admitidos son JPEG y PNG.
- El servicio puede detectar hasta 100 palabras por imagen.
- Los precios dependen de la API, la región, el volumen y de si tu cuenta cumple los requisitos de la capa gratuita.
Para más detalles, consulta la página de Precios de AWS Rekognition y la documentación sobre los límites del servicio.
Conclusión
AWS Rekognition ofrece potentes capacidades de detección de texto que se integran fácilmente en tus aplicaciones Node.js. Si sigues los pasos anteriores, podrás configurar tus credenciales de AWS, instalar el AWS SDK e implementar un manejo de errores sólido tanto para imágenes locales como para imágenes alojadas en S3.
¿Te interesa automatizar aún más tu flujo de trabajo de análisis de imágenes? Descubre cómo el Image Describe Robot de Transloadit aprovecha una tecnología similar para ayudarte a procesar imágenes a escala.
