pdfcpu 0.16.4 是命令行的 PDF 处理工具,压缩包 7086950 字节,解开就是单个 17760256 字节的 exe,用 Go 写的,不依赖运行库。

它要解决的是:手上十几个 PDF 要合成一个,或者看一眼某份文件到底多少页、有没有加密,装个图形工具太重,用在线服务又得把文件传上去。

这次拿三个页数不同的文件做合并,量了耗时,也遇到了自己造的测试文件被它判定不规范的情况。

一个 17760256 字节的 exe

Go 编译,静态链接,双击或用命令行都行。

项值说明
压缩包7086950 字节pdfcpu_0.16.4_Windows_x86_64.zip
pdfcpu.exe17760256 字节单文件,放 PATH 里即可
版本0.16.4commit 0f5ac76d
测试素材3 个文件分别 10 页、25 页、60 页

1.7 万字节换一整套 PDF 操作

合并只是其中一条子命令,同一个 exe 还能拆分、加密、解密、优化、加页码、转图片。装一个顶几个工具用。

没有图形界面是刻意的

它只出命令行输出,所以能进批处理、能挂到脚本里定时跑。要拖拽操作的话这个工具不合适。

三个文件合并 95 页,207 毫秒

10 页加 25 页加 60 页,合并后 95 页,耗时的中位数是 207 毫秒。

操作耗时结果
merge 三个文件207 ms95 页,2399 字节
info 读元信息195 ms页数、版本、是否加密
optimize 重写195 ms2374 字节

三种操作耗时几乎一样

207 与 195 毫秒,差 12 毫秒。说明在这个体量下,时间主要花在进程启动和解析文件结构上,具体做哪件事影响很小。

合并后的体积比三个源文件加起来还小

三个源文件是 1728 + 4068 + 9564 字节,合并后 2399 字节。原因是它们共用同一套字体与页面结构,合并时重复的对象被合并了。

info 一次给出十四项

读一份 PDF 的元信息,输出是一张对齐的表。

字段这次的值
PDF version1.7
Page count95
Page sizes595.00 x 842.00 points(A4)
Produced bypdfcpu 0.16.4
Tagged / Hybrid / LinearizedNo / No / No
Using XRef streamsYes
EncryptedNo
PermissionsFull access
pdfcpu 0.16.4 在 Windows 控制台里的输出:上方几行 spec violation 警告指出自行构造的页面字典缺少 Resources 项,中间是 info 读取合并结果的结果表,显示 PDF version 1.7、Page count 95、Page sizes 595.00 x 842.00 points、Produced by pdfcpu 0.16.4、Using XRef streams Yes、Encrypted No、Permissions Full access

Page count 是核对合并结果最快的方式

合完不用打开看,跑一条 info 就知道总页数对不对。95 与 10+25+60 一致,说明三份都进去了。

Encrypted 与 Permissions 两行能省一次试错

拿到一份打不开的 PDF,先跑 info 看这两行:Encrypted 是 Yes 就是有密码,Permissions 不是 Full access 就是被限制打印或复制。省下反复试密码的时间。

自己造的测试文件被判定不规范

这次用来测试的三个 PDF 是按最简结构手写的,pdfcpu 处理时打了一串警告。

警告原文含义
spec violation (obj#:85): page dict: missing required entry "Resources"页面字典缺 Resources 项
页面 85、93、117、199 各报一次每页都缺同一项

退出码是 1,但产物正常生成

合并仍然输出了 95 页、2399 字节的文件,info 也能读。所以退出码 1 在这里不等于失败,是"有规范问题但干完了活"。

脚本里别只看退出码

批处理里如果用 if errorlevel 1 判断,这种带警告的正常结果会被当成失败。要判断成功得检查产物文件是否存在、页数对不对。

什么场景值得上

要批量处理 PDF,或者把 PDF 操作写进脚本的时候。

场景合适度说明
合并多个 PDF高一条命令,95 页 207 毫秒
批量看页数与加密状态高info 一次给十四项
拆分与加密高同一个 exe 里的其他子命令
拖动排序、预览缩略图低没有图形界面

它不做视觉上的事

没有预览、没有拖拽排序、不能手动画批注。它的定位是把 PDF 当结构化数据改,不是当画布看。

授权与费用

Apache-2.0 许可,个人与商业环境都不收费。源码在 GitHub 上,主要语言 Go,发布页提供 Windows、macOS、Linux 三平台包。