Слияние нескольких jpg в один pdf в Linux
я использовал следующую команду, чтобы преобразовать и объединить все jpg
файлы в каталоге в один pdf-файл.
convert *.jpg file.pdf
файлы в каталоге пронумерованы от 1.jpg
до 123.jpg
. Конвертация прошла нормально, но после преобразования все страницы были перепутаны. Я хотел, чтобы в pdf были страницы из 1.jpg
до 123.jpg
в том же порядке, как они названы. Я попытался с помощью следующей команды:
cd 1
FILES=$( find . -type f -name "*jpg" | cut -d/ -f 2)
mkdir temp && cd temp
for file in $FILES; do
BASE=$(echo $file | sed 's/.jpg//g');
convert ../$BASE.jpg $BASE.pdf;
done &&
pdftk *pdf cat output ../1.pdf &&
cd ..
rm -rf temp
но все равно не повезло. Операционная платформа Линукс.
6 ответов:
проблема в том, что ваша оболочка расширяет подстановочный знак в чисто алфавитном порядке, и поскольку длины чисел различны, порядок будет неправильным:
$ echo *.jpg 1.jpg 10.jpg 100.jpg 101.jpg 102.jpg ...
решение состоит в том, чтобы заполнить имена файлов нулями по мере необходимости, чтобы они были одинаковой длины перед запуском команды преобразования:
$ for i in *.jpg; do num=`expr match "$i" '\([0-9]\+\).*'`; > padded=`printf "%03d" $num`; mv -v "$i" "${i/$num/$padded}"; done
Теперь файлы будут сопоставлены подстановочным знаком в правильном порядке, готовые для команды преобразования:
$ echo *.jpg 001.jpg 002.jpg 003.jpg 004.jpg 005.jpg 006.jpg 007.jpg 008.jpg ...
или просто читать
ls
инструкцию и видите :- V естественный вид (версия) чисел в тексте
Итак, делаем то, что нам нужно в одну команду.
convert `ls -v *.jpg` foobar.pdf
удачи ;) Ф.
вот как я это делаю:
Первая строка конвертировать все файлы jpg в pdf он использует команду convert.
Вторая строка объединяет все pdf-файлы в один файл в формате pdf на странице. Это с помощью gs ((PostScript и PDF язык интерпретатора и предварительного просмотра))for i in $(find . -maxdepth 1 -name "*.jpg" -print); do convert $i ${i//jpg/pdf}; done gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=merged_file.pdf -dBATCH `find . -maxdepth 1 -name "*.pdf" -print"`
все вышеперечисленные ответы не удались для меня, когда я хотел объединить много изображений jpeg с высоким разрешением (из отсканированной книги).
Imagemagick попытался загрузить все файлы в оперативную память, поэтому я использовал следующий двухэтапный подход:
find -iname "*.JPG" | xargs -I'{}' convert {} {}.pdf pdfunite *.pdf merged_file.pdf
обратите внимание, что при таком подходе вы также можете использовать GNU parallel для ускорения преобразования:
find -iname "*.JPG" | parallel -I'{}' convert {} {}.pdf
смешивая первую идею с их ответом, я думаю, что этот код может быть удовлетворительным
jpgs2pdf.sh #!/bin/bash cd FILES=$( find . -type f -name "*jpg" | cut -d/ -f 2) mkdir temp > /dev/null cd temp for file in $FILES; do BASE=$(echo $file | sed 's/.jpg//g'); convert ../$BASE.jpg $BASE.pdf; done && pdftk `ls -v *pdf` cat output ../`basename `.pdf cd .. rm -rf temp
вы могли бы использовать
convert '%d.jpg[1-132]' file.pdf
через https://www.imagemagick.org/script/command-line-processing.php:
другой способ обращения к другим файлам изображений-это встраивание форматирование символа в имени файла с диапазоном сцены. Рассмотрим имя файла
image-%d.jpg[1-5]
. Команда
magick image-%d.jpg[1-5]
причины ImageMagick для того, чтобы попытаться прочесть изображений с этими именами:
image-1.jpg image-2.jpg image-3.jpg image-4.jpg image-5.jpg
посмотреть также https://www.imagemagick.org/script/convert.php