mirror of
https://github.com/storytold/pdfcraft.git
synced 2026-11-11 00:41:21 +00:00
The web build downloads the OCR models the first time Recognize Text (or Edit on a scanned page) needs them, installs the engine, and reads pages in up to two Web Workers (apps/pdfcraft-ocr-worker) built with WebAssembly SIMD, so the page keeps responding. The page prepares each page and sends its image to an idle worker, which runs ocrs and sends the lines back. Where no worker can start, the page reads with the installed engine. Answers go back to the run that sent the page (ocr_route), so a single run and a batch can overlap. Recognize Text in Multiple Files on the web keeps main's skipped-files bucket, low-confidence notes and cancel between files. Files chosen before the models are in wait for them. A scan Edit finds while no engine can read it waits for the models instead of counting as no scan. Trunk builds the worker beside the app; `cargo xtask web-worker-link` hashes its files and names it in index.html. The web zip ships the models in models/.
112 lines
5.4 KiB
TOML
112 lines
5.4 KiB
TOML
[package]
|
||
name = "pdfcraft-ui-egui"
|
||
description = "The egui shell of PdfCraft"
|
||
version.workspace = true
|
||
edition.workspace = true
|
||
license.workspace = true
|
||
rust-version = "1.95"
|
||
|
||
[lints]
|
||
workspace = true
|
||
|
||
[dependencies]
|
||
craft-ui = { workspace = true }
|
||
# The menus: native on macOS, an egui bar elsewhere, from one definition (menus.rs).
|
||
craft-menu = { workspace = true }
|
||
craft-keymap = { workspace = true }
|
||
# Interface translations over the embedded craft-i18n catalogs (`build.rs`, `src/i18n.rs`).
|
||
craft-i18n = { workspace = true }
|
||
# Quit from the menus asks the window to close, so the unsaved-changes check runs; on macOS a window
|
||
# close also quits through `terminate:` (the Touch Bar crash, #1136).
|
||
craft-quit = { workspace = true, features = ["egui"] }
|
||
pdfcraft-fonts = { workspace = true }
|
||
pdfcraft-engine = { workspace = true }
|
||
pdfcraft-cos = { workspace = true }
|
||
pdfcraft-content = { workspace = true }
|
||
pdfcraft-ocr = { workspace = true }
|
||
pdfcraft-render = { workspace = true }
|
||
pdfcraft-model = { workspace = true }
|
||
pdfcraft-platform = { workspace = true }
|
||
egui = { workspace = true, features = ["bytemuck", "default_fonts", "monochrome_emoji_fonts"] }
|
||
egui_extras = { workspace = true }
|
||
eframe = { workspace = true, features = ["default_fonts", "wgpu", "accesskit", "persistence", "links", "clipboard"] }
|
||
serde = { workspace = true }
|
||
serde_json = { workspace = true }
|
||
log = { workspace = true }
|
||
# UTC/calendar display (combine modified-time stamp, the form date picker) goes through chrono
|
||
# (no hand-rolled calendar code); std-only, so it stays wasm-safe.
|
||
chrono = { workspace = true }
|
||
# Monotonic deadlines for work that runs in `logic` with no UI pass (native and web).
|
||
web-time = { workspace = true }
|
||
# Hands rendered rasters to egui as its pixels, without copying; already in the tree through egui and wgpu.
|
||
bytemuck = { version = "1", features = ["extern_crate_alloc"] }
|
||
|
||
rfd = { workspace = true }
|
||
png = "0.18"
|
||
base64 = "0.23"
|
||
# Unicode bidi paragraph segmentation for right-to-left comment wrapping; egui 0.37's epaint owns
|
||
# display reordering. Already in the tree through egui’s epaint.
|
||
unicode-bidi = "0.3"
|
||
# Checks that an installed fallback font parses and has the glyphs, and reads the vertical metrics
|
||
# that put fallback faces on the interface's baseline (#1676); the same skrifa egui uses.
|
||
skrifa = "0.44"
|
||
|
||
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
||
craft-update = { workspace = true }
|
||
# Control-channel tokens.
|
||
getrandom = "0.4"
|
||
# Create ▸ Clipboard (images; already in the tree through egui-winit).
|
||
arboard = { version = "3.6", default-features = false, features = ["image-data"] }
|
||
# Waits for native file pickers off the UI thread (already in the tree through wgpu).
|
||
pollster = "1.0"
|
||
|
||
[target.'cfg(all(unix, not(target_os = "macos"), not(target_arch = "wasm32")))'.dependencies]
|
||
# Discover configured font directories without linking libfontconfig or running a subprocess.
|
||
fontconfig-parser = "0.5.8"
|
||
|
||
[target.'cfg(target_os = "macos")'.dependencies]
|
||
# Safe AppKit calls for drag coordinates and repairing an existing per-file PDFCraft binding.
|
||
# The Objective-C wrappers and block support are already in the tree through arboard and rfd.
|
||
objc2 = "0.6"
|
||
objc2-app-kit = { version = "0.3", default-features = false, features = ["std", "NSEvent", "NSScreen", "NSWorkspace", "block2"] }
|
||
objc2-foundation = { version = "0.3", default-features = false, features = ["std", "NSArray", "NSGeometry", "NSBundle", "NSURL", "NSString", "NSError"] }
|
||
block2 = "0.6"
|
||
plist = "1.10"
|
||
# A plain fsync where a volume refuses the full flush `sync_all` asks for (SMB, FUSE); already in
|
||
# the tree through pdfcraft-cli.
|
||
rustix = { version = "1", features = ["fs"] }
|
||
|
||
[target.'cfg(windows)'.dependencies]
|
||
# Auto interface language: the Windows display language, without starting a process.
|
||
sys-locale = "0.3"
|
||
# Region ▸ Measurement system for the default Units, read from the registry without starting reg.exe;
|
||
# where the pointer is while files are dragged over the window (winit doesn't say).
|
||
winsafe = { version = "0.0.29", default-features = false, features = ["advapi", "user"] }
|
||
|
||
[target.'cfg(target_arch = "wasm32")'.dependencies]
|
||
rfd = { workspace = true, features = ["file-handle-inner"] }
|
||
wasm-bindgen-futures = "0.4"
|
||
wasm-bindgen = "0.2"
|
||
js-sys = "0.3"
|
||
web-sys = { version = "0.3", features = ["Window", "Document", "Element", "HtmlElement", "HtmlAnchorElement", "Blob", "BlobPropertyBag", "Url", "HtmlIFrameElement", "HtmlImageElement", "HtmlCollection", "Node", "EventTarget", "Navigator", "RequestCache", "RequestInit", "Response", "Worker", "WorkerOptions", "WorkerType", "MessageEvent"] }
|
||
|
||
[dev-dependencies]
|
||
craft-update = { workspace = true }
|
||
pdfcraft-xfa = { workspace = true }
|
||
egui_kittest = { workspace = true, features = ["eframe", "wgpu"] }
|
||
# Tests draw PdfCraft text without a system provider: the bundled and monochrome emoji faces must
|
||
# be enabled on the test graph itself (a dependency's dev-features do not propagate).
|
||
egui = { workspace = true, features = ["default_fonts", "monochrome_emoji_fonts"] }
|
||
image = { version = "0.25", default-features = false, features = ["png"] }
|
||
# Glyph-coverage test of the interface fonts; the same skrifa pdfcraft-fonts already uses.
|
||
skrifa = "0.44"
|
||
proptest = { workspace = true }
|
||
|
||
[build-dependencies]
|
||
serde_json = { workspace = true }
|
||
toml = "1"
|
||
|
||
[target.'cfg(target_os = "macos")'.dev-dependencies]
|
||
# Only synthetic attribute fixtures use xattr; product reads/writes use rustix.
|
||
xattr = "1.6"
|