2017-09-13 203 views
2

我在Windows上安装了Ghostscript,因为我正在做的是压缩/减小网络共享上12,000多个PDF文件的大小。这对于任何GUI软件来说都是不可能的,因为它在一段时间之后会由于资源耗尽而爆炸,所以我认为命令行是这里的一种方式。Ghostscript PDF批量压缩

我已阅读Ghostscript文档和压缩PDF文件的不同示例,但我似乎无法找到任何以大批量操作的任何内容。

基本上,我需要针对多个文件夹递归压缩将在网络共享上的文件。

Ghostscript可以这样做吗?如果是这样,请提供一些命令示例来帮助我实现这一目标。

谢谢!

+0

我需要覆盖有新的,减小文件大小现有的PDF文件,因为目标是节省空间,减少共享上的磁盘容量。 – BabyPython

回答

1

通过以下脚本,您可以定义数组变量filesDir中所需的所有目录。
它将遍历所有这些目录并搜索包括子目录在内的所有目录中的所有pdf文件。
对于所有找到的pdf文件,它将使用this ghostscript command (GitHub)并输出带有名称的文件,例如, fileabc.pdf使用新名称:compr_fileabc.pdf

编辑#1:

我改剧本由意见或者写入新的PDF文件或覆盖输入PDF文件的要求。要在这些选项之间进行选择,请将createNewPDFs变量更改为1(新文件)或0(覆盖)。
由于ghostscript无法写入输入文件,输出文件将写入用户临时路径(%TEMP%)并移至原始输入文件以覆盖此文件。如果新文件的大小较小,它只会覆盖输入的pdf文件。
此外,ghostscript命令由具有相同名称的变量替代,因为在Windows下它可以是gswin64c(64位)或gswin32c(32位)。

如果outcomming尺寸不够小,请使用这些ghostscript命令开关:-dPDFSETTINGS=/printer,下面将对此进行说明。

批处理脚本:

@echo off 
setlocal EnableDelayedExpansion 

rem ghostscript executable name 
set "ghostscript=gswin64c" 

rem directories to scan for files 
set "filesDir[0]=FOLDER1" 
set "filesDir[1]=FOLDER2" 
set "filesDir[2]=FOLDER3" 

rem extension of files to be scanned 
set "ext=pdf" 

rem new file be creation or input file overwrite 
set "createNewPDFs=0" 
rem file prefix for new files (if they should be created) 
set "filepre=compr_" 

rem loop over all directories defined in filesDir array 
for /f "tokens=2 delims==" %%d in ('set filesDir[') do (
    if exist "%%~d" (
     pushd "%%~d" 
     rem loop over all files in all (sub)directories with given extension 
     for /f "delims=*" %%f in ('dir "*.%ext%" /b /s /a:-d') do (
     if [%createNewPDFs%] EQU [1] (
      %ghostscript% -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile="%%~dpf%filepre%%%~nxf" "%%~f" 
     ) else (
      %ghostscript% -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile="%TEMP%\%%~nxf" "%%~f" 
      for %%t in ("%TEMP%\%%~nxf") do (set "newSize=%%~zt") 
      for %%t in ("%%~f") do (set "oldSize=%%~zt") 
      if [!newSize!] LSS [!oldSize!] (
       rem new file is smaller --> overwrite 
       move /y "%TEMP%\%%~nxf" "%%~f" 
      ) else (
       rem new file is greater --> delete it of the temp dir 
       del "%TEMP%\%%~nxf" 
      ) 
     ) 
    ) 
     popd 
    ) 
) 

Found GitHub ghostscript command减少PDF文件大小:

这可以减少文件到〜大小的15%(2.3M至345K,在一个案例中)没有明显的质量下降。

ghostscript -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf 

为PDFSETTINGS其他选择:

  • /屏幕选择类似于设置Acrobat的蒸馏器 “优化屏幕” 低分辨率输出。
  • /电子书选择类似于Acrobat Distiller“eBook”设置的中等分辨率输出。
  • /打印机选择类似于Acrobat Distiller“打印优化”设置的输出。
  • /印前选择类似于Acrobat Distiller“Prepress Optimized”设置的输出。
  • /default选择用于各种用途的输出,可能会牺牲较大的输出文件。

来源:http://ghostscript.com/doc/current/Ps2pdf.htm


ss64.com命令参考链接:

+0

感谢这个脚本,但如果我想保留相同的文件名而不是创建一个新的文件呢?正在尝试减少磁盘容量。 – BabyPython

+0

使用:'set“filepre =”'而不是'set“filepre = compr_”'。但首先在一个文件上测试生成的ghostscript命令,注意你的pdf不会被破坏。 –

+0

首先,Ghostscript不压缩PDF文件。它使外观应该是相同的新的。许多PDF文件浪费了空间,可以通过编写全新文件来恢复,并且使用图像缩减采样可以使文件更小,但这些都不是由于压缩PDF所致。这是可能的(有时会发生)生成的文件是**更大**。您无法写入相同的文件名,因为Ghostscript需要在写入新文件的同时从原始文件读取。 – KenS