O que um PDF registra sobre de onde veio

Cinco famílias de sinais leem o que um PDF diz sobre a própria história: quantas vezes foi salvo, qual ferramenta o escreveu e se seus dois registros de si mesmo concordam.

Um PDF carrega a própria papelada: uma cadeia de revisões, dois conjuntos de metadados, uma string de produtor e um par de identificadores. Estas cinco famílias leem essa papelada e a conferem contra ela mesma. Nenhuma delas olha para a página; elas perguntam o que o arquivo diz sobre como veio a existir, e se essas afirmações são coerentes.

Parte do guia de sinais: cinco das dezenove 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.

A escalada depende do que a revisão sobrescreveu, nunca de quantas revisões o arquivo tem.
uma revisão posterior sobrescreve o objeto 12 0 page · content · image alta a aparência renderizada mudou depois da geração annotation · metadata média o arquivo foi salvo de novo; a página, não Com uma revisão só, a família fica silenciosa. Assinar, preencher formulário e anotar produzem revisões. É a família que mais dispara em arquivo honesto.

O parser percorre a cadeia /Prev de trás para frente e separa, por revisão, os números de objeto introduzidos dos sobrescritos. É essa segunda lista que decide a severidade, e ela vem no relatório em changedPerRevision.

incremental-updates

média alta
O que detecta
Que o arquivo contém mais de uma revisão. Bytes foram anexados depois que o documento foi escrito pela primeira vez e terminado com %%EOF. O mecanismo de atualização incremental do PDF anexa novos objetos, uma nova seção de referências cruzadas e um novo trailer em vez de reescrever o arquivo, de modo que estados anteriores do documento continuam fisicamente presentes. O parser percorre a cadeia /Prev de trás para frente e determina quais números de objeto cada revisão introduziu e quais ela sobrescreveu.
A escalada depende do que mudou, não de quantas vezes. Se uma revisão posterior substitui um número de objeto que já existia em uma revisão anterior, e esse objeto carrega dados de página, de stream de conteúdo ou de imagem, então a aparência renderizada do documento mudou após a geração. Objetos de anotação e de metadados não escalam a severidade.
Evidência retornada
revisions, updatesAfterCreation, eofOffsets, startxrefValues, revisionChainBroken, um detalhamento por revisão (changedPerRevision: quais objetos cada revisão escreveu e quais deles ela sobrescreveu, com o tipo de cada um) e contentObjectsOverwritten.
Causas legítimas
Extremamente comuns. Esta é a família com mais chance de disparar em um arquivo honesto. Aplicar uma assinatura digital é uma atualização incremental. É assim que a assinatura preserva os bytes assinados. O mesmo vale para preencher um campo de AcroForm, adicionar uma anotação, um comentário ou uma nota adesiva, aplicar uma tarja em algumas ferramentas, e certos passes de linearização e otimização. Sistemas de gestão de documentos rotineiramente adicionam uma revisão na ingestão. Um extrato que o cliente abriu, assinou e salvou de novo não é uma falsificação.
A armadilha inversa: uma única revisão não significa que o arquivo nunca foi editado. Uma ferramenta que reescreve o documento inteiro achata o histórico, e então esta família fica em silêncio enquanto metadata-mismatch, producer-fingerprint ou font-anomalies carregam o achado em seu lugar.
Lógica de severidade
Silenciosa com uma revisão. média para qualquer revisão adicional. alta quando ao menos um objeto sobrescrito é do tipo page, content ou image.

metadata-mismatch

média alta
O que detecta
Desacordo entre os dois repositórios de metadados independentes que um PDF pode carregar: o dicionário Info do trailer e um pacote XMP incorporado. Quatro campos são comparados: producer, creator/creator-tool, data de criação e data de modificação. Uma única ferramenta escrevendo o arquivo uma única vez preenche os dois de forma consistente; editores de consumo com muita frequência atualizam um e deixam o outro desatualizado.
A comparação é deliberadamente tolerante, para que uma simples deriva de versão não vire um achado. As strings de ferramenta são normalizadas para caracteres alfanuméricos minúsculos e contam como concordantes quando uma é substring da outra, de modo que iText 7.2.5 e iText concordam. Timestamps concordam dentro de um minuto, porque os dois repositórios arredondam de formas diferentes. Um campo é pulado por completo quando está ausente de qualquer um dos repositórios, e a família nem sequer roda a menos que ambos os repositórios estejam presentes.
Evidência retornada
Um array mismatches (campo, valor do Info, valor do XMP), as strings brutas de producer/creator dos dois repositórios, os dois pares de datas, infoEditorTool / xmpEditorTool (qual editor de consumo conhecido cada repositório nomeia, se algum) e editorRevealedByMismatch.
Causas legítimas
Pipelines de publicação em múltiplos estágios produzem esse padrão de forma legítima e constante: um aplicativo de design escreve o XMP, um distiller escreve o dicionário Info, um pós-processador atualiza um dos dois. Alguns geradores server-side escrevem o XMP uma vez e nunca o renovam. O Quartz do macOS e vários drivers de impressão em PDF são conhecidos por deixar os repositórios divergentes. Uma divergência pura e simples é uma pergunta, não uma acusação.
Lógica de severidade
média para qualquer divergência. Escala para alta apenas em um caso específico: a divergência está em um campo producer ou creator e os dois repositórios nomeiam editores de consumo conhecidos diferentes: incluindo o caso em que um nomeia um editor e o outro não nomeia nenhum. Nessa situação, a divergência é a única razão pela qual a ferramenta de edição fica visível, o que é materialmente diferente de duas bibliotecas de servidor discordando entre si.
Quatro campos são comparados entre os dois repositórios, e só um tipo de divergência escala.
DICIONÁRIO /INFO CAMPO COMPARADO PACOTE XMP iLovePDF producer Microsoft® Word Microsoft® Word creator Microsoft® Word 2026-03-11 09:14 criação 2026-03-11 09:14 2026-03-11 09:15 modificação 2026-03-11 09:15 média: qualquer divergência Pipeline de várias etapas produz isso o tempo todo. Uma pergunta, não uma acusação. alta, só neste caso A divergência é em producer ou creator E os dois nomeiam editores de consumo diferentes.

A comparação é tolerante de propósito: strings de ferramenta são normalizadas para alfanuméricos minúsculos e concordam por substring, timestamps concordam dentro de um minuto, e um campo ausente em qualquer um dos repositórios é pulado. Sem os dois repositórios presentes, a família nem roda.

date-anomalies

baixa média
O que detecta
Timestamps que um gerador funcionando corretamente não poderia ter produzido. Quatro achados distintos, avaliados sobre os quatro campos de data disponíveis (Info /CreationDate e /ModDate, XMP xmp:CreateDate e xmp:ModifyDate):
mod-before-creation: o timestamp de modificação precede o timestamp de criação dentro do mesmo repositório (os dois repositórios são comparados como pares separados; a divergência entre repositórios é tratada por metadata-mismatch). future-date: um timestamp mais de um dia no futuro. impossible-timezone: um deslocamento UTC declarado além de ±14:00, que não corresponde a nenhum fuso horário real. unparseable-date: uma string que não segue nem a sintaxe PDF D:YYYYMMDDHHmmSSOHH'mm' nem a ISO-8601.
Evidência retornada
Um array findings: cada um com um tipo, o campo ou par de campos envolvido, o valor problemático e uma nota de uma linha: mais as quatro strings de data brutas exatamente como aparecem no arquivo.
Causas legítimas
Datas malformadas são, em grande parte, uma questão de qualidade do gerador: muitos produtores de nicho e legados emitem datas que não podem ser interpretadas, e é por isso que um relatório contendo apenas datas ininterpretáveis é rebaixado em vez de tratado como manipulação. Datas futuras podem vir de um relógio de sistema genuinamente errado, e é por isso que o limiar é de um dia inteiro em vez de um segundo. Modificação anterior à criação é o mais difícil de explicar de forma legítima, mas de fato ocorre com ferramentas que copiam a data de criação de um documento de origem enquanto escrevem uma data de modificação nova.
Lógica de severidade
baixa quando todos os achados são unparseable-date. média nos demais casos. O título reflete o achado mais forte: um par com modificação anterior à criação é nomeado explicitamente, relatórios só de datas malformadas dizem isso, e todo o resto reporta inconsistência interna.
Três dos quatro achados de data são impossíveis para um gerador funcionando; o quarto é só qualidade de software, e por isso é rebaixado.
MÉDIA · UM GERADOR CORRETO NÃO PRODUZ mod-before-creation future-date impossible-timezone BAIXA · SE FOR O ÚNICO ACHADO unparseable-date Muitos produtores de nicho e legados emitem datas que não se interpretam. E OS PARES SÃO AVALIADOS SEPARADAMENTE /CreationDate ↔ /ModDate o par do dicionário /Info, entre si xmp:CreateDate ↔ xmp:ModifyDate o par do XMP, entre si Divergência de um repositório para o outro não é desta família. Ela é reportada por metadata-mismatch, logo acima.

O limiar de future-date é um dia inteiro, e não um segundo, porque relógio de sistema errado existe. Modificação anterior à criação é a mais difícil de explicar de forma legítima, mas ocorre em ferramentas que copiam a data de criação de um documento de origem.

producer-fingerprint

info baixa média
O que detecta
Uma ferramenta operada por uma pessoa aparecendo na cadeia de produção do documento. Quatro campos de origem são verificados (Info /Producer, Info /Creator, pdf:Producer e xmp:CreatorTool), contra uma lista curada de impressões digitais em cinco categorias: editores e conversores online (iLovePDF, Sejda, Smallpdf, PDFescape, PDF24, PDFfiller, DocHub, Soda PDF, PDF2Go, Convertio, Zamzar e outros), editores de PDF de desktop (PDF-XChange, Foxit, Nitro, PDFelement, Wondershare, Acrobat Pro interativo), pós-processadores de OCR (ABBYY, Readiris), editores de imagem e design (Photoshop, Illustrator, GIMP, Inkscape, Canva, Figma, Affinity) e pipelines de re-salvamento de escritório e impressão (LibreOffice, Word, Microsoft Print to PDF, Quartz PDFContext, CutePDF, doPDF, PrimoPDF).
Cada impressão digital carrega uma origem, e a origem decide tudo: uma ferramenta de autoria (Word, Canva, Google Docs, um driver de impressão, um passe de OCR) é onde a existência do documento começa, então nomeá-la não diz nada sobre se algo mudou depois. Um editor de PDF (iLovePDF, Sejda, PDF-XChange, o editor interativo do Acrobat Pro) recebe um PDF existente como entrada e escreve um novo. Uma afirmação sobre o histórico do arquivo, não sobre sua autoria. A correspondência ignora maiúsculas e minúsculas sobre a string normalizada para caracteres alfanuméricos, então pontuação e números de versão não a derrotam.
Um ramo separado trata do caso oposto: nenhuma ferramenta produtora declarada em nenhum dos repositórios.
Evidência retornada
matches (qual campo, o valor bruto, o rótulo da ferramenta correspondida, sua categoria e sua origem), as listas deduplicadas tools e editorTools, a origin resolvida, as quatro strings brutas, revisions e fullPageImagePages. A lista de páginas é apenas evidência e não move mais a severidade.
Causas legítimas
Enormes. Esta é a família que mais precisa de calibração local. Razões legítimas para uma ferramenta de consumo aparecer: o cliente baixou o extrato e o salvou de novo no Preview ou no Acrobat para combinar páginas; usou uma ferramenta online para mesclar dois extratos em um único upload, ou para comprimir um arquivo abaixo de um limite de upload; imprimiu em PDF a partir do internet banking porque não havia botão de download; o próprio emissor usa LibreOffice ou um driver de impressão no seu pipeline, instituições pequenas genuinamente usam. ABBYY e outras ferramentas de OCR aparecem de forma rotineira e legítima em fluxos de digitalização.
O caso do producer ausente é ainda mais fraco: remover metadados é um passo normal de higiene de privacidade, e alguns geradores minimalistas simplesmente nunca escrevem o campo. Ele remove um fato corroborante em vez de fornecer um.
Lógica de severidade
Nenhuma correspondência, com um producer declarado: silenciosa. baixa quando nenhuma ferramenta produtora é declarada em lugar algum. Para uma correspondência, dois fatos e nada mais: a origem da ferramenta e se o arquivo tem mais de uma revisão. Uma ferramenta de autoria é info em um arquivo de revisão única e baixa em um arquivo salvo de novo; um editor de PDF é baixa em um arquivo de revisão única e média em um arquivo salvo de novo. Esta família não alcança mais alta: a string do producer é um autorrelato da ferramenta que escreveu o arquivo. Um fraudador pode defini-la como quiser, e um documento honesto a define como Word. Imagem de página inteira também não a escala mais; um raster de página inteira marca um documento que é uma imagem (um design do Canva, uma digitalização), não um documento que foi editado.
Dois fatos decidem a severidade inteira: de onde a ferramenta veio, e se o arquivo foi salvo mais de uma vez.
UMA REVISÃO SALVO DE NOVO ferramenta de autoria Word · Canva · driver de impressão info pontua zero baixa editor de PDF iLovePDF · Sejda · PDF-XChange baixa média o teto desta família Esta família não alcança alta, e a razão é dura: a string é o autorrelato da ferramenta. Um fraudador a define como quiser; um documento honesto a define como Word.

Nenhuma ferramenta produtora declarada em lugar nenhum entra como baixa: remove um fato corroborante em vez de fornecer um. A calibração vem de uma medição própria: tratar qualquer ferramenta de consumo como sinal apontou 206 documentos do Microsoft Word numa amostra aleatória da web brasileira. O relato está em Medindo minha própria taxa de falso positivo, e a versão por ferramenta do número está na referência de strings de producer.

id-inconsistency

info média
O que detecta
Divergência no array /ID do trailer. A especificação PDF atribui aos dois elementos funções diferentes: o primeiro é um identificador permanente definido quando o documento é criado e nunca deve mudar; o segundo é reescrito pelo aplicativo produtor a cada salvamento. Em um gravador conforme à especificação, a divergência entre eles é o registro legível por máquina do próprio formato de que o arquivo foi salvo de novo após a criação, mas muitos gravadores reais simplesmente geram os dois elementos do zero na primeira gravação, então a divergência sozinha não é esse registro. A Tamperlens lê o /ID do trailer mais recente que carrega um, e reporta o /ID de cada trailer como evidência.
Evidência retornada
idOriginal e idCurrent em hexadecimal, trailerCount, revisions e allTrailerIds, para que você veja o identificador evoluir através das revisões.
Causas legítimas
Qualquer coisa que legitimamente salve o documento de novo atualiza o segundo elemento: assinar, preencher formulários, anotar. O sinal diz "salvo de novo", nada mais. Duas fraquezas adicionais que vale conhecer: alguns geradores minimalistas omitem o /ID por completo, e uma ferramenta que reescreve o arquivo inteiro pode definir os dois elementos com o mesmo valor novo, apagando o vestígio completamente. Um par idêntico, portanto, não é evidência de um documento intocado.
Lógica de severidade
Par idêntico: silenciosa. Par divergente: média apenas quando a própria estrutura do arquivo concorda que ele foi escrito mais de uma vez. Em um arquivo de revisão única a divergência é reportada como info. Um arquivo escrito uma única vez não pode ter sido "salvo de novo", e medida contra populações de documentos não curadas, a maioria dos pares divergentes está exatamente nesses arquivos. Nenhum array /ID é info: sua ausência remove a verificação em vez de indicar uma mudança. Achados info não contribuem em nada para a pontuação e são reportados para que a observação continue auditável.
O segundo elemento do /ID muda a cada salvamento; o primeiro deveria ficar parado desde a criação.
ELEMENTO 1 · PERMANENTE ELEMENTO 2 · REESCRITO AO SALVAR trailer da revisão 1 8F2A… 8F2A… trailer da revisão 2 8F2A… C41D… trailer da revisão 3 8F2A… 9B07… média par divergente e a própria estrutura do arquivo concorda que ele foi escrito mais de uma vez info par divergente num arquivo de revisão única, que não pode ter sido “salvo de novo”, ou nenhum /ID no arquivo

Duas fraquezas que o desenho não mostra e a leitura precisa carregar: muitos gravadores geram os dois elementos do zero na primeira gravação, e uma ferramenta que reescreve o arquivo inteiro pode definir os dois com o mesmo valor novo. Um par idêntico não é evidência de um documento intocado.

Uma revisão só não prova que nada foi editado: prova que quem escreveu por último achatou o histórico.
O ARQUIVO COMO ESTAVA 3 revisões, cadeia /Prev inteira incremental-updates fala reescrita DEPOIS DE UM GHOSTSCRIPT OU QPDF 1 revisão, histórico achatado incremental-updates silenciosa QUEM CARREGA O ACHADO NO LUGAR DELA metadata-mismatch producer-fingerprint font-anomalies os dois repositórios de metadados discordam a ferramenta que reescreveu se nomeia os prefixos de subconjunto de fonte sobrevivem à reescrita

A reescrita também apaga o par /ID e pode zerar as duas datas, e é por isso que nenhuma família desta página vale sozinha. As famílias que leem a tinta da página e os valores impressos são as que sobrevivem inteiras a uma redestilação.

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