13

我有大约 50-60 个 1.5MB 大的 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 \
     -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

4

2 回答 2

16

如果您运行 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 是否包含大量图像,并且这种转换是否会造成不受欢迎的事情(使用“错误”参数重新采样图像)会增加文件大小......

如果是这种情况(图像繁重的 PDF),请告诉我,我会用一些建议来更新这个答案......


更新

我查看了 DNA 提供的示例文件。有趣的...

不,它不包含任何图像

相反,它包含一个大流(使用 压缩/FlateDecode),其中包含大约 700.000+ (!!) 个操作,主要是 PDF 语言中的单个向量操作,例如:
m(moveto)、
l(lineto)、
d(setdash)、
w(setlinewidth)、
S(stroke)、
s(closepath and stroke)、
W*(eoclip)
rgRG(setrgbcolor)
等等。

(该 PDF 代码的 AFAICS 编写效率非常低(但可以完成它的工作),因为它确实连接了许多短笔划而不是“长”笔划,并且几乎每个笔划都再次定义了颜色(即使它与以前相同),并具有所有其他开销(开始行程,结束行程,...)。

Ghostscript在这里-dPDFSETTINGS=/screen没有任何效果(例如,没有要下采样的图像)。增加的文件大小(准确地说是 +48 kByte)可能是由于 Ghostscript 在解释文件时将一些内部描边等命令重新组织为不同的顺序。

因此,对于 PDF 文件大小,您无能为力...

  • ...除非您将这些 PDF 页面中的每一个都转换为真实的图像,例如 PNG:
    GS\
      -o out72.png \
      -sDEVICE=pngalpha\
       L_2lambda_max_1wl_E0_1_zg.pdf

(我使用pngalpha输出来获得透明背景。)'out.png'的图像尺寸是259x213px,文件大小现在是 70 kByte。但我敢肯定你不会喜欢它的质量:-)

输出质量“差”,因为 Ghostscript 使用 72 dpi 的默认分辨率。

既然你说你想要 300dpi,命令变成这样:

gs \
  -o out300.png \
  -sDEVICE=pngalpha \
  -r300 \
   L_2lambda_max_1wl_E0_1_zg.pdf

现在的文件大小是 750 kByte,图像尺寸是1080x889像素。


更新 2

由于好奇现在很流行... :-) ...我试图在 Mac 上的 Adob​​e Acrobat X Pro 的帮助下减小文件大小。

你想知道结果吗?

执行“另存为...(减小文件大小的 PDF)” ——过去对我来说总是产生非常好的结果!-- 创建了一个 1,8++ MByte 文件 (+29%)。我想这绝对将 Ghostscript 的性能(文件大小增加 +3%)置于现实的角度!

于 2012-08-07T17:56:05.203 回答
3

DNA 决定使用灰度 PNG。他创建它们的方式分为两个步骤:

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

这将他的初始文件大小从 1.4 MB 减少到 0.7 MB。

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

  • 与直接从 PDF 中以相同分辨率编写的颜色输出相比,它会丢失所有颜色信息,而不会节省太多磁盘空间!

DNA 的工作流程有 2 种替代方案:

  1. (彩色)PDF ->(彩色)PNG 的一步转换,使用 Ghostscript 的pngalpha设备和原始 PDF 作为输入(相同的 300 dpi 分辨率设置)。这将具有以下优势:

    • 它会将颜色信息保留在 PNG 输出中,只需要更多的磁盘空间!
  2. (彩色)PDF -> 灰度 PNG 的一步转换,使用 Ghostscript 的pnggray设备和原始 PDF 作为输入(300 dpi 分辨率的相同设置),具有以下优点/缺点:

    • 它会丢失 PNG 输出中的颜色信息。
    • 它会丢失 DNA 工作流程中保留的透明背景。
    • 它将节省大量磁盘空间,因为文件大小将下降到 DNA 工作流程输出的 20% 左右。

因此,您可以下定决心并并排查看输出大小和质量,这里有一个 shell 脚本来演示差异:

#!/bin/bash
#
# 文案 (c) 2012 <kurt.pfeifle@gmail.com>
# 许可:知识共享(CC BY-SA 3.0)

功能回声做(){
        回声
        回声“命令:${*}”
        回声“--------”
        回声
        “${@}”
}

[ -d 出] || mkdir 输出

回声
echo "我们假设所有 PDF 页面都是一页 PDF!"
echo "(否则我们必须包含类似 '%03d' 的内容"
echo " 进入输出文件名以获得分页输出)"
回声

回声'
 # 将彩色 PDF 转换为灰度 PDF。
 # 如果 PDF 有透明背景(大多数都有),
 # 这将在输出中保持透明。)
 # 注意:因为我们不使用分辨率,
 # pdfwrite 将使用其默认值“-r720”。
 # (然而,这个设置只会影响光栅对象...)
'
对于我在 *.pdf 中
做
echo_do gs \
 -o "out/${i}---pdfwrite-devicegray-gs.pdf" \
 -sDEVICE=pdf写入\
 -dColorConversionStrategy=/灰色\
 -dProcessColorModel=/DeviceGray \
 -dCompatibilityLevel=1.4 \
  “${i}”
完毕

回声'
 # 使用 Alpha 通道将(之前生成的)灰度 PDF 转换为 PNG
 #(Alpha通道可以使背景透明)
'
for i in out/*pdfwrite-devicegray*.pdf
做
echo_do gs \
 -o "out/$(basename "${i}")---pngalpha-from-pdfwrite-devicegray-gs.png" \
 -sDEVICE=pngalpha\
 -r300 \
  “${i}”
完毕

回声'
 # 使用 Alpha 通道将(彩色)PDF 转换为灰度 PNG
 #(Alpha通道可以使背景透明)
'
对于我在 *.pdf 中
做
# 以下仅对 'pdfwrite' 输出设备需要,'pngalpha' 不需要!
# -dProcessColorModel=/DeviceGray
echo_do gs \
 -o "out/${i}---pngalphagray_gs.png" \
 -sDEVICE=pngalpha\
 -dColorConversionStrategy=/灰色\
 -r300 \
  “${i}”
完毕

回声'
 # 使用 Alpha 通道将(颜色)PDF 转换为(颜色)PNG
 #(Alpha通道可以使背景透明)
'
对于我在 *.pdf 中
做
echo_do gs \
 -o "out/${i}---pngalphacolor_gs.png" \
 -sDEVICE=pngalpha\
 -r300 \
  “${i}”
完毕

回声'
 # 将(彩色)PDF 转换为灰度 PNG
 #(这里没有Alpha通道,因此[大部分]白色背景)
'
对于我在 *.pdf 中
做
echo_do gs \
 -o "out/${i}---pnggray_gs.png" \
 -sDEVICE=png灰色\
 -r300 \
  “${i}”
完毕

echo "所有输出都在 ./out/ ..."
回声

运行此脚本并并排比较不同的输出。

是的,'direct-grayscale-PNG-from-color-PDF-using-pnggray-device' 可能看起来另一个更糟糕(并且它不具有透明背景) - 但它也只是文件大小的 20%。另一方面,如果你想通过牺牲一点磁盘空间来购买更多质量 - 你可以使用-r400而不是-r300......

于 2012-08-08T20:04:05.347 回答