Conversione di più file di immagine dal formato JPEG al formato PDF


Risposte:


62

In bash:

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

1
Qualche motivo particolare per cui anteponi "./" agli argomenti di conversione? È una buona pratica generale?
Rahmu,

4
@rahmu: sì, è una buona pratica, perché il nome del file che inizia con -dare problemi, altrimenti.
enzotib,

3
Funziona, ma mogrifyè molto meno digitando. Vedi la mia risposta
cjm

+1 perché tecnicamente corretto ed evita insidie, ma -1 perché mogrify è il modo di Imagemagick per convertire in batch le immagini. Quindi nessun voto da parte mia.
Benoit,

@aculich: grazie per il tuo downvote, ma hai fatto una considerazione sbagliata, vedi perché per loop non viene generato l'errore "argomento troppo lungo"? .
enzotib,

56

È possibile utilizzare il mogrifycomando per questo. Normalmente modifica i file sul posto, ma quando converte i formati, scrive un nuovo file (basta cambiare l'estensione per adattarlo al nuovo formato). Così:

mogrify -format pdf -- *.jpg

(Come enzotib's ./*.jpg, --impedisce a qualsiasi strano nome di file di essere interpretato come switch. La maggior parte dei comandi riconosce --che significa "smettere di cercare opzioni a questo punto".)


+1, la mia risposta era solo bash, non conosco bene ImageMagick.
enzotib,

Buona idea da usare al mogrifyposto di convert. Questo funzionerà per 100 file, ma l'uso del globbing con *.jpgnon si ridimensiona a migliaia di file; ciò può essere fatto combinando il comando in una semplicefind riga con .
aculich,

Come convertire entrambi *.jpg e *.pngfile in un singolo *.pdf? Si noti che sono file numerati (ad es. 1.jpg 2.png 3.png 4.jpg) E che l'ordine deve essere mantenuto / preservato nell'output pdf.
impazzito per la schifezza del

come soluzione alternativa: convertire tutti *.jpgin *.png"s" nel passaggio 1 ed eseguire l'equivalente della risposta nel passaggio 2 ...
nocciola circa natty


24

sintassi più veloce ma insolita:

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

Funziona in parallelo (usando https://www.gnu.org/software/parallel/ ). Non ho ancora notato alcun multi-threading convert, che limiterebbe l'effettiva parallelizzazione. Se questo è il tuo problema, vedi nel commento qui sotto per un metodo per assicurarti che non si verifichi il multi-threading.


1
In questo modo è pieno di vittorie. Valuta automaticamente il numero di core ed esegue molte attività!
meawoppl,

1
Questo metodo è IL più veloce di tutti.
Shivams,

1
il parallelo è potere, il parallelo combinato con imagemagick è superpotere. Mi piace la superpotenza.
Cugina Cocaina,

2
Un po 'tardi alla festa qui, ma le nuove versioni (forse non quando è stata scritta questa risposta) di ImageMagick sono multi-thread e interagiranno male se eseguite in parallelo. Questo può essere disabilitato (se si utilizza la parallelizzazione a livello di applicazione come con GNU parallel) impostando la variabile di ambiente MAGICK_THREAD_LIMIT=1.
zebediah49,

L'uso di ImageMagick per questo provoca perdita di generazione e scarse prestazioni. img2pdf altrove in questa pagina evita questi problemi.
Robert Fleming,

16

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

In tutte le soluzioni proposte che coinvolgono ImageMagick, i dati JPEG vengono completamente decodificati e ricodificati. Ciò comporta una perdita di generazione , nonché prestazioni "da dieci a cento" volte peggiori di img2pdf.

Può essere installato pip img2pdfpurché tu abbia dipendenze (es. apt-get install python python-pil python-setuptools libjpeg-devO yum install python python-pillow python-setuptools).


3
è giusto. Puoi provare che un roundtrip modifica un file JPEG con comandi simili convert some.jpg -format pdf -compress jpeg generated.pdf ; pdfimages -j generated.pdf generated.pdf ; diff -sq some.jpg generated.pdf-000.jpg. IMHO questa risposta merita più voti. In effetti, convertfallisce qui, img2pdfsupera un tale test e include anche molte opzioni per impostare le dimensioni dell'immagine, la dimensione della pagina, ecc. Per ottimizzare il pdf generato in base alle proprie esigenze.
Stéphane Gourichon,

3
img2pdfè disponibile nei repository regolari di Ubuntu 16.04, non è necessaria alcuna operazione manuale pipe mantieni il vantaggio degli aggiornamenti.
Stéphane Gourichon,

1
Al momento la domanda è stata posta (e la risposta accettata) img2pdf non esisteva. Ma oggi img2pdf è chiaramente una risposta migliore.
kmkaplan,

13

Ecco un modo che combina il meglio dei suggerimenti di cui sopra in una riga di comando semplice, efficiente e robusta:

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

Funziona bene con nomi di file che iniziano con a -o contengono spazi. Nota -inameche la versione non fa distinzione tra maiuscole e minuscole , -namequindi funzionerà .JPGaltrettanto bene .jpg.

Questo viene utilizzato findper ottenere l'elenco dei file invece di alterare la shell con il *.jpgcarattere jolly, il che può causare un errore "Elenco argomenti troppo lungo" su alcuni sistemi. Sebbene @enzotib punti in un commento, il comportamento dell'uso del globbing in un ciclo for è diverso rispetto agli argomenti di un comando .

Inoltre, findgestirà le sottodirectory, mentre il globbing della shell non lo farà a meno che tu non abbia caratteristiche specifiche della shell come la **/*jpgsintassi globbing ricorsiva in zsh.

EDIT: Ho pensato di aggiungere un'altra utile funzionalità a findcui ho pensato dopo aver letto un commento di @IlmariKaronen sul rieseguire il comando e convertire solo i file che sono cambiati dalla prima esecuzione.

Al primo passaggio è possibile touchun file timestamp al termine della conversione.

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

Quindi aggiungere -newer timestampalla findespressione di operare sul sottoinsieme di file il cui tempo di ultima modifica è più recente del file timestamp. Continua ad aggiornare il file timestamp dopo ogni esecuzione.

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

Questo è un modo semplice per evitare di ricorrere a un Makefile (a meno che tu non ne stia già utilizzando uno) ed è un'altra buona ragione per cui vale la pena usarlo findogni volta che è possibile ... ha un'espressività versatile pur rimanendo conciso.


L'uso di ImageMagick per questo provoca perdita di generazione e scarse prestazioni. img2pdf altrove in questa pagina evita questi problemi.
Robert Fleming,

8

Puoi farlo convertdirettamente. Questo si trova nella parte inferiore del sito ImageMagicks sull'elaborazione della riga di comando .

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

4
o convert *.jpg -adjoin output.pdfper un pdf combinato
ninjagecko,

2
L'uso di ImageMagick per questo provoca perdita di generazione e scarse prestazioni. img2pdf altrove in questa pagina evita questi problemi.
Robert Fleming,

7

Ho usato il seguente makefile per qualcosa di simile:

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

all: $(PNG)

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


clean: 
    rm $(PNG)

Ora posso solo eseguire makee ottenere file png per ogni file svg che si trova in giro.

modificare

Come richiesto:

  • i caratteri jolly generano un elenco di tutti gli svg in orig /
  • pathubst prende questo elenco e produce un elenco di nomi di file png (cartella ed estensione diverse. Esempio: origs/foo.svgdiventa foo.png)
  • Regola 1: all: $(PNG)definisce che il target "all" dipende da tutti i PNG
  • Regola 2: %.png: origs/%.svgdefinisce, il file $ X.png dipende da origs / $ X.svg e può essere generato chiamando convert ... $< $@.
    • $< è la dipendenza e e
    • $@ è il nome target
  • REGOLA 3: è solo per ripulire

2
Per un'attività una tantum, la creazione di un Makefile è probabilmente eccessiva, ma se si prevede di modificare alcuni dei PDF, la digitazione di makenuovo riconvertirà quelli e solo quelli che sono stati modificati.
Ilmari Karonen,

Ti dispiacerebbe spiegare cosa sono jolly, orig, patsubst, come vengono interpretati $ e% e $ <$ @? Il resto è facile da capire. :)
utente sconosciuto

Ricorrere a makesembra un po 'troppo complicato quando un semplice one-liner farà il trucco.
aculich,

@IlmariKaronen Sono d'accordo sul fatto che un Makefile sia eccessivo, ma è bello avere un modo per riconvertire solo il sottoinsieme di file modificati nelle successive esecuzioni. Ho aggiornato la mia risposta con un modo per farlo solo con findcosì non devi ricorrere a un Makefile.
aculich,

0

Una sceneggiatura minuscola farebbe il trucco. (testato con ksh88 su 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

Quindi è possibile eseguire findper eseguire lo script:

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

Nota che entrambi script.kshe il findcomando che ti ho dato potrebbero avere sintassi diverse a seconda del sistema operativo e della shell che stai utilizzando.


pdfname=${1%.*}.pdfsostituisce l'estensione del file con pdf. Questo metodo è molto più semplice e funziona anche se il nome del file contiene caratteri speciali. In una nota correlata, aggiungere doppie virgolette attorno alle sostituzioni variabili.
Gilles 'SO- smetti di essere malvagio' il

Non c'è motivo di scrivere uno script separato quando tutto può essere fatto con una semplice riga di comando .
aculich,

0

L'utilità MacOSSIPS   Sotto MacOS (Sierra), l'utilità da riga di comando sipsintegrata di Apple fornisce un accesso completo a tutte le utility di immagini raster di Apple; questo risulta includere la conversione di jpga pdf.

Per esempio, da una bassa risoluzione / piccole dimensioni attuali jpgdell'immagine 'cat.jpg'(di dimensione 8401 byte), la seguente riga di comando crea 'cat.pdf', senza modificare raster risoluzione e minima espansione delle dimensioni:

$ 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

Conversione nel PSDformato di immagini raster di Adobe   Un sipslinguaggio simile crea *.psdfile compatibili con 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

Si noti tuttavia l'espansione di dimensioni del file di 30 volte che è correlata all'uso del formato psdraster di Adope .

Produzione di libri   Nel realizzare la produzione di libri su larga scala, coinvolgendo centinaia di immagini, fornite in più formati, per me un comodo linguaggio da riga di comando è stato utilizzare le ImageMagickutility per creare file di immagini raster pure in pngformato (con tutti i metadati e profili di colore spogliato-out), quindi utilizzare sipsper ripristinare un insieme uniforme di profili e / o commenti a colori e usano sipsanche per generare file di output finali (più comunemente *.png, *.psdo *.pdffile).


0

Sfortunatamente convertcambia l'immagine prima di così per avere una perdita minima di qualità dell'originale che jpgdevi usare img2pdf, io uso questi comandi:

1) Questo per creare un pdffile da ogni jpgimmagine senza perdita di risoluzione o qualità:

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

2) Questo per concatenare le pdfpagine in una:

pdftk *.pdf cat output combined.pdf

3) E infine aggiungo un livello di testo OCR che non modifica la qualità della scansione nei pdf in modo che possano essere ricercati:

pypdfocr combined.pdf  

0

Ho risolto con imagemagick per la conversione e parallelo per accelerare il mio processo di conversione:

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

0

Uno dei modi più semplici per convertire più file è quello di andare alla directory dei file nel terminale Linux e digitare:

$ convert *.png mypdf.pdf

-1

Se usi solo file di immagine di quelli che vorresti utilizzare Comic Book Archive (.cbr, .cbz, .cbt, .cba, .cb7)

  • Se si utilizza 7Z, rinominare l'estensione del file (suffisso) in .cb7
  • Se si utilizza ACE, rinominare l'estensione del file (suffisso) in .cba
  • Se si utilizza RAR, rinominare l'estensione del file (suffisso) in .cbr
  • Se si utilizza TAR, rinominare l'estensione del file (suffisso) in .cbt
  • Se si utilizza ZIP, rinominare l'estensione del file (suffisso) in .cbz

Questo è molto più flessibile del PDF.

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

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


1
declassato, perché non ha nulla a che fare con la domanda del PO.
toogley,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.