使用Ghostscript将JPEG转换为PDF

34

我需要传递哪些参数?我使用的Ghostscript版本是8.71。


1
@RobertFleming,这在2020年似乎不是真的。我刚刚阅读了viewjpeg.ps,它似乎只是进行简单的字节复制。它明确指出,“使用IJG JPEG v6或更高版本的Ghostscript将解码渐进式JPEG,但仅在您启用该功能时才能解码”。 - Hermann
6个回答

39

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

如PleaseStand所述,GhostScript(版本9.23之前)将解码JPEG数据,导致世代损失,并且性能比img2pdf差“10到100”倍。

编辑:Ghostscript 9.23(2018-03-21)增加了“JPEG穿透”功能,解决了世代损失/性能问题。

ImageMagick(即convert)也会解码和重新编码图像。


1
谢谢。使用其他任何方法处理大量图片都会非常耗时。 - emacsomancer
1
GhostScript 9.50 看起来不再受到这种“世代损失”的影响了。 - malat

23
gs \
 -dNOSAFER \
 -sDEVICE=pdfwrite \
 -o foo.pdf \
  /usr/local/share/ghostscript/8.71/lib/viewjpeg.ps \
 -c \(my.jpg\) viewJPEG

读取 my.jpg 并生成 foo.pdf。您需要找到安装的PostScript程序 viewjpeg.ps 的位置。


3
使用 locate 命令查找 viewjpeg.ps 文件的位置。 - Vineet Menon
https://superuser.com/questions/1530841/failing-to-convert-jpg-to-pdf-with-ghostscript - malat

18

我已经使用了Henry在他的答案中给出的相同的基本命令行很长一段时间,用于一个简单的Bash脚本,并进行了一些调整。

我的完整脚本使用这个修改后的命令将多个JPEG图像转换为多页PDF:

gs \
 -sDEVICE=pdfwrite \
 -o foo.pdf \
  /usr/local/share/ghostscript/9.02/lib/viewjpeg.ps \
 -c "(1st.jpg)  viewJPEG showpage \
     (2nd.jpg)  viewJPEG showpage \
     (3rd.jpg)  viewJPEG showpage \
     (last.jpg) viewJPEG showpage"

它被称为这样:

jpegs2pdf.sh output.pdf file1.jpeg [file2.jpeg [file2.jpeg [...]]]

问题在于该命令将使用与Ghostscript相同的默认页面尺寸(通常为纵向的信纸或A4),每个JPEG图像都将被缩放以适应此页面宽度和/或页面高度,并放置在左下角。

我的脚本使每个PDF页面使用与原始JPEG页面相同的页面尺寸。为了自动发现JPEG的尺寸,我使用ImageMagick的identify命令:

 identify -format "%[fx:(w)] %[fx:(h)]" some.jpeg

以下是完整脚本的代码:

#!/bin/bash
#
#############################################################################
#  
#  Shellscript to convert a set of JPEG files to a multipage PDF.
#
#  Requirements: (1) Ghostscript needs to be installed on the local system.
#                (2) ImageMagick needs to be installed on the local system.
#
#  Usage:  jpegs2pdf.sh output.pdf file1.jpeg [file2.jpeg [file2.jpeg [...]]]
#
#  Copyright (c) 2007, <pipitas@gmail.com>
#                Use, distribute and modify without any restrictions.
#
#  Versions:
#          v1.0.0, Jul 12 2007:  initial version
#          v1.0.1, Jan 07 2011:  set viewJPEG.ps path (self-compiled GS 9.02)
#
#############################################################################
    
outfile=$1
shift

param=""
for i in "$@" ; do
   dimension=$(identify -format "%[fx:(w)] %[fx:(h)]" "${i}")
   param="${param} <</PageSize [${dimension}]>> setpagedevice (${i}) viewJPEG showpage"
done

gs \
  -dNOSAFER \
  -sDEVICE=pdfwrite \
  -dPDFSETTINGS=/prepress \
  -o "$outfile" \
   /usr/local/share/ghostscript/9.02/lib/viewjpeg.ps \
  -c "${param}"

嗨,我使用了您的脚本但没有使用 identify -format 命令生成了 PDF 文件,但是 .jpg 图像位于页面底部,我该如何将它们移到页面顶部?而且 identify -format "%[fx:(w)] %[fx:(h)]" some.jpeg 返回空值,所以我无法使用它。 - run
@run:你用什么操作系统来运行identify命令?identify -version会告诉你什么?你也可以手动使用identify some.jpeg,它会返回一行指示JPEG图像的像素宽度和高度(WxH),然后你可以将这些信息手动插入到命令行中。 - Kurt Pfeifle
Unix。我通过dimension=$(identify -format "%w %h" "${x}")实现了它,但除了使用width和height之外,是否还有其他方法将图像设置在页面顶部而不是底部?如果能提供好的文档链接,我会非常高兴。 - run
@run:你还没有告诉我 identify -version 的输出结果。 - Kurt Pfeifle
9年后非常有用。与Bash一行代码相同:for i in *.jpg ; do echo "<</PageSize [$(identify -format "%[fx:(w)] %[fx:(h)]" "${i}")]>> setpagedevice ($i) viewJPEG showpage" ; done | gs -sDEVICE=pdfwrite -o foo.pdf viewjpeg.ps -c -. - Hermann
显示剩余5条评论

6

在一些Linux发行版中,convert pic1.jpg pic2.jpg out.pdf可以达到转换的效果,但是结果可能会有所不同。


处理得很好。警告:非常占用内存,合并80个JPEG文件在这里花费了30分钟进行交换。 - liori
1
这是因为ImageMagick完全解码和重新编码JPEG数据。这不仅速度慢且占用内存,而且还会导致世代损失。请参见本页面其他地方的img2pdf。 - Robert Fleming
尝试使用GraphicsMagick。它是ImageMagick的一个分支,通常运行速度更快。它缺少一些IM的功能,但大多数兼容。 - E Brown

5

我有Ghostscript版本9.10,所以以下命令对我没有用

/usr/local/share/ghostscript/9.02/lib/viewjpeg.ps

所以我修改了命令并编辑了这一行,改用了这个,对我有用

viewjpeg.ps

因此,新修改的命令如下:

gs \
     -sDEVICE=pdfwrite \
     -o foo.pdf \
      viewjpeg.ps \
     -c "(1st.jpg)  viewJPEG showpage \
         (2nd.jpg)  viewJPEG showpage \
         (3rd.jpg)  viewJPEG showpage \
         (last.jpg) viewJPEG showpage"

2
GhostScript是一个PostScript解释器,因此它不直接支持JPEG输入,只支持JPEG输出。尽管如此,它支持JPEG解压缩(除了渐进式JPEG)。
有一个名为jpeg2eps的PostScript程序和相应的shell脚本可以利用这一点。要得到PDF文件,大多数系统都有可供使用的pstopdf脚本,它会将每个输入文件(您将使用jpeg2eps脚本的输出)通过GhostScript运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接