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.1.tar.gz (10.1 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.1-py3-none-any.whl (13.5 kB view details)

Uploaded Python 3

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

Hashes for docsend_dl-0.1.1.tar.gz
Algorithm Hash digest
SHA256 c99f9e696fd72e845ab92197635b62983d9bac61771ed660dbb9b5b1fb2f2d02
MD5 33052a2dcedfcf4a99ce3a03779a8673
BLAKE2b-256 180f861c0621b3989e9272c35418406c8fa125a83ec429fe74c163d30b38f268

See more details on using hashes here.

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

Hashes for docsend_dl-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 25cd180f937714a1f6c996691fe88247e8aa40f43b49d518c92d0d33e2d33ad1
MD5 8939134232c984ff658728aaff4c8972
BLAKE2b-256 2c9f95790882626188f252ae0669b15df525ec8975587d3d84e3383b0eb64778

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