🦉🫥 PDF Anonymizer CLI
A command-line interface for anonymizing PDF, Markdown, and plain text files using LLMs.
- High-Quality Anonymization: Leverages LLMs to identify and replace Personally Identifiable Information (PII) with high accuracy.
- Identity clues: With
-p best-qualityor--prompt-name detailed, the tool also hides phrases that point to one person without writing their name (for example "the CEO of Tesla"). The defaultbest-speedprofile does not. - Checksum labels: After the fast number search, a real IBAN becomes
IBAN_1and a mistyped one becomesIBAN_LIKE_1. Both are hidden. Same idea for cards, VINs, and a few national IDs. - Operators, reports, and lists:
--operator TYPE=mask|hash|generalize|shift|fake, leftover scan (verify), linkage-risk score (report),--keep-list/--deny-list,--mapping-in, optional locked maps, HIPAA coverage aid. See the CLI History. - Large File Support: Consistently anonymizes large files (tested up to 1GB).
- Multi-Provider & Cost-Effective: Free to use with local Ollama models. It also supports major providers like OpenAI, Anthropic, Google, Hugging Face, and OpenRouter.
- Reversible: Supports deanonymization to recover original data when needed.
- Multi-Format: Works with PDF, Markdown, and plain text files.
Installation
Install the CLI with your favorite package manager. To use a specific LLM provider, you must install the corresponding extra.
- Google:
pip install "pdf-anonymizer-cli[google]" - Ollama:
pip install "pdf-anonymizer-cli[ollama]" - Hugging Face:
pip install "pdf-anonymizer-cli[huggingface]" - OpenRouter:
pip install "pdf-anonymizer-cli[openrouter]" - OpenAI:
pip install "pdf-anonymizer-cli[openai]" - Anthropic:
pip install "pdf-anonymizer-cli[anthropic]"
You can also install multiple extras at once:
pip install "pdf-anonymizer-cli[google,openrouter]"
This installs the pdf-anonymizer executable.
Environment Variables
The CLI will automatically load a .env file from the current directory or any parent directory. For consistency, it's recommended to place a single .env file at the root of the repository.
GOOGLE_API_KEY: Required when using Google models.HUGGING_FACE_TOKEN: Required when using Hugging Face models. You can get a token from here.OPENROUTER_API_KEY: Required when using OpenRouter models.OPENAI_API_KEY: Required when using OpenAI models.ANTHROPIC_API_KEY: Required when using Anthropic models.OLLAMA_HOST: Optional, defaults tohttp://localhost:11434when using Ollama models.ANONYMIZER_MAPPING_KEY: Optional. Same as--mapping-passphrase(writes*.mapping.json.enc).ANONYMIZER_FAKE_SECRET: Optional. Seed for--operator TYPE=fake.
Example .env file:
GOOGLE_API_KEY="YOUR_API_KEY_HERE"
HUGGING_FACE_TOKEN="YOUR_HF_TOKEN_HERE"
OPENROUTER_API_KEY="YOUR_OPENROUTER_KEY"
Usage
Anonymize
The run command anonymizes one or more files.
pdf-anonymizer run FILE_PATH [FILE_PATH ...] \
[-p | --config-profile {best-quality|best-speed|best-cost}] \
[--characters-to-anonymize INTEGER] \
[--prompt-name {simple|detailed}] \
[--model-name TEXT] \
[--anonymized-entities PATH] \
[--countries US,GB] \
[--verify / --no-verify] \
[--verify-llm]
Arguments:
FILE_PATH: Path to one or several PDF, Markdown, or text files for anonymization.
Options:
-p, --config-profile {best-quality|best-speed|best-cost}: The configuration profile to use. Profiles bundle sensible defaults for model, prompt, chunk size, overlap, and retries (default:best-speed). Individual flags (--model-name,--prompt-name,--characters-to-anonymize) act as overrides on top of the chosen profile.--characters-to-anonymize INTEGER: Number of characters to process in each chunk (default:100000; overrides profile).--prompt-name [simple|detailed]: The prompt template to use (default:detailed; overrides profile).--model-name TEXT: The language model to use (overrides profile).--anonymized-entities PATH: Path to a file with a list of entities to anonymize.--countries TEXT: ISO-2 country codes for national-ID regexes, comma-separated (e.g.US,GB). Universal patterns (email, IBAN, cards, …) always stay. Default: all countries.--verify / --no-verify: After masking, scan for leftovers (default: on). Writesdata/stats/<stem>.residual_pii.json. Does not rewrite the file.--verify-llm: Also ask the language model to hunt for leftovers.--mapping-passphrase TEXT: Lock the mapping as*.mapping.json.enc. AlsoANONYMIZER_MAPPING_KEY. Default: plaintext JSON.--operator TYPE=op: How to write a type (replace,mask,hash,generalize,shift,fake). Repeatable. Default isreplace.--fake-secret TEXT: Seed forfake. AlsoANONYMIZER_FAKE_SECRET.--risk / --no-risk: After masking, score identity-clue clumps (default: on). Writesdata/stats/<stem>.risk.json.
pdf-anonymizer report FILE runs the same linkage-risk score on an already-masked file.
--entity-profile hipaa-safe-harbor: coverage aid for the 18 Safe Harbor identifier classes (year-only dates, ZIP3, age 90+). Not a compliance certificate.--mapping-in PATH: reuse an existing mapping so the same person staysPERSON_1across files. Files in onerunshare the map automatically.--keep-list PATH: phrases to leave visible (one per line).--deny-list PATH: phrases that must be hidden even if detection missed them.
pdf-anonymizer verify FILE runs the same leftover scan on an already-masked file.
Models:
You can use any of the predefined models below, or specify a new model using the format "provider/model-name".
For example: --model-name "google/gemini-flash-latest".
- Google:
gemini-2.5-pro,gemini-2.5-flash(default),gemini-2.5-flash-lite. - Ollama:
gemma:7b,phi4-mini. - Hugging Face:
openai/gpt-oss-20b,mistralai/Mistral-7B-Instruct-v0.1,HuggingFaceH4/zephyr-7b-beta. - OpenRouter:
openai/gpt-4o,google/gemini-pro. - OpenAI:
gpt-4o,gpt-5. - Anthropic:
claude-4-sonet,claude-4.5-sonet.
Examples
Basic anonymization (uses the default best-speed profile):
pdf-anonymizer run document.pdf
High-quality run on an important document:
pdf-anonymizer run contract.pdf -p best-quality
Fast & cheap batch processing with a local model (override profile defaults):
pdf-anonymizer run notes/*.md -p best-cost --model-name "ollama/phi4-mini"
A new model (Google) and a simple prompt:
pdf-anonymizer run notes.md --model-name "google/gemini-flash-latest" --prompt-name simple
Using an OpenRouter model:
pdf-anonymizer run report.pdf --model-name "openai/gpt-4o"
Deanonymize
The deanonymize command reverts anonymization using a mapping file.
pdf-anonymizer deanonymize ANONYMIZED_FILE MAPPING_FILE [--mapping-passphrase TEXT]
Arguments:
ANONYMIZED_FILE: Path to the anonymized text file.MAPPING_FILE: Path to the JSON mapping file (plaintext or*.mapping.json.enc).--mapping-passphrase: Required for an encrypted mapping. AlsoANONYMIZER_MAPPING_KEY.
Example:
pdf-anonymizer deanonymize \
data/anonymized/document.anonymized.md \
data/mappings/document.mapping.json
This will create a deanonymized version of the file at data/deanonymized/document.deanonymized.md.
See Also
- Main Documentation — Full guides including the 101 course.
- Core Package README — Details on the underlying library.
- Recipes & Common Workflows — Practical CLI usage examples (profiles, batching, external workflows, etc.).
- CLI Reference (full) — Complete command reference on the docs site.
- Troubleshooting — Help with common CLI problems.
- Architecture — How the CLI and core work together.
Metadata
Release files for pdf-anonymizer-cli 0.14.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pdf_anonymizer_cli-0.14.0.tar.gz | 12.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pdf_anonymizer_cli-0.14.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 22.0 kB
Release files / pdf_anonymizer_cli-0.14.0.tar.gz
| Download URL | pdf_anonymizer_cli-0.14.0.tar.gz |
|---|---|
| Size | 12.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
74256724ccf1f807e89b2847919561b20cec8597d112db49259fbb2cdf176a69
|
|
BLAKE2b-256 checksum How to use checksums |
d3a1d8ee3a23734039f6a1fdc7a88c38c3045676da1b462bd8dde7c57a08872e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.0
|
Release files / pdf_anonymizer_cli-0.14.0-py3-none-any.whl
| Download URL | pdf_anonymizer_cli-0.14.0-py3-none-any.whl |
|---|---|
| Size | 10.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
853c7b6d04bd480bdde3ad9c968fed8f828eafd59432bd0dbce5c5cfa4656456
|
|
BLAKE2b-256 checksum How to use checksums |
5aeb57880dae46c1e900c586a0a442248a948bda710c3c67b51d7ef832a269f6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.0
|