书接上回(《文库本的理念》),这篇文章我们来谈谈我是如何建立起我自己的文库本产线的。我将从生成流程的基本逻辑和对应的生成技术栈(也就是每一块处理的解决方案)入手。 注意由于国内个人印书商家卡宗教、政治和黄色内容特别严(可以参考我的吐槽文章),所以最好不要沾边,否则到时候客服发癫,说剩下不关事的几本也抠一些无关紧要的细节不让印,就比较麻烦了。
9 月 25 日更新:封装版已发布#
9 月 25 日,我把这条产线封装成了一个独立的 skill,开源发布到 GitHub:CuberRobot/BunkobonGenerator(MIT 协议)。相比这篇文章里描述的早期版本,主要做了这些新工作:
- 不再绑死某个仓库:skill 自带模板和默认配置,任何含
book.yaml和manuscript/的目录都能构建,放在哪里都行。 - 配置分四层叠加:skill 默认值 → 用户全局
~/.config/bunkobon/config.yaml→ 项目级bunkobon.yaml→ 单本book.yaml,后面覆盖前面。跨书不变的东西(厂牌名、梗句、默认纸张)写在前几层,每本书的配置就只剩几行。 - 新建书直接走模板:
new_book.py从自带模板复制目录并初始化书名、作者,不用再手搓结构。 - 开工前自检:
--check会检查外部命令、配置链、成品规格和字体。字体缺失时 WeasyPrint 是静默回退的,版面会悄悄变样,所以这一步很有必要。 - 系列信息页:扉页之后可以自动插一页自己的“系列信息页”,厂牌名、第几种、底本、页数这些用占位符拼出来,不想要就关掉。
- 支持分部书:
structure.parts: true时#是部、##是章,目录两级、每章另起一页。 - 导出记录加了字数(日期/规格/页数/字数/SHA-256),构建后照旧自校验页数、字体内嵌和转曲是否彻底。
- 依赖清单、macOS / Debian 安装步骤和配置字段全表都写进了 README 与
references/,另外附了一个冒烟测试脚本,改完能一键跑通全链路。
想自己造一本的话,克隆下来建个软链就能在 Codex 里用 $bunkobon-build 调用;不安装也可以,直接 python3 <skill>/scripts/build_book.py <书目录>。
(下面几节是这条产线的规格、流程和技术栈细节,想了解或者想改造再往下看。)
成品书规格#
我们选的是日式文库判标准:105 × 148mm(A6),不是国内 64开、也不是 50开,理由很直接:既然做的是"文库本",就按文库本自己的标准来。配套规格: 装订:胶钉(无线胶装),文库本主流装订; 纸张:内文道林纸 70g 米白——如果打印店没有 70g 道林纸,那也只能用 80g 了,没办法;封面牛皮纸; 特殊页面:信息页(包含作者,译者,底本来源等信息),编辑时自定的前言(将原有的前言往后推,或者挪到文末)以及目录; 出血:3mm,默认净尺寸交付(纯文字没有出血元素,多数店收净尺寸); 版心:上 12 / 下 16 / 订口 12 / 切口 15mm,奇偶页镜像——订口比切口窄,翻页时版心视觉居中; 正文:思源宋体 9pt、1.8 倍行距、首行缩进 2em、黑白纯文字; 交付:转曲版 PDF。
按这套规格做出来,成品大致是这样的:

流程基本逻辑#
选书 → 获取文本 → 整理成书稿 → 构建排版 → 校验转曲 → 导出归档 → 审核送印
首先,我们先来梳理一下我的产线工作流程。分为以下几个部分:
- 选书/篇目,确定范围和版本,以便确认目标为下一步获取书本内容做准备
- 获取文本。可以从一些电子书资源中提取,这一点基本上只要有电子书文件或者扫描件等等即可。
- 整理书稿。这一步主要也是交给 AI 处理即可。这里不直接将电子书送印,是因为我们后续需要调整和规范化格式。整理后先存为 Markdown 格式,方便增删改查和管理。 从这一步开始,下面就是把 Markdown 导出为可交付格式文件的流程。
- 构建排版。这个就是从 Markdown 利用我们准备好的格式转换为初步 PDF 的流程。
- 转曲。这一步将每个字画成固定形状的矢量描边,打印时不再依赖任何字体文件,避免印刷商由于缺失字体导致出现问题。
- 导出归档,人工过目一遍内容和格式有没有问题。
- 送印。具体参考下面的客服沟通部分。
我的生产线#
不得不提到的是,我这条产线的内核还是 Codex,具体可以参考《我的桌面ai解决方案》,我就是借此自动搭建起这条产线的。
生产线技术栈#
以下这段是我直接从产线开了个会话,让它概括自己的技术栈而生成的。
| 环节 | 用的东西 | 作用 |
|---|---|---|
| 书稿格式 | Markdown(UTF-8) | 章节按 01_ 前缀排序,book.yaml 做唯一配置入口 |
| 内容转换 | pandoc | Markdown → HTML5,自动生成目录 |
| 排版渲染 | WeasyPrint 68.1 + CSS | HTML → PDF;版式参数由 book.yaml 动态生成 CSS,再叠加默认 book.css 和可选的书级 book.css(如飞鸟集) |
| 文字转曲 | Ghostscript 10 | ps2write 中间格式 → pdfwrite 转回 PDF,把文字变描边(直接 pdfwrite 转曲无效,这是实测出来的坑) |
| 流程编排 | Python 3(build_book.py / new_book.py) | 拼装章节、生成扉页与系列信息页、调用工具链、写导出记录 |
| 构建校验 | Poppler(pdfinfo / pdffonts / pdftotext) | 页数一致、字体全部内嵌、转曲后提不出文字 |
| 字体 | Source Han Serif SC(思源宋体) | 正文 9pt、标题 SemiBold,已装到本机字体库 |
| 归档 | exports/exports.jsonl + git | 每次构建留 SHA-256、规格、页数;git 送印即冻结 |
产物是两个 PDF:-print.pdf(字体内嵌,可编辑留档)和 -outlined.pdf(转曲版,送印用)。整条链就是 Markdown → pandoc(HTML) → WeasyPrint(PDF) → Ghostscript(转曲) → 送印。
别看上面这么多东西很麻烦,其实让 AI 自己搞的话一点都不难。
如何搭建生产线#
9 月 25 日更新:这一节记录的是从零搭建产线的做法,封装版发布之后已经不必自己再来一遍。只想用现成产线的话,可以整节跳过。
这篇文章的内容其实都可以丢给 Codex,让它自己理解这篇文章来搭建产线,应该都是可以的。
需要预装的内容有:Python、pandoc、WeasyPrint、Ghostscript、Poppler
接下来,确定项目的规范,建立一些规范性文档,让 agent 敲定生产的流程、技术栈以及生成的格式等等。上面的格式要求和流程已经写得很清楚了,直接当成 prompt 喂给 AI,它是能理解的。
如果追求个性化,想单独创建一些页面,塞例如自己的厂牌名或者书籍信息(格式、底本)之类的内容,也可以在建立产线的时候就和 AI 提要求来实现。
然后让 AI 调试每一步工具的调用是否顺利和正确,让 AI 自己生成一本小的测试 Markdown 书稿跑一趟完整流程。如果没有问题,就要求 agent 把这个生产流程封装为 skill,这条生产线就基本上完成了。
接下来,每本书建一个独立的会话,把目标书籍和自己搜集到的资源(或者让 AI 在网上自己找)喂进去,先调整内容生成初步的 Markdown 文档,然后跑 skill 流程。对于每本书有一些特别的要求也可以和 AI 说(比如做《飞鸟集》时,起初 AI 给每一首诗都加了目录索引;我提了要求后,目录里不再为每首诗单独建索引,只保留前言、末尾的译者记和徐志摩的演讲等条目)。跑完后人工审一下转曲版本,没有问题就可以送印了。
如何送印以及和客服沟通#
可以在网购平台搜“印刷”,“个人印书”等等关键词就能找到商家。需要马上确认的两件事情分别是是否支持比较少数量的印刷(一两本),以及是否支持我们所定下来的尺寸,纸质和装订方式。也可以顺便确认一下我们要印的书是否会踩到审核的线,以免付钱送印之后又被客服找回来退钱。
然后把书的文件名改成除了文件后缀以外,只有书名,没有其他内容,发过去,并明确提及一下我们的格式:“A6黑白双面 70g道林纸内页 牛皮纸胶装 封面印首页(内页第一页也印首页) 书脊印文件名(不带文件后缀)”,他就会给你算钱让你按照他的指引付款,过几天就能顺利收货了。

