Skip to main content

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.

PyPI version Python versions License: MIT Downloads Publish

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 --images to save individual slide images instead
  • Smart output paths — pass a .pdf filename, a directory, or let it default to {deck title}.pdf
  • Fast — downloads all slides in parallel with automatic retries
  • Works with both docsend.com and dbx.docsend.com URLs
  • Headless — runs in the background by default; use --no-headless to 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

  1. Opens the DocSend page in a headless Chromium browser (via Playwright)
  2. Extracts each slide's image URL from the page data
  3. Downloads all slide images in parallel (via httpx)
  4. 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

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

docsend_dl-0.1.2.tar.gz (10.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

docsend_dl-0.1.2-py3-none-any.whl (13.5 kB view details)

Uploaded Python 3

File details

Details for the file docsend_dl-0.1.2.tar.gz.

File metadata

  • Download URL: docsend_dl-0.1.2.tar.gz
  • Upload date:
  • Size: 10.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","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

Hashes for docsend_dl-0.1.2.tar.gz
Algorithm Hash digest
SHA256 ee9800d8765316f5cfac40b87dc3d74f366293f70d1bb900a368185f6ed39654
MD5 55f8c9ab51783f8325e670356f9722c1
BLAKE2b-256 e92c4db40c58b71591ab1761dd85a18dfd70fb16aaa4106d36dba3de73068bdd

See more details on using hashes here.

File details

Details for the file docsend_dl-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: docsend_dl-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 13.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","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

Hashes for docsend_dl-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 808d7dbc549c331052a8b8670a2df84dfc25a3202bda27974c64f8dfbdd791b9
MD5 8cdd0aa3a3a05b166193a873d48221bc
BLAKE2b-256 cf4b089e373854525d03bb06d404b1f395baf486a770502acd892d7ec2d900b8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page