Объединить несколько JPG в один PDF в Linux

44

Я использовал следующую команду для преобразования и объединения всех файлов 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

Но все равно не повезло. Операционная платформа Linux.

  • 1
    Добавление комментария от имени пользователя sindhus, у которого не было достаточно точек для комментариев (см. Ниже): команда convert является частью пакета imagemagick .
Теги:

6 ответов

12
Лучший ответ

Проблема заключается в том, что ваша оболочка расширяет подстановочный знак в чисто алфавитном порядке, а поскольку длины чисел разные, порядок будет неправильным:

$ echo *.jpg
1.jpg 10.jpg 100.jpg 101.jpg 102.jpg ...

Решение состоит в том, чтобы заполнить имена файлов нулями по мере необходимости, чтобы они были одинаковой длины перед запуском команды convert:

$ for i in *.jpg; do num=`expr match "$i" '\([0-9]\+\).*'`;
> padded=`printf "%03d" $num`; mv -v "$i" "${i/$num/$padded}"; done

Теперь файлы будут сопоставлены подстановочным знаком в правильном порядке, готовым для команды convert:

$ echo *.jpg
001.jpg 002.jpg 003.jpg 004.jpg 005.jpg 006.jpg 007.jpg 008.jpg ...
  • 0
    Я создал файл sh с вашим кодом. Но во время работы отображается следующая ошибка: rename.sh: 2: rename.sh: Bad substitution
  • 0
    Вы используете Bash? Если да, то какая версия?
Показать ещё 5 комментариев
75

Или просто прочитайте руководство ls и посмотрите:

-v натуральный вид (версии) в тексте

Итак, делаем то, что нам нужно в одиночной команде.

convert `ls -v *.jpg` foobar.pdf

Удачи;) F.

  • 0
    Это было бы здорово, если бы это работало ..
  • 1
    @ Джейсон: Это работает (+1). Но вы в конце концов забыли, что большинство цифровых камер хранят свои изображения как *.JPG а не как *.jpg ?
Показать ещё 4 комментария
3

Вот как я это делаю:
Первая строка преобразует все файлы 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"`
1

Все приведенные выше ответы не помогли мне, когда я захотел объединить много изображений jpeg с высоким разрешением (из сканированной книги).

Imagemagick попытался загрузить все файлы в ОЗУ, поэтому я использовал следующий двухэтапный подход:

find -iname "*.JPG" | xargs -I'{}' convert {} {}.pdf
pdfunite *.JPG merged_file.pdf

Обратите внимание, что при таком подходе вы также можете использовать GNU для ускорения преобразования:

find -iname "*.JPG" | parallel -I'{}' convert {} {}.pdf
0

Вы можете использовать

convert '%d.jpg[1-132]' file.pdf

через https://www.imagemagick.org/script/command-line-processing.php:

Другим способом обращения к другим файлам изображений является вложение форматирующий символ в имени файла с диапазоном сцены. Рассмотрим filename 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

0

Смешивая первую идею с их ответом, я думаю, что этот код может быть удовлетворительным

jpgs2pdf.sh

#!/bin/bash

cd $1
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 $1`.pdf
cd ..
rm -rf temp

Ещё вопросы

Сообщество Overcoder
Наверх
Меню