Was this PDF changed after it was made?
Drop the reservation form, contract or payment schedule a developer sent you. You see every save inside the file, what each save changed, whether signatures still cover the document, and where the metadata and fonts disagree.
Your file never leaves this device. The check runs in your browser with code you can read (pdfx.js). This page sends no request with your file, and keeps working if you go offline after it has loaded. Site analytics are masked on this tool: they never see the file, its name or the results.
How it works
What the check reads, and its limits
Saves (incremental updates)
A PDF editor that saves changes usually appends them to the end of the file and adds a new end-of-file marker. We find every marker, attribute each object to the save that wrote it, and say what each save changed: page text, fonts, notes, form fields, signatures or metadata. Because earlier bytes are never overwritten, each earlier version can be opened again.
Signatures
For each signature we check that the signed byte range starts at the beginning of the file, whether it reaches the end, which saves came after it, and whether the hash stored in the signature matches a fresh hash of the signed bytes. We do not check the certificate chain, trust or revocation.
Metadata and fonts
The producer, creating program and dates are read from both the Info block and the XMP block and compared. Fonts are read from each page's content, so a font that is only available but never used is not counted. A font first written in a later save is the clearest sign of text added afterwards.
What this cannot see
- A document that was edited and then exported again as a new file looks like an original.
- Scanned documents are images: changes to the picture are not detected.
- Encrypted files can only be checked at the structure level.
- Nothing here is legal advice. A finding is a reason to ask the sender, and to have a lawyer check the original.
Tested on generated files with known histories (one save, two incremental edits, linearized, compressed object streams, scripts and attachments, signed, signed then edited, signed then altered by one byte) and on real contracts and brochures. The engine is about 550 lines of plain JavaScript with no third-party code.