Slides Thief turns skewed photos of presentation slides into a clean PDF. It is useful for conference rooms, lectures, classrooms, trade shows, and any moment where you photographed a projected deck or display at an angle.
Documentation for agents and integrations: docs/index.md,
llms.txt, and JSON schemas.
Open the web app:
No installation is required. Your photos are processed locally in your browser, and the generated PDF is created on your device. The web app does not upload your source photos to a server.
- Open the web app and select or drop your photos.
- Click "Auto straighten" to detect the four slide corners.
- Review the thumbnails and the main preview.
- Drag the four corner handles if a page needs manual correction.
- Click "Generate PDF".
- Click "Download PDF" to save the result.
| Format | Web app | CLI |
|---|---|---|
| JPEG / JPG | Yes | Yes |
| PNG | Yes | Yes |
| WebP | Yes | No |
| TIFF | No | Yes |
| HEIC / HEIF | Yes | Yes |
HEIC and HEIF files are converted to JPEG before processing. The web app does
this in the browser; the CLI uses macOS sips. Large HEIC/HEIF batches may
take longer to start than JPEG batches.
- Photos where the screen or projected slide is tilted.
- Large batches of slide photos that should become one PDF.
- Decks where automatic detection is mostly correct, but a few pages need manual corner cleanup.
- Workflows where you prefer not to upload source photos to a third-party service.
- Automatic slide boundary detection.
- Manual four-corner correction.
- 16:9, 4:3, 16:10, ISO A4/A3 (landscape and portrait), and US Letter (landscape and portrait) output ratios. Paper presets fill margins with white.
- Custom output width, quality, optional readability enhancement, and fill color.
- Light/dark themes and UI in nine languages: Simplified Chinese, Traditional Chinese, English, Spanish, French, German, Japanese, Korean, and Brazilian Portuguese.
- Browser-local PDF generation.
The Web PDF paper presets include A4, A3, Letter in landscape and portrait. The CLI additionally supports A5 paper presets and arbitrary numeric custom ratios.
Product name, URLs, input capabilities, and ratio presets are maintained in
metadata/product.json. Runtime metadata is generated
with scripts/generate_product_metadata.py.
The online web app is the default interactive workflow. The Python CLI remains for advanced local use: command-line batch processing, saved intermediate files, detection overlays, contact sheets, machine-readable reports, and reproducible manual correction passes.
slides-thief ~/Downloads \
--output-dir outputs/my_deck \
--ratio 16:9 \
--width 2400 \
--pdf-name flattened_slides.pdfImportant outputs:
flattened_slides.pdf: the assembled PDF.corrected_images/: one flattened JPEG per slide.detection_overlays/: original photos with detected quadrilaterals.corrected_contact_sheet.jpg: quick visual review of flattened pages.detection_contact_sheet.jpg: quick visual review of detected corners.manual_review.html: browser UI for dragging corner points.manual_review_data.json: data backing the manual review page.slide_lens_report.json: machine-readable report with points and confidence.
Common CLI options beyond the example above:
--enhancement {original,clean,high-contrast,bw}: optional readability pass after correction.--height: optional output height in pixels (overrides ratio-derived height).--jpeg-quality: JPEG quality for corrected images (default92).--image-cache-pixels: maximum decoded RGB pixels retained across processing passes (default32000000; use0to disable full-image caching).--work-dir: intermediate working directory (defaultwork/slide_lens_runtime).--clean-converted: remove intermediate converted JPEGs after the run.
The default output width is 2200 pixels. Run slides-thief --help for the full option list.
See docs/cli.md for the complete CLI contract.
Automatic detection is a first pass. When a few pages need cleanup, open
manual_review.html, adjust bad pages by dragging the numbered corner handles,
then export manual_quads.json.
Run the second pass with:
slides-thief ~/Downloads \
--output-dir outputs/my_deck_refined \
--manual outputs/my_deck/manual_quads.json \
--ratio 16:9 \
--width 2400The manual JSON maps each source filename to four points in this order:
{
"IMG_5995.HEIC": [[76.16, 549.26], [3796.73, 349.28], [3285.14, 2599.3], [76.16, 2276.4]]
}The point order is top-left, top-right, bottom-right, bottom-left.
Automatic detection works best when the physical slide boundary is visible. Internal chart lines, clipped screen edges, hands, and audience heads can still confuse any detector. A good workflow is: run automatic detection, inspect the results, fix only the outliers, then regenerate the PDF.
Install Python development dependencies:
python -m pip install -e ".[dev]"Run the Python test suite:
python -m pytestThe web workspace requires Node.js 22.13 or newer:
cd site
npm ci
npm run dev # Vinext/Cloudflare development server
npm run build # server-rendered app build
npm run build:pages # static GitHub Pages build (writes dist-pages/)
npm test # builds both targets and runs testsSee site/README.md for Pages base-path and deployment details.
src/slides_thief/ # Python CLI and image-processing pipeline
site/ # React web app; browser-only workspace and Pages build
docs/ # stable Markdown documentation for humans and agents
schemas/ # JSON Schema contracts for CLI inputs and reports
tests/ # Python regression tests
site/tests/ # web build and rendering regression tests
pyproject.toml # Python build, runtime, and development configuration
Generated jobs, intermediate files, and package build artifacts stay outside
source control under ignored paths such as outputs/, work/, dist/, and
*.egg-info/.
Release history: CHANGELOG.md.
MIT License. See LICENSE.
When referring to this project, use: Wang, Z. Slides Thief: Convert photographed presentation slides into perspective-corrected PDFs. https://github.com/waittim/Slides-Thief
Machine-readable citation metadata is available in CITATION.cff.