Can you tell if an AI tool made a PDF?
Sometimes, but only from clues in the file. This check reads the two hidden "made with" details a PDF stores and looks for software that AI tools often use, such as the ReportLab code library. A ReportLab file with no author or title scored 55 out of 100. It never reads the writing, so a clue is not proof.
How do I check if a PDF was made by ChatGPT?
Upload it and look at the score and the software it names. AI assistants often build PDFs with code libraries that write their own name into the file, and each match adds points. Text written by AI, pasted into a word processor and exported normally, scores 0. A low score proves nothing either way.
Can a normal PDF be flagged as AI-made?
Yes. Many ordinary systems use the same software: invoicing platforms, reporting servers and web apps all build PDFs this way. Our test invoice from headless Chrome, with a title but no author, scored 30, which is enough to count as having indicators. Treat a high score as a reason to ask how the file was made.
Does this check the writing style?
No. Only the two "made with" fields are read. Page text, fonts, images and writing style play no part in the score. To judge the writing itself, extract the text and read it.
Where the points come from
The detector reads only two metadata fields, Creator and Producer, preferring their XMP versions when present. It joins them, lowercases the text and looks for every name in its software catalogue as a plain substring. Each catalogue entry that carries an AI association adds points. Two further rules apply only when at least one point has already been scored: a missing Author adds 10 and a missing Title adds 5. A handful of words in the two fields add a few points regardless.
| Rule | Points | Catalogue names or words involved |
|---|---|---|
| High-association generator | 40 each | ReportLab, PyPDF, PyPDF2, pdfplumber, WeasyPrint, pdf-lib, PDFKit, Puppeteer, Playwright; also the words OpenAI, Anthropic, Claude, ChatGPT, GPT, Gemini, Bard, Copilot |
| Medium-association generator | 20 each | FPDF, FPDF2, jsPDF, Headless Chrome |
| Low-association generator | 10 each | pdfmake, wkhtmltopdf |
| Author field empty | 10 | Only when the score is already above zero |
| Title field empty | 5 | Only when the score is already above zero |
| Words in Creator or Producer | 5 or 10 | python 5, script 5, api 5, automated 10, generated 10 |
From score to level
The total is capped at 100. A score of 0 is reported as No Indicators, 1 to 24 as Few Indicators, 25 to 49 as Some Indicators and 50 or more as Strong Indicators. From 25 upwards the file is counted as having AI-generator indicators, which also adds a warning to the screening checks and caps the full report's Document health number at 65. The score is a count of matched clues, not a probability that a person or a model wrote anything.
Worked example: a file whose producer names ReportLab
Producer: ReportLab PDF Library - www.reportlab.com Creator, Author, Title: empty ReportLab matched (high) +40 Author empty, score above zero +10 Title empty, score above zero +5 Total 55 -> Strong Indicators Summary returned: "Strong AI-generator indicators (risk score 55/100). Created using ReportLab, which AI assistants often use. This is not proof the content was written by AI."
Measured scores for common producer strings
The same producer can score differently depending on whether the file also has an author and a title. Both cases are shown.
| Creator / Producer text tested | With author and title | Without author and title |
|---|---|---|
| Microsoft Word / Microsoft: Print To PDF | 0, none | 0, none |
| Writer / LibreOffice 24.2 | 0, none | 0, none |
| LaTeX with hyperref / pdfTeX-1.40.25 | 0, none | 0, none |
| TCPDF 6.7.5 (http://www.tcpdf.org) | 0, none | 0, none |
| GPL Ghostscript 10.08.0 | 5, few | 5, few |
| FPDF 1.86 | 20, few | 35, some |
| wkhtmltopdf 0.12.6 / Qt 4.8.7 | 10, few | 25, some |
| WeasyPrint 61.2 | 40, some | 55, strong |
| pdf-lib (https://github.com/Hopding/pdf-lib) | 40, some | 55, strong |
| PyPDF2 | 80, strong | 95, strong |
Why some results can be wrong
- Overlapping names count twice.
PyPDF2containspypdf, so it matches both the PyPDF and PyPDF2 entries: 40 + 40, plus 15 for the empty author and title, gives 95. - Words inside longer words count. Ghostscript's producer earns 5 points because "Ghostscript" contains "script".
- A name anywhere in either field counts, including a custom producer such as "Report generated by API", which scored 15 from the words "generated" and "api" alone.
- Only the two fields are read. Page text, fonts, images and writing style play no part in the score.
False positives and false negatives
Many ordinary systems use the flagged libraries. Invoicing platforms render bills with headless Chrome, reporting servers use ReportLab or WeasyPrint, and web apps assemble PDFs with pdf-lib. Our test invoice with a HeadlessChrome creator, a Skia/PDF producer and a title but no author scored 30, which is enough to be counted as having indicators even though nothing about it involves a language model.
The opposite also happens. Text written by an AI assistant, pasted into a word processor and exported normally carries that word processor's name and scores 0. Metadata can be removed or retyped in seconds. A score of 0 says the generator fields hold no known clue; it says nothing about who wrote the words.
Using the result responsibly
Treat a high score as a prompt to ask how the document was produced, not as an accusation. The most useful evidence is usually outside the file: the workflow the sender says they used, earlier drafts, or version history in the system the document came from. If you need to assess the writing itself, extract the text and read it; this detector does not attempt that.
Last updated . Weights and thresholds are taken from the detector's source code. Scores in the tables were produced on 12 October 2026 by running the detector locally on synthetic PDFs and on typed-in creator and producer strings; the strings are test inputs, not values read from files made by those products.