Measured observations

ItemInput / referenceObserved output
Subset-font original담당: 가상팀 / Draft 2026담당: 새문팀 / Final 2027
Original with real textDelivery date: 2026-10-22Delivery date: 2026-10-23
Type0-font original담당: 가상팀 / Draft 2026담당: 새문팀 / Final 2027

These observations apply to these specimens, not every PDF or reader.

When it happens

A PDF may embed only the glyphs it originally used. Replacing “담당: 가상팀 / Draft 2026” with “담당: 새문팀 / Final 2027” needs mappings and glyphs for the new text. Being able to select or copy a phrase does not establish that any replacement can use the same font.

What we did

We authored the phrase in a ReportLab TrueType subset and a pdf-lib Identity-H Type0 document. The actual PDF Desk engine replaces the Tj operand. An independent pypdf check verifies that the old phrase is absent and the new mixed-language phrase extracts correctly. No covering image or whole-page rasterization is involved.

What font substitution changes

Korean replacements embed NanumGothic. Keeping the original point size does not ensure identical glyph shapes or width, so the app requires acknowledgement and checks width and height. Our example uses the same font family; other source fonts may look noticeably different. Overlong replacements are refused instead of squeezed into the original space.

Check it yourself

  1. Download both files and search for 가상팀 and 새문팀.
  2. Open the source in the workbench and choose its original text on the page or in the right-hand list.
  3. Compare the replacement and accept the font substitution before applying it.
  4. Reopen the saved file in another reader, copy the text and compare the chart and unchanged second page.

Fixes and exceptions

Unmapped fonts, TJ arrays, vertical writing, scans, hidden OCR and documents with forms, tags or links are outside this scope. Edit in the source application when selection or fitting fails. Adding a text box is a separate operation: it leaves the original phrase in place.

Files to inspect yourself

Independent observations and method (JSON) · Authorship and file hashes

Crop coordinates, scale, source hashes and fresh extraction · Rechecked: 2026-10-24 · pdftoppm version 26.07.0 · pypdf 6.10.0 · pdfplumber 0.11.9. Original PDFs were not modified.

Environment, date and evidence boundaries

Checked: 2026-10-23 · Windows / Chrome 155 · pdf-lib 1.17.1 · PDF.js 6.4.299 · fontkit 1.1.1 · pypdf 6.10.0 · pdftoppm version 26.07.0. PDFs and artwork are original; NanumGothic uses OFL-1.1. Tables and files record direct observations; explanations interpret those structures. Physical OS keyboard input, phones and every PDF reader are outside this test.

Reproduction code: scripts/lab-inputs.py, lab-outputs.mjs, lab-derived.py, tests/readiness-browser.mjs and tests/lab-pdf.py.