将一个包含JPEG文件的目录转换为单个PDF文档

我在一个目录中有很多JPEG文件,我想将它们转换为PDF并将它们合并在一起成为一个单一的文档。
如何完成这个任务呢?
我希望使用命令行来进行操作,因为这样的处理速度会更快。

很遗憾,这个问题不再接受回答了,但是可以试试pdfcpu,它是用go语言编写的,所以是一个单一的二进制文件,并且具有简单的命令行界面。 - SinaMobasheri
10个回答

使用“imagemagick”软件包中的“convert”命令:
convert *.jpg -auto-orient pictures.pdf

您将获得一个包含当前文件夹中所有jpg图片的单个pdf文件。 选项-auto-orient会读取图像的EXIF数据来旋转图像。
安装IM:
sudo apt-get install imagemagick

来源:stackoverflow imagemagick选项 编辑:请注意,如果图像没有编号,它们将按照特定顺序排列。如果您有10个或更多的图像,您需要以filename01.jpg...filename99.jpg等方式命名它们。前导零对于正确排序是必需的。如果您有100个或更多,则为001...999。

2用小丑并没有对我起作用,我不得不使用@Alex的解决方案。 - Eusebius
3@Eusebius 如果通配符在使用convert时无法正常工作,你可以使用一行命令,例如 for f in *.jpg; do convert "$f" "$f.pdf"; done; pdftk *.pdf cat output final.pdf - Elder Geek
3GrphicMagick用户应该运行gm convert *.jpg pictures.pdf - michaelbn
4也许我的jpg文件太大太多了,但是这么做几乎立即就消耗了如此多的RAM,以至于我的16GB系统开始交换内存。 - RonJohn
36请注意,这种方法可能会导致“未经授权”错误;请参阅此相关问题(及答案) - Jani Uusitalo
每个文件都出现了这样的错误:convert-im6.q16: DistributedPixelCache '127.0.0.1' @ error/distribute-cache.c/ConnectPixelCacheServer/244. convert-im6.q16: cache resources exhausted `A-217.JPG' @ error/cache.c/OpenPixelCache/3984. 我尝试了下面建议的img2pdf(它起作用了)。 - Al Lelopath
1和@RonJohn一样,使用“转换”会占用我的内存,即使只是几张图片... - Joshua Salazar
@JaniUusitalo,谢谢您的评论。我鼓励您直接编辑答案并将其包含进去,因为这似乎对使一切顺利进行至关重要。 - kcpr
有没有办法让转换过程考虑到来自EXIF的旋转信息? - Kostanos
1@Kostanos:使用选项-auto-orient。我会更新答案。 - rosch
“convert” 默认情况下是否保留所有图像细节,如图像分辨率、JPEG质量等?阅读了手册,但未找到相关信息。谢谢! - Maxim
@Maxim:是的,确实可以。为了降低分辨率,我使用了“convert *.jpg -auto-orient -quality 75% pictures.pdf”命令将图像质量降低到了75%。 - sarlacii
我不知道为什么,但在大约180张图片中,只有前3-4张能正常显示... 其余的都是空白页。 - grrigore
这会是无损的吗? - einpoklum
根据scarlacii的评论,是可以的。你需要使用例如-quality 75%来进行更改。 - rosch

很不幸,convert在将图像“打包”到PDF之前会改变图像质量。因此,为了最小化质量损失,最好将原始的jpg(或.png)放入PDF中。要做到这一点,您需要按照以下步骤使用img2pdf
(根据评论建议进行更新)使用img2pdf的更简短的一行解决方案如下:
  1. 制作PDF

    img2pdf *.jp* --output combined.pdf
    
  2. (可选) 对输出的PDF进行OCR识别

    ocrmypdf combined.pdf combined_ocr.pdf
    

以下是需要更多命令和工具的原始答案:
  1. 这个命令是将每个jpg图像转换为pdf文件,而不会损失分辨率或质量:

    ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf
    
  2. 这个命令将把pdf页面合并成一个文档:

    pdftk *.pdf cat output combined.pdf
    
  3. 最后,我添加了一个OCR文本层,它不会改变pdf中扫描的质量,以便可以进行搜索:

    pypdfocr combined.pdf
    

    或者,作为使用pypdfocr的替代方案:

    ocrmypdf combined.pdf combined_ocr.pdf
    

1太棒了!唯一的缺点是没有压缩,导致生成的.pdf文件大小会非常大(即略大于所有图片的总和)。但如果你要转换的文档真的很重要,那么这个方法是值得的! - Gokul NC
4在“convert”失败并显示“尝试执行安全策略‘PDF’不允许的操作”的情况下,这个方法很有效。 - Matthias Braun
3img2pdf支持同时输入多个JPEG文件。请参考其手册中的示例。 - Yai0Phah
3img2pdf *.jpeg --output jpegsas.pdf 对我来说解决了问题,没有使用管道或多个步骤,顺序正确。虽然我不关心OCR,但很容易添加。谢谢! - Jan Bühler
4@MatthiasBraun 这个问题在这里有解答:https://askubuntu.com/questions/1081695/error-during-converting-jpg-to-pdf - yroc
1您可能需要安装一些tesseract-ocr-包来支持您所使用的语言的OCR。 - jarno
1这就是诀窍!特别是与jpegoptim结合使用,首先控制输入图片的大小,例如:jpegoptim --overwrite --size=1000k *.jp* - Antonio
为了保持与ocrmypdf的无损性,请使用以下命令:ocrmypdf --optimize 0 --output-type pdf combined.pdf combined_ocr.pdf - aksh1618

convert `ls -1v` file.pdf

这个ls命令将按照“自然顺序”(1,2,3...)逐个列出文件,并继续进行转换。

1我尝试了一下,但对我来说没用。许多错误表明可能与文件名中的空格有关。 - Elder Geek
6为了解决空格问题,首先执行模式替换: 对于每个ThisFile in *.jpg; do mv "$ThisFile" "${ThisFile// /_}" >/dev/null 2>&1; d - Simon Mattes

对我来说起作用(但是警告!+compress选项会关闭压缩,导致生成的PDF文件很大!):
convert page1.jpg page2.jpg +compress file.pdf

或者甚至:
convert -rotate 90 page\*.jpg +compress file.pdf

从ubuntuforums.org上,+compress帮助它避免了卡住的情况。 注意:+compress选项关闭了压缩功能。当时我使用的机器似乎无限卡住了(虽然我没有等到永远来找出真相)。如果你在压缩过程中遇到慢速或卡住的问题,可能需要仔细阅读imagemagick.org option -compress并尝试使用-compress<type>来找到适合你的解决方案。请自行参考文档以获得更多信息。

16请勿使用上面建议的 convert 命令中的 +compress 选项!它实际上会禁用所有压缩,导致生成的 PDF 文件比原始 JPEG 文件大 10 倍。只需不指定压缩选项,convert 就会使用输入文件的压缩格式(JPEG),这在文件大小方面是最佳选项。来源:http://www.imagemagick.org/script/command-line-options.php#compress - user335432
那不直观!感谢S Minddal。这对我有用。我猜测我使用的机器在进行压缩时出了问题。我会调整答案。 - gaoithe
3所以$ converet *.jpg file.pdf在文件大小较小的情况下比使用+compress参数效果更好。 - doctorate

我很好奇为什么没有人提到pdfjam,它是一种将图像/PDF合并成PDF的超高效方法。
pdfjam --a4paper *.jpg

我会为您创建一个A4格式的PDF文件,适用于所有的.jpg文件,通常以-pdfjam.pdf结尾。如果要强制指定输出名称,您可以使用--outfile <您的输出>选项!

据我所见,该命令没有对文件进行重新编码,与convert相比非常快速。

安装pdfjam,我不确定最有效的方式是什么(它会随LaTeX自动安装),但您可以尝试:

sudo apt install pdfjam

或者也许
sudo apt install texlive-extra-utils

这对我来说解决了问题! - kmario23
喜欢A4格式,但不值得安装400MB的texlive-extra-utils...回答不错,不过 - CarlosRos
对我来说没用。pdfjam: 失败。调用 /usr/bin/pdflatex 时出现错误 - mishadr
@mishadr 奇怪。也许你可以创建另一个问题,提供更多细节,特别是完整的日志。 - tobiasBora
非常棒的小程序。正是我在寻找的东西。绝对值得额外的400MB(请参见上面的评论)。 - DAB

使用LibreOffice Writer打开jpg或png文件,并导出为PDF。
希望这是一种简单的导出PDF的方法。

你也可以尝试一下谷歌搜索,有很多在线转换网站。 - Rγσ ξηg Lιαη Ημ 雷欧

以下解决方案也依赖于ImageMagick的convert,但更加复杂,因为:
  • 它允许所有图像具有不同的尺寸,同时保持输出PDF页面大小相同(例如A4)。
  • 它将图像居中显示在PDF页面上。
  • 它允许您保证图像边框与PDF页面边框之间的最小间距,以便无问题地打印PDF。
  • 它不会改变图像数据。(因此图像质量不受影响,PDF文件的文件大小与图像大致相同,并且您可以稍后使用pdfimages -j file.pdf img重新提取原始图像。)目前,这仅适用于PNG格式 - 请参阅@dma_k的评论。

操作说明:

使用我的脚本从this answer将每个图像转换为自己的一页PDF文件,页面大小为A4,并且周围有5%的边框。
使用以下命令使用PDFtk连接所有的一页PDF文件: pdftk *.pdf cat output out.pdf

2这个命令表明(至少在Ubuntu 16.04上提供的版本中),图像数据确实受到影响:convert some.jpg -format pdf -compress jpeg generated.pdf ; pdfimages -j generated.pdf generated.pdf ; diff -sq some.jpg generated.pdf-000.jpg - Stéphane Gourichon
2我正在使用GraphicsMagick玩耍,发现它执行图像重新压缩。结果在PDF页面上生成的JPEG图像质量要差得多。因此,目前最安全的方法是添加PNG图像-它们会被正确插入。也可以参考这篇文章 - dma_k

使用你可以做到这一点。但有时候你可能需要按时间戳、大小或名称的顺序将图像转换为文档。为了实现这一点,这个脚本就是干这个工作的。
在的位置,输入你希望的输出文件名。
命令的选项(根据你的需求选择以下选项)

  • <-S>,按文件大小排序,最大的排在前面
  • <-t>,按修改时间排序,最新的排在前面
  • <-X>,按扩展名字母顺序排序
  • <-r>,在排序时反向排序

虽然convert可以完成工作,但它会尝试同时打开所有的源文件,如果你有很多文件并且没有大量的内存,可能会用完内存。
因此,作为替代方案,您可以在终端中运行以下命令,同时位于包含jpg文件的文件夹中。
ls *.jpg | xargs -I% img2pdf -o %.pdf % 

这将每个图像转换为单页的PDF文件,逐一进行操作,以免对系统造成过大负担。然后:
pdfunite *.pdf output.pdf && rm *.jpg.pdf 

这将把PDF文件合并成一个单一的PDF,并删除那些只有一页的文件。

这是一个谦逊的问题 - 但文件大小可能会爆炸 - 为了避免文件大小爆炸,您可以按照以下步骤操作:
a) 首先,您需要使用"gimp"将*.jpeg文件导出为*.jpg文件。 (jpeg是苹果格式 - jpeg和jpg并不相同!) jpg文件需要一个小白色或黑色的'passepartout'(即边框)。
b) 使用Android和应用程序"photocompress",我将jpg文件压缩到每个文件小于300千字节的大小。
c) 然后回到Ubuntu的桌面,您可以使用Libre-Office编辑这些文件,并创建一个包含它们的pdf地图。
当然,有人知道如何在终端中简单地从a)到c)进行操作吗?
这样做的副作用是,由于正确的字节大小,接收者使用糟糕的$微软系统可能会得到海报效果,但这不是您的错。

比那个简单多了,你可以使用jpegoptim来控制图片的大小,例如:jpegoptim --overwrite --size=1000k *.jp* - Antonio