PDF Text Extraction Research: July 2026 Results
Inspect 15 synthetic fixture/template comparisons, original PDFs and extracted text, scoring definitions and the limits of a historical engine comparison.
Published · Nodesify · Commentary updated
What does this dataset show?
It records text extracted from three synthetic resumes rendered through five layouts using two PDF engines in July 2026: 15 combinations and 30 PDFs. It offers inspectable examples of preserved and missing text. These are historical local extraction measurements, not ATS acceptance rates, hiring outcomes or verification of the current release.
The original JSON timestamp is ; the accompanying narrative is dated 5 July. This publication repackages retained artifacts. No benchmark was rerun for it.
Download the evidence
- Complete dataset ZIP: original PDFs, extracted text, shared HTML inputs, results and recovered source.
- Original raw JSON report and per-case CSV.
- Recovered fixture source, scoring source and rendering source snapshot.
- Dataset README, reproduction steps and limitations and SHA-256 file checksums.
The resumes are synthetic. Their named employers, credentials, achievements and links are illustrative, with no endorsement or verified employment implied. Replace all fictional details before using any sample in an application.
A worked example: skill names lose their separators
In the retained standard Professional-template case, these exact extracted lines show different spacing between the same four skill names. Both lines come from the July artifacts; this is not a new run or a comparison of current engine versions.
Chromium extraction
Languages: TypeScript Go Python RustWeasyPrint extraction
Languages:TypeScriptGoPythonRustThe second line joins the skill names together. The observation concerns word boundaries in this extraction path; it does not demonstrate an employer rejecting a resume. Inspect the original Chromium text, WeasyPrint text, Chromium PDF and WeasyPrint PDF.
For your own document, try ordinary text separators or a simpler layout, export again and compare the actual downloaded text. That is a suggested remedy to check, not a measured fix in this dataset. Follow the worked export checklist and inspect the employer’s populated fields where available.
Which versions and inputs were used?
The historical narrative identifies Chrome for Testing 149.0.7827.55 and WeasyPrint 63.0. Chromium PDF metadata identifies Skia/PDF m149. The original Poppler version, operating-system package versions and container digest are not recorded in the raw report.
The standard fixture is an ASCII engineering resume; the Unicode fixture contains accented names and selected punctuation; the long fixture exercises multiple pages and a marked bullet. Both engines received the same archived HTML for each combination. Font substitution and engine layout behavior can still affect the comparison.
Fixture and scoring source was recovered from the retained 5 July repository snapshot 10e4d4e5594b80afa4a70381409a64a54c39d194. It contains the engineering fixture visible in these artifacts. The exact generating revision was not recorded. Later repository fixtures changed, so current source should not be substituted for the recovered fixture.
What exactly was scored?
The scorer collapses whitespace and page-break characters and removes soft hyphens and selected invisible characters before matching. A matched phrase therefore does not establish its original visual placement. The implementation, rather than a stronger description in a source comment, defines each check.
- Word integrity
- Matched unique words from selected fields / expected unique words, after lowercasing and edge-punctuation removal. Words shorter than two characters are excluded.
- Section titles
- Case-insensitive substring matches for seven shared headings. This does not check section order or whether fields belong to the correct section.
- Contact information
- Expected email, normalized phone digits and visible link labels. The implementation does not verify hyperlink destinations or a vendor’s field extraction.
- Key tokens
- Selected names, companies, education, skills and years, using normalized phrases or word-boundary matches. It does not verify credentials or semantic meaning.
- Unicode preservation
- Nine selected Unicode tokens in the Unicode fixture. This is not coverage of all scripts and characters.
- Marker and opening phrase
- Long fixture only: 0 if its marker is missing, 1 if the expected opening phrase appears within the first 100 normalized characters after it, otherwise 0.5. This does not prove the whole bullet or every page boundary is intact.
The raw report’s contact description refers to URLs, but the code checks visible link labels. Its cross-page description suggests full continuity, but the implemented check tests the marker and opening phrase. Neither check reproduces a commercial ATS parser.
Per-metric averages from the raw cases
| Metric | Cases | Chromium | WeasyPrint |
|---|---|---|---|
| Word integrity | 15 | 99.6% | 91.3% |
| Section titles | 15 | 100.0% | 100.0% |
| Contact information | 15 | 94.4% | 94.4% |
| Key tokens | 15 | 99.4% | 79.6% |
| Unicode preservation | 5 | 100.0% | 100.0% |
| Marker and opening phrase | 5 | 100.0% | 100.0% |
These means are calculated from the preserved raw rows. They differ from the later narrative’s word, contact and key-token averages. The report’s summary averages of 98.6% and 92.6% combine all 70 metric observations; they are not word-integrity averages. The original files remain unchanged, and this discrepancy is disclosed rather than silently corrected.
Results for every fixture and layout
Each table shows scores from the original JSON, rounded to one decimal place for display. Raw fractions and missing-token details remain available in JSON and CSV. A score of 100% means the defined check matched, not that every property of the document is correct.
standard / classic
Chromium PDF · Chromium text · WeasyPrint PDF · WeasyPrint text · Shared HTML source
| Check | Chromium | WeasyPrint |
|---|---|---|
| Word integrity | 99.2% | 93.0% |
| Section titles | 100.0% | 100.0% |
| Contact information | 75.0% | 75.0% |
| Key tokens | 100.0% | 85.0% |
Original missing-token and diagnostic details
- word-integrity: chromium: missing 1/128: linkedin | weasyprint: missing 9/128: redesign, about, linkedin, anthropic, stripe, remote, university, science…
- section-titles: all 7 section titles found
- contact-info: missing: link(LinkedIn)
- key-tokens: chromium: all 20 key tokens found | weasyprint: missing 3/20: Anthropic, Stripe, 2020
standard / elegant
Chromium PDF · Chromium text · WeasyPrint PDF · WeasyPrint text · Shared HTML source
| Check | Chromium | WeasyPrint |
|---|---|---|
| Word integrity | 100.0% | 91.4% |
| Section titles | 100.0% | 100.0% |
| Contact information | 100.0% | 100.0% |
| Key tokens | 100.0% | 85.0% |
Original missing-token and diagnostic details
- word-integrity: chromium: all 128 ground-truth words found | weasyprint: missing 11/128: redesign, about, anthropic, stripe, remote, university, science, openmetrics…
- section-titles: all 7 section titles found
- contact-info: all 4 contact fields matched
- key-tokens: chromium: all 20 key tokens found | weasyprint: missing 3/20: Anthropic, Stripe, 2020
standard / minimal
Chromium PDF · Chromium text · WeasyPrint PDF · WeasyPrint text · Shared HTML source
| Check | Chromium | WeasyPrint |
|---|---|---|
| Word integrity | 99.2% | 89.8% |
| Section titles | 100.0% | 100.0% |
| Contact information | 100.0% | 100.0% |
| Key tokens | 100.0% | 85.0% |
Original missing-token and diagnostic details
- word-integrity: chromium: missing 1/128: ca | weasyprint: missing 13/128: redesign, about, ada@example.com, 123-4567, san, ca, linkedin, anthropic…
- section-titles: all 7 section titles found
- contact-info: all 4 contact fields matched
- key-tokens: chromium: all 20 key tokens found | weasyprint: missing 3/20: Anthropic, Stripe, 2020
standard / modern
Chromium PDF · Chromium text · WeasyPrint PDF · WeasyPrint text · Shared HTML source
| Check | Chromium | WeasyPrint |
|---|---|---|
| Word integrity | 100.0% | 93.8% |
| Section titles | 100.0% | 100.0% |
| Contact information | 100.0% | 100.0% |
| Key tokens | 100.0% | 85.0% |
Original missing-token and diagnostic details
- word-integrity: chromium: all 128 ground-truth words found | weasyprint: missing 8/128: redesign, about, anthropic, stripe, remote, university, science, openmetrics
- section-titles: all 7 section titles found
- contact-info: all 4 contact fields matched
- key-tokens: chromium: all 20 key tokens found | weasyprint: missing 3/20: Anthropic, Stripe, 2020
standard / professional
Chromium PDF · Chromium text · WeasyPrint PDF · WeasyPrint text · Shared HTML source
| Check | Chromium | WeasyPrint |
|---|---|---|
| Word integrity | 100.0% | 82.8% |
| Section titles | 100.0% | 100.0% |
| Contact information | 100.0% | 100.0% |
| Key tokens | 100.0% | 45.0% |
Original missing-token and diagnostic details
- word-integrity: chromium: all 128 ground-truth words found | weasyprint: missing 22/128: redesign, about, anthropic, process, stripe, university, typescript, go…
- section-titles: all 7 section titles found
- contact-info: all 4 contact fields matched
- key-tokens: chromium: all 20 key tokens found | weasyprint: missing 11/20: Anthropic, Stripe, 2020, TypeScript, Go, Python…
unicode / classic
Chromium PDF · Chromium text · WeasyPrint PDF · WeasyPrint text · Shared HTML source
| Check | Chromium | WeasyPrint |
|---|---|---|
| Word integrity | 98.9% | 94.6% |
| Section titles | 100.0% | 100.0% |
| Contact information | 66.7% | 66.7% |
| Key tokens | 100.0% | 91.7% |
| Unicode preservation | 100.0% | 100.0% |
Original missing-token and diagnostic details
- word-integrity: chromium: missing 1/93: portfolio | weasyprint: missing 5/93: portfolio, principal, gmbh, informatik, übermetrics
- section-titles: all 7 section titles found
- contact-info: missing: link(Portfolio)
- key-tokens: chromium: all 12 key tokens found | weasyprint: missing 1/12: 2020
- unicode-preservation: all 9 unicode tokens preserved
unicode / elegant
Chromium PDF · Chromium text · WeasyPrint PDF · WeasyPrint text · Shared HTML source
| Check | Chromium | WeasyPrint |
|---|---|---|
| Word integrity | 100.0% | 89.2% |
| Section titles | 100.0% | 100.0% |
| Contact information | 100.0% | 100.0% |
| Key tokens | 100.0% | 91.7% |
| Unicode preservation | 100.0% | 100.0% |
Original missing-token and diagnostic details
- word-integrity: chromium: all 93 ground-truth words found | weasyprint: missing 10/93: principal, gmbh, informatik, übermetrics, français, natif, deutsch, courant…
- section-titles: all 7 section titles found
- contact-info: all 3 contact fields matched
- key-tokens: chromium: all 12 key tokens found | weasyprint: missing 1/12: 2020
- unicode-preservation: all 9 unicode tokens preserved
unicode / minimal
Chromium PDF · Chromium text · WeasyPrint PDF · WeasyPrint text · Shared HTML source
| Check | Chromium | WeasyPrint |
|---|---|---|
| Word integrity | 97.8% | 90.3% |
| Section titles | 100.0% | 100.0% |
| Contact information | 100.0% | 100.0% |
| Key tokens | 91.7% | 83.3% |
| Unicode preservation | 100.0% | 100.0% |
Original missing-token and diagnostic details
- word-integrity: chromium: missing 2/93: senior, switzerland | weasyprint: missing 9/93: senior, jose.muller@example.com, 34, zürich, switzerland, portfolio, principal, gmbh…
- section-titles: all 7 section titles found
- contact-info: all 3 contact fields matched
- key-tokens: chromium: missing 1/12: Ingénieur Logiciel Senior | weasyprint: missing 2/12: Ingénieur Logiciel Senior, 2020
- unicode-preservation: all 9 unicode tokens preserved
unicode / modern
Chromium PDF · Chromium text · WeasyPrint PDF · WeasyPrint text · Shared HTML source
| Check | Chromium | WeasyPrint |
|---|---|---|
| Word integrity | 100.0% | 95.7% |
| Section titles | 100.0% | 100.0% |
| Contact information | 100.0% | 100.0% |
| Key tokens | 100.0% | 91.7% |
| Unicode preservation | 100.0% | 100.0% |
Original missing-token and diagnostic details
- word-integrity: chromium: all 93 ground-truth words found | weasyprint: missing 4/93: principal, gmbh, informatik, übermetrics
- section-titles: all 7 section titles found
- contact-info: all 3 contact fields matched
- key-tokens: chromium: all 12 key tokens found | weasyprint: missing 1/12: 2020
- unicode-preservation: all 9 unicode tokens preserved
unicode / professional
Chromium PDF · Chromium text · WeasyPrint PDF · WeasyPrint text · Shared HTML source
| Check | Chromium | WeasyPrint |
|---|---|---|
| Word integrity | 100.0% | 82.8% |
| Section titles | 100.0% | 100.0% |
| Contact information | 100.0% | 100.0% |
| Key tokens | 100.0% | 41.7% |
| Unicode preservation | 100.0% | 100.0% |
Original missing-token and diagnostic details
- word-integrity: chromium: all 93 ground-truth words found | weasyprint: missing 16/93: gmbh, programmation, typescript, go, python, infrastructure, postgres, kubernetes…
- section-titles: all 7 section titles found
- contact-info: all 3 contact fields matched
- key-tokens: chromium: all 12 key tokens found | weasyprint: missing 7/12: 2020, TypeScript, Go, Python, Postgres, Kubernetes…
- unicode-preservation: all 9 unicode tokens preserved
long / classic
Chromium PDF · Chromium text · WeasyPrint PDF · WeasyPrint text · Shared HTML source
| Check | Chromium | WeasyPrint |
|---|---|---|
| Word integrity | 99.3% | 96.7% |
| Section titles | 100.0% | 100.0% |
| Contact information | 75.0% | 75.0% |
| Key tokens | 100.0% | 85.7% |
| Marker and opening phrase | 100.0% | 100.0% |
Original missing-token and diagnostic details
- word-integrity: chromium: missing 1/153: linkedin | weasyprint: missing 5/153: about, linkedin, university, science, openmetrics
- section-titles: all 7 section titles found
- contact-info: missing: link(LinkedIn)
- key-tokens: chromium: all 42 key tokens found | weasyprint: missing 6/42: 2023, 2023, 2023, 2023, 2023, 2023
- cross-page-continuity: marker present, bullet body contiguous (10/10 vocab)
long / elegant
Chromium PDF · Chromium text · WeasyPrint PDF · WeasyPrint text · Shared HTML source
| Check | Chromium | WeasyPrint |
|---|---|---|
| Word integrity | 100.0% | 94.8% |
| Section titles | 100.0% | 100.0% |
| Contact information | 100.0% | 100.0% |
| Key tokens | 100.0% | 85.7% |
| Marker and opening phrase | 100.0% | 100.0% |
Original missing-token and diagnostic details
- word-integrity: chromium: all 153 ground-truth words found | weasyprint: missing 8/153: about, ingress, university, science, openmetrics, english, native, mandarin
- section-titles: all 7 section titles found
- contact-info: all 4 contact fields matched
- key-tokens: chromium: all 42 key tokens found | weasyprint: missing 6/42: 2023, 2023, 2023, 2023, 2023, 2023
- cross-page-continuity: chromium: marker present, bullet body contiguous (10/10 vocab) | weasyprint: marker present, bullet body contiguous (9/10 vocab)
long / minimal
Chromium PDF · Chromium text · WeasyPrint PDF · WeasyPrint text · Shared HTML source
| Check | Chromium | WeasyPrint |
|---|---|---|
| Word integrity | 99.3% | 94.1% |
| Section titles | 100.0% | 100.0% |
| Contact information | 100.0% | 100.0% |
| Key tokens | 100.0% | 85.7% |
| Marker and opening phrase | 100.0% | 100.0% |
Original missing-token and diagnostic details
- word-integrity: chromium: missing 1/153: ca | weasyprint: missing 9/153: about, ada@example.com, 123-4567, san, ca, linkedin, university, openmetrics…
- section-titles: all 7 section titles found
- contact-info: all 4 contact fields matched
- key-tokens: chromium: all 42 key tokens found | weasyprint: missing 6/42: 2023, 2023, 2023, 2023, 2023, 2023
- cross-page-continuity: marker present, bullet body contiguous (10/10 vocab)
long / modern
Chromium PDF · Chromium text · WeasyPrint PDF · WeasyPrint text · Shared HTML source
| Check | Chromium | WeasyPrint |
|---|---|---|
| Word integrity | 100.0% | 96.7% |
| Section titles | 100.0% | 100.0% |
| Contact information | 100.0% | 100.0% |
| Key tokens | 100.0% | 85.7% |
| Marker and opening phrase | 100.0% | 100.0% |
Original missing-token and diagnostic details
- word-integrity: chromium: all 153 ground-truth words found | weasyprint: missing 5/153: about, ingress, university, science, openmetrics
- section-titles: all 7 section titles found
- contact-info: all 4 contact fields matched
- key-tokens: chromium: all 42 key tokens found | weasyprint: missing 6/42: 2023, 2023, 2023, 2023, 2023, 2023
- cross-page-continuity: chromium: marker present, bullet body contiguous (10/10 vocab) | weasyprint: marker present, bullet body contiguous (9/10 vocab)
long / professional
Chromium PDF · Chromium text · WeasyPrint PDF · WeasyPrint text · Shared HTML source
| Check | Chromium | WeasyPrint |
|---|---|---|
| Word integrity | 100.0% | 83.0% |
| Section titles | 100.0% | 100.0% |
| Contact information | 100.0% | 100.0% |
| Key tokens | 100.0% | 66.7% |
| Marker and opening phrase | 100.0% | 100.0% |
Original missing-token and diagnostic details
- word-integrity: chromium: all 153 ground-truth words found | weasyprint: missing 26/153: about, ingress, process, university, typescript, go, python, rust…
- section-titles: all 7 section titles found
- contact-info: all 4 contact fields matched
- key-tokens: chromium: all 42 key tokens found | weasyprint: missing 14/42: TypeScript, Go, Python, Rust, Postgres, Terraform…
- cross-page-continuity: chromium: marker present, bullet body contiguous (10/10 vocab) | weasyprint: marker present, bullet body contiguous (9/10 vocab)
How can I inspect or reproduce the work?
Download the ZIP and compare a shared HTML input, its two PDFs and the corresponding extracted text. To repeat extraction, use your own documented Poppler installation with pdftotext -layout on a retained PDF. Record your version and compare the result with the archived text.
The recovered source shows the runner, fixtures, scoring definitions, React renderer, templates, dependency files and Dockerfile. Relevant dependencies include Node.js 22+, React, Tailwind/PostCSS, Playwright, WeasyPrint, Poppler and system fonts. The source subset omits the complete application and some type-only imports. The original Dockerfile also uses mutable OS and package inputs, and the stylesheet scanner references broader source directories. Full rendering requires the surrounding matching repository source; exact regeneration is not established by this package.
The raw report retains 90 WeasyPrint warnings concerning media queries and font declarations. They are part of the observed environment. This dataset alone cannot establish that every extraction difference was caused by one feature.
What should I take from these results?
Inspect the actual exported file you will submit. This small synthetic comparison does not cover every language, layout, input or employer configuration. Gap labels in the JSON compare engines: “pass” means at most a two-percentage-point difference, “warn” at most five, and “fail” a larger difference. They are not employer acceptance verdicts.
Use the worked exported-text checklist for your own document and our methodology for the distinction between extraction, content checks and employer screening.