pyScanTailor cleans up scanned book and document pages. Give it raw scans or a PDF and it splits two-page spreads, straightens each page, crops to the content and gives every page the same margins. The result is black and white, colour or mixed pages, saved as images or exported as one PDF. It works through a whole book at once, and you can correct any page by hand.
It is for anyone digitising books, papers or archives with a scanner or a camera. Scanning, text recognition (OCR) and DjVu encoding are left to other tools.
pyScanTailor is a Python and PySide6 port of ScanTailor Advanced. It runs on Windows, macOS and Linux, and has a command line for batch jobs.
Builds for Windows, macOS and Linux are on the GitHub Releases page. Each one carries its own Python and Qt, so there is nothing else to install.
| Platform | File | Start the program |
|---|---|---|
| Windows x64 | ScanTailor-<version>-windows-x64.zip |
ScanTailor\ScanTailor.exe |
| macOS, Apple Silicon | ScanTailor-<version>-macos-arm64.zip |
ScanTailor.app |
| Linux x64 | ScanTailor-<version>-linux-x64.AppImage |
the AppImage itself |
| Linux x64 | ScanTailor-<version>-linux-x64.tar.gz |
ScanTailor/ScanTailor |
Every build also includes the command line, scantailor-cli.
- Windows: unzip anywhere and run
ScanTailor.exe. - macOS: needs macOS 15 or later. Move
ScanTailor.appto Applications. The app is not signed by Apple, so macOS blocks the first launch: right-click the app and choose Open. If macOS only offers to move it to the Bin, try to open it once, then allow it under System Settings > Privacy & Security > Open Anyway. The command line is atScanTailor.app/Contents/MacOS/scantailor-cli. Intel Macs have no build; install with Python instead. - Linux: needs glibc 2.35 or newer (Ubuntu 22.04 or later). Make the AppImage executable with
chmod +xand run it; without FUSE, add--appimage-extract-and-run. To use it as the command line, start it through a symlink namedscantailor-cli. If the window does not open, install Qt's X11 libraries (Debian and Ubuntu:sudo apt install libxcb-cursor0 libxkbcommon-x11-0 libxcb-icccm4 libxcb-keysyms1 libxcb-shape0 libegl1).
pyScanTailor needs Python 3.14. With uv, which fetches Python 3.14 if you do not have it, run the latest code straight from this repository:
uvx --from git+https://github.com/adehad/py-scantailor scantailorTo keep it installed, with scantailor and scantailor-cli on your PATH:
uv tool install git+https://github.com/adehad/py-scantailorOr with pip, in a Python 3.14 environment:
pip install git+https://github.com/adehad/py-scantailor| Command | Starts |
|---|---|
scantailor |
the window |
scantailor-cli |
the command line; scantailor-cli --help lists its commands |
The user guide walks through a project from the first scan to an exported PDF and explains every stage, option and setting.
The interface is available in English, German, Spanish, French, Korean, Polish, Portuguese and Russian. Each language covers almost all of the interface, but about a fifth of each catalogue is a machine draft waiting for review by a native speaker. The .ts files under src/scantailor/translations/ mark those entries "Machine draft, pending native review". Corrections are welcome as pull requests.
Report bugs and ask for features in GitHub issues.
To work on the code, open the dev container with one of the badges at the top, or set it up yourself with Python 3.14 and PDM:
pdm install
pdm run scantailor # the window
pdm run scantailor-cli --help # the command line
pdm run pytest # the tests
pdm run docs # the user guide, into dist/docsAGENTS.md describes the project layout and code rules, and TESTING.md explains how the tests are organised.
pdm run exe builds the standalone program for the platform you run it on, with PyInstaller and app.spec. Pushing a tag that starts with v, such as v1.0.0, makes .github/workflows/release.yml build, smoke-test and publish every platform to GitHub Releases. Tags containing -rc, -alpha or -beta become pre-releases.
Release notes are drafted from merged pull requests and grouped by label, so label each pull request (enhancement, bug, translations and so on). A branch named fix/..., feat/..., docs/..., perf/... or refactor/... is labelled automatically. A breaking label raises the next major version; skip-changelog leaves a pull request out of the notes.
pyScanTailor builds on ScanTailor by Joseph Artsimovich and on the forks that followed it: ScanTailor Enhanced, ScanTailor Featured, ScanTailor Universal and ScanTailor Advanced. FORK_HISTORY.md links to each one and lists the features they added.
pyScanTailor is licensed under the GNU General Public License v3.0 or later. See LICENSE.