Convertendo vários arquivos de imagem do formato JPEG para PDF

Respostas:

62

Na festança:

for f in *.jpg; do
  convert ./"$f" ./"${f%.jpg}.pdf"
done
enzotib
fonte
11
Alguma razão específica para você adicionar "./" aos argumentos do convert? É uma boa prática geral?
rahmu
4
@rahmu: sim, é uma boa prática, porque o nome do arquivo que começa com -dá problemas, caso contrário.
enzotib
3
Isso funciona, mas mogrifyé muito menos digitado. Veja minha resposta.
Cjm
+1 porque isso é tecnicamente correto e evita armadilhas do bash, mas -1 porque mogrify é a maneira do Imagemagick de converter imagens em lote. Portanto, nenhum voto meu.
Benoit
@aculich: obrigado por seu voto negativo, mas você fez uma consideração errada, veja por que o loop for não gera erro de "argumento por muito tempo"? .
enzotib 31/01
56

Você pode usar o mogrifycomando para isso. Normalmente, ele modifica os arquivos no local, mas ao converter formatos, ele grava um novo arquivo (apenas alterando a extensão para corresponder ao novo formato). Portanto:

mogrify -format pdf -- *.jpg

(Como o enzotib ./*.jpg, isso --evita que nomes de arquivos estranhos sejam interpretados como opções. A maioria dos comandos reconhece --como "pare de procurar opções neste momento".)

cjm
fonte
+1, minha resposta foi apenas sobre bash, não conheço bem o ImageMagick.
enzotib
Boa idéia para usar em mogrifyvez de convert. Isso funcionará para 100 arquivos, mas o uso de globbing com *.jpgnão é dimensionado para milhares de arquivos; isso pode ser feito combinando o comando em uma linha simples comfind .
Aculich
Como converter ambos *.jpg e *.pngarquivos para um único *.pdf? Observe que eles são arquivos numerados (por exemplo, 1.jpg 2.png 3.png 4.jpg) e que a ordem deve ser mantida / preservada na saída em pdf.
Noz sobre natty
como uma solução alternativa: a conversão de todas as *.jpg's em *.png' s na primeira etapa, e realizando o equivalente a sua resposta no passo 2 ...
noz sobre natty
veja também stackoverflow.com/questions/15315770/…
nutty about natty
24

sintaxe mais rápida, mas incomum:

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

Executa em paralelo (usando https://www.gnu.org/software/parallel/ ). Ainda não notei nenhum multiencadeamento convert, o que limitaria a paralelização efetiva. Se essa é a sua preocupação, consulte o comentário abaixo para obter um método para garantir que não ocorra multiencadeamento.

Sebastian
fonte
11
Este caminho é cheio de vitórias. Ele avalia automaticamente a contagem principal e executa muitas tarefas!
meawoppl
11
Este método é o mais rápido de todos.
shivams
11
paralelo é poder, paralelo combinado com imagemagick é superpotência. Eu gosto de superpotência.
CousinCocaine
2
Um pouco atrasado para a festa aqui, mas as versões novas (possivelmente não quando esta resposta foi escrita) do ImageMagick são multiencadeadas e interagirão mal se forem executadas em paralelo. Isso pode ser desativado (se você estiver usando paralelização no nível do aplicativo, como no GNU parallel), configurando a variável de ambiente MAGICK_THREAD_LIMIT=1.
Zebediah49 # 4/15
Usar o ImageMagick para isso resulta em perda de geração e baixo desempenho. O img2pdf em outras partes desta página evita esses problemas.
Robert Fleming
16

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

Em todas as soluções propostas que envolvem o ImageMagick, os dados JPEG são totalmente decodificados e recodificados. Isso resulta em perda de geração e desempenho "dez a cem" vezes pior que img2pdf.

Pode ser instalado pip img2pdfdesde que você tenha dependências (por exemplo, apt-get install python python-pil python-setuptools libjpeg-devou yum install python python-pillow python-setuptools).

Robert Fleming
fonte
3
está certo. Você pode testar se uma ida e volta altera um arquivo JPEG com comandos como convert some.jpg -format pdf -compress jpeg generated.pdf ; pdfimages -j generated.pdf generated.pdf ; diff -sq some.jpg generated.pdf-000.jpg. IMHO esta resposta merece mais votos positivos. De fato, convertfalha aqui, img2pdfpassa em um teste e até inclui muitas opções para definir o tamanho da imagem, o tamanho da página etc. para ajustar o pdf gerado às suas necessidades.
Stéphane Gourichon
3
img2pdfestá disponível nos repositórios regulares do Ubuntu 16.04, sem necessidade de operações manuais com pipele e você mantém o benefício das atualizações.
Stéphane Gourichon
11
No momento em que a pergunta foi feita (e a resposta foi aceita), o img2pdf não existia. Mas hoje em dia o img2pdf é claramente uma resposta melhor.
Kmkaplan 19/01
13

Aqui está uma maneira de combinar as melhores 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 -inamequal é a versão que não diferencia maiúsculas de minúsculas,-name por isso funcionará .JPGtão bem quanto .jpg.

Isso é usado findpara obter a lista de arquivos, em vez de o shell globbing com o *.jpgcuringa, o que pode resultar em um erro 'Lista de argumentos muito longa' em alguns sistemas. Embora como @enzotib aponte em um comentário, o comportamento de usar globbing em um loop for é diferente do que nos argumentos de um comando .

Além disso, findele manipulará subdiretórios, enquanto o globbing do shell não terá, a menos que você tenha recursos específicos do shell, como a **/*jpgsintaxe do globbing recursivo no zsh.

EDIT: Eu pensei em adicionar outro recurso útil, finddepois de ler um comentário de @IlmariKaronen sobre executar novamente o comando e apenas converter arquivos que foram alterados desde a primeira execução.

Na primeira passagem, você pode touchcriar um arquivo de carimbo de data e hora após a conclusão da conversão.

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

Em seguida, inclua -newer timestampna findexpressão para operar no subconjunto de arquivos cuja hora da última modificação é mais recente que o arquivo de carimbo de data / 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

Essa é uma maneira fácil de evitar o recurso a um Makefile (a menos que você já esteja usando uma) e é outra boa razão pela qual vale a pena usá-la findsempre que possível ... tem expressividade versátil e permanece concisa.

aculich
fonte
Usar o ImageMagick para isso resulta em perda de geração e baixo desempenho. O img2pdf em outras partes desta página evita esses problemas.
Robert Fleming
8

Você pode fazer isso convertdiretamente. Isso pode ser encontrado na parte inferior do site ImageMagicks, sobre o processamento de linha de comando .

convert *.jpg +adjoin page-%d.pdf
Frank Zalkow
fonte
4
ou convert *.jpg -adjoin output.pdfpara um pdf combinado
ninjagecko
2
Usar o ImageMagick para isso resulta em perda de geração e baixo desempenho. O img2pdf em outras partes desta página evita esses problemas.
Robert Fleming
7

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 apenas executar makee obter arquivos png para todos os arquivos svg existentes.

Editar

Como pedido:

  • curingas gera uma lista de todos os svgs em origs /
  • PathSubst pega essa lista e produz uma lista de nomes de arquivos png (pasta e extensão diferentes. Exemplo: origs/foo.svgtorna - se foo.png)
  • Regra 1: all: $(PNG)define que o destino "todos" depende de todos os PNGs
  • Regra 2: %.png: origs/%.svgdefine, o arquivo $ X.png depende de origs / $ X.svg e pode ser gerado por chamada convert ... $< $@.
    • $< é a dependência ee
    • $@ é o nome do destino
  • REGRA 3: serve apenas para limpeza
reto
fonte
2
Para uma tarefa pontual, a criação de um Makefile provavelmente é um exagero, mas se você planeja alterar alguns dos PDFs, digitar makenovamente irá reconverter esses e somente os PDFs que foram alterados.
Ilmari Karonen
Você gostaria de explicar o que é curinga, origs, patsubst, como $ e% são interpretados e $ <$ @? O resto é fácil de entender. :)
usuário desconhecido
Recorrer a makeparece um pouco complicado demais quando uma simples linha de comando faz o truque.
Aculich
@IlmariKaronen Concordo que um Makefile é um exagero, mas é bom ter uma maneira de reconverter apenas o subconjunto de arquivos modificados nas execuções subsequentes. Atualizei minha resposta com uma maneira de fazer isso apenas findpara que você não precise recorrer a um Makefile.
Aculich
0

Um pequeno script faria o truque. (testado com ksh88 no 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

Então você pode executar findpara executar o script:

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

Observe que ambos, script.kshe o findcomando que eu dei a você, podem ter diferentes sintaxes dependendo do SO e do shell que você está usando.

rahmu
fonte
pdfname=${1%.*}.pdfsubstitui a extensão do arquivo por pdf. Esse método é muito mais simples e funciona mesmo que o nome do arquivo contenha caracteres especiais. Em uma nota relacionada, adicione aspas duplas em torno das substituições de variáveis.
Gilles 'SO- stop be evil'
Não há motivo para escrever um script separado, quando tudo pode ser feito com uma simples linha de comando .
Aculich
0

O utilitário MacOSSIPS   No MacOS (Sierra), o utilitário de linha de comando sipsinterno da Apple fornece acesso abrangente a todos os utilitários de imagem raster da Apple; isso inclui a conversão de jpgpara pdf.

Por exemplo, a partir de uma baixa resolução / de tamanho pequeno existente jpgimagem 'cat.jpg'(o tamanho de 8401 bytes), a seguinte linha de comando cria 'cat.pdf', sem qualquer alteração na quadrícula-resolução mínima e expansão de tamanho:

$ 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 PSDformato de imagem raster da Adobe   Um sipsidioma semelhante cria *.psdarquivos compatíveis com a 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 em tamanho de arquivo de 30 vezes que é compatível com o uso do formato psdraster Adope .

Produção de livros   Na produção de livros em larga escala, envolvendo centenas de imagens, fornecidas em vários formatos, para mim, um idioma conveniente da linha de comando tem sido o uso de ImageMagickutilitários para criar arquivos puros de imagens rasterizadas em pngformato (com todos os metadados e perfis de cor despojado-out), em seguida, usar sipspara restaurar um conjunto uniforme de perfis de cor e / ou comentários, e usar sipstambém para gerar arquivos de saída finais (mais comumente *.png, *.psdou *.pdfarquivos).

John Sidles
fonte
0

Infelizmente, converta imagem foi alterada antes, para ter uma perda mínima de qualidade do original que jpgvocê precisa usar img2pdf, eu uso estes comandos:

1) Isso para criar um pdfarquivo de cada jpgimagem sem perda de resolução ou qualidade:

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

2) Isso para concatenar as pdfpáginas 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 digitalização nos pdfs para que possam ser pesquisados:

pypdfocr combined.pdf  
Eduard Florinescu
fonte
0

Consegui resolver com imagemagick para conversão e paralelo para acelerar meu processo de conversão:

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

Uma das maneiras mais simples de converter vários arquivos é ir para o diretório de arquivos no terminal linux e digitar:

$ convert *.png mypdf.pdf
Ajeet Yadav
fonte
-1

Se você usar apenas arquivos de imagem, talvez queira usar o Comic Book Archive (.cbr, .cbz, .cbt, .cba, .cb7)

  • Se você usar 7Z, renomeie a extensão do arquivo (sufixo) para .cb7
  • Se você usar o ACE, renomeie a extensão do arquivo (sufixo) para .cba
  • Se você usar o RAR, renomeie a extensão do arquivo (sufixo) para .cbr
  • Se você usar o TAR, renomeie a extensão do arquivo (sufixo) para .cbt
  • Se você usar o ZIP, renomeie a extensão do arquivo (sufixo) para .cbz

Isso é muito mais flexível que o PDF.

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

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

jojo
fonte
11
voto negativo, porque não tem nada a ver com a pergunta do OP.
toogley 28/05