EricB
EricB

Reputation: 478

How to add page numbers opposite the bound edge with Postscript / Ghostscript

I have a 2,000+ page PDF that I need to add page numbers to. The PDF is already setup for binding. Meaning there is extra margin on right and lefthand pages to accommodate the binding.

I found the following solution from Brian M. Hunt, but it always places the page number in the same position. I know I can modify the, "sub 20 sub 20" value to change the position, but how do I make the position conditional so that righthand pages have the number near the right edge and lefthand pages have the number near the left edge?

gs \
  -dBATCH -dNOPAUSE \
  -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress \
  -sOutputFile=/path/to/merged.pdf \
  -c 'globaldict /MyPageCount 1 put << /EndPage {exch pop 0 eq dup {/Helvetica 12 selectfont MyPageCount =string cvs dup stringwidth pop currentpagedevice /PageSize get 0 get exch sub 20 sub 20 moveto show globaldict /MyPageCount MyPageCount 1 add put } if } bind >> setpagedevice'
  -f input1.pdf -f input2.pdf

Upvotes: 1

Views: 348

Answers (2)

KenS
KenS

Reputation: 31159

You already have MyPageCount, so you know the page number. Using that you can determine if the page count is odd or even. Then you just select different positional logic.

Something like :

MyPageCount 2 mod 1 eq
{
%%insert odd numbered page positioning
}{
%%insert even numbered page positioning
} ifelse

[add simplified program]

gs -q -sDEVICE=pdfwrite -dBATCH -dNOPAUSE -dPDFX -sOutputFile=step_4.pdf \
  -c 'globaldict /MyPageCount 1 put
        <<
            /EndPage {
                exch pop 0 eq dup {
                    /Helvetica 12 selectfont MyPageCount 256 string cvs dup stringwidth pop currentpagedevice
                    /PageSize get 0 get exch sub
                    MyPageCount 2 mod 1 eq {
                      60
                    }
                    {
                      505
                    } ifelse
                    sub 36 moveto
                    show globaldict
                    /MyPageCount MyPageCount 1 add put
                } if
            } bind
        >>
        setpagedevice' \
    -f "test_in.pdf"

Note that =string is unique to Ghostscript (ie won't work on any other PostScript interpreter) and pulls a pre-defined 256 character string from userdict. There are dangers to using this that I doubt you realise, because it's a subtlety of PostScript. I have instead replaced it with the portable (ie standard PostScript) construction 256 string which has the same effect for your purposes, but creates a scratch string that can't be reused unexpectedly, unlike =string.

You have set -dPDFX (to create a PDF/X-3 compliant file) but you haven't supplied a PDF/X definition file, this means that the resulting file may not be PDF/X compliant. The process is documented here

Upvotes: 2

EricB
EricB

Reputation: 478

Thanks to KenS's suggestion I was able to get the page numbers added with the following script.

gs -q -sDEVICE=pdfwrite -dBATCH -dNOPAUSE -dPDFX -sOutputFile=step_4.pdf \
  -c 'globaldict /MyPageCount 1 put
        <<
            /EndPage {
                MyPageCount 2 mod 1 eq
            {
                exch pop 0 eq dup {
                    /Helvetica 12 selectfont MyPageCount =string cvs dup stringwidth pop currentpagedevice
                    /PageSize get 0 get exch sub 60 sub 36 moveto show globaldict
                    /MyPageCount MyPageCount 1 add put
                } if
            }{
                exch pop 0 eq dup {
                    /Helvetica 12 selectfont MyPageCount =string cvs dup stringwidth pop currentpagedevice
                    /PageSize get 0 get exch sub 505 sub 36 moveto show globaldict
                    /MyPageCount MyPageCount 1 add put
                } if
            } ifelse
            } bind
        >>
        setpagedevice' \
    -f "test_in.pdf"

Upvotes: 1

Related Questions