2017-04-18 2 views
-2

Ich habe ein Problem aufgrund cups-PDF erstellen PDF-Dokumente, wo Zeichen auf seltsame Symbole [auf Ubuntu Linux 14.04 und 16.04} zugeordnet werden. Ich denke, es ist eine Art Unicode, selbst wenn Python mir seinen String-Typ sagt. type(object)"string"remap verschlüsselte PDF-Zeichen in lesbaren Text

Kein Unterschied, wenn ich den Text aus der PDF via Mouse kopieren Einfügen von evince/Firefox oder über Python PDFminer Modul. So ist es wahr, das PDF hat Textinformationen gebrochen, die auf PDF-Dokument selbst korrekt wiedergegeben werden. Ich wusste das nicht, aber Text und Textgrafik im PDF-Dokument scheinen eng miteinander verbunden zu sein.

Wenn ich Text kopiere aus solchen erstellte PDF-Dokument mit gutem Beispiel den Namen „Raphael“ verwandelt sich in "✡✍✑✒✍☛✓" so jedes einzelne Zeichen zuordnet "✡=R ✍=a ✑=p ✒=h ✍=a ☛=e ✓=l"

Ein weiteres Beispiel ist: "Devel" verwandelt sich in "✭☛✮☛✓"

Wie kann ich eine Funktion in Python schreiben, die diese "falsche" Information in die richtige umwandelt? Auf dem PDF-Dokument ist alles perfekt lesbar.

Dies hat etwas todo mit cups-PDF mit Postscript zum Erstellen der PDF, aber nicht das Hinzufügen der richtigen Schriftart/Zeicheninformationen zum Dokument.

Wenn der Brief 'l' ist immer das Symbol '✓', die dieses checkmark unicode character

ist Wie kann ich eine remap der Charaktere in dieser seltsamen Darstellung tun, um die korrekte Darstellung in Python? Wie kann ich also das Symbol '✓' in den Buchstaben 'l' verschieben oder neu zuordnen? Irgendeine Idee?

Warum brauche ich das? Ich muss in diesen Dokumenten nach einem Textwert suchen.

+0

Ja, die PDF zu sein scheint mit einer speziellen Schriftart Kopieren zu verhindern. Der Text ist * verschlüsselt *, aber auch die Buchstaben in der Schriftart. Wenn also "a" einmal dem Unicode-Codepunkt U + 0061 zugeordnet wurde, hat die PDF-Datei stattdessen all diese a-Zeichen durch U + 270D ersetzt, und die spezielle Schriftart hat das normale Zeichen "WRITING HAND" durch den Buchstaben a ersetzt. Es ist eine Ersatz-Chiffre. –

+0

Sie haben Recht Martijn Pieters a entspricht Unicode "U + 270D", wie kann ich diesen Text entschlüsseln? Wie ordne ich diese Buchstaben auf ihren ursprünglichen Wert zurück? a was ist jetzt "U + 270D" zurück zu "U + 0061"? Gibt es irgendeine Python-Funktion? –

Antwort

0

Die PDF scheint eine spezielle Schriftart zu verwenden, um das Kopieren zu verhindern. Der Text ist verschlüsselt, aber so sind die Buchstaben in der Schriftart. Wenn also a einmal dem Unicode-Codepunkt U + 0061 zugeordnet wurde, hat die PDF-Datei stattdessen all diese a-Zeichen durch U + 270D ersetzt, und die spezielle Schriftart ersetzt das normale Zeichen "WRITING HAND" durch den Buchstaben a.

Mit anderen Worten, es verwendet eine substitution cypher.

Sie müssen diese wie jede andere Substitutionsziffer entschlüsseln: Sie müssen eine umgekehrte Zuordnung vom verschlüsselten Codepunkt zum unverschlüsselten Codepunkt erstellen. Sie können das PDF als Richtlinie verwenden. Als Mensch kann man leicht den tatsächlichen Text lesen, und man kann auch sehen, wie er sich auf die kopierten Unicode-Codepunkte bezieht.

Zum Beispiel wissen wir, dass U + 270D auf U Karten + 0061:

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

, denn wenn man ein a aus dem PDF zu kopieren, Sie bekamen die 270d Codepoint statt. Erstellen Sie einfach eine Tabelle für den Rest des Alphabets. Das hört sich nach viel Handarbeit an, aber Sie haben bereits den Klartext. Stellen Sie sich vor, nicht zu wissen, was der Text enthält (z.Sie hatten nur die Symbole, die das Kopieren des Textes erzeugt); dann müssten Sie zuerst eine vollständige Kryptoanalyse durchführen (für eine Ersatzziffer, eine bestimmte Sprache annehmen und Symbole zählen, jede Sprache hat eine typische Häufigkeitsverteilung für ihre Buchstaben und eine solche Verteilung kann oft in einem verschlüsselten Textkörper abgeglichen werden um zu den ursprünglichen Buchstaben zurück zu mappen).

Theoretisch sollten Sie in der Lage sein, die spezialisierte Schriftart zu extrahieren und diese dann zu analysieren, um eine Übersetzungstabelle zu erstellen. Dies würde jedoch irgendeine Form von Computer Vision erfordern; Der Computer wird nicht leicht erkennen, dass das Raster von Pixeln oder eine Reihe von Vektorlinien einen bestimmten Buchstaben bilden. Für ungefähr 70 Codepoints (Großbuchstaben, Kleinbuchstaben, Ziffern, einige Satzzeichen) ist es wahrscheinlich einfacher, die Tabelle nur von Hand zu erstellen.

Sobald Sie eine Tabelle haben, kann Python die Übersetzung für Sie tun; Ich habe Ihre Hinweise und schaffte eine Teiltabelle für nur diese Buchstaben:

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

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

print(encrypted.translate(mapping)) 

Alles, was Sie tun müssen, ist in den verbleibenden Zuordnungen zu füllen; Die str.translate() method kümmert sich dann um den Rest.

Demo der vorstehende Teiltabelle auf Ihrer Probe verschlüsselte Textproben unter Verwendung von:

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

Großartige und detaillierte Anweisungen. Vielleicht kann ich mich jetzt am Samstag meiner Hochzeit anschließen. Ohne deine Hilfe könnte ich es nicht rechtzeitig schaffen. - Vielen Dank - ich werde das mit Python2.7 versuchen und bald antworten! –

+0

@MisterWong: stellen Sie sicher, dass Sie eine "Unicode" Zeichenfolge verwenden, dann; Die Methoden 'str.translate()' und 'unicode.translate()' unterscheiden sich in der Signatur. Der obige Code funktioniert für Python 3 und für Python 2 'unicode.translate()'. –