NullifyPDF is a local-first PDF privacy tool. It helps detect personal data, redact it irreversibly, or replace it with reversible placeholders before a PDF is shared with third parties or uploaded to AI systems.
Tip
First time using NullifyPDF? Start with our User Guide โ takes 5 minutes.
NullifyPDF goes beyond simple text covering. It uses Natural Language Processing (NLP) engines to identify entities like names, addresses, email addresses, IBANs, and credit card numbers. At export, the user chooses irreversible anonymization or reversible pseudonymization with an encrypted restore map.
| ๐ฏ Feature | โจ Benefit |
|---|---|
| ๐ง Auto-detection | Automatic detection tuned for Italian documents |
| ๐ Local-first | No cloud uploads during PDF processing |
| โก Responsive UI | Background scanning with live preview |
| ๐ก๏ธ Privacy Export | Irreversible redaction or reversible placeholders |
- ๐ง Automatic Redaction โ Automatic detection of PII in Italian documents: names, locations, emails, phones, IBANs, credit cards, crypto addresses, Italian fiscal codes and IDs. A dialog lets you choose which data types to scan for, and matching is whole-word so ordinary text is not caught
- ๐ Update Check โ Optional, user-triggered check for new releases (stable builds see stable only, beta builds see both) showing the release notes and a one-click download into your Downloads folder; can be enabled at every start from the Info dialog (off by default)
- ๐๏ธ Fluid UI & Thread-Safe โ PySide6 modern dark-mode interface with zero UI freezing. Text extraction in worker thread with QMutex serialization
- ๐ Persistent Dictionaries โ Blocklist and Allowlist synchronized to disk (
~/.nullifypdf) with O(1) fast-path matching - ๐ก๏ธ Privacy Export Modes โ Choose irreversible removal or reversible pseudonymization with a separately encrypted restore map; the exported file is sanitised (annotations, attachments, scripts, metadata, hidden text) and verified
- ๐ Built-in guide and tooltips โ Press F1 for an Italian guide to every function; every control shows a description on hover
- ๐ Review of uncertain hits โ Detections without enough evidence are suggested for review instead of being applied or lost silently
- ๐ฎ๐น Italian name recognition on demand โ the spaCy Italian model (CC BY-NC-SA 3.0, non-commercial) is not in the installer: the first Auto Redact shows its licence, asks for consent and downloads it (SHA-256 verified). Declining keeps rules and dictionaries only
- ๐ง Optional local models โ Three reviewed ONNX PII models (MiniLMv2 EN/IT, PiiScan, OpenMed Italian FastClinical) can be downloaded by the user from pinned Hugging Face revisions; files are SHA-256 verified, the download progress is shown inside the button, and models only add review suggestions
- ๐ Word import โ DOCX paragraphs and tables can be imported locally into the analysis workflow; legacy binary DOC files are not supported
- ๐ OCR Support โ Bundled EN/IT Tesseract language data for scanned PDFs
- ๐ผ๏ธ Blindfold Mode โ One-click image/logo censoring with professional placeholder:
[ IMAGE REMOVED ] - ๐ฆ Native Cross-Platform โ Automated build scripts generate Windows
.exe, macOS ZIP bundles, and Linux.deb/.rpmpackages - ๐ฏ Drag & Drop Support โ Native file drag-and-drop on main window
- ๐ Logging & Diagnostics โ Local file-based logging (
~/.nullifypdf/logs/) with debug mode for advanced troubleshooting
To keep NullifyPDF lightweight, 100% offline, and secure, be aware of these technical limits:
| โ Limitation | ๐ก Workaround |
|---|---|
| Handwritten Text | NLP models cannot analyze non-digitized handwriting. |
| Password-Protected PDFs | Encrypted documents are blocked at load. Decrypt before importing. |
| Legacy Word DOC files | Only modern .docx files are supported; save legacy files as DOCX before importing. |
| Digital Signatures Invalidated | Privacy export changes the PDF; cryptographic signatures (PAdES, notarized) become invalid. |
Warning
Digital signatures will be invalidated after redaction. Save unredacted originals separately for formal records.
โ
Python 3.13 (required for PyMuPDF wheel compatibility)
โ
2 GB disk space (dependencies + Italian model)
โ
4 GB RAM minimum (8 GB recommended for large PDFs)
Operating System Support:
- โ Windows 10/11
- โ macOS 11+
- โ
Linux: Ubuntu 24.04 / 26.04 and Debian 13 (
.deb), RHEL / Rocky / Alma 9-10 and current Fedora (.rpm). The packages are built against glibc 2.34, so Ubuntu 22.04 and Debian 12 also run them, but these are no longer tested
๐ค End Users โ Use Pre-Built Executable
Download the latest pre-compiled executable from Releases:
- Windows:
NullifyPDF_vX.Y.Z_Windows.exe - macOS:
NullifyPDF_vX.Y.Z_macOS.zip - Ubuntu / Debian:
NullifyPDF_vX.Y.Z_Ubuntu.deb - Fedora / RHEL:
NullifyPDF_vX.Y.Z_Fedora.rpm
No installation needed on Windows/macOS - just run or unzip. Linux users can install the .deb or .rpm package.
๐จโ๐ป Developers โ Install from Source
-
Clone the repository
git clone https://github.com/overwrite00/NullifyPDF.git cd NullifyPDF -
Verify Python 3.13
# Windows py -3.13 --version # macOS/Linux python3.13 --version
-
Run automated setup (recommended)
python setup_env.py
This script automatically:
- Creates isolated virtual environment (
.venv) - Installs all dependencies
- Installs the Italian spaCy model for development (the installer downloads it on demand)
- Creates isolated virtual environment (
-
Activate environment & launch
# Windows (PowerShell) .\.venv\Scripts\Activate.ps1 python NullifyPDF.py # macOS/Linux (Bash) source .venv/bin/activate python3.13 NullifyPDF.py
The repository includes cross-platform Python scripts for developers:
๐ง setup_env.py โ Environment Setup
Configures development environment with Python 3.13, virtual environment, and NLP models.
python setup_env.pyWhat it does:
- Detects OS (Windows/macOS/Linux)
- Creates
.venvwith Python 3.13 - Installs
requirements.txtdependencies - Installs the Italian spaCy model for development (the installer does not bundle it)
Automatic OS detection:
- Windows: Uses
py -3.13launcher - macOS/Linux: Uses
python3.13directly
๐๏ธ build_local.py โ Build Executable
Compiles standalone executable with PyInstaller.
python build_local.pyFeatures:
- Cleans temporary directories
- Auto-detects your OS
- Reads version dynamically from code
- Generates named executables such as
NullifyPDF_vX.Y.Z_Windows.exe - Bundles EN/IT OCR data (downloaded automatically if missing)
Linux bonus: On Ubuntu/Fedora, automatically builds .deb and .rpm packages in dist/
โ Running Tests
Verify core behavior with smoke tests:
# Activate venv first
source .venv/bin/activate # or .venv\Scripts\Activate.ps1 on Windows
pytest tests/ -vTest coverage:
- Detection pipeline: word index, rectangle geometry, scoring, partial-match policy, Italian lexicon
- Redaction engine, export sanitiser and export verification (survivor and leak checks)
- Privacy placeholders, encrypted restore maps (Argon2id envelope, recovery key) and reconstruction
- Encrypted dictionaries with expiry and the secure key store
- Offscreen GUI flows (review, export, reconstruction, guide and tooltips, model dialog, Info window)
- Local model catalog, on-demand Italian model download, DOCX import, update check
- Licence consistency and build configuration
| ๐ Document | ๐ Purpose |
|---|---|
| USER_GUIDE.md | Step-by-step usage instructions |
| CONTRIBUTING.md | How to contribute code & report issues |
| ARCHITECTURE.md | System design & technical overview |
| DEVELOPMENT.md | Local dev setup, testing & builds |
| OCR_SETUP.md | OCR data setup and build notes |
| TROUBLESHOOTING.md | Common issues & solutions |
| CHANGELOG.md | Release history & updates |
| SECURITY.md | Security model & responsible disclosure |
| THIRD_PARTY_NOTICES.md | Licences of data and components |
| LICENSE | AGPL-3.0-or-later licence text |
โ
100% Local Processing โ All analysis happens on your machine
โ
No Cloud Uploads โ PDF content never leaves your computer; the only network access is the optional update check and the model downloads you approve
โ
Open Source โ Full code transparency
โ
No Telemetry โ Zero user tracking
Important
Irreversible removal cannot be undone from the exported PDF, and it does not by itself guarantee anonymisation: indirect identifiers can remain. A pseudonymized PDF and its restore map are personal data. Always keep backups of original documents. Pseudonymization requires the encrypted restore map and its password.
See SECURITY.md for responsible disclosure and privacy details.
| Technology | Purpose |
|---|---|
| Python 3.13 | Core language (required for PyMuPDF compatibility) |
| PySide6 (Qt6) | Modern dark-mode GUI with multi-threading |
| PyMuPDF (fitz) | High-performance PDF manipulation |
| Microsoft Presidio | PII (Personally Identifiable Information) detection |
| spaCy | NLP for entity recognition (Italian model, downloaded on demand) |
| ONNX Runtime | CPU inference for the optional local PII models |
| cryptography | Encrypted pseudonymization restore maps |
GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later)
Copyright (c) 2026 Graziano Mariella
NullifyPDF is free of charge and is not sold by its author. It is AGPL-licensed because it uses PyMuPDF, which is available under the AGPL-3.0 or a commercial licence from Artifex. Anyone who distributes the program, modified or not, must give the recipients the source code under the same licence. Releases up to v2.4.0-beta.4 were published under the MIT licence.
The Italian name-recognition model (spaCy it_core_news_md, CC BY-NC-SA 3.0,
non-commercial) is not part of the installer: the program offers to download
it, shows its licence and asks for consent first. Licences of all third-party
components are listed in THIRD_PARTY_NOTICES.md.
Notice. NullifyPDF is free software, distributed under the AGPL-3.0-or-later. Every component and model it uses remains under its own licence, listed below with a link to the official text; using the program means respecting those conditions. The Italian spaCy model is for non-commercial use only and is downloaded only after your consent.
| Component | Licence | Used for |
|---|---|---|
| NullifyPDF | AGPL-3.0-or-later | this program |
| PyMuPDF / MuPDF | AGPL-3.0 or commercial (Artifex) | PDF reading and redaction |
| PySide6 / Qt | LGPL-3.0 | graphical interface |
| Presidio | MIT | personal-data detection |
| spaCy | MIT | language processing |
| spaCy it_core_news_md | CC BY-NC-SA 3.0 (non-commercial use only) | Italian model, downloaded after consent |
| MiniLMv2 EN/IT NER (optional download) | MIT | optional local model by Alberto Schiabel (jkomyno) |
| PiiScan (optional download) | Apache-2.0 (training data: Ai4Privacy OpenPII, CC BY 4.0) | optional local model |
| OpenMed PII Italian FastClinical Small (optional download) | Apache-2.0 | optional local model |
| MiniLMv2 EN/IT NER (optional download) | MIT | optional local model by Alberto Schiabel (jkomyno) |
| PiiScan (optional download) | Apache-2.0 (training data: Ai4Privacy OpenPII, CC BY 4.0) | optional local model |
| OpenMed PII Italian FastClinical Small (optional download) | Apache-2.0 | optional local model |
| onnxruntime | MIT | running local models |
| tokenizers | Apache-2.0 | tokenizing for local models |
| cryptography | Apache-2.0 or BSD-3-Clause | encryption |
| keyring | MIT | key storage (Linux/macOS) |
| tldextract | BSD-3-Clause | URL recognition |
| NumPy | BSD-3-Clause | numerical computing |
| Tesseract OCR | Apache-2.0 | OCR of scanned documents |
| tessdata_fast (eng, ita) | Apache-2.0 | OCR language data |
| ISTAT, elenco dei comuni | CC BY 4.0 | place names |
| Wikidata | CC0 1.0 | given names and surnames |
See LICENSE for the full text.
Want to help improve NullifyPDF? See CONTRIBUTING.md for guidelines.
Last updated: 2026-11-11
User Guide โ
