Buscar

Windows: Comprimir PDF masivamente

Muchas veces nos encontramos con un servidor de ficheros con cantidad de ficheros .pdf, algunos con resoluciones desproporcionadas.

A continuación, disponemos de un vídeo realizado por @polpadrisa donde se explica el funcionamiento de un bat que reduce la calidad de las imágenes de los pdf para que pesen menos.



Podéis examinar y suscribiros al canal de Youtube de SYSADMIT en el siguiente enlace:

https://www.youtube.com/c/SYSADMIT

y aquí tenéis el contenido del post con el detalle y enlaces:

En entornos empresariales se suele utilizar impresoras multifunción para escanear documentos.

Una recomendación es tener muy bien configuradas las impresoras para que escaneen con una resolución óptima, es decir, con una resolución proporcionada entre el fin del documento y el espacio que ocupará el fichero.

Aún disponiendo de todas las impresoras perfectamente configuradas, los fileservers acaban llenos de ficheros pdf de alta resolución.

Una solución para aquellos pdf que no contengan macros o formularios, es decir, aquellos pdf que han sido mayormente escaneados y de los que solo se mantienen en el servidor a título de copia es comprimirlos. 

El formato PDF ya de por si es un formato comprimido pero suele suceder que entre documentos no se ha aplicado el mismo nivel de compresión.

Con el script que veremos a continuación, podemos unificar masivamente el nivel de compresión de los pdf de una carpeta.

Script de compresión masiva de pdf:


El script utiliza dos herramientas: Ghostscript y PDFInfo.

Al final del documento, encontraremos el script y podremos hacer "copiar-pegar" del mismo.

Veamos cómo funciona:

Comprimir PDF masivamente: Herramienta: Ghostscript:


Tenemos que descargar el instalador:


Ghostscript: Postscript and PDF interpreter/renderer:  

https://www.ghostscript.com/download/

Windows: Comprimir PDF masivamente

Nos situamos en la sección: “Postscript and PDF interpreter/renderer” y lo bajamos des de cualquier mirror, teniendo en cuenta si queremos la versión de 32 o 64 bits.

Windows: Comprimir PDF masivamente

Una vez descargado ejecutamos el asistente de instalación:
 
Windows: Comprimir PDF masivamente

Abrimos:

%programfiles%\gs\gs9.21\bin
 
Siendo gs9.21 la versión de ghostscript instalada.

Seleccionamos los 3 ficheros:

Windows: Comprimir PDF masivamente

gsdll64.dll
Gsdll64.lib
Gswin64c.exe
 

Y los copiamos a la carpeta c:\SYSADMIT\CompressPDF\ghostscript

Desde cmd: 

mkdir c:\SYSADMIT\CompressPDF\ghostscript

xcopy %programfiles%\gs\gs9.21\bin\gsdll64.dll c:\SYSADMIT\CompressPDF\ghostscript

xcopy %programfiles%\gs\gs9.21\bin\gsdll64.lib c:\SYSADMIT\CompressPDF\ghostscript

xcopy %programfiles%\gs\gs9.21\bin\gswin64c.exe c:\SYSADMIT\CompressPDF\ghostscript 

Comprimir PDF masivamente: Herramienta: PDFInfo:

Windows: Comprimir PDF masivamente

Lo descargamos y descomprimimos. Una vez descomprimido navegamos hasta la carpeta bin64 (o bin32) y copiamos el fichero pdfinfo.exe en la carpeta: C:\SYSADMIT\CompressPDF\pdfinfo

Windows: Comprimir PDF masivamente

En cmd:

mkdir c:\SYSADMIT\CompressPDF\pdfinfo
 
xcopy pdfinfo.exe c:\SYSADMIT\CompressPDF\pdfinfo

Y ya tendremos todos los componentes para ejecutar el compresor.
 

Comprimir PDF masivamente: Personalización del script:

 

Windows: Comprimir PDF masivamente

Hay 4 variables que debemos personalizar: 

rutaDirPdfs="C:\SYSADMIT\pdf" En esta variable debemos escribir la ruta de la carpeta dónde están los PDF que queremos comprimir. Ojo: el bat va a buscar los ficheros pdf de esta carpeta de forma RECURSIVA. 

pdfSettings="/ebook" Esta variable establece el nivel de compresión: 

REM     /screen   (screen-view-only quality, 72 dpi images)
REM     /ebook    (low quality, 150 dpi images)
REM     /printer  (high quality, 300 dpi images)
REM     /prepress (high quality, color preserving, 300 dpi imgs)
REM     /default  (almost identical to /screen)

Según la ayuda de la aplicación de postscript: Normalmente la mejor opción será: "ebook" ya que está en el límite en el que las imágenes pixelan pero son legibles.

Si no queremos que las imágenes pixelen podemos optar por /printer

Cuanto menos DPI (dots per inch), menos pesará el pdf, es decir, quedará más comprimido pero se verá peor.

Debemos jugar con estos valores y ver cual se adapta mejor a nuestra situación. 

rutaPdfInfo= Aquí estableceremos la ruta del fichero: pdfinfo.exe descargado de la web de Xpdf. En principio, el bat, busca el ejecutable por defecto en: ruta_del_propio_bat\pdfinfo.exe. 

rutaGhostScript= Igual que la anterior pero con el fichero: gswin64c.exe

Notas y aclaraciones: 

Este script (bat) y toda la información incluida en él se proporciona "tal cual", sin garantía de ningún tipo, ya sea explícita o implícita.

Tened en cuenta que comprime de forma RECURSIVA el contenido del directorio y que SOBRESCRIBE los ficheros originales sin hacer ningún tipo de backup. 

Recomendamos encarecidamente copiar los archivos en una carpeta de sandbox, ejecutar el script y comprobar los resultados.

No ejecutéis nunca el script en entornos de producción sin hacer las pruebas previas y sin verificar si se dispone de una copia de seguridad al día.

No hemos probado el script con PDF con macros, formularios, programación, etc. La ejecución del script, podrían dejarlos corruptos o inservibles.


Comprimir PDF masivamente: SCRIPT



@echo off

REM Ruta directorio dónde hay los pdf a comprimir (es recursivo!):
set rutaDirPdfs="C:\SYSADMIT\pdf"


REM Nivel de compresión:
REM  /screen   (screen-view-only quality, 72 dpi images)
REM  /ebook    (low quality, 150 dpi images)
REM  /printer  (high quality, 300 dpi images)
REM  /prepress (high quality, color preserving, 300 dpi imgs)
REM  /default  (almost identical to /screen)
set pdfSettings="/ebook"


REM Otras variables
set rutaPdfInfo=%~dp0\pdfinfo\pdfinfo.exe
set rutaGhostScript=%~dp0\ghostscript\gswin64c.exe
set batFile=%~nx0
SET myPath=%~dp0
for /f "tokens=1-5 delims=/ " %%d in ("%date%") do set fecha=%%f-%%e-%%d
set logFile=%mypath%\%computername%-%batFile:~0,-4%-%fecha%.log


(
 echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 echo INICIO Log de %COMPUTERNAME% 
 Date /T
 Time /T
 echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 echo.
 echo.
)>> %logfile% 2>>&1
   

cd %rutaDirPdfs%

for /r  %%f in (*.pdf) do (
 
 set fichero=%%f
 
 call :TEST 
 
)

REM volvemos a casa
cd %myPath%

exit /b
 
 
:TEST
 echo %fichero%
 %rutaPdfInfo% %fichero% | find /i "Producer" | find /i "Ghostscript"
 
 if not errorlevel 1 (
   echo.
   echo fichero ya procesado con Ghostscript
   echo.   
 ) else (
  
  call :COMPRESS
 )

 exit /b

:COMPRESS
 
 
 copy "%fichero%" temp.pdf
 
 for %%A in ("%fichero%") do set PesoInicial=%%~zA bytes
  
 %rutaGhostScript% -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=%pdfSettings%  -dNOPAUSE -dBATCH -sOutputFile="%fichero%" temp.pdf 
 
 del temp.pdf /q
 
 for %%A in (%fichero%) do set PesoFinal=%%~zA bytes
 
 echo %fichero% %PesoInicial% -^> %PesoFinal% >> %logfile% 2>>&1
 echo %fichero% %PesoInicial% -^> %PesoFinal%
 echo.
 echo.

 exit /b
 

(
 echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 echo FIN Log de %COMPUTERNAME% 
 Date /T
 Time /T
 echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 echo.
 echo EOF
 )>> %logfile%

REM --FIN--


2 comentarios:

  1. Hola buenas tardes quise utilizar este método en la máquina d mi trabajo pero tiene muchas restricciones y no me deja colocar los programas externos ay forma de usar este script sin esos programas

    ResponderEliminar
    Respuestas
    1. Hola,

      El script requiere los programas externos para poder hacer la compresión.

      Un saludo,

      Xavi.

      Eliminar