# Historical PDF text extraction dataset

Published 2026-10-07 by ResumeForU Team. This package republishes existing July artifacts; no new benchmark was run for publication.

## Provenance and scope

- Raw report timestamp: 2026-07-04T17:19:41.466Z. The historical narrative is dated 2026-07-05.
- Three synthetic fixtures (standard, unicode, long) across five templates: 15 combinations, 30 PDFs and 30 extracted text files. Each combination also retains its shared HTML input, distributed as `.html.txt` to make it inspectable as source.
- Engine versions documented in the historical narrative: Chrome for Testing 149.0.7827.55 and WeasyPrint 63.0. Chromium PDF metadata identifies Skia/PDF m149. The original Poppler/pdftotext version, system package versions and container digest were not retained in the report.
- Fixture and scoring source is recovered from retained Git commit `10e4d4e5594b80afa4a70381409a64a54c39d194`, dated 2026-07-05. This snapshot contains the engineering fixtures visible in the archived PDFs. The exact generating Git revision was not recorded; this is a retained source snapshot, not proof of byte-identical regeneration.
- The current repository fixtures were changed in August. Do not substitute the current fixture source when interpreting July results.

The applicants and resume achievements are synthetic. Names, companies, education, credentials and URLs in these archived fixtures are illustrative, not verified employment, real applicant data, customer outcomes or endorsements. Do not contact the sample identities or submit the fictional details in an application.

## Files

- `report.json`: byte-preserved raw results, individual metric details and 90 WeasyPrint warnings.
- `artifacts/`: byte-preserved original PDFs, extracted text and shared HTML inputs (HTML filenames gain a `.txt` suffix; contents are unchanged).
- `july-source.zip`: recovered source snapshot, including fixtures, scorer, runner, renderer, five document templates, shared headings/date helpers, stylesheet, Dockerfile, package files and TypeScript configuration. These are code for inspection; they have not been executed for this publication.
- `fixtures.ts.txt` and `metrics.ts.txt`: convenient text copies of the recovered fixture and scorer source.
- `historical-report.md`: the later internal narrative. Some prose is stronger than these measurements justify, and its aggregate figures differ from the raw report. Use `report.json` as the numerical record.
- `checksums.sha256`: hashes of the distributed files, excluding the checksum file and the final package ZIP itself.
- `results.csv`: one row per fixture/template/metric, derived from `report.json`; scores remain fractions between 0 and 1.

## Exact checks and their limits

The scorer collapses whitespace, replaces form feeds with spaces and removes soft hyphens, zero-width spaces and word joiners. Therefore successful phrase matching does not establish the original line or page boundaries.

1. **Word integrity:** unique lowercased words from selected fixture fields, split on whitespace with edge punctuation stripped; words shorter than two characters are excluded. Score is matched unique words / expected unique words. It is not a count of every occurrence in the resume.
2. **Section titles:** case-insensitive substring matches for seven shared headings: Summary, Experience, Projects, Skills, Education, Certifications, Languages. It does not validate section order or field assignment.
3. **Contact information:** matches the expected email, normalized phone digits and visible link labels (or hostnames when labels are absent). It does not test clicking links, extracting URL destinations or a vendor's parser. The raw description says URLs; the implementation primarily checks link labels.
4. **Key tokens:** selected names, companies, education, skills and years; multiword tokens use normalized substring matches, single tokens use word-boundary regular expressions. It does not validate semantic understanding or factual credentials.
5. **Unicode preservation:** nine selected tokens in the unicode fixture matched after normalization. It is not coverage of all scripts or characters.
6. **Cross-page continuity:** long fixture only. Zero if the marker is missing, one if the expected opening phrase is within the first 100 normalized characters after the marker, otherwise one-half. Vocabulary is reported in details but does not determine that branch. A score of one does not prove the entire bullet or every page transition survived correctly.

The historical `pass`, `warn` and `fail` labels measure absolute differences between engine scores: at most 0.02, at most 0.05, or greater than 0.05. They are gap categories, not document acceptance results. `summary.chromiumAverage` and `summary.weasyprintAverage` average all 70 metric observations, mixing metrics and fixture-specific checks. They must not be called word-integrity averages or ATS acceptance rates.

## Reading the numbers

The public page calculates per-metric arithmetic means from raw cases. The raw word-integrity means are 99.59363360039357% for Chromium and 91.25525994447959% for WeasyPrint; contact means are 94.44444444444445% for both; key-token means are 99.44444444444446% and 79.63492063492065%. These differ from the historical narrative's table. Published results do not silently edit the original report to resolve that discrepancy.

## Reproduce inspection or extraction

Download and unzip the package. Inspect a shared HTML input and its corresponding PDF and text files side by side. Re-extract a PDF with your own documented Poppler installation:

```sh
pdftotext -layout artifacts/standard-classic.chromium.pdf extracted.txt
```

Compare your output with the archived `.txt` file and record the Poppler version. A different version or configuration may produce different text.

To investigate rendering, inspect the recovered runner, renderer and Dockerfile. The historical runner uses React server rendering, Tailwind/PostCSS, Playwright Chromium, WeasyPrint and `pdftotext -layout`. Node.js 22+, the archived npm dependencies, Python/WeasyPrint, Poppler, browser libraries and Liberation/Noto fonts are relevant dependencies. The retained Dockerfile uses mutable `node:22-slim`, unpinned apt packages and a Playwright browser installation. The CSS scanner references broader repository source directories; the download includes the directly relevant rendering files, not the complete application. Type-only ResumeData/validation imports refer to application definitions omitted from this package.

For the full original rendering workflow, the matching repository revision and its surrounding source are needed. Neither this source subset nor the archived Dockerfile is a hermetically pinned reproduction environment. The retained outputs make extraction and result inspection possible even when that environment cannot be recreated exactly. No reproduction was run to prepare this package.

## What these results cannot establish

These are local extraction measurements on a small synthetic set. No commercial ATS round-trip, hiring decision, ranking, accessibility certification or current-release verification is included. The data does not isolate every font/layout variable, prove the cause of every loss, or show that one engine is universally better. Inspect real exported files and application fields independently.
