112 lines
4.6 KiB
Markdown
112 lines
4.6 KiB
Markdown
---
|
|
title: O'Reilly book to iPad PDF
|
|
created: '2026-10-10'
|
|
updated: '2026-10-10'
|
|
tags:
|
|
- automation
|
|
- oreilly
|
|
- pdf
|
|
- ipad
|
|
- chrome
|
|
---
|
|
# O'Reilly book to iPad PDF
|
|
|
|
Автоматизация печатает доступную через подписку O'Reilly книгу по главам средствами Chrome, объединяет главы и создаёт PDF для старого iPad.
|
|
|
|
## Расположение
|
|
|
|
Скрипт:
|
|
|
|
```text
|
|
~/Automation/OReillyPDF/oreilly_book_to_ipad_pdf.mjs
|
|
```
|
|
|
|
Рабочие файлы при запуске из каталога автоматизации:
|
|
|
|
```text
|
|
~/Automation/OReillyPDF/work/
|
|
```
|
|
|
|
Готовый PDF:
|
|
|
|
```text
|
|
~/Automation/OReillyPDF/outputs/<имя-книги>.pdf
|
|
```
|
|
|
|
Проверенный документ Building Agentic AI Systems:
|
|
|
|
```text
|
|
~/Automation/OReillyPDF/outputs/Building-Agentic-AI-Systems-iPad-768x1024.pdf
|
|
```
|
|
|
|
## Что делает workflow
|
|
|
|
1. Локально клонирует профиль Chrome `Default`, чтобы использовать существующую авторизацию O'Reilly.
|
|
2. Запускает headless Chrome через Chrome DevTools Protocol.
|
|
3. Открывает корневую страницу книги и читает верхний уровень оглавления O'Reilly.
|
|
4. Последовательно открывает каждый раздел верхнего уровня, чтобы O'Reilly отрисовал лениво загружаемые вложенные главы, затем собирает их в правильном порядке без дубликатов.
|
|
5. Печатает каждую уникальную секцию через движок Chrome; поддерживаются имена страниц `.html` и `.xhtml`.
|
|
6. Применяет размер страницы 576×768 pt — это соотношение 768×1024 при 96 DPI.
|
|
7. Добавляет безопасные поля и правила разрыва страниц, чтобы строки не обрезались по краям.
|
|
8. Объединяет главы с помощью `pdfunite`.
|
|
|
|
## Требования
|
|
|
|
- macOS;
|
|
- Google Chrome;
|
|
- авторизация в O'Reilly в профиле Chrome `Default`;
|
|
- Node.js с глобальными `fetch` и `WebSocket`;
|
|
- `rsync`;
|
|
- Poppler/`pdfunite`:
|
|
|
|
```bash
|
|
brew install poppler
|
|
```
|
|
|
|
## Настройка для другой книги
|
|
|
|
Редактировать скрипт не нужно. Передать URL книги первым аргументом; допускается как корневая страница книги, так и URL отдельной главы `.html`/`.xhtml`.
|
|
|
|
Название книги извлекается из страницы O'Reilly. На его основе автоматически создаётся имя `<Book-Title>-iPad-768x1024.pdf`.
|
|
|
|
Число глав и имена файлов указывать не нужно: workflow извлекает уникальные секции из оглавления книги.
|
|
|
|
## Запуск
|
|
|
|
```bash
|
|
cd ~/Automation/OReillyPDF
|
|
node oreilly_book_to_ipad_pdf.mjs 'https://learning.oreilly.com/library/view/SLUG/BOOK_ID/'
|
|
```
|
|
|
|
Результат появится в:
|
|
|
|
```text
|
|
~/Automation/OReillyPDF/outputs/
|
|
```
|
|
|
|
## Проверка результата
|
|
|
|
```bash
|
|
pdfinfo outputs/Book-Name-iPad-768x1024.pdf | grep -E 'Pages|Page size|File size'
|
|
```
|
|
|
|
Ожидаемый размер:
|
|
|
|
```text
|
|
Page size: 576 x 768 pts
|
|
```
|
|
|
|
## Диагностика
|
|
|
|
Подробный stderr Chrome записывается в:
|
|
|
|
```text
|
|
~/Automation/OReillyPDF/work/pdfs/oreilly-book-driver/chrome.log
|
|
```
|
|
|
|
Workflow не ждёт загрузки всех lazy-изображений страницы перед распознаванием главы: это ранее вызывало ложный `Timed out waiting for chapter content`. Перед печатью он отдельно подгружает изображения внутри области книги; если отдельное изображение не успело загрузиться, печать продолжается с предупреждением.
|
|
|
|
## Безопасность
|
|
|
|
Каталог `work/chrome-oreilly-driver-profile` содержит локальную копию данных профиля Chrome, включая данные авторизации. Не синхронизировать и не публиковать этот каталог. При каждом запуске workflow пересоздаёт копию профиля.
|