В данный момент я использую itext для чтения страницы в формате pdf. Это занимает довольно много времени, потому что lib, кажется, просматривает весь файл.
Является ли информация о странице где-нибудь в заголовке pdf или требуется полный файл?
В данный момент я использую itext для чтения страницы в формате pdf. Это занимает довольно много времени, потому что lib, кажется, просматривает весь файл.
Является ли информация о странице где-нибудь в заголовке pdf или требуется полный файл?
Это правильно. 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;
}
Вам просто нужно прочитать дерево страниц (каталог, страницы, дети) и подсчитать записи в Странице.
Ларс Фогель использует следующий код:
PdfReader reader = new PdfReader(INPUTFILE);
int n = reader.getNumberOfPages();
Я был бы удивлен, если реализация getNumberOfPages
медленнее любого другого решения.
Раздел F.3.3 говорит, что поле заголовка N
описано следующим образом:
N integer (Required) The number of pages in the document.
PdfReader document = new PdfReader(new FileInputStream(new File("filename")));
int noPages = document.getNumberOfPages();
PdfReader document = new PdfReader(new FileInputStream(new File("filename")));
int noPages = document.getNumberOfPages();
выше - процесс подсчета страниц PDF