在Linux中将多个JPG合并成一个pdf
我使用下面的命令来转换和合并目录中的所有jpg
文件到一个pdf文件。
convert *.jpg file.pdf
目录中的文件编号从1.jpg
到123.jpg
。 转换进行得很好,但转换后的页面都混在一起。 我希望PDF格式的页面从1.jpg
到123.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