Это верно.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;
}