2008-11-26 105 views
44

Necesito determinar el número de páginas en un archivo PDF especificado usando el código C# (.NET 2.0). El archivo PDF se leerá desde el sistema de archivos, y no desde una URL. ¿Alguien tiene alguna sugerencia sobre cómo se podría hacer esto? Nota: Adobe Acrobat Reader está instalado en la PC donde se realizará esta verificación.Determine el número de páginas en un archivo PDF

Respuesta

56

Necesitará una API en PDF para C#. iTextSharp es una API posible, aunque pueden existir mejores.

iTextSharp Ejemplo

Debe instalar iTextSharp.dll como referencia. Descargue iTextsharp de SourceForge.net Este es un programa de trabajo completo que utiliza una aplicación de consola.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using iTextSharp.text.pdf; 
using iTextSharp.text.xml; 
namespace GetPages_PDF 
{ 
    class Program 
{ 
    static void Main(string[] args) 
     { 
     // Right side of equation is location of YOUR pdf file 
     string ppath = "C:\\aworking\\Hawkins.pdf"; 
     PdfReader pdfReader = new PdfReader(ppath); 
     int numberOfPages = pdfReader.NumberOfPages; 
     Console.WriteLine(numberOfPages); 
     Console.ReadLine(); 
     } 
    } 
} 
+0

por lo que están diciendo "esto es lo que recomiendo, pero en realidad hay betetr maneras de hacer esto"? –

+9

Gracias, Darkdog, después de mirar PDFLib e iTextSharp, terminé usando iTextSharp: PdfReader pdfReader = new PdfReader (pdfFilePath); int numberOfPages = pdfReader.NumberOfPages; Espero que esto ayude a alguien a enfrentar el mismo problema. – MagicAndi

+0

Gracias a MagicAndi por publicar el código. Muy útil – lidermin

0

PDFsharp

éste debería ser mejor =)

+0

Hice una pequeña prueba con PDFSharf, ITextSharp, Docotis.PDF y EO.PDF, y solo para obtener el conteo de páginas, PDF Sharp fue el más rápido. – Guillaume

+1

Pero PDF-Sharp no puede leer [iRefStream] (http://www.pdfsharp.net/wiki/IRef_Streams.ashx) – Guillaume

+1

Para ampliar el comentario de Guillaume, algunos documentos PDF creados con Acrobat 6 y posteriores no se pueden leer con PDFSharp . Tenía la esperanza de utilizar PDFSharp, ya que lo estamos usando en otra parte de nuestra aplicación, pero descubrí que no lee de manera confiable todos los documentos en PDF. Terminé usando la respuesta aceptada y parece manejar todos los documentos muy bien. – SkipHarris

4

he utilizado para este pdflib.

p = new pdflib(); 

    /* Open the input PDF */ 
    indoc = p.open_pdi_document("myTestFile.pdf", ""); 
    pageCount = (int) p.pcos_get_number(indoc, "length:pages"); 
0

Tengo mucho éxito con los productos CeTe Dynamic PDF. No son gratis, pero están bien documentados. Hicieron el trabajo por mí.

http://www.dynamicpdf.com/

31

Esto debería hacer el truco:

public int getNumberOfPdfPages(string fileName) 
{ 
    using (StreamReader sr = new StreamReader(File.OpenRead(fileName))) 
    { 
     Regex regex = new Regex(@"/Type\s*/Page[^s]"); 
     MatchCollection matches = regex.Matches(sr.ReadToEnd()); 

     return matches.Count; 
    } 
} 

De Rachael's answer y this one también.

+0

Barrett, gracias por proporcionar el código de ejemplo. +1 – MagicAndi

+0

No creo que esto siempre dará la cuenta correcta. Tampoco funcionará en PDF encriptados. –

+0

@TimB Guardé un PDF encriptado y esto funciona en él. – GolfWolf

0

He utilizado el código anterior que resuelve el problema usando regex y funciona, pero es bastante lento. Lee el archivo completo para determinar el número de páginas.

Lo usé en una aplicación web y las páginas a veces enumeran 20 o 30 PDF a la vez y en esa circunstancia el tiempo de carga de la página pasó de unos segundos a casi un minuto debido al método de recuento de páginas.

No sé si las bibliotecas de terceros son mucho mejores, espero que lo sean y he utilizado pdflib en otros escenarios con éxito.

+0

Ryan, he utilizado la biblioteca iTextSharp para resolver este problema, y ​​encontré que proporciona un rendimiento decente. También puede consultar PDFSharp. En cuanto a los problemas con la solución de expresiones regulares, es otro ejemplo de expresiones regulares que causan más problemas de los que resuelven: http://www.codinghorror.com/blog/archives/001016.html – MagicAndi

+0

De acuerdo. No vi su nota hasta después, pero reemplacé la función RegEx por una con iTextSharp como recomienda y hubo una gran mejora en el rendimiento. Según mis pruebas, el método iTextSharp es al menos 5 veces más rápido que el método RegEx y generalmente mucho más que eso, al menos cuando estoy calculando varios archivos PDF al mismo tiempo (es decir, cargando una página con múltiples Archivos PDF listados). –

+0

Si el rendimiento es un problema, es posible que desee probar una utilidad de línea de comandos como PDFLeo (http://www.rockpdf.com). Un comando como "pdfleo -i myfile.pdf | grep" Número de páginas "toma menos de 1 segundo en el archivo de 300 páginas. – cuteCAT

2

Docotic.Pdf library se pueden utilizar para realizar la tarea.

Aquí es código de ejemplo:

PdfDocument document = new PdfDocument(); 
document.Open("file.pdf"); 
int pageCount = document.PageCount; 

La biblioteca se analiza lo menos posible lo que el rendimiento debe ser aceptable.

Descargo de responsabilidad: trabajo para Bit Miracle.

+0

No quiero ser sarcástico, pero debe verificar su reclamo de rendimiento. Probé en un PDF de 250 páginas, 216Mo, y fue casi 20 veces más lento que PDF-Sharp, solo para obtener el recuento de páginas, usando su ejemplo – Guillaume

2

una línea:

int pdfPageCount = System.IO.File.ReadAllText("example.pdf").Split(new string[] { "/Type /Page" }, StringSplitOptions.None).Count()-2; 

Recomendado: ITEXTSHARP

Cuestiones relacionadas