A stamp placed on a page with /Rotate was drawn in user space, so the label or picture turned with the page. Counterrotate the appearance so it reads upright as the page is displayed. Co-authored-by: Brandon Thomas <echelon@gmail.com>
25 KiB
Where PdfCraft falls short of Acrobat Pro
Last reviewed: 2026-10-12 · Last updated: 2026-10-12 · Change: minor (gap 6: #1398 stamps read upright on rotated pages; estimates unchanged) · Target: Adobe Acrobat Pro (Acrobat DC, continuous track 26.002.21931, macOS) Last reviewed: 2026-10-12 · Last updated: 2026-10-12 · Change: minor (gap 6: #1317, #1327, #1302, #1315 and #1340; estimates unchanged) · Target: Adobe Acrobat Pro (Acrobat DC, continuous track 26.002.21931, macOS) Last reviewed: 2026-10-10 · Last updated: 2026-10-12 · Change: minor (#1316: replacing a line keeps a neighbouring line whose glyph box overlaps; gap 3 remains) · Target: Adobe Acrobat Pro (Acrobat DC, continuous track 26.002.21931, macOS) Last reviewed: 2026-10-10 · Last updated: 2026-10-12 · Change: gap 4 closed: the web build prints through the browser's print dialog; exclusive image-crop resize follow-up; minor (Word invoice regression coverage, #773; Office fidelity still partial; gap 2: hayro patch counts after the native-gradient backport) · Target: Adobe Acrobat Pro (Acrobat DC, continuous track 26.002.21931, macOS) Last reviewed: 2026-10-10 · Last updated: 2026-10-12 · Change: minor (gap 13: large-file memory measured, edits keep two copies instead of three, file-backed input blocked on gap 2) · Target: Adobe Acrobat Pro (Acrobat DC, continuous track 26.002.21931, macOS) Last reviewed: 2026-10-10 · Last updated: 2026-10-11 · Change: minor (gap 1 closed by #836; fixed issues removed from gaps 3, 6 and 16) · Target: Adobe Acrobat Pro (Acrobat DC, continuous track 26.002.21931, macOS) Last reviewed: 2026-10-10 · Last updated: 2026-10-11 · Change: minor (document-font subset completion and curved/shared image clips in the contributor fork; gap 2: hayro patch counts after the native-gradient backport) · Target: Adobe Acrobat Pro (Acrobat DC, continuous track 26.002.21931, macOS)
Every known shortfall, one entry each, ranked by what it costs users. This is the work list: agents
choose from the top unless the owner says otherwise, and prefer these over new P2/P3 checklist
features. The numbers behind it are in target-app-parity.md; the per-feature
detail is in parity/acrobat-features.toml (cargo xtask parity --partial lists what each partial
feature lacks).
No gap blocks the alpha gate; gap 8 holds the convert-and-share workflow's partial sub-cases and is the first beta item. Gap numbers are kept when a gap closes, so references elsewhere stay valid (gap 1, encrypted output Acrobat rejected, closed with #836; gap 4, no printing on the web, closed by printing through the browser's print dialog).
Hours are Opus 5.5 agent wall-clock hours. "Doc" names the parity document the gap belongs to. When a gap closes, delete its entry, note it in the ROADMAP.md progress log and update the numbers.
Summary
| # | Gap | Kind | Hours | Doc |
|---|---|---|---|---|
| 2 | Rendering is borrowed and its fidelity unmeasured | feature, spec | 110–190 | pdf-spec-parity.md |
| 3 | Editing existing text is fragile on real files | feature | 100–180 | target-app-parity.md |
| 5 | Chinese UI shows missing-glyph boxes in releases | localization | 6–12 | localization-parity.md |
| 6 | Open-issue backlog of wrong results in shipped features | stability | 45–80 | this file |
| 7 | OCR reads only unaccented Latin | feature | 40–75 | file-format-parity.md |
| 8 | Office export weak, Office import absent | file format | 55–100 | file-format-parity.md |
| 9 | No Preflight; PDF/A partial; PDF/X and PDF/UA absent | standards | 65–115 | pdf-spec-parity.md |
| 10 | Signatures: no PKCS #11, timestamp servers or online revocation | feature, hardware | 40–70 | pdf-spec-parity.md |
| 11 | Accessibility: checker only, no tagging tools | feature | 40–70 | target-app-parity.md |
| 12 | No measured fidelity harness against Acrobat | quality | (in 2) | target-app-parity.md |
| 13 | Performance budgets and lazy loading of very large files | performance | 25–45 | this file |
| 14 | Arabic not mirrored; no Hindi, Indonesian, Korean, Vietnamese | localization | 30–50 | localization-parity.md |
| 15 | Forms: JavaScript object model, actions, submit, XFA depth | feature | 40–75 | pdf-spec-parity.md |
| 16 | UI precision gaps (multi-select move, rulers, accelerators, windows) | UI/UX | 30–60 | ui-parity.md |
| 17 | Certificate security and other protect gaps | feature, spec | 15–30 | pdf-spec-parity.md |
| 18 | Print production tools absent | feature | 25–45 | target-app-parity.md |
| 19 | Preferences mostly missing | UI/UX | 15–25 | ui-parity.md |
| 20 | Scanners, GPU page rendering, pen pressure, Read Out Loud | hardware | 25–50 | hardware-parity.md |
| 21 | Compare: no side-by-side view or filters | feature | 10–20 | target-app-parity.md |
| 22 | PDF 2.0 extras, linearization, Arlington validation | spec | 20–35 | pdf-spec-parity.md |
| 23 | Local AI provider (summarize, ask, alt text, redaction suggestions) | AI | 20–40 | target-app-parity.md |
| 24 | Checklist not diffed against Acrobat's own menus | measurement | 4–8 | target-app-parity.md |
The gaps
2. Rendering is borrowed and its fidelity unmeasured
- Missing: our own renderer (M2:
modelcrate, font engine, DisplayList devices, ADR-0004), or an owner decision to adopt another engine; and any measurement of rendering against Acrobat. - Evidence: pages are drawn by vendored
hayro0.7 with 26 local patches tohayro-interpret, 15 tohayro, 3 tohayro-jbig2and 17 tohayro-syntax(vendor/README.md);lopdfstill backs document inspection. All 7 rendering P0 features arepartial. User reports: TikZ pattern fills drawn wrong (#794), blurry text at 1080p/1440p (#730), fixed zoom sizes differ from Acrobat (#739). An outside author proposes his MIT/Apache renderer as the bridge (#841). - Impact: every page a user sees. Wrong glyphs, shadings or blend modes erode trust faster than any missing feature.
- Fix: first a fidelity harness (gap 12), then the renderer: own devices (150–250 h in the old plan) or an adopted engine plus our own font and text layers.
- Estimate: 110–190 h (includes the harness). Owner decision needed on #841 vs M2. Doc: pdf-spec-parity.md.
3. Editing existing text is fragile on real files
-
Fork progress (2026-10-11): compatible words and subset-font spaces form lines; source fonts lacking a space glyph remain reusable; inline editing previews remove source glyphs on a clone. Aligned visual rows now form mixed-style regions (including matrix-scaled headings), with source-run styles preserved during editing and delete/save/reopen regressions. A private real-file acceptance check and opt-in UI regression supplement synthetic coverage. Embedded sfnt faces now render in the editor, including Mac format-6 subsets adapted in memory through the PDF Unicode map. Source baselines remain stable; draft frames expand/shrink with visible text, and
text_edit_layoutmeasures saved draft bounds without applying them. Page/path-clipped artwork bounds and text-first hit testing prevent large cropped images from blocking text. A separate private four-page regression opens all 73 detected text regions; curve/hole hit testing now evaluates clipping paths and fill rules. A clip the image owns moves with it across nested states and content streams; shared path clips stay where they are. Full matching document fonts complete absent subset glyphs; explicit installed/file font selection, TrueType/OpenType-CFF embedding, disjoint style ranges, marked paragraph boundaries and single-face OpenType shaping/bidi have regression coverage. Actual Chinese keyboard insertion/deletion and save/reopen renders are checked on all four private pages. Legacy non-SFNT previews, mixed-font/style contextual runs, structure-tree fidelity and reliable semantic grouping on every untagged PDF remain open. Replacing one line or paragraph no longer removes a distinct neighbour whose glyph box overlaps (#1316); a second drawing on the same baseline is still replaced. Estimates are unchanged. -
Missing: robust in-place editing of text PdfCraft didn't write: subset fonts without the needed glyphs, CJK and right-to-left text, rotated text, lists, superscript/subscript, keeping structure tags, find and replace in edit mode; vector and object editing; arrange and align.
-
Evidence:
edit.text-editis partial (font reused or Helvetica substituted);edit.rtl-cjk-editing,edit.rotated-text-editing,edit.keep-tags-on-edit,edit.vector-edit,edit.edit-object-toolare planned. Users: #766 (editing Arabic text), #844 (several elements now move together on one page, not across pages), #787 (move images between pages), #791. -
Impact: "Edit PDF" is one of Acrobat Pro's top reasons to buy. Substituting Helvetica changes how a document looks.
-
Estimate: 100–180 h (the longest feature pole, M7). Doc: target-app-parity.md.
5. Chinese UI shows missing-glyph boxes in releases
- Missing: a Simplified Chinese (
Hans) UI face in release builds and a working fallback. - Evidence: #826,
#688,
#728,
#758,
#689 (Flatpak).
AGENTS.md§1.1 bars Noto CJK (Source Han rebranded), so craft-fonts needs another openly licensed Hans face. - Impact: the second-largest language group sees a broken interface although the catalog is 97% translated.
- Estimate: 6–12 h (font sourcing in craft-fonts plus the fallback chain). Doc: localization-parity.md.
6. Open-issue backlog of wrong results in shipped features
- Missing: fixes for the ≈ 13 of ≈ 25 filed reports of features marked
shippedthat give wrong results still open, plus triage of ≈ 220 other open issues. - Evidence: 245 open issues on 2026-10-10. The first batch of
fix(...)reports was fixed by 2026-10-10 (#799, #800, #807, #809, #810, #811, #815, #816, #817, #818, #819, #821). Stamps placed on a rotated page read upright: rubber stamps, natural-size and explicit-rectangle images, and PDF-page stamps (#1398). The rest of the backlog is untriaged. 2026-10-10 (#799, #800, #807, #809, #810, #811, #815, #816, #817, #818, #819, #821). A later batch keeps a cloudy comment flatten cannot draw (#1317), leaves a refused text-box restyle or resize unchanged (#1327), keeps arrow defaults off plain lines (#1302), stops a custom text match on the separator instead of the next glyph (#1315), and states the vertical-text redaction refusal without claiming an overlap (#1340). The rest of the backlog is untriaged. - Impact: every one is a user who lost trust. Crash reports outrank feature work
(
AGENTS.md§4). - Estimate: 45–80 h (≈ 0.2–0.4 h per issue). Doc: this file.
7. OCR reads only unaccented Latin
- Missing: every other script and accented Latin; editable-text output; deskew, rotation, despeckle, background and camera clean-up; MRC compression; pluggable engines; OCR in the browser; scanner input.
- Evidence:
ocr.ocr-languagespartial ("the models read only the Latin alphabet without accents"); 19 of 26 OCR features planned; #744 (Dutch). Acrobat ships on-device recognition for dozens of languages. - Impact: scanned documents are a core Pro workflow outside English.
- Estimate: 40–75 h, partly blocked on openly licensed models. Doc: file-format-parity.md.
8. Office export weak, Office import absent
- Missing: Word export that keeps layout; Excel and PowerPoint export; creating PDFs from Office, HTML, web pages and PostScript; SVG/XML/EPS/PS/JPEG 2000 export.
- Evidence:
create.export-docxpartial; the synthetic invoice regression for #773 now covers absent inferred borders, floating watermark text and per-page section sizes. Exact font matching, vector rules and broader layout fidelity remain incomplete;create.export-xlsx,create.export-pptx,create.from-office,create.from-htmlplanned. - Impact: "Export PDF" and "Create PDF" are two of Acrobat's most used tools.
- Gate: lossy or missing sub-cases of the convert-and-share workflow (partial, not blocking). First beta items: Create PDF from Office (LibreOffice sidecar, 10–20 h) and a Word export that keeps layout (20–35 h).
- Estimate: 55–100 h. Doc: file-format-parity.md.
9. No Preflight; PDF/A partial; PDF/X and PDF/UA absent
- Missing: Preflight (profiles, single checks and fixups, results tree, reports, droplets); PDF/A-1, PDF/A-4 and conformance levels a/u; PDF/X verify and convert; PDF/UA-1/2 verify; PDF/E, PDF/VT; output-intent choice; transparency flattening.
- Evidence: 12 Preflight features and 9 standards features planned;
optimize.pdfa-validate,optimize.pdfa-convertpartial (2b/3b structural rules; CMYK documents get no output intent). Acrobat ships hundreds of built-in Preflight profiles. - Impact: blocks print shops, archives and accessibility compliance work.
- Estimate: 65–115 h. Doc: pdf-spec-parity.md.
10. Signatures: no PKCS #11, timestamp servers or online revocation
- Missing: PKCS #11 tokens and smart cards on macOS and Linux; timestamp-server preferences; fetching OCSP/CRL online for LTV; FieldMDP and locking fields on signing; the OS trust store; EU Trusted Lists; signature graphics and saved appearances; compare signed version; signing in the browser.
- Evidence:
sign.pkcs11,sign.timestamp-servers,sign.field-mdp,sign.os-trust,sign.eutlplanned;sign.pades-bt,sign.ltv,sign.ocsp-crlpartial (caller-supplied evidence). Users ask for Acrobat-like validation (#824, #775, #718). - Impact: government and legal users sign with tokens and need B-LT/B-LTA.
- Estimate: 40–70 h; tokens need hardware to test. Doc: pdf-spec-parity.md.
11. Accessibility: only text-only automatic structure creation
- Missing: auto-tag mixed text, images, tables, lists, links and fields; connect preview heading proposals to Apply; visual Order and Content panels, Reading Order tool, table editor, Make Accessible action, Read Out Loud; full keyboard operation of PdfCraft itself and a screen-reader audit.
- Evidence: all 32 checker rules, figure alt text, tag property and sibling order edits, and
a bounded auto-tag preview exist. Apply writes valid structure and parent-tree links for
text-only files; it refuses mixed content and existing tags;
a11y.keyboard-only(P0) planned,a11y.app-screen-readerpartial. - Impact: most untagged files still need another editor to build their structure; PdfCraft itself is not yet usable without a mouse.
- Estimate: 40–70 h. Doc: target-app-parity.md.
12. No measured fidelity harness against Acrobat
- Missing: side-by-side comparison of rendering, text extraction, form calculation and signature validation against Acrobat on synthetic fixtures; an interop suite that opens every kind of output we write (encrypted ones above all, after #774) in pdf.js, MuPDF and Poppler as oracle processes.
- Evidence: none exists; only text extraction has an oracle (word-F1 0.98 against
pdftotext). Acrobat captures must stay local inplan/acrobat/(clean-room,AGENTS.md§1.1). - Impact: until it exists, every quality number here is a judgement.
- Estimate: counted in gap 2 (≈ 20–30 h of it). Doc: target-app-parity.md.
13. Performance budgets and lazy loading of very large files
- Missing:
misc.performance-budgets(P0) andcore.lazy-loading(P0): open GB files within a memory budget, with budgets checked on Tier-1 platforms. - Evidence: #307 brought a 9,156-page file from > 10 GiB to ≈ 500 MiB inspection, but file-backed input and global memory budgets remain open; blurry fonts at common resolutions (#730). Measured 2026-10-12 on synthetic files (release build, Linux): a 1 GiB file opens at 1.0 GiB peak in 0.7 s, so viewing holds the whole file once; after edits it held two copies and peaked at three (3.1 GiB after five edits), because the previous working file stayed alive while the next was written. Edits now let go of it first: five edits peak at 2.1 GiB (8.5 s, was 16 s). Saving still peaks at three copies (the saved file is assembled in memory beside the working one), and display appearances for comments without one add a copy. A 100,000-page file (28 MB) opens at 403 MiB in 5.5 s and each edit re-inspects it for ≈ 5 s.
- Blocked part: reading a GB file from disk on demand (
ByteSource) needs every reader to take ranges, but thehayrorenderer parses one contiguous buffer (Pdf::new(PdfData)), so it waits on gap 2's renderer decision. Until then the budget is one copy of the file to view and two to edit. - Estimate: 25–45 h. Doc: this file.
14. Arabic not mirrored; no Hindi, Indonesian, Korean, Vietnamese
- Missing: a right-to-left layout (panels, menus, alignment), bidirectional text in the text layout itself (wrapping, typed text); catalogs for Hindi, Indonesian, Korean and Vietnamese (Acrobat ships Korean; it ships Arabic in its Middle East edition; it ships none of the other three).
- Evidence: localization.md §Arabic;
misc.rtl-uiplanned. - Estimate: 30–50 h (Arabic RTL 20–35, four catalogs 10–15 plus review). Doc: localization-parity.md.
15. Forms: JavaScript object model, actions, submit, XFA depth
- Missing: the wider Acrobat JavaScript object model (annotations, layers, dialogs), document actions, the Actions tab triggers that run JavaScript, form submission, the debugger, barcode fields, rich-text values; XFA flattening and complete dynamic-form fidelity.
- Evidence:
form.js-hostpartial,form.document-actions,form.submit-form,edit.action-javascript,form.js-debugger,form.xfa-flattenplanned; XFA layout, FormCalc and data partial. - Estimate: 40–75 h. Doc: pdf-spec-parity.md.
16. UI precision gaps
- Missing: moving several selected objects across pages (same-page moves shipped, #844), single-key tool accelerators, rulers, grids and guides, loupe and dynamic zoom, multiple windows and split view, comment pop-ups that can be moved, connector lines, customisable quick tools; shortcut display and tool-mode bugs (#746, #721), macOS window controls (#789).
- Estimate: 30–60 h. Doc: ui-parity.md.
17. Certificate security and other protect gaps
- Missing: encrypting for certificate recipients (and opening such files), security policies, attachment-only encryption, redaction pattern locales and partial-word redaction, folder redaction, protected view, URL and attachment trust.
- Estimate: 15–30 h. Doc: pdf-spec-parity.md.
18. Print production tools absent
- Missing: Output Preview, separations, total area coverage, overprint preview, ink manager, colour conversion, printer marks, fix hairlines, flattener preview, colour management settings; print as image; PostScript output.
- Evidence: 18 print-production features planned (L area).
- Estimate: 25–45 h (part of the L area's 30–55). Doc: target-app-parity.md.
19. Preferences mostly missing
- Missing: most of Acrobat's twenty or so preference pages (General, Documents, Commenting, Forms, Identity, Signatures, Security, Measuring, Units and guides, Convert, …). Today: Interface language, Documents and view, Identity, Fill & Sign, JavaScript.
- Estimate: 15–25 h. Doc: ui-parity.md.
20. Scanners, GPU page rendering, pen pressure, Read Out Loud
- Missing: TWAIN/WIA/ICA/SANE scanning; GPU-accelerated page rendering (pages are rasterized on the CPU and uploaded); pressure-sensitive ink; platform text-to-speech.
- Estimate: 25–50 h; scanners need hardware. Doc: hardware-parity.md.
21. Compare: no side-by-side view or filters
- Missing: synchronised side-by-side view, filters by change type, page ranges, scanned documents.
- Estimate: 10–20 h. Doc: target-app-parity.md.
22. PDF 2.0 extras, linearization, Arlington validation
- Missing: UTF-8 text strings, associated files (
/AF), document parts, structure namespaces; linearized save (Fast Web View); deterministic save; structural validation against the Arlington model. - Estimate: 20–35 h. Doc: pdf-spec-parity.md.
23. Local AI provider
- Missing: the opt-in provider interface (local model or the user's own endpoint) and the features on it: summarize, ask with page citations, alternate-text and redaction suggestions. Acrobat's AI Assistant is a cloud service and out of scope.
- Estimate: 20–40 h. Doc: target-app-parity.md.
24. Checklist not diffed against Acrobat's own menus
- Missing: a menu and tool listing captured from Acrobat (names only,
plan/acrobat/, never committed) diffed against the checklist, so that features the checklist never listed show up. Also correctmisc.localizationandmisc.installers, which are stillplannedthough both ship. - Estimate: 4–8 h. Doc: target-app-parity.md.
Revision history
| Date | Change | Summary |
|---|---|---|
| 2026-10-12 | minor | Gap 6: rubber stamps, explicit image rectangles and PDF-page stamps read upright on rotated pages (#1398). Estimates unchanged. |
| 2026-10-12 | minor | #1316: replacing a line or paragraph keeps a neighbouring line whose glyph box overlaps. Gap 3 remains. Estimates unchanged. |
| 2026-10-12 | minor | Exclusive image crops resize with their pixels across nested states, intervening operators and content streams; shared clips remain fixed. Synthetic engine/tool regressions and private image save/reopen checks; estimates unchanged. |
| 2026-10-12 | minor | Gap 13: measured large-file memory; edits no longer keep the previous working file while writing the next (peak 3 → 2 copies); file-backed input recorded as blocked on gap 2 |
| 2026-10-11 | minor | Closed gap 4: the web build prints through the browser's print dialog (sheets drawn by PdfCraft at 150–300 dpi, one per printed page); number kept |
| 2026-10-11 | minor | Word invoice failure #773 has synthetic regression coverage; broader Office conversion remains gap 8. |
| 2026-10-11 | minor | Contributor fork: mixed-style visual regions, source-font space reuse and a read-only textless background. Embedded sfnt source faces and Mac subset Unicode mappings keep edit baselines stable; live frames follow Apply/Save geometry as text grows or shrinks. Engine/tool/UI regressions and private all-page checks cover the changes; full matching font import, CFF, range styles, shaping and private Chinese typing checks added; legacy programs and general fidelity remain open; estimates unchanged |
| 2026-10-11 | patch | Gap 2: 23 hayro-interpret and 10 hayro patches after axial and radial shadings became native gradients (backport of hayro 0.8) |
| 2026-10-11 | minor | Closed gap 1 (#774, fixed by #836; numbers kept, its interop suite moved to gap 12); gap 6 lists the fixed #799–#821 batch; gap 3 and 16 updated for #844 (same-page move), #740 (column select) and #759 (1:1 touchpad scrolling) |
| 2026-10-10 | minor | Removed the alpha markers: with the cross-app gate rule, gaps 1 and 8 are partial sub-cases, not blockers; stage alpha |
| 2026-10-10 | minor | Marked the alpha blockers (gap 1 and the Office part of gap 8) after the core-workflow gate put the stage at pre-alpha |
| 2026-10-10 | major | Created. Ranked 24 gaps from the 2026-10-10 re-measure, the open GitHub issues and the former ROADMAP.md §Where we're lacking and where we're going (renderer, hardening, fidelity, editing, Pro workflows, 1.0 polish), which this file replaces |