Extraire texte et images des PDF avec /document/extract
Vos utilisateurs envoient des PDF, mais votre index de recherche, votre pipeline RAG et vos archives de conformité ont besoin du texte qu’ils contiennent. Ajoutez un Step à votre Assembly pour obtenir le texte d’un PDF, page par page et au format JSON si vous le souhaitez, ainsi que ses images intégrées. Vous pouvez transmettre ces résultats à vos outils existants sans exploiter un service d’extraction distinct.
🤖 /document/extract est un Robot désormais disponible pour tous.
Ce que vous pouvez créer avec ce Robot
- Recherche. Indexez le texte de chaque page pour qu’un résultat puisse pointer directement vers la page 7 d’un contrat.
- Pipelines RAG et LLM. Les pages constituent des segments naturels pour les embeddings, sans service d’analyse à exploiter de votre côté.
- Archives de conformité. Conservez une copie en texte brut à côté de chaque original pour que les outils de conservation et de recherche documentaire puissent la lire.
- Formulaires préremplis. Préremplissez les champs à partir du texte d’un document envoyé. Pour extraire des champs nommés, comme des numéros de facture ou des totaux, transmettez le texte à un LLM, comme le montre notre pipeline d’analyse intelligente de documents (English).
Comme il s’agit d’un Robot, il s’exécute dans la même
Assembly que le reste du traitement de vos fichiers.
Le fichier envoyé arrive, 🤖 /document/thumbs génère un aperçu,
/document/extract lit le texte et un Robot de stockage tel que
🤖 /s3/store (English) conserve les trois.
Votre application reçoit un seul résultat d’Assembly sans avoir à coordonner des services distincts.
Ce que ce Robot extrait
- Texte de la couche de texte du PDF. C’est le comportement par défaut
(
text_method: "native"). Il utilisepdftotextde Poppler en mode de conservation de la mise en page : il est donc rapide, n’entraîne aucuns frais d’OCR et maintient l’alignement des colonnes et des lignes de tableaux à l’aide d’espaces. Choisisseztext_format"txt"ou"json", ettext_granularity"document"(un résultat) ou"page"(un résultat par page). - Texte des documents numérisés. Avec
text_method: "auto", un PDF sans couche de texte est transmis à 🤖 /document/ocr. Utilisezocr_provider: "gcp"ettext_format: "txt"pour le texte reconnu.text_method: "ocr"utilise toujours l’OCR. - Images intégrées. Ce sont les images matricielles stockées dans le PDF, comme les photos,
les illustrations numérisées et les logos. Les images identiques ne sont renvoyées qu’une fois
(
dedupe_images), etmin_image_width,min_image_heightetmin_image_bytesvous permettent d’exclure les icônes et les images d’espacement.image_formatconserve le format intégré lorsque c’est possible, ou convertit les images en PNG ou JPEG.
Chaque résultat d’extraction contient meta.document_extract, qui indique s’il s’agit de
texte ou d’images et, pour le texte, s’il provient de la couche de texte ou de l’OCR. Les résultats
natifs de texte par page et d’images indiquent aussi leur page. Les métadonnées du document, comme
le nombre de pages, l’auteur et la date de création, figurent dans
meta du fichier envoyé lorsqu’elles sont disponibles dans le PDF.
Le Robot renvoie du texte brut ou du JSON, pas du Markdown, et il ne décompose pas les tableaux en
lignes et en cellules : l’extraction native renvoie les titres, les listes et les tableaux sous
forme de texte dont la mise en page est conservée. Pour convertir du Markdown en HTML ou en PDF,
utilisez 🤖 /document/convert (English).
/document/extract ne génère pas non plus le rendu des pages ; cette tâche revient à
/document/thumbs.
Essayer sur un vrai PDF
Nous utiliserons le livre blanc Bitcoin, un PDF de neuf pages issu de nos fichiers de démonstration. Vous avez besoin de Node.js 20.10 ou d’une version ultérieure et d’un compte Transloadit.
mkdir pdf-text && cd pdf-text
npm init -y && npm pkg set type=module
npm install @transloadit/node
curl -fsSLo bitcoin.pdf https://demos.transloadit.com/inputs/bitcoin.pdf
Placez votre Auth Key et votre Auth Secret provenant de la Console dans un fichier
.env :
TRANSLOADIT_KEY=MY_AUTH_KEY
TRANSLOADIT_SECRET=MY_SECRET_KEY
Ces Assembly Instructions extraient le texte au
format JSON et génèrent un aperçu de la page 1 dans la même Assembly. Enregistrez-les dans
instructions.json :
{
"steps": {
"text": {
"robot": "/document/extract",
"use": ":original",
"extract": ["text"],
"text_format": "json"
},
"preview": {
"robot": "/document/thumbs",
"use": ":original",
"page": 1,
"width": 600,
"format": "jpg"
}
}
}
Le script envoie le PDF, attend l’Assembly, télécharge le JSON et affiche une ligne par page :
import { readFile } from 'node:fs/promises'
import { Transloadit } from '@transloadit/node'
const client = new Transloadit({
authKey: process.env.TRANSLOADIT_KEY,
authSecret: process.env.TRANSLOADIT_SECRET,
})
const assembly = await client.createAssembly({
files: { document: './bitcoin.pdf' },
params: JSON.parse(await readFile('./instructions.json', 'utf8')),
waitForCompletion: true,
})
const res = await fetch(assembly.results.text[0].ssl_url)
if (!res.ok) throw new Error(`Could not download the text: HTTP ${res.status}`)
const { pages } = await res.json()
for (const { page, text } of pages) {
const words = text.split(/\s+/).filter(Boolean).length
const firstLine = text.trim().split('\n')[0].replaceAll(/\s+/g, ' ')
console.log(`Page ${page}: ${words} words, starts with "${firstLine.slice(0, 50)}"`)
}
console.log(`Preview of page 1: ${assembly.results.preview[0].ssl_url}`)
$ node --env-file=.env extract.js
Page 1: 461 words, starts with "Bitcoin: A Peer-to-Peer Electronic Cash System"
Page 2: 430 words, starts with "2. Transactions"
Page 3: 526 words, starts with "4. Proof-of-Work"
Page 4: 488 words, starts with "New transaction broadcasts do not necessarily need"
…
Page 9: 159 words, starts with "References"
Preview of page 1: https://…/d650f05c….jpg
Notre test en production avec Node.js 20.10 a pris environ 14 secondes pour l’envoi et le traitement ;
la durée varie. Voici le début du fichier JSON produit par le Step
text, bitcoin-text.json :
{
"text": " Bitcoin: A Peer-to-Peer Electronic Cash System\n\n …",
"pages": [
{
"page": 1,
"text": " Bitcoin: A Peer-to-Peer Electronic Cash System\n\n … Abstract. A purely peer-to-peer version of electronic cash would allow online\n …"
},
{
"page": 2,
"text": "2. Transactions\nWe define an electronic coin as a chain of digital signatures. …"
}
// … pages 3 to 9
]
}
text, au premier niveau, contient l’intégralité du document, avec des
caractères de saut de page (\f) séparant les pages.
pages fournit le même texte déjà découpé, prêt à être indexé ou transformé
en embeddings page par page. Les URL des résultats sont temporaires ; ajoutez donc un Step de
stockage si vous souhaitez conserver les fichiers.
Extraire les images
Les schémas du livre blanc sont des dessins vectoriels ; demander d’en extraire les images ne renvoie donc rien. Un PDF exporté depuis Word constitue un meilleur test. Notre exemplaire de démonstration du livre blanc AWS Architecting for the Cloud compte 42 pages, avec un logo sur chacune d’elles et un seul schéma d’architecture :
{
"steps": {
"images": {
"robot": "/document/extract",
"use": ":original",
"extract": ["images"],
"min_image_width": 300
}
}
}
Le Step renvoie un seul PNG : le schéma de 1 016 × 594 de la page 17. Le PDF contient 43 images
matricielles avant déduplication, dont 42 copies du logo. Les masques de transparence sont exclus
par défaut (include_image_masks: false), la déduplication ne conserve qu’un exemplaire du logo
répété et min_image_width l’exclut. Définissez include_image_masks: true si vous
souhaitez également obtenir les masques de transparence séparés.
Traiter les documents numérisés et les autres formats de documents
Pour un contrat numérisé sans couche de texte, définissez text_method sur
"auto". Le Robot ne recourt à l’OCR que lorsque l’extraction native ne trouve
aucun texte :
{
"steps": {
"text": {
"robot": "/document/extract",
"use": ":original",
"extract": ["text"],
"text_method": "auto",
"text_format": "txt",
"ocr_provider": "gcp"
}
}
}
Nous avons exécuté ces Instructions sur le livre blanc et sur une version numérisée de neuf pages.
Envoi compris, le traitement de l’original a pris environ deux secondes et a utilisé l’extraction
native. Le traitement de la version numérisée a recouru à l’OCR et a pris environ 12 secondes, avec
un résultat marqué "method": "ocr". La durée varie selon le document et le fournisseur.
Le Robot lit uniquement les PDF et ignore les autres fichiers. Pour les fichiers Word, PowerPoint
ou Excel envoyés, convertissez-les d’abord avec /document/convert et faites pointer
/document/extract vers ce Step :
{
"steps": {
"pdf": {
"robot": "/document/convert",
"use": ":original",
"format": "pdf"
},
"text": {
"robot": "/document/extract",
"use": "pdf",
"extract": ["text"],
"text_format": "json"
}
}
}
Limites et tarifs
page_range(par exemple"1,3-5") limite le traitement aux pages dont vous avez besoin et peut sélectionner jusqu’à 1 000 pages. Les sorties JSON et texte par page peuvent couvrir au maximum 1 000 pages sélectionnées par tâche.page_rangeetpassword(pour les PDF chiffrés) s’appliquent à l’extraction native du texte et des images intégrées. La sortie texte par page nécessitetext_method: "native". L’OCR traite l’intégralité du document et ne peut ni être combiné avec ces options ni ouvrir des PDF chiffrés."auto"décide à l’échelle du document, pas de chaque page. Si un PDF mélange des pages de texte et des pages numérisées, le texte natif est retenu et les pages numérisées restent vides ; utilisez"ocr"pour ces fichiers.- Pour le texte issu de l’OCR, utilisez
text_format: "txt". La structure JSON avectextetpagesprésentée ci-dessus concerne l’extraction native. - Les éléments graphiques vectoriels, les graphiques et les arrière-plans de pages ne sont souvent
pas des images intégrées et ne sont donc pas extraits. Utilisez
/document/thumbspour ces éléments.
L’extraction native comptabilise les octets d’entrée et de sortie dans l’utilisation de votre
forfait, avec un minimum de 1 MiB par document.
Le Step text de notre exemple de neuf pages a été comptabilisé à ce minimum
de 1 MiB. Lorsque l’OCR est utilisé, des frais par page s’ajoutent ; consultez les
tarifs de /document/ocr (English).
Commencer
/document/extract est disponible pour tous les comptes. Consultez la
référence des paramètres, ajoutez le Step à un Template que vous
utilisez déjà ou créez un compte gratuit et exécutez l’exemple
ci-dessus. Si vos documents nécessitent une fonction que le Robot ne propose pas encore,
faites-le-nous savoir.
