pdfunite a.pdf b.pdf out.pdf 用来合并文档,pdfseparate in.pdf page-%d.pdf 用来拆开一个文档。两者都来自 poppler-utils,速度快而且无损。它们做不到的事——把一个页码范围抽成单个文档、或者压缩体积——归 ghostscript 管,这个分工就是本文的全部内容。
1. 这个文件有多少页
$ clai merged.pdf 有多少页→ pdfinfo merged.pdf | grep '^Pages'Pages: 4
pdfinfo 会打印二三十行元数据,而你通常只要其中一行。它同时也是下面每一步操作之后的快速核对手段。
2. 合并多个文件
$ clai 把 invoice.pdf 和 contract.pdf 合成一个文档→ pdfunite invoice.pdf contract.pdf merged.pdf
最后一个参数永远是结果,它前面的都是源文件,顺序就是它们出现的顺序。命令本身没有输出,用 pdfinfo 核对。
3. 拆成单页
$ clai 把 merged.pdf 拆成每页一个文件→ pdfseparate merged.pdf page-%d.pdfpage-1.pdfpage-2.pdfpage-3.pdfpage-4.pdf
%d 是必须的——页码会填在那里。上面的清单来自 ls -1,pdfseparate 自己一声不吭。
4. 抽取一个页码范围
$ clai 把第 2 到第 3 页取出来→ pdfseparate -f 2 -l 3 merged.pdf slice-%d.pdfslice-2.pdfslice-3.pdf
-f 是起始页,-l 是结束页。注意你拿到的是什么:两个文件,而不是一个两页的文档,而且编号保留了原始页码。
5. 把范围合成一个文档
$ 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 压缩这个 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 知道你描述的活该由哪一套工具来做,并在执行前把命令显示出来。一行安装。