2011-05-17 23 views
15

en este momento estoy usando itext para leer el número de páginas de un pdf. Esto lleva bastante tiempo porque la lib parece escanear todo el archivo.Número de páginas de Pdf con Java

¿Está la información de la página en algún lugar del encabezado del pdf, o se necesita un archivo completo?

+0

favor puede publicar su código aquí – developer

+0

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. –

+0

http://stackoverflow.com/a/4135059/489364 esta respuesta usa Apache PDFBox. biblioteca de Java – kommradHomer

Respuesta

2

Lars Vogel utiliza the following code:

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

Me sorprendería si la implementación de getNumberOfPages es más lenta que cualquier otra solución.


Sección F.3.3 dice que hay un campo de cabecera llamada N se describe de la siguiente manera:

N  integer (Required)  The number of pages in the document. 
+0

sí, sé que es mi código. Pero esta pieza de código tiene que escanear el pdf completo o sería una forma más fácil si solo lee el encabezado del pdf. –

+0

Déjame intentar averiguar ... – aioobe

0
PdfReader document = new PdfReader(new FileInputStream(new File("filename"))); 
int noPages = document.getNumberOfPages(); 
0
PdfReader document = new PdfReader(new FileInputStream(new File("filename"))); 
int noPages = document.getNumberOfPages(); 

anterior es el proceso para contar las páginas en PDF

+0

cual biblioteca? – Jaydev

3

Sólo Necesito leer el árbol de la página (Catálogo, Páginas, Niños) y contar las entradas de la página.

+0

En realidad, solo necesita el objeto raíz de páginas y obtener su/Count. –

21

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; 
    } 
+0

¿No debería llamarse raf.close() a recursos gratuitos? –

Cuestiones relacionadas