Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I have a pdf document I created through non-Acrobat means (printing to pdf, then merging a bunch of pdfs), but I'd like to manually change the page numbers (i.e. the first several pages are simply title pages, the page that is labeled "page 1" is really the 7th sheet of the pdf). What's the simplest (and ideally, free) way to do this?

To be clear, I am not trying to change the numbers on the pages themselves, but the page numbers in the "metadata" that the pdf stores (the pages themselves are already numbered correctly; I just want "go to page 1" to go to the page labeled 1, which could be sheet 7).

For what it's worth, I'm on Windows, though I have access to Macs as well.

share|improve this question
    
I'm not sure if I understand your description+requirement fully. Can you provide a link to a sample PDF you want to modify? –  Kurt Pfeifle Jan 14 '11 at 14:17
    
is there a command line tool to do that, e.g. on a big pdf file without actually opening the txt file? –  jj_p Sep 20 '13 at 13:50
    
like e.g. pdftk? –  jj_p Sep 23 '13 at 7:01

6 Answers 6

What you want is indeed called page labels and can easily be added directly in the PDF's source code. Rename the file extension from pdf to txt and open the file in a text editor (this can be slow, depending on the file size, be patient). The information about page labels is stored in a node called the document catalog which looks something like this:

3 0 obj
<< /Type /Catalog
   /Pages 1 0 R
>>
endobj

It may contain more confusing stuff, but this is the basic structure. There is only one catalog, so in a large file you can search for the node that contains /Catalog. Now you can make your desired changes by inserting the /PageLabels entry:

3 0 obj
<< /Type /Catalog
   /Pages 1 0 R
   /PageLabels << /Nums [ 0 << /P (cover) >>
                          % labels 1st page with the string "cover"
                          1 << /S /r >>
                          % numbers pages 2-6 in small roman numerals
                          6 << /S /D >>
                          % numbers pages 7-x in decimal arabic numerals
                        ]
               >>
>>
endobj

There are 3 lines starting with numbers, called page indices. Page 1 has the index 0, page 2 the index 1 and so forth. They always describe ranges, so the line with 1 <<...>> applies to all pages from index 1 to 5 and the line with 6 <<...>> applies to all pages from 6 up to the last page. A label for 0 <<...>> must always be defined.

You can find more information about page labels and PDF source code in the PDF standard or in a wiki on PDF standards.

share|improve this answer
1  
+1 great answer. –  Jeremy W May 30 '12 at 18:21
1  
Marvellous! This is the only place on the web I have found such direct and useful information. We don't all have Acrobat Reader, after all. –  Noldorin Jul 22 '12 at 0:23
    
User, take care to remember adding /PageLabels << /Nums [, ] and also the >> at the end! I've tricked myself at least twice! :) Forever gratitude for the answer. –  naxa Jun 23 '13 at 17:16
    
With example /St 8 or /St 2, you set a start point for the displayed label; but choose any number in place of 8 (or 2), which must be >= 1. For example, 1 << /S /r /St 12 >> will number pages from (actually) 2-6 as (displayed) xii-xvii - because '12' corresponds 'xii'. –  naxa Jun 23 '13 at 17:30
1  
thanks for the answer, but in my experience this method sometimes works and sometimes doesn't; also, I happened to find more than one Catalog: how do you explain that? –  jj_p Sep 28 '13 at 17:45

If I understand you correctly, here is how it should work:

gs \
  -o modified-pagelabels-50pages.pdf \
  -sDEVICE=pdfwrite \
  -c "[ /Page 1 /Label (i)     /PAGELABEL pdfmark" \
  -c "[ /Page 2 /Label (ii)    /PAGELABEL pdfmark" \
  -c "[ /Page 3 /Label (III)   /PAGELABEL pdfmark" \
  -c "[ /Page 4 /Label (four)  /PAGELABEL pdfmark" \
  -c "[ /Page 5 /Label (v)     /PAGELABEL pdfmark" \
  -c "[ /Page 6 /Label (|||||) /PAGELABEL pdfmark" \
  -f 50pages.pdf

However, I seem to remember, that this didn't reliably or fully work last time I tried this (about 2 years ago).

UPDATE: My memory wasn't failing me. I now tried again and filed a bug report for Ghostscript (bug 691889) concerning this. Follow the link to the bug report to see the details.

share|improve this answer

For removing the old ones, probably the easiest cross-platform way is just to crop the old ones off. You could to this, for example, with BRISS.

Adding the new ones using free tools is more tricky. Personally I'd probably do it with pdflatex, as in this StackExchange answer, though that might be a rather involved solution unless you have other uses for pdflatex.

I think it can be done, however with jPdfTweak instead.

share|improve this answer

BeCyPDFMetaEdit http://www.becyhome.de/becypdfmetaedit/description_eng.htm

You can add/remove/change internal page numbers scheme in the "pages" tab of this freeware tool.

And be caution, PDF xchange viewer doesn't show the page number scheme, and foxitreader have a right result. I have not test the Acrobat reader.

share|improve this answer

The method given by Dane H. does work with Acrobat Reader (or, to be precise, the current version of Adobe Reader). One minor point to note: the field at the top will only accept 8 characters so you can't enter something like 'subject index' into it if such a label has been used. But you can instead use menu item View > Page Navigation > Go to..., or the key equivalent.

Another tip: pdf specification always assigns page numbers consecutively, so in the case of a document produced by scanning pairs of pages the two sets of numbers get out of step (unless you laboriously number each page individually). But you can with little effort set up your document so the convention 'go to page n gets you to pages 2n and 2n+1' applies.

share|improve this answer

Danes answer is the best, the formats changed a little now, this might be helpful:

%PDF-1.6

29241 0 obj

<</Metadata 1685 0 R/Outlines 29461 0 R/PageLabels<</Nums[0<</S/D>>3<</S/D/St 6>>4<</S/D/St 10>>5<</S/D/St 12>>15<</S/D/St 70>>16<</S/D/St 72>>17<</S/D/St 80>>18<</S/D/St 82>>19<</S/D/St 90>>23<</S/D/St 96>>25<</S/D/St 99>>29<</S/D/St 110>>31<</S/D/St 130>>32<</S/D/St 133>>35<</S/D/St 137>>36<</S/D/St 140>>37<</S/D/St 145>>39<</S/D/St 150>>40<</S/D/St 152>>42<</S/D/St 155>>43<</S/D/St 160>>46<</S/D/St 165>>47<</S/D/St 167>>48<</S/D/St 170>>49<</S/D/St 180>>50<</S/D/St 190>>52<</S/D/St 300>>53<</S/D/St 305>>54<</S/D/St 319>>56<</S/D/St 380>>57<</S/D/St 390>>58<</S/D/St 500>>67<</S/D/St 515>>68<</S/D/St 525>>70<</S/D/St 550>>71<</S/D/St 553>>72<</S/D/St 560>>73<</S/D/St 600>>76<</S/D/St 620>>78<</S/D/St 650>>82<</S/D/St 670>>85<</S/D/St 700>>95<</S/D/St 714>>117<</S/D/St 900>>162<</S/D/St 1000>>178<</S/D/St 1200>>209<</S/D/St 1500>>263<</S/D/St 1555>>270<</S/D/St 1563>>389<</S/D/St 1681>>522<</S/D/St 1813>>]>> /PageMode/UseOutlines/Pages 29177 0 R/Type/Catalog>>

endobj
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.