Chci převést některé soubory z formátu JPEG do formátu pdf. Používám následující příkaz.
$ convert image1.jpg image1.pdf
Ale mám 100 obrázků. Jak je všechny převést na odpovídající soubory PDF?
Zkusil jsem
$ convert image*.jpg image*.pdf
To nefunguje.
In bash:
for f in *.jpg; do
convert ./"$f" ./"${f%.jpg}.pdf"
done
K tomu můžete použít příkaz mogrify
. Normálně modifikuje soubory na místě, ale při převodu formátů zapíše nový soubor (pouze změní příponu tak, aby odpovídala novému formátu). Tím pádem:
mogrify -format pdf -- *.jpg
(Jako enzotib's ./*.jpg
, the --
zabraňuje interpretaci jakýchkoli podivných názvů souborů jako přepínačů. Většina příkazů rozpoznává --
znamená „přestat hledat možnosti v tomto bodě“.)
rychlejší, ale neobvyklá syntaxe:
parallel convert '{} {.}.pdf' ::: *.jpg
Běží paralelně (pomocí https://www.gnu.org/software/parallel/ ). V convert
jsem si zatím nevšiml žádné vícevláknové operace, což by omezilo efektivní paralelizaci. Pokud je to váš problém, podívejte se do komentáře níže, abyste zjistili, jak nedochází k vícevláknovému zpracování.
https://gitlab.mister-muffin.de/josch/img2pdf
Ve všech navrhovaných řešeních zahrnujících ImageMagick jsou data JPEG plně dekódována a překódována. Výsledkem je ztráta generace , stejně jako výkon desetkrát až stokrát horší než img2pdf
.
Lze nainstalovat pomocí pip img2pdf
za předpokladu, že máte závislosti (např. apt-get install python python-pil python-setuptools libjpeg-dev
nebo yum install python python-pillow python-setuptools
).
Zde je způsob, který kombinuje to nejlepší z výše uvedených návrhů do jednoduché, efektivní a robustní příkazové řádky:
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +
Funguje to dobře s názvy souborů, které začínají znakem -
Nebo obsahují mezery. Všimněte si použití -iname
, Což je nerozlišuje velká a malá písmena verze -name
, Takže bude fungovat na .JPG
Stejně jako .jpg
.
To používá find
k získání seznamu souborů namísto Shell globbing s zástupným znakem *.jpg
, Což může mít za následek 'Argument příliš dlouhá' chyba na některých systémech. Ačkoli @enzotib ukazuje v komentáři, chování použití globbing ve smyčce for for je odlišný od argumentů příkaz .
find
bude také zpracovávat podadresáře, zatímco Shell globbing nebude, pokud náhodou nebudete mít funkce specifické pro Shell, jako je rekurzivní syntaxe globching **/*jpg
V zsh.
ÚPRAVA: Myslel jsem, že bych přidal další užitečnou funkci find
, kterou jsem si myslel po přečtení komentáře od @ IlmariKaronen o opětovném spuštění příkazu a pouze o převodu souborů, které se změnily od prvního spuštění.
Na prvním průchodu můžete po dokončení převodu touch
soubor časového razítka.
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +; touch timestamp
Pak přidejte -newer timestamp
Do výrazu find
, aby fungoval na podmnožině souborů, jejichž poslední změněný čas je novější než soubor časových razítek. Po každém spuštění pokračujte v aktualizaci souboru časových razítek.
find /path/to/files -iname '*.jpg' -newer timestamp -exec mogrify -format pdf {} +; touch timestamp
Je to snadný způsob, jak se vyhnout nutnosti uchýlit se k Makefile (pokud jej již nepoužíváte), a je to další dobrý důvod, proč se vyplatí používat find
, kdykoli je to možné ... má všestrannou expresivitu a zůstává stručný.
Můžete to provést přímo pomocí convert
. Toto najdete ve spodní části stránky ImageMagicks o Zpracování příkazového řádk .
convert *.jpg +adjoin page-%d.pdf
Pro něco podobného jsem použil následující makefile:
SVG = $(wildcard origs/*.svg)
PNG = $(patsubst origs/%.svg,%.png,$(SVG))
all: $(PNG)
%.png: origs/%.svg
convert -resize "64x" $< [email protected]
clean:
rm $(PNG)
Nyní můžu spustit make
a dostanu png soubory pro každý svg soubor, který leží kolem.
pravit
Jak bylo požadováno:
origs/foo.svg
se stane foo.png
)all: $(PNG)
definuje, že cíl „vše“ závisí na všech PNG%.png: origs/%.svg
Definuje, že soubor $ X.png závisí na origs/$ X.svg a lze jej vygenerovat voláním convert ... $< [email protected]
. $<
Je závislost a[email protected]
Je název cíleBohužel convert
změní obrázek dříve, aby byla minimální ztráta kvality originálu jpg
musíte použít img2pdf
, Používám tyto příkazy:
1) Tím se vytvoří soubor pdf
z každého obrázku jpg
bez ztráty rozlišení nebo kvality:
ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf
2) Toto zřetězení pdf
pages na jednu:
pdftk *.pdf cat output combined.pdf
3) A nakonec přidám textovou vrstvu OCRed, která nemění kvalitu skenování v pdf, takže je lze prohledávat:
pypdfocr combined.pdf
Nástroj MacOS SIPS
V systému MacOS (Sierra) poskytuje vestavěný nástroj příkazového řádku Apple sips
komplexní přístup ke všem nástrojům Apple pro rastrové obrazy; to bude zahrnovat převod jpg
na pdf
.
Například ze stávajícího obrázku jpg
s malým rozlišením/malou velikostí 'cat.jpg'
(o velikosti 8401 bajtů) vytvoří následující příkazový řádek 'cat.pdf'
, beze změny rastrového rozlišení a minimálního rozšíření velikosti souboru:
$ sips -s format pdf cat.jpg --out 'cat.pdf' 1>/dev/null 2>&1
$ ls -l cat.*
[email protected] 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
Převod do formátu rastru-obrázku Adobe PSD
Podobný idiom sips
vytváří Adobe kompatibilní *.psd
soubory
$ sips -s format psd cat.jpg --out 'cat.psd' 1>/dev/null 2>&1
$ ls -l cat.jpg cat.psd
[email protected] 1 Administration staff 8401 Jun 18 07:06 cat.jpg
-rw-r--r--+ 1 Administration staff 350252 Jun 18 07:37 cat.psd
Všimněte si však třicetinásobného rozšíření velikosti souboru, které je přizpůsobeno použití rastrového formátu Adope psd
.
Book Production Při výrobě knih ve velkém měřítku, zahrnujících stovky obrázků, které jsou dodávány v různých formátech, byl pro mě pohodlný idiom příkazového řádku pomocí ImageMagick
nástrojů k vytvoření čistého soubory rastrových obrázků ve formátu png
(se všemi stripovanými metadata a profily barev), pak pomocí sips
obnovte jednotnou sadu barevných profilů nebo komentářů a použijte sips
také generovat konečné výstupní soubory (nejčastěji *.png
, *.psd
nebo *.pdf
soubory).
Jedním z nejjednodušších způsobů, jak převést více souborů, je přejít do adresáře souborů v terminálu linux a napsat:
$ convert *.png mypdf.pdf
Trik by udělal malý skript. (testováno s ksh88 na 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
Potom můžete spustit find
a spustit skript:
find dir -name image\*.jpg -exec /bin/ksh script.ksh {} \;
Všimněte si, že obě script.ksh
a příkaz find
, který jsem vám dal, mohou mít různé syntaxe, které se odvíjí od operačního systému a prostředí, které používáte.
Řekl jsem si s imagemagickem pro konverzi a paralelně, abych urychlil svůj proces převodu:
ls *.JPEG |parallel convert -density 200 -resize 496X646 -quality 100 {} ../{.}.PDF