Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

340 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Open PDF Studio

CI Latest release Downloads License: MIT Platform: Windows

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).

Open PDF Studio

What it is

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 & navigating

  • 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+G stepping) 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 view

The twenty-one tools

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)

Tools

Documents & files

  • Print (Ctrl+P) — printer picker, page range, copies, fit/actual, through the bundled Ghostscript to any Windows printer
  • Create PDF from PostScript — convert .ps/.eps to 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
  • .pdfx support — 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

Desktop citizenship

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).

Command Line

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 ebook

Results are JSON on stdout. Progress and errors go to stderr. Exit codes: 0 = success, 1 = operation error, 2 = bad args.

Enterprise Deployment

# 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 /removeuserdata

Auto-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:

Installer switches dialog

Requirements

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.

Quick Start (Development)

# 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

Build

# Full build — bundles Python, GS, builds Rust backend, produces NSIS installer
npm run package

This 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

Architecture

+-------------------+      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)

What powers each feature

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

Project Structure

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

License

MIT (application code). Bundled Ghostscript is unmodified upstream, licensed AGPL-3.0 — see THIRD-PARTY-LICENSES.md.

Releases

Used by

Contributors

Languages