Birden fazla görüntü dosyasını JPEG'den PDF formatına dönüştürme


Yanıtlar:


62

Bash:

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

1
Dönüştürme alanlarına "./" koymanızın özel bir nedeni var mı? Genel olarak iyi bir uygulama mı?
rahmu

4
@rahmu: evet, bu iyi bir pratiktir, çünkü dosya adı ile başlar -, aksi takdirde.
enzotib

3
Bu işe yarıyor ama mogrifydaha az yazıyor. Cevabımı gör.
cjm

+1 çünkü bu teknik olarak doğru ve bash tuzaklardan kaçınır, ancak -1 çünkü mogrify, toplu dönüştürme görüntülerini toplulaştırmak için Imagemagick yoludur. Yani benden oy yok.
Benoit

@aculich: Olumsuz oyunuz için teşekkür ederim, ama yanlış bir değerlendirme yaptınız, neden döngü için “argüman çok uzun” hatası vermedi ? .
enzotib

56

Bunun için mogrifykomutu kullanabilirsiniz . Normalde dosyaları yerinde değiştirir, ancak formatları dönüştürürken yeni bir dosya yazar (sadece uzantıyı yeni formata uyacak şekilde değiştirerek). Böylece:

mogrify -format pdf -- *.jpg

(Enzotib'ler gibi ./*.jpg, --garip dosya adlarının anahtar olarak yorumlanmasını önler. Çoğu komut --"bu noktada seçenek aramayı durdur" anlamına gelir.)


+1, cevabım sadece bash ile ilgiliydi, ImageMagick'i iyi tanımıyorum.
enzotib

İyi fikir kullanmak mogrifyyerine convert. Bu 100 dosya için işe yarar, ancak globbing kullanmak *.jpgbinlerce dosyaya ölçeklenmez; Bu, komutu tek bir liner ilefind kombine ederek yapılabilir .
aculich,

Nasıl dönüştürmek için hem *.jpg ve *.pngtek dosya *.pdf? Bunların numaralandırılmış dosyalar olduğunu (örn. 1.jpg 2.png 3.png 4.jpg) Ve bu sıranın pdf çıktısında muhafaza edilmesi / muhafaza edilmesi gerektiğini unutmayın.
natty hakkında tembel

Geçici bir çözüm olarak: tüm dönüştürme *.jpg'içine s *.png... birinci adımdaki ler' ve 2. adımda Cevabınız eşdeğer performans
çatlak işe yatkın hakkında


24

daha hızlı ancak sıradışı sözdizimi:

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

Paralel olarak çalışır ( https://www.gnu.org/software/parallel/ kullanılarak ). convertEtkili paralelleşmeyi sınırlayacak herhangi bir çoklu iş parçacığı henüz fark etmedim. Bu sizin endişenizse, çok iş parçacığının oluşmamasını sağlayan bir yöntem için aşağıdaki açıklamaya bakın.


1
Bu yol kazanmakla doludur. Çekirdek sayısını otomatik olarak değerlendirir ve birçok görevi yerine getirir!
meawoppl

1
Bu yöntem hepsinden hızlı.
shivams

1
Paralel güç, paralel olarak imagemagick süper güçtür. Süper gücü severim.
Kuzen Kokain 11:15

2
Buradaki partiye biraz geç kaldık ama ImageMagick'in yeni (muhtemelen bu cevap yazıldığında değil) sürümleri çok iş parçacıklı ve paralel olarak çalıştırılırsa kötü etkileşime girecek. Bu parallel, ortam değişkenini ayarlayarak ( GNU gibi uygulama düzeyinde paralelleştirme kullanıyorsanız) devre dışı bırakılabilir MAGICK_THREAD_LIMIT=1.
zebediah49

Bunun için ImageMagick'i kullanmak, üretim kaybına ve düşük performansa neden olur. Bu sayfada başka bir yerde bulunan img2pdf bu sorunları önler.
Robert Fleming,

16

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

ImageMagick'i içeren tüm önerilen çözümlerde, JPEG verileri tamamen kodu çözülmüş ve yeniden kodlanmıştır. Bu, üretim kaybına neden olduğu gibi, performansın "on ila yüz" katından daha kötü img2pdf.

pip img2pdfBağımlılıklarınız olması koşuluyla kurulabilir (örneğin apt-get install python python-pil python-setuptools libjpeg-devveya yum install python python-pillow python-setuptools).


3
doğrudur. Gidiş dönüşün JPEG komutunu gibi komutlarla değiştirdiğini test edebilirsiniz convert some.jpg -format pdf -compress jpeg generated.pdf ; pdfimages -j generated.pdf generated.pdf ; diff -sq some.jpg generated.pdf-000.jpg. IMHO bu cevabı daha fazla oy hak ediyor. Aslında, convertburada başarısız olur, img2pdfböyle bir testi geçer ve hatta oluşturulan pdf'i ihtiyaçlarınıza göre ayarlamak için resim boyutunu, sayfa boyutunu vb. Ayarlamak için birçok seçenek içerir.
Stéphane Gourichon

3
img2pdfUbuntu 16.04 düzenli depolarında mevcuttur, pipburada manuel işlem yapılmasına gerek yoktur ve güncellemelerden faydalanabilirsiniz.
Stéphane Gourichon

1
Soru sorulduğunda (ve cevap kabul edildi), img2pdf yoktu. Ancak günümüzde img2pdf açıkça daha iyi bir cevap.
kmkaplan

13

Yukarıdaki önerilerden en iyisini basit, etkili ve sağlam bir komut satırında birleştiren bir yöntem:

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

A ile başlayan -veya boşluk içeren dosya isimleriyle iyi çalışır . Kullanımına dikkat -inamehangi harfe duyarsız sürümü -nameo üzerinde çalışacak böylece .JPGsadece yanı sıra .jpg.

Bu , bazı sistemlerde 'Argüman listesi çok uzun' hatasıyla sonuçlanabilecek joker karakterle findtop atmak yerine dosya listesini almak için kullanılır. @Enzotib bir yorumu işaret etse de , bir for döngüsünde globbing kullanma davranışı bir komutun argümanlarından farklıdır .*.jpg

Ayrıca, findalt dizinleri de işleyecektir, oysa kabuk globbing, **/*jpgzsh içindeki özyinelemeli globbing sözdizimi gibi kabuğa özgü özelliklere sahip olmadığınız sürece gerçekleşmeyecektir .

EDIT: @IlmariKaronenfind tarafından komutu yeniden çalıştırma ve yalnızca ilk çalıştırmadan bu yana değişen dosyaları dönüştürme hakkında bir yorum okuduktan sonra düşündüğümün başka bir kullanışlı özelliği daha ekleyeceğimi düşündüm .

İlk geçişte touch, dönüştürme tamamlandıktan sonra bir zaman damgası dosyası olabilir .

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

Ardından , son değişiklik zamanı zaman damgası dosyasından daha yeni olan dosyaların alt kümesinde işlem -newer timestampyapmak için findifadeye ekleyin . Her çalıştırmadan sonra zaman damgası dosyasını güncellemeye devam edin.

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

Bu, bir Makefile'a başvurmaktan kaçınmanın kolay bir yoludur (zaten bir tane kullanmadıysanız) ve findözlü kalırken çok yönlü bir ifadeye sahip olmasının mümkün olduğu her zaman kullanmaya değer olmasının iyi bir nedenidir .


Bunun için ImageMagick'i kullanmak, üretim kaybına ve düşük performansa neden olur. Bu sayfada başka bir yerde bulunan img2pdf bu sorunları önler.
Robert Fleming,


7

Benzer bir şey için aşağıdaki makefile kullandım:

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

all: $(PNG)

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


clean: 
    rm $(PNG)

Şimdi sadece çalıştırabilirim makeve etrafta yatan her svg dosyası için png dosyaları alıyorum.

Düzenle

İstendiği gibi:

  • joker karakterler, tüm svg'lerin bir listesini oluşturur /
  • pathsubst bu listeyi alır ve png dosya adlarının bir listesini çıkarır (farklı klasör ve uzantı. Örnek: origs/foo.svgolur foo.png)
  • Kural 1: all: $(PNG)"tümü" hedefinin tüm PNG'lere bağlı olduğunu tanımlar.
  • Kural 2: %.png: origs/%.svgtanımlar, $ X.png dosyası, origs / $ X.svg dosyasına bağlıdır ve arayarak oluşturulabilir convert ... $< $@.
    • $< bağımlılık ve
    • $@ hedef isim
  • Kural 3: sadece temizlik için

2
Bir kerelik bir görev için, bir Makefile oluşturmak muhtemelen geçersizdir, ancak bazı PDF'leri değiştirmeyi planlıyorsanız make, yeniden yazmak , bunları ve yalnızca değiştirilen PDF'leri geri dönüştürür .
Ilmari Karonen

Jokerin, kökenlerin, patsubst'un ne olduğunu, $ ve% 'nin nasıl yorumlandığını ve $ <$ @' nın ne olduğunu açıklar mısınız? Gerisini anlamak kolaydır. :)
kullanıcı bilinmeyen

Basit bir tek gömlek ne zaman işe yarayacaksa, başvurmak makebiraz fazla karmaşık görünüyor .
aculich,

@IlmariKaronen Bir Makefile 'in overkill olduğuna katılıyorum, ancak sonraki çalıştırmalarda yalnızca değiştirilen dosyaların alt kümesini geri dönüştürmenin bir yolunu bulmak güzel. Cevabımı , bunu yalnızca bunu yapma yöntemiyle güncelleştirdim , findböylece bir Makefile'a başvurmak zorunda kalmazsınız.
aculich

0

Küçük bir senaryo hile yapardı. (Solaris 10'da ksh88 ile test edilmiştir)

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

Sonra findbetiği çalıştırmak için koşabilirsiniz :

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

Her iki unutmayın script.kshve findsana verdiğim komutu, işletim sistemi ve kullandığınız kabuk üzerinde depeding farklı sözdizimi olabilir.


pdfname=${1%.*}.pdfdosyanın uzantısını ile değiştirir pdf. Bu yöntem çok daha basittir ve dosya adı özel karakterler içeriyor olsa bile çalışır. İlgili bir notta, değişken ikamelerin çevresine çift tırnak işareti ekleyin.
Gilles 'SO- kötülük' dur '24

Hepsi tek bir komut satırıyla yapılabildiğinde ayrı bir komut dosyası yazmak için hiçbir neden yoktur .
aculich

0

MacOS yardımcı programıSIPS   MacOS (Sierra) altında, Apple'ın yerleşik komut satırı yardımcı programı sips, Apple'ın tüm raster görüntü yardımcı programlarına kapsamlı erişim sağlar; Bu dönüştürülmesini, çıkıyor jpgiçin pdf.

Örneğin, varolan düşük çözünürlüklü / küçük boyutlu bir jpggörüntüden 'cat.jpg'(8401 bayt boyutunda), aşağıdaki komut satırı 'cat.pdf'raster çözünürlükte değişiklik yapmadan ve dosya boyutunun minimum genişlemesini sağlar:

$ 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

Adobe'nin PSDraster görüntü formatına dönüştürme   Benzer bir sipsdeyim Adobe uyumlu *.psddosyalar oluşturur

$ 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

Ancak Adope psdraster formatının kullanımına uygun olan 30 katlı dosya boyutu genişlemesine dikkat edin .

Kitap Üretimi   Büyük ölçekli kitap üretimi yaparken, çoklu biçimlerde sunulan yüzlerce resim içeren, benim için uygun bir komut satırı deyimi, biçiminde ImageMagicksaf raster resim dosyaları oluşturmak için yardımcı programları kullanmıştır png(tüm meta veriler ve renk profilleri soyulmuş aşımı), sonra kullanmak sipsrenk profilleri ve / veya yorumların bir bütün birimini geri ve kullanımı sips(son çıkış dosyaları oluşturmak için de en yaygın *.png, *.psdya da *.pdf) dosyalarını.


0

Ne yazık ki convert, daha önce görüntüyü değiştirir, jpgkullanmanız gereken orijinalin minimum kalite kaybına sahip olmak için img2pdf, bu komutları kullanıyorum:

1) Bu, çözünürlük veya kalite kaybı olmadan pdfher jpggörüntüden bir dosya oluşturmak için :

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

2) pdfSayfaları birebir birleştirmek için :

pdftk *.pdf cat output combined.pdf

3) Son olarak, pdfs'teki taramanın kalitesini değiştirmeyen bir OCRed metin katmanı ekledim, böylece aranabilirler:

pypdfocr combined.pdf  

0

Dönüşüm sürecimi hızlandırmak için dönüşüm için imagemagick ve paralel olarak çözdüm:

ls *.JPEG |parallel convert -density 200 -resize 496X646 -quality 100 {}  ../{.}.PDF

0

Birden fazla dosyayı dönüştürmenin en basit yollarından biri, linux terminalindeki dosya dizinine gidip şunu yazmaktır:

$ convert *.png mypdf.pdf

-1

Belki sadece resim dosyalarını kullanıyorsanız, Çizgi Roman Arşivi'ni kullanmak istersiniz (.cbr, .cbz, .cbt, .cba, .cb7)

  • 7Z kullanıyorsanız, dosya uzantısını (sonek) .cb7 olarak yeniden adlandırın.
  • ACE kullanıyorsanız, dosya uzantısını (sonek) .cba olarak yeniden adlandırın.
  • RAR kullanıyorsanız, dosya uzantısını (sonek) .cbr olarak yeniden adlandırın.
  • TAR kullanıyorsanız, dosya uzantısını (sonek) .cbt olarak yeniden adlandırın.
  • ZIP kullanıyorsanız, dosya uzantısını (sonek) .cbz olarak yeniden adlandırın.

Bu, PDF'den çok daha esnektir.

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

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


1
reddedildi, çünkü OP'nin sorusu ile ilgisi yok.
toogley
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.