que pro paginas numerar numeracion bates c# file pdf header corrupt

c# - pro - Detectar si el archivo PDF es correcto(encabezado PDF)



numerar paginas en acrobat pro (7)

1) Lamentablemente, no hay una manera fácil de determinar si el archivo pdf está dañado. Por lo general, los archivos de problemas tienen un encabezado correcto, por lo que las razones reales de la corrupción son diferentes. Archivo PDF es efectivamente un volcado de objetos PDF. El archivo contiene una tabla de referencia que proporciona las ubicaciones exactas de compensación de bytes de cada objeto desde el inicio del archivo. Por lo tanto, lo más probable es que los archivos corruptos tengan compensaciones rotas o que se pierda algún objeto.

La mejor manera de determinar que el archivo está dañado es utilizar bibliotecas especializadas en PDF. Hay muchas bibliotecas gratuitas y comerciales de este tipo para .NET. Simplemente puede intentar cargar un archivo PDF con una de estas bibliotecas. iTextSharp será una buena opción.

2) De acuerdo con la referencia de PDF, el encabezado del archivo PDF generalmente tiene el formato% PDF − 1.X (donde X es un número, por el momento, de 0 a 7). Y el 99% de los archivos PDF tienen ese encabezado. Pero también hay otros tipos de encabezados que Acrobat Viewer acepta, e incluso la ausencia de encabezados no es un problema real para los visores de PDF. Por lo tanto, no debe tratar el archivo como dañado si no tiene un encabezado. Por ejemplo, el encabezado puede aparecer en algún lugar dentro de los primeros 1024 bytes del archivo o tener la forma%! PS − Adobe − Nn PDF − Mm

Solo para su información, soy un desarrollador de la biblioteca de Docotic PDF .

Tengo una aplicación de Windows .NET que administra muchos archivos PDF. Algunos archivos están corruptos.

2 cuestiones: intentaré explicar en mi peor inglés ... lo siento

1.)

¿Cómo puedo detectar si algún archivo pdf es correcto?

Quiero leer el encabezado de PDF y detectar es correcto.

var okPDF = PDFCorrect (@ "C: / temp / pdfile1.pdf");

2.)

Cómo saber si el byte [] (bytearray) del archivo es un archivo PDF o no.

Por ejemplo, para archivos ZIP, puede examinar los primeros cuatro bytes y ver si coinciden con la firma del encabezado local, es decir, en hexadecimal

50 4b 03 04

if (buffer [0] == 0x50 && buffer [1] == 0x4b && buffer [2] == 0x03 && buffer [3] == 0x04)

Si lo está cargando en un largo, esto es (0x04034b50). por David Pierson

Quiero lo mismo para los archivos PDF.

byte [] dataPDF = ...

var okPDF = PDFCorrect (dataPDF);

¿Algún código fuente de muestra en .NET?


Comprobar el encabezado es complicado Parte del código anterior simplemente no funcionará ya que no todos los PDF comienzan con% PDF. Algunos archivos PDF que se abren correctamente en un visor comienzan con un marcador de lista de materiales, otros comienzan así

------------ e56a47d13b73819f84d36ee6a94183 Disposición de contenido: datos de formulario; nombre = "par" ... etc

Así que la comprobación de "% PDF" no funcionará.


La primera línea de un archivo PDF es un encabezado que identifica la versión de la especificación PDF a la que el archivo cumple con %PDF-1.0 , %PDF-1.1 , %PDF-1.2 , %PDF-1.3 , %PDF-1.4 etc.

Puede verificar esto leyendo algunos bytes desde el inicio del archivo y ver si tiene el encabezado al principio para una coincidencia como archivo PDF. Vea la referencia en PDF de Adobe para más detalles.

No tengo un ejemplo de .NET para ti (no lo he tocado en algunos años), pero incluso si lo hubiera hecho, no estoy seguro de que puedas verificar el contenido completo del archivo. El encabezado podría estar bien, pero el resto del archivo podría estar desordenado (como usted mismo dijo, algunos archivos están dañados).


Lo que hago es:

Extensión 1.Validate

2.Abra el archivo PDF, lea el encabezado (primera línea) y verifique si contiene esta cadena: "% PDF-"

3.Compruebe si el archivo contiene una cadena que especifica el número de páginas buscando "/ Page" (el archivo PDF siempre debe tener al menos 1 página)

Como se sugirió anteriormente, también puede usar una biblioteca para leer el archivo: Lectura de un archivo PDF con iTextSharp


Los archivos PDF con buen comportamiento comienzan con los primeros 9 bytes como %PDF-1.x más una nueva línea (donde x en 0..8). Se supone que 1.x le da la versión del formato de archivo PDF. La segunda línea contiene algunos bytes binarios para ayudar a las aplicaciones (editores) a identificar el PDF como un tipo de archivo no ASCIItext.

Sin embargo, no puedes confiar en esta etiqueta en absoluto. Hay muchas aplicaciones por ahí que usan características de PDF-1.7 pero afirman ser PDF-1.4 y, por lo tanto, engañan a algunos espectadores para que puedan escupir mensajes de error no válidos. (Lo más probable es que estos PDF sean el resultado de una conversión mal administrada del archivo de una versión de PDF superior a una inferior).

No existe tal sección como un "encabezado" en PDF (¿tal vez los 9 bytes iniciales de %PDF-1.x son lo que usted quiso decir con "encabezado"?). Puede haber una estructura incorporada para mantener los metadatos dentro del PDF, que le brinda información sobre el Autor, la Fecha de Creación, la Fecha de Modificación, el Título y algunas otras cosas.

Mi forma de comprobar de forma fiable la corrupción de PDF

No hay otra forma de verificar la validez y no corrupción de un PDF que procesarlo.

Una forma "barata" y bastante confiable de verificar personalmente esa validez para mí es usar Ghostscript .

Sin embargo: desea que esto suceda de forma rápida y automática. Y desea utilizar el método de manera programática o mediante un enfoque de secuencias de comandos para verificar muchos archivos PDF.

Aquí está el truco:

  • No permita que Ghostscript renderice el archivo en una pantalla o en un archivo real (imagen).
  • Utilice el dispositivo de nullpage de Ghostscript en nullpage lugar.

Aquí hay un ejemplo de línea de comando:

gswin32c.exe ^ -o nul ^ -sDEVICE=nullpage ^ -r36x36 ^ "c:/path to /input.pdf"

Este ejemplo es para Windows; en Unix use gs lugar de gswin32c.exe y -o /dev/null .

El uso de -o nul -sDEVICE=nullpage no generará ningún resultado de representación. Pero toda la salida de stderr y stdout de Ghostscript que procesa input.pdf seguirá apareciendo en su consola. -r36x36 ajusta la resolución a 36 dpi para acelerar el cheque.

%errorlevel% (o $? en Linux) será 0 para un archivo no dañado. No será 0 para archivos dañados. Y cualquier mensaje de advertencia o error que aparezca en la salida estándar puede ayudarlo a identificar problemas con input.pdf.

No hay otra manera de verificar la corrupción de un archivo PDF que procesarlo de alguna manera ...

Actualización: Mientras tanto, no solo% PDF-1.0,% PDF-1.1,% PDF-1.2,% PDF-1.3,% PDF-1.4,% PDF-1.5,% PDF-1.6,% PDF-1.7 y% PDF-1.8 son Indicadores de versión válidos, pero también% PDF-2.0.


Podría usar iTextSharp para abrir e intentar analizar el archivo (p. Ej., Intente extraer el texto), pero eso probablemente sea excesivo. También debe tener en cuenta que es GNU Affero GPL a menos que compre una licencia comercial.


Reviso el encabezado PDF de esta manera:

public bool IsPDFHeader(string fileName) { byte[] buffer = null; FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fs); long numBytes = new FileInfo(fileName).Length; //buffer = br.ReadBytes((int)numBytes); buffer = br.ReadBytes(5); var enc = new ASCIIEncoding(); var header = enc.GetString(buffer); //%PDF−1.0 // If you are loading it into a long, this is (0x04034b50). if (buffer[0] == 0x25 && buffer[1] == 0x50 && buffer[2] == 0x44 && buffer[3] == 0x46) { return header.StartsWith("%PDF-"); } return false; }