Попытка конвертировать Jupyter Notebook в слайды PDF

Я пытаюсь преобразовать блокнот Jupyter, который использует RISE для визуализации слайдов в виде слайд-шоу в браузере, в файл PDF. Файл PDF должен содержать все страницы в альбомном режиме и напоминать вид в браузере. Конечно, анимация невозможна, но она должна быть fragments либо объединены в один PDF-слайд, либо распределены по нескольким видам "накапливающих" слайдов (т. е. на основе их слайдов-предшественников) .

Я пытался создать свой собственный шаблон Jinja, который генерирует документ LaTeX, используя beamer Класс документа, пока без особого успеха.

Знаете ли вы, есть ли какие-либо инструменты или шаблоны или экспортеры или что-нибудь, что может помочь мне в этом процессе? Предпочтительно автоматически, например, используя nbconvert?

3 ответа

Сам разобрался. Сделайте эти шаги:

  1. запуск jupyter nbconvert --to slides --post serve the_notebook.ipynb; браузер откроет размещенный узел the_notebook.slides.html
  2. заменить # после the_notebook.slides.html в URL браузера с ?print-pdf так что URL выглядит скорее всего как http://127.0.0.1:8000/the_notebook.slides.html?print-pdf
  3. распечатать в PDF файл

Некоторое время назад мне нужно было программно преобразовать презентации Jupyter Notebook в слайды PDF. Я провел небольшое исследование, и вы можете использовать puppeteer для автоматизации процесса. Для этого вам понадобится простой скрипт Python:

      import asyncio
import os
import tempfile

from subprocess import PIPE, Popen
from pyppeteer import launch

import concurrent.futures

async def html_to_pdf(html_file, pdf_file, pyppeteer_args=None):
    """Convert a HTML file to a PDF"""
    browser = await launch(
        handleSIGINT=False,
        handleSIGTERM=False,
        handleSIGHUP=False,
        headless=True,
        args=["--no-sandbox"],
    )

    page = await browser.newPage()
    await page.setViewport(dict(width=994, height=768))
    await page.emulateMedia("screen")

    await page.goto(f"file://{html_file}", {"waitUntil": ["networkidle2"]})

    page_margins = {
        "left": "20px",
        "right": "20px",
        "top": "30px",
        "bottom": "30px",
    }

    dimensions = await page.evaluate(
        """() => {
        return {
            width: document.body.scrollWidth,
            height: document.body.scrollHeight,
            offsetWidth: document.body.offsetWidth,
            offsetHeight: document.body.offsetHeight,
            deviceScaleFactor: window.devicePixelRatio,
        }
    }"""
    )
    width = dimensions["width"]
    height = dimensions["height"]

    await page.pdf(
        {
            "path": pdf_file,
            "format": "A4",
            "printBackground": True,
            "margin": page_margins,
        }
    )

    await browser.close()



if __name__ == "__main__":
    
    html_input_file = "/you/need/full/path/here/presentation.slides.html?print-pdf"
    pdf_output_file = "slides.pdf"

    pool = concurrent.futures.ThreadPoolExecutor()
    pool.submit(
        asyncio.run,
        html_to_pdf(
            html_input_file,
            pdf_output_file
        ),
    ).result()

Сценарий принимает слайды HTML в качестве входных данных и создает слайды PDF в качестве выходных данных. Обратите внимание, что вам необходимо указать полный путь к файлу HTML. Я написал статью о том, как преобразовать презентации блокнота в слайды pdf . Если вы хотите применить стиль, вот более длинная версия скрипта .

Похоже jupyter nbconvert --to pdf the_notebook.ipynbдолжно работать нормально. Однако вам необходимо установить латекс.

Другие вопросы по тегам