Ghostscript PDF批量压缩

Posted

技术标签:

【中文标题】Ghostscript PDF批量压缩【英文标题】:Ghostscript PDF batch compression 【发布时间】:2017-09-13 11:01:42 【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

我需要用新减小的文件大小覆盖现有的 PDF 文件,因为目标是节省空间并减少共享上的磁盘容量。 【参考方案1】:

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

编辑#1:

我根据 cmets 的要求更改了脚本以写入新的 pdf 文件或覆盖输入的 pdf 文件。要在这些选项之间进行选择,请将 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 大小:

这可以将文件减少到其大小的约 15%(在一种情况下为 2.3M 到 345K),而不会明显降低质量。

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

PDFSETTINGS 的其他选项:

/screen 选择类似于 Acrobat Distiller“屏幕优化”设置的低分辨率输出。 /ebook 选择类似于 Acrobat Distiller “eBook”设置的中等分辨率输出。 /printer 选择类似于 Acrobat Distiller“打印优化”设置的输出。 /prepress 选择类似于 Acrobat Distiller“Prepress Optimized”设置的输出。 /default 选择旨在用于各种用途的输出,可能以牺牲更大的输出文件为代价。

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


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

set DelayedExpansion for /f dir if pushd popd rem

【讨论】:

感谢这个脚本,但是如果我想保持相同的文件名而不是创建一个新的文件名怎么办?因为我正在尝试减少磁盘上的容量。 使用:set "filepre=" 而不是set "filepre=compr_"。但首先在一个文件上测试生成的 ghostscript 命令,以确保您的 pdf 文件不会被损坏。 @BabyPython:我为此付出了努力。如果您通过回答是否遇到更多错误或它现在是否正常工作来尊重这一点,那就太好了。进一步让我们删除我们以前制作的 cmets。一般来说,你会在聊天中讨论,但正如我所说,如果用户至少有 20 个声望点,那么它会起作用。 请注意,默认情况下 Ghostscript 会从 PDF 中删除超链接。要保留链接,请包含标志 -dPrinted=false @User09111993 这不是 Linux Shell 脚本,而是 Windows 批处理文件。【参考方案2】:

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

%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

【讨论】:

太棒了!这个答案应该是非常可观的。我试过 79.6MB 的 pdf 文件,大大减少到 7.1MB。 -dSimulateOverprint=true|false 不再受支持。请改用-dOverPrint=/simulate。顺便说一句,答案很好!【参考方案3】:

这里没有最新的 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"

/方向3控制旋转角度

【讨论】:

【参考方案4】:

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

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.2 -r200 -dPrinted=false -dNOPAUSE -dQUIET -dBATCH -sOutputFile=c12_filename filename 

【讨论】:

以上是关于Ghostscript PDF批量压缩的主要内容,如果未能解决你的问题,请参考以下文章

Ghost4J/Ghostscript - 尝试将字体嵌入 PDF 时出现错误 100

使用 Ghostscript 批量打印 PDF 时弹出窗口

合并 PDF 的 Ghostscript 压缩结果

使用 ghostscript 实现与 imagemagick 的转换相同的 PDF 压缩

ImageMagick PDF 委托失败,GhostScript 丢失

在 .bat 文件中使用 ghostscript 压缩 PDF - 缺少文本