Files
pdfcraft/docs/gaps.md
T
Mawfyy 33c14e07cf Print: Windows lists its printers and spools jobs (#847)
* Print: Windows lists its printers and spools jobs (#756)

The Print dialog's printer list comes from Win32_Printer through PowerShell's
CIM (wmic is gone from Windows 11), and jobs are spooled by the embedded
windows_print.ps1: the in-box Windows.Data.Pdf renders each sheet at the
printer's own resolution and System.Drawing.Printing carries copies,
collation, duplex and colour as the job's settings. Both run through
powershell, so the Rust code touches no Win32 API. Fixes #756, with the
printer-not-showing duplicates #160, #244, #293, #465 and #644; CIM approach
from #452. On CI a paused Generic / Text Only test printer catches the job in
its queue; a parser test keeps the script valid PowerShell.

* Print: fix the Windows await helper and render the job on CI (dry run)

Real-machine testing found [System.WindowsRuntimeSystemExtensions]::GetMethods()
failing with 'does not contain a method named GetMethods': GetMethods is an
instance method of [Type], so it is called with '.', the form the canonical
WinRT-await snippets use, not '::'. The first CI run missed it because the
end-to-end test skipped silently when the runner refused the test printer, so
the script had never actually run.

The script now honours PDFCRAFT_PRINT_DRYRUN=1: render every sheet with
Windows.Data.Pdf to PNGs in the temporary folder and print nothing. The test
runs that half unconditionally, so CI exercises the whole WinRT path —
projection, await helpers, render — on any machine, while the paused-printer
half stays best-effort and prints why it skipped. Win32_Printer enumeration
asks only for Name and Default, so a machine with nine printers waits less.

* Tests: the find-options wait in the viewer test is a deadline too

4280f83 converted the frame-count waits in this test to deadlines after the
same 12-of-15 race under a full workspace test run, but left the first wait —
the one for the 'page' matches — on the old 60-frame loop, and it flaked the
same way on PR #847's CI. Same fix: wait up to 20 s for the 15 matches, then
assert.
2026-10-11 00:23:35 -04:00

308 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Where PdfCraft falls short of Acrobat Pro
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-10 · **Change:** minor (alpha markers removed after the gate was re-judged: no gap blocks alpha) · **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](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](roadmap.md#alpha-gate); gaps 1 and 8 hold the convert-and-share
workflow's partial sub-cases and are the first beta items.
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](../ROADMAP.md) progress log and
update the numbers.
## Summary
| # | Gap | Kind | Hours | Doc |
|---|---|---|---|---|
| 1 | Encrypted files we write don't open in Acrobat | file format | 8–15 | [file-format-parity.md](file-format-parity.md) |
| 2 | Rendering is borrowed and its fidelity unmeasured | feature, spec | 110–190 | [pdf-spec-parity.md](pdf-spec-parity.md) |
| 3 | Editing existing text is fragile on real files | feature | 100–180 | [target-app-parity.md](target-app-parity.md) |
| 4 | No printing on the web | feature, platform | 15–30 | [hardware-parity.md](hardware-parity.md) |
| 5 | Chinese UI shows missing-glyph boxes in releases | localization | 6–12 | [localization-parity.md](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](file-format-parity.md) |
| 8 | Office export weak, Office import absent | file format | 55–100 | [file-format-parity.md](file-format-parity.md) |
| 9 | No Preflight; PDF/A partial; PDF/X and PDF/UA absent | standards | 65–115 | [pdf-spec-parity.md](pdf-spec-parity.md) |
| 10 | Signatures: no PKCS #11, timestamp servers or online revocation | feature, hardware | 40–70 | [pdf-spec-parity.md](pdf-spec-parity.md) |
| 11 | Accessibility: checker only, no tagging tools | feature | 40–70 | [target-app-parity.md](target-app-parity.md) |
| 12 | No measured fidelity harness against Acrobat | quality | (in 2) | [target-app-parity.md](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](localization-parity.md) |
| 15 | Forms: JavaScript object model, actions, submit, XFA depth | feature | 40–75 | [pdf-spec-parity.md](pdf-spec-parity.md) |
| 16 | UI precision gaps (multi-select move, rulers, accelerators, windows) | UI/UX | 30–60 | [ui-parity.md](ui-parity.md) |
| 17 | Certificate security and other protect gaps | feature, spec | 15–30 | [pdf-spec-parity.md](pdf-spec-parity.md) |
| 18 | Print production tools absent | feature | 25–45 | [target-app-parity.md](target-app-parity.md) |
| 19 | Preferences mostly missing | UI/UX | 15–25 | [ui-parity.md](ui-parity.md) |
| 20 | Scanners, GPU page rendering, pen pressure, Read Out Loud | hardware | 25–50 | [hardware-parity.md](hardware-parity.md) |
| 21 | Compare: no side-by-side view or filters | feature | 10–20 | [target-app-parity.md](target-app-parity.md) |
| 22 | PDF 2.0 extras, linearization, Arlington validation | spec | 20–35 | [pdf-spec-parity.md](pdf-spec-parity.md) |
| 23 | Local AI provider (summarize, ask, alt text, redaction suggestions) | AI | 20–40 | [target-app-parity.md](target-app-parity.md) |
| 24 | Checklist not diffed against Acrobat's own menus | measurement | 4–8 | [target-app-parity.md](target-app-parity.md) |
## The gaps
### 1. Encrypted files we write don't open in Acrobat
- **Missing:** interoperable encryption output. A document protected with a password in PdfCraft
opens in PdfCraft, SumatraPDF, PDF24 and LibreOffice, but Adobe Reader, Acrobat and PDF-XChange
report it as damaged.
- **Evidence:** [#774](https://github.com/storytold/pdfcraft/issues/774) (2026-10-10, confirmed by a
second user). Our encryption tests round-trip through our own reader and `qpdf --check`, which
is more lenient than Acrobat.
- **Impact:** blocking. Passwords are the most common reason to touch security; a file a recipient
can't open is data loss in practice. Partial sub-case of the convert-and-share gate row (unencrypted sharing works), so not an alpha blocker; the first beta item.
- **Fix:** find the divergence (likely `/Encrypt` dictionary or R6 `/Perms`/`/OE`/`/UE` details, or
a string/stream encrypted that must not be), then add an interop suite that opens every kind of
output we write in other readers (pdf.js, MuPDF and Poppler as oracle processes; Acrobat by hand
on the owner's Mac).
- **Estimate:** 8–15 h. **Doc:** [file-format-parity.md](file-format-parity.md).
### 2. Rendering is borrowed and its fidelity unmeasured
- **Missing:** our own renderer (M2: `model` crate, 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 `hayro` 0.7 with 22 local patches to `hayro-interpret`,
9 to `hayro`, 3 to `hayro-jbig2` and 13 to `hayro-syntax` (`vendor/README.md`); `lopdf` still
backs document inspection. All 7 rendering P0 features are `partial`. User reports: TikZ pattern
fills drawn wrong ([#794](https://github.com/storytold/pdfcraft/issues/794)), blurry text at
1080p/1440p ([#730](https://github.com/storytold/pdfcraft/issues/730)), fixed zoom sizes differ
from Acrobat ([#739](https://github.com/storytold/pdfcraft/issues/739)). An outside author
proposes his MIT/Apache renderer as the bridge
([#841](https://github.com/storytold/pdfcraft/issues/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](pdf-spec-parity.md).
### 3. Editing existing text is fragile on real files
- **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-edit` is 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-tool` are planned. Users:
[#766](https://github.com/storytold/pdfcraft/issues/766) (editing Arabic text),
[#844](https://github.com/storytold/pdfcraft/issues/844) (can't move several elements),
[#787](https://github.com/storytold/pdfcraft/issues/787) (move images between pages),
[#791](https://github.com/storytold/pdfcraft/issues/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](target-app-parity.md).
### 4. No printing on the web
- **Missing:** browser printing.
- **Evidence:** the web build has no spooler: off Windows and unix, `spool::submit` reports that
printing to a printer isn't available and only the print-ready PDF can be saved.
`crates/print/README.md`: "Not yet: the web spooler".
- **Impact:** the web build cannot send a job to a printer; printing is a P0 workflow. Printing on
Windows shipped with [#756](https://github.com/storytold/pdfcraft/issues/756).
- **Estimate:** 15–30 h. **Doc:** [hardware-parity.md](hardware-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](https://github.com/storytold/pdfcraft/issues/826),
[#688](https://github.com/storytold/pdfcraft/issues/688),
[#728](https://github.com/storytold/pdfcraft/issues/728),
[#758](https://github.com/storytold/pdfcraft/issues/758),
[#689](https://github.com/storytold/pdfcraft/issues/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](localization-parity.md).
### 6. Open-issue backlog of wrong results in shipped features
- **Missing:** fixes for ≈ 25 filed reports of features marked `shipped` that give wrong results,
plus triage of ≈ 220 other open issues.
- **Evidence:** 245 open issues on 2026-10-10, e.g. XFDF exchange loses polygon vertices and turns
callouts into text boxes (#809, #819), page deletion leaves null destinations (#817, #821),
automatic URL linking panics on Unicode text (#816), autosave skips new unsaved PDFs (#815),
saving ignores typing in an open paragraph (#811), automation reports success after replacing an
earlier result (#799, #800), Shift-Cmd-G goes forward (#810).
- **Impact:** every one is a user who lost trust. #816 is a crash, which outranks 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-languages` partial ("the models read only the Latin alphabet without
accents"); 19 of 26 OCR features planned; [#744](https://github.com/storytold/pdfcraft/issues/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](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-docx` partial; [#773](https://github.com/storytold/pdfcraft/issues/773)
(an invoice converted to Word loses its layout, gains table borders and duplicates pages);
`create.export-xlsx`, `create.export-pptx`, `create.from-office`, `create.from-html` planned.
- **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](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-convert` partial (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](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.eutl` planned; `sign.pades-bt`, `sign.ltv`, `sign.ocsp-crl` partial (caller-supplied
evidence). Users ask for Acrobat-like validation
([#824](https://github.com/storytold/pdfcraft/issues/824),
[#775](https://github.com/storytold/pdfcraft/issues/775),
[#718](https://github.com/storytold/pdfcraft/issues/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](pdf-spec-parity.md).
### 11. Accessibility: checker only, no tagging tools
- **Missing:** autotag (document and fields), Tags, Order and Content panels, tag properties,
Reading Order tool, artifact marking, table editor, role map, Make Accessible action, Read Out
Loud; full keyboard operation of PdfCraft itself and a screen-reader audit.
- **Evidence:** all 32 checker rules shipped, but 21 tagging and reading features planned;
`a11y.keyboard-only` (P0) planned, `a11y.app-screen-reader` partial.
- **Impact:** remediation work is impossible; PdfCraft itself is not yet usable without a mouse.
- **Estimate:** 40–70 h. **Doc:** [target-app-parity.md](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.
- **Evidence:** none exists; only text extraction has an oracle (word-F1 0.98 against `pdftotext`).
Acrobat captures must stay local in `plan/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](target-app-parity.md).
### 13. Performance budgets and lazy loading of very large files
- **Missing:** `misc.performance-budgets` (P0) and `core.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).
- **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](localization.md) §Arabic; `misc.rtl-ui` planned.
- **Estimate:** 30–50 h (Arabic RTL 20–35, four catalogs 10–15 plus review). **Doc:**
[localization-parity.md](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-host` partial, `form.document-actions`, `form.submit-form`,
`edit.action-javascript`, `form.js-debugger`, `form.xfa-flatten` planned; XFA layout, FormCalc
and data partial.
- **Estimate:** 40–75 h. **Doc:** [pdf-spec-parity.md](pdf-spec-parity.md).
### 16. UI precision gaps
- **Missing:** moving several selected objects together (#844), nudging with arrow keys, 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, column text selection
(#740); shortcut display and touchpad scrolling bugs (#746, #759, #721), macOS window controls
(#789).
- **Estimate:** 30–60 h. **Doc:** [ui-parity.md](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](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](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](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](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](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](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](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 correct `misc.localization` and `misc.installers`, which are still `planned` though both
ship.
- **Estimate:** 4–8 h. **Doc:** [target-app-parity.md](target-app-parity.md).
## Revision history
| Date | Change | Summary |
|---|---|---|
| 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 |