我有一个是1.5MB大各约50-60 PDF文件(影像)。 现在我不希望在我的论文这样的较大的PDF文件,因为这将使得下载,阅读和打印在后面的痛苦。 所以,我尝试使用Ghostscript的做到以下几点:
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:
convert \
-units PixelsPerInch \
~/Desktop/L_2lambda_max_1wl_E0_1_zg.pdf \
-density 600 \
~/Desktop/output.pdf
示例文件
http://dl.dropbox.com/u/13223318/L_2lambda_max_1wl_E0_1_zg.pdf
如果您运行的Ghostscript -dPDFSETTINGS=/screen
,这只是一种捷径。 事实上,你会得到(隐含的)使用的设置一大堆,你可以用下面的命令查询:
gs \
-dNODISPLAY \
-c ".distillersettings {exch ==only ( ) print ===} forall quit" \
| grep '/screen'
在我的Ghostscript(v9.06prerelease)我得到以下输出(略编辑以增加可读性):
/screen
<< /DoThumbnails false
/MonoImageResolution 300
/ColorImageDownsampleType /Average
/PreserveEPSInfo false
/ColorConversionStrategy /sRGB
/GrayImageDownsampleType /Average
/EmbedAllFonts true
/CannotEmbedFontPolicy /Warning
/PreserveOPIComments false
/GrayImageResolution 72
/GrayACSImageDict <<
/ColorTransform 1
/QFactor 0.76
/Blend 1
/HSamples [2 1 1 2]
/VSamples [2 1 1 2]
>>
/ColorImageResolution 72
/PreserveOverprintSettings false
/CreateJobTicket false
/AutoRotatePages /PageByPage
/MonoImageDownsampleType /Average
/NeverEmbed [/Courier
/Courier-Bold
/Courier-Oblique
/Courier-BoldOblique
/Helvetica
/Helvetica-Bold
/Helvetica-Oblique
/Helvetica-BoldOblique
/Times-Roman
/Times-Bold
/Times-Italic
/Times-BoldItalic
/Symbol
/ZapfDingbats]
/ColorACSImageDict <<
/ColorTransform 1
/QFactor 0.76
/Blend 1
/HSamples [2 1 1 2]
/VSamples [2 1 1 2] >>
/CompatibilityLevel 1.3
/UCRandBGInfo /Remove
>>
我想知道,如果你的PDF文件进行图像重,如果这种转换确实未欢迎的事情(FE重采样与“错”参数图片),它增加了文件大小...
如果是这种情况(大量图像的PDF),告诉的话,我会更新这个答案有几个建议....
更新
我看了一下由DNA提供的样本文件。 有趣...
不,它不包含任何图像 。
相反,它包含一个大的流(使用压缩/FlateDecode
)由大致700.000+(!!)操作,多为单向量运算在PDF语言,如:
m
(通过MoveTo),
l
(了lineTo),
d
(setdash),
w
(setlinewidth),
S
(中风),
s
(closepath和中风),
W*
(eoclip)
rg
和RG
(setrgbcolor)
和几个。
(该PDF的代码是非常低效的书面AFAICS(但它的工作),因为它串连许多短冲程的,而不是做“长”的人,几乎每个行程再次定义了颜色(即使是像以前一样),并拥有所有其它开销(开始行程,行程结束,...)。
Ghostscript的的-dPDFSETTINGS=/screen
没有这里的任何影响(没有图像下采样,例如)。 增加的文件大小(48 k字节要准确)很可能是由于Ghostscript的重新组织某些内部划动的等等时,它解释该文件命令顺序不同。
因此,有没有什么可以做对PDF文件的大小 ...
- ...除非你转换这些PDF页面变成一个真正的图像如PNG:
gs \
-o out72.png \
-sDEVICE=pngalpha \
L_2lambda_max_1wl_E0_1_zg.pdf
(我用pngalpha
输出以获得透明背景。)的“out.png”的图像尺寸是259x213px
,文件大小是现在70 k字节。 但我敢肯定你会不喜欢的质量:-)
输出质量“不好”,因为Ghostscript的使用72 dpi的默认分辨率。
既然你说你想拥有300DPI,命令成为本:
gs \
-o out300.png \
-sDEVICE=pngalpha \
-r300 \
L_2lambda_max_1wl_E0_1_zg.pdf
文件大小是现在750个字节,图像尺寸是1080x889
像素。
更新2
由于好奇心是成为时尚,这些天... :-) ...我试图搞垮文件的大小与Mac上安装Adobe Acrobat X PRO的帮助。
你想知道结果吗?
执行“另存为...(PDF以减少文件大小)” -这对我过去总是取得了非常不错的效果! - 创建的1,8- ++ M字节文件(+ 29%)。 我想这肯定是把Ghostscript的性能(文件大小增加+ 3%)到现实主义的视角!
DNA决定去灰度PNG格式。 他正在创建它们的方法是在两个步骤:
- 步骤1:将一个彩色PDF页面(如本 )为灰度PDF页面,会使用Ghostscript的
pdfwrite
设备和设置
-dColorConversionStrategy=/Gray
和
-dProcessColorModel=/DeviceGray
。 - 步骤2:转换灰度PDF页面的PNG,使用的Ghostscript的
pngalpha
设备以300 dpi(分辨率-r300
的GS命令行)。
这减少了1.4 MB他最初的文件大小0.7 MB。
但这个工作流程有以下缺点:
- 它失去所有的颜色信息,但不保存多少磁盘空间相比,在相同的分辨率从PDF写的,直接的彩色输出!
有2个替代DNA的工作流程:
(彩色)PDF的一步法转化- >(颜色)PNG,使用的Ghostscript的pngalpha
装置与原来的PDF作为输入(300 dpi分辨率的相同的设置)。 这将有这样的优势:
- 这样可以保证在PNG输出的色彩信息,只需要在磁盘上多一点空间!
(彩色)PDF的一步法转化- >灰度PNG,使用的Ghostscript的pnggray
装置与原来的PDF作为输入(300 dpi分辨率的相同的设置),用这种混合物的优点/缺点:
- 它将失去在PNG输出的色彩信息。
- 这将失去这是在DNA的保存工作流程的透明背景。
- 这将节省大量的磁盘空间,因为文件大小会下降,从DNA的工作流程输出到的约20%。
所以,你可以让你的心,看到了输出尺寸和质量并排侧,这里是一个shell脚本来证明的区别:
#!/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
运行此脚本,并通过侧面的不同的输出侧进行比较。
是的,“直接灰度,PNG-从色-PDF-使用-pnggray设备”一个可能看起来有点差(它不炫耀的透明背景),其中一个比另一个-但它只能是也其文件大小的20%。 在另一方面,如果你婉牺牲一点磁盘空间来购买更多的质量-你可以使用-r400
代替-r300
...