Автоматизация пережатия pdf файлов
Задача: есть некоя файловая помойка, размер которой вырос до неприличных размеров. Необходимо pdf файлы пережать до «еле читабельного» состояния.
Решение: напишем соответствующий скрипт на Bash
#! /bin/bash
from='2025-01-15'
to='2025-01-17'
find ~/wedwewe -type f -newermt "$from" ! -newermt "$to" -name "*.pdf" | while read fname; do
echo "-compress: $fname"
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=res.pdf "$fname"
if [ $? -eq 0 ]; then
echo OK
mv res.pdf "$fname"
else
echo FAIL
fi
done
Что делает этот скрипт? А просто ищет все файлы созданные в указанном диапазоне дат. Далее последовательно пытается пережать каждый файл, и если это происходит успешно, то заменяет оригинал на получившийся пережатый файл. Опции dPDFSETTINGS:
/screen Более низкое качество и меньший размер. (72 т/д)
/ebook Лучшее качество, но чуть больший размер (150 dpi)
/prepress Вывод имеет более высокий размер и качество (300 dpi)
/printer Качество вывода подходит для принтерной печати (300 dpi)
/default Выбирает вывод, который подходит для нескольких целей, однако может создавать большие PDF-файлы.
Update: со временем скрипт чуть изменился. А именно добавил проверку «а помогло ли сжатие». Если эффекта нет, то и не заменяем пережатый файл
#! /bin/bash
from='2025-01-13'
to='2025-01-17'
find ~/shwedwed -type f -newermt "$from" ! -newermt "$to" -name "*.pdf" | while read fname; do
echo "-compress: $fname"
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray -dNOPAUSE -dQUIET -dBATCH -sOutputFile=res.pdf "$fname"
if [ $? -eq 0 ]; then
echo OK
size_before=$(wc -c <"$fname")
size_after=$(wc -c <"res.pdf")
if [[ $size_before -gt $size_after ]]
then
echo "-результат сжатия хороший. Заменяем файл..."
mv res.pdf "$fname"
else
echo "-сжатие не удачное, пропускаем.."
fi
else
echo FAIL
fi
done