I am trying to scale a PDF which is for example just small of A4 size up to A4. This works fine with portrait documents. The document is scaled up correctly and then padding is added to the top. On landscape documents padding is not added though. Therefor the document will end up being the correct height for A4 but then not wide enough, as padding is not added on the document side (as I hoped). This is what I use to have it working for A4 portrait documents:
gs \ -sOutputFile=output.pdf \ -sDEVICE=pdfwrite \ -sPAPERSIZE=a4 \ -dCompatibilityLevel=1.4 \ -dNOPAUSE \ -dBATCH \ -dPDFFitPage \ input.pdf
89.4k 24 24 gold badges 264 264 silver badges 350 350 bronze badges
asked Sep 16, 2011 at 14:55
615 1 1 gold badge 8 8 silver badges 8 8 bronze badges
You should add the -dFIXEDMEDIA switch:
gs \ -o output.pdf \ -sDEVICE=pdfwrite \ -sPAPERSIZE=a4 \ -dFIXEDMEDIA \ -dPDFFitPage \ -dCompatibilityLevel=1.4 \ input.pdf
-dFIXEDMEDIA is always required if you need to force a specific paper/page/media size and ignore the paper/page/media size specified in the document. Because PDF always has a paper/page/media size defined (PostScript might have, or might not have. ).
(My -o . is shorter and saves one from adding -dBATCH -dNOPAUSE -- but works only for more recent versions of Ghostscript.)
answered Sep 21, 2011 at 22:31 Kurt Pfeifle Kurt Pfeifle 89.4k 24 24 gold badges 264 264 silver badges 350 350 bronze badgesThanks, for A5 and one-line: gs -sDEVICE=pdfwrite -sPAPERSIZE=a5 -dFIXEDMEDIA -dPDFFitPage -dCompatibilityLevel=1.4 -o out.pdf in.pdf
Commented Feb 26, 2014 at 21:51Thanks, it works! I used with A3: gs -o outputA3.pdf -sDEVICE=pdfwrite -sPAPERSIZE=a3 -dFIXEDMEDIA -dPDFFitPage -dCompatibilityLevel=1.4 input.pdf
Commented Jan 8, 2016 at 8:27 How to prevent the massive quality reduction that occurs with this command? Commented Dec 18, 2016 at 16:09Without having access to the PDF you used it with, this question cannot be answered. Usually there is no "massive quality reduction" with this command! It uses the default Ghostscript settings, which are (almost) equivalent to '-dPDFSettings=/printer' . For more details, look here and here and especially here.
Commented Dec 18, 2016 at 23:57 Ghostscript keeps rotating my pages for some reason. Commented Oct 26, 2021 at 13:46First, thanks for everyone that posted here.
I have this little script called pdfScale which absorbed parts of the answers posted here. So I decided to post back my 2 cents. I am using a bit of a mix of Kurt's and Tim's answers. More similar to Tim's though. I have played with this for a few days and here is my partial conclusion on the methods posted here:
Set Paper Size by Name with -sPAPERSIZE
Set paper size in PS-points -dDEVICEWIDTHPOINTS , -dDEVICEHEIGHTPOINTS
Because my bash script is already capable of getting source page sizes and I liked the idea to be able to set custom page sizes, I decided to focus on setting the page size in points. I had also already included the GS Paper Sizes in my script (with names and sizes). So getting that info was also easy.
Using -dFIXEDMEDIA seems to be a must on both cases, as pointed out before.
So this is how my approach went (in a scripted way)
When I was trying to fix the auto-rotation problem, I found this other Kurt response. This is about using -dAutoRotatePages . Just copying a part of his answer here:
My script defaults to PageByPage but that is adjustable. It worked well in my tests. Using -dAutoRotatePages also seems to reduce the need for pre-flipping the page size, even though it is not the same thing. I kept both options.
My little app was originally created to scale PDFs (without changing the page size). Then I added now the functionality to do one, the other or both. I still could not do it all in a single GS call though.
This is what I am calling for resizing, changing the variables to real values. This is for A4 Portrait size with PageByPage auto-rotation:
gs \ -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dSAFER \ -dCompatibilityLevel="1.5" -dPDFSETTINGS="/printer" \ -dColorConversionStrategy=/LeaveColorUnchanged \ -dSubsetFonts=true -dEmbedAllFonts=true \ -dDEVICEWIDTHPOINTS=595 -dDEVICEHEIGHTPOINTS=842 \ -dAutoRotatePages='/PageByPage' \ -dFIXEDMEDIA -dPDFFitPage \ -sOutputFile='../myOutputFile.pdf' \ -f '../input.pdf'
Please note that I am also using -dFIXEDMEDIA AND -dPDFFitPage . Because this fits-to-page, the other part of my script may be handy to scale the contents inside the PDF after resizing (specially if the proportion of the PDF changed a lot). And that is one of the reasons I always run the scaling after resizing in my script (in mixed mode).
About the fraction problems when using the Paper Name, I had that happening to me before I rounded the conversions from mm/inches to points. After I started rounding them, they seem to always be the one needed. Seems weird that GS would floor those values though.
So my conclusion is that the hard part is to find a solution that works across the board on different documents with different sizes and orientations. I am still not sure I am using the proper solution. But by letting the user change the Flip Detection and GS Auto-Rotation I hope to have a solution for at least most cases.
I have also rebuilt most of the code in the process and it is pretty easy to read now. May be useful to check it if you want to automate such a task yourself. Also useful to just scale/resize PDFs as well of course: