brainstate

McanKul/offpdf · source

Snapshot 0 · 2026-11-04T12:47:28Z · Rust · MIT

Content fingerprint2fa94eb5382d3568e2a53681b60ccf840e7c48324c13ddb52ffbdabd852894cd

GitHub description at capture

23 private, open-source desktop PDF tools: edit, merge, convert, compress and OCR locally—no uploads, accounts or telemetry.

README at capture

<p align="center">
  <img src="./docs/assets/offpdf-mark.svg" width="96" height="96" alt="OffPDF logo">
</p>

<h1 align="center">OffPDF</h1>

<p align="center">
  <strong>Private PDF tools that run entirely on your computer.</strong><br>
  23 tools · No uploads · No account · No telemetry · Works offline
</p>

<p align="center">
  <a href="https://github.com/McanKul/offpdf/releases/latest"><img src="https://img.shields.io/github/v/release/McanKul/offpdf?label=release" alt="Latest release"></a>
  <a href="https://github.com/McanKul/offpdf/actions/workflows/ci.yml"><img src="https://github.com/McanKul/offpdf/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI status"></a>
  <a href="./LICENSE"><img src="https://img.shields.io/github/license/McanKul/offpdf" alt="MIT license"></a>
</p>

<p align="center">
  <strong><a href="#downloads">View downloads</a></strong>
  · <a href="https://apps.apple.com/app/id6806690233">Get the iPhone app</a>
  · <a href="https://offpdf.com">Visit offpdf.com</a>
  · <a href="https://github.com/McanKul/offpdf">Star OffPDF on GitHub</a>
  · <a href="./CONTRIBUTING.md">Contribute</a>
</p>

<p align="center">
  <img src="./docs/assets/offpdf-home.png" width="1060" alt="OffPDF desktop app showing its local PDF tools">
</p>

> **Your files never leave your computer.** OffPDF processes documents locally
> and always writes the result to a new file, leaving the original untouched.

OffPDF is a free, MIT-licensed desktop toolbox for everyday PDF work. It uses
local engines such as qpdf, Poppler, Tesseract, and LibreOffice, with no cloud
service in the middle.

## Why OffPDF?

- **Private by design.** No uploads, accounts, analytics, telemetry, or remote API.
- **Useful offline.** Install it once and keep working without a connection.
- **One focused toolbox.** Organize, convert, compress, OCR, protect, and repair PDFs.
- **Open and inspectable.** The app and its privacy model are available here under MIT.

## 23 PDF tools

| Organize | Convert | Optimize & secure |
| --- | --- | --- |
| Merge PDFs | Office / HTML to PDF | Compress PDF |
| Split PDF | PDF to Office | Protect PDF |
| Organize pages | PDF to images | Unlock PDF |
| Page numbers | OCR (make searchable) | Repair PDF |
| Watermark | PDF/A (archive) | Edit metadata |
| Crop pages | PDF to text | |
| Stamp / Sign | | |
| Edit PDF | | |
| Poster / tile print | | |
| N-up / Booklet | | |
| Compare PDFs | | |
| Remove blank pages | | |

### Edit PDF capabilities

The Edit PDF workspace adds text, images, shapes, links, and freehand drawing as
new content. It can also create PDF notes, highlights, underlines, strikeouts,
and ink annotations while preserving existing annotations.

**Edit existing text.** Change a line of existing text in the document's own
font when OffPDF can verify the change: every other glyph is checked to stay
within 0.01 pt, lines that can't be changed safely say why, and the original
file is never overwritten. See [docs/EDIT_TEXT.md](./docs/EDIT_TEXT.md).

For interactive PDFs, OffPDF can fill existing AcroForm text fields (including
multiline fields), checkboxes, radio buttons, combo boxes, and list boxes. Form
fields stay interactive by default.

The two flattening options have different scopes:

- **Flatten form fields** turns supported form widgets into page content while
  leaving other annotations interactive.
- **Flatten annotations** turns all remaining annotations into non-interactive
  page content. When a PDF contains form fields, OffPDF requires form fields to
  be flattened as part of this operation.

Current limits: XFA forms are not supported, and only the first PDF's AcroForm
can be filled when several files are combined. Editing existing page content
depends on the PDF's structure; unsupported operations leave it unchanged.

The earlier investigation behind that boundary is recorded in the
[source-content editing decision](./docs/source-editing-decision.md).

Edit text can change a supported line in the document's own font. It does not
reflow paragraphs, add fonts, or change text inside reused blocks, rotated or
vertical text, scanned pages, or signed and encrypted PDFs. Existing images are
not replaced. See [Edit text limitations](./docs/EDIT_TEXT.md).

## Downloads

| Platform | Package | Status |
| --- | --- | --- |
| Windows x64 | [Download from the latest release](https://github.com/McanKul/offpdf/releases/latest) | Available on GitHub Releases; currently unsigned while Authenticode signing is completed |
| macOS 11+ · Apple Silicon | [Download from the latest release](https://github.com/McanKul/offpdf/releases/latest) | Signed and notarized |
| Intel Mac / Linux | [Build from source](#development) | No published package yet |

The Windows installer is large because it includes the local engines needed to
keep its core workflows offline. The macOS build bundles qpdf, Poppler, and
Tesseract; LibreOffice is optional and only needed for Office and PDF/A tools.
Until Authenticode signing is complete, the Windows package is distributed only
through GitHub Releases and is not linked from offpdf.com.

All published binaries are available on the
[Releases page](https://github.com/McanKul/offpdf/releases).

See the [code signing policy](./CODE_SIGNING_POLICY.md) for how official release
artifacts are built, approved, and verified.

## OffPDF on your phone

OffPDF is also [available for iPhone on the App Store](https://apps.apple.com/app/id6806690233).
Scan, organize, sign, and edit PDFs on your phone; documents are processed on
the device. The app is free to download, with optional Pro tools available as a
one-time purchase. [Learn more about the mobile app](https://offpdf.com/mobile).

Android is in development and is not available to download yet. This
repository contains the open-source desktop app; the mobile app is a separate,
proprietary codebase.

## Open With (desktop)

A packaged build registers OffPDF as an **Open With** handler for the same types
the in-app picker already accepts (PDF, images including HEIC/HEIF, and Office).
It is not the silent default PDF app (`bundle.fileAssociations` uses
`rank: Alternate`). Choose OffPDF from Finder, Explorer, or your Linux file
manager.

Opened files go into the existing workspace. No merge, compress, convert, or
redact job starts until you pick a tool. If OffPDF is already running, the
existing window is focused and the files are added there.

Association metadata lives in `src-tauri/tauri.conf.json`. Full Finder/Explorer
clicks need a packaged build (`npm run tauri:build`) or a local `tauri:dev`
session plus a manual OS association.

## Privacy model

- Documents are processed by local binaries on your machine.
- Preview, search, and editing may pass locally generated page data, thumbnails,
  or extracted text to the bundled interface. This data stays inside the app.
- There is no account system, cloud sync, analytics, telemetry, or remote API.
- The production app uses Tauri's local custom protocol and a restrictive CSP.
- Auto-update is not enabled.

See [PRIVACY.md](./PRIVACY.md) for the plain-language privacy statement.

## Development

### Prerequisites

- Node.js 18+
- Rust via `rustup`
- [Tauri v2 platform prerequisites](https://v2.tauri.app/start/prerequisites/)
- `qpdf` for core PDF operations
- Optional: Poppler, Tesseract, and LibreOffice for the tools listed below

```bash
# macOS
brew install qpdf poppler tesseract
brew install --cask libreoffice

# Debian / Ubuntu
sudo apt install qpdf poppler-utils tesseract-ocr libreoffice
```

Install dependencies and run the desktop app:

```bash
npm install
npm run tauri:dev
```

Run the checks used by CI:

```bash
npm run build
npm test
```

Create a desktop bundle:

```bash
npm run tauri:build
```

### Local engines

| Engine | Used for |
| --- | --- |
| `qpdf` | Merge, split, organize, encrypt, decrypt, repair, lossless optimization, and writing Edit text changes |
| Poppler (`pdftoppm`, `pdftotext`) | Previews, image export, comparison, text export, lossy compression, and verifying Edit text changes |
| Tesseract | OCR and searchable PDFs |
| LibreOffice | Office conversion and PDF/A export |

<details>
<summary><strong>Project structure</strong></summary>

```text
.
|-- src/                 # React + TypeScript frontend
|   |-- components/      # shared UI, PDF controls, layout, job status
|   |-- features/        # tool-specific screens
|   |-- lib/             # tool registry, validation, Tauri commands
|   |-- routes/          # home, settings, about
|   |-- state/           # Zustand stores
|   `-- styles/
|-- src-tauri/           # Rust backend and Tauri configuration
|   |-- src/
|   |   |-- commands/    # command handlers
|   |   |-- pdf_engine/  # engine resolution and PDF operations
|   |   `-- utils/       # disk, temp, and process helpers
|   `-- tauri.conf.json
`-- public/pdfjs/        # bundled pdf.js assets
```

</details>

## Contributing

Bug reports, feature ideas, documentation improvements, translations, and code
contributions are welcome. Read [CONTRIBUTING.md](./CONTRIBUTING.md) before
opening a larger change, and check the
[open issues](https://github.com/McanKul/offpdf/issues) for current work.

Please report security-sensitive issues privately as described in
[SECURITY.md](./SECURITY.md).

## Project status

OffPDF is under active development. See the [roadmap](./ROADMAP.md) for current
priorities and known platform limitations.

## License

The desktop app in this repository is [MIT-licensed](./LICENSE). The separate
mobile app is not covered by this repository's license.