Extrair texto e imagens de PDFs com /document/extract
Seus usuários fazem upload de PDFs, mas seu índice de busca, seu pipeline de RAG e seu acervo de conformidade precisam do texto contido neles. Adicione um Step à sua Assembly para retornar o texto de um PDF, por página e em JSON, se preferir, junto com suas imagens incorporadas. Você pode enviar esses resultados às ferramentas que já usa sem executar um serviço de extração separado.
O Robot 🤖 /document/extract está disponível para uso geral.
O que você pode criar com ele
- Busca. Indexe o texto de cada página para que um resultado possa apontar diretamente para a página 7 de um contrato.
- Pipelines de RAG e LLM. As páginas são blocos naturais para embeddings, e você não precisa executar um serviço de análise sintática.
- Acervos de conformidade. Mantenha uma cópia em texto simples junto de cada original para que as ferramentas de retenção e descoberta possam lê-la.
- Formulários preenchidos automaticamente. Preencha campos com o texto de um documento enviado por upload. Para extrair campos específicos, como números de faturas ou totais, envie o texto a um LLM, como mostra nosso pipeline de inteligência de documentos (English).
Como é um Robot, ele é executado na mesma
Assembly que o restante do processamento dos seus arquivos.
O upload chega, 🤖 /document/thumbs renderiza uma prévia,
/document/extract lê o texto, e um Robot de armazenamento, como
🤖 /s3/store, armazena os três.
Seu aplicativo recebe um único resultado da Assembly em vez de coordenar serviços separados.
O que ele extrai
- Texto da camada de texto do PDF. Este é o padrão (
text_method: "native"). Ele usa opdftotextdo Poppler no modo de layout, por isso é rápido, não envolve taxas de OCR e mantém colunas e linhas de tabelas alinhadas com espaços. Escolhatext_format"txt"ou"json", etext_granularity"document"(um resultado) ou"page"(um resultado por página). - Texto de digitalizações. Com
text_method: "auto", um PDF sem camada de texto é encaminhado ao 🤖 /document/ocr. Useocr_provider: "gcp"etext_format: "txt"para o texto reconhecido.text_method: "ocr"sempre usa OCR. - Imagens incorporadas. São as imagens raster armazenadas no PDF, como fotos, figuras
digitalizadas e logotipos. Imagens idênticas são retornadas uma única vez
(
dedupe_images), emin_image_width,min_image_heightemin_image_bytespermitem descartar ícones e espaçadores.image_formatpreserva o formato incorporado quando possível ou converte para PNG ou JPEG.
Cada resultado de extração inclui meta.document_extract, que identifica texto ou imagens
e, no caso do texto, se ele veio da camada de texto ou do OCR. Os resultados de texto nativo por
página e de imagens também identificam sua página. Os metadados do documento, como número de
páginas, autor e data de criação, ficam em meta do upload quando estão
disponíveis no PDF.
O Robot retorna texto simples ou JSON, não Markdown, e não estrutura tabelas em linhas e células:
a extração nativa retorna títulos, listas e tabelas como texto com o layout preservado. Para
renderizar Markdown como HTML ou PDF, use 🤖 /document/convert.
/document/extract também não renderiza páginas; essa é a função de
/document/thumbs.
Teste com um PDF real
Vamos usar o documento técnico do Bitcoin, um PDF de nove páginas dos nossos arquivos de exemplo. Você precisa do Node.js 20.10 ou mais recente e de uma conta na 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
Coloque sua Auth Key e seu Auth Secret do Console em um arquivo .env:
TRANSLOADIT_KEY=MY_AUTH_KEY
TRANSLOADIT_SECRET=MY_SECRET_KEY
Estas Assembly Instructions extraem o texto
como JSON e renderizam uma prévia da página 1 na mesma Assembly. Salve-as 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"
}
}
}
O script faz upload do PDF, aguarda a Assembly, baixa o JSON e imprime uma linha 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
Nosso teste em produção com Node.js 20.10 levou cerca de 14 segundos para o upload e o
processamento; o tempo varia. Este é o início do arquivo JSON produzido pelo 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
]
}
O campo text de nível superior contém o documento inteiro, com caracteres
de avanço de página (\f) separando as páginas.
pages fornece o mesmo texto já dividido, pronto para indexação ou geração
de embeddings por página. As URLs dos resultados são temporárias, então adicione um Step de
armazenamento quando quiser manter os arquivos.
Extraia as imagens
Os diagramas do documento técnico são desenhos vetoriais, então solicitar suas imagens não retorna nada. Um PDF exportado do Word é um teste melhor. Nossa cópia de demonstração do documento técnico da AWS Architecting for the Cloud tem 42 páginas, um logotipo em cada uma delas e um único diagrama de arquitetura:
{
"steps": {
"images": {
"robot": "/document/extract",
"use": ":original",
"extract": ["images"],
"min_image_width": 300
}
}
}
O Step retorna um PNG: o diagrama de 1.016 × 594 da página 17. O PDF contém 43 imagens raster antes
da desduplicação, incluindo 42 cópias do logotipo. As máscaras de transparência são omitidas por
padrão (include_image_masks: false), a desduplicação mantém apenas uma cópia do logotipo, e
min_image_width a descarta. Defina include_image_masks: true se também quiser as
máscaras de transparência separadas.
Processe digitalizações e outros formatos de documento
Para um contrato digitalizado sem camada de texto, defina text_method como
"auto". O Robot recorre ao OCR somente quando a extração nativa não encontra
texto:
{
"steps": {
"text": {
"robot": "/document/extract",
"use": ":original",
"extract": ["text"],
"text_method": "auto",
"text_format": "txt",
"ocr_provider": "gcp"
}
}
}
Executamos estas Instructions no documento técnico e em uma digitalização de nove páginas dele.
Incluindo o upload, o original levou cerca de dois segundos e foi lido de forma nativa. A
digitalização recorreu ao OCR e levou cerca de 12 segundos, com o resultado marcado como
"method": "ocr". O tempo varia conforme o documento e o provedor.
O Robot lê apenas PDFs e ignora outros arquivos. Para uploads de Word, PowerPoint ou Excel,
converta-os primeiro com /document/convert e aponte /document/extract para
esse Step:
{
"steps": {
"pdf": {
"robot": "/document/convert",
"use": ":original",
"format": "pdf"
},
"text": {
"robot": "/document/extract",
"use": "pdf",
"extract": ["text"],
"text_format": "json"
}
}
}
Limites e preços
page_range(por exemplo,"1,3-5") limita o processamento às páginas de que você precisa e pode selecionar até 1.000 páginas. As saídas em JSON e de texto por página podem abranger no máximo 1.000 páginas selecionadas por Job.page_rangeepassword(para PDFs criptografados) se aplicam à extração de texto nativo e de imagens incorporadas. A saída de texto por página exigetext_method: "native". O OCR processa o documento inteiro, não pode ser combinado com essas opções e não pode abrir PDFs criptografados."auto"decide por documento, não por página. Se um PDF mistura páginas com texto digitado e páginas digitalizadas, o texto nativo prevalece e as páginas digitalizadas ficam sem texto extraído; use"ocr"para esses arquivos.- Para texto de OCR, use
text_format: "txt". A estrutura JSON comtextepagesmostrada acima é para extração nativa. - Elementos gráficos vetoriais, gráficos e fundos de página muitas vezes não são imagens
incorporadas, por isso não são extraídos. Use
/document/thumbspara esses elementos.
A extração nativa contabiliza os bytes de entrada e saída no uso do seu plano, com um mínimo de
1 MiB por documento. O Step text do nosso exemplo de nove páginas foi
contabilizado como esse mínimo de 1 MiB. Quando o OCR é executado, são adicionadas cobranças por
página; consulte os preços de /document/ocr.
Comece agora
/document/extract está disponível para todas as contas. Leia a
referência de parâmetros, adicione o Step a um Template que você já
usa ou crie uma conta gratuita e execute o exemplo acima. Se seus
documentos precisarem de algo que o Robot ainda não faz,
avise a gente.
