用于裁剪PDF文件的命令行工具

我正在寻找一个开源的命令行工具,可以像Adobe Acrobat Pro一样裁剪PDF文件。到目前为止,我已经尝试了PdfTk、ImageMagick、PyPDF和GhostScript,但都没有成功。

你能描述一下Adobe Acrobat Pro可以进行哪些裁剪吗?因为我没有它,所以不能告诉你具体需求。 - xubuntix
在Adobe Acrobat Pro中,我们可以使用边距控制来裁剪PDF。我们可以提供上、下、右和左的数值来进行裁剪。 - Rakesh
11个回答

我建议你看一下PDFcrop
如果你想要裁剪一个pdf文件,左边、顶部、右边和底部的边距分别为5、10、20和30个点(pt),那么运行以下命令:
pdfcrop --margins '5 10 20 30' input.pdf output.pdf

在终端中,要实际裁剪掉某些内容,可以在裁剪参数中使用负值。例如,
pdfcrop --margins '-50 -50 -50 -50' input.pdf output.pdf

从左侧、顶部、右侧和底部裁剪50个点(按照这个顺序)。
如果只运行命令pdfcrop input,它将输出一个名为input-crop.pdf的文件,其中没有边距。当在文档中包含PDF插图时,我发现这非常方便。
裁剪多个文件
不幸的是,pdfcrop不能同时裁剪多个文件。但是,很容易编写一个脚本,在脚本所在的文件夹中裁剪所有的PDF文件。
创建一个新的空文件,并将其命名为something.sh。用文本编辑器打开它,并插入以下内容:
#!/bin/bash
for FILE in ./*.pdf; do
  pdfcrop "${FILE}"
done

保存并关闭。然后右键点击文件,进入“属性>权限”,勾选“允许将文件作为程序执行”。现在关闭对话框。通过双击脚本并选择“在终端中运行”来运行脚本。现在文件夹中将会打印出所有 PDF 文件的新的零边距裁剪版本,后缀为“-crop”。如果你需要边距或其他内容,当然可以直接打开脚本,在“pdfcrop”之后添加参数。

请注意,除了指定负边距之外,还可以使用 --bbox "<left> <bottom> <right> <top>"。这样可以使用我在下面的答案中描述的方法来确定裁剪区域。 - bluenote10
有没有可能告诉我需要裁剪的页码? - L.K.
我担心要么全都做,要么什么都不做。pdfcrop --help列出了可用的选项。我在那里没有看到任何允许指定页面范围的内容。 - Rasmus
14比较PDFCrop的输出和输入大小,看起来pdfcrop只修改边界框,而不删除数据。因此,这种方法不适合使PDF文件变小或隐藏信息。 - init_js
如果你需要页面变大,使用正数,比如 --margins 5;如果你需要它们变小,使用负数,比如 --margins -5 - Hatshepsut
请注意,PDF 中的超链接不会被保留。 - koppor
在最简单的形式中,它也可以与pdfcrop input.pdf一起使用。不需要指定边距,并且会自动选择输出文件名。 - Scz
为了补充@Scz的评论,在我的pdfcrop版本(v1.33)中,文本字符串-crop被附加到输入文件名的基本名称部分。 - Digger
2pdfcrop很慢(在有550页的PDF文件上),而且将我的文件大小增加了十倍。对我来说,这个方法更好用:https://tex.stackexchange.com/a/42259/193342 - user313032
我可以只在一侧,例如左侧进行裁剪吗? - Frederick Nord
@FrederickNord,是的。用例如 -50 0 0 0 来设置边距。 - Rasmus

感谢Rasmus,您可以从texlive-extra-utils软件包中安装pdfcrop:
sudo apt-get install texlive-extra-utils

然后使用pdf crop命令来裁剪pdf文件,如下所示:
pdfcrop input.pdf output.pdf

使用--help命令查看更多令人惊叹的参数,例如--margins
pdfcrop --margins 5 input.pdf output.pdf

从每一页的两侧裁剪5个像素的PDF作物。

3测量单位是 bp,与 pt 稍有不同。请参见https://tex.stackexchange.com/questions/8260/what-are-the-various-units-ex-em-in-pt-bp-dd-pc-expressed-in-mm。 - koppor
5对我来说,pdfcrop将文件大小从300倍增加到了2GB(从7MB)。之后,我不得不运行gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS="/ebook" -sOutputFile=output2.pdf output.pdf,这样可以修复文件大小的问题。 - fiktor
谢谢你的回答。我只是希望texlive-extra-utils不需要87个依赖项(388 MB)。我知道,在这个拥有数千兆字节磁盘空间的时代,这有什么关系,但还是有点小题大做 :) - piit79

你还可以使用Ghostscript简单地裁剪PDF文件。我写了一个小脚本来简化这个过程(受到this answer的启发):
#!/bin/bash

if [ $# -lt 5 ]
then
  echo "Usage: `basename $0` <pdf-file> <x_min> <x_max> <y_min> <y_max>"
  echo "Notes:"
  echo " - all coordinates are absolute; no calculation of width/height necessary"
  echo " - use 'gv' to determine the coordinates"
  exit 65
fi

file="$1"
xmin="$2"
xmax="$3"
ymin="$4"
ymax="$5"

base="${file%.*}"
outfile="${base}_cropped.pdf"

echo "writing to: $outfile"

gs \
  -o $outfile \
  -sDEVICE=pdfwrite \
  -c "[/CropBox [$xmin $ymin $xmax $ymax] /PAGES pdfmark" \
  -f $file

为了确定裁剪的坐标,我使用gv,它以与Ghostscript相同的单位打印鼠标光标的坐标。例如,在这里我确定x/y的最小坐标(即左上角的值):

crop1

现在是最大坐标:

crop2

最后,我运行了脚本 pdf_crop_by_coordinates.sh test.pdf 45 429 38 419,生成了一个名为 test_cropped.pdf 的文件,它的样子是这样的:

result

我不知道Ghostscript解决方案在质量和正确性方面与pdfcrop相比如何。

3对我来说,根本就不好用,这对于像Ghostscript这样的强大工具来说真是令人惊讶。但是pdfcrop完美地完成了工作,并且一次就搞定了。单位有些奇怪,需要时间来看是否可以配置为标准单位:pt、px或类似的单位。 - u2n

当我无法使用pdftk完成某项任务时,我转向PDFjam,它是pdfpages LaTeX包的命令行封装(因此您还需要安装该软件和TeX发行版)。要了解如何使用它,请参考常规的帮助界面:

pdfjam --help

由于man页面内容有限,而网页则更注重示例。

要裁剪PDF文件,您需要使用类似以下命令:

pdfjam --keepinfo --trim "10mm 15mm 10mm 15mm" --clip true --suffix "cropped" input.pdf

这将输出一个名为input-cropped.pdf的文件。修剪的顺序应该是左、底部、右、顶部,就像graphicx中的\includegraphics一样。
为了让你对它与PDFcrop相比有个概念,我最近需要修剪一个相当复杂的PDF文件。我的原始文件大小为675 kB,通过PDFjam修剪后的版本为1.2 MB,而通过PDFcrop修剪的版本为4.5 MB。虽然PDFjam和PDFcrop都去除了嵌入的超链接和书签,但PDFjam使用--keepinfo选项保留了文档属性(例如标题、作者、主题)。

5注意:这并不真正删除PDF中超出屏幕的内容,只是隐藏它。与最高评分答案中@init_js评论的情况相同。 - Jan Żankowski
这对我很有效。起初我并没有意识到--margin '0'的pdfcrop甚至会去掉它发现的空白部分,非零的边距从那里调整。我的PDF文件上有烦人的裁剪标记,所以使用这个pdfjam程序更好地去除它们。 - Jason Kleban
有没有办法保留批注呢?我发现使用pdfcrop或者pdfjam之后,批注都消失了。 - Yan King Yin
这个解决方案还会删除书签/索引/目录。 - user202729

Briss 不是命令行工具,但值得一看。


这是一款非常棒的软件,它能够保留我的批注!GUI界面让你可以同时查看PDF的所有页面! - Yan King Yin

pdfCropMargins程序是一个命令行应用程序,用于自动裁剪PDF文件的边距。
该程序依赖于系统中已安装(并可定位)的Ghostscript程序或pdftoppm程序。它使用PIL分析页面图像以找到边界框,并使用阈值191。
安装方法如下: pip install pdfCropMargins
运行方法如下: pdf-crop-margins -v -s -u your-file.pdf
获取帮助,请执行以下命令: pdf-crop-margins -h | more


这可能对你有所帮助。 这符合Ubuntu和生活的最新版本。 这是Master PDF Editor。你可以用它裁剪、添加一些东西等。
示例: 这是之前 This is before 这是按下ctrl + k之后 enter image description here

你可以使用这个页面上的pypdf脚本。但是在这个stackexchange问题的答案中,似乎还有很多其他选择。

我无法理解左上右下的参数是什么。它们是点、英寸还是厘米? - Rakesh
@Rakesh:请看我的回答,其中解释了参数的含义以及如何轻松确定它们。 - bluenote10