
用十几行 Python 代码和格式转换界黑魔法 Pandoc ,迅速搞定。
需求
有个朋友提出,希望把目录中的许多 markdown 文件,批量转换为对应名称的 pdf 格式文件。我于是编写了一个 Python 脚本,并且分享给你。如果你有类似的需求,欢迎使用。
由于使用了 pandoc 作为转换工具,因此 Markdown 文件里的图片链接,不论是本地存储的(只测试了绝对路径情况),还是图床上的,都可以正确转换并且显示到 pdf 文件里。
数据
我已经把代码和样例 Markdown 文件,都为你放在了这个 github repo 中。

你可以直接点击这个链接,下载压缩包 demo-batch-markdown-to-pdf-master.zip
。

在 macOS 上默认的下载位置,是 ~/Downloads
。
下载后,解压该压缩包,咱们的演示目录就准备好了。名称是 ~/Downloads/demo-batch-markdown-to-pdf-master
。
压缩包里面,有4个文件。

其中的batch-markdown-to-pdf.py
是运行脚本;
temp_qiniu.md
和 README.md
是咱们的两个示例 Markdown 文件。你尝试之后,可以换成自己的一批 Markdown 文件。
template.tex
是转换是采用的模板,这个模板并非我做的,它来自于这个 github 项目。

如果你对 latex 有研究,可以自行修改 template.tex
的内容,以控制输出 pdf 的样式。
环境
因为提出需求的朋友,使用的是 macOS 系统,因此这里我们以 macOS 系统的安装方式为准。注意下述工具实际上都是跨平台的。因此如果你使用的是 Windows 或者 Linux ,理论上也都是可以使用的。
这个脚本在 macOS 下测试通过,欢迎你把其他平台测试的结果告诉我。
python 3
在 macOS 上面安装 Python 3 ,有两种方式。
一种是安装 Anaconda 套件,另一种是使用 Homebrew 。
我们先说 Anaconda 套件安装方式。推荐普通用户使用。它不仅包含 Python 本身,还提前为你安装好了许多常用的依赖套件。
请到 这个网址 下载Anaconda的最新版本。

网站会主动识别你目前使用的操作系统。确定无误后,请选择左侧的 Python 3.7 版本下载安装。
在 macOS 环境中,你下载下来的,是一个以 pkg
为扩展名的软件安装包。双击它,根据提示一步步前进就可以了。
安装完毕后,请打开一个终端窗口。
方法是在“聚焦搜索”(Spotlight)中,输入 Terminal.app
。

然后,回车就可以了。

此时你会看到一个 ~
提示符,这说明终端默认的初始位置,是用户的家目录。
咱们的演示目录位置位于 ~/Downloads/demo-batch-markdown-to-pdf-master
,所以你可以使用:
cd Downloads/demo-batch-markdown-to-pdf-master
这个命令,进入咱们的演示目录。

当你看到前面的路径提示,已经变成了 demo-batch-markdown-to-pdf-master
,就说明你已经定位到演示目录了。
对于高级用户,如果你觉得 Anaconda 安装了许多你不需要用到的软件包,那么也可以尝试 Homebrew 的安装方法。
首先你需要安装 XCode。安装方法请参见这个链接。
然后,在终端窗口里面输入:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
之后,把下面这一条语句,添加到你的 ~/.profile
文件末尾:
export PATH=/usr/local/bin:/usr/local/sbin:$PATH
保存退出,新开一个窗口。
此时 Homebrew 已经安装好了,你可以执行以下命令安装 Python 3:
brew install python
之后,同样在终端中使用以下命令进入演示目录:
cd Downloads/demo-batch-markdown-to-pdf-master
pandoc
请到这个链接,下载符合你使用操作系统的最新版本 pandoc ,并且进行安装。

根据我们的情况,选择的就是 pandoc-2.3.1-macOS.pkg
。
下载下来的,依然是 pkg
安装包,还是双击,就可以根据提示安装了。
tinytex
因为需要转换的 markdown 文件,大部分都是中文文档,因此转换到 pdf 的时候,需要 xelatex 的支持。
xelatex 可以用各种 latex 集成包来安装使用,例如 texlive 等。但是这里推荐谢益辉的 tinytex 包,简单小巧。

不过使用之前,建议删除掉系统里面原有的 texlive 等包。否则可能会造成冲突。
在终端窗口下,执行这个命令:
curl -sL "https://yihui.name/gh/tinytex/tools/install-unx.sh"
tinytex 就安装好了。
之后,为了能够更好地辅助我们进行转换,需要执行下列命令,安装扩展:
tlmgr install unicode-math filehook xecjk xltxtra realscripts fancyhdr lastpage ctex ms cjk ulem environ trimspaces zhnumber collection-fontsrecommended
好了,至此准备工作结束,我们该开始执行命令了。
运行
再次确认,你的终端下所在位置,为 demo-batch-markdown-to-pdf-master
。

执行目录查看命令:
ls
如果你看到返回的是如下信息,证明一切正常。

下面执行:
python batch-markdown-to-pdf.py
如果顺利,你会看到程序在运行,不过没有什么输出提示的。

因为转换 pdf 的工作需要一些时间。所以如果你的 Markdown 文件很多,可能需要等一会儿。
请不要着急。去喝杯茶,看看书,休息一下。
当你回来的时候,(但愿)已经转换完毕了。

回到“访达”(Finder) ,在我们的演示目录(~/Downloads/demo-batch-markdown-to-pdf-master
)下面,你会看到新生成了一个文件夹,叫做 pdf
。

你的转换后 pdf 文件,应该已经在里面了。

双击打开,看看效果:

如果遇到问题,欢迎反馈给我。
祝使用愉快!
喜欢请点赞和打赏。还可以微信关注和置顶我的公众号“玉树芝兰”(nkwangshuyi)。
如果你对 Python 与数据科学感兴趣,不妨阅读我的系列教程索引贴《如何高效入门数据科学?》,里面还有更多的有趣问题及解法。
网友评论