blog/source/_posts/make-pdf-files-smaller.md

2.4 KiB

title subtitle date tags
Make PDF files smaller Convert to grayscale and reduce the resolution. 2019-01-05
pdf

The most effective ways of reducing the file size of a PDF is by converting to grayscale and reduce the resolution.

Requirement: ghostscript (installed by default in Ubuntu)

Single PDF

Save the following script as "pdfcompress.sh".

Usage: sh pdfcompress.sh input.pdf

The output compressed file is named as "input.compressed.pdf"

#!/bin/sh

filename=$(basename "$1")
dir=$(dirname "$1")

gs \
	-sOutputFile="$dir/${filename%.*}.compressed.pdf" \
	-sDEVICE=pdfwrite \
	-dPDFSETTINGS=/ebook \
	-sColorConversionStrategy=Gray \
	-sColorConversionStrategyForImages=/Gray \
	-dProcessColorModel=/DeviceGray \
	-dCompatibilityLevel=1.4 \
	-dNOPAUSE -dBATCH -dQUIET \
	"$1"

Options (more info):

  • Remove ColorConversionStrategy, ColorConversionStrategyForImages and ProcessColorModel lines to retain colour.
  • PDFSETTINGS:
    • /default selects output intended to be useful across a wide variety of uses. 72 DPI.
    • /screen selects low-resolution output similar to the Acrobat Distiller "Screen Optimized" setting. 72 DPI.
    • /ebook selects medium-resolution output similar to the Acrobat Distiller "eBook" setting. 150 DPI.
    • /printer selects output similar to the Acrobat Distiller "Print Optimized" setting. 300 DPI.
    • /prepress selects output similar to Acrobat Distiller "Prepress Optimized" setting. 300 DPI.

PDFs in a folder

Use the following script to compress all PDFs in a folder.

Usage: sh pdfcompress.sh 'target folder'

#!/bin/sh

cd "$1"

for i in *.pdf; do
    [ -f "$i" ] || break

	# Skip compressed PDFs
	echo "$i" | grep --quiet ".compressed.pdf"

	if [ $? = 1 ]
	then
		gs \
			-sOutputFile="${i%.*}.compressed.pdf" \
			-sDEVICE=pdfwrite \
			-dPDFSETTINGS=/ebook \
			-sColorConversionStrategy=Gray \
			-sColorConversionStrategyForImages=/Gray \
			-dProcessColorModel=/DeviceGray \
			-dCompatibilityLevel=1.4 \
			-dNOPAUSE -dBATCH -dQUIET \
			"$i"
	fi
done



Source: Internal Pointers, firstdoit, ahmed-musallam, Ghostscript Docs