O laboratório deste site nasceu de uma necessidade concreta: precisava de uma bancada de testes para as tecnologias que uso com clientes, e queria que fosse também útil a quem trabalha todos os dias com documentos. Hoje tem 13 ferramentas — visualizador, editor de PDF, OCR, scanner, tradução, resumo, pesquisa de PDF legais, slides com IA e outras — em sete idiomas. Esta é a história de como o construí.
O problema e as restrições
- Custos baixos: um backend NestJS num pequeno serviço cloud, sem infraestrutura dedicada.
- Privacidade: sempre que possível, os ficheiros não devem sair do dispositivo de quem os usa.
- Sete idiomas e SEO: cada ferramenta tem de ser encontrável no Google em todos os idiomas.
- Ferramentas anónimas: sem registo obrigatório, logo com proteções contra abusos.
Escolha 1: no browser quando possível, no servidor quando necessário
O visualizador, o editor de PDF (unir, dividir, rodar, marca de água) e a primeira fase do OCR funcionam inteiramente no browser, com pdf.js e pdf-lib: o documento nunca é enviado. O servidor só entra em jogo quando é inevitável: chamadas a modelos de IA, OCR pesado com Tesseract, conversões de formato.
Escolha 2: primeiro o texto, depois o OCR
Cada página é primeiro consultada sobre a sua camada de texto. Abaixo de 40 caracteres considero-a uma digitalização e envio-a para OCR; o mesmo limiar vale no browser e no servidor, para que os dois caminhos deem resultados coerentes. O OCR é lento, por isso há um teto de 20 páginas por documento.
Escolha 3: limites declarados, não escondidos
Os documentos longos são divididos em blocos para a IA. Acima de 15 blocos prefiro truncar e dizê-lo ao utilizador, em vez de deixar explodir tempos e custos com um ficheiro patológico:
// Hard cap on blocks per document: beyond it the file is
// truncated honestly instead of exploding latency and cost.
const chunks = allChunks.slice(0, this.MAX_CHUNKS); // 15
const truncated = allChunks.length > this.MAX_CHUNKS;
// "truncated" goes back to the UI: the user is told, not surprised
Escolha 4: ferramentas ligadas por um workspace
O valor real está nas cadeias: scanner → OCR → tradução, pesquisa → resumo. Por isso acrescentei um workspace que passa o resultado de uma ferramenta à seguinte sem descarregar e voltar a carregar ficheiros. Contei-o em detalhe neste artigo.
Escolha 5: quotas de IA
Ferramentas anónimas e chamadas a modelos de IA são uma combinação perigosa para o orçamento. Além do limite por minuto, introduzi um teto diário por endereço IP e um orçamento global diário de tokens, com um interruptor de emergência. Sem isso, um único script automático poderia gastar numa hora o orçamento de um mês.
Os erros com que mais aprendi
- Os meus cabeçalhos de segurança bloqueavam a minha pré-visualização. As predefinições do Helmet proíbem mostrar respostas do backend num iframe de outra origem: tive de abrir uma exceção específica, só nessa rota e só para o meu frontend.
- Nos telemóveis a pré-visualização do PDF mostrava só a primeira página. O visualizador nativo dos browsers móveis faz isso muitas vezes: no telemóvel passei a renderizar as páginas com pdf.js, através de um proxy com uma lista fechada de domínios permitidos para evitar abusos.
- As fontes têm de ser verificadas ao vivo. Para a pesquisa de PDF legais mantive Internet Archive, Project Gutenberg, arXiv e Europe PMC; outras fontes promissoras foram descartadas porque, testadas a sério, devolviam páginas HTML e não PDF.
- Títulos num só idioma. Durante semanas as páginas das ferramentas tiveram títulos e descrições fixos, quase todos em inglês: as versões nos outros idiomas eram, na prática, invisíveis para o Google.
O resultado
Treze ferramentas em sete idiomas, com páginas pré-renderizadas para cada idioma e a maior parte do processamento no browser. Mas o resultado mais útil é outro: um repertório de soluções já testadas — tratamento de PDF, OCR, quotas de IA, proxies seguros, i18n — que reutilizo nos projetos para clientes.
Em resumo
Construir o laboratório ensinou-me três coisas: processar no browser tudo o que for possível, declarar os limites em vez de os esconder e proteger todos os recursos que custam dinheiro. Se tens um projeto que trabalha com documentos ou IA, escreve-me: provavelmente já enfrentei um problema semelhante.