No bash:
for f in *.jpg; do
convert ./"$f" ./"${f%.jpg}.pdf"
done
Eu quero converter alguns arquivos de jpeg para pdf. Eu estou usando o seguinte comando.
$ convert image1.jpg image1.pdf
Mas tenho 100 imagens. Como devo converter todos eles para os pdfs correspondentes?
Eu tentei
$ convert image*.jpg image*.pdf
Não funciona.
Você pode usar o comando mogrify
para isso. Normalmente, ele modifica arquivos no local, mas ao converter formatos, ele grava um novo arquivo (apenas alterando a extensão para corresponder ao novo formato). Assim:
mogrify -format pdf -- *.jpg
(Como ./*.jpg
da enzotib, o --
impede que qualquer nome de arquivo estranho seja interpretado como comutadores. A maioria dos comandos reconhece --
para "parar de procurar opções neste ponto".)
sintaxe mais rápida, mas incomum:
parallel convert '{} {.}.pdf' ::: *.jpg
É executado em paralelo (usando link ). Eu não notei nenhum multi-threading em convert
ainda, o que limitaria a paralelização efetiva. Se essa for a sua preocupação, consulte no comentário abaixo um método para garantir que não ocorra multi-threading.
Aqui está uma maneira que combina o melhor das sugestões acima em uma linha de comando simples, eficiente e robusta:
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +
Funciona bem com nomes de arquivos que começam com -
ou contêm espaços. Observe o uso de -iname
, que é a versão insensível a maiúsculas de -name
, de modo que funcionará em .JPG
tão bem quanto em .jpg
.
Isso usa find
para obter a lista de arquivos em vez do shell globbing com o curinga *.jpg
, o que pode resultar em um
Além disso, find
manipulará os subdiretórios, enquanto o shell globbing não funcionará, a menos que você tenha recursos específicos do shell, como a sintaxe de globulação recursiva **/*jpg
em zsh.
EDIT: Eu pensei em adicionar outro recurso útil de find
que eu pensei depois de ler um comentário por sobre re-executar o comando e apenas converter arquivos que foram alterados desde a primeira execução.
Na primeira passagem, você pode touch
um arquivo de carimbo de data / hora após a conclusão da conversão.
find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +; touch timestamp
Em seguida, adicione -newer timestamp
à expressão find
para operar no subconjunto de arquivos cujo horário da última modificação é mais recente que o arquivo de registro de data e hora. Continue atualizando o arquivo de carimbo de data / hora após cada execução.
find /path/to/files -iname '*.jpg' -newer timestamp -exec mogrify -format pdf {} +; touch timestamp
Esta é uma maneira fácil de evitar ter que recorrer a um Makefile (a menos que você já esteja usando um) e é outra boa razão pela qual vale a pena usar find
sempre que possível ... tem expressividade versátil enquanto permanece conciso.
Em todas as soluções propostas envolvendo o ImageMagick, os dados JPEG são totalmente decodificados e recodificados. Isso resulta em perda de geração , bem como desempenho "dez a cem" vezes pior do que img2pdf
.
Pode ser instalado com pip img2pdf
desde que você tenha dependências (por exemplo, apt-get install python python-pil python-setuptools libjpeg-dev
ou yum install python python-pillow python-setuptools
).
Você pode fazer isso com convert
diretamente. Isso pode ser encontrado na parte inferior do Site do ImageMagicks sobre Processamento de linha de comando .
convert *.jpg +adjoin page-%d.pdf
Eu usei o seguinte makefile para algo semelhante:
SVG = $(wildcard origs/*.svg)
PNG = $(patsubst origs/%.svg,%.png,$(SVG))
all: $(PNG)
%.png: origs/%.svg
convert -resize "64x" $< $@
clean:
rm $(PNG)
Agora, posso executar apenas make
e obter arquivos png para cada arquivo svg existente.
Editar
Conforme solicitado:
origs/foo.svg
se torna foo.png
) all: $(PNG)
define que o destino "all" depende de todos os PNGs %.png: origs/%.svg
define, o arquivo $ X.png depende de origs / $ X.svg e pode ser gerado chamando convert ... $< $@
.
$<
é a dependência ee $@
é o nome de destino Um roteiro minúsculo faria o truque. (testado com o ksh88 no Solaris 10)
script.ksh
#!/bin/ksh
[[ $# != 1 ]] && exit 255 # test for nr of args
pdfname=$(sed -e 's/\(.*\)\.jpg/\.pdf/' <(echo $"1")) #replace *.jpg with *.pdf
convert "$1" $pdfname
Em seguida, você pode executar find
para executar o script:
find dir -name image\*.jpg -exec /bin/ksh script.ksh {} \;
Observe que o comando script.ksh
e find
que forneci a você pode ter diferentes sintaxes depostas no sistema operacional e no shell que você está usando.
Eu consegui resolver com imagemagick para conversão e paralelamente ajude-me a acelerar meu processo de conversão:
ls *.JPEG |parallel convert -density 200 -resize 496X646 -quality 100 {} ../{.}.PDF
Grettings
O utilitário MacOS SIPS
No MacOS (Sierra), o utilitário de linha de comando interno da Apple sips
fornece acesso abrangente a todos os utilitários de imagem raster da Apple; Isso acaba por incluir a conversão de jpg
para pdf
.
Por exemplo, de uma jpg
imagem 'cat.jpg'
(de tamanho 8401 bytes) de baixa resolução / tamanho pequeno existente, a seguinte linha de comando cria 'cat.pdf'
, sem alteração na resolução de varredura e expansão mínima do tamanho do arquivo:
$ 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
Conversão para o formato de imagem raster PSD
da Adobe Um idioma sips
semelhante cria arquivos *.psd
compatíveis com 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
Observe, no entanto, a expansão de tamanho de arquivo de 30 dobras que acompanha o uso do formato de raster Adope psd
.
Produção de livros Ao fazer produção de livros em grande escala, envolvendo centenas de imagens, fornecidas em vários formatos, para mim um idioma de linha de comando conveniente foi usar ImageMagick
utilitários para criar arquivos de imagem de rasterização no formato png
(com todos os metadados e perfis de cores removidos), use sips
para restaurar um conjunto uniforme de perfis de cores e / ou comentários e use sips
também para gerar o final arquivos de saída (mais comumente *.png
, *.psd
ou *.pdf
arquivos).
Infelizmente, convert
altera a imagem antes para ter uma perda mínima de qualidade do original jpg
você precisa usar img2pdf
, eu uso este comando:
1) Isso transforma um arquivo pdf
em cada jpg
imagem sem perda de resolução ou qualidade:
ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf
2) Isso para concatenar as páginas pdf
em uma:
pdftk *.pdf cat output combined.pdf
3) E, por último, adiciono uma camada de texto com OCR que não altera a qualidade da verificação nos PDFs para que possam ser pesquisáveis:
pypdfocr combined.pdf
Se você usar apenas arquivos de imagem, talvez queira usar Arquivo de histórias em quadrinhos (.cbr, .cbz, .cbt, .cba, .cb7)
Isso é muito mais flexível que o PDF.
Under Linux you can use software like Comix, Evince, Okular and QComicBook.