在Linux上使用Ghostscript减小PDF文件大小';行不通

在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

我有大约50-60个pdf文件(图像),每个文件的大小为1.5MB。现在我不想在我的论文中有这么大的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
示例文件

如果运行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。他创建它们的方式分为两个步骤:

  • 步骤1:使用Ghostscript的
    pdfwrite
    设备和设置将彩色PDF页面(例如)转换为灰度PDF页面
    -dColorConversionStrategy=/Gray

    -dProcessColorModel=/DeviceGray
  • 步骤2:使用Ghostscript的
    pngalpha
    设备,以300 dpi的分辨率(GS命令行上的
    -r300
    )将灰度PDF页面转换为PNG
  • 这将他的初始文件大小从1.4MB减少到0.7MB

    但此工作流有以下缺点:

    • 与直接从PDF以相同分辨率写入的颜色输出相比,它可以释放所有颜色信息,而不会节省大量磁盘空间
    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 #!/bin/bash # #文案(c)2012 #许可证:知识共享(CC BY-SA 3.0) 函数echo_do(){ 回声 echo“命令:${*}” 回声“----------” 回声 "${@}" } [d out]| | mkdir out 回音 echo“我们假设所有PDF页面都是1页PDF!” echo“(否则我们必须包含类似“%03d”的内容” echo“输入输出文件名以获得分页输出)” 回声 回声' #将彩色PDF转换为灰度PDF。 #如果PDF有透明的背景(大多数是透明的), #这将在输出中保持透明。) #注意:因为我们不使用决议, #pdfwrite将使用其默认值'-r720'。 #(但是,此设置仅影响光栅对象…) ' 对于*.pdf中的i 做 回音\ -o“out/${i}--pdfwrite devicegray gs.pdf”\ -sDEVICE=pdfwrite\ -D颜色转换策略=/灰色\ -数据处理颜色模型=/DeviceGray\ -dCompatibilityLevel=1.4\ “${i}” 完成 回声' #使用Alpha通道将(以前生成的)灰度PDF转换为PNG #(Alpha通道可以使背景透明) ' 对于i输入输出/*pdfwrite devicegray*.pdf 做 回音\ -o“out/$(basename“${i}”)--pdfwrite devicegray gs.png中的pngalpha”\ -sDEVICE=pngalpha\ -300南非兰特\ “${i}” 完成 回声' #使用Alpha通道将(彩色)PDF转换为灰度PNG #(Alpha通道可以使背景透明) ' 对于*.pdf中的i 做 #以下仅适用于“pdfwrite”输出设备,不适用于“pngalpha”! #-dProcessColorModel=/DeviceGray 回音\ -o“out/${i}--pngalphagray_gs.png”\ -sDEVICE=pngalpha\ -D颜色转换策略=/灰色\ -300南非兰特\ “${i}” 完成 回声' #使用Alpha通道将(彩色)PDF转换为(彩色)PNG #(Alpha通道可以使背景透明) ' 对于*.pdf中的i 做 回音\ -o“out/${i}--pngalphacolor_gs.png”\ -sDEVICE=pngalpha\ -300南非兰特\ “${i}” 完成 回声' #将(彩色)PDF转换为灰度PNG #(此处没有Alpha通道,因此[大部分]为白色背景) ' 对于*.pdf中的i 做 回音\ -o“out/${i}--pnggray_gs.png”\ -斯德维克
    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