Extraire du texte d’images avec Node.js et AWS Rekognition
Utilisez l’opération DetectText d’AWS Rekognition pour lire le texte de panneaux,
d’étiquettes et d’autres images depuis Node.js. Ce guide développe une CLI qui accepte un fichier
JPEG ou PNG local, ou un objet S3 existant, et affiche les lignes détectées avec leurs scores de
confiance et leur géométrie.
Présentation d’AWS Rekognition et de la détection de texte
DetectText renvoie des détections LINE et
WORD. Afficher les deux répète le même texte, donc notre CLI renvoie
uniquement les lignes et les compte. Une ligne détectée peut faire partie d’une phrase ; le résultat
ne représente ni la structure des paragraphes d’un document ni un ordre de lecture garanti. AWS
indique un maximum de 100 mots détectés par image dans son
guide de détection de texte. Pour la reconnaissance optique de
caractères dans les formulaires, les tableaux et les documents de plusieurs pages, évaluez plutôt
Amazon Textract.
Configurer AWS Rekognition
Vous avez besoin d’un compte AWS et d’un profil local authentifié ou d’un rôle IAM autorisant
rekognition:DetectText. Cette action utilise Resource: "*" ; elle n’opère pas
sur une collection Rekognition. Un administrateur peut accorder les autorisations avec la politique
suivante :
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "rekognition:DetectText",
"Resource": "*"
}
]
}
Utilisez la méthode d’authentification existante de votre organisation. Pour un profil local,
effectuez la configuration de l’authentification du SDK AWS
et connectez-vous avant d’exécuter l’exemple. Nous laissons credentials non défini
pour que la chaîne de fournisseurs d’informations d’accès par défaut
puisse déterminer votre profil ou votre rôle. Les informations d’accès fournies par des variables
d’environnement sont également prises en charge ; les informations d’accès temporaires nécessitent
AWS_SESSION_TOKEN en plus de la clé d’accès et du secret. Ne placez pas les valeurs de
vos informations d’accès dans les fichiers source ou la sortie du terminal.
Choisissez une région AWS prise en charge. Les commandes ci-dessous
utilisent us-east-1 ; remplacez cette valeur par votre région et
MY_PROFILE par le nom de votre profil. Pour un rôle IAM déployé, omettez
AWS_PROFILE. Envoyer une image à Rekognition transmet son contenu à AWS et peut
entraîner des frais.
Installer le SDK AWS pour Node.js
Installez Node.js 24 LTS avec npm. L’exemple a été testé avec
Node.js 24.21.0 et @aws-sdk/client-rekognition 3.1148.0 du SDK AWS v3. La version corrective de
Node.js est une version testée, pas une exigence intrinsèque de l’API ; les versions ultérieures
maintenues de la même version majeure conviennent. Les commandes shell utilisent Bash et ont été
testées sous Linux. Utilisez un shell sans NODE_OPTIONS pour que les chargeurs
injectés ne modifient pas la résolution des modules du nouveau projet.
Exécutez ces commandes depuis le répertoire où vous souhaitez créer un projet
rekognition-text. Le sous-shell laisse votre répertoire courant inchangé, et
mkdir refuse un projet existant. L’installation cible explicitement le
nouveau projet, même à l’intérieur d’un autre projet npm ou Yarn :
(
command -v node >/dev/null || { printf 'Install Node.js first.\n' >&2; exit 1; }
command -v npm >/dev/null || { printf 'Install npm first.\n' >&2; exit 1; }
[ -z "${NODE_OPTIONS:-}" ] || { printf 'Use a shell without NODE_OPTIONS.\n' >&2; exit 1; }
mkdir rekognition-text && cd rekognition-text &&
printf '{"private":true,"type":"module"}\n' > package.json &&
npm install --prefix "$PWD" --workspaces=false --ignore-scripts --save-exact \
@aws-sdk/client-rekognition@3.1148.0
)
Si l’installation échoue après la création, conservez le répertoire et réessayez la commande
npm install depuis ce répertoire. Ne répétez pas mkdir
et n’écrasez pas un projet qui contient déjà votre travail. Conservez le fichier
package-lock.json obtenu lorsque vous partagez l’exemple.
Intégrer le SDK AWS à une application Node.js
Créez rekognition-text/detect-text.mjs avec ce premier bloc. L’extension
.mjs rend le format du module explicite, y compris dans un projet CommonJS.
maxAttempts: 1 fait en sorte que chaque invocation tente une analyse sans nouvelle
tentative automatique :
import { DetectTextCommand, RekognitionClient } from '@aws-sdk/client-rekognition'
const client = new RekognitionClient({
region: process.env.AWS_REGION,
maxAttempts: 1,
})
Détecter du texte avec AWS Rekognition
Ajoutez le bloc suivant au même fichier. Le chemin local est ouvert directement, sans interpréter
les séquences d’échappement d’URL ni se fier à son extension. La lecture est limitée à 5 MiB plus un
octet pour que les fichiers trop volumineux soient rejetés avant toute analyse. Utilisez un fichier
ordinaire qui ne change pas pendant sa lecture. Le SDK accepte directement le
Buffer et gère l’encodage base64. AWS valide
le format de l’image et décode son contenu ; une réponse réussie ne prouve pas qu’une image
endommagée a été entièrement récupérée.
import { open } from 'node:fs/promises'
class InputError extends Error {}
async function localBytes(path) {
const file = await open(path, 'r')
try {
const info = await file.stat()
const limit = 5 * 1024 * 1024
if (!info.isFile() || info.size === 0 || info.size > limit) {
throw new InputError('Use a nonempty regular image file of at most 5 MiB.')
}
const buffer = Buffer.alloc(limit + 1)
let length = 0
while (length < buffer.length) {
const { bytesRead } = await file.read(buffer, length, buffer.length - length, null)
if (bytesRead === 0) break
length += bytesRead
}
if (length === 0 || length > limit) {
throw new InputError('Use a nonempty image file of at most 5 MiB.')
}
return buffer.subarray(0, length)
} finally {
await file.close()
}
}
async function main() {
const [mode, first, second, ...extra] = process.argv.slice(2)
if (!process.env.AWS_REGION) throw new InputError('Set AWS_REGION before running the CLI.')
let image
let source
if (mode === 'local' && first && second === undefined && extra.length === 0) {
image = { Bytes: await localBytes(first) }
source = { mode, path: first }
} else if (mode === 's3' && first && second && extra.length === 0) {
image = { S3Object: { Bucket: first, Name: second } }
source = { mode, bucket: first, key: second }
} else {
throw new InputError('Usage: node detect-text.mjs local PATH | s3 BUCKET KEY')
}
const response = await client.send(new DetectTextCommand({ Image: image }))
const lines = (response.TextDetections ?? [])
.filter((item) => item.Type === 'LINE')
.map((item) => ({
text: item.DetectedText,
confidence: item.Confidence,
boundingBox: item.Geometry?.BoundingBox,
polygon: item.Geometry?.Polygon,
}))
console.log(JSON.stringify({ source, lineCount: lines.length, lines }, null, 2))
}
main()
.catch((error) => {
const codes = [
'AccessDeniedException', 'CredentialsProviderError', 'InvalidImageFormatException',
'ImageTooLargeException', 'InvalidParameterException', 'InvalidS3ObjectException',
'ProvisionedThroughputExceededException', 'ThrottlingException', 'ENOENT', 'EACCES',
]
const name = error instanceof Error && 'code' in error ? error.code : error?.name
const code = codes.includes(name) ? name : 'RequestError'
console.error(error instanceof InputError ? error.message : `Text detection failed (${code}).`)
process.exitCode = 1
})
.finally(() => client.destroy())
Analyser des images depuis S3
Le mode s3 transmet le bucket et la clé exacte à Rekognition ; il ne
télécharge pas l’objet dans Node.js. Utilisez un objet privé existant dans un bucket S3 à usage
général situé dans la même région que AWS_REGION. L’identité qui effectue
l’appel doit disposer de l’autorisation s3:GetObject sur cet objet, ainsi que de
rekognition:DetectText. Cette opération synchrone ne nécessite ni bucket public ni rôle de
service. Consultez le contrat d’entrée S3
et la procédure d’analyse d’images.
Fournissez la clé brute, par exemple images/sign %20.png, plutôt qu’une URL S3 ou une clé
encodée pour une URL. Cet exemple lit l’objet actuel et ne spécifie pas de version. Nos objets S3
testés utilisent le chiffrement SSE-S3 ; les objets chiffrés avec KMS peuvent nécessiter des
autorisations supplémentaires sur la clé. La CLI ne crée, ne modifie et ne supprime aucun objet S3.
Exemple pratique et extraits de code
Placez votre image à l’emplacement rekognition-text/photo.png. Depuis le répertoire parent,
exécutez :
(
cd rekognition-text &&
AWS_PROFILE=MY_PROFILE AWS_REGION=us-east-1 node detect-text.mjs local './photo.png'
)
Pour une image déjà téléversée vers S3, remplacez MY_BUCKET et
images/photo.png par votre bucket et votre clé, et utilisez la même région que ce
bucket :
(
cd rekognition-text &&
AWS_PROFILE=MY_PROFILE AWS_REGION=us-east-1 node detect-text.mjs s3 'MY_BUCKET' 'images/photo.png'
)
Le JSON identifie la source demandée et contient uniquement les lignes détectées. Pour une image
nette contenant une ligne, vérifiez que lineCount vaut un et que
lines[0].text correspond au texte visible dans l’image. Un
score de confiance se situe sur une échelle de 0–100 ; il ne garantit
pas l’exactitude. Le rectangle englobant utilise des coordonnées
relatives à l’image. Pour une image non inclinée de 1 000 pixels de large, une valeur
Left de 0.1 signifie 100 pixels depuis le bord
gauche. Le polygone indique les sommets de la région détectée. Les champs facultatifs qu’AWS omet
sont omis du JSON, plutôt que remplis avec des valeurs inventées.
Une analyse réussie qui ne trouve aucune ligne affiche lineCount: 0 et un tableau
lines vide, puis se termine avec un code de sortie égal à zéro. Cela peut
se produire sur une image vierge ou lorsque le texte n’est pas reconnu. En revanche, un fichier
manquant, une entrée invalide, un problème d’informations d’accès ou une requête AWS échouée écrit
un diagnostic sur stderr et se termine avec un code de sortie non nul ; aucun JSON de réussite
n’est affiché. Comparez le texte à l’image source avant de l’utiliser pour la saisie de données ou
l’accessibilité.
Limites et tarification du service AWS Rekognition
La documentation des limites du service d’AWS indique des entrées JPEG et PNG, un minimum de 80 pixels pour les deux dimensions de l’image et un maximum de 100 mots détectés. Elle indique une limite de 5 MB pour les octets bruts et de 15 MB pour les objets S3. Cette CLI limite les entrées locales à exactement 5 242 880 octets, y compris les éventuelles données ajoutées à la fin ; la représentation base64 du SDK entraîne une surcharge mémoire. Pour les entrées S3, AWS applique sa limite d’objet. Vérifiez la taille et les dimensions de l’objet stocké avant l’appel, plutôt que de supposer qu’un petit fichier compressé respecte toutes les contraintes.
Utilisez la référence des erreurs de l’API pour le dépannage.
Pour InvalidS3ObjectException, vérifiez la clé exacte, la région et les autorisations de
lecture de l’objet. Pour les erreurs d’image, vérifiez le format réel, les dimensions et la taille
en octets. Un échec lié à l’accès ou aux informations d’accès nécessite de corriger
l’authentification ou les autorisations. Les échecs liés au débit et à la limitation des requêtes
peuvent faire l’objet de nouvelles tentatives avec un délai d’attente progressif après vérification
de votre utilisation ; cet exemple vous laisse décider de réessayer plutôt que de masquer des
analyses répétées.
Consultez la tarification d’AWS Rekognition pour votre région, votre API, votre volume et l’éligibilité de votre compte. Le stockage et les requêtes S3 sont facturés séparément.
Conclusion
Utilisez les lignes renvoyées comme résultats potentiels de reconnaissance optique de caractères et conservez la géométrie lorsque vous devez localiser du texte dans une image. Si vous avez aussi besoin d’un pipeline de traitement d’images, consultez l’Image Describe Robot de Transloadit pour une étape d’analyse d’images gérée ; son API et sa sortie diffèrent de celles de cette CLI.
