如何把 Markdown 文件批量转换为 pdf?

用十几行 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.mdREADME.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 与数据科学感兴趣,不妨阅读我的系列教程索引贴《如何高效入门数据科学?》,里面还有更多的有趣问题及解法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352