2026-03-05 14:54:11
今天在调研自动生成人事系统的入职文件时,我才知道 PDF 交互式表单字段(AcroForms)这个东东。我以为 PDF 格式就是不能编辑的。。。原来 PDF 是可以包含类似网页 form 表单的,可以直接通过 pdfcpu 命令工具,获取其他库用代码进行自动填充。

使用 pdfcpu 可以检测一个 pdf 文件是否包含交互式表单。并通过命令行填充表单。
go install github.com/pdfcpu/pdfcpu/cmd/pdfcpu@latest
最神奇的是,这个居然给我自动安装上了 go 1.25。我本地的 go 版本总是被迫升级。
go: downloading github.com/pdfcpu/pdfcpu v0.11.1
go: github.com/pdfcpu/[email protected] requires go >= 1.24.0; switching to go1.25.7
go: downloading go1.25.7 (linux/amd64)
go: downloading github.com/hhrutter/pkcs7 v0.2.0
go: downloading github.com/hhrutter/tiff v1.0.2
go: downloading github.com/hhrutter/lzw v1.0.0
go: downloading golang.org/x/image v0.32.0
go: downloading golang.org/x/text v0.30.0
go: downloading github.com/mattn/go-runewidth v0.0.19
go: downloading github.com/clipperhouse/uax29/v2 v2.2.0
可以用官方提供这个 pdf 样例做测试:
https://github.com/pdfcpu/pdfcpu/blob/master/pkg/samples/form/demo/english.pdf
> pdfcpu form list test.pdf
installing user font:
Roboto-Regular
pdfcpu: no form available
同样是输入如下命令:
pdfcpu form list english.pdf
可以看到结果如下图

每个字段有对应的名字。
新建一个 english.json 的文件,内容如下:
{
"header": {
"source": "english.pdf",
"version": "pdfcpu v0.4.1",
"creation": "2023-04-04 20:22:17 CET",
"producer": "pdfcpu v0.4.1"
},
"forms": [
"textfield": [
{
"name": "firstName",
"value": "Horst",
"locked": false
}
],
"datefield": [
{
"name": "dob",
"value": "31.12.1999",
"locked": true
}
],
}
]
}
执行命令:
$ pdfcpu form fill english.pdf english.json tmp.pdf
就能实现自动填充,非常方便
这个我没测试过,不知道是否可行,但是 gemini 说可以使用 LibreOffice Writer (直接导出)
2026-03-04 20:30:33
昨天刚经历了个人小程序不备案就无法打开的噩梦,个人小程序不备案无法访问,报错“该小程序仅支持由小程序开发团队体验,无法访问”。晚上又迎来暴击,提交小程序备案刚过预审,就被封号处理 🥲。前后也就半小时,开发了上百个小程序,还是第一次遇到这种情况。

网上搜索了一下,好多人遇到了同样的问题。而且普遍是,根本没有真实用户访问过的情况下,因为备案完成前,根本没有新用户能打开小程序。那么何来的用户投诉。。。微信审核团队撒谎也不能认真点。。。

没办法,客户着急用。我先临时把小程序的功能改造成网页 H5 版本,先让用户用着。好在客户比较好说话,也没有埋怨我。但是我真是有苦说不出,正月十五过节的晚上,刚家庭聚餐喝了个半晕状态,还要连夜改造小程序为网页版。这还好不是企业版小程序,否则交了 300 大洋还要被封禁,估计客户得跟我翻脸。
在小程序后台,点击申诉按钮,才能看到违规的具体原因。给我的理由是:
违反规则《微信小程序平台运营规范》1.注册提交规范
1. 注册提交规范
1.1 提供给用户可以联络到开发者的链接或电子邮箱等有效联系方式。
1.2 提供给平台联络到开发者的管理员微信号,并保证该微信号真实有效。
1.3 你所提交的微信小程序,不得关联至你不具有完整合法权益或不具备完整授权的网站、应用程序、产品或服务等。
1.4 为保障平台和其他用户的安全、稳定,我们会在你提交微信小程序、运营微信小程序等全过程中,要求你提供相应的材料、进行相应的修改等补充和调整,你应当按照我们的要求协助我们进行审核,否则,将影响审核的结果。
1.5 微信鼓励开发者进行创新,不允许重复注册、提交2个及以上页面、内容、功能相同或同质化严重的微信小程序,以为用户提供多样化服务。同时,请避免注册或提交与已有的微信小程序相同或类似的微信小程序,保障微信小程序之间相互具有区别性和不可替代性,避免给用户造成混淆,影响用户体验,使微信小程序的账号资源得以合理使用。
看了一下这个规范,我感觉唯一可能有问题的是第五条。因为我的这个小程序功能确实是一套界面类似的功能,但是执行逻辑确实各不相同,因为不同版本的处理逻辑是不一样的。这个确实没办法,因为审核人员又不可能去看 js 逻辑代码。这以后就有点难搞了,想一套模版卖多份基本就没有活路了。而且,我提交的这个版本,还是用 AI 把 js 逻辑完全重写了一遍的版本,改动反而是最大的一版。。。我猜测微信应该是有一套自动截屏的系统,把小程序各个界面做截图备份,然后匹配相似度。因为这种判定不太可能是靠审核人员人工判定,大概率是靠系统比对后给出的建议。
同时,也有一个客户给我转发了一个竞品的小程序,我当时还惊叹这么简单的功能为何花那么多精力在界面美化上。我现在想明白了,大概就是为了规避这个恶意注册的问题。其实大体思路:
我感觉这是非常离谱的一个处理方式。因为没人会认真读你的条款。我做了这么多年的小程序开发,也是第一次见。但是,你不能因为一次违规就直接封号,为啥不能先拒绝发布,打回去重新开发修改呢?直接就封号也是真的任性。
2026-03-03 21:59:54
之前个人小程序不备案还能继续使用,只是限制每天的使用人数。今天发现更严格了,不备案,直接没法打开了。如下图:

提示“该小程序仅支持由小程序开发团队体验,无法访问”,看来要跟企业小程序一样的严格了。刚开始,我没意识到是备案的问题,我以为只是刚发布,还没有更新到所有下载节点。登录到小程序后台看,才发现确实是没有备案的原因。

你的小程序还未履行备案手续,发布上线后小程序将无法被搜索,仅限制小程序”成员管理”页中的微信用户调试体验使用,完成备案即可解除限制。真的太恶心了,我都备案了几十个小程序和网站了,每次都得重新来一遍,有这个必要吗?审核部门得多闲,非得反复看我的备案🙄哎,头痛,以后要想节约时间。就得先备案,然后同步开发小程序。主要是担心有的小程序没法过审核,先备案的话还要打回改名。
2026-03-02 19:51:33
在将一个多店铺的 Magento 商城,由子域名 a.test.com 切换为 b.test.com 时,出现了一个奇怪的现象。
第一次见到 307 这个 HTTP 状态码。
简单来说,HTTP 307 (Temporary Redirect) 是一种临时重定向状态码。
它最核心的特点是:要求浏览器在重定向请求时,不得更改 HTTP 方法(Method)。看上去类似 302 临时跳转,有什么区别呢?
检查了 Nginx 配置,以及 magento 后台的配置。参考:Magento 子店铺域名修改
并没有发现什么问题。
于是怀疑是 cloudflare DNS 的配置问题。
目前是一个 CNAME 记录指向了主域名,看起来比较奇怪,我没有理解为啥要这么配置。
为了排查 DNS 配置的问题,我改成了我更熟悉的 A 记录指向服务器 IP 的设置,并且先禁用了 cloudflare 代理的配置。
这样是为了方便部署 https 证书。
果然改成 A 记录之后,就正常了。。。
为了继承原子域名的权重,在 cloudflare 规则里添加了 301 跳转规则,自动跳转到新域名上。
不得不说,cloudflare 真是方便。可惜只有 3 条规则的限制。
2026-03-02 15:57:28
三月的第一个工作日,今天效率还挺高的。也尝试了,两个项目并行开发。即,在等待一个项目的 AI 开发的同时;去给另一个 AI 项目写提示词。
记录一下本月的小宇宙播客推荐
为了方便整理这个清单,我还开发了一个浏览器插件,自动整理播客标题和链接,方便整理到 Markdown 笔记中。
2026-03-02 10:32:19
人事部门反馈,现有的人事管理系统,在员工劳动合同续签时,只支持固定期限合同续签,不支持无固定期限合同续签。
正常情况下,第三次续签时,员工就会转为无固定期限合同。
当时设计的时候,确实没有考虑到这个场景,上周忙大赛系统的开发,这周才有时间来处理这个问题。
原来的员工表中,已经有了一个字段,表示合同类型;以及一个合同续签次数字段。
对应的 golang 结构体字段:
ContractType string // 合同类型。劳动合同,实习协议,退休返聘协议
RenewalCount int // 合同续签次数
ContractTime utils.NullDate // 合同签订日。格式为 YYYY-MM-DD,例如 2020-01-01
ContractEndTime utils.NullDate // 合同到期日。格式为 YYYY-MM-DD,例如 2020-01-01
看来,需要增加一个新字段,表示是否是无固定期限合同。
这里字段命名为 OpenEndedContract。1 表示是无固定期限合同,0 表示固定期限合同。
数据库字段命名为 open_ended_contract,类型为 int,默认值为 0。
每天开发这种无聊的需求,即没有成就感,也没有人认可,确实很痛苦。
我想试试能否让 AI 自动去实现这些批量的改动。
我问了一下 gemini:
github copilot 是否能自动修复 github issue 中记录的 bug 和新功能
得到的回答是:
Assign to Copilot (指派给 Copilot) 在 GitHub 的 Issue 界面中,你可以像指派同事一样,在 Assignees 栏选择 “Copilot”。
我感觉这才是未来的趋势啊,让业务部门直接去 github issue 中描述需求和 bug,然后 AI 自动去分析和修复,开发人员只需要 review 和 merge 就好了。