Command line tool to crop PDF files

I would suggest you take a look at PDFcrop.

If you wish to crop a pdf with left, top, right and bottom margins of 5, 10, 20, and 30 pt (points), then run

pdfcrop --margins '5 10 20 30' input.pdf output.pdf

in terminal. To actually crop something away, use negative values in the argument for crop. For example,

pdfcrop --margins '-50 -50 -50 -50' input.pdf output.pdf

crops 50 pts from the left, top, right, bottom (in this order).

If you run only the command pdfcrop input, it will output a file titled input-crop.pdf with zero margins. I find this very handy when including pdf illustrations in documents.

Cropping multiple files

Unfortunately, pdfcrop cannot crop multiple files at the time. It is however easy to write a script that will crop all pdfs in the folder the script is located in.

Create a new empty file, and call it something.sh. Open it with a text editor and insert the following:

#!/bin/bash
for FILE in ./*.pdf; do
  pdfcrop "${FILE}"
done

Save it, and close. Then right click the file, go to Properties > Permissions and check the field Allow executing file as program. Now close the dialog. Run the script by double clicking it and choosing Run in Terminal. And new, zero-margin cropped version of all pdfs with suffix -crop will now be printed in the folder. If you want margins or other things, you can of course just open the script and add arguments after pdfcrop.


Thanks for Rasmus, you can install pdfcrop from texlive-extra-utils package:

sudo apt-get install texlive-extra-utils

Then crop pdf files using pdf crop command as:

pdfcrop input.pdf output.pdf

use --help to see more amazing parameters like --margins

pdfcrop --margins 5 input.pdf output.pdf

which crop pdf with 5 bp from each side of page


You can also crop PDF files simply using Ghostscript. I have written a small script to simplify the process (inspired by 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

In order to determine the coordinates for cropping, I use gv, which prints the coordinates of the mouse cursor using the same units as Ghostscript. For example, here I determine the minimum coordinates for x/y (the values in the upper left corner):

crop1

Now the maximum coordinates:

crop2

And finally, I run the script pdf_crop_by_coordinates.sh test.pdf 45 429 38 419 producing a test_cropped.pdf which looks like that:

result

I have no idea though, how the Ghostscript solution compares to pdfcrop in terms of quality and correctness.