Ghostscript PDF批量压缩

Ghostscript PDF batch compression

我已经在 Windows 上安装了 Ghostscript,因为我想要做的是 compress/reduce 网络共享上 12,000 多个 PDF 文件的大小。这对于任何 GUI 软件都是不可能的,因为它会在一段时间后由于 运行 资源不足而崩溃,所以我认为命令行是解决问题的方法。

我已经阅读了 Ghostscript 文档和压缩 PDF 文件的不同示例,但我似乎找不到任何可以作为大批量操作的东西。

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

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

谢谢!

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

编辑#1:

我根据评论的要求更改了脚本,以编写新的 pdf 文件或覆盖输入的 pdf 文件。要在这些选项之间 select 将 createNewPDFs 变量更改为 1(新文件)或 0(覆盖)。
因为 ghostscript 无法写入输入文件,输出文件将写入用户临时路径 (%TEMP%) 并移动到原始输入文件以覆盖该文件。如果新文件较小,它只会覆盖输入的 pdf 文件。
此外,ghostscript 命令被同名变量替换,因为在 Windows 下,它可以是 gswin64c(64 位)或 gswin32c(32 位)。

如果输出尺寸不够小,请使用这些 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 大小:

This can reduce files to ~15% of their size (2.3M to 345K, in one case) with no obvious degradation of quality.

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

Other options for PDFSETTINGS:

  • /screen selects low-resolution output similar to the Acrobat Distiller "Screen Optimized" setting.
  • /ebook selects medium-resolution output similar to the Acrobat Distiller "eBook" setting.
  • /printer selects output similar to the Acrobat Distiller "Print Optimized" setting.
  • /prepress selects output similar to Acrobat Distiller "Prepress Optimized" setting.
  • /default selects output intended to be useful across a wide variety of uses, possibly at the expense of a larger output file.

Source: http://ghostscript.com/doc/current/Ps2pdf.htm


来自 ss64.com 的命令参考链接:

我不知道是否有人需要它,但这是我在不降低质量的情况下高度压缩 PDF 文件的命令。我通过多次试验和错误的方法找到了它,它大大减少了 PDF 文件的大小。 P.S。很抱歉没有在上面的帖子中发帖,但我作为一个新人没有足够的声誉。

%ghostscript% -q -dNOPAUSE -dBATCH -dSAFER -dSimulateOverprint=true -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -dEmbedAllFonts=true -dSubsetFonts=true -dAutoRotatePages=/None -dColorImageDownsampleType=/Bicubic -dColorImageResolution=150 -dGrayImageDownsampleType=/Bicubic -dGrayImageResolution=150 -dMonoImageDownsampleType=/Bicubic -dMonoImageResolution=150 -sOutputFile=output.pdf input.pdf

这里没有任何东西适用于最新的 gs,所以我最终得到了

gswin64c.exe -dPDFSETTINGS#/ebook -dPDFX -dBATCH -dNOPAUSE -sColorConversionStrategy=CMYK -sDEVICE=pdfwrite -sOutputFile="output.pdf" "input.pdf"

并使用自动调整大小的 jpg 格式和顺时针旋转 90 度

gswin64c -dORIENT1=false -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=C:\Users\username\Desktop\somepdffile.pdf -c "<</Orientation 3>> setpagedevice" -f "C:\Program Files\gs\gs9.19\lib\viewjpeg.ps" -c "(C:\Users\username\Desktop\somejpgfile.JPG) << /PageSize 2 index viewJPEGgetsize 2 array astore  >> setpagedevice viewJPEG"

/Orientation 3控制旋转角度

我遇到了同样的问题,这对我有帮助。将 15 MB pdf 转换为 400kb

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.2 -r200 -dPrinted=false -dNOPAUSE -dQUIET -dBATCH -sOutputFile=c12_{filename} {filename}