83

我使用以下命令将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。

4

8 回答 8

138

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

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

因此,在单个命令中执行我们需要的操作。

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

玩得开心;) F.

于 2014-01-22T09:47:53.687 回答
23

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

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

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

$ 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 ...
于 2012-11-29T03:32:21.730 回答
7

你可以使用

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

通过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

于 2017-10-21T23:18:59.140 回答
4

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

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

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

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

find -iname "*.JPG" | parallel -I'{}' convert {} {}.pdf
于 2017-12-14T14:31:25.710 回答
3

这就是我的做法:
第一行将所有 jpg 文件转换为使用 convert 命令的 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"`
于 2014-10-28T14:11:53.260 回答
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
于 2015-06-29T23:10:47.010 回答
-1

如何从图像列表创建 PDF 文档

第 1 步:parallel从存储库安装。这将加快进程

第 2 步:将每个 jpg 转换为 pdf 文件

find -iname "*.JPG" | sort -V | parallel -I'{}' convert -compress jpeg -quality 25 {} {}.pdf

sort -V将按自然顺序对文件名进行排序。

第 3 步:将所有 PDF 合并为一个

pdfunite $(find -iname '*.pdf' | sort -V) output_document.pdf

信贷格雷戈尔风暴

于 2021-10-29T04:11:33.340 回答
-1

结合 Felix Defrance 和 Delan Azabani 的回答(从上面):

convert `for file in $FILES; do echo $file; done` test_2.pdf
于 2021-11-22T22:05:20.393 回答