Files
jobtrackingapp/docs/redesign/phase-9/p9-remed-02/PDF_REMEDIATION.md
T

6.0 KiB

Linux PDF remediation evidence

The original baseline is reproduced on Debian12, .NET9.0.21 and Chromium156.0.8078.47, with a Windows Chromium151.0.7922.34 preview client. Linux locale is POSIX; HTML is explicitly UTF-8 with variant-controlled EN/NB language. Runtime/image/font inventory is retained in .artifacts/p9-remed-02/baseline/environment.json and producer process records. Page geometry, print CSS, template data, fixture inputs and original oracle were not changed.

Baseline:13/24 pass,65 PDF pages versus60 preview pages. Original Linux font inventory contains only six DejaVu faces; requested Segoe UI/Arial/Georgia/Roboto/Poppins/mono stacks have no packaged resources. PDFs show actual DejaVu substitution against Windows reference fonts. All11 failed fixtures show cumulative position/wrapping drift, with five extra pages across the roomy document and four after-settings states. Baseline checks report no missing/extra markers, blank pages, physical-dimension, font-size, RGB or vertical-safe-area errors. That distinguishes the observed failures from unproven clipping or missing-content causes.

The shared ThemedCvRenderer now embeds licensed portable faces, preserving persisted font-stack strings/null inheritance and all Career/settings/revision owners. A font-only identical-HTML experiment isolates the metric effect: both engines produce the same text and four pages with maximum word-position difference0.023mm. See FONT_PACKAGING.md for the precise effective families and intended glyph changes. Historical frozen exports are untouched; this does not promise proprietary-font pixel identity for newly rendered documents.

The first variable-font packaging trial aligned all preview/export page counts and markers but exposed a separate PDF metadata problem: reviewed variable faces exported as Type3 without FontBBox/Ascent/Descent in the Linux engine. In the inspected header, the inferred glyph top was14.8167mm even though independent PDF images showed it inside the physical margin. Static upstream originals emit Type0, with proper16.6109mm glyph bounds, and satisfy the unchanged safe-area check. No locally modified fonts, reference snapshots or tolerance changes are used.

The static checkpoint passes all24 original fixtures and60 pages. This covers all nine current themes, one/multiple pages, long employment/bullets/headings and ordinary skills, EN/NB characters, custom settings, empty optional fields and boundary text. Every rendered HTML body text node is present in reopened PDF glyph streams after explicit NFKC ligature expansion, whitespace normalization and casefold for existing CSS text-transform; this presence check does not certify original letter-case fidelity. Independent oracle markers, geometry, safe areas, font sizes and colors remain separate checks.

Four representative independent reprints have exact per-glyph geometry and rendered page-pixel equality across their pages. PDF byte equality is not claimed because creation metadata changes. All60 exported page images and comparison sheets were generated. Finite AI visual inspection covered default-minimal/page1, long-nb-code/page4 and light-en-after/page3: the selected comparisons retain aligned text, margins, final-page content and accent styling. This is not human visual acceptance or physical printing. Locale/alternate-engine/physical-printer qualifications remain explicit owner cards.

The prior collector is reused unchanged with original16-fixture/36-page and8-fixture/24-page totals and exact eight settings states. Final frozen-source Windows and Linux successors both pass the same original24 fixtures/60pages. Their native reports, unchanged oracle and input/report hashes are recorded in pdf-remediation.json; broader qualification and the separate supplemental cases retain their own outcomes. This table preserves the baseline versus static-checkpoint comparison.

Original fixture Baseline preview/PDF Baseline Static preview/PDF Static
default-modern 1/1 PASS 1/1 PASS
default-minimal 1/1 PASS 1/1 PASS
default-executive 1/1 PASS 1/1 PASS
default-technical 1/1 PASS 1/1 PASS
default-ats-classic 1/1 PASS 1/1 PASS
default-nordic 1/1 PASS 1/1 PASS
default-elegant 1/1 PASS 1/1 PASS
default-creative 1/1 PASS 1/1 PASS
default-code 1/1 PASS 1/1 PASS
long-en-minimal 4/4 FAIL 4/4 PASS
long-nb-code 4/4 FAIL 4/4 PASS
compact-8mm-letter 4/4 FAIL 4/4 PASS
roomy-28mm-nb 5/6 FAIL 5/5 PASS
grid-and-bubbles 1/1 FAIL 1/1 PASS
long-sidebar-nb 5/5 FAIL 5/5 PASS
unbreakable-and-boundary 4/4 FAIL 4/4 PASS
light-en-before 3/3 PASS 3/3 PASS
light-en-after 3/4 FAIL 3/3 PASS
light-nb-before 3/3 PASS 3/3 PASS
light-nb-after 3/4 FAIL 3/3 PASS
dark-en-before 3/3 PASS 3/3 PASS
dark-en-after 3/4 FAIL 3/3 PASS
dark-nb-before 3/3 PASS 3/3 PASS
dark-nb-after 3/4 FAIL 3/3 PASS

All individual failures, font identities and measured maximum after-position differences are preserved in pdf-remediation.json. Legacy renderers/frozen artifacts remain unchanged; these24 corpora qualify the current themed pipeline, not every historical renderer or physical device.

Supplemental long-skill-list, long-heading, empty-section and browser-generated-header/footer suppression checks PASS separately on real MariaDB/Linux: minimalEN2pages and technicalNB8pages. All64 S-markers and Norwegian name characters persist; independent HTTP readback preserves profile/revision and CV version. They are not counted in the original24 or ordinary362. Pre/post oracle input and report hashes are required by reconciliation. The current renderer suppresses Chromium URL/date headers/footers. A retained ShowPageNumbers DTO property has no current renderer/control consumer; numbered footer output is not claimed or added as a new feature.