PDF Destinator
An interactive GUI tool to add named destinations and clickable link regions to PDF files - without expensive software like Adobe Acrobat.
Features
- Visual PDF navigation with zoom and page controls
- Click to set destination positions for internal navigation
- Drag to create link regions pointing to destinations or external URLs
- Load/save destinations - preserves existing destinations in PDF
- Hover-to-delete link regions with visual feedback
- Mouse wheel scrolling with automatic page changes at boundaries
- Keyboard shortcuts for efficient workflow
- JSON configuration support for batch workflows
- Diagnose mode to inspect existing PDF structure
Installation
pip install pdf-destinator
System Requirements
- Python 3.8+
- tkinter (GUI toolkit)
Windows: tkinter is included with the standard Python installer - no extra steps needed.
Linux: Install tkinter separately:
sudo apt-get install python3-tk # Debian/Ubuntu
sudo dnf install python3-tkinter # Fedora
macOS: Included with python.org installer. If using Homebrew Python:
brew install python-tk
Usage
Basic Usage
Open a PDF and add destinations interactively:
pdf-destinator document.pdf
With Pre-defined Titles
Pre-populate the destination list with titles:
pdf-destinator document.pdf --titles "Introduction" "Chapter 1" "Chapter 2" "Conclusion"
With JSON Configuration
Load destinations from a JSON file:
pdf-destinator document.pdf --json destinations.json
JSON format:
[
{
"pdfFile": "document.pdf",
"destinations": [
{ "id": "intro", "title": "Introduction" },
{ "id": "chapter-1", "title": "Chapter 1" },
{ "id": "https://example.com", "title": "External Link", "type": "url" }
]
}
]
Diagnose Mode
Inspect existing destinations and links in a PDF:
pdf-destinator document.pdf --diagnose
Workflow
- Open PDF - Run pdf-destinator with your PDF file
- Navigate - Use arrow keys or buttons to browse pages
- Click - Click on the page to set a destination position
- Drag - Drag a rectangle to create a clickable link region
- Delete - Hover over a link region (cursor changes to X) and click to delete
- Save - Click "Save and quit" when done
Keyboard Shortcuts
| Key | Action |
|---|---|
| Left/Right | Navigate pages |
| Up/Down | Navigate destinations |
| Mouse wheel | Scroll page (changes pages at boundaries) |
Mouse Actions
| Action | Result |
|---|---|
| Click | Set destination position at click location |
| Drag | Create link region pointing to current destination |
| Hover + Click on link | Delete the link region |
Status Indicators
In the destination list:
[x]- Destination has a position set[o]- Destination exists in PDF (loaded)[ ]- Destination needs a position[URL]- External URL (no position needed)
Use Cases
- Create table of contents links in newsletters or reports
- Add navigation to long PDF documents
- Link external resources from PDF pages
- Fix or update existing PDF destinations
- Batch processing with JSON configuration
Python API
You can also use pdf-destinator programmatically:
from pdf_destinator import PDFDestinationPicker
destinations = [
{"id": "intro", "title": "Introduction"},
{"id": "chapter-1", "title": "Chapter 1"},
]
app = PDFDestinationPicker("document.pdf", destinations)
app.run()
Dependencies
- PyMuPDF - PDF rendering and link annotations
- pypdf - Named destinations
- Pillow - Image processing for display
License
MIT License - see LICENSE file.
Contributing
Contributions welcome! Please open an issue or pull request on GitHub.
Acknowledgments
Created with the help of Claude (Anthropic) as a free alternative to expensive PDF editing tools.
Metadata
Release files for pdf-destinator 0.1.1
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_destinator-0.1.1.tar.gz | 17.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pdf_destinator-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 33.2 kB
Release files / pdf_destinator-0.1.1.tar.gz
| Download URL | pdf_destinator-0.1.1.tar.gz |
|---|---|
| Size | 17.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f9863ff4f048f1cb5f3fde14dd949cc041554711350d3b22b230f9a83de2f7fd
|
|
BLAKE2b-256 checksum How to use checksums |
eff863549f3c41ebb91852963360e3a69db27b8b82b1e09927018f4e8f55f464
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.12
|
Release files / pdf_destinator-0.1.1-py3-none-any.whl
| Download URL | pdf_destinator-0.1.1-py3-none-any.whl |
|---|---|
| Size | 16.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0498fcda661438fd260c95a43314c4392d5e159c1123592b4793a54c081a9592
|
|
BLAKE2b-256 checksum How to use checksums |
4851c068724020629477dd3d03903fbd7548a514bfba3b0679be7c853bd733ec
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.10.12
|