在Linux中将多个JPG合并成一个pdf

我使用下面的命令来转换和合并目录中的所有jpg文件到一个pdf文件。

 convert *.jpg file.pdf 

目录中的文件编号从1.jpg123.jpg 。 转换进行得很好,但转换后的页面都混在一起。 我希望PDF格式的页面从1.jpg123.jpg的顺序与他们命名的顺序相同。 我也尝试了以下命令:

 cd 1 FILES=$( find . -type f -name "*jpg" | cut -d/ -f 2) mkdir temp && cd temp for file in $FILES; do BASE=$(echo $file | sed 's/.jpg//g'); convert ../$BASE.jpg $BASE.pdf; done && pdftk *pdf cat output ../1.pdf && cd .. rm -rf temp 

但是还是没有运气。 操作平台Linux。

问题是因为你的shell正在以纯粹的字母顺序扩展通配符,并且由于数字的长度不同,顺序将是不正确的:

 $ echo *.jpg 1.jpg 10.jpg 100.jpg 101.jpg 102.jpg ... 

解决的办法是根据需要使用零填充文件名,这样在运行convert命令之前它们的长度是相同的:

 $ for i in *.jpg; do num=`expr match "$i" '\([0-9]\+\).*'`; > padded=`printf "%03d" $num`; mv -v "$i" "${i/$num/$padded}"; done 

现在文件将按照正确的顺序与通配符匹配,准备好转换命令:

 $ echo *.jpg 001.jpg 002.jpg 003.jpg 004.jpg 005.jpg 006.jpg 007.jpg 008.jpg ... 

或者只是阅读ls手册,看看:

文本中的-v自然types的(版本)数字

所以,在单一命令中做我们需要的。

 convert `ls -v *.jpg` foobar.pdf 

玩得开心;)F.

这是我如何做到的:
第一行将所有jpg文件转换为pdf它是使用转换命令。
第二行是所有的PDF文件合并为一个PDF格式的每页。 这是使用gs((PostScript和PDF语言解释器和预览器))

 for i in $(find . -maxdepth 1 -name "*.jpg" -print); do convert $i ${i//jpg/pdf}; done gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=merged_file.pdf -dBATCH `find . -maxdepth 1 -name "*.pdf" -print"` 

把第一个想法和他们的答复混合起来,

 jpgs2pdf.sh #!/bin/bash cd $1 FILES=$( find . -type f -name "*jpg" | cut -d/ -f 2) mkdir temp > /dev/null cd temp for file in $FILES; do BASE=$(echo $file | sed 's/.jpg//g'); convert ../$BASE.jpg $BASE.pdf; done && pdftk `ls -v *pdf` cat output ../`basename $1`.pdf cd .. rm -rf temp 

你可以使用

 convert '%d.jpg[1-132]' file.pdf 

通过https://www.imagemagick.org/script/command-line-processing.php

另一种引用其他图像文件的方法是将格式化字符embedded到具有场景范围的文件名中。 考虑文件名image-%d.jpg[1-5] 。 命令

magick image-%d.jpg[1-5]导致ImageMagick试图读取这些文件名的图像:

image-1.jpg image-2.jpg image-3.jpg image-4.jpg image-5.jpg

另见https://www.imagemagick.org/script/convert.php