Перетворення декількох файлів зображень з JPEG у формат PDF


50

Я хочу перетворити деякі файли з jpeg в pdf. Я використовую наступну команду.

$ convert image1.jpg image1.pdf 

Але у мене є 100 зображень. Як я повинен конвертувати їх у відповідні файли pdfs?

я намагався

$ convert image*.jpg image*.pdf 

Це не працює.


Відповіді:


62

В bash:

for f in *.jpg; do
  convert ./"$f" ./"${f%.jpg}.pdf"
done

1
Якась конкретна причина, чому ви додаєте "./" до аргументів перетворення? Це загальна добра практика?
rahmu

4
@rahmu: так, це хороша практика, тому що в -іншому випадку ім'я файлу починається з проблем.
enzotib

3
Це працює, але mogrifyнабагато менше набирати текст. Дивіться мою відповідь.
cjm

+1 тому, що це технічно правильно і дозволяє уникнути підводних каменів, але -1, тому що маґрифікувати - це спосіб Imagemagick для пакетного перетворення зображень. Так що голосування від мене немає.
Бенуа

@aculich: спасибі за ваш запис, але ви неправильно розглянули, зрозумійте, чому для циклу не виникає помилка "занадто довгий аргумент"? .
enzotib

56

Ви можете використовувати mogrifyдля цього команду. Зазвичай він змінює файли на місці, але при перетворенні форматів він записує новий файл (просто змінюючи розширення на новий формат). Таким чином:

mogrify -format pdf -- *.jpg

(Як enzotib - х ./*.jpg, то --запобігає будь -то дивні імена файлів з інтерпретуються як перемикачі. Більшість команд визнають --означає «припинити шукати варіанти в цій точці».)


+1, моя відповідь стосувалася лише баш, не знаю добре ImageMagick.
enzotib

Гарну ідею використовувати mogrifyзамість convert. Це буде працювати для 100 файлів, але використання глобінгу з *.jpgне масштабується до тисяч файлів; це можна зробити, комбінуючи команду в простий однолінійці зfind .
aculich

Як конвертувати як *.jpg і *.pngфайли в один *.pdf? Зауважте, що вони мають нумеровані файли (наприклад, 1.jpg 2.png 3.png 4.jpg) і цей порядок повинен підтримуватися / зберігатися у вихідному форматі pdf.
горіх про natty

як вирішення: перетворити все на *.jpg«в *.png» на першому кроці та виконати еквівалент вашої відповіді на кроці 2 ...
горіх про natty


24

швидший, але незвичний синтаксис:

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

Працює паралельно (використовуючи https://www.gnu.org/software/parallel/ ). Я ще не помітив жодної багатопотокової нитки convert, яка обмежувала б ефективну паралелізацію. Якщо це викликає ваше занепокоєння, дивіться у коментарі нижче метод, який запобігає виникненню багатопотокових ниток.


1
Цей шлях сповнений виграшу. Він автоматично оцінює кількість ядер і виконує багато завдань!
meawoppl

1
Цей метод найшвидший з усіх.
шивами

1
паралель - це влада, паралель поєднується з іміджемагіком - це надпотужність. Мені подобається наддержава.
CousinCocaine

2
Трохи запізнюємось на вечірку тут, але нові (можливо, не тоді, коли була написана відповідь) версії ImageMagick є багатопотоковими і погано взаємодіють, якщо працюватимуть паралельно. Це можна відключити (якщо використовується паралелізація на рівні додатків, наприклад, з GNU parallel), встановивши змінну середовища MAGICK_THREAD_LIMIT=1.
zebediah49

Використання ImageMagick для цього призводить до втрати покоління та низької продуктивності. img2pdf в інших місцях на цій сторінці уникає цих проблем.
Роберт Флемінг

16

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

У всіх запропонованих рішеннях, що включають ImageMagick, дані JPEG повністю декодуються та перекодуються. Це призводить до втрати покоління , а також до продуктивності в "десять-сто" разів гірше, ніж 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, поведінка використання глобулінгу в циклі for for відрізняється від аргументів команди .

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

EDIT: Я думав, що я додам ще одну корисну особливість, про 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коли це можливо ... він має універсальну виразність, залишаючись лаконічним.


Використання ImageMagick для цього призводить до втрати покоління та низької продуктивності. img2pdf в інших місцях на цій сторінці уникає цих проблем.
Роберт Флемінг

8

Це можна зробити convertбезпосередньо. Це можна знайти внизу сайту ImageMagicks про обробку командного рядка .

convert *.jpg +adjoin page-%d.pdf

4
або convert *.jpg -adjoin output.pdfдля комбінованого pdf
ninjagecko

2
Використання ImageMagick для цього призводить до втрати покоління та низької продуктивності. img2pdf в інших місцях на цій сторінці уникає цих проблем.
Роберт Флемінг

7

Я використовував такий файл файлів для чогось подібного:

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

all: $(PNG)

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


clean: 
    rm $(PNG)

Тепер я можу просто запустити, makeі я отримую png-файли для кожного svg-файлу, який лежить навколо.

Редагувати

Як вимагалось:

  • wildcards генерує список всіх svgs в origs /
  • pathsubst приймає цей список і створює список назв файлів png (різні папки та розширення. Приклад: origs/foo.svgстає foo.png)
  • Правило 1: all: $(PNG)визначає, що цільове "все" залежить від усіх PNG
  • Правило 2: %.png: origs/%.svgвизначає, що файл $ X.png залежить від origin / $ X.svg і може бути створений за допомогою виклику convert ... $< $@.
    • $< є залежність і і
    • $@ - ім'я цілі
  • Правило 3 - це лише для прибирання

2
Для разового завдання створення Makefile, ймовірно, буде надмірним, але якщо ви коли-небудь плануєте змінити деякі PDF-файли, введення makeзнову відновить ці, і лише ті, PDF-файли, які змінилися.
Ільмарі Каронен

Ви б не хотіли пояснити, що таке wildcard, 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команді, і в команді, яку я вам дав, можуть бути різні синтаксиси, що залежать від ОС та оболонки, яку ви використовуєте.


pdfname=${1%.*}.pdfзамінює розширення файлу на pdf. Цей метод набагато простіший і працює, навіть якщо ім'я файлу містить спеціальні символи. У відповідній примітці додайте подвійні лапки навколо змінних підстановок.
Жил 'ТАК - перестань бути злим'

Немає підстав писати окремий сценарій, коли це все можна зробити в простому командному рядку .
aculich

0

Утиліта MacOSSIPS   Під MacOS (Sierra) вбудована утиліта командного рядка sipsApple забезпечує комплексний доступ до всіх утилітів растрового зображення 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   Подібна ідіома створює *.psdфайли, сумісні з Adobe

$ 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, який не змінює якість сканування в pdfs, щоб їх можна було шукати:

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


1
тому що це не має нічого спільного з питанням про ОП.
toogley
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.