如何用 calibre 把电子书转换为带页眉页脚和可打印目录的 PDF
2026/9/13 19:48:15 网站建设 项目流程

如何用 calibre 把电子书转换为带页眉页脚和可打印目录的 PDF

【免费下载链接】calibreThe official source code repository for the calibre ebook manager项目地址: https://gitcode.com/GitHub_Trending/ca/calibre

把电子书转成 PDF 后如果要打印,通常需要三样东西:每页带页码和书名/作者的页眉页脚、书末一份列出各节页码的目录,以及电子阅读时的跳转结构。calibre 的转换系统对这三点都有对应支持:页眉页脚模板、可打印目录(printable Table of Contents)和默认生成的 PDF Outline。本文基于 manual/conversion.rst 中 “Converting to PDF” 及相关章节,给出从确认目录、配置模板到验证结果的完整路径,操作界面是 calibre 转换对话框的PDF Output部分,命令行等价做法在文末。

前提:已安装 calibre(GUI 或ebook-convert均可用),电子书已加入书库或已有本地文件。输入格式优先选 HTML/EPUB 这类结构清晰的格式;以 PDF 作为输入时限制较多,见文末“限制与边界”。

先让文档有可用的目录

可打印目录和页眉中的_SECTION_变量都依赖文档自身的目录。manual 明确说明:_SECTION_的名字“taken from the metadata Table of Contents in the document (the PDF Outline)”,如果文档没有目录,该变量会被替换为空文本。所以第一步是确认目录能被正确生成。

calibre 生成目录的规则(见 manual/conversion.rst 的 Table of Contents 章节):

  • 输入文档元数据里已有目录时,calibre 直接使用它;
  • 否则基于正文内容自动生成:优先加入“检测到的章节”(章节检测由Structure detection部分的 XPath 控制,默认表达式匹配含 chapter/book/section/part 字样的<h1>/<h2>class="chapter"的标签);检测到的章节数未达到Chapter threshold时,再从正文超链接补充,数量由Number of links控制,设为 0 则不加入链接;
  • 也可以跳过自动检测,用Level 1,2,3 TOC直接指定多级目录的 XPath,例如Level 1 TOC: //h:h1Level 2 TOC: //h:h2
  • TOC Filter是一个正则,按条目标题过滤生成结果,例如Next|Previous可删掉所有标题为 Next 或 Previous 的条目。

如果自动生成的目录不准,manual 给了手工路线:转换到 EPUB 或 AZW3 时勾选 Table of Contents 部分的Manually fine-tune the Table of Contents after conversion,转换完成后会启动 ToC Editor,点击正文位置即可添加目录条目;也可以在Preferences -> Interface -> Toolbars里把ToC Editor加到主工具栏,对已有书籍单独使用。

注意一个边界:PDF 作为输入格式时,“Links and Tables of Contents are not supported”,也就是说从 PDF 转 PDF 时,文档原有的目录和链接无法被提取,可打印目录和_SECTION_可能拿不到内容。

在 PDF Output 中配置页眉页脚

选中书库中的书籍,打开转换对话框(Convert books),页眉页脚相关设置都在PDF Output部分。manual 说明模板就是渲染在页眉/页脚位置的 HTML 代码片段,calibre 会自动替换其中的变量。

先决定页面大小,这是 manual 列为转 PDF 时“第一个也是最重要的设置”:默认页面大小是 U.S. Letter,可在PDF Output部分改为其他标准尺寸或完全自定义的尺寸;如果 PDF 是给某个特定设备看的,可以开启“使用输出 profile 的页面大小”选项。

以下是 manual 给出的模板示例,可按需组合使用:

页脚居中显示绿色页码(_PAGENUM_自动替换为当前页码):

<footer><div style="margin: auto; color: green">_PAGENUM_</div></footer>

奇数页显示标题、偶数页显示作者,右对齐(justify-content: flex-end使文本右对齐):

<header style="justify-content: flex-end"> <div class="even-page">_AUTHOR_</div> <div class="odd-page"><i>_TITLE_</i></div> </header>

标题在左、作者在右,字号小于正文:

<header style="justify-content: space-between; font-size: smaller"> <div>_TITLE_</div> <div>_AUTHOR_</div> </header>

在页眉显示当前小节名(取自文档目录):

<header><div>_SECTION_</div></header>

如果一页上出现多个小节,使用该页的第一个小节;_TOP_LEVEL_SECTION_变量则取当前顶级小节名。

模板里还可以写 JavaScript。例如让页码从 4 而不是 1 开始:

<footer> <div></div> <script>document.currentScript.parentNode.querySelector("div").innerHTML = "" + (_PAGENUM_ + 3)</script> </footer>

_PAGENUM__TITLE__AUTHOR__SECTION__TOP_LEVEL_SECTION_外,manual 还列出这些变量:_TOTAL_PAGES_(PDF 总页数)、_TOP_LEVEL_SECTION_PAGES_(当前顶级小节总页数)、_TOP_LEVEL_SECTION_PAGENUM_(当前页在顶级小节内的页码)、_WIDTH_PIXELS__HEIGHT_PIXELS_(页眉/页脚区域的像素宽高)。

最后一步别漏:manual 的 note 提示,开启页眉页脚后,要在PDF Output部分把页面上下边距设为足够大的值,否则正文会与页眉页脚重叠。

在 PDF 末尾生成可打印目录

PDF Output部分提供 “Add a Table of Contents at the end of the PDF that lists page numbers” 选项(对应源码选项pdf_add_toc,见 src/calibre/ebooks/conversion/plugins/pdf_output.py)。开启后,calibre 会在 PDF 末尾插入一份列出每个小节页码的目录。manual 指出它主要用于打印场景;如果 PDF 是在电子设备上看,PDF Outline 本身就能提供章节跳转,且默认就会生成,可打印目录不是必须的。

生成目录的外观可以用 Look & feel 部分的Extra CSS设置定制。manual 列出了默认使用的 CSS,可以直接复制后修改:

.calibre-pdf-toc table { width: 100% } .calibre-pdf-toc table tr td:last-of-type { text-align: right } .calibre-pdf-toc .level-0 { font-size: larger; } .calibre-pdf-toc .level-1 td:first-of-type { padding-left: 1.4em } .calibre-pdf-toc .level-2 td:first-of-type { padding-left: 2.8em }

另外注意:并非所有输出格式都支持多级目录,manual 的建议是先用 EPUB 输出验证多级Level 1,2,3 TOC设置是否生效,再切换到目标格式。

用 ebook-convert 完成同样的转换

manual/conversion.rst 开头说明转换对话框里的所有设置也都能通过ebook-convert命令行使用。PDF 输出选项名定义在 src/calibre/ebooks/conversion/plugins/pdf_output.py,命令行参数是选项名的连字符形式(calibre 转换选项的通用写法,手册示例命令中的--level1-toc--page-breaks-before同为该形式)。下面的命令一次完成页面尺寸、页眉页脚与可打印目录的配置,book.epub是待转换的输入文件,book.pdf是输出文件名,按实际情况替换:

ebook-convert book.epub book.pdf \ --paper-size a4 \ --pdf-header-template '<header style="justify-content: space-between"><div>_TITLE_</div><div>_AUTHOR_</div></header>' \ --pdf-footer-template '<footer><div style="margin: auto; color: green">_PAGENUM_</div></footer>' \ --pdf-add-toc

其中--paper-size的可选值包括a0a6b0b6legalletter(默认letter,即 U.S. Letter)。页边距对应--pdf-page-margin-top/--pdf-page-margin-bottom等参数(源码中默认推荐值为 72pt),由于页眉页脚需要上下边距足够大,可按需显式加大。如果输入文档的标题不是<h1>,可参照 manual 中Level 1 TOC的 XPath 写法追加--level1-toc参数来指定目录层级。

验证转换结果

  • 打开生成的 PDF:每页页眉页脚内容应与模板一致——页码是真实页码而非_PAGENUM_字样,标题/作者被替换为书籍元数据;书末出现列出各节页码的目录。
  • 在电子阅读器或 PDF 查看器中确认 PDF Outline 存在并可跳转到各章节(默认生成)。
  • 如果页眉里的_SECTION_显示为空,说明文档没有目录,回到“先让文档有可用的目录”一节处理输入文档。
  • 怀疑设置没有生效时,可以查看实际使用的参数:点击转换对话框右下角的旋转图标,双击对应的转换任务,转换日志顶部会列出本次转换实际使用的设置。calibre 还会按书记住上次转换所用的设置,再次转换同一本书时优先使用这些单独保存的设置,可用对话框里的Restore defaults恢复默认。
  • 需要调试中间产物时,使用转换对话框的 debug 选项并指定一个输出文件夹:转换过程中 calibre 会把各阶段的 XHTML 写入子文件夹,其中processed是传给输出插件之前的 XHTML,适合排查 PDF 输出阶段的问题。

限制与边界

  • PDF 是“worst formats to convert from”之一(manual 原话)。如果输入 PDF 本身带页眉页脚,这些文字会混入正文,应当先用转换对话框的Search and replace面板(正则匹配,旁边有 magic wand 向导,输入表达式后点 Test 可高亮预览匹配结果)删除;未清除的页眉页脚还会干扰段落展开(line unwrapping)。
  • PDF 输入的具体限制包括:不支持复杂多栏和图片为主的文档、不能提取矢量图和表格、不支持原生的链接与目录、嵌入非 Unicode 字体会产生乱码。
  • pdf_page_numbers选项可以给每页底部加页码,但指定了页脚模板时,模板优先于该选项(见 src/calibre/ebooks/conversion/plugins/pdf_output.py 中该选项的说明),所以有页脚模板时不必再开它。
  • 本文路径以 GUI 转换对话框为主要操作方式;calibre 的版本更新可能调整界面文案,以你本地版本的对话框实际内容为准。

【免费下载链接】calibreThe official source code repository for the calibre ebook manager项目地址: https://gitcode.com/GitHub_Trending/ca/calibre

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询