Quando os números da página não fecham

Quatro famílias de sinais leem os valores que um documento imprime: dígitos verificadores que não fecham, uma coluna de saldo que deixa de decorrer, e um valor fora da linha em que foi impresso.

Estas quatro famílias leem a aritmética e a geometria do próprio documento, não sua estrutura — e é isso que faz de duas delas os únicos achados que sobrevivem a uma regravação completa por outra ferramenta. Um falsificador que lava um arquivo pelo Ghostscript apaga a cadeia de revisões e a string de produtor; os números ainda precisam fechar, e os glifos ainda precisam cair onde um gerador os teria posto.

Parte do guia de sinais — quatro das dezoito famílias que o motor reporta.

Sinais, não veredictos. Todo achado aqui é um fato estrutural sobre um arquivo. "Este documento foi modificado depois de gerado" é verdadeiro ou falso sobre os bytes; "este documento é fraudulento" é um julgamento sobre uma pessoa, e o Tamperlens não o faz. A API não retorna nenhum campo de veredicto booleano, por construção.

br-identifier-checksum

alta média baixa
O que detecta
Um identificador brasileiro impresso na página cujo próprio dígito verificador publicado diz que ele está errado — um CPF, um CNPJ, uma chave de acesso de NF-e, ou a linha digitável de 47 dígitos de um boleto.
O boleto é o que justifica a família. A linha impressa de um boleto não é texto livre: é um rearranjo fixo do código de barras de 44 dígitos, e o seu quarto campo carrega o dígito verificador mód-11 exatamente do valor e do vencimento que o resto da linha codifica. Reconstruindo o código de barras a partir da linha impressa e rodando a conta, um valor que alguém redigitou contradiz uma aritmética que o banco emissor já fez — sem nada com que comparar. Nenhum código de barras é decodificado e nenhum pixel é lido.
Isso importa além dos boletos: é um dos poucos achados aqui que sobrevive a um documento ser regerado por inteiro. Uma reescrita por qpdf ou Ghostscript lava todo sinal de nível de byte; ela não muda quanto os dígitos da página somam.
Evidência retornada
Por achado: o kind, a página, o shape pelo qual foi reconhecido, qual componente failed, a quantidade de dígitos e apenas os quatro últimos. Para um boleto, o amountCentavos e a dueDate que a linha codifica. O número em si nunca é republicado — um CPF é dado pessoal, e um relatório acaba armazenado, registrado em log e encaminhado.
Causas legítimas
Erros de digitação e transcrição. Um CPF que falha é mais vezes um CPF digitado errado do que um inventado, e é por isso que ele é reportado como baixa e nunca mais que isso.
Números de teste deliberadamente inválidos. Formulários em branco e modelos trazem 111.111.111-11 e companhia de propósito; números de dígitos repetidos são excluídos de saída.
OCR. A camada de texto de uma página digitalizada carrega erros de transcrição que não dizem nada sobre fraude, então páginas que são uma imagem inteira não são lidas.
O que não consegue ver
Isto não é verificação de identidade nem consulta. Nenhuma base é acessada e nada sai do processo. Saber que onze dígitos satisfazem uma identidade publicada não diz nada sobre a quem eles pertencem, nem se são da pessoa nomeada ao lado.
Um dígito verificador que passa nunca é reportado, porque não vale nada. Qualquer um gera um CPF válido em um laço, e todo preenchedor de modelo já gera. Silêncio aqui não é atestado de saúde.
O código de barras em si não é lido. Comparar a linha impressa com as barras — o terceiro portador — exige um decodificador vetorial que está especificado e não construído.
Lógica de severidade
alta quando a linha impressa de um boleto, na forma pontuada canônica, falha no dígito verificador geral mód-11 — a falha que um valor ou vencimento editado produz, e que um boleto emitido corretamente não pode ter. média quando o dígito mód-10 de um único campo falha (um bloco digitado errado, que transcrição também produz), quando a mesma falha geral aparece numa sequência de dígitos sem pontuação, ou para uma chave de NF-e. baixa para CPF ou CNPJ.
Uma sequência de 47 dígitos sem pontuação só é lida como boleto numa página que traga ao menos três nomes de campo da Febraban. Cerca de uma sequência arbitrária em dez passa pela checagem de layout e então falha num dígito verificador, e sem essa exigência a família diria isso como "alguém editou um boleto".

running-balance-break

média
O que detecta
Uma coluna de saldo que deixa de decorrer das linhas ao lado dela. Um saldo corrente é uma corrente: o saldo de cada linha é o saldo da linha anterior somado ao que aquela linha registra. Uma coluna que satisfaz isso cinco vezes seguidas é um saldo corrente, e um passo que ela não consegue justificar é um passo que os números impressos ao lado não explicam.
Esta é a única família capaz de ver um documento gerado do zero. Todas as outras aqui perguntam se um arquivo foi alterado — uma revisão foi anexada, duas datas discordam, um texto está pintado sob uma caixa — e todas pressupõem que existiu um original. Um extrato produzido inteiro por um preenchedor de modelo, em uma revisão, com metadados coerentes e um só produtor, passa por todas elas. O que ele não faz de forma confiável é permanecer coerente consigo mesmo, porque as linhas são inventadas uma a uma e a corrente restringe todas ao mesmo tempo.
Evidência retornada
Por corrente: a página, quantas linhas e quantos elos ela tinha, quantos elos fecharam, quantos romperam, qual elo rompeu primeiro e de quanto o saldo se moveu ali. Mais o formato numérico que o documento resolveu e como isso foi decidido.
Nenhum texto da página é retornado, e nenhum saldo. O movimento é uma diferença entre dois saldos — que é o achado — enquanto a posição financeira em si não é algo que este motor copia para um corpo de relatório que outra pessoa vai armazenar e encaminhar.
Causas legítimas
Saldo transportado. Uma corrente que continua de outra página ou de outro extrato legitimamente começa de um número que esta página nunca mostra.
Uma linha que não conseguimos ler. Uma tarifa desenhada como imagem, um valor com algo pintado por cima, um número num formulário que não percorremos — todos estão simplesmente ausentes, e um valor ausente é idêntico a um valor faltando.
Arredondamento e múltiplas moedas. A tolerância é de dois centavos mais um ponto-base, o que absorve arredondamento mas não uma conversão.
O que não consegue ver
Um extrato digitalizado. Não há camada de texto para ler e não há OCR aqui, então a família não diz nada — o que não é o mesmo que dizer que o documento está limpo.
Um documento cujo formato numérico é ambíguo. 1.234,56 é mil e duzentos no Brasil e um vírgula dois nos Estados Unidos. O formato é decidido uma vez por documento, a partir do uso de separadores do próprio documento, e um documento que usa as duas convenções é recusado em vez de adivinhado.
Um falsificador que refez a coluna. Recalcular todos os saldos depois de uma edição derrota isto por completo. A família levanta o piso; não fecha a porta.
Lógica de severidade
média, e deliberadamente não mais que isso. Um achado aritmético parece prova de um jeito que um achado estrutural não parece, então ele fica limitado até que a medição diga outra coisa. Medida contra 3.842 documentos publicados, a família dispara zero vezes — e a mesma medição não encontrou nenhum extrato bancário real naquele corpus, então a taxa de acerto é demonstrada em fixtures e não numa população.
A pré-condição é a família: uma coluna precisa fechar ao menos cinco elos e romper no máximo dois. Uma tabela que não é um saldo corrente rompe em quase todos os elos e é descartada em silêncio — existem 18 correntes candidatas naquele corpus e nenhuma delas é um extrato.

glyph-anomalies

baixa
O que detecta
Um valor que não fica sobre a linha de base do texto impresso ao seu lado, numa linha que carrega um valor monetário. Um gerador posiciona todos os glifos de uma linha impressa a partir de uma única matriz de texto, então a linha fica reta. Um editor que substitui um valor não consegue refluir a página — ele remenda o fluxo de conteúdo, recalcula a translação, e a substituição cai uma fração de ponto fora.
Isto é geometria, não estrutura. É a única razão de existir: contagem de revisões, par /ID e string de produtor são todos apagados quando o documento é regravado por outra ferramenta, e onde os glifos caem não é. É um dos poucos achados que sobrevive a uma redestilação completa.
Evidência retornada
Por achado: a página, o deslocamento da linha de base em ems, quantos trechos há na linha, e três booleanos registrando se a mesma linha também mostrou troca de subconjunto de fonte, kerning explícito dentro de um número, ou pequena divergência de tamanho. Nenhum texto da página é retornado — os trechos que esta família observa são justamente os valores impressos.
Causas legítimas
Ferramentas de design e diagramação que posicionam texto elemento por elemento. Medido em 1.368 documentos publicados, isto dispara em 24 deles, e os produtores são Canva, Quartz, Distiller, Word, pdfTeX e iText — toda a cadeia de ferramentas corrente. Não há produtor a excluir.
Sobrescritos, chamadas de nota e notação em linha são excluídos por construção: um trecho elevado precisa ter ao menos 85% do tamanho do texto ao lado, o que um sobrescrito não tem.
O que não consegue ver
Documentos digitalizados. A camada de texto de um scan é desenhada em modo de renderização invisível, então não é texto que um leitor vê e esta família nunca a lê. Cerca de um terço dos dois corpora de referência não desenha texto visível algum, e o silêncio nesses casos não é atestado de limpeza.
Qualquer coisa sobre largura de glifos. Nenhum programa de fonte é lido e nenhum vetor /Widths é carregado — exclusão deliberada, já que um programa de fonte é binário controlado por quem envia o arquivo.
Um valor redigitado sozinho na própria linha. A verificação compara um trecho com seus vizinhos, então um número sem nada ao lado não tem linha de base da qual sair.
Lógica de severidade
baixa, sempre, e o teto é medido e não cauteloso. Em 1.006 falsificações pareadas contra suas próprias origens, este achado aparece em 43 e em 1 das 160 origens; as operações que redigitam texto o disparam em 6,6% dos casos onde a origem não disparava, e as 228 falsificações que não redigitam nada o disparam 0,0% das vezes. Também aparece em 1,4% dos documentos publicados dos EUA e 2,2% dos brasileiros, e sinaliza como novos 3 das 82 falsificações que o resto do motor não pega. Severidade baixa não carrega piso de pontuação, então este achado sozinho não consegue tirar um documento limpo da faixa baixa — que é o peso honesto para um resíduo que a diagramação legítima também produz. Veja docs/GLYPH-PHASE0-2026-08-05.md.

structure-warnings

baixa média
O que detecta
Tudo o que o parser não conseguiu reconciliar entre a contabilidade interna do arquivo e seus bytes reais: entradas de referência cruzada apontando para deslocamentos que não contêm o objeto que afirmam conter, seções de referências cruzadas ilegíveis ou reconstruídas, subseções e entradas malformadas, laços na cadeia de referências cruzadas, comprimentos de stream que discordam do stream, referências pendentes e bytes sobrando depois do %%EOF final.
Um PDF corretamente escrito é internamente autoconsistente. Irregularidades significam ou um produtor fora de conformidade, ou manipulação posterior dos bytes — e elas também delimitam quanto do documento o resto do relatório pôde examinar, e é por isso que são reportadas mesmo quando parecem sem graça.
Esta família também carrega a divulgação de documento criptografado, descrita por completo na próxima seção.
Evidência retornada
warningCount, a lista codes deduplicada e ordenada, até 25 avisos individuais com mensagens, xrefConflicts, trailingGarbageBytes, revisionChainBroken e parseTruncated.
Causas legítimas
Produtores fora de conformidade estão em toda parte. Muitos geradores de longa vida e inteiramente honestos emitem deslocamentos de referência cruzada levemente errados, porque todo leitor de PDF do mundo real os conserta em silêncio e ninguém nunca percebeu. Arquivos que passaram por gateways de e-mail, antivírus ou caminhos de transferência ingênuos podem adquirir bytes sobrando no final. Um download truncado produz uma versão espetacular deste sinal e não significa nada sobre a autenticidade do documento.
Lógica de severidade
Silenciosa quando não há avisos e o documento não está criptografado. média quando há ao menos um conflito de referência cruzada, ou ao menos um aviso cujo código está no conjunto sério — xref-conflict, bad-offset, unparseable-xref, bad-xref-stream, bad-xref-subsection, bad-xref-entry, xref-chain-loop, xref-reconstructed, stream-length-mismatch — ou seja, a contabilidade do arquivo contradiz seus bytes em vez de estar meramente incompleta. baixa nos demais casos.

Veja o relatório no seu próprio arquivo

O verificador gratuito roda todas as famílias desta página e mostra a evidência completa — sem conta, sem nada armazenado. Para rodar no seu próprio fluxo, veja o guia rápido da API ou crie uma conta para uma chave com 50 documentos grátis por mês.

O Tamperlens reporta sinais de risco, não veredictos de autenticidade. Sinais podem ter causas legítimas; combine-os com sua própria lógica de decisão.

O resto do guia