A modern, open-source PDF workbench for Windows. Tauri v2 + React, with an embedded Python engine and vendored upstream Ghostscript (AGPL-3.0). No ads, no telemetry, no upsells. WebView2 prerequisite (ships with Windows 10/11).
A full-featured PDF workbench with a familiar user interface: a menu bar, customizable toolbar, and document tabs over a continuous reading view; a navigation pane on the left; twenty-one task-oriented tools that open in a resizable pane on the right — your document never leaves the screen; and a status bar carrying page, zoom, and any pending work. The keymap is verified against the industry-standard editor's published shortcut table, so your muscle memory just works. Every whole-file operation also ships as a CLI subcommand with identical results.
- Reading view — continuous, virtualized scroll; smooth with 1,000-page documents. Real text selection and copy (select text to highlight, underline, strike out, or link it), zoom presets (
Ctrl+0/1/2), go-to-page (Ctrl+Shift+N), Rotate View (Ctrl+Shift+Plus/Minus— the page turns, the file doesn't), Hand/Select with Space as a temporary hand, two-page spreads with a cover option, Reading Mode (Ctrl+H), and full-screen Presentation (F5) - A workbench that never hides your document — tools open in a resizable side pane beside the page (toggle it from the toolbar or
Shift+F4; it narrows to an index of tool names and widens for the tool you pick), a status bar carries page/zoom/view controls and any pending work, every open file is a tab, and the toolbar is customizable (per-button show/hide). A context-sensitive Properties Bar (Ctrl+E) shows the selected annotation's details - Organize view — every open file as a strip of live page thumbnails; drag pages within and across documents, multi-select, whole-document merge, drop files to import their pages at that spot. All of it staged in memory, committed atomically, undoable
- Navigation pane (
F4) — Pages (thumbnails with drag-reorder), Bookmarks (with editing), Search, Signatures - Find & Search — a universal search box in the toolbar that answers with both tools and document text in one list (type a tool's name to launch it, or a phrase to jump to the page), plus floating find (
Ctrl+F,F3/Ctrl+Gstepping) and a workspace-wide Search panel (Ctrl+Shift+F) with regex, case and whole-word modes and an on-disk scope. Scanned pages become searchable (and selectable) via OCR - Batch OCR (Tools ▸ Batch OCR Folder…) — point it at a folder and get a mirrored copy of the whole tree with every scanned PDF made searchable; already-searchable files copy through unchanged, problem files are reported, and the originals are never touched. Fully offline, like all OCR here
Organize Pages · Comment (highlights, text boxes, ink, stamps — notes and recoloring on each; existing PDF annotations import as editable; and one list of every comment in the document — jump to it, edit its note, recolour or delete it, or clear them all) · Edit (select an image, a paragraph, or a line of text on the page — move, resize, rotate, crop, dim, replace, extract or delete images and place new ones; rewrite text in place in the document's own font with live validation, kerned like a typesetter; edit whole paragraphs with true rewrap, split and merge them, restyle size, colour, family, bold and italic — plus real OpenType small caps and stylistic alternates — a whole paragraph or just a selected range; select and move, resize, rotate, recolour, re-width or delete the drawn vector shapes (lines, boxes, rules) on the page, even inside groups; add brand-new text boxes) · Fill & Sign (AcroForm fill on the page, digital signatures: verify with your own trust anchors, sign with PFX/PEM incl. PAdES baseline-through-LTA profiles with timestamping, visible stamps, sign-into-field, sign in place with counter-signing) · Prepare Form (draw new fields on the page; view and edit the document's JavaScript) · Redact (true content removal) · Scan & OCR · Compare (text + visual diff) · Protect (AES-256 encrypt/decrypt) · Optimize (compress, grayscale, convert to CMYK, linearize, PDF/A, PDF version) · Repair (three tiers up to per-page salvage) · Watermark · Header & Footer (six positions, page-number and auto-incrementing Bates tokens) · Crop & Page Boxes (crop/bleed/trim/art) · Page Labels (front matter as i, ii, iii; prefixed appendices) · Attachments (embed, extract, remove) · Layers (show/hide optional content) · Accessibility (checker, structure-tag editor, reading-order panel) · Preflight (fonts, colour, and transparency checks for print) · Links (list, retarget, or remove link regions — and create them from selected text) · Export (text extraction, Word/RTF/ODT/HTML via a bundled converter, page images as PNG/JPEG/TIFF)
- Print (
Ctrl+P) — printer picker, page range, copies, fit/actual, through the bundled Ghostscript to any Windows printer - Create PDF from PostScript — convert
.ps/.epsto PDF with quality presets (Smallest / eBook / Print / Press), the classic distilling job, done by the bundled Ghostscript - Document Properties (
Ctrl+D), categorized Preferences (Ctrl+K) - Insert pages from a file (
Ctrl+Shift+I) or blank (Ctrl+Shift+T), delete (Ctrl+Shift+D), rotate (Ctrl+Shift+R), split, extract .pdfxsupport — Alexandros Gounis's open format: several documents saved as one ordinary, fully-compatible PDF that reopens as separate strips- Multi-level undo/redo across staged page edits and applied operations; one file is one document no matter how its path is spelled
NSIS installer with silent modes and enterprise policy, file associations, Explorer context menu, system tray, start-with-Windows, auto-update, light/dark/system themes with Windows accent + Mica, WCAG 2.1 AA, full keyboard navigation (single-key tool accelerators available, off by default).
When invoked with a subcommand, Open PDF Studio runs headless — no window, same engine. openpdfstudio.exe /? shows the full list.
# Compress
openpdfstudio compress input.pdf -o compressed.pdf --quality ebook
# Merge / split / rotate / delete
openpdfstudio merge a.pdf b.pdf c.pdf -o merged.pdf
openpdfstudio split input.pdf -o output_dir/ --ranges "1-3,5-7"
openpdfstudio rotate input.pdf -o rotated.pdf --angle 90 --pages 1,3,5
openpdfstudio delete input.pdf -o trimmed.pdf --pages 3,7
# Print — to any installed Windows printer, via the bundled Ghostscript
openpdfstudio printers # list printers (JSON, with the default)
openpdfstudio print input.pdf --printer "Brother HL-L2400D" --pages 1-3 --copies 2 --fit fit
# Create PDF from PostScript/EPS (distill)
openpdfstudio distill input.ps -o output.pdf --preset printer
# Encrypt / decrypt
openpdfstudio encrypt input.pdf -o encrypted.pdf --password secret
openpdfstudio decrypt encrypted.pdf -o decrypted.pdf --password secret
# PDF/A, optimize, grayscale, version
openpdfstudio pdfa input.pdf -o archive.pdf --level 2b
openpdfstudio optimize input.pdf -o optimized.pdf --linearize --strip-metadata --compress-streams
openpdfstudio grayscale input.pdf -o grayscale.pdf
openpdfstudio pdf-version input.pdf -o out.pdf --version 1.7
# Text, metadata
openpdfstudio extract-text input.pdf --pages 1,2,3
openpdfstudio metadata input.pdf --title "New Title" -o updated.pdf
openpdfstudio metadata input.pdf --strip -o stripped.pdf
# Forms — list fields (JSON), or fill (± flatten)
openpdfstudio forms input.pdf
openpdfstudio forms input.pdf -o filled.pdf --set name=Ada --set subscribe=true --flatten
# Bookmarks — read (JSON) or replace
openpdfstudio outline input.pdf
openpdfstudio outline input.pdf -o out.pdf --from-json bookmarks.json
# Signatures
openpdfstudio verify-signatures signed.pdf
openpdfstudio sign input.pdf -o signed.pdf --pfx signer.pfx --password pass
openpdfstudio sign input.pdf -o signed.pdf --pfx signer.pfx --password pass --pades b-lta --tsa-url http://timestamp.example/tsa
openpdfstudio verify-signatures signed.pdf --trust-root my-ca.pem
openpdfstudio generate-signer -o me.pfx --cn "My Name" --password pass
# Compare, redact, watermark, repair tiers
openpdfstudio compare a.pdf b.pdf
openpdfstudio redact input.pdf -o redacted.pdf --page 1 --rect 100,100,300,150
openpdfstudio watermark input.pdf -o marked.pdf --text "CONFIDENTIAL"
openpdfstudio repair broken.pdf -o repaired.pdf
openpdfstudio rebuild broken.pdf -o rebuilt.pdf
openpdfstudio recover broken.pdf -o recovered.pdf
openpdfstudio check input.pdf
# Export — Office/web formats (bundled converter) and page images
openpdfstudio export input.pdf -o output.docx --format docx
openpdfstudio export-images input.pdf -o page.png --format png --dpi 300 --pages 1-5
# Pages — headers/footers/Bates, page boxes, page-number labels
openpdfstudio header-footer input.pdf -o numbered.pdf --bc "Page {page} of {pages}"
openpdfstudio header-footer input.pdf -o stamped.pdf --br "BATES-{bates}" --bates-start 1000
openpdfstudio page-box input.pdf -o cropped.pdf --box crop --top 36 --bottom 36 --left 36 --right 36
openpdfstudio page-labels input.pdf -o labeled.pdf --range "1:r" --range "5:D"
# Attachments, layers, links
openpdfstudio attach-list input.pdf
openpdfstudio attach-add input.pdf -o out.pdf --source data.xlsx
openpdfstudio layer-list plans.pdf
openpdfstudio layer-set plans.pdf -o out.pdf --index 2 # hide layer 2
openpdfstudio layer-set plans.pdf -o out.pdf --index 2 --show # show it again
openpdfstudio link-list input.pdf
openpdfstudio link-add input.pdf -o out.pdf --page 1 --rect 100 700 300 715 --url https://example.com
# Accessibility — checker, structure tags, and print preflight
openpdfstudio accessibility input.pdf
openpdfstudio tags-list input.pdf
openpdfstudio tags-set input.pdf -o out.pdf --path 0,0 --type H1 --alt "Chart of quarterly totals"
openpdfstudio preflight input.pdf
# Batch — process every PDF in a directory
openpdfstudio batch C:\pdfs\ -o C:\out\ compress --quality ebookResults are JSON on stdout. Progress and errors go to stderr. Exit codes: 0 = success, 1 = operation error, 2 = bad args.
# Silent install (per-machine, auto-update disabled)
"Open PDF Studio_X.Y.Z_x64-setup.exe" /S
# Silent uninstall (keeps user data for redeployment)
"C:\Program Files\Open PDF Studio\uninstall.exe" /S
# Silent uninstall (removes all user data)
"C:\Program Files\Open PDF Studio\uninstall.exe" /S /removeuserdataAuto-update can be disabled machine-wide via HKLM\SOFTWARE\Open PDF Studio\DisableAutoUpdate = 1 (set automatically by the silent installer). Everything the app needs is inside the installer — the Python runtime, Ghostscript, the LibreOffice export runtime, the edit fonts, and the offline OCR language data — so there is no second deployment step and no machine needs its own copy of any of them. Third-party licence notices are installed alongside the app and open from Settings ▸ Updates & Licenses. The installer's own /? dialog documents all switches:
End users: WebView2 (included with Windows 10/11 via Edge). The interactive installer downloads the bootstrapper if missing.
Note on unsigned releases: Open PDF Studio is distributed unsigned (no Authenticode code-signing certificate). On first run, Windows SmartScreen may show a blue "Windows protected your PC — Unknown publisher" prompt. This is expected for unsigned open-source software, not a sign of tampering. To proceed, click More info → Run anyway. Builds are published on the releases page.
Developers:
| Requirement | Version |
|---|---|
| Node.js | 22 LTS (or 20.19+) |
| Rust | Stable toolchain |
| Ghostscript | None — vendored automatically by bundle-ghostscript.ps1 |
Python 3.14 is embedded automatically — no system install needed.
# Install Node.js dependencies
npm install
# Set up embedded Python (first time only)
powershell -ExecutionPolicy Bypass -File scripts\setup-python-embed.ps1
# Start development (Tauri dev server — launches Vite + Rust backend)
npm run dev# Full build — bundles Python, GS, builds Rust backend, produces NSIS installer
npm run packageThis runs, in order: scripts/setup-python-embed.ps1 (downloads embedded Python 3.14 + pip-installs the hash-pinned engine deps), scripts/bundle-ghostscript.ps1 (downloads the official upstream Ghostscript release, verifies its checksum, and vendors it), scripts/sync-edit-fonts.ps1 (the hash-pinned Liberation + Libertinus faces and their OFL licence texts), and scripts/bundle-libreoffice.ps1 (the pinned, checksum-verified export runtime — copies a local install if you have one, else downloads it) — all into resources/ — then cargo tauri build (compiles Rust, bundles the WebView2 frontend, produces the NSIS installer). Every one of those four is a tauri.conf.json resource, so all four must have run before a build can succeed.
Output: src-tauri/target/release/bundle/nsis/Open PDF Studio_X.Y.Z_x64-setup.exe
Individual steps (if needed):
| Command | What it does |
|---|---|
npm run prepackage |
Vendors all four runtimes — embedded Python, Ghostscript, edit fonts, LibreOffice (no compile) |
npm run build:renderer |
Vite production build of the React frontend |
npm run build |
cargo tauri build — Rust compile + NSIS installer (assumes prepackage already ran) |
npm run package |
All of the above in sequence |
+-------------------+ invoke() +------------------+ JSON-RPC +-------------------+
| React UI | <----------------> | Rust Backend | <--(stdin/stdout)--> | Python Engine |
| (WebView2) | | (Tauri v2) | | (pikepdf + GS) |
+-------------------+ +------------------+ +-------------------+
| | |
v v v
WebView2 (Edge) Tauri commands Embedded Python 3.14
- Menu bar / toolbar / tabs - File dialogs + path canon - 80+ operation handlers
- Reading view (virtualized) - Printer enumeration - pikepdf (structural)
- Organize board (page strips) - Sidecar management - pdfminer.six (text)
- Navigation pane - System tray - pyHanko (signatures)
- Tool dock (21 tools) + status bar - Single instance - Ghostscript (upstream:
- Command registry + keymap - Auto-updater compress, PDF/A, print,
- pdf.js render + text layer - Registry policy check distill)
Frontend: Tauri v2 (WebView2), React 19, TailwindCSS, pdf.js, pdf-lib, tesseract.js
Backend: Rust (Tauri commands) + Python 3.14 (embedded), pikepdf, pdfminer.six, pyHanko, Ghostscript (upstream, AGPL-3.0)
IPC: Tauri invoke() (JS→Rust), JSON-RPC 2.0 over stdin/stdout (Rust→Python)
Every capability is built on open source, each component doing the job it is best known for. AGPL tools stay at arm's length — separate processes, never linked — so the app's own code remains MIT. Full texts and exact versions: THIRD-PARTY-LICENSES.md.
| Feature | Powered by | License |
|---|---|---|
| Page rendering, selectable text, search display | pdf.js | Apache-2.0 |
Page assembly & .pdfx, annotation authoring, form fill & field creation |
pdf-lib | MIT |
| Structural operations (merge, split, rotate, delete), redaction, in-place text & paragraph editing, watermarks, encryption, repair tiers 1/3 | pikepdf / QPDF | MPL-2.0 / Apache-2.0 |
| Text extraction, font metrics & encodings for the text editor | pdfminer.six | MIT |
| Digital signatures — signing and verification | pyHanko + cryptography | MIT / Apache-2.0+BSD |
| OCR — single documents and batch folder mirroring | Tesseract via tesseract.js | Apache-2.0 |
| Compress, grayscale, PDF/A, print rasterization, page-image export, repair tier 2, Create PDF from PostScript (distilling) | Ghostscript (vendored upstream, separate process) | AGPL-3.0 |
| Export to Word / RTF / ODT / HTML | LibreOffice (bundled, separate process) | MPL-2.0 |
| Compatible-font fallback and OpenType features for text editing | Liberation + Libertinus faces, fontTools | SIL OFL 1.1 / MIT |
| Window shell, native dialogs, IPC, updater | Tauri v2 + Rust crates | MIT / Apache-2.0 |
openpdfstudio/
├── src-tauri/ # Tauri v2 Rust backend
│ ├── src/
│ │ ├── lib.rs # App setup, tray, single-instance, events
│ │ ├── cli.rs # CLI arg parsing, headless engine, batch mode
│ │ ├── commands.rs # IPC command handlers (dialogs, paths, printers…)
│ │ ├── printers.rs # winspool printer enumeration
│ │ └── engine.rs # Python sidecar lifecycle
│ ├── tauri.conf.json # Tauri config, NSIS, resources, plugins
│ └── nsis-hooks.nsh # Context menu, registry, enterprise policy
├── src/
│ ├── renderer/ # React frontend (rendered by WebView2)
│ │ ├── App.tsx # Root — dialogs, funnels, state wiring
│ │ ├── commands/ # Command registry, menus, keymap, tools model
│ │ ├── state/ # AppState reducer, selectors, types
│ │ ├── components/ # Chrome (MenuBar/MainToolbar/TabStrip…),
│ │ │ ├── canvas/ # the reading view + organize board
│ │ │ └── navpane/ # the navigation pane panels
│ │ ├── panels/ # One tool panel per operation (shown in the right dock)
│ │ ├── search/, ocr/ # Find/Search engine, tesseract.js OCR
│ │ ├── hooks/, lib/ # Engine bridge, commit gate, pdf builders
│ │ └── testHarness.ts # e2e hooks (compiled in only with VITE_E2E)
│ └── engine/ # Python PDF engine (one file per operation)
├── e2e-tests/ # WDIO specs against the built binary
├── tests/ # vitest (renderer) + pytest (engine)
├── resources/ # Vendored runtimes: embedded Python, Ghostscript,
│ # LibreOffice, edit fonts (all built by scripts)
└── scripts/ # setup-python-embed.ps1, bundle-ghostscript.ps1,
# bundle-libreoffice.ps1, sync-edit-fonts.ps1,
# sync-ocr-assets.mjs, gen-rust-licenses.ps1
MIT (application code). Bundled Ghostscript is unmodified upstream, licensed AGPL-3.0 — see THIRD-PARTY-LICENSES.md.



