Digitalizar documentos sem enviá-los
Passaportes, contratos, holerites, laudos médicos. Os documentos que mais valem a pena digitalizar são justamente os que menos valem a pena entregar ao servidor de um desconhecido. O ScanPDF foi feito para que essa entrega não faça parte do acordo.
O que faz um conversor online típico
O site comum de “foto para PDF” é um formulário web na frente de um servidor. Seu arquivo é enviado, convertido em algum lugar que você não enxerga e devolvido como download. Em algum ponto dos termos há uma promessa de apagá-lo depois de uma hora ou de um dia.
Essa promessa pode até ser cumprida. Mas é uma promessa, não um mecanismo, e não cobre as partes sobre as quais ninguém te contou: por quantas máquinas o arquivo passou, o que ficou registrado, qual subcontratado guardou o backup, ou o que um futuro vazamento expõe. Para um documento de identidade ou um contrato assinado, a avaliação honesta de risco é que, uma vez concluído o upload, o desfecho já não está mais nas suas mãos.
O que o ScanPDF faz em vez disso
Não existe etapa de upload, porque não existe para onde enviar. O ScanPDF é uma página estática. O seu navegador lê a foto do disco, e tudo o que vem depois acontece dentro da aba:
- A detecção de bordas roda sobre uma compilação do OpenCV em WebAssembly, executando na sua CPU.
- A correção de perspectiva e os filtros são aplicados em memória sobre a imagem em resolução completa.
- O PDF é montado localmente com a pdf-lib e entregue ao navegador como um download comum.
Nenhuma requisição carrega os dados das suas imagens, porque essa requisição não existe no código. Tudo funciona com o cabo de rede desligado, depois que o aplicativo carregou. As fotos que você envia de outro aplicativo por Compartilhar e depois ScanPDF também são entregues dentro do dispositivo: o service worker do aplicativo responde ele mesmo a essa requisição, e nada é transmitido. Vale conhecer um caso extremo: se você limpar os dados do site enquanto o aplicativo continua instalado no Android, não sobra nada no dispositivo para receber o próximo compartilhamento, e o navegador envia essas fotos ao servidor web, que não as aceita. Abra o aplicativo uma vez depois de limpar os dados e o compartilhamento volta a ficar no dispositivo.
Verificável, não apenas declarado
Uma afirmação de privacidade que você não pode conferir vale muito pouco, então esta foi organizada para poder ser conferida de três maneiras.
- Veja você mesmo. Abra as ferramentas de desenvolvedor do navegador, vá até a aba de rede e digitalize um documento. Depois que os arquivos do próprio aplicativo carregam, nada mais é enviado.
- Leia o código. O aplicativo inteiro tem licença MIT e mora no GitHub - algumas centenas de linhas de módulos JavaScript comuns, sem etapa de build para obscurecê-los, e duas dependências fixadas por URL e SHA-256.
- Deixe o navegador impor. O contêiner auto-hospedado traz uma
Content-Security-Policyestrita que limita as conexões à própria origem. Sob ela, uma requisição acidental a qualquer host externo é bloqueada pelo navegador, em vez de apenas não existir no código.
A demonstração hospedada e a auto-hospedagem
Vale ser preciso quanto a essa diferença, porque a maioria dos sites não é.
A demonstração em scanpdf.io é o mesmo código, servido pelo GitHub Pages. Ali o processamento também é totalmente do lado do cliente, e seus documentos continuam sem sair da máquina. O que muda é quem controla os cabeçalhos de resposta: no GitHub Pages é o GitHub, então a CSP estrita da configuração nginx do projeto não é aplicada. O GitHub também enxerga a requisição web comum da página em si, como qualquer hospedagem enxergaria.
Se você quer a garantia imposta pelo navegador, em vez de apoiada no fato de o código ser aquilo que diz ser, rode você mesmo. Um comando sobe o contêiner, e em tempo de execução ele não precisa de acesso à rede nenhum.
Experimente
Abra o scanner e solte ali um documento que você não teria enviado para lugar nenhum. É exatamente esse o ponto. Se é a primeira vez que você fotografa papel, o guia de digitalização mostra como sair limpo já na primeira tentativa.