减少在Linux上使用Ghostscript的PDF文件大小不工作(Reducing PDF fil

2019-06-26 20:06发布

我有一个是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

Answer 1:

如果您运行的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)
rgRG (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%)到现实主义的视角!



Answer 2:

DNA决定去灰度PNG格式。 他正在创建它们的方法是在两个步骤:

  1. 步骤1:将一个彩色PDF页面(如 )为灰度PDF页面,会使用Ghostscript的pdfwrite设备和设置
    -dColorConversionStrategy=/Gray
    -dProcessColorModel=/DeviceGray
  2. 步骤2:转换灰度PDF页面的PNG,使用的Ghostscript的pngalpha设备以300 dpi(分辨率-r300的GS命令行)。

这减少了1.4 MB他最初的文件大小0.7 MB。

但这个工作流程有以下缺点:

  • 它失去所有的颜色信息,但不保存多少磁盘空间相比,在相同的分辨率从PDF写的,直接的彩色输出!

有2个替代DNA的工作流程:

  1. (彩色)PDF的一步法转化- >(颜色)PNG,使用的Ghostscript的pngalpha装置与原来的PDF作为输入(300 dpi分辨率的相同的设置)。 这将有这样的优势:

    • 这样可以保证在PNG输出的色彩信息,只需要在磁盘上多一点空间!
  2. (彩色)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 ...



文章来源: Reducing PDF file size using Ghostscript on Linux didn't work