使用Ghostscript 9.01裁剪PDF

50

我不是程序员,但想学习如何使用Ghostscript剪裁PDF。

我已在我的计算机上安装了Ghostscript 9.01。

请按照以下步骤(从调用Ghostscript开始)引导我如何裁剪具有特定坐标的PDF。

我甚至对Ghostscript也不熟悉。

4个回答

81

首先,需要注意的是PDF的测量单位与PostScript相同:它被称为point[pt]。

72 points == 1 inch == 25.4 millimeters

假设您的页面大小是A4。那么介质尺寸为:

595 points width  == 210 millimeters
842 points height == 297 millimeters

假设您想要裁剪:

   left edge: 24 points == 1/3 inch ~=  8.5 millimeters
  right edge: 36 points == 1/2 inch ~= 12.7 millimeters
    top edge: 48 points == 2/3 inch ~= 17.0 millimeters
 bottom edge: 72 points ==   1 inch ~= 25.4 millimeters

那么你的 Ghostscript 命令行(在 Windows 上)如下:

gswin32c.exe                     ^
  -o cropped.pdf                 ^
  -sDEVICE=pdfwrite              ^
  -c "[/CropBox [24 72 559 794]" ^
  -c " /PAGES pdfmark"           ^
  -f uncropped-input.pdf

或者在 Linux 上:

gs                               \
  -o cropped.pdf                 \
  -sDEVICE=pdfwrite              \
  -c "[/CropBox [24 72 559 794]" \
  -c " /PAGES pdfmark"           \
  -f uncropped-input.pdf

然而,这种方法可能不适用于所有类型的PDF文件 [1]。在这些情况下,您可以尝试以下命令:

gswin32c.exe                 ^
  -o cropped.pdf             ^
  -sDEVICE=pdfwrite          ^
  -dDEVICEWIDTHPOINTS=595    ^
  -dDEVICEHEIGHTPOINTS=842   ^
  -dFIXEDMEDIA               ^
  -c "24 72 translate"       ^
  -c " 0 0 535 722 rectclip" ^
  -f uncropped-input.pdf
gs                           \
  -o cropped.pdf             \
  -sDEVICE=pdfwrite          \
  -dDEVICEWIDTHPOINTS=595    \
  -dDEVICEHEIGHTPOINTS=842   \
  -dFIXEDMEDIA               \
  -c "24 72 translate"       \
  -c " 0 0 535 722 rectclip" \
  -f uncropped-input.pdf
[^]: 更具体地说:对于已经定义了特定值的/CropBox的PDF文件,这种方法无效。解决这个问题的一种折衷办法是在运行上述GS命令之前,使用文本编辑器将所有需要的页面上的字符串/CropBox更改为/cROPBoX(或类似的大小写变化)。这种情况的改变有效地“解除”了裁剪框设置(而不改变任何PDF对象偏移使现有的xref表失效),因此它不再被PDF渲染器考虑。

4
如果您不知道原始pdf文件的尺寸,可以尝试使用 gs -sDEVICE=bbox -f uncropped-input.pdf - simonb
7
@jolly swagman:不好意思,不不不!“bbox”设备并不表示原始PDF的“尺寸”。它确实表示每个页面上包含所有印刷或查看页面上标记的(虚拟)框。一个能够获取每个页面的尺寸('MediaBox')的命令是:pdfinfo -box some.pdf - Kurt Pfeifle
1
@pipitas没错,它只能让你感受到页面的大小,但是将来我会使用pdfinfo,因为它似乎更有用。 - simonb
2
然而,这种方法可能并不适用于所有类型的PDF文档。在这些情况下,你应该尝试其他方式[...]。嗯,我已经尝试了Ghostscript 9.10,但它们都没能正常工作。另一方面,podofobox效果更好,速度也更快。请参见如何使用pdftk和/MediaBox裁剪PDF页边距 - Ali
1
@KurtPfeifle 我之前的评论是针对那些尝试您回答中的方法却失败的未来访问者。抱歉,我可能应该在我的评论中说明这一点。我没有对您的回答进行负面评价,它很可能是这个问题的*答案。然而,我的目标是无论如何都要裁剪手头的该死的PDF文件。 :) - Ali
显示剩余9条评论

1
如果有人正在寻找一个可以完成这个任务的脚本,我已经为此创建了一个bash函数:
function crop_pdf() {
    input=$1
    output=$6

    pdf_info=$(pdfinfo -box $input)
    currentWidth=$(echo "$pdf_info" | grep "Page size:" | awk '{print $3}')
    currentHeight=$(echo "$pdf_info" | grep "Page size:" | awk '{print $5}')

    left=$2
    bottom=$3
    right=$(echo "$currentWidth - $4" | bc)
    top=$(echo "$currentHeight - $5" | bc)

    gs -o $output -sDEVICE=pdfwrite -c "[/CropBox [$left $bottom $right $top] /PAGES pdfmark" -f $input
}

使用方法很简单:
crop_pdf input.pdf left bottom right top output.pdf

例如:

crop_pdf mypdf.pdf 20 30 10 33 mypdf-cropped.pdf

在这个例子中,该命令将从左边移除20个点,从底部移除30个点,从右边移除10个点,以及从顶部移除33个点。
"点"是在Kurt Pfeifle的回答中解释过的度量单位。
我不能百分之百确定它是否适用于所有的pdf文件,但我认为它可能有效。
这个脚本需要以下内容:

0
之前的回答只是改变文件的/CropBox视口,而不是实际裁剪PDF内容,让我用图示来解释一下。使用之前回答中的一个命令来“裁剪”GhostScript提供的“Escher”示例。我们可以注意到,左侧结果中的“裁剪”程度是激进的,并且“剪掉”了内容。

enter image description here

那并不是这样,内容仍然存在,我们可以使用自动裁剪来恢复源图像。所以,“裁剪”框是一个可移动的视口进入媒体框。
要物理上“修剪”PDF(类似于遮盖所有四个边),我们需要使用诸如MuPDF mutool“修剪”命令的功能。

0
我首先通过获取我的文件的尺寸开始。
gs -q -dBATCH -dNOPAUSE -sDEVICE=bbox myFile.pdf

每一页的PDF都会输出类似于这样的内容。
%%BoundingBox: 16 14 585 781
%%HiResBoundingBox: 16.991999 14.904000 584.207068 780.500015

然后,基于这些数值,我运行了第二个命令来裁剪所有页面。
gs -o cropped.pdf -sDEVICE=pdfwrite -dDEVICEWIDTHPOINTS=430 -dDEVICEHEIGHTPOINTS=781 -dFIXEDMEDIA -f myFile.pdf

使用GhostScript 10.02.1
gs --version
10.02.1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接