Points clés à retenir
- Préservez le fichier original téléversé et consignez sa somme de contrôle, son type MIME, son nom et son contexte d’origine avant le traitement.
- Dirigez les PDF vers /document/ocr. Envisagez /image/ocr pour les textes courts dans les images et convertissez les fichiers bureautiques d’entrée pris en charge en PDF avant l’OCR des documents.
- Traitez les sorties OCR comme des données dérivées qui nécessitent une validation par l’application, des règles d’examen et un lien vers le document ou l’image source.
La réception de documents est un problème de routage avant d’être un problème d’OCR. Un pipeline fiable identifie en premier lieu ce qui a été reçu, préserve l’original, ne convertit que si nécessaire, extrait le texte avec le bon Robot et consigne suffisamment d’informations de provenance pour expliquer ultérieurement chaque résultat consultable par recherche.
L’essentiel
- Séparez la fin de l’Assembly de la publication dans l’index de recherche et vérifiez les fichiers exportés requis avant de lancer l’indexation en aval.
- Utilisez des identifiants idempotents et des chemins de sortie versionnés lorsqu’une même source peut être téléversée à nouveau ou corrigée ultérieurement.
Commencer par un contrat de réception
Un pipeline documentaire devient difficile à gérer lorsque la première étape accepte tout et que la dernière suppose que tout a été compris. Définissez le contrat de réception avant de choisir les Robots : quelles sources sont autorisées, ce que l’application considère comme un document, quelles métadonnées sont requises, quelle taille un téléversement peut atteindre et quelles sorties les systèmes en aval attendent. Appliquez une limite de nombre de pages dans l’application avant de créer l’Assembly ; l’exemple ci-dessous ne limite pas le nombre de pages. Les PDF volumineux ou comportant de nombreuses pages peuvent dépasser la fenêtre fixe d’interrogation du Robot pendant l’attente d’un traitement asynchrone chez le fournisseur, même si ce traitement se termine ultérieurement. Réessayer avec une entrée inchangée n’élargit pas cette fenêtre ; traitez les dépassements répétés du délai d’attente comme un échec et réduisez ou scindez l’entrée avant une nouvelle tentative.
Conservez l’original téléversé comme référence immuable. Un PDF normalisé, un fichier texte OCR et un enregistrement de recherche sont des dérivés dont les durées de vie et les modes de défaillance diffèrent. Attribuez-leur une identité commune dans l’application afin qu’un examinateur puisse remonter d’un résultat de recherche aux octets sources qui l’ont produit. La navigation vers une page précise nécessite une correspondance distincte entre les pages.
Identifier la source
Consignez un identifiant stable du document, sa somme de contrôle, le locataire, l’auteur du téléversement, le nom du fichier, le type MIME et l’heure de réception.
Nommer les sorties
Définissez si le flux de travail renvoie un PDF normalisé, du texte OCR, des métadonnées structurées, des vignettes ou l’ensemble de ces sorties.
Distinguer les états
Suivez indépendamment les états téléversé, normalisé, extrait, examiné, indexé et en échec.
Diriger chaque entrée vers le bon Robot
L’extension d’un fichier ne vous indique pas si un PDF contient du texte sélectionnable ou uniquement des pixels issus d’une numérisation. Utilisez la valeur de ${file.mime} déterminée par Transloadit et la politique de l’application pour diriger les entrées. La détermination du type MIME combine les métadonnées intégrées, les informations tirées de l’extension et l’analyse du contenu ; l’extension peut prévaloir lorsque les métadonnées intégrées sont indisponibles. Ce filtrage ne prouve pas la nature du contenu du fichier. Si votre contrat de réception exige une validation stricte du contenu, validez les octets stockés dans votre application. /file/filter peut diriger les fichiers à l’aide de conditions accepts ou declines portant sur ${file.mime} ; utilisez error_on_decline lorsqu’une entrée non prise en charge doit faire échouer l’Assembly.
Les PDF peuvent être envoyés directement à /document/ocr. Utilisez /image/ocr pour les textes courts dans les photographies et les captures d’écran ; sa documentation avertit que la précision peut être moindre pour les images de documents denses. Pour les fichiers bureautiques d’entrée tels que DOCX, utilisez /document/convert (English) pour les convertir en PDF, après avoir vérifié en premier lieu les formats d’entrée indiqués dans sa documentation. Ce flux de travail utilise sa sortie PDF ; d’autres formats de sortie sont disponibles, mais le PDF n’est pas pris en charge en entrée. Un Robot peut ignorer les entrées qu’il n’accepte pas sans faire échouer l’Assembly ; ajoutez donc un filtre MIME explicite et vérifiez les sorties requises.
Branche PDF
Exécutez /document/ocr pour les PDF, y compris les PDF numérisés sans couche de texte exploitable ; choisissez json ou text pour produire un artefact distinct. Le format meta stocke quant à lui les données de reconnaissance sous ${file.meta.recognized_text} sans créer de fichier OCR. Utilisez la granularité list pour obtenir des chaînes de caractères ; la granularité full, utilisée par défaut, stocke des objets de texte et de polygones.
Branche image
Exécutez /image/ocr pour les textes courts dans les images. Lors de la préparation de l’entrée, l’image est réencodée en PNG si elle dépasse 2000 pixels par côté, n’est pas au format JPEG/PNG ou comporte des métadonnées d’orientation ; elle est redimensionnée pour tenir dans cette limite et une rotation automatique est appliquée si nécessaire. Testez soigneusement les numérisations denses ; la préparation des images en vue de leur conversion en PDF sort du cadre de ce guide.
Branche de normalisation
Convertissez les formats bureautiques ou sources pris en charge avant l’OCR lorsque le type d’origine n’est pas accepté par le Robot d’OCR.
Préserver la provenance dans les sorties dérivées
Il est difficile de se fier à un texte sans en connaître la provenance. Stockez l’identifiant du document source, la version de sortie et l’horodatage de l’extraction avec le texte extrait. L’exemple AWS ci-dessous renvoie du JSON à l’échelle du document, sans rattacher les données aux pages. Pour obtenir des résultats de recherche par page, l’application doit scinder les PDF avant le téléversement et consigner les numéros des pages d’origine ; cette préparation sort du cadre du guide. L’exemple autorise une seule entrée par Assembly et utilise des noms d’objets fixes. Un pipeline par page nécessite une Assembly par page, avec des clés d’objets propres à chaque page et une correspondance avec le document parent. Réutiliser les mêmes valeurs document_id et output_version pour plusieurs pages écraserait leurs objets. Ne déduisez jamais cette correspondance de l’ordre du tableau OCR. Si la source est remplacée, créez une nouvelle version et laissez l’indexeur retirer l’ancien enregistrement uniquement après vérification de la nouvelle sortie.
Conservez le texte OCR séparément du document normalisé. Un examinateur peut avoir besoin de consulter côte à côte le scan d’origine, le PDF converti et le texte extrait. Ce lien est également utile lorsqu’un autre fournisseur d’OCR produit un meilleur résultat.
Utiliser une identité stable
L’identifiant de la source doit rester inchangé lors des nouvelles tentatives, tandis que chaque sortie dérivée reçoit une version.
Le contexte des pages ne figure pas dans la sortie
Conservez les liens vers la source pour chaque résultat. La sortie AWS ne contient aucun numéro de page ; la navigation entre les pages nécessite la correspondance consignée lors de la création des entrées d’une seule page.
Ne pas écraser les corrections
Un téléversement corrigé doit créer une nouvelle version et un événement de remplacement explicite.
Rendre explicites l’examen et l’indexation
La valeur ok ASSEMBLY_COMPLETED de l’Assembly Status, observée par interrogation périodique ou via des notifications, signifie qu’aucune erreur non ignorée n’a interrompu l’Assembly et que les Jobs déclarés pour celle-ci, y compris les Jobs de stockage, sont terminés. Un Step peut ne pas traiter une entrée, et ignore_errors peut masquer l’échec d’un Step ; l’achèvement ne prouve donc pas à lui seul que les artefacts requis existent. Il ne signifie pas non plus que l’index de recherche de votre application a accepté le texte ou qu’une personne a approuvé un enregistrement sensible. Ne publiez un événement en aval qu’une fois que les sorties dont vous avez besoin existent et ont passé leurs contrôles.
/document/ocr ne fournit pas de scores de confiance ; ce Template ne peut donc pas orienter le traitement selon un seuil de confiance du fournisseur. Déclenchez un examen humain à l’aide de contrôles applicatifs automatisés portant par exemple sur des fichiers de sortie manquants, un texte extrait vide, une quantité de texte anormalement faible pour le nombre de pages indiqué, l’absence d’expressions attendues ou une catégorie de documents à fort enjeu. Pour les documents ordinaires, un parcours automatisé peut tout de même consigner les contrôles et conserver un moyen de retraiter la source.
Vérifier les sorties
Vérifiez les fichiers attendus, le nombre de pages, la présence de texte non vide et les métadonnées avant l’indexation.
Examiner les exceptions
Placez les résultats ambigus ou à fort enjeu dans une file d’attente pour examen humain plutôt que de les publier silencieusement.
Indexer de manière idempotente
Utilisez l’identifiant de la source et la version de sortie comme clé d’index afin que les nouvelles tentatives ne dupliquent pas les enregistrements.
Versionner les corrections sans perdre les éléments de preuve
Les corrections OCR et les remplacements de source doivent créer une nouvelle version dérivée. Conservez la source précédente, la sortie précédente et la décision issue de l’examen pendant la durée requise par votre politique de conservation, afin de pouvoir expliquer un résultat de l’index après une correction.
Utilisez l’identifiant du document et la version de sortie comme clé d’indexation. Ne réutilisez une version que pour relancer la même tentative de traitement ; attribuez une nouvelle version en cas de correction, de changement de fournisseur ou de retraitement délibéré. Sérialisez les écritures pour une même version afin que des tentatives simultanées ne puissent pas écraser un résultat accepté plus récent.
Conserver la source
Conservez les octets d’origine pour permettre un examen ultérieur et prendre en charge de futurs changements de paramètres OCR ou de fournisseur.
Remplacer de manière atomique
Ne publiez la nouvelle version de l’index qu’après vérification des fichiers requis et de l’état de l’examen.
Commencer par un Template PDF au périmètre limité
L’exemple ci-dessous implémente uniquement la branche PDF : il autorise au plus un téléversement, rejette les types MIME autres que PDF, demande une sortie JSON OCR à AWS et exporte la source et le JSON vers des clés fixes distinctes, sous une seule version de document contrôlée par l’application. Enregistrez ce JSON comme contenu d’un Template stocké, et non comme paramètres complets d’une requête d’Assembly. Votre serveur fournit l’Auth Key et la signature lors de la création de l’Assembly. Testez des PDF représentatifs pour vérifier la structure de sortie, l’exploitabilité du texte et le comportement en cas d’échec avant d’étendre cette configuration d’exemple. Le paramètre auth.max_size limite le nombre total d’octets attendu pour le téléversement, y compris les données supplémentaires de la requête : 104857600 octets correspondent à 100 MiB, et non à une limite par fichier. Il ne garantit ni le rejet avant qu’un téléversement avec reprise ne transfère des octets, ni l’achèvement de l’OCR.
Créez un compte Transloadit et enregistrez les Assembly Instructions dans un Template. Créez un ensemble d’informations d’identification de Template pour S3 nommé document-output, comprenant key, secret, bucket et bucket_region ; consultez les informations d’identification de Template pour la configuration. Pour cette configuration d’exemple, le serveur doit construire et soumettre l’intégralité de la requête d’Assembly, téléversement compris, plutôt que de transmettre le paramètre params signé à un navigateur. Il doit fournir et valider, dans les champs de la requête, des valeurs document_id et output_version non vides, autorisées et utilisables sans risque dans un chemin. Ces valeurs deviennent les variables ${fields.document_id} et ${fields.output_version} dans les chemins de stockage. Les champs multipart alimentent eux aussi les champs de l’Assembly et ne sont pas couverts par la signature du paramètre params ; la signature seule n’autorise donc pas un préfixe de stockage. Ne transmettez pas les champs fournis par le client. Avant l’indexation, vérifiez que les clés de stockage renvoyées correspondent au préfixe attendu par le serveur. Enregistrez allow_steps_override: false dans le Template stocké pour empêcher la redéfinition des Steps à l’exécution lorsque vous utilisez template_id. Gardez le bucket privé avec Block Public Access activé et vérifiez l’autorisation des lecteurs ; acl: bucket-default omet l’ACL de l’objet et s’appuie sur la politique d’accès du bucket.
Cet exemple fixe provider: aws pour rendre le choix du fournisseur explicite, sans garantir des réponses identiques. La valeur par défaut est auto. Prenez les limites actuelles d’AWS Textract comme référence pour les langues prises en charge par AWS. Vérifiez la prise en charge par le fournisseur avant de choisir AWS ou GCP ; leurs structures JSON diffèrent. Testez les langues et les mises en page de vos documents avec le fournisseur choisi et attendez-vous à ce que les réponses changent à mesure que ses modèles évoluent.
L’exemple utilise format: "json" avec granularity: "list" pour exporter un tableau de chaînes correspondant aux lignes reconnues, destiné à l’indexation et aux contrôles du volume de texte. Cela évite le mélange d’entrées de pages, de lignes et de mots dans l’artefact de granularité full produit par défaut, qui peut contenir du texte répété. format: "text" exporte plutôt du texte brut et impose la granularité list. Aucune sortie n’inclut le rattachement aux pages ni de score de confiance. Si vous choisissez la granularité full, les points facultatifs des polygones utilisent une seule largeur et une hauteur issues des métadonnées du PDF ; leurs coordonnées deviennent égales à zéro lorsque ces dimensions sont absentes. Validez ces points avant toute superposition et ne déduisez jamais l’identité d’une page des polygones ou de l’ordre du tableau.
Un Job d’OCR réussi peut tout de même omettre ou mal reconnaître du texte. Vérifiez les deux objets exportés ainsi que le volume de texte extrait par rapport au nombre de pages indiqué, et envoyez les résultats suspects pour examen humain. Ces contrôles automatisés signalent des problèmes, mais ne prouvent pas que la reconnaissance est complète ou exacte ; comparez les résultats à du texte connu dans des documents sources représentatifs avant publication.
Les clés d’objet fixes source.pdf et ocr.json font que les nouvelles tentatives ciblent les mêmes emplacements de stockage pour une version de document. Elles ne dédupliquent pas les Assemblies et ne rendent pas l’OCR déterministe ; l’application doit sérialiser les nouvelles tentatives et conserver la correspondance avec le résultat accepté. Comparez les frais des fournisseurs à l’aide des tarifs de Transloadit, en tenant compte du volume de pages et des autres traitements du flux de travail. Les frais d’OCR par page, propres à chaque fournisseur, sont calculés à partir de la valeur page_count indiquée pour l’entrée ; comparez les frais actuels avant d’estimer le coût du flux de travail complet.
{
"allow_steps_override": false,
"auth": {
"max_number_of_files": 1,
"max_size": 104857600
},
"steps": {
":original": {
"robot": "/upload/handle"
},
"pdf_only": {
"use": ":original",
"robot": "/file/filter",
"accepts": [["${file.mime}", "==", "application/pdf"]],
"error_on_decline": true,
"error_msg": "Upload a PDF document"
},
"extracted_text": {
"use": "pdf_only",
"robot": "/document/ocr",
"provider": "aws",
"format": "json",
"granularity": "list",
"result": true
},
"stored_source": {
"use": "pdf_only",
"robot": "/s3/store",
"credentials": "document-output",
"path": "documents/${fields.document_id}/${fields.output_version}/source.pdf",
"acl": "bucket-default",
"result": true
},
"stored_text": {
"use": "extracted_text",
"robot": "/s3/store",
"credentials": "document-output",
"path": "documents/${fields.document_id}/${fields.output_version}/ocr.json",
"acl": "bucket-default",
"result": true
}
}
}Tester des entrées représentatives
Avant l’indexation, vérifiez les deux objets exportés, assurez-vous que le texte extrait n’est pas vide et que le nombre de caractères est plausible au regard du nombre de pages indiqué. Testez le rejet des fichiers non PDF et la gestion des nouvelles tentatives.
Ajouter des branches de manière réfléchie
Étendez la configuration d’exemple pour les PDF avec des branches de conversion et d’OCR d’images uniquement lorsque leurs contrats d’entrée sont explicites.
Détails techniques à connaître
- /document/ocr accepte les PDF en entrée. /document/convert peut produire des PDF à partir des formats bureautiques documentés, mais ne peut pas prendre un PDF en entrée.
- Avec format: json ou format: text, /document/ocr renvoie un artefact distinct. format: meta ne crée aucun artefact d’OCR et stocke les données de reconnaissance dans ${file.meta.recognized_text} ; leur structure dépend de la granularité. Aucun format n’ajoute de couche de texte permettant la recherche au PDF source.
- Pour AWS, l’artefact produit par /document/ocr avec la granularité
fullcontient le texte après mise en correspondance et des polygones englobants facultatifs, sans conserver les numéros de page, les types de blocs ni les scores de confiance du fournisseur. Il mélange des entrées de pages, de lignes et de mots, de sorte que le texte peut se répéter ; la granularitélistrenvoie plutôt des chaînes correspondant aux lignes. - Un Robot peut ignorer une entrée qu’il n’accepte pas. Une Assembly attend la fin des Jobs déclarés, y compris les Jobs de stockage, avant de se terminer avec succès, mais les entrées ignorées et les erreurs ignorées nécessitent tout de même une vérification des sorties.
- /image/ocr réencode l’image en PNG en la faisant tenir dans une limite de 2000 pixels par côté lorsqu’elle n’est pas au format JPEG/PNG, dépasse cette dimension ou possède des métadonnées d’orientation. La reconnaissance peut être moins précise pour les images de documents denses que pour de courts textes dans des photos.
- auth.max_size plafonne le nombre total d’octets de téléversement attendus pour l’Assembly, y compris les données supplémentaires des requêtes, et non chaque fichier séparément ; ce paramètre ne garantit pas le rejet avant le début d’un transfert avec reprise.
- Les frais par page d’OCR documentaire propres à chaque fournisseur sont calculés à partir de la valeur
page_countindiquée pour l’entrée. Tenez compte du volume de pages attendu pour comparer les fournisseurs et estimer le coût du flux de travail.
Une approche pratique
- 1
Enregistrez le Template pour les PDF, puis faites construire et soumettre par votre serveur la requête d’Assembly complète avec les champs document_id et output_version autorisés.
- 2
Rejetez les types MIME autres que PDF avec le filtre de l’exemple ; appliquez toute limite de nombre de pages dans l’application avant la soumission.
- 3
Stockez le texte OCR ou l’artefact JSON avec la source sous une même version du document et conservez leurs clés d’objet dans l’application.
- 4
Dirigez les résultats dont le texte est vide, qui ne contiennent pas les expressions attendues ou dont la structure est ambiguë vers un circuit d’examen humain avant de les rendre consultables par recherche.
Quand Transloadit est utile
Le Template fourni couvre la réception de PDF soumis par le serveur, l’OCR et le stockage. Le guide décrit également les branches de conversion et de traitement des images, mais ne fournit pas les Templates correspondants ; ajoutez-les uniquement après avoir testé leurs contrats d’entrée.
Périmètre architectural
Transloadit peut normaliser les fichiers téléversés, extraire le texte des entrées prises en charge et exporter les artefacts obtenus. Il ne fournit ni système de gestion documentaire, ni index de recherche, ni file d’examen humain, ni garantie juridique de l’exactitude de l’OCR.
Questions fréquentes
L’OCR peut-elle rendre tous les PDF consultables par recherche textuelle ?
Non. /document/ocr extrait le texte séparément ; il n’ajoute pas de couche de texte au PDF source. La qualité de reconnaissance dépend de la qualité de la numérisation, de la langue, de la mise en page et du document lui-même. Conservez l’original et examinez les résultats lorsqu’une erreur peut avoir des conséquences.
Dois-je d’abord convertir chaque document en PDF ?
Non. Convertissez uniquement les formats qui nécessitent une normalisation pour le Robot suivant. Une conversion inutile ajoute du travail et peut supprimer une structure propre à la source.
Où l’index de recherche doit-il résider ?
Dans l’application ou le service de recherche responsable de la découverte des documents. Transloadit peut préparer et exporter les données sources et dérivées, mais ne constitue ni le catalogue documentaire ni l’index de recherche.
Comment éviter les doublons de documents après une nouvelle tentative ?
Attribuez à la source un identifiant stable dans l’application et une version à chaque résultat dérivé. Faites en sorte que l’opération d’indexation remplace cette version de manière idempotente.