receipt-ripper.com
Os seus recibos nunca saem do seu dispositivo
Tudo o que nos perguntam, com respostas mais longas do que a página inicial consegue conter.
Sim. Sem registo, sem nível pago, sem limite de uso, sem bloqueio "premium". O site é sustentado por um único banner do Google AdSense por cima da área de soltar mais donativos opcionais num clique via Stripe Payment Link antes das exportações. Isso paga a conta do alojamento. O conjunto completo de funcionalidades está disponível em cada visita, incluindo recibos ilimitados por sessão e cada formato de exportação.
Não, e nem podias mesmo que quisesses — não há sistema de contas. O site não tem o conceito de utilizador. O estado vive no separador do teu navegador e (opcionalmente) no IndexedDB do teu navegador se ativares "Manter o lote neste dispositivo". Nada é armazenado nos nossos servidores porque nada sai do teu navegador para começar.
Executa uma pipeline de seis fases em cada recibo que largas:
Para lado nenhum fora do teu navegador. Cada fase da pipeline corre num Web Worker no teu próprio dispositivo. O resultado analisado fica em memória e é escrito no teu sistema de ficheiros através de blob URLs quando exportas. Nenhum pedido — nenhum — leva bytes de recibo para fora da tua máquina. Abre DevTools → Rede durante uma digitalização para confirmar: não verás um upload porque não há nenhum.
Não. O GA e o AdSense só veem o que veem sempre em qualquer site: o teu IP (anonimizado pelo GA), navegador, SO, URL de origem e contadores de eventos sem dados pessoais como "file_uploaded" com o número de ficheiros (nunca nomes de ficheiros, nunca conteúdo de recibos). Ao espaço publicitário do AdSense só são comunicados os nossos IDs de editor e unidade. A Política de Privacidade lista cada byte enviado.
Sim, e a aplicação continua a funcionar. O banner de cookies tem uma opção "Rejeitar" que impede o GA e o AdSense de carregarem. Um bloqueador de anúncios padrão, o uBlock Origin ou a Proteção Reforçada Contra Rastreamento do Firefox no modo Estrito também os bloqueiam. O processamento dos recibos funciona da mesma forma com ou sem esses scripts.
JPG, PNG, WebP, HEIC, HEIF (fotos iPhone) e PDF. Também podes largar um arquivo ZIP que contenha qualquer destes — é descompactado do lado do cliente (via jszip carregado preguiçosamente) e cada ficheiro interno é processado individualmente. O ZIP original nunca é armazenado nem carregado.
Atualmente o parser só usa a primeira página de um PDF. A maioria dos recibos enviados por email é de uma página; para faturas com várias páginas, divide-as com qualquer ferramenta PDF e larga as páginas relevantes separadamente. Podemos adicionar suporte multi-página numa versão futura — vota por email.
Não há limite rígido — o que restringe é a RAM do teu dispositivo. Testámos fotos iPhone de 20 MB e lotes de 50 páginas sem problemas num portátil de gama média. O Safari móvel começa a sofrer acima de cerca de 30 MB por imagem porque o iOS mata separadores que se aproximem de 1 GB de memória. Reduz fotos muito grandes antes de largar se encontrares problemas.
Sim. Copia uma imagem de qualquer sítio (uma app de chat, um email, uma ferramenta de captura) e cola-a na página com Ctrl/Cmd+V. A área de soltar apanha-a tal como num arrastar-e-largar.
Inglês, espanhol, francês, alemão, neerlandês, italiano e português — são os pacotes de idioma do Tesseract que enviamos. Escolhes o idioma com o menu pendente no topo da página; o seletor controla também o idioma da interface. A primeira vez que mudas para um novo idioma, o pacote é descarregado (≈3 MB cada) e depois fica em cache indefinidamente.
Por agora não. O Tesseract suporta esses alfabetos mas as regras de análise de recibos ainda não cobrem os seus layouts e formatos numéricos. Adicionar um idioma implica uma quantidade razoável de construção de fixtures. Se usasses um destes regularmente, escreve.
EUR, USD, GBP, CHF, JPY são testadas explicitamente. O parser reconhece tanto o símbolo (€, $, £, ¥, Fr.) como a forma por extenso (euro, dólar, franco) e recorre à tua locale se um recibo for ambíguo. Recibos que misturam moedas (raro mas acontece com viagens internacionais) são analisados com a moeda dominante e podes corrigir na tabela de revisão.
O Receipt Ripper deteta o formato por número contando os separadores e as suas posições, não a partir da locale do navegador. Por isso um recibo alemão com "12.345,67 €" e um recibo americano com "12,345.67" são analisados corretamente mesmo na mesma sessão do navegador. Internamente todos os montantes são armazenados como cêntimos inteiros para evitar deriva de vírgula flutuante; o arredondamento só acontece na exportação.
Para um recibo plano, bem iluminado e fotografado de frente com um smartphone moderno, o parser acerta no comerciante, data, total e nas linhas quase sempre. IVA e subtotal acertam na maioria das vezes. À medida que a qualidade da foto desce, os campos numéricos sofrem primeiro — o OCR confunde 8 com 3 e B, 0 com O e D, 5 com 6 e S. É por isso que a tabela de revisão marca a amarelo os campos de baixa confiança: podes corrigir a meia dúzia de valores duvidosos sem ter de reescrever o recibo todo.
A fase de correção de digitalização deteta as bordas do papel usando um detetor de bordas de Canny mais uma transformada de Hough, escolhe as quatro linhas mais exteriores, calcula uma transformação de perspetiva e endireita o recibo através de uma homografia WebGL. Inclinações ligeiras (até cerca de 40°) e a maioria das marcas de dobra são tratadas automaticamente. Para os recibos que o detetor não encontra, cada sessão tem um botão "Recortar manualmente" que abre um seletor interativo de quatro cantos.
Pousa-o plano numa superfície de contraste (uma mesa escura combina bem com papel térmico branco). Luz por cima, sem sombra a atravessar o papel. Telemóvel paralelo ao recibo, não em ângulo. Preenche o enquadramento mas deixa uma pequena margem para o detetor de bordas ter algo com que trabalhar. O flash às vezes ajuda com a impressão térmica desbotada e às vezes queima — testa ambos.
Ou o OCR não o leu (muitas vezes porque essa parte do recibo está demasiado desbotada ou pequena depois do redimensionamento) ou o parser viu texto mas não o reconheceu como o campo. Ambos são editáveis na tabela de revisão — clica na célula e escreve.
Sim. Todo o site é responsivo e funciona em Safari móvel, Chrome móvel e Firefox para Android. A área de soltar mostra um botão "Tirar foto" que abre diretamente a câmara traseira para poderes digitalizar e analisar no momento. O tamanho do pool de workers em móvel é limitado a 2 workers para evitar mortes de separador por falta de memória.
O motor OCR e o pacote de idioma inglês somam cerca de 12 MB no total. Isso é descarregado uma vez e depois fica em cache. O download é a parte mais lenta da primeira visita a frio — as digitalizações seguintes demoram alguns segundos cada uma.
Sim, descodificadas do lado do cliente via libheif-js. O primeiro HEIC de uma sessão desencadeia um pequeno carregamento preguiçoso do descodificador HEIC. Depois disso são tão rápidas como os JPGs.
Uma linha por item ao longo de todos os recibos processados. Colunas: id do recibo, comerciante, data, nome do item, quantidade, preço unitário, total do item, depois totais por recibo (subtotal, IVA, total) repetidos em cada linha desse recibo para pivotar facilmente. Unicode é UTF-8 com BOM para que o Excel o abra corretamente no Windows.
Dois tipos de folha. Uma folha "Resumo" agrupa cada recibo por categoria e moeda e dá os totais gerais — o que o teu contabilista normalmente quer. Uma folha de discriminação por recibo para cada recibo lista cada item com indicadores de confiança e o texto OCR original numa coluna oculta para auditoria. O livro é gerado inteiramente do lado do cliente com SheetJS.
Cada imagem original ou corrigida na perspetiva do recibo, renomeada para AAAA-MM-DD_comerciante.jpg para os ficheiros se ordenarem cronologicamente. Mais o mesmo livro Excel descrito acima. Todo o pacote usa compressão STORE porque os JPGs e o XLSX já zipado não comprimem mais.
As ferramentas gratuitas suportadas por publicidade custam dinheiro real a alojar. O modal pré-exportação oferece um donativo num clique via Stripe antes do ficheiro ser descarregado. Saltar está mesmo ali se tiveres pressa — o download dispara no momento em que termina a contagem decrescente, independentemente de teres ou não doado. Os donativos não desbloqueiam qualquer funcionalidade.
Sim — o interruptor "excluir IVA das exportações" perto do seletor de idioma. Algumas jurisdições desencorajam a entrega de dados com detalhe fiscal a terceiros; ativa o interruptor e as colunas de IVA desaparecem das exportações CSV / XLSX / ZIP.
Muitos usam. A folha Resumo da exportação XLSX foi desenhada exatamente para isso — totais agrupados por categoria e moeda, prontos para a secção de despesas dedutíveis de uma declaração de IRS portuguesa (Modelo 3), uma Schedule C americana, uma Anlage EÜR alemã ou equivalente. Não damos nem podemos dar aconselhamento fiscal; revê cada valor analisado antes de confiar nele.
Clica no crachá de categoria em cada cartão de sessão e escolhe da lista. A primeira vez que defines uma categoria para um comerciante, a escolha é lembrada localmente — futuros recibos do mesmo comerciante preenchem previamente a categoria, sendo a pontuação de deteção automática original substituída pela tua escolha explícita.
O CSV abre literalmente em tudo. O XLSX abre no Excel, LibreOffice, Numbers, Google Sheets e na maioria das plataformas de contabilidade (QuickBooks, Xero, Wave, FreshBooks aceitam importação XLSX). A estrutura é intencionalmente aborrecida — uma linha por item, colunas com o nome óbvio.
Três causas comuns. (1) O WASM do Tesseract não carregou — verifica a consola do navegador por um 404 ou um erro de tipo MIME em tesseract-core-*.wasm. (2) O teu navegador bloqueou os Web Workers — algumas extensões de privacidade fazem-no; permite workers para o site. (3) A foto é enorme e o teu dispositivo ficou sem RAM — reduz a foto e tenta de novo.
Ou o cabeçalho do recibo está num alfabeto que o pacote de idioma carregado não cobre, ou o topo do recibo está demasiado desbotado / cortado para se ler. Edita o campo diretamente na tabela de revisão; o resto do recibo normalmente analisa bem.
O validador verifica se soma(totais das linhas) + IVA + gorjeta ≈ total dentro de uma pequena tolerância. Quando falha, um dos totais de linha foi mal lido, o IVA foi mal lido ou o próprio recibo tem uma linha de desconto que o parser não reconheceu. A pista diz qual valor discorda de qual — corrige na tabela e o aviso desaparece.
Isso pode acontecer se o teu navegador limpou a cache entre visitas (modo privado, limpeza automática do Firefox, ferramentas de limpeza de dados do navegador). A navegação normal mantém o pacote em cache indefinidamente — o armazenamento IndexedDB normalmente não é purgado.
React 18 + Vite + Tailwind 4 para a UI. Tesseract.js para o OCR. pdf.js da Mozilla para a renderização de PDF. libheif-js para a descodificação HEIC. SheetJS para a escrita Excel. jszip para a empacotamento ZIP. Tudo é empacotado como ativos estáticos e servido por nginx dentro de um contentor Docker. O contentor não tem backend de aplicação — apenas nginx a servir HTML, JS, WASM e pacotes de idioma.
As dependências da pipeline (Tesseract.js, pdf.js, libheif-js, SheetJS, jszip) são todas de código aberto — vê /LICENSES.txt para a atribuição completa e o texto das licenças. O código aplicacional do Receipt Ripper propriamente dito é proprietário, embora muito do que é interessante esteja no parser baseado em regras, que é simples de reimplementar.
Escreve para contact@receipt-ripper.com com a foto ou o PDF que foi mal analisado e uma nota sobre qual deveria ter sido o resultado. Cada recibo problemático que partilhas torna-se uma fixture de teste interna (com dados pessoais ocultados) para que o mesmo erro não possa reaparecer depois da próxima versão.