前几天我用代码制作了一本收录了266条「オノマトペ」词条的 PDF 电子书。

从开始动手到完成上线,前后花了不到8个小时。能在这么短时间内完成这个项目,必须要感谢我的好搭档:Claude Code。

不得不说,编程世界已经彻底变天了。我这种生于“古典时代”的程序员,如果还不放弃旧思路,迟早会被时代抛弃。

这个项目实际执行时间不多,但其实想法已经产生了很久。为什么从产生想法到最终落地中间隔了这么长时间呢?这个问题挺困扰我的,这篇文章就来好好分析一下。

首先,最直接的原因可能就是怕麻烦。

制作这本电子书之前,我其实已经制作了5本 JLPT 语法类电子书。当时采用的方法非常简单:先用 Flutter 绘制图片,然后手动一张一张保存到本地,最后用 Python 代码将所有图片组装成一本 PDF。先不说效果怎么样,单是手动保存图片这一步就能把人累死。五本书弄完以后,我再也不想花时间搞这么麻烦的事。

后来优化了一版,直接用 Flutter 将所有 YAML 文件组装成一个 HTML 文件,然后将这个 HTML 导出后再利用 MacOS 自带的 Preview 工具 print 为 PDF。这种方法制作成的 PDF 效果也不好,PDF 样式和 HTML 样式有出入,不符合预期。

这两次尝试都没有达到我想要的效果。于是我就想,要不试试 LaTeX,毕竟是专业排版工具。可是一想到又要学习一门新技术,我心里就打起了退堂鼓。更深层的原因可能是这件事并不紧急,因为所有的电子书都有一个版本在售卖,制作新版本的动机不足。

因为怕麻烦,所以继续优化的想法就被暂时搁置了。

第二个原因是对 Flutter 执念太深。

可能是长期写 Flutter 代码形成的路径依赖,我居然没有想到可以尝试一下用 Python 来解决这个问题,况且我一直都在用 Python 写脚本。

还有一个可能性就是我将之前写的所有 Python 脚本放在了一个大项目中,随着代码越写越多,项目也越来越臃肿。而我很讨厌复杂的东西,所以慢慢就变得不想再碰这个项目。

Claude Code 非常理性,我把制作 PDF 的思路跟他探讨完成之后,它直接在 Flutter Package 的目录下新建了一个 scripts 文件夹,然后在里面生成起了 Python 代码。

这招太绝了,我怎么就没想到呢。这样一来,所有代码都围绕数据展开,不用再担心找不到代码。每一份脚本文件只完成一项任务,所以也不用担心一段时间不用会忘记掉执行方法。

第三个原因是心理因素。

现在看来,当时阻碍我继续制作电子书的障碍并不是什么大问题,我就不应该认为这件事有多难。

Claude Code 给出的技术方案和我的想法一样,先生成 HTML,再将 HTML 转化为 PDF。不过技术实现不太一样,Claude Code 直接使用 PDF 组件将 HTML 转化成 PDF,而我的做法则是将 HTML 打印成 PDF。

没想到效果完全超出预期。具体技术方案我却还没细看,不知道什么原因导致了这种差异。对比之下,flutter 的 pdf 组件可以说一言难尽、过于拉垮,不但不支持 ruby text,连排版都是一塌糊涂。

PDF 正文生成好之后,我接着用 Claude 生成了封面业、目录业和五十音索引页。最后还让它帮我生成了小红书店铺的商品详情文案。

全程非常顺利。Claude Code 已经成为我的得力的助手,不但能帮我写代码,还能帮我做电商运营。

我按照以上思路又把之前的五本电子书重新生成了一遍,把一直想要但又因为怕麻烦一直没做的功能都给做掉了。例如目录页、五十音索引页。

甚至实现了一个例句筛选的绝佳方案:给例句增加 selected 字段,然后在 SenluoStudio 图片预览页进行手动筛选,当眼也可以通过 Gemini 智能筛选。

这套技术方案打通以后,制作电子书的工作流也就确立了下来。接下去,我会将 Kanji、Goi 全部制作成电子书。