将多个图像文件从JPEG转换为PDF格式


Answers:


62

在bash中:

for f in *.jpg; do
  convert ./"$f" ./"${f%.jpg}.pdf"
done

1
您为什么要在转换的参数前面加上“ ./”,有什么特殊的原因吗?这是一般的好习惯吗?
rahmu 2012年

4
@rahmu:是的,这是一个好习惯,因为以文件名开头的文件会-带来问题,否则。
enzotib 2012年

3
这行得通,但mogrify打字要少得多。看我的答案。
cjm 2012年

+1是因为这在技术上是正确的,可以避免bash陷阱,但-1是因为mogrify是Imagemagick批量转换图像的方式。所以我没有投票。
Benoit 2012年

@aculich:谢谢您的不赞成,但是您做错了考虑,看看为什么for循环不会引发“参数过长”错误?
enzotib 2012年

56

您可以mogrify为此使用命令。通常,它会就地修改文件,但是在转换格式时,会写入一个新文件(只需更改扩展名以匹配新格式)。从而:

mogrify -format pdf -- *.jpg

(就像enzotib的一样./*.jpg--防止将任何奇怪的文件名解释为开关。大多数命令识别--为“此时停止寻找选项”。)


+1,我的回答只是关于bash,不太了解ImageMagick。
enzotib 2012年

mogrify代替的好主意convert。这将适用于100个文件,但是使用globlob *.jpg不能扩展到成千上万个文件。可以通过将简单find命令与结合使用来完成。
aculich 2012年

如何转换 *.jpg*.png文件,以一个单一的*.pdf?请注意,它们是编号文件(例如1.jpg 2.png 3.png 4.jpg),并且应在pdf输出中维护/保留顺序。
关于natty的坚果,

解决方法:在步骤1 中将所有都转换*.jpg*.png,并在步骤2中执行与您的答案相同的结果……
含糊其词


24

更快但不寻常的语法:

parallel convert '{} {.}.pdf' ::: *.jpg

并行运行(使用https://www.gnu.org/software/parallel/)。我还没有注意到任何多线程convert,这会限制有效的并行化。如果您对此有所关注,请参阅下面的注释,以获取确保不发生多线程的方法。


1
这种方式充满了胜利。它会自动评估核心数量并运行许多任务!
meawoppl

1
这种方法是最快的。
shivams,2015年

1
并行就是力量,与imagemagick并联就是超级力量。我喜欢超级大国。
CousinCocaine 2015年

2
这次聚会晚了一点,但是ImageMagick的新版本(可能不是在写此答案时)是多线程的,并且如果并行运行,则交互性很差。可以parallel通过设置环境变量来禁用此功能(如果使用应用程序级并行化功能,例如与GNU一起使用)MAGICK_THREAD_LIMIT=1
zebediah15年

为此使用ImageMagick会导致发电量损失和性能下降。本页其他位置的img2pdf避免了这些问题。
罗伯特·弗莱明

16

https://gitlab.mister-muffin.de/josch/img2pdf

在所有涉及ImageMagick的建议解决方案中,JPEG数据都得到了完全解码和重新编码。这导致发电量损失,性能也比差“十到一百”倍img2pdf

pip img2pdf如果您具有依赖项(例如apt-get install python python-pil python-setuptools libjpeg-devyum install python python-pillow python-setuptools),可以与一起安装。


3
是对的。您可以使用来测试往返是否更改了JPEG文件convert some.jpg -format pdf -compress jpeg generated.pdf ; pdfimages -j generated.pdf generated.pdf ; diff -sq some.jpg generated.pdf-000.jpg。恕我直言,这个答案值得更多的投票。确实,convert这里失败了,img2pdf通过了这样的测试,甚至包括许多选项来设置图片大小,页面大小等,以根据您的需要微调生成的pdf。
斯特凡纳·古里科

3
img2pdf在Ubuntu 16.04常规存储库中可用,无需在pip那里进行手动操作,因此您可以受益于更新。
斯特凡纳·古里科

1
在提出问题(并接受答案)时,img2pdf不存在。但是如今,img2pdf显然是一个更好的答案。
kmkaplan

13

这是将以上建议中的最佳建议组合到一个简单,高效,健壮的命令行中的方法:

find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +

对于以a开头-或包含空格的文件名,它可以正常工作。请注意,使用的-iname不区分大小写的版本,-name因此它.JPG和一样适用.jpg

这用于find获取文件列表,而不是使用*.jpg通配符对shell进行遍历,这在某些系统上可能导致“参数列表过长”错误。尽管正如@enzotib指出的那样,在for循环中使用globlob的行为与命令的arguments有所不同

同样,find它将处理子目录,而除非您碰巧具有**/*jpgzsh中的递归glob语法(例如递归glob语法),否则Shell glob不会处理。

编辑:我想find在阅读@IlmariKaronen的有关重新运行命令并仅转换自首次运行以来已更改的文件的评论后,会想到另一个有用的功能。

第一次touch完成转换后,您可以获取一个时间戳文件。

find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +; touch timestamp

然后添加-newer timestampfind表达式中,以对最后修改时间比时间戳文件新的文件子集进行操作。每次运行后继续更新时间戳文件。

find /path/to/files -iname '*.jpg' -newer timestamp -exec mogrify -format pdf {} +; touch timestamp

这是避免使用Makefile的简便方法(除非您已经在使用Makefile),这也是值得find在任何可能的情况下使用的另一个很好的理由...它具有通用的表现力,同时又保持简洁。


为此使用ImageMagick会导致发电量损失和性能下降。本页其他位置的img2pdf避免了这些问题。
罗伯特·弗莱明


7

我使用以下makefile做类似的事情:

SVG = $(wildcard origs/*.svg)
PNG = $(patsubst origs/%.svg,%.png,$(SVG))

all: $(PNG)

%.png: origs/%.svg
    convert -resize "64x" $< $@


clean: 
    rm $(PNG)

现在,我可以运行了,make并且每个周围的svg文件都会得到png文件。

编辑

按照要求:

  • 通配符生成origs /中所有svg的列表
  • pathsubst接受此列表,并生成一个png文件名列表(不同的文件夹和扩展名。示例:origs/foo.svg变成foo.png)。
  • 规则1:all: $(PNG)定义目标“全部”取决于所有PNG
  • 规则2:%.png: origs/%.svg定义,文件$ X.png取决于origs / $ X.svg,可以通过调用生成convert ... $< $@
    • $< 是依赖项,并且
    • $@ 是目标名称
  • 规则3:只是为了清理

2
对于一次性任务,创建Makefile可能会过大,但是如果您打算更改某些PDF,make再次键入将重新转换那些PDF ,并且转换那些已更改的PDF。
Ilmari Karonen 2012年

您介意解释什么是通配符,原始词,patsubst,如何解释$和%以及$ <$ @?其余的很容易理解。:)
未知用户

make当使用简单的单缸衬套即可解决问题时,诉诸于似乎有些复杂。
aculich 2012年

@IlmariKaronen我同意Makefile是过大的,但是很高兴有一种方法可以在以后的运行中仅重新转换已修改文件的子集。我已经用一种方法更新了答案find因此您不必诉诸Makefile。
aculich

0

一个小脚本就能解决问题。 (在Solaris 10上用ksh88测试)

脚本

#!/bin/ksh

[[ $# != 1 ]] && exit 255 # test for nr of args

pdfname=$(sed -e 's/\(.*\)\.jpg/\1\.pdf/' <(echo $"1")) #replace *.jpg with *.pdf
convert "$1" $pdfname

然后,您可以运行find以执行脚本:

find dir -name image\*.jpg -exec /bin/ksh script.ksh {} \;

请注意,这两个命令script.ksh以及find我给您的命令在使用的OS和Shell上都有不同的语法。


pdfname=${1%.*}.pdf用替换文件的扩展名pdf。该方法简单得多,即使文件名包含特殊字符也可以使用。在相关说明中,在变量替换处添加双引号。
吉尔斯(Gilles)'所以

当可以使用简单的单个命令行在上完成所有脚本时,没有理由编写单独的脚本。
aculich 2012年

0

MacOS实用程序SIPS   在MacOS(Sierra)下,Apple的内置命令行实用程序sips提供对Apple所有光栅图像实用程序的全面访问。事实证明这包括转换jpgpdf

例如,从现有的低分辨率/小尺寸jpg图像'cat.jpg'(大小为8401字节)中,以下命令行创建'cat.pdf',而光栅分辨率没有变化,并且文件大小的扩展最小:

$ sips -s format pdf cat.jpg --out 'cat.pdf' 1>/dev/null 2>&1
$ ls -l cat.*
-rw-r--r--@ 1 <user redacted> <group redacted>  8401 Jun 18 07:06 cat.jpg
-rw-r--r--+ 1 <user redacted> <group redacted> 10193 Jun 18 07:22 cat.pdf

转换为Adobe的PSD栅格图像格式   类似的sips用法可以创建Adobe兼容的*.psd文件

$ sips -s format psd cat.jpg --out 'cat.psd' 1>/dev/null 2>&1
$ ls -l cat.jpg cat.psd
-rw-r--r--@ 1 Administration  staff    8401 Jun 18 07:06 cat.jpg
-rw-r--r--+ 1 Administration  staff  350252 Jun 18 07:37 cat.psd

但是请注意,使用Adope psd栅格格式会带来30倍的文件大小扩展。

书籍制作   在进行大规模书籍制作时,涉及数百种以多种格式提供的图像,对我而言,一种方便的命令行习惯用法是使用ImageMagick实用程序来创建png格式纯的光栅图像文件(所有元数据和颜色配置文件剥离出),然后使用sips还原一套统一的颜色配置文件和/或评论,并使用sips也产生最终的输出文件(最常见的*.png*.psd*.pdf文件)。


0

不幸的是,convert在此之前更改了图像,以使jpg您需要使用的原始图像的质量损失最小img2pdf,我使用以下命令:

1)这样可以pdf从每张jpg图像制作文件,而不会降低分辨率或质量:

ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf

2)这样可以将pdf页面串联成一个页​​面:

pdftk *.pdf cat output combined.pdf

3)最后,我添加了一个OCRed文本层,该层不会更改pdf中扫描的质量,因此可以搜索它们:

pypdfocr combined.pdf  



-1

如果仅使用图像文件,而不是使用漫画书存档(.cbr,.cbz,.cbt,.cba,.cb7)

  • 如果使用7Z,则将文件扩展名(后缀)重命名为.cb7
  • 如果使用ACE,则将文件扩展名(后缀)重命名为.cba
  • 如果使用RAR,则将文件扩展名(后缀)重命名为.cbr
  • 如果使用TAR,则将文件扩展名(后缀)重命名为.cbt
  • 如果使用ZIP,则将文件扩展名(后缀)重命名为.cbz

这比PDF灵活得多。

Under Linux you can use software like Comix, Evince, Okular and QComicBook.

https://secure.wikimedia.org/wikipedia/zh/wiki/Comic_book_archive


1
不赞成投票,因为这与OP的问题无关。
Toogley '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.