📚 oreilly2pdf
Download any book from O'Reilly Learning as a single, high-quality PDF — perfect for offline reading.
All images, cross-chapter links, table of contents, and index entries just work — exactly as you'd expect from a real book.
⚠️ Requires an active O'Reilly Learning subscription.
⚡ Quick Start
pip install oreilly2pdf
oreilly2pdf 9781098150952 --cookie-file cookies.json
That's it. You'll get a 9781098150952.pdf with all chapters merged into one file.
🔧 Installation
From PyPI
pip install oreilly2pdf
From source
git clone https://github.com/cruzlorite/oreilly2pdf.git
cd oreilly2pdf
pip install .
Requirements
- Python 3.10+
- Google Chrome (or Chromium)
- ChromeDriver — installed automatically by Selenium 4.20+
🍪 Getting Your Cookies
You need to provide your O'Reilly session cookies so the tool can access your account. There are three easy ways to get them:
Way 1 — DevTools Console (fastest)
- Log in to learning.oreilly.com in Chrome.
- Open DevTools (
F12) → go to the Console tab. - Paste this and press Enter:
copy(JSON.stringify(Object.fromEntries(document.cookie.split('; ').map(c => c.split('=')))))
- Your cookies are now in the clipboard. Save them to a file:
pbpaste > cookies.json # macOS
xclip -o > cookies.json # Linux
Way 2 — Cookie-Editor extension
- Install Cookie-Editor in your browser.
- Go to learning.oreilly.com and log in.
- Click the Cookie-Editor icon → Export → JSON.
- Paste into
cookies.jsonand reformat as{"name": "value"}pairs.
Way 3 — Manual
- Open DevTools (
F12) → Application tab → Cookies →https://learning.oreilly.com. - Create a
cookies.jsonwith the relevant cookie values:
{
"BrowserCookie": "...",
"orm-jwt": "...",
"orm-rt": "...",
"groot_sessionid": "..."
}
Note: The most important cookies are typically
orm-jwtandgroot_sessionid. If export fails, try adding more cookies from your browser.
📖 Finding the Book ID
Open any book on O'Reilly and look at the URL — the book ID is the ISBN number:
https://learning.oreilly.com/library/view/book-title/9781098150952/
^^^^^^^^^^^^^
book_id
🚀 Usage
# Basic usage
oreilly2pdf <book_id> --cookie-file cookies.json
# Custom output filename
oreilly2pdf 9781098150952 --cookie-file cookies.json -o my_book.pdf
# Inline cookies instead of a file
oreilly2pdf 9781098150952 --cookies "orm-jwt=eyJ...; groot_sessionid=xyz"
# Keep individual chapter PDFs alongside the merged output
oreilly2pdf 9781098150952 --cookie-file cookies.json --keep-chapters
All Options
| Option | Description |
|---|---|
book_id |
O'Reilly book identifier (ISBN) — required |
--cookie-file FILE |
Path to a cookies file (JSON or plain text) |
--cookies STRING |
Inline cookies (key=value; key2=value2) |
-o, --output FILE |
Output path (default: <book_id>.pdf) |
--keep-chapters |
Save individual chapter PDFs too |
✨ Features
| 📄 Full book | Cover, TOC, all chapters, appendices, index — everything |
| 🖼️ Images | Lazy-loaded and dynamic images fully resolved |
| 🔗 Cross-chapter links | "See Section 4.3" actually jumps to Section 4.3 |
| 🧹 Clean output | No navigation bars, cookie banners, or popups |
| 🎨 Faithful rendering | Math, code blocks, tables, figures — pixel-perfect |
🔍 How It Works
- Fetches the book's table of contents from the O'Reilly API.
- Opens each chapter in headless Chrome with your session cookies.
- Waits for all images (including lazy-loaded ones) to fully render.
- Strips the O'Reilly UI — keeps only the book content.
- Prints each chapter to PDF via Chrome DevTools Protocol.
- Merges everything into a single PDF and rewrites cross-chapter links so they work as clickable in-document jumps.
⚖️ Disclaimer
This tool is intended for personal, offline use only by users who hold a valid O'Reilly Learning subscription. It accesses content you are already entitled to read through your account.
- Do not distribute, share, or upload exported PDFs.
- Do not use this tool to circumvent access controls or pirate content.
- You are solely responsible for complying with O'Reilly's Terms of Service and applicable copyright law.
The authors of this project are not affiliated with O'Reilly Media and assume no liability for misuse.
🙏 Acknowledgements
Inspired by oreilly-epub-downloader by @tctibbs.
📄 License
Metadata
Release files for oreilly2pdf 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| oreilly2pdf-0.1.3.tar.gz | 16.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| oreilly2pdf-0.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 31.4 kB
Release files / oreilly2pdf-0.1.3.tar.gz
| Download URL | oreilly2pdf-0.1.3.tar.gz |
|---|---|
| Size | 16.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5545aecb5556f35d9c02597694b077ad8d2c71dd25a3353d97e8abeadb6ff02e
|
|
BLAKE2b-256 checksum How to use checksums |
e8afd58fd6bea75576a9932df194ea31c9f9df526d95d1cc2dac2a489c0c22fd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 4, 2026.
Transparency logRelease files / oreilly2pdf-0.1.3-py3-none-any.whl
| Download URL | oreilly2pdf-0.1.3-py3-none-any.whl |
|---|---|
| Size | 15.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0c6726f98f986ca2048945f044850ea560bd867e6fa45ddc397e9407a1437672
|
|
BLAKE2b-256 checksum How to use checksums |
5d779d96752ce5ac8e56bceda066a598abcf909b83c92535f6fa9de963d1ffac
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 4, 2026.
Transparency log