指南 · 5 分钟阅读 · 更新于 2026-08-09

不装 LaTeX 把 Jupyter Notebook 转成 PDF

跳过好几个 G 的 TeX 安装。把 .ipynb 拖进来,直接拿 PDF。

把文件拖到这里或者从设备中选择一个文件支持格式: IPYNB

文件不会离开你的浏览器。

把 notebook 变成 PDF 的官方办法是 nbconvert,它确实好用——前提是你有一套能跑的 LaTeX 环境。而要有这个环境,你得装一个以 GB 计的 TeX 发行版,然后去排查那些提到你从没听过的文件名的缺包报错。为了给导师发一份 PDF 或者往报告里附一页,这个准备工作有点多。

如果你需要期刊级的排版,nbconvert 加 LaTeX 仍然是正确的工具。如果你只需要一份能读的分析 PDF,有一条短得多的路。

.ipynb 文件里到底装了什么

notebook 是一份 JSON 文档。里面是一个有序的单元格列表,每个格子标注为 markdown、code 或 raw,每个代码格还带着它上一次运行时保存下来的输出。转换器需要的全部信息就在这个结构里——notebook 自己已经知道哪部分是叙述、哪部分是代码、代码打印了什么。

有一个后果值得记牢:文件里的输出,就是保存那一刻的样子。转换器读的是保存下来的输出,它不执行任何代码。如果你改了某个格子却没重新运行,PDF 里显示的就是过期的输出。凡是打算给别人看的,转换之前先重启并全部运行。

先「重启并运行全部」这一步能同时抓出两件事:过期的输出,以及那些只因为你先前定义、后来又删掉的变量才能跑通的格子。一个在干净环境下跑不通的 notebook,本来就不该拿出去传。

下面的转换是怎么做的

  1. 1
    Markdown 格变成排好版的正文标题、段落和列表以真实的字体层级渲染出来,所以你分析里的叙事结构会存活到 PDF 里。
  2. 2
    代码格变成等宽字体块代码用等宽字体排版,并保留执行序号,所以阅读顺序和实际运行顺序一致。
  3. 3
    保存的输出放在对应格子下面打印的文字和流输出直接出现在产生它们的代码下方,这个版式让 notebook 读起来像一份文档,而不是一份清单。
  4. 4
    全部按 A4 分页很长的格子会跨页断开,而不是在页边被裁掉。结果会报告单元格数和页数,方便你确认没有内容被丢掉。
把文件拖到这里或者从设备中选择一个文件支持格式: IPYNB

文件不会离开你的浏览器。

其他几种办法,以及什么时候该用

用浏览器打印成 PDF:在 Jupyter 里打开 notebook,用浏览器的打印对话框。零配置,而且能抓到图表。缺点是分页点落在哪算哪,经常切在格子中间,而且 Jupyter 的界面元素有时会渗进输出里。

nbconvert 转 HTML 再打印:比直接打印好,因为 HTML 里没有界面元素。要两步,但不需要 LaTeX,而且图表能忠实保留。

nbconvert 加 LaTeX:排版最好,数学记号处理正确。PDF 要进论文或学位论文时用它,并接受安装的代价。

关于图表和 LaTeX 公式的说明我们的转换器专注于叙述和代码结构。如果你的 notebook 主要是 matplotlib 图或密集的 LaTeX 公式,走 HTML 再打印的路线或完整的 nbconvert 会更合适。按你的 notebook 里实际装的内容来选。

为什么本地处理在这里格外重要

notebook 泄露的东西比人们预想的多。输出里经常包含真实数据的样本行、报错栈里的数据库连接串、调试时粘进格子的 API 密钥,以及内部主机名。把 notebook 上传到转换服务,等于把这些一起上传了。上面的转换器在你的浏览器里运行,文件不会离开你的机器。

常见问题

我的 matplotlib 图会出现在 PDF 里吗?

文字和流输出处理得很好,图像输出在这个转换器里有限制。图表很多的 notebook,建议用 nbconvert 导出 HTML 再打印成 PDF——不用装 LaTeX 也能得到忠实的图。

它会运行我的代码吗?

不会。它读的是文件里已经保存的输出。这正是转换前要「重启并运行全部」的原因——如果文件里存的是过期输出,转换器会忠实地把过期输出复现出来。

markdown 格里的 LaTeX 公式会被渲染吗?

markdown 格里的行内公式按文字渲染,不做完整排版。如果公式本身就是 notebook 的重点,请用 nbconvert 加 LaTeX。

能一次转换多个 notebook 吗?

这里一次一个。整个目录的话,用 shell 循环调 nbconvert 是更实际的答案。

相关指南