Попытка конвертировать Jupyter Notebook в слайды PDF
Я пытаюсь преобразовать блокнот Jupyter, который использует RISE для визуализации слайдов в виде слайд-шоу в браузере, в файл PDF. Файл PDF должен содержать все страницы в альбомном режиме и напоминать вид в браузере. Конечно, анимация невозможна, но она должна быть fragments
либо объединены в один PDF-слайд, либо распределены по нескольким видам "накапливающих" слайдов (т. е. на основе их слайдов-предшественников) .
Я пытался создать свой собственный шаблон Jinja, который генерирует документ LaTeX, используя beamer
Класс документа, пока без особого успеха.
Знаете ли вы, есть ли какие-либо инструменты или шаблоны или экспортеры или что-нибудь, что может помочь мне в этом процессе? Предпочтительно автоматически, например, используя nbconvert
?
3 ответа
Сам разобрался. Сделайте эти шаги:
- запуск
jupyter nbconvert --to slides --post serve the_notebook.ipynb
; браузер откроет размещенный узелthe_notebook.slides.html
- заменить
#
послеthe_notebook.slides.html
в URL браузера с?print-pdf
так что URL выглядит скорее всего какhttp://127.0.0.1:8000/the_notebook.slides.html?print-pdf
- распечатать в 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
должно работать нормально. Однако вам необходимо установить латекс.