Преобразование нескольких файлов изображений из формата JPEG в формат PDF

50

Я хочу конвертировать некоторые файлы из JPEG в PDF. Я использую следующую команду.

$ convert image1.jpg image1.pdf 

Но у меня есть 100 изображений. Как мне преобразовать их все в соответствующие PDF-файлы?

Я пытался

$ convert image*.jpg image*.pdf 

Не работает

Пратик Деогхаре
источник
Связанный: Как генерировать PDF из серии изображений? на суперпользователя SE
kenorb

Ответы:

62

В Баш:

for f in *.jpg; do
  convert ./"$f" ./"${f%.jpg}.pdf"
done
enzotib
источник
1
Есть какая-то конкретная причина, почему вы добавляете "./" к аргументам конвертирования? Это хорошая практика?
Рахму
4
@rahmu: да, это хорошая практика, потому что имя файла начинается с -проблем, в противном случае.
энзотиб
3
Это работает, но mogrifyнамного меньше печатает. Смотри мой ответ.
CJM
+1, потому что это технически правильно и позволяет избежать ошибок в bash, но -1, потому что mogrify - это способ ImageMagick для пакетного преобразования изображений. Так что нет голосования от меня.
Бенуа
@aculich: спасибо за ваше отрицательное голосование, но вы ошиблись, посмотрите, почему цикл for не вызывает ошибку «слишком длинный аргумент»? ,
энзотиб
56

Вы можете использовать mogrifyкоманду для этого. Обычно он изменяет файлы на месте, но при преобразовании форматов записывает новый файл (просто изменяя расширение в соответствии с новым форматом). Таким образом:

mogrify -format pdf -- *.jpg

(Как и в случае с enzotib ./*.jpg, the --предотвращает интерпретацию любых странных имен файлов как переключателей. Большинство команд распознают --это как «перестаньте искать опции на этом этапе».)

CJM
источник
+1, мой ответ был только о bash, плохо знаю ImageMagick.
энзотиб
Хорошая идея использовать mogrifyвместо convert. Это будет работать для 100 файлов, но использование globbing с *.jpgне масштабируется до тысяч файлов; это можно сделать, объединив команду в простой однострочник сfind .
aculich
Как конвертировать оба *.jpg и *.pngфайлы в один *.pdf? Обратите внимание, что они являются пронумерованными файлами (например, 1.jpg 2.png 3.png 4.jpg), и этот порядок должен быть сохранен / сохранен в выводе pdf.
сумасшедший о Natty
в качестве обходного пути: преобразование всех *.jpgв *.pngв шаге один и выполнение эквивалента вашего ответа в шаге 2 ...
сумасшедший о natty
см. также stackoverflow.com/questions/15315770/…
сумасшедший о Natty
24

более быстрый, но необычный синтаксис:

parallel convert '{} {.}.pdf' ::: *.jpg

Работает параллельно (используя https://www.gnu.org/software/parallel/ ). Я еще не заметил многопоточности convert, которая ограничивала бы эффективное распараллеливание. Если это ваша проблема, см. В комментарии ниже метод, обеспечивающий отсутствие многопоточности.

Себастьян
источник
1
Этот путь полон победы. Он автоматически оценивает количество ядер и запускает столько задач!
Meawoppl
1
Этот метод самый быстрый из всех.
Шивамс
1
параллель - сила, параллель в сочетании с imagemagick - сверхдержава. Мне нравится сверхдержава.
двоюродный брат Кокаин
2
Немного опоздал на вечеринку, но новые (возможно, не во время написания этого ответа) версии ImageMagick являются многопоточными и будут плохо взаимодействовать, если будут работать параллельно. Это можно отключить (если используется распараллеливание на уровне приложения, например, с GNU parallel), установив переменную среды MAGICK_THREAD_LIMIT=1.
zebediah49
Использование ImageMagick для этого приводит к потере генерации и низкой производительности. img2pdf в другом месте на этой странице позволяет избежать этих проблем.
Роберт Флеминг
16

https://gitlab.mister-muffin.de/josch/img2pdf

Во всех предлагаемых решениях с использованием ImageMagick данные JPEG полностью декодируются и перекодируются. Это приводит к потере генерации , а также к снижению производительности в 10–100 раз img2pdf.

Может быть установлен при pip img2pdfусловии, что у вас есть зависимости (например, apt-get install python python-pil python-setuptools libjpeg-devили yum install python python-pillow python-setuptools).

Роберт Флеминг
источник
3
правильно. Вы можете проверить, что в оба конца файл JPEG изменяется с помощью команд вроде convert some.jpg -format pdf -compress jpeg generated.pdf ; pdfimages -j generated.pdf generated.pdf ; diff -sq some.jpg generated.pdf-000.jpg. ИМХО этот ответ заслуживает большего количества голосов. Действительно, convertздесь не img2pdfпроходит , проходит такой тест и даже включает в себя множество опций для установки размера изображения, размера страницы и т. Д., Чтобы точно настроить сгенерированный pdf в соответствии с вашими потребностями.
Стефан Гуричон
3
img2pdfдоступно в обычных репозиториях Ubuntu 16.04, нет необходимости pipвыполнять ручные операции с ними, и вы сохраняете преимущества обновлений.
Стефан Гуричон
1
В то время, когда вопрос был задан (и ответ принят), img2pdf не существовало. Но сегодня img2pdf - лучший ответ.
kmkaplan
13

Вот способ, который объединяет лучшие из приведенных выше предложений в простую, эффективную и надежную командную строку:

find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +

Он отлично работает с именами файлов, которые начинаются с -или содержат пробелы. Обратите внимание, использование -inameкоторого является регистронезависимой версией, -nameпоэтому она будет работать .JPGтак же хорошо, как и .jpg.

Он используется findдля получения списка файлов вместо оболочки с использованием *.jpgподстановочного знака, что может привести к ошибке «Список аргументов слишком длинный» в некоторых системах. Хотя, как указывает @enzotib в комментарии, поведение использования globbing в цикле for отличается от поведения аргументов команды .

Кроме того, он findбудет обрабатывать подкаталоги, в то время как глобальное копирование оболочки не будет происходить, если только у вас не появятся специфические для оболочки функции, такие как **/*jpgсинтаксис рекурсивного глобирования в zsh.

РЕДАКТИРОВАТЬ: Я подумал, что добавлю еще одну полезную функцию, о findкоторой я подумал после прочтения комментария @IlmariKaronen о повторном запуске команды и преобразовании только тех файлов, которые изменились с первого запуска.

На первом проходе вы можете touchполучить файл метки времени после того, как преобразование будет завершено.

find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +; touch timestamp

Затем добавьте -newer timestampк findвыражению для работы с подмножеством файлов, время последнего изменения которых новее, чем у файла отметки времени. Продолжайте обновлять файл меток времени после каждого запуска.

find /path/to/files -iname '*.jpg' -newer timestamp -exec mogrify -format pdf {} +; touch timestamp

Это простой способ избежать необходимости прибегать к Makefile (если вы его еще не используете), и это еще одна веская причина, по которой его стоит использовать, findкогда это возможно ... он обладает универсальной выразительностью при сохранении краткости.

aculich
источник
Использование ImageMagick для этого приводит к потере генерации и низкой производительности. img2pdf в другом месте на этой странице позволяет избежать этих проблем.
Роберт Флеминг
8

Вы можете сделать это convertнапрямую. Это можно найти в нижней части сайта ImageMagicks об обработке командной строки .

convert *.jpg +adjoin page-%d.pdf
Фрэнк Залков
источник
4
или convert *.jpg -adjoin output.pdfдля комбинированного pdf
ninjagecko
2
Использование ImageMagick для этого приводит к потере генерации и низкой производительности. img2pdf в другом месте на этой странице позволяет избежать этих проблем.
Роберт Флеминг
7

Я использовал следующий make-файл для чего-то похожего:

SVG = $(wildcard origs/*.svg)
PNG = $(patsubst origs/%.svg,%.png,$(SVG))

all: $(PNG)

%.png: origs/%.svg
    convert -resize "64x" $< $@


clean: 
    rm $(PNG)

Теперь я могу просто запустить makeи получить png-файлы для каждого svg-файла.

редактировать

Как просили:

  • подстановочные знаки генерируют список всех svgs в origs /
  • pathsubst берет этот список и создает список имен файлов png (разные папки и расширения. Пример: origs/foo.svgстановится foo.png)
  • Правило 1: all: $(PNG)определяет, что цель «все» зависит от всех PNG
  • Правило 2: %.png: origs/%.svgопределяет, что файл $ X.png зависит от origs / $ X.svg и может быть сгенерирован путем вызова convert ... $< $@.
    • $< это зависимость и и
    • $@ это имя цели
  • Правило 3: только для уборки
Рето
источник
2
Для одноразовой задачи создание Makefile, вероятно, излишне, но если вы когда-нибудь планируете изменить некоторые PDF-файлы, при makeповторном вводе будут преобразованы только те PDF-файлы, которые изменились.
Илмари Каронен
Не могли бы вы объяснить, что такое подстановочный знак, origs, patsubst, как интерпретируются $ и% и $ <$ @? Остальное легко понять. :)
пользователь неизвестен
Прибегать к этому makeкажется немного сложным, когда простой однострочник сделает свое дело.
aculich
@IlmariKaronen Я согласен с тем, что Makefile является излишним, но приятно иметь способ преобразовывать только подмножество измененных файлов при последующих запусках. Я обновил свой ответ, добавив способ сделать это, findчтобы вам не пришлось прибегать к Makefile.
aculich
0

Крошечный сценарий сделает свое дело. (протестировано с ksh88 на Solaris 10)

script.ksh

#!/bin/ksh

[[ $# != 1 ]] && exit 255 # test for nr of args

pdfname=$(sed -e 's/\(.*\)\.jpg/\1\.pdf/' <(echo $"1")) #replace *.jpg with *.pdf
convert "$1" $pdfname

Затем вы можете запустить, findчтобы выполнить скрипт:

find dir -name image\*.jpg -exec /bin/ksh script.ksh {} \;

Обратите внимание, что script.kshи findкоманда, и команда, которую я вам дал, могут иметь разные синтаксисы, зависящие от ОС и используемой вами оболочки.

rahmu
источник
pdfname=${1%.*}.pdfзаменяет расширение файла на pdf. Этот метод намного проще и работает, даже если имя файла содержит специальные символы. На связанной ноте добавьте двойные кавычки вокруг переменных замен.
Жиль "ТАК - перестань быть злым"
Нет причин писать отдельный скрипт, когда все это можно сделать с помощью простой единой командной строки .
aculich
0

Утилита MacOSSIPS   В MacOS (Sierra) встроенная служебная программа Apple для командной строки sipsпредоставляет полный доступ ко всем утилитам растровых изображений Apple; это включает в себя преобразование jpgв pdf.

Например, из существующего низкого разрешения / малого размера jpgизображения 'cat.jpg'(размер 8401 байт), следующие параметры командной строки создает 'cat.pdf', без изменения растрового разрешения и минимального расширения размера файла:

$ sips -s format pdf cat.jpg --out 'cat.pdf' 1>/dev/null 2>&1
$ ls -l cat.*
-rw-r--r--@ 1 <user redacted> <group redacted>  8401 Jun 18 07:06 cat.jpg
-rw-r--r--+ 1 <user redacted> <group redacted> 10193 Jun 18 07:22 cat.pdf

Преобразование в PSDформат растрового изображенияsips Adobe.   Подобная идиома создает Adobe-совместимые *.psdфайлы.

$ sips -s format psd cat.jpg --out 'cat.psd' 1>/dev/null 2>&1
$ ls -l cat.jpg cat.psd
-rw-r--r--@ 1 Administration  staff    8401 Jun 18 07:06 cat.jpg
-rw-r--r--+ 1 Administration  staff  350252 Jun 18 07:37 cat.psd

Однако обратите внимание на 30-кратное расширение размера файла, которое сопровождает использование psdрастрового формата Adope .

Изготовление книг   При создании крупномасштабной книжной продукции, включающей сотни изображений, которые поставляются в разных форматах, для меня удобной идиомой командной строки было использование ImageMagickутилит для создания чистых файлов растровых изображений в pngформате (со всеми метаданными и цветовые профили раздели выход), а затем использовать sipsдля восстановления единого набора цветовых профилей и / или комментариев, а также использовать sipsтакже для создания окончательных выходных файлов (наиболее часто *.png, *.psdили *.pdfфайлы).

Джон Сидлес
источник
0

К сожалению, convertраньше изображение менялось, поэтому для минимальной потери качества оригинала, который jpgвам нужно использовать img2pdf, я использую следующие команды:

1) Это сделать pdfфайл из каждого jpgизображения без потери разрешения или качества:

ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf

2) Это для объединения pdfстраниц в одну:

pdftk *.pdf cat output combined.pdf

3) И наконец, я добавляю текстовый слой OCRed, который не меняет качество сканирования в PDF-файлах, чтобы их можно было искать:

pypdfocr combined.pdf  
Эдуард Флоринеску
источник
0

Я получил решение с ImageMagick для преобразования и параллельно, чтобы ускорить процесс преобразования:

ls *.JPEG |parallel convert -density 200 -resize 496X646 -quality 100 {}  ../{.}.PDF
Джованни Канасто
источник
0

Один из самых простых способов конвертировать несколько файлов - перейти в каталог файлов в терминале Linux и набрать:

$ convert *.png mypdf.pdf
Аджит Ядав
источник
-1

Если вы используете только файлы изображений, чем, возможно, вы хотели бы использовать архив комиксов (.cbr, .cbz, .cbt, .cba, .cb7)

  • Если вы используете 7Z, то переименуйте расширение файла (суффикс) в .cb7
  • Если вы используете ACE, то переименуйте расширение файла (суффикс) в .cba
  • Если вы используете RAR, переименуйте расширение файла (суффикс) в .cbr
  • Если вы используете TAR, переименуйте расширение файла (суффикс) в .cbt
  • Если вы используете ZIP, то переименуйте расширение файла (суффикс) в .cbz

Это намного гибче, чем PDF.

Under Linux you can use software like Comix, Evince, Okular and QComicBook.

https://secure.wikimedia.org/wikipedia/en/wiki/Comic_book_archive

Jojo
источник
1
отрицательно, потому что это не имеет ничего общего с вопросом ОП.
Toogley