将Markdown文件转换为PDF

在本文中,我们将在Linux中将Markdown文件转换为PDF。首先,我们将使用流行的Pandoc (opens new window)实用工具,这是一个通用的文档转换器。然后,我们将使用Okular (opens new window),这是一个支持多种格式的文档阅读器。

2. CLI: Pandoc #

**Pandoc是一个支持多种文档标记和格式以及演示文稿和电子书格式的文档转换器。**当涉及到转换文档时,它就像瑞士军刀一样全能,因为大多数文档转换器在某种程度上都使用Pandoc。

默认情况下,它未安装在大多数Linux发行版上。但是,我们可以从软件包存储库安装它:

# Debian和衍生版本
$ sudo apt install -y pandoc

# Fedora,CentOS Stream和RedHat
$ sudo dnf install -y pandoc

# openSUSE
$ sudo zypper install --non-interactive pandoc

# Arch Linux和衍生版本
$ sudo pacman -S --noconfirm pandoc

安装完成后,让我们验证。 ``` $ pandoc --version pandoc 2.17.1.1 已编译版本 pandoc-types 1.22.2.1,texmath 0.12.4,skylighting 0.12.3.1, citeproc 0.6.0.1,ipynb 0.2 用户数据目录:/home/baeldung/.local/share/pandoc


**从Markdown转换为PDF的过程并非直接完成。首先,Markdown文件会被转换为中间格式,然后将中间格式转换为PDF。**

这样做的原因是有更好的工具和引擎可用。文档之间的转换过程包括复杂的转换。因此,很少有转换引擎具有处理中间格式的本机能力,既高效又准确。

在接下来的章节中,我们将利用不同的PDF引擎将Markdown转换为PDF。

### 2.1. groff

[groff](https://www.gnu.org/software/groff/) 是一个排版系统,用于制作文档。**它通常用于文本数据,在类Unix操作系统上广泛用于man页面。**特别是,[_man_](https://fe `man` 命令使用 groff 来格式化和显示 man 页面。

Pandoc 使用的 _pdfroff_ 引擎依赖于 groff 和 [Ghostscript](https://feeds.feedblitz.com/linux/pdf-view-edit-code#10-ghostscript),我们可以从软件包存储库中安装:

Debian 及其衍生版 #

$ sudo apt install -y groff ghostscript

Fedora、CentOS Stream 和 RedHat #

$ sudo dnf install -y groff ghostscript

openSUSE #

$ sudo zypper install --non-interactive groff ghostscript

Arch Linux 及其衍生版 #

$ sudo pacman -S --noconfirm groff ghostscript


安装完成后,我们将指定该引擎给 Pandoc:

$ pandoc --pdf-engine=pdfroff --toc-depth=1 README.md -o README.pdf


让我们来解释一下:

*   _–pdf-engine_ 指定要使用的 PDF 引擎
*   _–toc-depth_ 表示标题的深度级别
*   _README.md_ 是输入的 Markdown 文件
*   _\-o README.pdf_ 指定输出文件

**请注意,如果 M 中存在无结构的标题,则会出现错误。 Markdown文件中的标题级别错误可能会导致转换错误。例如,如果我们像这样使用标题:

Level 1 header #

Level 3 header #

Level 2 header #


我们可以通过纠正标题级别来解决此问题:

Level 1 header #

Level 2 header #

Level 3 header #

Another level 2 header #


最后,请注意,文档中的图像将不会嵌入到PDF文档中:

![Markdown Converted with pdfroff]

值得注意的是,我们只能看到图像的alt文本。

### 2.2. HTML

除了groff之外,我们还可以使用HTML到PDF引擎。目前,Pandoc支持两种这样的引擎:[weasyprint](https://weasyprint.org/) 和 [wkhtmltopdf](https://wkhtmltopdf.org/)。weasyprint是用Python编写的,而wkhtmltopdf则是基于WebKit浏览器引擎构建的。

我们可以从软件包存储库安装这两个引擎:

Debian 和衍生版本 #

$ s udo apt install -y weasyprint wkhtmltopdf

在 Fedora、CentOS Stream 和 RedHat 上:

$ sudo dnf install -y weasyprint wkhtmltopdf

在 openSUSE 上:

$ sudo zypper install --non-interactive weasyprint wkhtmltopdf

在 Arch Linux 及其衍生版本上:

$ sudo pacman -S --noconfirm weasyprint wkhtmltopdf

现在,让我们使用 weasyprint 作为转换引擎:

$ pandoc --pdf-engine=weasyprint README.md -o README.pdf

让我们来看看结果:

同样,我们也可以使用 wkhtmltopdf

$ pandoc --pdf-engine=wkhtmltopdf README.md -o README.pdf

让我们来检查输出的PDF:

你可能已经注意到两个文档之间的差异。第二个文档中的徽标图像比第一个文档中的小。这是因为 **wkhtmltopdf 尊重att。 在 README.md 中,我们为图像宽度设置了以下属性:

...
![Baeldung Logo](logo.png){width=240px}
...

另一方面,weasyprint 忽略了这些属性。因此,总的来说,使用 wkhtmltopdf 更具性能,并支持更多功能

2.3. LaTeX #

LaTeX (opens new window) 是一种广泛用于科学和数学文档的排版系统。如果我们省略 –pdf-engine 选项,Pandoc 将使用 LaTeX 作为其默认的 PDF 引擎。具体来说,它使用 pdflatex 实现。

然而,Pandoc 并未安装 LaTeX 包。因此,我们需要显式地 安装 (opens new window)

# Debian 及其衍生版
$ sudo apt install -y textlive

# Fedora、CentOS Stream 和 RedHat
$ sudo dnf install -y texlive

# openSUSE
$ sudo zypper install --non-interactive texlive

# Arch Linux 及其衍生版
$ sudo pacman -S --noconfirm texli 一旦安装完成,我们可以简单地指定要传递给 Pandoc 的文件:

```shell
$ pandoc README.md -o README.pdf

就是这样。它将使用 pdflatex 引擎。但是,我们也可以使用 lualatex (opens new window)xelatex (opens new window)

请注意 texlive 是一个庞大的软件包,会在我们的系统中引入大量的依赖项。如果我们不想这样,我们可以简单地使用 Docker (opens new window) 镜像进行此操作:

$ docker run --rm -v "$(pwd)":/data -u $(id -u):$(id -g) pandoc/latex --output=README.pdf README.md

让我们来看看这个操作:

  • docker run 运行容器
  • --rm 操作完成后删除容器
  • -v “$(pwd)”:/data 将当前目录挂载到容器中的 /data 目录中
  • -u $(id -u)😒(id -g) 设置 UID (opens new window) 和 在容器中匹配主机用户的GID (opens new window)
  • pandoc/latex 是我们用于转换的Docker镜像

其余的参数是我们为Pandoc指定的选项。在这种情况下,我们提供了输入文件和输出文件。

这种方法要好得多,因为它将使用最新的LaTeX和Pandoc版本,并且最终文档看起来比其他引擎好得多。

3. GUI: Okular #

Okular是一款支持各种不同格式的文档阅读器。此外,我们还可以使用Okular将Markdown文档打印成PDF文件

我们可以从软件包存储库安装Okular:

# Debian 和衍生版本
$ sudo apt install -y okular

# Fedora, CentOS Stream 和 RedHat
$ sudo dnf install -y okular

# openSUSE
$ sudo zypper install --non-interactive okular

# Arch Linux 和衍生版本
$ sudo pacman -S --noconfirm okular

安装完成后,让我们打开_README。 ``` $ okular README.md


接下来,我们导航到 _文件_ → _打印_,这将打开打印对话框:

在这个对话框中,我们相应地设置选项,然后点击“打印”将文档保存为PDF。


## 4. 结论

在本文中,我们介绍了如何将Markdown文件转换为PDF。为此,我们使用了Pandoc,该工具支持多种PDF引擎。

最后,我们还介绍了如何使用Okular将Markdown文档打印为PDF文件。```