27
январь
2022
19:21

Операции с PDF-файлами из командной строки Linux

27 январь 2022 19:21

По работе мне часто приходится работать с файлами PDF - объединение файлов и сжатие. Чтобы не перезагружаться в Windows, где я раньше использовал утилиту "PDF tools free", автоматизировал этот процесс подобрав соответствующие команды пакетного преобразования и обработки PDF в JPEG, JPEG в PDF, PDF в PDF (сжатие).

Пункт Функция Команда терминала
1. Объединить несколько PDF файлов в один (Merge several PDF Files into one File outpit.pdf)
infile1.pdf+infile2.pdf+infile3.pdf = output.pdf
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile='output.pdf' 'infile1.pdf' 'infile2.pdf' 'infile3.pdf'

или

qpdf --empty --pages infile1.pdf infile2.pdf -- output.pdf
Объединить несколько страниц из различных файлов PDF (Merge several pages from PDF files into one File)

infile1.pdf(p.1, 12-13)+infile2.pdf(p.1-10)+infile3.pdf(p.44) = output.pdf
qpdf --empty --pages infile1.pdf 1,12-13 infile2.pdf 1-10 infile3.pdf 44 -- output.pdf
2. Вычленить из файла страницы 5-7 и 12 и сохранить их в отдельный файл (Split pages from 5 to 7 and 12 to the new file output.pdf) qpdf input.pdf --pages . 5-7,12 -- output.pdf

или

qpdf --empty --pages input.pdf 5-7,12 -- output.pdf
Изменить порядок страниц во входном файле с 1 2 3 4 на 4 3 2 1 (Pages reorder to 4,3,2,1), сохранить в новый файл output.pdf (save to new file output.pdf) qpdf 'infile.pdf' --pages . 4,3,2,1 -- output.pdf
Из файла имеющего 17 страниц, удалить первую (Delete first page from file consisting 16 pages) qpdf infile.pdf out.pdf --pages infile.pdf 2-17 --

или

qpdf 'infile.pdf' --pages . 2-17 -- output.pdf
Из файла имеющего 17 страниц, удалить последнюю (Delete last page from file consisting 16 pages) qpdf infile.pdf out.pdf --pages infile.pdf 1-16 --
Из файла имеющего 17 страниц, удалить заданные страницы: №6 и №10-12 ( from file consisting 17 pages delete page number 6 and range 10-12) qpdf infile.pdf out.pdf --pages infile.pdf 1-5,7-9,13-17 --
3. Повернуть все страницы на 180 градусов (Rotate all pages by 180 degrees) qpdf in.pdf out.pdf --rotate=+180
Повернуть страницы №1 и №2 на 90 градусов по часовой стрелке qpdf in.pdf' out.pdf --rotate=+90:1-2
Повернуть страницу №3 на 90 градусов против часовой стрелки qpdf in.pdf' out.pdf --rotate=-90:3
Повернуть все файлы PDF в текущем каталоге на 90 градусов по часовой стрелке for f in $(ls ./*.pdf); do qpdf $f $f.out --rotate=+90; rm $f; mv $f.out $f; done
4. Разбить PDF постранично, каждую страницу сохранить в отдельный файл PDF (Split pages) : infile.pdf -> out-1.pdf, out-2.pdf, ..., out-n.pdf qpdf infile.pdf out.pdf --split-pages
5. Разбить PDF постранично, каждую страницу сохранить в отдельный файл PDF (Split PDF on pages with output file mask) с указанием маски файла : infile.pdf -> out01.pdf, out02.pdf, ..., outNN.pdf (Split pages with file mask %d) qpdf --split-pages=1 infile.pdf out%d.pdf
6. Преобразовать PDF в JPG с плотностью пикселей 300 dpi и качеством JPEG q=30 (сильное сжатие), поместить изображения каждой страницы в папку "images", файлы с префиксом "pg-" нумерацией страниц pg-01.jpg, pg-02.jpg и т.д. mkdir -p images && pdftoppm -jpeg -r 300 -jpegopt quality=30 'infile.pdf' images/pg
7. Преобразовать файлы *.jpg в файлы PDF без их объединения (Batch convert JPG to PDF files without combining) for f in $(ls images/*.jpg); do convert $f $f.pdf ; done
8. Объединить все PDF файлы в каталоге images в единый файл PDF "output.pdf" (Compound all PDFs in folder "images" into single PDF file) qpdf --empty --pages ./images/*.pdf -- output.pdf
9. Пережать один файл infile.pdf в compressed.pdf (Recompress single PDF file) (Примечание: выполнение данной команды иногда не приводит к уменьшению размера файла: зависит от степени сжатия исходного файла) gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/prepress -dNOPAUSE -dQUIET -dBATCH -sOutputFile=compressed.pdf infile.pdf
10. Пережать все файлы out*.PDF в текущем каталоге одной командой (Recompress all PDF files in the current folder and put result into "compressed" folder). Результат положить в каталог compressed.

См. примечание выше.
mkdir -p compressed && for f in $(ls out*.pdf); do gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/prepress -dNOPAUSE -dQUIET -dBATCH -sOutputFile=./compressed/$f $f; done
11. Выполнить сильную компрессию файла PDF одной командой (Make ultra compression of PDF file) mkdir -p images && pdftoppm -jpeg -r 96 -jpegopt quality=30 'infile.pdf' images/pg && for f in $(ls images/pg-*.jpg); do convert $f $f.pdf ; done && qpdf --empty --pages ./images/*.pdf -- outfile.pdf && rm -R images
12. Уменьшить разрешение JPG до 25%, сделать перенумерацию по порядку и сохранить в файлы JPG с качеством JPEG q=50 (сильное сжатие), поместить изображения в папку "images" mkdir -p images && i=1 ; for f in $(ls *.jpg); do convert -resize 25% -quality 50 $f ./images/img$i.jpg ; let i=i+1; done
13. Уменьшить разрешение JPG до 700x525, применить автоуровни, немного повысить резкость, сделать перенумерацию по порядку и сохранить в файлы JPG с качеством JPEG q=50 (сильное сжатие), поместить изображения в папку "images" mkdir -p images && i=1 ; for f in $(ls *.jpg); do convert -resize 700x525 -auto-level -unsharp 0.65x0.65+1+0.9+0.04 -quality 50 $f ./images/img$i.jpg ; let i=i+1; done
14. НОВОЕ: к файлам JPEG применить автоуровни, увеличить степень сжатия JPG до 40 (сильное сжатие), файлы сохранить под исходными именами (перезаписать файлы поверх)" mogrify -auto-level -quality 40% *.jpg
15. В ОДНО ДЕЙСТВИЕ: сжать все файлы *.PDF в outPDF с параметрами: разрешение 150 ppi, Q=37%, применив автоуровни яркости (Compress all PDF files with one action, with auto-levels applied, and place the result in the same folder with names out*.pdf) for p in $(ls *.pdf); do mkdir -p images && pdftoppm -jpeg -r 150 -jpegopt quality=100 $p images/pg && for f in $(ls images/pg-*.jpg); do mogrify -auto-level -quality 37% $f; convert $f $f.pdf ; done && qpdf --empty --pages ./images/*.pdf -- 'out'$p && echo $p && echo $p && rm -R images; done
16. В ОДНО ДЕЙСТВИЕ: сжать все файлы "*.PDF" в outPDF с параметрами: разрешение 120 ppi, Q=30% , применив автоуровни яркости и повышение резкости на 15% (Compress all PDF files *.pdf with one action, with auto-levels and sharpen applied, and place the result in the same folder with names out*.pdf) shopt -s nocaseglob && for p in $(ls *.pdf); do mkdir -p images && pdftoppm -jpeg -r 150 -jpegopt quality=100 $p images/pg && for f in $(ls images/pg-*.jpg); do mogrify -auto-level -sharpen 15% -quality 30% $f; convert $f $f.pdf ; done && qpdf --empty --pages ./images/*.pdf -- 'out'$p && echo $p && rm -R images; done
17. В ОДНО ДЕЙСТВИЕ: сжать все файлы "*.PDF" с параметрами: разрешение 120 ppi, Q=30% , применив автоуровни яркости, результат поместить в папку "compressed" (Compress all PDF files with one action, with auto-levels and sharpen applied, place in the folder named "compressed") mkdir compressed && shopt -s nocaseglob && for p in $(ls *.pdf); do mkdir -p images && pdftoppm -jpeg -r 150 -jpegopt quality=100 $p images/pg && for f in $(ls images/pg-*.jpg); do mogrify -auto-level -quality 37% $f; convert $f $f.pdf ; done && qpdf --empty --pages ./images/*.pdf -- './compressed/'$p && echo $p && rm -R images; done

Если при запуске одной из команд возникает ошибка "convert-im6.q16: attempt to perform an operation not allowed by the security policy PDF' @ error/constitute.c/IsCoderAuthorized/421.", нужно сделать следующее:

  • открыть на редактирование файл /etc/ImageMagick-6/policy.xml (или -7 в зависимости от версии):
    sudo nano /etc/ImageMagick-6/policy.xml
    либо
    sudo nano /etc/ImageMagick-7/policy.xml
  • найти раздел <policymap> и перейти в его конец перед тегом </policymap>
  • вставить строку
    <policy domain="coder" rights="read | write" pattern="PDF" />
  • сохранить изменения файла policy.xml

Последнее изменение: 21.11.2023 - изменена строка №16 и добавлена строка №17.



Похожие публикации