PDF hat nach dem Durchlaufen von Ghostscript in allen Wörtern ein zusätzliches Leerzeichen


10

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?


@Erwin Jurschitza: Würde es Ihnen etwas ausmachen, den Link Ihrer from_abbyy.pdf- Datei für eine Weile beizubehalten , damit sie auch nach einigen Monaten wieder abgerufen werden kann?
Kurt Pfeifle

@pipitas: Kein Problem, es ist auf Amazon S3.

Antworten:


8

Ich fand das ein interessantes Problem und habe es mir genauer angesehen ...

Zuerst habe ich das qpdfBefehlszeilentool verwendet, um PDF-Datenströme zu dekomprimieren, damit ich die Quellcodes beider Dateien besser sehen kann:

qpdf.exe ^
   --qdf ^
     from_abbyy.pdf ^
     qdf--from_abbyy.pdf

qpdf.exe ^
   --qdf ^
     after_ghostscript.pdf ^
     qdf--after_ghostscript.pdf

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:

( Deutsche) Tj
0 Tc
(r) Tj
1 0 0 1 143.236 265.140 Tm     %% Tm = 'text matrix' operator
3.569 Tw
0.706 Tc
( Gymnastik-Schulleite) Tj

In qdf - after_ghostscript.pdf:

( Deutsche)Tj
0 Tc
36.235 0 Td                    %% extra Td = 'move text current point' operator
(r)Tj
2.16501 0 Td                   %% Td = 'move text current point' instead of Tm
3.569 Tw
0.706 Tc
( Gymnastik-Schulleite)Tj

Um Ihnen eine kleine Vorstellung davon zu geben, was die hier verwendeten PDF-Grafikoperatoren bedeuten, finden Sie hier eine kurze Liste:

Tj - show text
Tc - set character spacing
Tm - set text matrix
Tw - set word spacing
Td - move text current point

Wie Sie sehen können, hat Ghostscript den ursprünglichen Operator Tm( Textmatrix ) durch einen Operator Td( Textpunkt verschieben ) ersetzt und einen zusätzlichen hinzugefügt 2.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 Tmich 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.


@pipitas: Vielen Dank für die Analyse!

5

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:

3 Tr

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:

qpdf \
 --qdf \
   from_abbyy.pdf \
   qdf--from_abbyy.pdf

qpdf \
 --qdf \
   after_ghostscript.pdf \
   qdf--after_ghostscript.pdf

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:

 0 -  fill glyph shapes
 1 -  stroke glyph shapes
 2 -  fill, then stroke glyph shapes
 3 -  neither fill nor stroke glyph shapes (invisible)
 4 -  fill and add to path for clipping glyph shapes
 5 -  stroke glyph shapes and add to path for clipping
 6 -  fill, then stroke glyph shapes and add path for clipping
 7 -  add glyph shapes to path for clipping

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

 1 Tr

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:

 .25 w

und einige andere, um die Strichfarbe auf Rot zu setzen:

 1 0 0 RG

Die komplette Zeile lautet jetzt:

 .25 w 1 0 0 RG 1 Tr

Das ist alles.

Beachten Sie, dass unsere kleine Manipulation die Datei beschädigt hat, da ihr "Inhaltsverzeichnis" (in technischen Begriffen: seine xrefTabelle) 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: auf Fensterbreite gezoomt (Der erste Screenshot wird auf Fensterbreite gezoomt.) auf 800% 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 ...


1

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.


@ user701996: Interessant - keine Probleme mit Acrobat Pro 9.0? Mein Acrobat Reader X (10.0.1, Windows) hat das Problem.

@ user701996: Ich habe die Datei in Acrobat Professional 9.4.4 geöffnet. Das Kopieren und Einfügen der After- Datei funktioniert nicht. Als Text speichern ... funktioniert jedoch ....
Kurt Pfeifle

user701996 @: Auch wenn die Schriftart nicht eingebettet ist, Fontmetriken sind . Hmmm, es sei denn, die Schriftart ist eine der 'Base 14' .... In diesem Fall haben Sie vielleicht Recht. Ich werde genauer hinsehen.
Kurt Pfeifle

@ user701996: Du hörst dich an, als wärst du einer der Ghostscript-Leute. Bist du?
Kurt Pfeifle

1

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.


0

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:

gs \
 -o after_ghostscriptonlinux.pdf \
 -sDEVICE=pdfwrite \
 -dPDFSETTINGS=/prepress \
 -sEmbedAllFonts=true \
  from_abbyy.pdf

Ghostscript zeigt diese Ausgabe:

GPL Ghostscript SVN PRE-RELEASE 9.02 (2011-02-07)
Copyright (C) 2010 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
Loading NimbusSanL-Regu font from %rom%Resource/Font/NimbusSanL-Regu... 2776276 1420923 2081124 778943 3 done.
Loading NimbusSanL-ReguItal font from %rom%Resource/Font/NimbusSanL-ReguItal... 2853416 1529123 2137980 831640 3 done.
Loading NimbusSanL-Bold font from %rom%Resource/Font/NimbusSanL-Bold... 2970748 1643508 2194836 886454 3 done.

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:

  • Die Ausgabe von Ghostscript v9.02 funktioniert für diese Datei nicht gut genug.
  • Dies ist der Fall, ob die Schriftart von GS eingebettet ist oder nicht.
  • 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 ist der Fall, ob die Schriftart von GS eingebettet ist oder nicht.
  • 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:

  • Adobe Reader X in Wine unter Linux: copy'n'paste ist wie in Version 9.4.4 b0rken.
  • Evince v2.32.2 unter Linux: Copy'n'Paste funktioniert.
  • PDFXChange Viewer 2.5 (Build 191) unter Windows XP Prof: Copy'n'Paste funktioniert.
  • MuPDF Reader 0.8 unter Linux: Keine Ahnung, wie man kopiert und einfügt - aber die Suche funktioniert einwandfrei.
  • Gefunden s.th. genannt "PDF Viewer 0.1.7" unter Linux: copy'n'paste funktioniert.
  • SumatraPDF v1.5 in Wine unter Linux: Copy'n'Paste funktioniert.
  • SumatraPDF v1.5.1 unter Windows XP: Copy'n'Paste funktioniert.
  • FoxitReader 4.3.1.0113 unter Windows XP: Copy'n'Paste funktioniert.
  • Nitro PDF Reader in Wine unter Linux: Copy'n'Paste funktioniert.

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.