Количество страниц Pdf с Java

В данный момент я использую itext для чтения страницы в формате pdf. Это занимает довольно много времени, потому что lib, кажется, просматривает весь файл.

Является ли информация о странице где-нибудь в заголовке pdf или требуется полный файл?

Ответы

Ответ 1

Это правильно. iText анализирует довольно много PDF файла, когда он открыт (он не читает содержимое объектов потока, но об этом)...

ЕСЛИ вы используете конструктор PdfReader(RandomAccessFileOrArray), и в этом случае он будет читать только xrefs (в основном требуется), но не разбирает ничего, пока вы не начнете запрашивать определенные объекты (напрямую или через различные вызовы).

Первая программа PDF, которую я когда-либо писала, сделала именно это. Он открыл PDF файл и выполнил минимальный необходимый объем работы, прочитал количество страниц. Он даже не разбирал хрефсы, которые ему не нужно. Не думал об этой программе годами...

Таким образом, хотя это не совсем эффективно, гораздо проще использовать 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:

API-интерфейс itext подвергся небольшой перестройке. Теперь (в версии 5.4.x) правильный способ его использования - пройти через 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;
  }

Ответ 2

Вам просто нужно прочитать дерево страниц (каталог, страницы, дети) и подсчитать записи в Странице.

Ответ 3

Ларс Фогель использует следующий код:

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

Я был бы удивлен, если реализация getNumberOfPages медленнее любого другого решения.


Раздел F.3.3 говорит, что поле заголовка N описано следующим образом:

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

Ответ 4

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

Ответ 5

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

выше - процесс подсчета страниц PDF