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-Policy estrita 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.

Sem conta, sem telemetria e sem cookies

Não há nada em que se cadastrar, então não existe endereço de e-mail arquivado. Não há script de analytics, nem pixel de rastreamento, nem serviço de relatório de erros, nem framework de teste A/B. O aplicativo não define cookies. O que ele guarda no seu dispositivo se limita às suas preferências de interface, como o tema e o tamanho da página, a uma cópia dos arquivos do próprio aplicativo, para que ele abra offline, e, por um instante, às fotos compartilhadas de outro aplicativo, que são apagadas assim que o scanner abre. Suas páginas existem só na memória; recarregue a página e não sobra vestígio algum da sessão.

Isso é menos uma política do que uma arquitetura. Uma página estática sem backend não tem onde guardar os dados de que precisaria para fazer mau uso deles.

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.