Skip to content

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

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      Rust

WeasyPrint extraction

Languages:TypeScriptGoPythonRust

The 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

Arithmetic means; 15 cases for the first four metrics and five cases for each fixture-specific metric.
MetricCasesChromiumWeasyPrint
Word integrity1599.6%91.3%
Section titles15100.0%100.0%
Contact information1594.4%94.4%
Key tokens1599.4%79.6%
Unicode preservation5100.0%100.0%
Marker and opening phrase5100.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

Original case scores: standard / classic
CheckChromiumWeasyPrint
Word integrity99.2%93.0%
Section titles100.0%100.0%
Contact information75.0%75.0%
Key tokens100.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

Original case scores: standard / elegant
CheckChromiumWeasyPrint
Word integrity100.0%91.4%
Section titles100.0%100.0%
Contact information100.0%100.0%
Key tokens100.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

Original case scores: standard / minimal
CheckChromiumWeasyPrint
Word integrity99.2%89.8%
Section titles100.0%100.0%
Contact information100.0%100.0%
Key tokens100.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

Original case scores: standard / modern
CheckChromiumWeasyPrint
Word integrity100.0%93.8%
Section titles100.0%100.0%
Contact information100.0%100.0%
Key tokens100.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

Original case scores: standard / professional
CheckChromiumWeasyPrint
Word integrity100.0%82.8%
Section titles100.0%100.0%
Contact information100.0%100.0%
Key tokens100.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

Original case scores: unicode / classic
CheckChromiumWeasyPrint
Word integrity98.9%94.6%
Section titles100.0%100.0%
Contact information66.7%66.7%
Key tokens100.0%91.7%
Unicode preservation100.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

Original case scores: unicode / elegant
CheckChromiumWeasyPrint
Word integrity100.0%89.2%
Section titles100.0%100.0%
Contact information100.0%100.0%
Key tokens100.0%91.7%
Unicode preservation100.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

Original case scores: unicode / minimal
CheckChromiumWeasyPrint
Word integrity97.8%90.3%
Section titles100.0%100.0%
Contact information100.0%100.0%
Key tokens91.7%83.3%
Unicode preservation100.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

Original case scores: unicode / modern
CheckChromiumWeasyPrint
Word integrity100.0%95.7%
Section titles100.0%100.0%
Contact information100.0%100.0%
Key tokens100.0%91.7%
Unicode preservation100.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

Original case scores: unicode / professional
CheckChromiumWeasyPrint
Word integrity100.0%82.8%
Section titles100.0%100.0%
Contact information100.0%100.0%
Key tokens100.0%41.7%
Unicode preservation100.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

Original case scores: long / classic
CheckChromiumWeasyPrint
Word integrity99.3%96.7%
Section titles100.0%100.0%
Contact information75.0%75.0%
Key tokens100.0%85.7%
Marker and opening phrase100.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

Original case scores: long / elegant
CheckChromiumWeasyPrint
Word integrity100.0%94.8%
Section titles100.0%100.0%
Contact information100.0%100.0%
Key tokens100.0%85.7%
Marker and opening phrase100.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

Original case scores: long / minimal
CheckChromiumWeasyPrint
Word integrity99.3%94.1%
Section titles100.0%100.0%
Contact information100.0%100.0%
Key tokens100.0%85.7%
Marker and opening phrase100.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

Original case scores: long / modern
CheckChromiumWeasyPrint
Word integrity100.0%96.7%
Section titles100.0%100.0%
Contact information100.0%100.0%
Key tokens100.0%85.7%
Marker and opening phrase100.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

Original case scores: long / professional
CheckChromiumWeasyPrint
Word integrity100.0%83.0%
Section titles100.0%100.0%
Contact information100.0%100.0%
Key tokens100.0%66.7%
Marker and opening phrase100.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.

Help & feedback