Eso es correcto. iText analiza bastante PDF cuando se abre (no lee el contenido de los objetos de transmisión, pero eso es todo) ...
A MENOS que use el constructor PdfReader(RandomAccessFileOrArray)
, en cuyo caso solo leerá los refX (generalmente obligatorios), pero no analizan nada hasta que comienzas a solicitar objetos específicos (directamente o a través de varias llamadas).
El primer programa en PDF que escribí hizo exactamente esto. Abrió un PDF y haciendo la mínima cantidad de trabajo necesario, lea el número de páginas. Ni siquiera analizó las referencias externas que no tenía que hacer. No han pensado que el programa en años ...
Así, mientras que no es perfectamente eficiente, que va a ser mucho más eficiente usar un 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;
}
Actualización:
La API de itext se sometió a una pequeña revisión. Ahora (en la versión 5.4.x) la forma correcta de utilizarlo es pasar a través 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;
}
favor puede publicar su código aquí – developer
Se trata más de una cuestión general que pregunta código. Me quedaré con itext si es lo mejor que pueda. Pero cargar el archivo completo parece inútil. –
http://stackoverflow.com/a/4135059/489364 esta respuesta usa Apache PDFBox. biblioteca de Java – kommradHomer