Автоматизация пережатия pdf файлов
Задача: есть некоя файловая помойка, размер которой вырос до неприличных размеров. Необходимо pdf файлы пережать до «еле читабельного» состояния.
Решение: напишем соответствующий скрипт на Bash
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#! /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: со временем скрипт чуть изменился. А именно добавил проверку «а помогло ли сжатие». Если эффекта нет, то и не заменяем пережатый файл
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#! /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 |