在Linux中将多个jpg合并为单个pdf

时间:2012-11-29 03:15:27

标签: linux shell ubuntu

我使用以下命令将目录中的所有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。

6 个答案:

答案 0 :(得分:92)

或者只需阅读ls手册,请参阅:

  

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

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

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

玩得开心;) F。

答案 1 :(得分:16)

问题是因为你的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

现在文件将以正确的顺序与通配符匹配,为convert命令做好准备:

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

答案 2 :(得分:4)

我就是这样做的:
第一行将所有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"`

答案 3 :(得分:3)

您可以使用

"..."

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

  

引用其他图像文件的另一种方法是嵌入一个   使用场景范围格式化文件名中的字符。考虑一下   文件名convert '%d.jpg[1-132]' file.pdf 。命令

     

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

     

magick image-%d.jpg[1-5]

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

答案 4 :(得分:2)

当我想要合并许多高分辨率jpeg图像(来自扫描的书籍)时,以上所有答案都失败了。

Imagemagick尝试将所有文​​件加载到RAM中,因此我使用了以下两步方法:

find -iname "*.JPG" | xargs -I'{}' convert {} {}.pdf
pdfunite *.pdf merged_file.pdf

请注意,使用此方法,您还可以使用GNU parallel来加速转换:

find -iname "*.JPG" | parallel -I'{}' convert {} {}.pdf

答案 5 :(得分:0)

将第一个想法与他们的回复相混合,我认为这段代码可能令人满意

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