Konwertowanie wielu plików obrazów z formatu JPEG na format PDF

50

Chcę przekonwertować niektóre pliki z formatu JPEG na format pdf. Korzystam z następującego polecenia.

$ convert image1.jpg image1.pdf 

Ale mam 100 zdjęć. Jak przekonwertować je wszystkie na odpowiednie pliki PDF?

próbowałem

$ convert image*.jpg image*.pdf 

To nie działa

Pratik Deoghare
źródło
Powiązane: Jak wygenerować plik PDF z serii obrazów? u superużytkownika SE
kenorb

Odpowiedzi:

62

W bash:

for f in *.jpg; do
  convert ./"$f" ./"${f%.jpg}.pdf"
done
enzotib
źródło
1
Czy jest jakiś konkretny powód, dla którego dodajesz „./” do argumentów konwersji? Czy to ogólna dobra praktyka?
rahmu
4
@rahmu: tak, jest to dobra praktyka, ponieważ nazwa pliku zaczyna się od -problemów, w przeciwnym razie.
enzotib
3
To działa, ale mogrifyjest o wiele mniej pisania. Zobacz moją odpowiedź.
cjm
+1, ponieważ jest to technicznie poprawne i pozwala uniknąć pułapek, ale -1, ponieważ mogrify to Imagemagick sposób na konwersję obrazów. Więc nie głosuj ode mnie.
Benoit
@aculich: dziękuję za twoje zdanie, ale pomyliłeś się, rozumiesz, dlaczego for loop nie podnosi błędu „zbyt długi argument”? .
enzotib
56

Możesz w tym celu użyć mogrifypolecenia. Zwykle modyfikuje pliki w miejscu, ale podczas konwersji formatów zapisuje nowy plik (po prostu zmieniając rozszerzenie, aby pasowało do nowego formatu). A zatem:

mogrify -format pdf -- *.jpg

(Podobnie jak enzotib ./*.jpg, --zapobiega interpretowaniu jakichkolwiek dziwnych nazw plików jako przełączników. Większość poleceń --oznacza „przestań szukać opcji w tym momencie”).

cjm
źródło
+1, moja odpowiedź dotyczyła tylko bash, nie wiem dobrze ImageMagick.
enzotib
Dobry pomysł, aby użyć mogrifyzamiast convert. Działa *.jpgto dla 100 plików, ale użycie globowania z nie powoduje skalowania do tysięcy plików; można to zrobić, łącząc polecenie w prosty, liniowy zfind .
aculich
Jak przekonwertować oba pliki *.jpgi *.pngpliki na jeden *.pdf? Zauważ, że są to pliki ponumerowane (np. 1.jpg 2.png 3.png 4.jpg) I że kolejność powinna być zachowana / zachowana w pliku pdf.
orzechowy o natty
jako obejście: konwersję wszystkich *.jpg„s w *.png” s w jednym kroku, a wykonując równowartość odpowiedź w kroku 2 ...
orzechowy o Natty
patrz także stackoverflow.com/questions/15315770/...
orzechowy o Natty
24

szybsza, ale nietypowa składnia:

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

Działa równolegle (przy użyciu https://www.gnu.org/software/parallel/ ). Nie zauważyłem jeszcze żadnego wielowątkowości convert, co ograniczyłoby efektywną równoległość. Jeśli to twoja sprawa, zobacz w komentarzu poniżej metodę, która zapewni, że nie wystąpi wielowątkowość.

Sebastian
źródło
1
Ta droga jest pełna wygranych. Automatycznie ocenia liczbę rdzeni i uruchamia tak wiele zadań!
meawoppl
1
Ta metoda jest najszybsza ze wszystkich.
shivams,
1
Równoległość to moc, równoległość w połączeniu z imagemagick to supermocarstwo. Lubię supermoce.
CousinCocaine,
2
Trochę późno na imprezę tutaj, ale nowe (być może nie wtedy, gdy ta odpowiedź została napisana) wersje ImageMagick są wielowątkowe i będą źle oddziaływać, jeśli zostaną uruchomione równolegle. Można to wyłączyć (jeśli używasz równoległości na poziomie aplikacji, takiej jak GNU parallel), ustawiając zmienną środowiskową MAGICK_THREAD_LIMIT=1.
zebediah49
Zastosowanie ImageMagick do tego skutkuje utratą generacji i słabą wydajnością. img2pdf w innym miejscu na tej stronie pozwala uniknąć tych problemów.
Robert Fleming,
16

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

We wszystkich proponowanych rozwiązaniach dotyczących ImageMagick dane JPEG są w pełni dekodowane i ponownie kodowane. Powoduje to utratę generacji , a także wydajność „dziesięć do stu” razy gorszą niż img2pdf.

Można go zainstalować pip img2pdfpod warunkiem, że masz zależności (np. apt-get install python python-pil python-setuptools libjpeg-devLub yum install python python-pillow python-setuptools).

Robert Fleming
źródło
3
jest w porządku. Możesz sprawdzić, czy w obie strony zmienia się plik JPEG za pomocą takich poleceń convert some.jpg -format pdf -compress jpeg generated.pdf ; pdfimages -j generated.pdf generated.pdf ; diff -sq some.jpg generated.pdf-000.jpg. IMHO ta odpowiedź zasługuje na więcej pochwał. Rzeczywiście, converttutaj się nie udaje, img2pdfprzechodzi taki test, a nawet zawiera wiele opcji, aby ustawić rozmiar obrazu, rozmiar strony itp., Aby dopracować wygenerowany plik PDF do twoich potrzeb.
Stéphane Gourichon
3
img2pdfjest dostępny w regularnych repozytoriach Ubuntu 16.04, nie ma potrzeby ręcznych operacji pip, a Ty nadal korzystasz z aktualizacji.
Stéphane Gourichon
1
W chwili, gdy pytanie zostało zadane (i odpowiedź została zaakceptowana), img2pdf nie istniał. Ale img2pdf w dzisiejszych czasach jest zdecydowanie lepszą odpowiedzią.
kmkaplan
13

Oto sposób, który łączy najlepsze z powyższych sugestii w prosty, wydajny i niezawodny wiersz poleceń:

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

Działa dobrze z nazwami plików, które zaczynają się od -lub zawierają spacje. Zauważ, że użycie -inamejest w wersji bez rozróżniania wielkości liter,-name więc będzie działać .JPGrównie dobrze .jpg.

findSłuży to do pobierania listy plików zamiast globowania powłoki za pomocą znaku *.jpgwieloznacznego, co może powodować błąd „zbyt długiej listy argumentów” w niektórych systemach. Chociaż @enzotib wskazuje w komentarzu, zachowanie przy użyciu globowania w pętli for jest inne niż w przypadku argumentów polecenia .

Również findzajmie podkatalogów, natomiast powłoka masek nie będzie, chyba że zdarzy się, że funkcje specyficzne dla powłoki takie jak **/*jpgrekurencyjnego globowania składni w zsh.

EDYCJA: Pomyślałem, że dodam kolejną przydatną funkcję, o findktórej pomyślałem po przeczytaniu komentarza @IlmariKaronen na temat ponownego uruchomienia polecenia i konwertowania tylko plików, które zmieniły się od pierwszego uruchomienia.

Przy pierwszym przejściu możesz touchzapisać plik znacznika czasu po zakończeniu konwersji.

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

Następnie dodaj -newer timestampdo findwyrażenia, aby działało na podzbiorze plików, których czas ostatniej modyfikacji jest nowszy niż plik znacznika czasu. Kontynuuj aktualizowanie pliku sygnatury czasowej po każdym uruchomieniu.

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

Jest to łatwy sposób na uniknięcie konieczności korzystania z pliku Makefile (chyba że już go używasz) i jest to kolejny dobry powód, dla którego warto go używać, findgdy tylko jest to możliwe ... ma wszechstronną ekspresję przy zachowaniu zwięzłości.

aculich
źródło
Zastosowanie ImageMagick do tego skutkuje utratą generacji i słabą wydajnością. img2pdf w innym miejscu na tej stronie pozwala uniknąć tych problemów.
Robert Fleming,
8

Możesz to zrobić convertbezpośrednio. Można to znaleźć na dole strony ImageMagicks o przetwarzaniu wiersza poleceń .

convert *.jpg +adjoin page-%d.pdf
Frank Zalkow
źródło
4
lub convert *.jpg -adjoin output.pdfw połączeniu pdf
ninjagecko
2
Zastosowanie ImageMagick do tego skutkuje utratą generacji i słabą wydajnością. img2pdf w innym miejscu na tej stronie pozwala uniknąć tych problemów.
Robert Fleming,
7

Użyłem następującego makefile do czegoś podobnego:

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

all: $(PNG)

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


clean: 
    rm $(PNG)

Teraz mogę po prostu uruchomić makei dostaję pliki png dla każdego pliku svg, który jest w pobliżu.

Edytować

Zgodnie z prośbą:

  • symbole wieloznaczne generują listę wszystkich plików svg w oryginale /
  • pathsubst bierze tę listę i tworzy listę nazw plików png (inny folder i rozszerzenie. Przykład: origs/foo.svgstaje się foo.png)
  • Reguła 1: all: $(PNG)określa, że ​​cel „wszystko” zależy od wszystkich plików PNG
  • Reguła 2: %.png: origs/%.svgokreśla, że ​​plik $ X.png zależy od origs / $ X.svg i może być wygenerowany przez wywołanie convert ... $< $@.
    • $< jest zależnością i
    • $@ to nazwa celu
  • Reguła 3: służy tylko do czyszczenia
reto
źródło
2
W przypadku jednorazowego zadania utworzenie pliku Makefile jest prawdopodobnie przesadą, ale jeśli kiedykolwiek planujesz zmienić niektóre pliki PDF, makeponowne wpisanie spowoduje konwersję tych i tylko tych plików PDF, które uległy zmianie.
Ilmari Karonen
Czy mógłbyś wyjaśnić, czym jest symbol wieloznaczny, origs, patsubst, jak $ i% są interpretowane oraz $ <$ @? Reszta jest łatwa do zrozumienia. :)
użytkownik nieznany
Uciekanie się do makewydaje się nieco skomplikowane, gdy załatwi go zwykły liniowiec .
aculich
@IlmariKaronen Zgadzam się, że plik Makefile to przesada, ale miło jest mieć sposób na konwersję tylko podzbioru zmodyfikowanych plików przy kolejnych uruchomieniach. Zaktualizowałem odpowiedź, aby to zrobić, findabyś nie musiał uciekać się do pliku Makefile.
aculich
0

Mały skrypt dałby radę. (testowany z ksh88 na Solarisie 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

Następnie możesz uruchomić, findaby wykonać skrypt:

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

Zauważ, że zarówno polecenie , jak script.kshi findpolecenie, które ci podałem, mogą mieć różne składnie zależne od systemu operacyjnego i używanej powłoki.

rahmu
źródło
pdfname=${1%.*}.pdfzastępuje rozszerzenie pliku na pdf. Ta metoda jest o wiele prostsza i działa, nawet jeśli nazwa pliku zawiera znaki specjalne. W powiązanej notatce dodaj podwójne cudzysłowy wokół podstawień zmiennych.
Gilles „SO- przestań być zły”
Nie ma powodu pisać osobnego skryptu, skoro można to wszystko zrobić za pomocą prostej linii poleceń .
aculich
0

Narzędzie MacOSSIPS   W systemie MacOS (Sierra) wbudowane narzędzie Apple z wiersza polecenia sipszapewnia kompleksowy dostęp do wszystkich narzędzi Apple do obrazów rastrowych; okazuje się, że obejmuje konwersję jpgdo pdf.

Na przykład z istniejącego jpgobrazu o niskiej rozdzielczości / małym rozmiarze 'cat.jpg'(o rozmiarze 8401 bajtów) tworzy się następujący wiersz polecenia 'cat.pdf', bez zmiany rozdzielczości rastrowej i minimalnego rozszerzenia rozmiaru pliku:

$ 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

Konwersja do PSDformatu obrazu rastrowego Adobe   Podobny sipsidiom tworzy *.psdpliki kompatybilne z 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

Zwróć jednak uwagę na 30-krotne rozszerzenie rozmiaru pliku związane z użyciem formatu psdrastrowego Adope .

Produkcja   książek Przy produkcji książek na dużą skalę, obejmujących setki obrazów, które są dostarczane w wielu formatach, dla mnie wygodnym idiomem wiersza poleceń są ImageMagicknarzędzia do tworzenia czystych plików obrazów rastrowych w pngformacie (ze wszystkimi metadanymi i kolor profili pozbawiony-out), a następnie użyć sipsdo przywrócenia jednolitego zestawu profili barwnych i / lub komentarze i używać sipsrównież do generowania ostatecznych plików wyjściowych (najczęściej *.png, *.psdlub *.pdfpliki).

John Sidles
źródło
0

Niestety convertzmienia obraz wcześniej, aby mieć minimalną utratę jakości oryginału, jpgktórego potrzebujesz img2pdf, używam tych poleceń:

1) Aby utworzyć pdfplik z każdego jpgobrazu bez utraty rozdzielczości lub jakości:

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

2) Aby połączyć pdfstrony w jedną:

pdftk *.pdf cat output combined.pdf

3) Na koniec dodaję warstwę tekstową OCRed, która nie zmienia jakości skanu w plikach pdf, dzięki czemu można je przeszukiwać:

pypdfocr combined.pdf  
Eduard Florinescu
źródło
0

Rozwiązano problem z imagemagick do konwersji i równolegle, aby przyspieszyć proces konwersji:

ls *.JPEG |parallel convert -density 200 -resize 496X646 -quality 100 {}  ../{.}.PDF
Giovanny Canasto
źródło
0

Jednym z najprostszych sposobów konwersji wielu plików jest przejście do katalogu plików w terminalu Linux i wpisanie:

$ convert *.png mypdf.pdf
Ajeet Yadav
źródło
-1

Jeśli używasz tylko plików graficznych, być może chcesz użyć Comic Book Archive (.cbr, .cbz, .cbt, .cba, .cb7)

  • Jeśli używasz 7Z, zmień nazwę rozszerzenia pliku (sufiks) na .cb7
  • Jeśli używasz ACE, zmień nazwę rozszerzenia pliku (sufiksu) na .cba
  • Jeśli używasz RAR, zmień nazwę rozszerzenia pliku (sufiksu) na .cbr
  • Jeśli używasz TAR, zmień nazwę rozszerzenia pliku (sufiksu) na .cbt
  • Jeśli używasz ZIP, zmień nazwę rozszerzenia pliku (sufiks) na .cbz

Jest to o wiele bardziej elastyczne niż PDF.

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

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

jojo
źródło
1
przegłosowano, ponieważ nie ma to nic wspólnego z pytaniem PO.
toogley