Rileva se il file PDF è corretto (header PDF)

Ho un’applicazione Windows .NET che gestisce molti file PDF. Alcuni file sono corrotti.

2 numeri: proverò a spiegare nel mio peggior inglese … mi dispiace

1.)

Come posso rilevare se un file pdf è corretto?

Voglio leggere l’intestazione del PDF e rilevare è corretto.

var okPDF = PDFCorrect (@ “C: \ temp \ pdfile1.pdf”);

2.)

Come sapere se il byte [] (bytearray) del file è un file PDF o meno.

Ad esempio, per i file ZIP, è ansible esaminare i primi quattro byte e vedere se corrispondono alla firma dell’intestazione locale, cioè in esadecimale

50 4b 03 04

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

Se lo si sta caricando in un lungo, questo è (0x04034b50). di David Pierson

Voglio lo stesso per i file PDF.

byte [] dataPDF = …

var okPDF = PDFCorrect (dataPDF);

Qualunque codice sorgente di esempio in .NET?

1) Purtroppo non esiste un modo semplice per determinare se il file pdf è corrotto. Di solito i file dei problemi hanno un’intestazione corretta, quindi le vere ragioni della corruzione sono diverse. Il file PDF è effettivamente una copia di oggetti PDF. Il file contiene una tabella di riferimento che fornisce le esatte posizioni di offset di byte di ogni object dall’inizio del file. Quindi probabilmente i file danneggiati hanno un offset o possono mancare alcuni oggetti.

Il modo migliore per determinare se il file è danneggiato consiste nell’utilizzare librerie PDF specializzate. Esistono molte librerie libere e commerciali di tali librerie per .NET. Si può semplicemente provare a caricare il file PDF con una di queste librerie. iTextSharp sarà una buona scelta.

2) In conformità con il riferimento PDF, l’intestazione del file PDF è solitamente composta da% PDF-1.X (dove X è un numero, per il momento da 0 a 7). E il 99% dei file PDF ha tale intestazione. Ma ci sono anche altri tipi di header che Acrobat Viewer accetta e anche l’assenza di header non è un problema reale per i visualizzatori di PDF. Quindi non dovresti considerare il file come danneggiato se non ha un’intestazione. Ad esempio l’intestazione può essere visualizzata da qualche parte entro i primi 1024 byte del file o essere nella forma%! PS-Adobe-Nn PDF-Mm

Solo per vostra informazione sono uno sviluppatore della libreria PDF di documenti .

Controllo PDF intestazioni in questo modo:

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

La prima riga di un file PDF è un’intestazione che identifica la versione della specifica PDF a cui il file è conforms %PDF-1.0 , %PDF-1.1 , %PDF-1.2 , %PDF-1.3 , %PDF-1.4 ecc.

È ansible controllare questo leggendo alcuni byte dall’inizio del file e vedere se si ha l’intestazione all’inizio per una corrispondenza come file PDF. Vedere il riferimento PDF da Adobe per ulteriori dettagli.

Non ho un esempio .NET per te (non l’ho toccato da qualche anno a questa parte), ma anche se l’avessi fatto, non sono sicuro che tu possa controllare per un completo contenuto valido del file. L’intestazione potrebbe essere OK ma il resto del file potrebbe essere incasinato (come hai detto tu stesso, alcuni file sono corrotti).

I PDF ben funzionanti iniziano con i primi 9 byte come %PDF-1.x più una nuova riga (dove x in 0..8). 1.x dovrebbe fornire la versione del formato di file PDF. La 2a riga sono alcuni byte binari per aiutare le applicazioni (editor) a identificare il PDF come un tipo di file non ASCII.

Tuttavia, non puoi fidarti di questo tag. Ci sono molte applicazioni là fuori che usano funzionalità di PDF-1.7 ma che pretendono di essere PDF-1.4 e sono quindi fuorvianti per alcuni spettatori a sputare messaggi di errore non validi. (Molti di questi PDF sono il risultato di una conversione non corretta del file da una versione PDF più alta a una inferiore).

Non esiste una sezione come “intestazione” in PDF (forse i 9 byte iniziali di %PDF-1.x sono ciò che intendevi con “intestazione”?). È ansible che sia incorporata una struttura per contenere i metadati all’interno del PDF, fornendo informazioni su Autore, Data di creazione, ModDate, Titolo e altre cose.

Il mio modo di verificare in modo affidabile il danneggiamento dei PDF

Non c’è altro modo per verificare la validità e la non corruzione di un PDF piuttosto che renderlo.

Un modo “economico” e piuttosto affidabile per verificare personalmente tale validità per me è usare Ghostscript .

Tuttavia: vuoi che ciò accada in modo rapido e automatico. E si desidera utilizzare il metodo in modo programmatico o tramite un approccio basato su script per controllare molti PDF.

Ecco il trucco:

  • Non lasciare che Ghostscript esegua il rendering del file su un display o su un file reale (immagine).
  • Utilizzare invece il dispositivo nullpage di Ghostscript.

Ecco una riga di comando di esempio:

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

Questo esempio è per Windows; su Unix usa gs invece di gswin32c.exe e -o /dev/null .

Usando -o nul -sDEVICE=nullpage non mostrerà alcun risultato di rendering. Ma tutti gli output stderr e stdout di Ghostscript che elaborano input.pdf verranno comunque visualizzati nella tua console. -r36x36 imposta la risoluzione a 36 dpi per accelerare il controllo.

%errorlevel% (o $? su Linux) sarà 0 per un file non corrotto. Sarà non- 0 per i file corrotti. E qualsiasi messaggio di avviso o di errore che appare sullo stdout può aiutarti a identificare i problemi con l’input.pdf.

Non c’è altro modo per controllare la corruzione di un file PDF piuttosto che renderlo in qualche modo …

È ansible utilizzare iTextSharp per aprire e tentare di analizzare il file (ad esempio, provare ad estrarre il testo da esso) ma probabilmente è eccessivo. Dovresti anche essere consapevole del fatto che è GNU Affero GPL a meno che non acquisti una licenza commerciale.

Controllare l’intestazione è complicato. Alcuni dei codici sopra semplicemente non funzioneranno in quanto non tutti i PDF iniziano con% PDF. Alcuni pdf che si aprono correttamente in un visualizzatore iniziano con un indicatore BOM, altri iniziano così

———— e56a47d13b73819f84d36ee6a94183 Content-Disposition: form-data; name = “par” … ecc

Quindi il controllo di “% PDF” non funzionerà.

Quello che faccio è:

1.Validate estensione

2. Apri il file PDF, leggi l’intestazione (prima riga) e controlla se contiene questa stringa: “% PDF-”

3.Controlla se il file contiene una stringa che specifica il numero di pagine cercando più “/ Pagina” (il file PDF deve sempre avere almeno 1 pagina)

Come suggerito in precedenza, puoi anche usare una libreria per leggere il file: Leggere il file PDF usando iTextSharp