在Linux上使用Ghostscript减小PDF文件大小';行不通
我有大约50-60个pdf文件(图像),每个文件的大小为1.5MB。现在我不想在我的论文中有这么大的pdf文件,因为这会使下载、阅读和打印成为一件麻烦事。因此,我尝试使用ghostscript执行以下操作:在Linux上使用Ghostscript减小PDF文件大小';行不通,pdf,size,resolution,ghostscript,image-resizing,Pdf,Size,Resolution,Ghostscript,Image Resizing,我有大约50-60个pdf文件(图像),每个文件的大小为1.5MB。现在我不想在我的论文中有这么大的pdf文件,因为这会使下载、阅读和打印成为一件麻烦事。因此,我尝试使用ghostscript执行以下操作: gs \ -dNOPAUSE -dBATCH \ -sDEVICE=pdfwrite \ -dCompatibilityLevel=1.4 \ -dPDFSETTINGS="/screen" \ -sOutputFile=output.pdf \ L_2lambd
gs \
-dNOPAUSE -dBATCH \
-sDEVICE=pdfwrite \
-dCompatibilityLevel=1.4 \
-dPDFSETTINGS="/screen" \
-sOutputFile=output.pdf \
L_2lambda_max_1wl_E0_1_zg.pdf
然而,现在我的1.4MB pdf是1.5MB大
我做错了什么?有什么方法可以检查pdf文件的分辨率吗?我只需要300dpi的图像,所以有人建议使用convert
来更改分辨率吗?或者我是否可以用gs
来更改图像分辨率(降低分辨率),因为我使用convert
时图像非常粗糙
如何使用转换:
convert \
-units PixelsPerInch \
~/Desktop/L_2lambda_max_1wl_E0_1_zg.pdf \
-density 600 \
~/Desktop/output.pdf
示例文件
如果运行Ghostscript
-dPDFSETTINGS=/screen
这只是一种快捷方式。事实上,您将(隐式地)获得一整套使用的设置,您可以使用以下命令查询这些设置:
gs \
-dNODISPLAY \
-c ".distillersettings {exch ==only ( ) print ===} forall quit" \
| grep '/screen'
在我的Ghostscript(v9.06prerelease)上,我得到了以下输出(稍微编辑以增加可读性):
(我使用了pngalpha
输出来获得透明背景。)out.png的图像尺寸是259x213px
,文件大小现在是70kbyte。但我肯定你不会喜欢它的质量:-)
输出质量“不好”,因为Ghostscript使用的默认分辨率为72 dpi
由于您说过希望使用300dpi,因此命令变为:
gs \
-o out300.png \
-sDEVICE=pngalpha \
-r300 \
L_2lambda_max_1wl_E0_1_zg.pdf
现在文件大小为750 KB,图像尺寸为1080x889
像素
更新2 因为好奇心现在很流行…:-)。。。我试图在Mac上的Adobe Acrobat X Pro的帮助下减小文件大小 你想知道结果吗
正在执行“另存为…”。。。(PDF文件大小减小)“——这对我来说在过去总是产生非常好的结果!”创建了一个1,8++MByte文件(+29%)。我想这肯定会让Ghostscript的性能(文件大小增加+3%)变得更加真实 DNA决定使用灰度PNG。他创建它们的方式分为两个步骤:
pdfwrite
设备和设置将彩色PDF页面(例如)转换为灰度PDF页面-dColorConversionStrategy=/Gray
和-dProcessColorModel=/DeviceGray
pngalpha
设备,以300 dpi的分辨率(GS命令行上的-r300
)将灰度PDF页面转换为PNG- 与直接从PDF以相同分辨率写入的颜色输出相比,它可以释放所有颜色信息,而不会节省大量磁盘空间李>
pngalpha
设备和原始PDF作为输入(相同设置为300 dpi分辨率)。这将具有以下优势:
- 它将保留PNG输出中的颜色信息,只需要磁盘上多一点空间李>
pnggray
设备,将原始PDF作为输入(相同的设置为300 dpi分辨率),具有以下优点/缺点:
- 它会丢失PNG输出中的颜色信息
- 这将使DNA工作流程中保留的透明背景松动
- 这将节省大量的磁盘空间,因为文件大小将降低到DNA工作流程输出的20%左右
gs \
-o out300.png \
-sDEVICE=pngalpha \
-r300 \
L_2lambda_max_1wl_E0_1_zg.pdf
#!/bin/bash
#
# Copywrite (c) 2012 <kurt.pfeifle@gmail.com>
# License: Creative Commons (CC BY-SA 3.0)
function echo_do() {
echo
echo "Command: ${*}"
echo "--------"
echo
"${@}"
}
[ -d out ] || mkdir out
echo
echo " We assume all PDF pages are 1-page PDFs!"
echo " (otherwise we'd have to include something like '%03d'"
echo " into the output filenames in order to get paged output)"
echo
echo '
# Convert Color PDF to Grayscale PDF.
# If PDF has transparent background (most do),
# this will remain transparent in output.)
# ATTENTION: since we don't use a resolution,
# pdfwrite will use its default value of '-r720'.
# (However, this setting will only affect raster objects...)
'
for i in *.pdf
do
echo_do gs \
-o "out/${i}---pdfwrite-devicegray-gs.pdf" \
-sDEVICE=pdfwrite \
-dColorConversionStrategy=/Gray \
-dProcessColorModel=/DeviceGray \
-dCompatibilityLevel=1.4 \
"${i}"
done
echo '
# Convert (previously generated) grayscale PDF to PNG using Alpha channel
# (Alpha channel can make backgrounds transparent)
'
for i in out/*pdfwrite-devicegray*.pdf
do
echo_do gs \
-o "out/$(basename "${i}")---pngalpha-from-pdfwrite-devicegray-gs.png" \
-sDEVICE=pngalpha \
-r300 \
"${i}"
done
echo '
# Convert (color) PDF to grayscale PNG using Alpha channel
# (Alpha channel can make backgrounds transparent)
'
for i in *.pdf
do
# Following only required for 'pdfwrite' output device, not for 'pngalpha'!
# -dProcessColorModel=/DeviceGray
echo_do gs \
-o "out/${i}---pngalphagray_gs.png" \
-sDEVICE=pngalpha \
-dColorConversionStrategy=/Gray \
-r300 \
"${i}"
done
echo '
# Convert (color) PDF to (color) PNG using Alpha channel
# (Alpha channel can make backgrounds transparent)
'
for i in *.pdf
do
echo_do gs \
-o "out/${i}---pngalphacolor_gs.png" \
-sDEVICE=pngalpha \
-r300 \
"${i}"
done
echo '
# Convert (color) PDF to grayscale PNG
# (no Alpha channel here, therefor [mostly] white backgrounds)
'
for i in *.pdf
do
echo_do gs \
-o "out/${i}---pnggray_gs.png" \
-sDEVICE=pnggray \
-r300 \
"${i}"
done
echo " All output to be found in ./out/ ..."
echo