mdbook生成pdf踩坑

youncyb 发布于 22 天前 134 次阅读 Tools


mdBook是一个用于创建在线书籍的工具,类似于GitBook,但专门设计用于Rust社区。它能够将Markdown文件转换成可浏览的HTML书籍格式,并且支持嵌入代码、生成导航栏、搜索功能等。

不选择GitBook的原因在于gitbook cli多年未更新,大部分优化都用于商业化了,其次其生成pdf的方式坑比较多。

1. 介绍

mdBook是一个用于创建在线书籍的工具,类似于GitBook,但专门设计用于Rust社区。它能够将Markdown文件转换成可浏览的HTML书籍格式,并且支持嵌入代码、生成导航栏、搜索功能等。

不选择GitBook的原因在于gitbook cli多年未更新,大部分优化都用于商业化了,其次其生成pdf的方式坑比较多。

2. 安装mdbook与插件

mdbook需要rust1.72以上版本才能安装,cargo是rust的包管理器。

cargo install mdbook

安装mdbook-pdf,用于生成pdf,由于生成pdf方式使用chrome,所以需要安装chromium,然后配置环境变量,或直接指定配置(见下文)

cargo install mdbook-pdf

安装pdf的目录生成工具,需要python>=3.9。

python3 -m pip install mdbook-pdf-outline

安装pdf.tocgen,用于修复firefox浏览pdf时,目录的页码错误。

python3 -m pip install pdf.tocgen

3. 生成pdf

首先修改book.toml,增加pdf配置:

[book]
authors = ["wendajiang"]
language = "zh"
multilingual = false
src = "src"
title = "Effective Modern C++"

[output.html]
mathjax-support = true
no-section-label = true
git-repository-url = "https://github.com/CnTransGroup/EffectiveModernCppChinese"
git-repository-icon = "fa-github"

[output.pdf]
## Set for auto-retrying if failed to generate PDF.
# trying-times = 1
## This backend only support latest Chromium based browsers, not Safari and Firefox currently.
## If needed, please specify the full path.
## If you specify the wrong binary, chances are that there will be a timeout error.
# browser-binary-path = ""
## Assign the static hosting site url so that relative links outside the book can be fixed.
# static_site_url = "https://aye10032.gitbook.io/computernetwork/"
## Check Chrome Devtools Protocol Docs for the explanation of the following params:
## https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-printToPDF
landscape = false
display-header-footer = true
print-background = true
theme = ""
scale = 0.8
paper-width = 8
paper-height = 10
margin-top = 0.5
margin-bottom = 0.5
margin-left = 0.5
margin-right = 0.5
page-ranges = ""
ignore-invalid-page-ranges = false
header-template = "<h3 style='font-size:8px; margin-left: 48%' class='title'></h3>"
footer-template = "<p style='font-size:10px; margin-left: 48%'><span class='pageNumber'></span> / <span class='totalPages'></span></p>"
prefer-css-page-size = true

[output.pdf-outline]
like-wkhtmltopdf = true ## 启用该配置可以帮助生成更为详细的目录

首先运行mdbook build,生成原始pdf文件和带目录的pdf文件,然后使用pdf阅读器打开后,发现页码会少1页,无法对齐。此时假如使用firefox的pdf.js打开pdf文件,会出现更为离谱的页码错误。

这时,pdf.tocgen作用就体现出来,使用以下命令提取该pdf文件的目录并重新写到out.pdf

pdftocio book/pdf-outline/output.pdf > toc.txt && pdftocio -o out.pdf book/pdf-outline/output.pdf < toc.txt && rm -f toc.txt

4. 参考

  1. 使用mdbook构筑你自己的电子笔记