Dieses PDF wurde von Abbyy Finereader 10 erstellt:
http://ebooks.zeitr.org/from_abbyy.pdf
Sie können den ersten Satz kopieren und einfügen und erhalten dieses (sehr gute) Textergebnis:
Der »Bund Deutscher Gymnastik-Vertrie« wurde am 20. November 1955 anläßlich einer Zusammenkunft der Leiterinnen und Leiter der privaten deutschen Gymnastik-Ausbildungsstätten.
Nach einiger Verarbeitung mit Ghostscript 9.02 (64-Bit-Windows) erhalte ich diese Datei:
http://ebooks.zeitr.org/after_ghostscript.pdf
Jetzt sieht der erste Satz seltsam aus - vor dem letzten Zeichen jedes Wortes steht ein zusätzliches Leerzeichen.
Der »Bun d Deutsche r GymnastikSchulleiter« wurd eam 20. Novembe r 195 5 anläßlic h eine r Zusammenkunf t der Leiterinne n un d Leite r de r privat n deutsche n GymnastikAusbildungsstätte n gehört.
Dies hat den größten negativen Effekt, dass Sie in Acrobat Reader nicht nach ganzen Wörtern suchen können. Ich kann den Effekt mit dem folgenden minimalen Parametersatz für Ghostscript reproduzieren:
-sDEVICE=pdfwrite ^
-dBATCH ^
-dNOPAUSE ^
-sstdout="myStdOut" ^
-sOutputFile="myDestFile.pdf" ^
mySourceFile.pdf
Irgendwelche Ideen?
quelle
Antworten:
Ich fand das ein interessantes Problem und habe es mir genauer angesehen ...
Zuerst habe ich das
qpdf
Befehlszeilentool verwendet, um PDF-Datenströme zu dekomprimieren, damit ich die Quellcodes beider Dateien besser sehen kann:Wenn ich mir eines der ersten Vorkommnisse ansehe, bei denen ein zusätzliches Leerzeichen eingefügt wird (es ist die ursprüngliche Zeichenfolge "Bund Deutscher Gymnastik-Verwand", die sich in "Bun d Deutsche r GymnastikSchulleiter" verwandelt ), finde ich die folgenden PDF-Schnipsel:
In qdf - from_abbyy.pdf:
In qdf - after_ghostscript.pdf:
Um Ihnen eine kleine Vorstellung davon zu geben, was die hier verwendeten PDF-Grafikoperatoren bedeuten, finden Sie hier eine kurze Liste:
Wie Sie sehen können, hat Ghostscript den ursprünglichen Operator
Tm
( Textmatrix ) durch einen OperatorTd
( Textpunkt verschieben ) ersetzt und einen zusätzlichen hinzugefügt2.16501 0 Td
... Ich weiß nicht, warum dies so ist. Ich werde Ghostscript's Bugzilla [*] einen Fehlerbericht vorlegen und prüfen, ob sie daran interessiert sind, ihn zu lösen.Beachten Sie jedoch, dass dieses Problem nicht auftritt, wenn ich den Linux Acrobat Reader 9.4.2 verwende und die Menüaktion "Datei -> Als Text speichern ..." verwende . In diesem Fall gibt es keine zusätzlichen Leerzeichen (aber einige zusätzliche Zeilenumbrüche). Auch unter Linux ist der Text nicht korrekt durchsuchbar und zeigt auch die zusätzlichen Leerzeichen beim Kopieren und Einfügen an .
[*] Ich werde hier mit der Fehlernummer aktualisieren, wenn ich es getan habe.
Aktualisieren:
Nachdem
Tm
ich ein bisschen mehr über den ersetzten Operator nachgedacht habe, denke ich jetzt, dass dies nicht die Wurzel des Problems sein sollte.Als ich das erkannte, habe ich versucht, die Konvertierung mit Ghostscript v8.71 anstelle von v9.02 durchzuführen. Und was soll ich sagen? Das Copy'n'Paste-Problem tritt bei der Ausgabe von Version 8.71 nicht auf!
Das heißt: In Ghostscript 9.02 gibt es ein Problem, das in 8.71 nicht vorhanden war. Höchstwahrscheinlich hat dies mit den in die Ausgabe-PDF eingebetteten Schriftmetriken zu tun. Da die oben genannten PDF-Snippets in der Ausgabe von Version 8.71 dieselben sind wie in der Ausgabe von Version 9.02 ....
Update 2:
URL des Fehlereintrags in Ghostscript's Bugzilla:
Update 3:
Dieser Fehler scheint inzwischen behoben worden zu sein. Ich sehe es nicht mit den Ghostscript-Versionen, mit denen ich es erneut getestet habe: aktuelles Git (v9.10GIT) oder mit Ghostscript v9.06.
quelle
Wenn Sie eine Seite mit Text in eine PDF-Datei scannen und eine OCR-Anwendung darauf ausführen, wird der Text zur Seite hinzugefügt, der "Textwiedergabemodus" ist jedoch unsichtbar. Es ist da, aber es wird nicht auf dem Bildschirm gerendert (oder auf Papier, wenn es gedruckt wird). Was Sie sehen oder drucken, ist das gescannte Originalbild.
Wie können wir den unsichtbaren Text sichtbar machen?
Nun, wir können das PDF bearbeiten ... Der PDF-Code, um das Rendern von Text auf unsichtbar zu setzen, lautet wie folgt:
Sie können diese Zeichenfolge (noch) weder im Original from_abbyy.pdf noch in from_ghostscript.pdf finden, da Teile der PDFs komprimiert sind. Deshalb dekomprimieren wir sie so weit wie möglich mit Hilfe von
qpdf
:Jetzt können wir die obige Zeichenfolge leicht finden (und es gibt nur ein Vorkommen in jeder Datei).
Lassen Sie uns dies auf einen der sichtbaren Modi der Textwiedergabe umschalten. Insgesamt können wir zwischen diesen 8 Textwiedergabemodi wählen:
Wenn ich den "Füll" -Modus verwende, sieht der Text aus der OCR über dem zugrunde liegenden Scanbild wahrscheinlich nicht so gut aus. Deshalb bevorzuge ich die "Schlaganfall" -Variante. Also wechsle ich einfach über die Zeile, um zu lesen
Wenn ich mir dieses modifizierte PDF anschaue, mag ich es nicht, weil die Standardlinienbreite für meinen Geschmack zu dick ist. Außerdem ist die Farbe des Umrissstrichs schwarz (Standard). Ich würde Rot bevorzugen, um einen Kontrast zu den ursprünglich gescannten Formen zu haben. Deshalb füge ich am Anfang dieser Zeile Code hinzu, der die Zeilenbreite auf einen Viertelpunkt festlegt:
und einige andere, um die Strichfarbe auf Rot zu setzen:
Die komplette Zeile lautet jetzt:
Das ist alles.
Beachten Sie, dass unsere kleine Manipulation die Datei beschädigt hat, da ihr "Inhaltsverzeichnis" (in technischen Begriffen: seine
xref
Tabelle) jetzt nicht mehr gültig ist. Acrobat Reader oder Acrobat Professional öffnen es trotzdem (ohne sich zu beschweren) und "reparieren" den xref-Abschnitt der Datei stillschweigend. Andere PDF-Viewer lehnen die Datei möglicherweise ab, aber im Moment ist es uns egal ...Hier sind Screenshots des Ergebnisses: (Der erste Screenshot wird auf Fensterbreite gezoomt.) (Der zweite Screenshot wird auf 800% gezoomt.)
Die roten Umrisse sind der gescannte Text, der jetzt so sichtbar gemacht wird, wie wir es wollten.
Ich habe das gleiche Verfahren wie oben für beide Dateien aus_abbyy.pdf und after_ghostscript.pdf beschrieben . Ich habe beide Ergebnisse in 2 verschiedenen Instanzen von Acrobat Reader geöffnet. Wenn wir beide auf den gleichen Wert zoomen lassen und beide Fenster maximieren, ist es einfach, die Ansicht zwischen beiden Dateien über umzuschalten
[alt]+[tab]
. Dies ist eine gute Möglichkeit, selbst die feinsten Rendering-Unterschiede zwischen zwei PDF-Dateien aufzudecken.Mein Ergebnis ist: Es gibt nicht einmal ein einziges Pixel, das sich zwischen der Eingabe von Ghostscript (v9.02) und der Ausgabe für diese Datei unterscheidet. Aber es gibt einen großen Unterschied, ob Sie Text kopieren und einfügen möchten ...
quelle
Ich sehe das beschriebene Problem nicht. Ich habe die After-PDF-Datei mit Acrobat Professional 9.0 geöffnet und der Text wird korrekt kopiert und eingefügt.
Ghostscript interpretiert die PDF-Datei vollständig und erstellt eine neue PDF-Datei basierend auf der Interpretation. Es hat keine Beziehung zur Originaldatei, außer dass die Position des Textes aufgezeichnet wird.
Aufgrund des umfangreichen PDF-Funktionsumfangs können Zeichen mithilfe mehrerer verschiedener Methoden an derselben Stelle positioniert werden. Es ist also nichts Falsches oder Unerwartetes an sich, wie GS die PDF-Datei erstellt.
Da der Text korrekt gespeichert werden kann, muss die Acrobat-Heuristik entscheiden, ob zwei Zeichen in der Nähe nebeneinander liegen oder ein Leerzeichen dazwischen haben, wenn sie als aufeinanderfolgendes ASCII behandelt werden.
Ich glaube nicht, dass das Problem die eingebetteten Schriftmetriken sein können, aus dem einfachen Grund, dass die Schrift nicht eingebettet ist :-) Die verwendete Schrift ist Helvetica, die nicht in das Dokument eingebettet ist, und daher Acrobat (zumindest für mich) verwendet ArialMT. Beachten Sie, dass die 'ursprüngliche' PDF-Datei auch keine Schriftarten enthält.
Ich werde mir irgendwann den gemeldeten Fehler ansehen, aber es wird nicht bald sein und ich bezweifle, dass wir etwas dagegen tun können (oder werden). Es scheint mir, dass dies eine unvermeidliche Folge der Heuristik ist. Es könnte jedoch hilfreich sein, die Schriftarten einzubetten, damit sie zumindest konsistent sind.
quelle
Aus dem Ghostscript-Fehlerbericht unter:
http://bugs.ghostscript.com/show_bug.cgi?id=692206
Ich konnte das Problem jetzt reproduzieren und es handelt sich nicht um eine Regression von 8.71, sondern um eine Weiterentwicklung (und eine Adobe-Änderung).
8.71 wurde mit einem Fehler ausgeliefert, der dazu führte, dass ungültige ToUnicode-CMaps geschrieben wurden. Irreführende und widersprüchliche Adobe-Dokumentation führte dazu, dass die CMap als CMap geschrieben wurde, obwohl ToUnicode CMaps ihre eigenen, inkompatiblen Regeln haben.
ToUnicode CMaps werden normalerweise nur zum Suchen und Kopieren / Einfügen verwendet. Wie der Name schon sagt, werden sie verwendet, um Zeichencodes Unicode-Codepunkten zuzuordnen. Das ToUnicode CMap in der 8.71 PDF-Datei wird nicht verwendet, da es ungültig ist, das in späteren Versionen gültig ist und Acrobat es bekanntermaßen verwendet.
Es scheint, dass in Acrobat Reader bis einschließlich 9.2 das Vorhandensein der ToUnicode-Daten keinen Unterschied macht. Irgendwann nach 9.2 wurde der Suchmechanismus geändert, und Acrobat scheint zwei verschiedene Mechanismen zu verwenden, je nachdem, ob eine ToUnicode-CMap vorhanden ist. Ich habe nach 9.2 keinen Zugriff auf Acrobat Pro und habe Reader X erst kürzlich installiert. Ich habe nichts dazwischen.
Die Methode "kein Unicode" funktioniert in allen Versionen von Acrobat, die Methode "Unicode" schlägt in neueren Versionen fehl.
Ich habe dies durch weißen Abstand zum Verweis auf die ToUnicode CMap aus dem FontDescriptor gezeigt. Bei Bedarf kann ich die verschiedenen Dateien zur Verfügung stellen, aber sie sind groß, da sie dekomprimiert werden.
Da die Suche in PDF eine heuristische Anstrengung ist, kann kein Ergebnis garantiert werden. Die Änderung des Verhaltens ist auf Acrobat zurückzuführen, nicht auf Ghostscript, und die Änderung in Ghostscript diente dazu, einen echten Fehler zu beheben, also einen Fortschritt, keine Regression.
quelle
Um zu überprüfen, ob dieses Problem mit der 'Einbettung' der Schriftart zusammenhängt oder nicht, habe ich eine weitere Konvertierung unter Linux durchgeführt. Ich habe diese Befehlszeile verwendet, damit Ghostscript die verwendeten Schriftarten einbettet:
Ghostscript zeigt diese Ausgabe:
Ghostscript hat Schriftarten aus einer Schriftfamilie namens NimbusSanL eingebettet . Also kein ArialMT mehr , wie es von Acrobat Reader als Ersatz für die fehlende Helvetica zum Rendern auf dem Bildschirm verwendet wurde (siehe auch Kommentare von user701996 oben). Beachten Sie, dass Ghostscript diese Schriftart in Helvetica umbenennt, sobald sie eingebettet ist. Aber das ist kein Problem, denn NimbusSanL wurde als Klon von Helvetica erstellt ...
Selbst für diese Ausgabe-PDF-Datei funktioniert Copy'n'Paste aus Acrobat Reader nicht. Trotz der Tatsache, dass Reader ArialMT nicht mehr als Ersatz für Helvetica verwenden muss. Der Reader verwendet jetzt den eingebetteten NimbusSanL / Helvetica-Klon.
Bisher haben wir diese Fakten zum Kopieren und Übertragen von Text von Acrobat Reader oder Acrobat Professional ermittelt:
Dies gilt sowohl für GS unter Windows XP als auch für GS unter Linux.
Die Ausgabe von Ghostscript v8.71 funktioniert für diese Datei gut genug.
Dies gilt sowohl für GS unter Windows XP als auch für GS unter Linux.
Selbst für Ausgaben, bei denen Copy'n'Paste fehlerhaft ist, funktioniert Save as Text ....
Ich verstehe immer noch nicht, warum dies der Fall sein sollte. Aber es sieht eindeutig nach einer Art (vielleicht geringfügigen) Regression von Ghostscript auf dem Weg von Version 8.71 bis 9.02 aus.
Probieren wir jetzt eine andere PDF-Viewer-Software mit den 'kritischen' PDFs aus:
Beachten Sie, dass es noch andere, aber sehr geringfügige Unterschiede zwischen allen "funktionierenden" PDF-Readern gibt, bei denen mein Urteil " Copy'n'Paste" war . Zum Beispiel ein fehlender Bindestrich hier oder einige doppelte Leerzeichen zwischen den Wörtern dort und andere solche Dinge ... Ich habe derzeit keine Erklärung, warum dies so ist, aber wahrscheinlich ist es die gleiche Grundursache, warum es die große Lücke zwischen Adobe-Produkten gibt (die keine funktionierende Kopie und keine Paste für diese Datei haben) eine die eine nicht hatte und "der Rest der Welt" auf der anderen.
quelle