编注:文档格式转换,一直都是个烦心事儿。比如简单轻便的 Markdown 文档,想导出 PDF 时却要手工操作。如果不巧遇上一堆文件需要处理,就很让人头大。本文作者是一位大学教师,同时他也是一位自动化高玩,擅长使用自动化工具来解决问题。这篇文章中,作者将带你迅速搞定 Markdown-PDF 文档的转换。虽然文中有一些代码,但放心,文章步骤非常详细,并且作者还提供了现成的工具供你取用。

null

需求

不少人喜欢用 Markdown 来写文章,不过给别人看时,我们一般会导出 PDF 文件,便于直观地展示最终效果。有个朋友提出,希望把文件夹中的许多 Markdown 文件,批量转换为对应名称的 pdf 格式文件。于是我编写了一个 Python 脚本,并且分享给你。如果你有类似的需求,欢迎使用。

本文使用 pandoc 作为转换工具,这是一个命令行下的格式转换工具,支持 Markdown、pdf、txt 等多种格式文档之间的相互转换。Pandoc 可以自动解析 Markdown 文件里的图片链接,所以不论是本地存储的图片,还是图床上的图片,都可以正确转换并且显示到 pdf 文件里。

null

注:本地图片只测试了图片是绝对路径的情况,Ulysses 等用户导出的 Markdown 文件用了相对路径,需自行测试。

工具下载

我已经把代码和样例 Markdown 文件都为你放在了 这个 github repo 中。

null

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

null

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

压缩包里面有 4 个文件。

null

其中的batch-markdown-to-pdf.py是运行脚本;temp_qiniu.mdREADME.md 是咱们的两个示例 Markdown 文件。你尝试之后,可以换成自己的一批 Markdown 文件。

template.tex是转换是采用的模板,这个模板并非我做的,它来自于这个 github 项目。

null

如果你对 latex 有研究,可以自行修改 template.tex 的内容,以控制输出 pdf 的样式。

环境准备

因为提出需求的朋友,使用的是 macOS 系统,因此这里我们以 macOS 系统的安装方式为准。注意下述工具实际上都是跨平台的,因此如果你使用的是 Windows 或者 Linux ,理论上也都是可以使用的。总的来说,我们需要做这几方面的准备:

  1. Python 环境:用于调用 pandoc 进行批量处理
  2. Pandoc:用于把 Markdown 转换为 PDF
  3. tinytex:让 Pandoc 支持中文文档的转换

看起来步骤有点多,但是第一次配置好了,以后再转换格式就不用再费力气。我编写的脚本在 macOS 下测试通过,欢迎你把其他平台测试的结果告诉我。

批量处理文件:Python 3

macOS 自带的 Python 版本较老,我们需要最新的 Python 3,这里介绍一个简单的安装方法:HomeBrew。HomeBrew 是一个 macOS 下的包管理器,你可以把它简单理解为命令行版本的软件市场,输入命令就能安装、管理和卸载各种软件。

直接打开终端窗口,在里面输入脚本安装 Homebrew。期间可能检测到你尚未安装 Xcode Command Line Tool,按系统提示安装就行。此 Xcode Command Line Tool 非彼 Xcode,不会占用几个 GB 的空间。

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

之后,在 Finder 里找到 ~/.profile(可以通过快捷键 ⇧Shift - ⌘Command -G 打开「前往」窗口,输入 ~/.profile 来直达目的地),把下面这一条语句添加到你的 ~/.profile 文件末尾:

export PATH=/usr/local/bin:/usr/local/sbin:$PATH

保存退出,新开一个窗口。此时 Homebrew 已经安装好了,你可以接着执行以下命令安装 Python 3:

brew install python

关于 HomeBrew,可以参考以下文章:

格式转换利器:Pandoc

Pandoc 是一个格式转换的工具,Markdown、PDF、TXT、Doc……都能够胜任。和安装 Python 一样,可以使用 HomeBrew 来安装它。

brew install pandoc

给 Pandoc 添加中文支持:tinytex

因为需要转换的 markdown 文件,大部分都是中文文档,因此转换到 pdf 的时候,需要 xelatex 的支持。

xelatex 可以用各种 latex 集成包来安装使用,例如 texlive 等。但是这里推荐谢益辉的 tinytex 包,简单小巧。

null

不过使用之前,建议删除掉系统里面原有的 texlive 等包。否则可能会造成冲突。

这次 HomeBrew 派不上用场了,在终端窗口下,我们换一个命令:

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(不如 Python 会找不到所需的配置文件)。如果你下载的演示目录还在下载文件夹中的话,可以用下面的命令:

cd Downloads/demo-batch-markdown-to-pdf-master

null

接着,执行目录查看命令:

ls

如果你看到返回的是如下信息(里面就是我们的演示文件),证明一切正常。

null

确认好位置没出错后,就可以试着转换文件了。执行:

python batch-markdown-to-pdf.py

如果顺利,你会看到程序在运行,不过没有什么输出提示的。

null

因为转换 pdf 的工作需要一些时间。所以如果你的 Markdown 文件很多,可能需要等一会儿。

请不要着急。去喝杯茶,看看书,休息一下。

当你回来的时候,(但愿)已经转换完毕了。

null

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

null

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

null

双击打开,看看效果:

null

如果遇到问题,欢迎反馈给我。祝使用愉快!

如果你对 Python 与数据科学感兴趣,不妨阅读我的系列教程索引贴《如何高效入门数据科学?》,里面还有更多的有趣问题及解法。

>下载少数派客户端、关注 少数派公众号,学会更多效率技巧 💪