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

Har*_*nan 57 linux shell ubuntu

我使用以下命令将jpg目录中的所有文件转换并合并到单个pdf文件中.

convert *.jpg file.pdf
Run Code Online (Sandbox Code Playgroud)

目录中的文件编号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
Run Code Online (Sandbox Code Playgroud)

但仍然没有运气.操作平台Linux.

小智 94

或者只是阅读ls手册并查看:

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

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

convert `ls -v *.jpg` foobar.pdf
Run Code Online (Sandbox Code Playgroud)

玩得开心;)F.

  • 这是一个很好的解决方案。但是,当我尝试时,由于以下错误而失败:`convert-im6.q16:未授权`foobar.pdf'`。显然,这是一个安全问题,可以通过此线程解决 - https://askubuntu.com/questions/1081895/trouble-with-batch-conversion-of-png-to-pdf-using-convert (5认同)
  • 请注意,这是GNU ls的一个功能,而不是BSD ls.安装GNU coreutils以在BSD系列和OS X上获取GNU ls. (3认同)
  • 如果按顺序生成图像,另一个好的方法是使用`ls -t`标志按修改时间排序.此外,`-r`标志反转顺序. (3认同)
  • @Jason:它有效(+1)。但您最终是否忘记了大多数数码相机将图像存储为“*.JPG”而不是“*.jpg”? (2认同)
  • 当文件名中包含空格时失败,除非竖起大拇指!:)) (2认同)

Del*_*ani 16

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

$ echo *.jpg
1.jpg 10.jpg 100.jpg 101.jpg 102.jpg ...
Run Code Online (Sandbox Code Playgroud)

解决方案是根据需要用零填充文件名,以便在运行convert命令之前它们的长度相同:

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

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

$ echo *.jpg
001.jpg 002.jpg 003.jpg 004.jpg 005.jpg 006.jpg 007.jpg 008.jpg ...
Run Code Online (Sandbox Code Playgroud)


小智 6

你可以用

convert '%d.jpg[1-132]' file.pdf
Run Code Online (Sandbox Code Playgroud)

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

引用其他图像文件的另一种方法是在具有场景范围的文件名中嵌入格式化字符。考虑文件名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


Gre*_*urm 5

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

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

find -iname "*.JPG" | xargs -I'{}' convert {} {}.pdf
pdfunite *.pdf merged_file.pdf
Run Code Online (Sandbox Code Playgroud)

请注意,通过这种方法,您还可以使用 GNU 并行来加速转换:

find -iname "*.JPG" | parallel -I'{}' convert {} {}.pdf
Run Code Online (Sandbox Code Playgroud)