I have been building PDF Pro, a desktop PDF reader for Linux and Windows using Python.
The goal is not only to open PDF files. I want the application to become a practical study and research tool where users can read, search, annotate, save images, take notes, and eventually ask questions about their documents with a local LLM.
This post documents my progress so far, the main features I have implemented, and the problems I am currently working through.
Tech stack
The project currently uses:
- Python
- PySide6 for the desktop interface
- PyMuPDF for opening PDFs, rendering pages, extracting text, searching, and extracting embedded images
- Pillow for rendered page image processing and annotation drawing
- Ollama for planned local LLM summarization
- PyInstaller for packaging test releases
What PDF Pro can do
Open multiple PDFs in tabs
The reader supports multiple open documents using tabs.
Each PDF tab keeps its own state, including:
- Current page
- Zoom level
- Night mode state
- Search results
- Notes
- Bookmarks
- Highlights and other annotations
This makes it possible to compare papers, lecture slides, reports, or reference documents without reopening files repeatedly.
Page navigation and thumbnails
The application includes:
- Previous and next page controls
- Direct page number input
- Mouse-wheel page navigation
- Thumbnail navigation panel
- Fit Width mode
- Zoom in and zoom out controls
The left side panel includes PDF page thumbnails, helping users quickly move through longer documents.
Search and text selection
PDF Pro supports text search inside a PDF.
Users can:
- Open the search panel
- Search for text
- Move between previous and next matches
- Navigate to the page containing each result
- Select text from a PDF page
- Copy selected text with
Ctrl+C
For selectable PDFs, the reader uses text-word coordinates so annotations are attached to words rather than only drawing a large rectangle over the page.
Highlight, underline, strike, and eraser tools
I added a compact Tools menu to avoid filling the top toolbar with too many buttons.
The available annotation tools are:
- Select text
- Highlight
- Underline
- Strike through
- Eraser
The workflow is:
- Choose a tool from the Tools menu.
- Drag over text in the PDF.
- The application identifies the words inside the selected area.
- It saves the annotation using the PDF word rectangles.
- The annotation remains available after closing and reopening the document.
The Eraser tool removes annotations by clicking or dragging over the specific highlighted, underlined, or struck text.
Notes and bookmarks
The application has separate side-panel support for notes and bookmarks.
Users can:
- Add a bookmark for the current page
- Give the bookmark a custom label
- Double-click a bookmark to return to that page
- Delete bookmarks
- Write notes for the current page
- Review saved notes
- Jump to the page where a note was created
- Delete notes
The document state is saved so users can continue reading later.
Night mode
I added a Night mode toggle for reading PDFs in darker environments.
When enabled:
- Light pages become dark
- Dark text becomes light
- The PDF becomes easier to read at night
The night mode uses a separate image-processing service so the main interface code stays cleaner.
Image tools
PDF Pro currently has two image-related features.
Snapshot selected area
The Snapshot tool allows a user to:
- Choose Snapshot from the Images menu.
- Drag around a chart, diagram, figure, table, or any region.
- Save the selected region as PNG or JPEG.
This is useful for vector diagrams and charts that may not exist as normal image files inside a PDF.
Extract embedded images
The application can also extract original embedded raster images from the current PDF page.
This feature:
- Detects image objects stored in the PDF
- Shows previews of the discovered images
- Displays image dimensions and file format
- Allows saving one selected image
- Allows saving all embedded images from the page
This differs from the Snapshot feature because it preserves the original embedded image data when possible.
Interface improvements
The interface has moved from a simple first version into a more organized reader layout.
Current layout:
Top toolbar:
Open | Page navigation | Zoom | Night mode | Tools | Images | Search
Left side:
Thumbnails | Bookmarks
Center:
PDF document tabs and reader area
Right side:
Document info | Notes | AI Hub
Bottom:
Status messages
To avoid a crowded top bar on smaller screens:
- Annotation actions are grouped inside Tools
- Image functions are grouped inside Images
- Search opens in its own compact toolbar row
- Long document titles are shortened with ellipsis where possible
Local AI summarization work
The next major feature is local PDF summarization using Ollama.
The planned AI Hub will support:
- Current page summary
- Selected text summary
- Whole PDF summary
- Copy generated summary
- Save a generated summary as a note
The intended pipeline is:
PDF text extraction
-> chunk large documents
-> summarize each chunk with a local Ollama model
-> combine the chunk summaries
-> create a final structured summary
Using a local Ollama model means the document text can stay on the user's computer instead of being sent to an external API.
For an initial lightweight model, I am testing with:
ollama pull qwen2.5:3b
Current challenge: rendering quality
One technical challenge is PDF rendering quality.
Chrome and dedicated PDF readers render vector PDF content directly at the screen zoom level. My current version renders pages using PyMuPDF and displays them in a PySide6 QGraphicsView as a pixmap.
The current path is approximately:
PDF page
-> PyMuPDF pixmap
-> Pillow image
-> Qt image
-> Qt pixmap
-> QGraphicsView display
This approach makes custom annotation overlays easier, but it can make fine text look softer than Chrome after scaling.
I have been experimenting with higher render DPI and improved scaling logic. A future improvement may be to use a vector-oriented PDF view for reading while keeping a separate annotation layer.
Packaging and testing
I created early Linux builds with PyInstaller.
The application is distributed as a one-folder bundle because the executable needs its bundled Qt, Python, and library files. The user must keep the executable and its _internal folder together.
For Linux, I package the folder as a .tar.gz archive to preserve executable permissions.
Example run process:
tar -xzf PDF-Pro-v0.1.2-Linux-x86_64.tar.gz
cd PDF-Pro-v0.1.2-Linux-x86_64
./PDF-Pro-v0.1.2-Linux-x86_64
Windows will need its own separately built package because PyInstaller builds are platform-specific.
What is next
My next development goals are:
- Finish and test local Ollama summarization
- Improve PDF rendering sharpness
- Add a clean annotation manager
- Export notes and highlights
- Add OCR support for scanned PDFs
- Build and test a Windows release
- Add document question-answering with citations to PDF pages
Closing thoughts
This project has been a useful way to learn how desktop interfaces, PDF rendering, local storage, annotation systems, image extraction, and local language models fit together.
PDF Pro is still in development, but it already has the foundation of a personalized study and document-reading tool.
I am continuing to improve the interface, rendering quality, packaging, and local AI capabilities.
Top comments (0)