# November 2026 PDF extraction collection

Collected 8 November 2026 in Asia/Singapore (the raw timestamp is UTC). Three synthetic inputs across five templates produced 15 PDFs and 23 raster pages. This uses the application render-document page, bundled fonts and production PDF code path in an isolated Linux candidate, not the standalone HTML/system-font helper. It does not establish a production deployment, ATS acceptance or hiring results. No Word or competing-engine measurement was performed.

## Procedure and reproduction

1. Build the matching application image with NEXT_PUBLIC_APP_URL=https://smoke.invalid and compile the evidence collectors with scripts/build-renderer.mjs. runtime.json identifies the captured base revision, derivative candidate image, application build ID and runtime versions. The full source/image is retained by the operator and is not distributed in this dataset; exact rendering reproduction requires access to it.
2. Start the isolated application and renderer with disposable service dependencies, not a production database. Set DEPLOYMENT_ENVIRONMENT=ci on the renderer. The renderer loads only the app render-document page and permitted assets. Synthetic snapshots are fulfilled in its browser without storing customer resumes.
3. Run node dist/research/capture.mjs <new-output-directory> with RENDERER_URL, RENDERER_SECRET, CANDIDATE_IMAGE_ID, APP_VERSION and NEXT_PUBLIC_APP_URL=https://smoke.invalid. The collector requires a CI renderer and refuses to overwrite an existing collection. No service secrets are included here.
4. For each case, compare its .snapshot.json with its PDF, page images and .txt output. report.json and results.csv retain each local check, including partial scores and diagnostic details. Scoring and collector sources and package-lock.json are included for inspection and use with matching repository source.
5. To repeat extraction, use PDF.js 6.3.289 getTextContent on each retained PDF page. The collector appends a newline after items with hasEOL and a space after other items, then joins pages with newline/form-feed/newline. The included collector source defines the exact procedure.

## Observations and limitations

The text-item joining procedure can split ligature runs. For example, standard-classic.txt contains `Certi fi ed` and unicode-elegant.txt contains `Certi fi cations`, while the raster image shows readable words. This can reduce a string-match score without demonstrating missing PDF content. The selected-word check excludes one-character words; section checks do not verify order; contact checks do not open links or validate ATS fields; Unicode coverage is nine tokens. The long-fixture check verifies a marker and opening phrase, not the whole bullet across every page boundary. Counts and percentages describe this collection and extractor only.

The November and July collections use different input vintages and extractors. Do not treat their score differences as an improvement or regression. Names, employers, credentials and achievements are fictional. No independent recruiter review, employer parser validation or hiring-outcome study is included.

## Review and integrity

See review.md for the limited assistant review. checksums.sha256 covers all collection files other than itself and dataset.zip. The ZIP includes the checksum manifest and all collection files, without recursively including itself.
