hans sausage
hans sausage

Reputation: 221

Page count of Pdf with Java

at the moment I am using itext to read the page count of a pdf. This takes quite long because the lib seems to scan the whole file.

Is the page information somewhere in the header of the pdf, or is a full filescan needed?

Upvotes: 19

Views: 39557

Answers (6)

Deividas Duda
Deividas Duda

Reputation: 133

In iText version 5.5.13 the method below will give you a page number without scanning the whole file. It will not read the full file content into memory.

int efficientPDFPageCount(String filePath){
     PdfReader reader = new PdfReader(filePath, new byte[0], true);
     int pages = reader.getNumberOfPages();
     reader.close();
     return pages;
}

Upvotes: 2

Mark Storer
Mark Storer

Reputation: 15868

That's correct. iText parses quite a bit of a PDF when it is opened (it doesn't read the contents of stream objects, but that's about it)...

UNLESS you use the PdfReader(RandomAccessFileOrArray) constructor, in which case it will only read the xrefs (mostly required), but not parse anything until you start requesting specific objects (directly or via various calls).

The first PDF program I ever wrote did exactly this. It opened up a PDF and doing the bare minimum amount of work necessary, read the number of pages. It didn't even parse the xrefs it didn't have to. Haven't thought about that program in years...

So while not perfectly efficient, it'll be vastly more efficient to use a RandomAccessFileOrArray:

int efficientPDFPageCount(String path) {
  RandomAccessFileOrArray file = new RandomAccessFileOrArray(path, false, true );
  PdfReader reader = new PdfReader(file);
  int ret = reader.getNumberOfPages();
  reader.close();
  return ret;
}

Update:

The itext API underwent a little overhaul. Now (in version 5.4.x) the correct way to use it is to pass through java.io.RandomAccessFile:

int efficientPDFPageCount(File file) {
     RandomAccessFile raf = new RandomAccessFile(file, "r");
     RandomAccessFileOrArray pdfFile = new RandomAccessFileOrArray(
          new RandomAccessSourceFactory().createSource(raf));
     PdfReader reader = new PdfReader(pdfFile, new byte[0]);
     int pages = reader.getNumberOfPages();
     reader.close();
     return pages;
  }

Upvotes: 26

developer
developer

Reputation: 9478

PdfReader document = new PdfReader(new FileInputStream(new File("filename")));   
int noPages = document.getNumberOfPages(); 

above is the process for counting the pdf pages

Upvotes: 0

TKV
TKV

Reputation: 2653

PdfReader document = new PdfReader(new FileInputStream(new File("filename")));  
int noPages = document.getNumberOfPages(); 

Upvotes: 0

mark stephens
mark stephens

Reputation: 3184

You just need to read the Page tree (Catalogue, Pages, Kids) and count the Page entries.

Upvotes: 3

aioobe
aioobe

Reputation: 420931

Lars Vogel uses the following code:

PdfReader reader = new PdfReader(INPUTFILE);
int n = reader.getNumberOfPages();

I'd be surprised if the implementation of getNumberOfPages is slower than any other solution.


Section F.3.3 says there is a header-field called N described as follows:

N     integer (Required)      The number of pages in the document.

Upvotes: 4

Related Questions