Download slides from public Dropbox DocSend decks as PDF or PNG images
Project description
docsend-dl
Save any public Dropbox DocSend deck as a PDF — one command, full quality.
Quickstart
pip install docsend-dl && playwright install chromium
docsend-dl https://docsend.com/view/XXXXXX
That's it. You'll get a PDF named after the deck in your current directory.
Demo
$ docsend-dl https://dbx.docsend.com/view/n43v89r
Found deck: "docsend-n43v89r" (21 slides)
Got 21/21 image URLs
Downloading slides ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 21/21 0:00:00
╭──────────────────────── Done in 32.2s ─────────────────────────╮
│ Slides saved: 21/21 │
│ PDF size: 9.5 MB │
│ Output: /home/user/docsend-n43v89r.pdf │
╰────────────────────────────────────────────────────────────────╯
Features
- PDF by default — slides are assembled into a single PDF at full resolution with no re-encoding
- PNG export — pass
--imagesto save individual slide images instead - Smart output paths — pass a
.pdffilename, a directory, or let it default to{deck title}.pdf - Fast — downloads all slides in parallel with automatic retries
- Works with both
docsend.comanddbx.docsend.comURLs - Headless — runs in the background by default; use
--no-headlessto watch the browser
Installation
You need the package itself plus a Chromium browser for Playwright:
pip install docsend-dl
playwright install chromium
Or if you use uv:
uv tool install docsend-dl
uv run playwright install chromium
Usage
CLI
# Download as PDF (default)
docsend-dl https://docsend.com/view/XXXXXX
# Save PDF to a specific path
docsend-dl https://docsend.com/view/XXXXXX --output "My Deck.pdf"
# Save PDF into a directory (uses deck title as filename)
docsend-dl https://docsend.com/view/XXXXXX --output ./downloads
# Download as individual PNG images instead
docsend-dl https://docsend.com/view/XXXXXX --images
# Show the browser window during download
docsend-dl https://dbx.docsend.com/view/XXXXXX --no-headless
Python API
import asyncio
from docsend_dl import download_deck
# Download as PDF (default)
result = asyncio.run(download_deck(
url="https://docsend.com/view/XXXXXX",
))
print(f"Saved PDF to {result.output_path} ({result.total_bytes} bytes)")
# Download as individual images
result = asyncio.run(download_deck(
url="https://docsend.com/view/XXXXXX",
output="My Deck",
images_only=True,
))
print(f"Saved {result.successes}/{result.slide_count} slides")
For finer control you can call the extraction and download steps separately:
import asyncio
from pathlib import Path
from docsend_dl import extract_slide_urls, download_slides
async def main():
deck_info = await extract_slide_urls(url="https://docsend.com/view/XXXXXX")
result = await download_slides(
urls=deck_info.image_urls,
output_dir=Path("slides"),
)
print(f"Downloaded {result.successes} slides")
asyncio.run(main())
How It Works
- Opens the DocSend page in a headless Chromium browser (via Playwright)
- Extracts each slide's image URL from the page data
- Downloads all slide images in parallel (via httpx)
- Assembles the images into a single PDF (via img2pdf) or saves them as PNGs
Limitations
- Only works with public decks — email-gated and passcode-protected decks are not supported
- Requires Chromium to be installed via
playwright install chromium
Contributing
# Clone and install dev dependencies
git clone https://github.com/captivus/docsend-dl.git
cd docsend-dl
uv sync
# Run unit tests (fast, no network needed)
uv run pytest -m "not integration"
# Run integration tests (downloads real decks, verifies checksums)
uv run pytest tests/test_integration.py
# Run everything
uv run pytest
Bug reports and pull requests are welcome on GitHub.
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file docsend_dl-0.1.1.tar.gz.
File metadata
- Download URL: docsend_dl-0.1.1.tar.gz
- Upload date:
- Size: 10.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c99f9e696fd72e845ab92197635b62983d9bac61771ed660dbb9b5b1fb2f2d02
|
|
| MD5 |
33052a2dcedfcf4a99ce3a03779a8673
|
|
| BLAKE2b-256 |
180f861c0621b3989e9272c35418406c8fa125a83ec429fe74c163d30b38f268
|
File details
Details for the file docsend_dl-0.1.1-py3-none-any.whl.
File metadata
- Download URL: docsend_dl-0.1.1-py3-none-any.whl
- Upload date:
- Size: 13.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
25cd180f937714a1f6c996691fe88247e8aa40f43b49d518c92d0d33e2d33ad1
|
|
| MD5 |
8939134232c984ff658728aaff4c8972
|
|
| BLAKE2b-256 |
2c9f95790882626188f252ae0669b15df525ec8975587d3d84e3383b0eb64778
|