diff --git a/personal/how-to/oreilly-book-to-ipad-pdf.md b/personal/how-to/oreilly-book-to-ipad-pdf.md new file mode 100644 index 00000000..8e9aeb8e --- /dev/null +++ b/personal/how-to/oreilly-book-to-ipad-pdf.md @@ -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 пересоздаёт копию профиля.