Measured observations
| Item | Input / reference | Observed output |
|---|---|---|
| Subset-font original | 담당: 가상팀 / Draft 2026 | 담당: 새문팀 / Final 2027 |
| Original with real text | Delivery date: 2026-10-22 | Delivery 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
- Download both files and search for 가상팀 and 새문팀.
- Open the source in the workbench and choose its original text on the page or in the right-hand list.
- Compare the replacement and accept the font substitution before applying it.
- 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
- Subset-font original (korean-subset-source.pdf)
- Edited subset-font document (korean-subset-edited.pdf)
- Type0-font original (korean-type0-source.pdf)
- Edited Type0-font document (korean-type0-edited.pdf)
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.



