CLI AI

在命令行里合并和拆分 PDF

2026-08-13

pdfunite a.pdf b.pdf out.pdf 用来合并文档,pdfseparate in.pdf page-%d.pdf 用来拆开一个文档。两者都来自 poppler-utils,速度快而且无损。它们做不到的事——把一个页码范围抽成单个文档、或者压缩体积——归 ghostscript 管,这个分工就是本文的全部内容。

1. 这个文件有多少页

clai
$ clai merged.pdf 有多少页→ pdfinfo merged.pdf | grep '^Pages'Pages:           4

pdfinfo 会打印二三十行元数据,而你通常只要其中一行。它同时也是下面每一步操作之后的快速核对手段。

2. 合并多个文件

clai
$ clai 把 invoice.pdf 和 contract.pdf 合成一个文档→ pdfunite invoice.pdf contract.pdf merged.pdf

最后一个参数永远是结果,它前面的都是源文件,顺序就是它们出现的顺序。命令本身没有输出,用 pdfinfo 核对。

3. 拆成单页

clai
$ clai 把 merged.pdf 拆成每页一个文件→ pdfseparate merged.pdf page-%d.pdfpage-1.pdfpage-2.pdfpage-3.pdfpage-4.pdf

%d 是必须的——页码会填在那里。上面的清单来自 ls -1,pdfseparate 自己一声不吭。

4. 抽取一个页码范围

clai
$ clai 把第 2 到第 3 页取出来→ pdfseparate -f 2 -l 3 merged.pdf slice-%d.pdfslice-2.pdfslice-3.pdf

-f 是起始页,-l 是结束页。注意你拿到的是什么:两个文件,而不是一个两页的文档,而且编号保留了原始页码。

5. 把范围合成一个文档

clai
$ clai 把第 2 到 3 页抽成一个文档→ gs -q -sDEVICE=pdfwrite -dNOPAUSE -dBATCH -dFirstPage=2 -dLastPage=3 -sOutputFile=pages-2-3.pdf merged.pdf

poppler 没有对应的命令,于是换 ghostscript 上场。已验证:pdfinfo pages-2-3.pdf 显示 Pages: 2。不用 gs 的话,路线是先 pdfseparate,再 pdfunite slice-2.pdf slice-3.pdf range.pdf,同样得到两页。

6. 把文件变小

clai
$ clai 压缩这个 pdf,好塞进邮件附件→ gs -q -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -dNOPAUSE -dBATCH -sOutputFile=small.pdf merged.pdf

在示例文件上验证过:压缩前 84991 字节,压缩后 31876 字节,差不多是三分之一。/ebook 是中间档;/screen 压得更狠,图片上看得出来,/prepress 更顾质量。文字在哪种档位下都不受影响,被压缩的是里面的位图。

Gotchas

  • pdfunite 会覆盖最后一个参数。 那个位置永远是输出。pdfunite part1.pdf part2.pdf 少写第三个名字,就会毁掉 part2.pdf——这里没有"最后一个文件也是源"的惯例。
  • pdfseparate 从不合并。 就算带上 -f 和 -l,你拿到的也是一堆单页文件。合回去是 pdfunite 或 ghostscript 的活。
  • 加密的 PDF 两者都打不开。 先去掉密码(有 qpdf --decrypt 的话用它),否则两个工具都会直接拒绝读取。

Related questions

怎么旋转页面? ghostscript 可以带上 -dAutoRotatePages=/None 重新输出整个文件,但只旋转某一页,在 qpdf 里要简单得多。

怎么把文字提取出来? pdftotext file.pdf - 会把文字打印到终端。没有文字层的扫描件则需要 OCR。

怎么把页面变成图片? pdftoppm -png -r 150 file.pdf page 会以 150 dpi 生成 page-1.png、page-2.png 等等。

See also

CliAI 知道你描述的活该由哪一套工具来做,并在执行前把命令显示出来。一行安装。