Various useful PDF manipulation commands
Posted on Thu 20 February 2020 in linux • 2 min read
Merging and rotating PDFs
Merging PDFs can be easily done with pdftk. You can also use this tool to select
only specific pages from your document or rotate pages. This is my go-to tool if I
don't have to manipulate pages beyond rotation.
To concatenate all PDFs in the working directory use
pdftk *.pdf cat output filename.pdf
To select only pages 1-3 and 5 from one document use
pdftk input.pdf cat 1-3 5 output filename.pdf
This even works with pages from multiple input files
pdftk A=input1.pdf B=other_file.pdf cat A1 A2 B7 B3 output filename.pdf
Rotation can be done with the rotate subcommand, to rotate page 4 by 180 degrees use
pdftk input.pdf rotate 4south output output.pdf
It is also possible to combine everything
pdftk A=input1.pdf B=other_file.pdf cat A1left B1left B2right output filename.pdf
See also the manpage for details.
Printing in special arrangements
Assuming you have a PDF and want to print that as a brochure or you want to
print one A5 page two times on an A4 page. A useful tool for that is pdfjam,
which you might already have installed. At least in Archlinux it is included in
the texlive-core package.
Brochure or Book printing of a document
pdfbook input.pdf
You can also set the output format using pdfbook2 (which should be available
using TeX Live) with pdfbook2 --paper=a5paper input.pdf to some paper format
known to LaTex. Use the --short-edge option if you need short edge double
sided printing (See also pdfbook2 --help).
Print single page A5 document two times on A4 sheet
pdfjam --nup 2x1 --landscape --outfile out.pdf input.pdf input.pdf
This can also be done as a script which handles input file rotation correctly
#!/bin/zsh
infile="$1"
outfile="$2"
[[ -z $infile ]] && echo 'Input file required!' && exit 2
[[ -z $outfile ]] && echo 'Output file required!' && exit 3
[[ $(pdfinfo $infile | grep Pages | grep -o '[0-9]\+') -gt 1 ]] && echo 'One single page documents!' && exit 1
wdir=$(mktemp -d)
dims=("${(@f)$(pdfinfo $infile | grep 'Page size' | grep -o '[0-9]\+\.[0-9]\+')}")
landscape=$(bc <<< "$dims[1] >= $dims[2]")
if [ $landscape -eq 1 ]
then
pdfjam --angle 90 --fitpaper true --rotateoversize true --quiet --outfile $wdir/rot.pdf $infile
else
cp $infile $wdir/rot.pdf
fi
pdfjam --nup 2x1 --landscape --quiet --outfile $wdir/out.pdf $wdir/rot.pdf $wdir/rot.pdf
if [ $landscape -eq 1 ]
then
pdfjam --angle 270 --fitpaper true --rotateoversize true --quiet --outfile $outfile $wdir/out.pdf
else
cp $wdir/out.pdf $outfile
fi
rm -rf $wdir
which can be used easily like
./a5-to-double-a4 input.pdf out.pdf
In the script above some rotation commands are also used: pdf90 and pdf270