↓ 跳过正文

文库本生成方案

··3002 字·6 分钟
Jimmy
作者
Jimmy
Once in a lifetime, water flowing underground.

书接上回(《文库本的理念》),这篇文章我们来谈谈我是如何建立起我自己的文库本产线的。我将从生成流程的基本逻辑和对应的生成技术栈(也就是每一块处理的解决方案)入手。 注意由于国内个人印书商家卡宗教、政治和黄色内容特别严(可以参考我的吐槽文章),所以最好不要沾边,否则到时候客服发癫,说剩下不关事的几本也抠一些无关紧要的细节不让印,就比较麻烦了。

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。

按这套规格做出来,成品大致是这样的:

七本自制文库本的成品实拍:牛皮纸封面、胶钉装订
成品样例:白夜、飞鸟集、佩索阿诗集、武者小路实笃选集等,牛皮纸封面 + 胶钉

流程基本逻辑
#

选书 → 获取文本 → 整理成书稿 → 构建排版 → 校验转曲 → 导出归档 → 审核送印

首先,我们先来梳理一下我的产线工作流程。分为以下几个部分:

  1. 选书/篇目,确定范围和版本,以便确认目标为下一步获取书本内容做准备
  2. 获取文本。可以从一些电子书资源中提取,这一点基本上只要有电子书文件或者扫描件等等即可。
  3. 整理书稿。这一步主要也是交给 AI 处理即可。这里不直接将电子书送印,是因为我们后续需要调整和规范化格式。整理后先存为 Markdown 格式,方便增删改查和管理。 从这一步开始,下面就是把 Markdown 导出为可交付格式文件的流程。
  4. 构建排版。这个就是从 Markdown 利用我们准备好的格式转换为初步 PDF 的流程。
  5. 转曲。这一步将每个字画成固定形状的矢量描边,打印时不再依赖任何字体文件,避免印刷商由于缺失字体导致出现问题。
  6. 导出归档,人工过目一遍内容和格式有没有问题。
  7. 送印。具体参考下面的客服沟通部分。

我的生产线
#

不得不提到的是,我这条产线的内核还是 Codex,具体可以参考《我的桌面ai解决方案》,我就是借此自动搭建起这条产线的。

生产线技术栈
#

以下这段是我直接从产线开了个会话,让它概括自己的技术栈而生成的。

环节用的东西作用
书稿格式Markdown(UTF-8)章节按 01_ 前缀排序,book.yaml 做唯一配置入口
内容转换pandocMarkdown → HTML5,自动生成目录
排版渲染WeasyPrint 68.1 + CSSHTML → PDF;版式参数由 book.yaml 动态生成 CSS,再叠加默认 book.css 和可选的书级 book.css(如飞鸟集)
文字转曲Ghostscript 10ps2write 中间格式 → 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道林纸内页 牛皮纸胶装 封面印首页(内页第一页也印首页) 书脊印文件名(不带文件后缀)”,他就会给你算钱让你按照他的指引付款,过几天就能顺利收货了。

相关文章

文库本的理念

·2939 字·6 分钟
从岩波文库的发刊词说起:文库本是什么,为什么中国一直缺一种“口袋里的教养”,以及我为什么决定自己做一本。