2016-11-15 3 views
0

J'essaie de lire le flux d'apparence d'une annotation PDF, en utilisant iTextSharp, et obtenir le texte du contenu du flux.Comment extraire le contenu du flux d'apparence lorsque les ressources ne sont pas dans le dictionnaire?

J'utilise le code suivant:

public String ExtractAnnotationText(PdfStream xObject) 
     { 
      PdfDictionary resources = xObject.GetAsDict(PdfName.RESOURCES); 
      ITextExtractionStrategy strategy = new LocationTextExtractionStrategy(); 
      PdfContentStreamProcessor processor = new PdfContentStreamProcessor(strategy); 
      byte[] contentByteArray = ContentByteUtils.GetContentBytesFromContentObject(xObject); 
      processor.ProcessContent(contentByteArray, resources); 
      return strategy.GetResultantText(); 
     } 

xObject est extrait du dictionnaire de l'apparence et passé dans comme ceci:

PRStream value = (PRStream)appearancesDictionary.GetAsStream(key); 
String text = ExtractAnnotationText(value); 

Cela fonctionne généralement bien pour obtenir le texte d'apparence d'annotations , mais j'ai trouvé un exemple de FreeTextCallout où xObject n'a pas une clé /Resources, comme indiqué par son hashMap:

[/Type, /XObject] 
[/Subtype, /Form] 
[/FormType, 1] 
[/Length, 71] 
[/Matrix, [1, 0, 0, 1, -28.7103, -643.893]] 
[/BBox, [28.7103, 643.893, 597.85, 751.068]] 
[/Filter, /FlateDecode] 

Dans ce cas, existe-t-il un autre moyen de construire un dictionnaire Resources pour le passer à PdfContentStreamProcessor.ProcessContent()? Ou même une manière différente d'obtenir le texte sans utiliser ProcessContent()?

Répondre

2

Sur cette la spécification PDF déclare:

Un dictionnaire de ressources doit être associée à un flux de contenu dans l'une des façons suivantes:

  • Pour un flux de contenu qui est la valeur de (0 ou un élément d'un tableau correspondant à la valeur de cette entrée), le dictionnaire de ressources doit être désigné par les du dictionnaire de pages ou être hérité ribed sous 7.7.3.4, «Héritage des attributs de page», à partir de certains nœuds ancêtres de l'objet page. Pour les autres flux de contenu, un rédacteur conforme doit inclure une entrée Resources dans le dictionnaire du flux spécifiant le dictionnaire de ressources contenant toutes les ressources utilisées par ce flux de contenu. Cela s'applique aux flux de contenu qui définissent des XObjets de formulaire, des modèles, des polices de type 3 et des annotations.

  • Les fichiers PDF écrits en respectant les versions antérieures de PDF peuvent avoir omis l'entrée Ressources dans toutes les polices XObjects et Type 3 utilisées sur une page. Toutes les ressources référencées à partir de ces formulaires et polices doivent être héritées du dictionnaire de ressources de la page sur laquelle elles sont utilisées. Cette construction est obsolète et ne devrait pas être utilisée par des auteurs conformes.

(section 7.8.3 - Dictionnaires de ressources - de l'ISO 32000-1)

Ainsi, l'exemple que vous avez trouvé est soit un cas de cette troisième option, ou l'exemple doit simplement aucune ressource du tout, ou votre fichier d'exemple est simplement cassé.

+0

Probablement un fichier cassé; Le but de mon projet est de prendre les fichiers PDF qui ont été mal construits par Foxit et de les modifier pour qu'ils fonctionnent correctement lorsqu'ils sont rendus dans Adobe Reader. Dans ce cas, je devrai peut-être écrire un analyseur de texte d'apparence alternative. – sigil

+0

* "incorrectement construit par Foxit" * - De quelle façon Foxit construit-il incorrectement pdfs? (Je ne l'ai pas encore utilisé sérieusement ... – mkl

+0

S'il est confirmé que Foxit crée incorrectement des fichiers PDF, il peut être utile de leur envoyer un rapport de bogue. –