Ferramenta de navegador · Documentos PDF

Presto PDF

Site com dez ferramentas de PDF que processam os arquivos inteiramente no navegador, sem upload para servidor, em português, inglês e espanhol.

Papel
Produto próprio: concepção, arquitetura e desenvolvimento
Organização e período
Julho de 2026
Plataformas
Web (desktop e celular)
Página inicial do Presto PDF com a grade das dez ferramentas, o aviso de privacidade e espaços reservados para anúncios na lateral.
Página inicial com a grade das ferramentas

01 / Contexto

História e problema

Para quem
Pessoas que precisam juntar, dividir, converter ou comprimir PDFs no dia a dia e não querem enviar documentos para um serviço de terceiros.
Problema
As ferramentas de PDF mais usadas na web dependem de upload do arquivo para processamento em servidor. Isso cria espera, limites de uso e uma questão de privacidade para documentos pessoais ou de trabalho. A proposta foi inverter a arquitetura: todo o processamento acontece no dispositivo de quem usa.
Restrições
Sem backend de processamento; o limite prático é a memória do aparelho. PDFs criptografados não são suportados pelas bibliotecas usadas. A política de segurança precisava conviver com o pdf.js em worker, downloads via blob e o código do AdSense.
  1. 18/07/2026

    Estrutura inicial do site, estilos e scripts de ferramentas.

  2. 27/07/2026

    Versão v3 com auditoria: verificação da promessa de não enviar arquivos, cabeçalhos de segurança, escape de nomes de arquivo e animações com respeito a movimento reduzido.

02 / Papel

Minha responsabilidade

Liderança e direção

  • Defini o posicionamento do produto: processamento 100% local como diferencial de privacidade e de custo de operação.
  • Delimitei o escopo da primeira versão e registrei o que ficou de fora por exigir servidor ou WebAssembly pesado (proteção de arquivos, Word para PDF, compressão mantendo texto selecionável).

Execução técnica direta

  • Estruturei o gerador estático que produz 33 páginas: início e dez ferramentas em português, inglês e espanhol, com slugs localizados e hreflang.
  • Implementei as dez ferramentas sobre pdf-lib (montagem e edição), PDF.js (renderização em worker) e JSZip (pacotes de saída), com as bibliotecas hospedadas no próprio site.
  • Configurei os cabeçalhos de segurança (CSP, HSTS, nosniff, X-Frame-Options, COOP, CORP) com as liberações mínimas para worker e blob.
  • Validei a promessa de privacidade com monitoramento das requisições no navegador durante o processamento de arquivos de teste.

03 / Arquitetura

Arquitetura documentada

Site estático sem backend de processamento. O HTML de cada página é gerado em tempo de build; no navegador, um script único lê a configuração da página e aciona as bibliotecas de PDF. O arquivo do usuário é lido com APIs do navegador, processado em memória e devolvido como download local. A única função de servidor é a detecção de país na borda da Cloudflare, usada para idioma e fuso, sem relação com os arquivos.

Arquitetura do Presto PDF
  1. Build
    • Gerador estático em Node
    • Catálogo de ferramentas
  2. Site estático
    • 33 páginas HTML
    • Cabeçalhos de segurança
  3. Navegador
    • Ferramentas em JavaScript
    • Detecção de idioma
  4. Processamento local
    • pdf-lib
    • PDF.js em worker
    • JSZip
  5. Saída
    • Download via blob

Camadas e tecnologias

Geração estática
Um gerador estático em Node monta as páginas a partir de um catálogo de ferramentas, com títulos, descrições, perguntas frequentes e slugs por idioma. Português na raiz, inglês em /en/ e espanhol em /es/, com hreflang e sitemap.
Ferramentas
Juntar (ordem por arrastar), dividir (intervalos ou página a página, saída em ZIP), extrair páginas, organizar (miniaturas arrastáveis com exclusão), girar (90, 180 e 270 graus), PDF para JPG (resolução de 1x a 3x), imagem para PDF (JPG e PNG), comprimir, marca d'água e numerar páginas.
Bibliotecas
pdf-lib para criar e editar documentos, PDF.js 3.11.174 para renderizar páginas em worker e JSZip 3.10.1 para empacotar várias saídas. As três ficam no próprio projeto, servidas pelo próprio domínio, cerca de 2 MB com cache de longa duração.
Segurança e privacidade
CSP com worker-src e blob liberados apenas para o necessário, object-src 'none', frame-ancestors 'none', HSTS, nosniff, Referrer-Policy, Permissions-Policy, COOP e CORP. Nomes de arquivo escolhidos pelo usuário passam por escape antes de aparecer na tela.
Implantação
Cloudflare Pages para o site estático e uma função na borda para detecção de país.

04 / Decisões

Decisões técnicas e compromissos

Processamento inteiramente no navegador

Problema
Serviços de PDF com upload exigem infraestrutura de processamento, impõem filas e limites e pedem que o usuário confie documentos a terceiros.
Decisão
Executar todas as operações no cliente com pdf-lib, PDF.js e JSZip, sem endpoint que receba arquivos.
Motivo
Elimina o custo de servidor por operação, permite uso sem limite artificial e transforma privacidade em uma propriedade verificável da arquitetura, não em uma promessa de política.
Compromisso
O desempenho depende do aparelho; arquivos muito grandes em celulares antigos podem esgotar a memória da aba. Recursos que exigem processamento pesado ficaram fora da primeira versão.
Aprendizado
A promessa foi testada com monitoramento de rede durante o processamento: nenhuma requisição carregou dados de arquivo.

Compressão por rasterização com aviso explícito

Problema
Comprimir PDF mantendo texto vivo e otimizando fontes exige ferramentas que, na prática, rodam em servidor.
Decisão
Comprimir renderizando cada página como imagem com qualidade ajustável, mostrar o tamanho antes e depois e avisar quando o resultado fica maior que o original.
Motivo
Entrega redução real em PDFs compostos por imagens sem abrir mão do processamento local.
Compromisso
O texto deixa de ser selecionável; a interface informa isso no resultado e recomenda manter o original quando a compressão não compensa.

Bibliotecas hospedadas no próprio domínio

Problema
Carregar bibliotecas de CDN de terceiros amplia a superfície da CSP e cria dependência externa para a função principal do site.
Decisão
Versionar pdf-lib, PDF.js e JSZip no próprio projeto e servi-las com cache imutável.
Motivo
Mantém a CSP restrita a 'self' para scripts da aplicação e garante que a ferramenta funcione mesmo se um CDN mudar ou falhar.
Compromisso
Atualizações de segurança, especialmente do PDF.js, passam a ser manuais e precisam de acompanhamento.

05 / Funcionamento

Fluxo e modelo

Juntar dois PDFs (dados de teste)

  1. O usuário solta a.pdf (2 páginas) e b.pdf (3 páginas) na área de arquivos.
  2. A lista mostra os dois arquivos com o tamanho; a ordem pode ser alterada arrastando.
  3. Ao processar, o pdf-lib copia as páginas na ordem definida para um novo documento em memória.
  4. O navegador oferece o download do PDF de 5 páginas por meio de um blob local.

06 / Evidências

Resultados e próximos passos

Resultados e evidências

  • Julho de 2026: 33 páginas geradas sem falhas na verificação estrutural automatizada.
  • Julho de 2026: fluxo de juntar 2 + 3 páginas resultou em 5 páginas, sem requisições com dados de arquivo e sem violações de CSP no console, segundo a auditoria registrada no projeto.
  • Julho de 2026: a documentação registra compressão de um PDF de imagens de 1,8 MB para 182 KB em teste de navegador. É um caso de teste, não uma média de uso.

Próximos passos

  • PDFs criptografados não são suportados.
  • A compressão rasteriza as páginas e o texto deixa de ser selecionável.
  • O limite prático de tamanho é a memória do dispositivo. Próximo passo: medir esse limite em aparelhos reais e avisar acima de um tamanho definido.
  • A CSP mantém 'unsafe-inline' em scripts por causa do AdSense.
  • Extrair, girar e numerar páginas foram validados nos motores. Próximo passo: testes ponta a ponta dedicados para essas três ferramentas.
  • Próximo passo: proteção de PDFs com qpdf em WebAssembly, OCR local e funcionamento offline como PWA.

07 / Telas

Galeria

Próximo estudo de caso

Site Fácil
Todos os projetos