一场黑客松,2000多支队伍报名。证书要一张张发出去,名字要一个个核对。这个环节没人愿意干,出错代价却不小——300张证书印错一个名字,重印是钱,发出去是尴尬。
![]()
CertProof 就是冲着这个环节来的。它做证书,然后检查自己做出来的证书。
流程不复杂:选一个样式,或者描述一下让 AI 设计;加上 logo 和签名;上传一份名单。它生成可打印的 PDF,再把每一页读回来,跟名单逐条比对。名字漏了、重复了、被裁掉了,它会告诉你出在第几页。
还有一个空白姓名模式,适合打算手写名字的场景。另外,别的工具做出来的证书 PDF 也能拿来查。
导出之后,每一页都有状态。有一批七张证书的测试里,一个特别长的名字被缩小以适配版面,这一页就被标记出来,等人看一眼,而不是悄悄放过去。
外部 PDF 的检查也做了测试:一批里放了一个重复页、一个拼错的名字、一个多余页和两个缺失的人,全部被找了出来。截图里的名字都是编的。
模型只管好看,代码负责正确
设计环节用的是本地跑的 Gemma 3(4B),通过 Ollama 调用。它只回答一串选项——边框、角、颜色、字体、间距——代码再把这些变成页面。它不写 HTML,设计那一步也看不到收件人姓名。
渲染交给 Chromium(Playwright),检查环节用 pdfplumber 把成品 PDF 读回来,逐页对照源数据行。
第一次真跑 Gemma 失败了两次:间距设置本该是 1.0 附近的倍数,它给了个 90;接着挑了一种在白底上看不清的淡黄色。现在的做法是让代码修补小错误、修正低对比度,而不是把答案整个丢掉。模型仍然做创意选择,代码保证这些东西能印出来。
4B 模型的品味时好时坏,所以另外备了四套成品样式兜底。
名单不出本机
参与者名单是个人数据:姓名、学校,有时还有证件号。开放权重模型跑在主办方自己的机器上,这份名单不会传到别人的服务器,不需要信任第三方,也不需要注册账号。
运行成本也是零。按场次收一点小钱的话,每张证书都去调付费 API,利润就被吃掉了。
技术栈上,前端是 React 和 TypeScript,后端是 FastAPI 加 SQLite,116 个测试。开发过程用了 Claude Code。目前已在 Linux 上构建和测试(Python 3.13、Chromium 141),Windows 11 上还没跑过。
第一个用户是自家院系的学生社团
他们 10 月 24 日办黑客松,报名超过 2000 支队伍。手工发这么多证书,正是容易出错的地方,于是作者把 CertProof 给了他们。
他们用它生成了参赛证书,然后对 PDF 跑了一遍检查。反馈是制作很轻松,检查让他们在打印或发送之前对名字有了底。活动还有一周才开始,真正的考验在证书发出去的时候。
这次是免费试用,没有付费。社团的原话是,这东西对他们给一大群人制作和分发证书帮助很大,还带内置校对,肯定会为它付费。
大批量处理会慢,第 800 张证书时崩掉不该意味着从头再来。接上 Temporal 之后,每 25 张证书是一个可重试的步骤。作者在导出中途杀掉 worker,它从停下的地方接着做完了。进入 Temporal 的只有 id,名字留在本机。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.