Voglio convertire alcuni file da JPEG in pdf. Sto usando il seguente comando.
$ convert image1.jpg image1.pdf
Ma ho 100 immagini. Come devo convertirli tutti in pdf corrispondenti?
Provai
$ convert image*.jpg image*.pdf
Non funziona
Voglio convertire alcuni file da JPEG in pdf. Sto usando il seguente comando.
$ convert image1.jpg image1.pdf
Ma ho 100 immagini. Come devo convertirli tutti in pdf corrispondenti?
Provai
$ convert image*.jpg image*.pdf
Non funziona
Risposte:
In bash:
for f in *.jpg; do
convert ./"$f" ./"${f%.jpg}.pdf"
done
-
dare problemi, altrimenti.
mogrify
è molto meno digitando. Vedi la mia risposta
È possibile utilizzare il mogrify
comando 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".)
mogrify
posto di convert
. Questo funzionerà per 100 file, ma l'uso del globbing con *.jpg
non si ridimensiona a migliaia di file; ciò può essere fatto combinando il comando in una semplicefind
riga con .
*.jpg
e *.png
file 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.
*.jpg
in *.png
"s" nel passaggio 1 ed eseguire l'equivalente della risposta nel passaggio 2 ...
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.
parallel
) impostando la variabile di ambiente MAGICK_THREAD_LIMIT=1
.
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 img2pdf
purché tu abbia dipendenze (es. apt-get install python python-pil python-setuptools libjpeg-dev
O yum install python python-pillow python-setuptools
).
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, convert
fallisce qui, img2pdf
supera 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.
img2pdf
è disponibile nei repository regolari di Ubuntu 16.04, non è necessaria alcuna operazione manuale pip
e mantieni il vantaggio degli aggiornamenti.
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 -iname
che la versione non fa distinzione tra maiuscole e minuscole , -name
quindi funzionerà .JPG
altrettanto bene .jpg
.
Questo viene utilizzato find
per ottenere l'elenco dei file invece di alterare la shell con il *.jpg
carattere 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, find
gestirà le sottodirectory, mentre il globbing della shell non lo farà a meno che tu non abbia caratteristiche specifiche della shell come la **/*jpg
sintassi globbing ricorsiva in zsh.
EDIT: Ho pensato di aggiungere un'altra utile funzionalità a find
cui 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 touch
un file timestamp al termine della conversione.
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +; touch timestamp
Quindi aggiungere -newer timestamp
alla find
espressione 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 find
ogni volta che è possibile ... ha un'espressività versatile pur rimanendo conciso.
Puoi farlo convert
direttamente. Questo si trova nella parte inferiore del sito ImageMagicks sull'elaborazione della riga di comando .
convert *.jpg +adjoin page-%d.pdf
convert *.jpg -adjoin output.pdf
per un pdf combinato
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 make
e ottenere file png per ogni file svg che si trova in giro.
modificare
Come richiesto:
origs/foo.svg
diventa foo.png
)all: $(PNG)
definisce che il target "all" dipende da tutti i PNG%.png: origs/%.svg
definisce, il file $ X.png dipende da origs / $ X.svg e può essere generato chiamando convert ... $< $@
.
$<
è la dipendenza e e $@
è il nome targetmake
nuovo riconvertirà quelli e solo quelli che sono stati modificati.
make
sembra un po 'troppo complicato quando un semplice one-liner farà il trucco.
find
così non devi ricorrere a un Makefile.
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 find
per eseguire lo script:
find dir -name image\*.jpg -exec /bin/ksh script.ksh {} \;
Nota che entrambi script.ksh
e il find
comando che ti ho dato potrebbero avere sintassi diverse a seconda del sistema operativo e della shell che stai utilizzando.
pdfname=${1%.*}.pdf
sostituisce 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.
L'utilità MacOSSIPS
Sotto MacOS (Sierra), l'utilità da riga di comando sips
integrata di Apple fornisce un accesso completo a tutte le utility di immagini raster di Apple; questo risulta includere la conversione di jpg
a pdf
.
Per esempio, da una bassa risoluzione / piccole dimensioni attuali jpg
dell'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 PSD
formato di immagini raster di Adobe Un sips
linguaggio simile crea *.psd
file 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 psd
raster 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 ImageMagick
utility per creare file di immagini raster pure in png
formato (con tutti i metadati e profili di colore spogliato-out), quindi utilizzare sips
per ripristinare un insieme uniforme di profili e / o commenti a colori e usano sips
anche per generare file di output finali (più comunemente *.png
, *.psd
o *.pdf
file).
Sfortunatamente convert
cambia l'immagine prima di così per avere una perdita minima di qualità dell'originale che jpg
devi usare img2pdf
, io uso questi comandi:
1) Questo per creare un pdf
file da ogni jpg
immagine senza perdita di risoluzione o qualità:
ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf
2) Questo per concatenare le pdf
pagine 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
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
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
Se usi solo file di immagine di quelli che vorresti utilizzare Comic Book Archive (.cbr, .cbz, .cbt, .cba, .cb7)
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