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.
来自 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}
我已经在 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.
来自 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}