Ответ 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;
}