Количество страниц Pdf с Java - PullRequest
15 голосов
/ 17 мая 2011

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

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

Ответы [ 5 ]

23 голосов
/ 18 мая 2011

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

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

Первая программа 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;
}

Обновление:

Интерфейс itext API подвергся небольшому пересмотру.Теперь (в версии 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;
  }
3 голосов
/ 17 мая 2011

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

2 голосов
/ 17 мая 2011

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

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

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


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

N     integer (Required)      The number of pages in the document.
0 голосов
/ 17 мая 2011
PdfReader document = new PdfReader(new FileInputStream(new File("filename")));   
int noPages = document.getNumberOfPages(); 

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

0 голосов
/ 17 мая 2011
PdfReader document = new PdfReader(new FileInputStream(new File("filename")));  
int noPages = document.getNumberOfPages(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...