Ne peut pas lire certains fichiers PDF avec iTextSharp
J'ai une application Win32 qui lit les fichiers Pdf à l'aide iTextSharp qui insère une image dans le document comme un sceau.
Il fonctionne très bien avec 99% des fichiers de traitement de plus d'un an, mais ces jours-ci certains fichiers il suffit de ne pas lire.
Lorsque j'exécute le code ci-dessous:
string inputfile = "C:\test.pdf";
PdfReader reader = new PdfReader(inputfile);
Il donne à l'exception:
System.NullReferenceException occurred
Message="Object reference not set to an instance of an object."
Source="itextsharp"
StackTrace:
em iTextSharp.text.pdf.PdfReader.ReadPages()
em iTextSharp.text.pdf.PdfReader.ReadPdf()
em iTextSharp.text.pdf.PdfReader..ctor(String filename, Byte[] ownerPassword)
em iTextSharp.text.pdf.PdfReader..ctor(String filename)
em MyApp.insertSeal() na C:\MyApp\Stamper.cs:linha 659
Les fichiers pdf qui jettent ces exceptions peuvent normalement être lu par adobe pdf et lorsque j'ouvre un de ces fichiers à l'aide d'Acrobat et de l'enregistrer, je peux lire ce fichier enregistré avec mon application.
Sont les fichiers corrompus, mais encore peut être ouvert avec Adobe Reader?
Je partage avec vous deux échantillons de fichiers.
Un fichier qui fonctionne PAS : Pas-Ok-Version.pdf
Et un fichier qui fonctionne, après une a ouvert et enregistré avec Acrobat. Télécharger ici OK-Version.pdf
Ce qui a généré les fichiers à l'origine? Tout simplement parce que Adobe Reader peut lire, ne signifie pas qu'il est parfait à 100% en fonction de la publié en format PDF. Je suis sûr que ce n'est pas aussi mauvaise qu'elle l'est dans le navigateur du monde, mais pensez à tout le code HTML non valide que la plupart des navigateurs peuvent lire...
J Santos: je ne vois pas v1.1 ici sourceforge.net/projects/itextsharp/files/itextsharp
Les fichiers sont générés par des tiers, avec ImagXpress de Accusoft.
Scheffer, Désolé, je donne la version de l'assembly. La vraie version est 4.1.6.0
OriginalL'auteur Guilherme de Jesus Santos | 2011-02-25
Vous devez vous connecter pour publier un commentaire.
Voici le (java, désolé) source pour readPages:
trailer,
catalogue,
rootPages, and
pageRefs` sont toutes les variables de membre de la PdfReader.Si la remorque ou de la racine/catalogue objet d'un document PDF sont tout simplement absent, votre PDF est VRAIMENT MAL CASSÉ. Il est plus probable que les xref table est un peu large, et que les objets en question ne sont tout simplement pas exactement où ils sont censés être (ce qui est Mauvais, mais récupérable).
TOUTEFOIS, lorsque PdfReader ouvre d'abord un fichier PDF, il analyse TOUS les objets dans le fichier, et les convertit à la appropriée PdfObject les classes dérivées.
Ce qu'il n'est pas faire est de vérifier que le numéro de l'objet revendiqué par le xref table et le numéro de l'objet lues à partir du fichier Correspondent Réellement. Très peu Probable, mais possible. Le mauvais logiciel pourrait écrire leur PDF les objets dans le bon ordre, mais garder l'octet décalages dans le xref table correcte. Un logiciel qui a remplacé le numéro de l'objet à partir de la xref tableau avec le nombre de ce décalage d'octet dans le fichier serait bien.
iText est pas bien.
Je veux encore voir le PDF.
Yep. Que le format PDF est cassé bien. Plus précisément:
Le fichier de la première 70kb ou alors définir une assez peu propre PDF. Des modifications ont été ensuite ajouté à la PDF.
Vérifier. Quelqu'un a tenté d'ajouter des modifications à la PDF et a échoué. Mal. Pour comprendre à quel point, laissez-moi vous expliquer certains de la syntaxe interne d'un document PDF, illustré par cet exemple:
Nous avons donc un en-tête/version "%%PDF1.v", une liste d'objets (ceux-ci sont appelés dictionnaires), une croix (x) dans le tableau de référence de cotation de l'octet les décalages et l'objet des numéros de tous les objets de la liste, et d'une remorque en donnant à l'objet racine & le nombre d'objets dans le fichier PDF, et le décalage d'octet pour le 'x' dans 'xref'.
Vous pouvez ajouter des modifications à un fichier PDF existant. Pour ce faire il suffit d'ajouter de tout nouveaux ou modifiés objets après l' %%expressions du FOLKLORE, d'une croix dans le tableau de référence à ces nouveaux objets, et d'une remorque. La remorque d'un ajouté le changement devrait inclure un /touche Prev avec le décalage d'octet à la précédente de la croix de la table de référence.
Dans votre PAS-OK, pdf, quelqu'un a essayé d'ajouter des modifications à un fichier PDF, ET a ÉCHOUÉ HORRIBLEMENT.
Le document PDF d'origine est toujours là, intacte. C'est ce Lecteur vous montre, et ce que vous obtenez lorsque vous enregistrez le document PDF. J'ai piraté le tout après le premier %%EOF dans un éditeur hexadécimal, et le fichier était bien.
Voici donc la mise en page de votre NON-OK, pdf:
So far So good. Voici où les choses se corsent
La seule bonne chose à propos de cet article est la startxref valeur.
Problèmes:
La fin de ce fichier est composé d'une partie d'un comprimé, j'imagine) flux... mais sans le dictionnaire au début nous dire quels filtres son aide et combien de temps il est (pour ne rien dire de toutes les données manquantes), vous ne pouvez pas faire quelque chose avec elle.
Je soupçonne que quelqu'un a essayé de reconstruire complètement ce fichier PDF, puis accidentellement écrit l'original 70kb sur le début de leur version. Kaboom.
Il semblerait que Adobe est simplement ignorer le mauvais ajouté changements. iText pourrait le faire aussi, mais si vous le pouvez:
Quand iText ne parvient pas à ouvrir un fichier PDF:
1. Recherche en arrière par l'intermédiaire du fichier à la recherche de la deuxième à la dernière
%%EOF
. Ignorer l'un à la fin, nous voulons que l'état précédent du fichier.2. Supprimer tout ce qui est après le 2e-dernière
%%EOF
(le cas échéant), et essayez de l'ouvrir à nouveau.Le plus triste, c'est que ce brisé PDF aurait été complètement différent de l'original de la" 70kb, et puis certains IO erreur a remplacé la première partie du fichier. Peu probable, mais il n'y a aucun moyen d'en être sûr.
Accusé de réception. La vile de pare-feu ici à l'œuvre bloque le téléchargement.
Storer Avez-vous télécharger les fichiers? Voulez-vous moi de partager les fichiers sur un autre site?
Un autre site serait le mieux.... de préférence google docs. Je sais que je peux obtenir à partir d'un travail.
Ok. @Mark Storer . Les nouveaux liens à Google Docs sont PAS-Ok-Version.pdf et OK-Version.pdf
OriginalL'auteur Mark Storer
Considérant qu'ils sont maintenant à la version 5.0, j'imagine que vous voyez un nombre croissant de fichiers Pdf écrite pour la version PDF spécifications que la version de votre iTextSharp ne prend pas en charge. Il peut être temps de faire une mise à jour.
Fichier PDF versions sont presque entièrement une visite de courtoisie. Tout ce qu'un lecteur de PDF ne comprend pas, peut être simplement ignoré.
OriginalL'auteur David
Peut-être que cela va aider quelqu'un...
J'ai eu le code qui a travaillé pendant des années qu'commencé à traîner sur la lecture des signets à partir d'un fichier PDF (contours variables ci-dessous). Il s'est avéré qu'il a cassé lorsque le code a été mis à jour à partir .NET 4.0 .NET 4.5.
Dès que j'ai roulé en arrière .NET 4.0, il a travaillé à nouveau.
Juste pour les notes, les mêmes VS projet d'application web utilise AjaxControlToolkit (à partir de NuGet). Avant j'ai roulé en arrière, j'ai aussi mis à jour iTextSharp à ver 5.5.5 et il était toujours sur la même ligne.
OriginalL'auteur Dr. Aaron Dishno
Quand j'ai tirer vers le bas la source et l'exécuter contre le mauvais PDF il y a une exception dans
ReadPdf()
dans le 4èmetry
bloc quand il appelleReadDocObj()
:tokens.StringValue
estj
@Mark Storer, vous êtes le iText mec, donc peut-être que cela signifie quelque chose pour vous.
À partir d'un niveau plus élevé, au moins à mes yeux, il semble que, lorsque
RebuildXref()
est appelé (ce qui je suppose est quand un PDF non valide est lu) il reconstruittrailer
mais pascatalog
. Ce dernier est ce que la loi NRE est de se plaindre. Puis à nouveau, c'est juste une supposition.OriginalL'auteur Chris Haas
Assurez-vous également que votre html ne contient rh, lors de la conversion html vers pdf
OriginalL'auteur panky sharma