我需要传递哪些参数?我使用的Ghostscript版本是8.71。
https://gitlab.mister-muffin.de/josch/img2pdf
如PleaseStand所述,GhostScript(版本9.23之前)将解码JPEG数据,导致世代损失,并且性能比img2pdf差“10到100”倍。
编辑:Ghostscript 9.23(2018-03-21)增加了“JPEG穿透”功能,解决了世代损失/性能问题。
ImageMagick(即convert
)也会解码和重新编码图像。
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
的位置。
locate
命令查找 viewjpeg.ps
文件的位置。 - Vineet Menon我已经使用了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
返回空值,所以我无法使用它。 - runidentify
命令?identify -version
会告诉你什么?你也可以手动使用identify some.jpeg
,它会返回一行指示JPEG图像的像素宽度和高度(WxH),然后你可以将这些信息手动插入到命令行中。 - Kurt Pfeifledimension=$(identify -format "%w %h" "${x}")
实现了它,但除了使用width和height
之外,是否还有其他方法将图像设置在页面顶部而不是底部?如果能提供好的文档链接,我会非常高兴。 - runidentify -version
的输出结果。 - Kurt Pfeiflefor 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在一些Linux发行版中,convert pic1.jpg pic2.jpg out.pdf
可以达到转换的效果,但是结果可能会有所不同。
我有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"
viewjpeg.ps
,它似乎只是进行简单的字节复制。它明确指出,“使用IJG JPEG v6或更高版本的Ghostscript将解码渐进式JPEG,但仅在您启用该功能时才能解码”。 - Hermann