Skip to content

Instantly share code, notes, and snippets.

@guifromrio
Created August 30, 2013 14:39
Show Gist options
  • Save guifromrio/6390547 to your computer and use it in GitHub Desktop.
Save guifromrio/6390547 to your computer and use it in GitHub Desktop.
Compress PDF files with ghostscript

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

@Johnwulp
Copy link

Not always working. See command below:

-q -dNOPAUSE -dBATCH -dSAFER -dPDFA=2 -dPDFACompatibilityPolicy=1 -dSimulateOverprint=true -sDEVICE=pdfwrite -dCompatibilityLevel=1.3 -dPDFSETTINGS=/screen -dEmbedAllFonts=true -dSubsetFonts=true -dAutoRotatePages=/None -dColorImageDownsampleType=/Bicubic -dColorImageResolution=150 -dGrayImageDownsampleType=/Bicubic -dGrayImageResolution=150 -dMonoImageDownsampleType=/Bicubic -dMonoImageResolution=150

@AneudyM
Copy link

AneudyM commented Dec 10, 2017

Also, remember that dCompatibilityLevel will be overridden by what you choose in dPDFSETTINGS (i.e.: Level 1.3 or 1.4). If you want to choose a specific level it must be done by declaring dCompatibilityLevel AFTER the declaration of dPDFSETTINGS, otherwise, it is unnecessary.

@michaeljohnston0
Copy link

This is great. Any thoughts on compression affecting search functionality? After compressing everything looks great to the eye, but if I do Ctrl+F or similar search for text in Mac preview, the matches are very spotty. Other than that, worked like a charm.

@cschwaderer
Copy link

In my test case, this command destroyed digital signatures in a PDF.

@dusek
Copy link

dusek commented Mar 18, 2018

In my test case, this command destroyed digital signatures in a PDF.

@cschwaderer Any processing (modification) will always invalidate digital signatures, that is a principle of digital signatures. I.e. even if they were left in the document (and not removed by ghostscript), the signatures would no longer match with the changed document. That is correct, since the signer did not sign the changed (processed) document, only the original one.

@readyready15728
Copy link

I can confirm this was very useful for me. I also have a means of EPUB recompression detailed here:

https://github.com/readyready15728/misc/blob/master/epub-recompression.md

@krishjun
Copy link

thanks '/ebook ' works perfect , big difference in size and marginal difference in quality.

@caminoezequiel
Copy link

Thanks it worked very good for me. I am using to index files with ElasticSearch so I also added options to convert to grayscale with: -dColorConversionStrategy=/Gray -dProcessColorModel=/DeviceGray

The original file had 9 mb, next 4.3mb and finally with grayscale 3.0 mb

@csantosburguete
Copy link

I used current ghostscript version 9.25 (2018-09-13) to reduce the size of a PDF that contains hyperlinks to several URLs, as well as hyperlinks to several points inside the PDF. Ghostscript reduces the file size substantially, BUT destroys all the hyperlinks. Any ideas, any hints, please?

@gordon-to
Copy link

@csantosburguete you could try -dPDFSETTINGS=/ebook to preserve links, but this has a lower quality for images and text, you might want to tune compression with settings after that option

@Skynet-T1000
Copy link

For me some reason it didn't work . Simply Go to LibreOffice open the pdf file in Draw. select "Export to PDF" and reduce the DPI to 150 and quality to 50% or so you're done.
screen shot 2019-01-02 at 5 10 15 pm

@catleeball
Copy link

Note that by default Ghostscript removes hyperlinks from PDFs. To preserve links, include the flag -dPrinted=false.

@filipezabala
Copy link

find . -name '*.pdf' | while read pdf; do gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile="${pdf}_new.pdf" "$pdf"; done

@wwone
Copy link

wwone commented May 14, 2020

The use of LibreOffice had not occurred to me. MANY THANKS for pointing in that direction. I just reduced a 140MB monster to 6 MB. This was a newsletter with many illustrations. The final result is quite useable on the screen, and will be much easier for the online users to download. The original version (140MB), of course, was sent to the printer for the mailed newsletter.

Getting parameters correct for GhostScript is very frustrating. Glad to see that LibreOffice folks have connected with a good set of tools.

@alexynior28
Copy link

/ebook is my favorite. 71 MB to 4.9 MB!

@rahimnagori
Copy link

I'm using GS to compress PDF files. Sometimes it works smoothly but sometimes it behaves strangely. I don't know why. Can somebody help me with this?

I'm using the following command to convert a large pdf :

gs \ -q -dNOPAUSE -dBATCH -dSAFER \ -sDEVICE=pdfwrite \ -dCompatibilityLevel=1.3 \ -dPDFSETTINGS=/ebook \ -dEmbedAllFonts=true \ -dSubsetFonts=true \ -dAutoRotatePages=/None \ -dColorImageDownsampleType=/Bicubic \ -dColorImageResolution=72 \ -dGrayImageDownsampleType=/Bicubic \ -dGrayImageResolution=72 \ -dMonoImageDownsampleType=/Subsample \ -dMonoImageResolution=72 \ -sOutputFile=output.pdf \ input.pdf

My input file size is around 12 MB and before completion of the script, I gets a message of server timeout.

  • Does gs not work for large files?
  • Also sometimes output is larger than the input, how can I handle this problem?

@mixmixmix
Copy link

@rahimnagori I have a 17MB file and the command you produced takes 30 sec on a 5year old machine. The problem is that it compresses some images too much, and size drops only to 11MB. The other commands suggested here with ghostscript doesn't change the size at all :/

@ElectricRCAircraftGuy
Copy link

ElectricRCAircraftGuy commented Dec 27, 2020

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

Dead link. :(

Update: try this: https://www.ghostscript.com/doc/current/VectorDevices.htm#PSPDF_IN:

Controls and features specific to PostScript and PDF input

-dPDFSETTINGS=configuration

Presets the "distiller parameters" to one of four predefined settings:

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

The exact settings for each of these are shown in the dozens of options in this table: https://www.ghostscript.com/doc/current/VectorDevices.htm#distillerparams.

@palashkulsh
Copy link

palashkulsh commented Feb 25, 2021

I refer this thread quite frequently and sometimes when ps cann't do the satisfactory job then imagemagick helps

convert -density 200x200 -quality 60 -compress jpeg input.pdf output.pdf

@pateltejasmca
Copy link

My digital signature removed after executing this command. I need that signature in my pdf. What should i do ?
gswin64c.exe -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile="new.pdf" "old.pdf"

@palashkulsh
Copy link

from what i know you'll have to resign new file as file is changed in after running the command.

@Kurt-Mueller
Copy link

Works as expected on a Mac/mojave, gs 9.53.3_1 with pdfs with OCR.
View with preview it is ok, but when printed on an Epson WF-C5790 text ist white on a black background.
Is there an explanation for that and a solution?

@Kurt-Mueller
Copy link

Works as expected on a Mac/mojave, gs 9.53.3_1 with pdfs with OCR.
View with preview it is ok, but when printed on an Epson WF-C5790 text ist white on a black background.
Is there an explanation for that and a solution?

The problem only occurs if printed via Airprint. pdfwrite modifies the pdf in a way, the Airprint driver on the EPSON WF-5790 produces a black background. Printed via the standard macos driver the print is OK.

@ifthakharriyad
Copy link

ifthakharriyad commented Jun 20, 2021

@firstdoit How can I compress a pdf in a different directory using this command? /books/book.pdf instead of input.pdf Doesn't compress the book.pdf.
I am using ghostscript4js in my node app to compress pdf using the commands but the pdf needs to be at the same directory as the server.js file to be able to compress it. Since I want to keep my pdfs in a separate directory (i.e. /books) I wonder how can I do that?
And also can I output into a different directory?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment