[2026-10-10] eagle: personal/how-to/oreilly-book-to-ipad-pdf.md
This commit is contained in:
1 parent
b62aee8973
commit
2e2890b429
1 file changed
+123
@@ -0,0 +1,123 @@
|
|||||||
|
---
|
||||||
|
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
|
||||||
|
```
|
||||||
|
|
||||||
|
Первый созданный документ находится здесь:
|
||||||
|
|
||||||
|
```text
|
||||||
|
~/Documents/Codex/2026-10-10/c/outputs/Agentic-GraphRAG-iPad-768x1024.pdf
|
||||||
|
```
|
||||||
|
|
||||||
|
## Что делает workflow
|
||||||
|
|
||||||
|
1. Локально клонирует профиль Chrome `Default`, чтобы использовать существующую авторизацию O'Reilly.
|
||||||
|
2. Запускает headless Chrome через Chrome DevTools Protocol.
|
||||||
|
3. Находит предисловие и страницы глав.
|
||||||
|
4. Печатает каждую главу через движок Chrome.
|
||||||
|
5. Применяет размер страницы 576×768 pt — это соотношение 768×1024 при 96 DPI.
|
||||||
|
6. Добавляет безопасные поля и правила разрыва страниц, чтобы строки не обрезались по краям.
|
||||||
|
7. Объединяет главы с помощью `pdfunite`.
|
||||||
|
|
||||||
|
## Требования
|
||||||
|
|
||||||
|
- macOS;
|
||||||
|
- Google Chrome;
|
||||||
|
- авторизация в O'Reilly в профиле Chrome `Default`;
|
||||||
|
- Node.js с глобальными `fetch` и `WebSocket`;
|
||||||
|
- `rsync`;
|
||||||
|
- Poppler/`pdfunite`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
brew install poppler
|
||||||
|
```
|
||||||
|
|
||||||
|
## Настройка для другой книги
|
||||||
|
|
||||||
|
Открыть скрипт:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/Automation/OReillyPDF
|
||||||
|
open -e oreilly_book_to_ipad_pdf.mjs
|
||||||
|
```
|
||||||
|
|
||||||
|
Изменить корневой URL книги:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const BOOK_ROOT = "https://learning.oreilly.com/library/view/SLUG/BOOK_ID/";
|
||||||
|
```
|
||||||
|
|
||||||
|
Изменить имя результата:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const OUTPUT = resolve("outputs/Book-Name-iPad-768x1024.pdf");
|
||||||
|
```
|
||||||
|
|
||||||
|
Указать фактическое число нумерованных глав в массиве `expected`:
|
||||||
|
|
||||||
|
```js
|
||||||
|
Array.from({ length: 8 }, ...)
|
||||||
|
```
|
||||||
|
|
||||||
|
Например, для 12 глав заменить `8` на `12`.
|
||||||
|
|
||||||
|
Скрипт ожидает адреса вида `preface01.html`, `ch01.html`, `ch02.html` и так далее.
|
||||||
|
|
||||||
|
## Запуск
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~/Automation/OReillyPDF
|
||||||
|
node oreilly_book_to_ipad_pdf.mjs
|
||||||
|
```
|
||||||
|
|
||||||
|
Результат появится в:
|
||||||
|
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
|
||||||
|
## Безопасность
|
||||||
|
|
||||||
|
Каталог `work/chrome-oreilly-driver-profile` содержит локальную копию данных профиля Chrome, включая данные авторизации. Не синхронизировать и не публиковать этот каталог. При каждом запуске workflow пересоздаёт копию профиля.
|
||||||
Reference in new issue
Block a user