Extrae texto e imágenes de PDF con /document/extract
Tus usuarios suben PDF, pero tu índice de búsqueda, tu pipeline de RAG y tu archivo de cumplimiento normativo necesitan las palabras que contienen los PDF subidos. Añade un Step a tu Assembly para obtener el texto de un PDF, por página y en JSON si lo prefieres, junto con sus imágenes incrustadas. Puedes enviar esos resultados a tus herramientas existentes sin ejecutar un servicio de extracción independiente.
El Robot 🤖 /document/extract ya tiene disponibilidad general.
Qué puedes crear con él
- Búsqueda. Indexa el texto de cada página para que un resultado pueda enlazar directamente a la página 7 de un contrato.
- Pipelines de RAG y LLM. Las páginas son fragmentos naturales para los embeddings y no tienes que ejecutar un servicio de análisis.
- Archivos de cumplimiento normativo. Guarda una copia en texto plano junto a cada original para que las herramientas de retención y descubrimiento de pruebas judiciales puedan leerla.
- Formularios completados automáticamente. Rellena campos con el texto de un documento subido. Para extraer campos específicos, como números de factura o totales, pasa el texto a un LLM, como muestra nuestro pipeline de inteligencia documental.
Como es un Robot, se ejecuta en la misma
Assembly que el resto del procesamiento de tus archivos.
Llega el archivo subido, 🤖 /document/thumbs genera una vista previa,
/document/extract lee el texto y un Robot de almacenamiento como
🤖 /s3/store guarda los tres.
Tu aplicación recibe un único resultado de la Assembly en lugar de coordinar servicios separados.
Qué extrae
- Texto de la capa de texto del PDF. Es la opción predeterminada (
text_method: "native"). Usapdftotextde Poppler en modo de conservación de la disposición, por lo que es rápido, no implica cargos por OCR y mantiene las columnas y las filas de las tablas alineadas mediante espacios. Eligetext_format"txt"o"json", ytext_granularity"document"(un resultado) o"page"(un resultado por página). - Texto de documentos escaneados. Con
text_method: "auto", un PDF sin capa de texto se envía a 🤖 /document/ocr. Usaocr_provider: "gcp"ytext_format: "txt"para el texto reconocido.text_method: "ocr"siempre usa OCR. - Imágenes incrustadas. Son las imágenes rasterizadas almacenadas dentro del PDF, como fotos,
figuras escaneadas y logotipos. Las imágenes idénticas se devuelven una sola vez
(
dedupe_images), ymin_image_width,min_image_heightymin_image_byteste permiten descartar iconos y separadores.image_formatconserva el formato incrustado cuando es posible o lo convierte a PNG o JPEG.
Cada resultado de extracción incluye meta.document_extract, que identifica si contiene
texto o imágenes y, en el caso del texto, si procede de la capa de texto o de OCR. Los resultados
nativos de texto por página y de imágenes también identifican su página. Los metadatos del
documento, como el número de páginas, el autor y la fecha de creación, están en
meta del archivo subido cuando están disponibles en el PDF.
El Robot devuelve texto plano o JSON, no Markdown, y no estructura las tablas en filas y celdas:
la extracción nativa devuelve encabezados, listas y tablas como texto que conserva la disposición.
Para convertir Markdown a HTML o PDF, usa 🤖 /document/convert.
/document/extract tampoco renderiza páginas; esa es la función de
/document/thumbs.
Pruébalo con un PDF real
Usaremos el documento técnico de Bitcoin, un PDF de nueve páginas de nuestros archivos de ejemplo. Necesitas Node.js 20.10 o posterior y una cuenta de 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
Guarda tu Auth Key y tu Auth Secret de la Console en un archivo
.env:
TRANSLOADIT_KEY=MY_AUTH_KEY
TRANSLOADIT_SECRET=MY_SECRET_KEY
Estas Assembly Instructions extraen el texto
como JSON y generan una vista previa de la página 1 en la misma Assembly. Guárdalas como
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"
}
}
}
El script sube el PDF, espera a que termine la Assembly, descarga el JSON e imprime una línea por página:
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
Nuestra prueba en producción con Node.js 20.10 tardó unos 14 segundos en subir y procesar el archivo;
el tiempo varía. Este es el comienzo del archivo JSON que produjo el 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, en el nivel superior, contiene todo el documento, con caracteres de
salto de página (\f) que separan las páginas.
pages te proporciona el mismo texto ya dividido, listo para indexarlo o
crear embeddings por página. Las URL de los resultados son temporales, así que añade un Step de
almacenamiento cuando quieras conservar los archivos.
Extrae las imágenes
Los diagramas del documento técnico son dibujos vectoriales, por lo que solicitar sus imágenes no devuelve ninguna. Un PDF exportado desde Word es una mejor prueba. Nuestra copia de ejemplo del documento técnico Architecting for the Cloud de AWS tiene 42 páginas, un logotipo en cada una y un único diagrama de arquitectura:
{
"steps": {
"images": {
"robot": "/document/extract",
"use": ":original",
"extract": ["images"],
"min_image_width": 300
}
}
}
El Step devuelve un PNG: el diagrama de 1.016 × 594 de la página 17. El PDF contiene 43 imágenes
rasterizadas antes de la deduplicación, incluidas 42 copias del logotipo. Las máscaras de
transparencia se omiten de forma predeterminada (include_image_masks: false), la deduplicación
reduce el logotipo repetido a una sola copia y min_image_width la descarta.
Configura include_image_masks: true si también quieres las máscaras de transparencia separadas.
Procesa documentos escaneados y otros formatos
Para un contrato escaneado sin capa de texto, establece text_method en
"auto". El Robot recurre a OCR solo cuando la extracción nativa no encuentra
texto:
{
"steps": {
"text": {
"robot": "/document/extract",
"use": ":original",
"extract": ["text"],
"text_method": "auto",
"text_format": "txt",
"ocr_provider": "gcp"
}
}
}
Ejecutamos estas Instructions con el documento técnico y con una versión escaneada de sus nueve
páginas. Incluida la subida, el original tardó unos dos segundos y se leyó mediante extracción
nativa. La versión escaneada recurrió a OCR y tardó unos 12 segundos, con su resultado marcado como
"method": "ocr". El tiempo varía según el documento y el proveedor.
El Robot solo lee PDF y omite otros archivos. Si subes archivos de Word, PowerPoint o Excel,
conviértelos primero con /document/convert y haz que /document/extract
apunte a ese Step:
{
"steps": {
"pdf": {
"robot": "/document/convert",
"use": ":original",
"format": "pdf"
},
"text": {
"robot": "/document/extract",
"use": "pdf",
"extract": ["text"],
"text_format": "json"
}
}
}
Límites y precios
page_range(por ejemplo,"1,3-5") limita el procesamiento a las páginas que necesitas y permite seleccionar hasta 1.000 páginas. La salida en JSON y la de texto por página pueden abarcar como máximo 1.000 páginas seleccionadas por ejecución de procesamiento.page_rangeypassword(para PDF cifrados) se aplican a la extracción de texto nativo y de imágenes incrustadas. La salida de texto por página requieretext_method: "native". OCR procesa todo el documento y no se puede combinar con estas opciones ni abrir PDF cifrados."auto"decide por documento, no por página. Si un PDF combina páginas con texto digital y páginas escaneadas, se utiliza el texto nativo y las páginas escaneadas quedan vacías; usa"ocr"para esos archivos.- Para el texto obtenido por OCR, usa
text_format: "txt". La estructura JSON detextypagesmostrada arriba corresponde a la extracción nativa. - Los gráficos vectoriales, los gráficos de datos y los fondos de página a menudo no son imágenes
incrustadas, por lo que no se extraen. Usa
/document/thumbspara esos elementos.
La extracción nativa contabiliza los bytes de entrada y salida para el consumo de tu plan, con un
mínimo de 1 MiB por documento. El Step text de nuestro ejemplo de nueve
páginas se contabilizó como ese mínimo de 1 MiB. Cuando se ejecuta OCR, se añaden cargos por página;
consulta los precios de /document/ocr.
Comienza
/document/extract está disponible para todas las cuentas. Lee la
referencia de parámetros, añade el Step a un Template que ya uses
o crea una cuenta gratuita y ejecuta el ejemplo anterior. Si tus
documentos necesitan algo que el Robot todavía no hace,
cuéntanoslo.
