3 votes

Comprendre les encodages des PDFs en R

Je suis actuellement en train de récupérer des données textuelles à partir de plusieurs PDF en utilisant la fonction readPDF() dans le package tm. Tout fonctionne très bien et dans la plupart des cas, l'encodage semble être "latin1" - dans certains cas, cependant, ce n'est pas le cas. Existe-t-il un moyen efficace en R de vérifier les encodages de caractères ? J'ai trouvé les fonctions is.utf8() et is.local() dans le package tau mais cela ne me permet évidemment d'aller que jusqu'à un certain point.

Merci.

1voto

Kurt Pfeifle Points 24491

La spécification PDF définit ces encodages pour les polices simples (chacune pouvant inclure un maximum de 256 formes de caractères) pour le texte latin qui devrait être prédéfini dans tout lecteur conforme:

  • /EncodageStandard
    (pour les polices de texte latin Type 1, mais pas pour les polices TrueType)
  • /MacRomanEncoding
    (encodage standard du Mac OS, pour les polices TrueType et Type1)
  • /PDFDocEncoding
    (utilisé uniquement pour les chaînes de texte en dehors des flux de contenu du document; normalement non utilisé pour afficher du texte à partir de polices)
  • /WinAnsiEncoding
    (encodage de la page de codes Windows 1252, pour les polices TrueType et Type1)
  • /MacExpertEncoding
    (le nom est trompeur - l'encodage n'est pas spécifique à une plate-forme; cependant, seulement quelques polices ont un jeu de caractères approprié pour utiliser cet encodage)

Ensuite, il existe 2 encodages spécifiques pour les polices de symboles:

  • Encodage de Symbole
  • Encodage ZapfDingBats

De plus, les polices peuvent avoir des encodages intégrés, qui peuvent dévier de toute façon souhaitée par leur créateur d'un encodage standard (par exemple aussi utilisé pour l'encodage des différences lorsque les polices standard intégrées sont partielles).

Donc, pour interpréter correctement un fichier PDF, vous devrez rechercher chacun des encodages de police utilisés, et vous devrez prendre en compte tout /Encodage utilisant un tableau /Differences aussi.

Cependant, la tâche globale reste assez simple pour les polices simples. Le programme de visualisation PDF doit simplement mapper 1:1 "chaque octet que je vois censé représenter une chaîne de texte" à "exactement un glyphe à dessiner que je peux rechercher dans la table d'encodage".


Pour les polices composite, CID-keyed (qui peuvent contenir des milliers de formes de caractères), la correspondance/décodage pour le programme de visualisation pour "c'est la séquence d'octets que je vois que je suis censé dessiner comme du texte" à "c'est la séquence de formes de glyphe à dessiner" n'est plus 1:1. Ici, une séquence de un ou plusieurs octets doit être décodée pour sélectionner chaque un glyphe depuis le CIDFont.

Et pour aider ce décodage CIDFont, il doit y avoir des structures CMap. Les CMaps définissent des correspondances des encodages Unicode vers des collections de caractères. La spécification PDF définit au moins 5 douzaines de CMaps - et leurs noms standard - pour les polices de langues chinoise, japonaise et coréenne. Ces CMaps prédéfinis n'ont pas besoin d'être intégrés dans le PDF (mais le lecteur PDF conforme doit savoir comment les traiter correctement). Mais il existe (bien sûr) aussi des CMaps personnalisés qui peuvent avoir été générés 'à la volée' lorsque l'application créatrice de PDF a écrit le PDF. Dans ce cas, la CMap doit être intégrée dans le fichier PDF.

Tous les détails sur ces complexités sont définis dans la spécification officielle PDF-1.7.

1voto

Kurt Pfeifle Points 24491

Je ne connais pas grand-chose à R. Mais j'ai maintenant examiné un peu CRAN, pour voir ce que les paquets mentionnés tm et tau sont.

Donc tm est pour le text mining, et pour la lecture de PDF, il nécessite et dépend de l'utilitaire pdftotext de Poppler. J'avais d'abord l'impression [évidemment fausse] que votre fonction readPDF() mentionnée faisait un accès bas niveau aux objets PDF directement dans le fichier PDF... Que j'avais tort! Il s'avère qu'il ne 'regarde que' la sortie texte de l'outil en ligne de commande pdftotext.

Cela explique pourquoi vous ne réussirez probablement pas à lire les PDF qui utilisent des encodages de police plus complexes que le 'simple' Latin1.

Je crains que la raison de votre problème soit que pour l'instant Poppler et pdftotext ne sont tout simplement pas capables de gérer cela.

Peut-être seriez-vous mieux loti de demander aux responsables de tm une demande de fonctionnalité :       :-)

  • que vous aimeriez qu'ils essaient + ajoutent un support à leur paquet tm pour un outil d'extraction de texte PDF tiers plus performant, tel que le TET de PDFlib.com (version en anglais) qui est certainement le meilleur utilitaire d'extraction de texte sur la planète (mieux que les propres outils d'Adobe, d'ailleurs).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X