Warum Zeichen ID 160 wird nicht als Unicode in PDFMiner erkannt?

Ich konvertiere .pdf-Dateien in .xml-Dateien mit PDFMiner .

Für jedes Wort in der .pdf-Datei prüft PDFMiner, ob es Unicode ist oder nicht (unter vielen anderen Dingen). Wenn es ist, gibt es das Zeichen zurück, wenn es nicht ist, es hebt eine Ausnahme und gibt die Zeichenfolge "(cid:% d)" wo% d ist die Zeichen-ID, die ich denke, ist die Unicode-Dezimalzahl.

Dies ist in der Bearbeitung Teil dieser Frage gut erklärt: Was ist das (cid: 51) in der Ausgabe von pdf2txt? . Ich melde den Code hier zur Bequemlichkeit:

def render_char(self, matrix, font, fontsize, scaling, rise, cid): try: text = font.to_unichr(cid) assert isinstance(text, unicode), text except PDFUnicodeNotDefined: text = self.handle_undefined_char(font, cid) def handle_undefined_char(self, font, cid): if self.debug: print >>sys.stderr, 'undefined: %r, %r' % (font, cid) return '(cid:%d)' % cid 

Ich bekomme normalerweise diese Ausnahme für .pdf-Dateien, die in kyrillisch geschrieben wurden. Allerdings gibt es eine Datei, die einfaches Englisch verwendet und wo bekomme ich diese Ausnahme für nicht brechende Räume (die cid = 160 haben). Ich verstehe nicht, warum dieser Charakter nicht als Unicode erkannt wird, während alle anderen in der gleichen Datei sind.

Wenn ich im selben Umfeld isinstance(u'160', unicode) in der Konsole bin, bekomme ich True , während ein (scheinbar) gleichwertiger Befehl False zurückgibt, wenn er in PDFMiner läuft.

Wenn ich debugge, sehe ich, dass die Schrift richtig erkannt wird, dh ich bekomme:

 cid = 160 font = <PDFType1Font: basefont='Helvetica'> 

PDFMiner akzeptiert den Codec als Parameter. Ich habe gewählt utf-8, die 160 als Unicode Dezimal für non breaking space ( http://dev.networkerror.org/utf8/ ) hat.

Wenn es helfen könnte, hier ist der Code für to_unichr:

 def to_unichr(self, cid): if self.unicode_map: try: return self.unicode_map.get_unichr(cid) except KeyError: pass try: return self.cid2unicode[cid] except KeyError: raise PDFUnicodeNotDefined(None, cid) 

Gibt es eine Möglichkeit, die vom Code erkannte Zeichenkarte zu setzen / zu ändern?

Was denkst du, ich sollte mich ändern, oder wo denkst du, sollte ich untersuchen, damit cid = 160 nicht die Ausnahme aufhebt?

One Solution collect form web for “Warum Zeichen ID 160 wird nicht als Unicode in PDFMiner erkannt?”

Die Schriftart in Frage im Beispieldokument ist eine einfache Schriftart und verwendet WinAnsiEncoding . Diese Codierung ist in der PDF-Spezifikation ISO 32000-1 als eine von vier speziellen Codierungen in einer Tabelle in Anhang D.2 Latin Character Set und Encodings definiert . Diese Tabelle enthält keinen Eintrag für 240 (= Dezimal 160. Die Tabelleneinträge werden als oktale Zahlen angegeben!) In der Spalte WIN .

Diese Tabelle wird als ENCODING Array in latin_enc.py extrahiert und aus diesen Array-Maps für diese vier Codierungen werden in encodingdb.py generiert , die dann verwendet werden, zB für Schriften mit dieser Codierung, cf PDFSimpleFont in pdffont.py .

Somit wird der Code 160 von PdfMiner nicht erkannt, da er in WinAnsiEncoding irgendwelche zugehörigen Zeichen hat . Das verursacht dein Problem.


Nur auf den Tisch schauen, der richtig scheint, aber wenn man die Notizen unter dem Tisch liest, findet man:

  1. Das SPACE-Zeichen wird auch als 312 in MacRomanEncoding und als 240 in WinAnsiEncoding codiert . Dieser doppelte Code bedeutet einen nicht brechenden Raum; Es muss typografisch gleich sein wie (U + 003A) SPACE.

Dies scheint von der Entwicklung von PdfMiner übersehen worden zu sein.

Diese Aufsicht könnte durch Hinzufügen eines zweiten Eintrags für space behoben werden

 ('nbspace', None, 202, 160, None) 

Zum ENCODING Array (mit Dezimalzahlen); Wenn Sie es vorziehen, möchten Sie stattdessen space verwenden.

(Ich sage vielleicht, weil ich nicht in Python-Programmierung bin und daher nicht überprüfen kann, vor allem nicht für unerwünschte Nebenwirkungen.)

  • Python, Encoding Ausgabe an UTF-8
  • Ist Django doppelkodiert eine Unicode (utf-8?) String?
  • Verarbeiten von nicht-englischen Text
  • Drucken auf UTF-8 codierte Datei mit plattformabhängigen Zeilenumbrüchen?
  • Url decodiert UTF-8 in Python
  • Python 3 CSV-Datei, die UnicodeDecodeError: 'utf-8' Codec kann nicht decode Byte Fehler, wenn ich drucken
  • Probleme beim Schreiben von gekratzten Daten in csv mit slawischen Zeichen (UnicodeEncodeError & TypeError)
  • Wie kann ich utf-8 Inhalte in einer urllib2-Anfrage senden?
  • UTF-8 und os.listdir ()
  • Überprüfen Sie auf gültige utf8 Zeichenfolge in Python
  • Weird Zeichen beim Lesen von Datei Inhalt
  • Python ist die beste Programmiersprache der Welt.