2017-04-18 2 views
-2

J'ai un problème avec cups-PDF en créant des documents PDF où les caractères sont mappés sur des symboles étranges [sur Ubuntu Linux 14.04 et 16.04}. Je pense que c'est une sorte d'Unicode même si Python me dit son type de chaîne. type(object) python renvoie "string"remappage des caractères PDF en texte lisible

Pas de différence si je récupère le texte du PDF via le copier-coller de la souris à partir de evince/Firefox ou via le module Python PDFminer. Donc, c'est vrai, le PDF a brisé les informations de texte qui est rendu correct sur le document PDF lui-même. Je ne le savais pas, mais le texte et le texte sur un document PDF ne semblent pas très liés.

Quand je fais copier du texte de ce document PDF créé par exemple le nom de « Raphaël » se transforme en "✡✍✑✒✍☛✓" de sorte que chaque caractère cartes pour "✡=R ✍=a ✑=p ✒=h ✍=a ☛=e ✓=l"

Un autre exemple est la suivante: "Devel" se transforme en "✭☛✮☛✓"

Comment puis-je écrire une fonction en Python qui déplace cette "mauvaise" information vers la bonne? Sur le document PDF, tout est parfaitement lisible.

Cela a quelque chose à faire avec cups-PDF en utilisant postscript pour créer le PDF, mais ne pas ajouter les informations de police/caractère correct au document.

Si la lettre 'l' est toujours le symbole '✓' qui est ce checkmark unicode character

Comment puis-je faire remap des personnages dans cette étrange représentation pour corriger la représentation en Python? Alors, comment puis-je changer ou remapper le symbole '✓' à la lettre 'l'? Une idée?

Pourquoi j'en ai besoin? Je dois rechercher une valeur de texte dans ce document.

+0

Oui, le PDF semble utiliser une police spécialisée pour empêcher la copie. Le texte est * brouillé *, tout comme les lettres de la police. Donc si 'a' une fois a été mappé au code de code Unicode U + 0061, le PDF a remplacé tous ces a avec U + 270D à la place, et la police spéciale a remplacé le glyphe normal" WRITING HAND "par la lettre a. C'est un chiffrage de substitution. –

+0

Vous avez raison Martijn Pieters est unicode "U + 270D", comment puis-je désembrouiller ce texte? Comment puis-je mapper ces lettres à leur valeur d'origine? a qui est maintenant "U + 270D" à "U + 0061"? Y at-il une fonction Python? –

Répondre

0

Le fichier PDF semble utiliser une police spécialisée pour empêcher la copie. Le texte est brouillé, mais il en va de même pour les lettres de la police. Donc si a a été une fois mappée au code de code Unicode U + 0061, le PDF a remplacé tous ces a avec U + 270D à la place, et la police spéciale a remplacé le glyphe normal "WRITING HAND" par la lettre a. En d'autres termes, il utilise un substitution cypher.

Vous devrez déchiffrer ceci comme n'importe quel autre chiffrement de substitution: vous devez créer un mappage inverse du code codé au point de code non chiffré. Vous pouvez utiliser le PDF comme guide. en tant qu'homme, vous pouvez facilement lire le texte réel, et vous pouvez également voir comment il se rapporte aux codes codés Unicode.

Par exemple, nous savons que U + 270D cartes à U + 0061:

>>> hex(ord('✍')) 
'0x270d' 
>>> hex(ord('a')) 
'0x61' 

parce que lorsque vous copiez un a du PDF, vous avez obtenu le 270d codepoint à la place. Construisez simplement une table pour le reste de l'alphabet. Cela peut sembler beaucoup de travail manuel, mais vous avez déjà le texte en clair. Imaginez ne pas savoir ce que le texte contient (par ex.vous n'aviez que les symboles qui copient le texte); Ensuite, vous devrez d'abord effectuer une cryptanalyse complète (pour un chiffre de substitution, prendre un langage spécifique et compter les symboles, chaque langue a une distribution de fréquence typique pour ses lettres et une telle distribution peut souvent être mise en correspondance dans un texte crypté pour revenir aux lettres originales). En théorie, vous devriez pouvoir extraire la police spécialisée, puis l'analyser pour produire une table de traduction. Cela nécessiterait une certaine forme de vision par ordinateur; l'ordinateur ne saura pas facilement que le raster de pixels ou la série de lignes vectorielles forment une lettre spécifique. Pour environ 70 points de code (majuscules, minuscules, chiffres, un peu de ponctuation) il sera probablement plus facile de créer la table à la main.

Une fois que vous avez une table, Python peut faire la traduction pour vous; J'ai pris vos indices et créé une table partielle pour seulement ces lettres:

mapping = { 
    0x270d: 'a', 
    0x261b: 'e', 
    0x2712: 'h', 
    0x2713: 'l', 
    0x2711: 'p', 
    0x272e: 'v', 

    0x272d: 'D', 
    0x2721: 'R', 
} 

print(encrypted.translate(mapping)) 

Tout ce que vous devez faire est de remplir les correspondances restantes; le str.translate() method s'occupera ensuite du reste.

Démo en utilisant le tableau ci-dessus partielle sur vos échantillons échantillons de texte crypté:

>>> print("✡✍✑✒✍☛✓".translate(mapping)) 
Raphael 
>>> print("✭☛✮☛✓".translate(mapping)) 
Devel 
+0

Grandes instructions détaillées. Peut-être que je peux rejoindre mon mariage samedi. Sans votre aide je ne pourrais pas le faire à temps. - Merci beaucoup - je vais essayer ceci avec Python2.7 et répondre rapidement! –

+0

@MisterWong: assurez-vous d'utiliser une chaîne 'unicode' alors; les méthodes 'str.translate()' et 'unicode.translate()' diffèrent dans la signature. Le code ci-dessus fonctionne pour Python 3 et pour Python 2 'unicode.translate()'. –