2017-09-13 201 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