Détecter si le fichier PDF est correct (en-tête PDF) [fermé]
j'ai une application Windows.net qui gère de nombreux fichiers PDF. Certains fichiers sont corrompus.
2 questions: je vais essayer de l'expliquer dans mon pire en anglais...désolé
1.)
Comment puis-je détecter si un fichier pdf est correct ?
je veux lire l'en-tête de PDF et detect est correct.
var okPDF = PDFCorrect (@"C:temppdfile1.pdf");
2.)
Comment savoir si byte [] (bytearray) of file est PDF file ou pas.
par exemple, pour les fichiers ZIP, vous pouvez examiner les quatre premiers octets et voir s'ils correspondent à la signature de l'en-tête local, i.e. dans hex
50 4b 03 04
if (buffer[0] == 0x50 && tampon[1] == 0x4b && tampon[2] == 0x03 && tampon[3] == 0x04)
si vous chargez dans un long, c'est (0x04034b50). par David Pierson!--1-->
je veux la même chose pour les fichiers PDF.
byte[] dataPDF = ...
var okPDF = PDFCorrect (dataPDF);
un exemple de code source dans .NET?
7 réponses
1) malheureusement, il n'y a pas de moyen facile de déterminer si le fichier pdf est corrompu. Habituellement les dossiers de problème ont un en-tête correct de sorte que les raisons réelles de la corruption sont différentes. Le fichier PDF est en fait un dépotoir D'objets PDF. Le fichier contient un tableau de référence donnant les emplacements exacts de décalage des octets de chaque objet depuis le début du fichier. Donc la plupart des fichiers corrompus ont probablement une cassée offsets ou peut-être un objet est manqué.
La meilleure façon de déterminer que le fichier est corrompu est d'utiliser des bibliothèques PDF spécialisées. Il y a beaucoup de libre et commercial de telles bibliothèques pour .NET. Vous pouvez simplement essayer de charger le fichier PDF avec l'une de ces bibliothèques. iTextSharp sera un bon choix.
2) conformément à la référence PDF, l'en-tête du fichier PDF contient habituellement le %form PDF-1.X (où X est un nombre, pour le moment de 0 à 7). Et 99% des fichiers PDF ont un tel en-tête. Mais il y a aussi d'autres types d'en-têtes que Acrobat Viewer accepte et même l'absence d'en-tête n'est pas un vrai problème pour les utilisateurs de PDF. Donc, vous ne devriez pas traiter le fichier corrompu s'il n'a pas d'en-tête. E. g. l'en-tête peut être apparu quelque part dans les 1024 premiers octets du fichier ou de la forme %!PS-Adobe-N. N PDF-M. m
Juste pour votre information, je suis un développeur de l' Docotic PDF library.
j'ai vérifier en-Tête de fichier PDF comme ceci:
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 première ligne D'un fichier PDF est un en-tête identifiant la version de la spécification PDF
que le fichier est conforme %PDF-1.0
,%PDF-1.1
,%PDF-1.2
, %PDF-1.3
,%PDF-1.4
etc.
vous pouvez vérifier cela en lisant quelques octets à partir du début du fichier et voir si vous avez l'en-tête au début pour une correspondance en tant que fichier PDF. Voir le référence PDF de Adobe pour plus de détails.
ne pas avoir d'exemple .NET pour vous (n'ont pas touché à la chose dans certains mais même si je l'avais fait, je ne suis pas sûr que vous puissiez vérifier un contenu valide complet du fichier. L'en-tête peut être correct mais le reste du fichier peut être perturbé (comme vous l'avez dit vous-même, certains fichiers sont corrompus).
les fichiers PDF qui se comportent bien commencent avec les 9 premiers octets comme %PDF-1.x
plus une nouvelle ligne (où x dans 0..8). 1.x
est supposé vous donner la version du format de fichier PDF. La deuxième ligne sont quelques octets binaires afin d'aider les applications (éditeurs) à identifier le PDF comme un type de fichier non-ASCIItext.
cependant, vous ne pouvez pas du tout faire confiance à cette étiquette. Il ya beaucoup d'applications là-bas qui utilisent des fonctionnalités de PDF-1.7 mais prétendent être PDF-1.4 et sont donc trompeurs certains téléspectateurs en crachant des messages d'erreur invalides. (La plupart du temps, ces fichiers PDF sont le résultat d'une conversion mal gérée du fichier D'une version PDF supérieure à une version PDF inférieure.)
il n'existe pas de section telle qu'un "en-tête" en PDF (peut-être les 9 octets initiaux de %PDF-1.x
c'est ce que vous vouliez dire par "en-tête"?). Il peut y avoir une structure intégrée pour contenir les métadonnées à l'intérieur du PDF, vous donnant des informations sur L'auteur, CreationDate, ModDate, le titre et d'autres choses.
Ma façon de vérifier de manière fiable pour PDF corruption
il n'y a pas d'autre moyen de vérifier la validité et la non-corruption d'un PDF que de le rendre.
Un "pas cher" et plutôt moyen fiable de vérifier la validité pour moi personnellement, c'est d'utiliser Ghostscript.
cependant: vous voulez que cela arrive rapidement et automatiquement. Et vous voulez utiliser la méthode programatically ou via une approche scriptée pour vérifier de nombreux PDFs.
l'astuce est Là:
- ne laissez pas Ghostscript rendre le fichier à un écran ou à un fichier (image) réel.
- utilisez Ghostscript
nullpage
dispositif à la place.
Voici un exemple de ligne de commande:
gswin32c.exe ^
-o nul ^
-sDEVICE=nullpage ^
-r36x36 ^
"c:/path to /input.pdf"
cet exemple est pour Windows; sur Unix utilisez gs
au lieu de gswin32c.exe
et -o /dev/null
.
en utilisant -o nul -sDEVICE=nullpage
ne produira aucun résultat de rendu. Mais toutes les sorties stderr et stdout de Ghostscript traitent l'entrée.pdf apparaissent toujours dans votre console. -r36x36
définit la résolution de 36 pouce pour accélérer l'enregistrement.
%errorlevel%
(ou $?
sous Linux) sera 0
pour un fichier non corrompu. Il sera non0
pour les fichiers corrompus. Et tout message d'avertissement ou d'erreur apparaissant sur stdout peut vous aider à identifier les problèmes avec l'entrée.PDF.
il n'y a pas d'autre moyen de vérifier la corruption d'un fichier PDF que de le rendre d'une manière ou d'une autre...
Vous pouvez utiliser iTextSharp ouvrir et essayer d'analyser le fichier (par exemple essayer d'en extraire du texte) mais c'est probablement exagéré. Vous devez également être conscient que c'est GNU Affero GPL sauf si vous achetez une licence commerciale.
vérifier l'en-tête est délicat. Une partie du code ci-dessus ne fonctionnera tout simplement pas puisque tous les PDF ne commencent pas avec %PDF. Certains pdf qui s'ouvrent correctement dans un viewer commencent avec un marqueur BOM, d'autres commencent comme ceci
------------e56a47d13b73819f84d36ee6a94183 Contenu-Disposition: form-data; name= " par" ...etc
donc vérifier pour "% PDF " ne fonctionnera pas.
Ce que je fais, c'est:
1.Valider l'extension
2.Ouvrez le fichier PDF, lisez l'en-tête (première ligne) et vérifiez s'il contient cette chaîne de caractères: "%PDF-"
3.Vérifiez si le fichier contient une chaîne de caractères qui spécifie le nombre de pages en recherchant plusieurs "/Page" (le fichier PDF doit toujours avoir au moins 1 page)
comme suggéré précédemment, vous pouvez également utiliser une bibliothèque pour lire le fichier: Lecture de Fichier PDF à l'Aide de iTextSharp