Home / LinuxUser / 2012 / 02 / In PDF- und PS-Dateien suchen

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Eingedost
(161 Punkte bei 4 Stimmen)
Aufteiler
(161 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.

AA_PO-21061_Fotolia_ErwinWodicka.jpg

© Erwin Wodicka, Fotolia

Suchen und Finden

In PDF- und PS-Dateien suchen

19.01.2012 Postscript und PDF erzeugen kann jeder – darin suchen ist schon etwas schwieriger. Wir zeigen, welche Werkzeuge zum Erfolg verhelfen.

Daten nach bestimmten Inhalten zu durchsuchen und die Ergebnisse zu filtern, gehört zu den Aktivitäten, die im Alltag am häufigsten vorkommen. Für versierte Linux-Nutzer zählen die Grep-Kommandos zu den vertrauten Werkzeugen beim Filtern von Textdaten. Bei PDF und Postscript handelt es sich zwar im weitesten Sinne ebenfalls um Textformate, die jedoch einem spezifischen Schema für den Dokumentaufbau folgen (siehe Kasten "Postscript im Detail" und Kasten "PDF im Detail").

Daher funktioniert die Suche in solchen Dokumenten nicht wie gewohnt. Das ist umso ärgerlicher, als Postscript und PDF zu den Dokumentformaten zählen, die in der IT-Welt mit am häufigsten zum Einsatz kommen – Postscript beispielsweise in der Druckvorstufe und PDF zum Dokumentenaustausch, dem Rechnungswesen und vermehrt in der digitalen Archivierung gemäß PDF/A-1a-Spezifikation [1].

Postscript im Detail

Bei Postscript handelt es sich um eine stackbasierte Programmiersprache [10], welche ein Postscript-Interpreter verarbeitet, den man Raster Image Processor (RIP) nennt. Viele Drucker verfügen über eine separate Platine mit einem Postscript-Controller und können daher Postscript-Dokumente direkt verarbeiten und ausdrucken.

Hinter Druckerverwaltungen wie lpr und dem Common Unix Printing System (CUPS) stecken Werkzeuge, die die Druckdaten für den Interpreter und das Ausgabesystem über Postscript Printer Descriptions (PPDs) entsprechend aufbereiten. Zur Vorschau der Druckdaten am Bildschirm dient Ghostscript [11]. Für Debian/Ubuntu finden sich CUPS-Filter und -Treiber sowie PPDs im Paket ghostscript-cups, der Software-RIP in den beiden Paketen ghostscript und ghostscript-x.

Der Aufbau einer Postscript-Datei folgt Prinzipien, wie sie auch bei der Programmierung üblich sind (Abbildung 1). So finden sich beispielsweise Variablendefinitionen, Prozeduren und Zuweisungen sowie Konstrukte für Schleifen und Wertevergleiche. Nach dem Vorspann ("Prolog") folgt der eigentliche Inhalt, Script genannt.

Neben Prozedurdefinitionen (%%BeginProcSet) enthält das Script unter anderem auch die Seitengröße (%%BeginSetup). Jede einzelne Seite beginnt mit dem Kommando %%Page. Danach folgen die Anweisungen für das Positionieren und Zeichnen der Grafik- und Textobjekte auf der Seite. Den Abschluss des Dokuments bildet ein Abspann. Er beginnt mit %%Trailer und endet mit der Markierung %%EOF ("end of file").

Weitere Details, Kommandos und ausführliche Beispiele zu Postscript beinhaltet das "PostScript Language Cookbook" [12].

Abbildung 1

Abbildung 1: Der Aufbau einer Postscript-Datei.

PDF im Detail

Die Abfolge der Strukturen in PDF und Postscript fallen nahezu identisch aus (siehe [13], S. 62). Ein PDF-Dokument besteht ebenfalls aus vier Abschnitten (Abbildung 2) – dem Vorspann ("Header"), dem Inhalt ("Body"), dem Inhaltsverzeichnis der Objekte ("Cross-reference table") und dem Abspann ("Trailer").

Im Header stehen die Metainformationen zum Dokument, wie etwa die PDF-Version, der Autor, die Schlüsselworte zum Dokumenteninhalt sowie das Programm, mit dem das PDF-Dokument erzeugt wurde. Diese Metainformationen lassen sich mit den beiden Werkzeugen pdfinfo [14] und pdftk [15] auslesen und verändern. Teil 7 dieser Serie [16]) hat sich ausführlich mit diesen Programmen befasst.

Nach dem Header folgt im PDF-Dokument der eigentliche Inhalt ("Body"). Er besteht aus einer Folge von einzelnen Objekten mit Seiten- und Größeninformation, Positionsangaben sowie Text- und Grafikkommandos (genannt "Object Stream"). Um diese Objekte und deren Abfolge in der Darstellung zu bestimmen und einen wahlfreien Zugriff darauf zu ermöglichen, enthält das Dokument ein Inhaltsverzeichnis der einzelnen Objekte (PDF-Kommando xref). Zum Schluss des Dokuments folgt der Abspann, der die Position des Inhaltsverzeichnisses beinhaltet (startxref) und das Ende des PDF-Dokuments markiert (%%eof).

Abbildung 2

Abbildung 2: Der Aufbau einer PDF-Datei.

Suchen in Textdaten

Beim Wiederfinden von Daten anhand einer Suchanfrage handelt es sich um einen recht komplexer Vorgang. Zunächst gilt es den Suchstring – also das Textfragment, nachdem man fahndet – in eine interne Darstellung für den Suchvorgang umzuwandeln, beispielsweise in einen Regulären Ausdruck [2]. Mit dieser modifizierten Anfrage durchsucht ein Algorithmus die Datenmenge und markiert die einzelnen Fundstellen. Vor der Ausgabe des Suchergebnisses erfolgt eine Sortierung der Suchtreffer anhand der Relevanz, meistens beginnend mit der höchsten Übereinstimmung mit dem Suchstring ("absteigende Sortierung"). Mittlerweile gewinnen alternative Darstellungen an Beliebtheit, wie etwa mehrfarbige Ringe und Waben (Abbildung 3) oder Baumstrukturen. Dabei erfolgt eine Kategorisierung der Dokumente anhand der zugehörigen Stichworte.

Abbildung 3

Abbildung 3: Visualisierung eines Suchergebnisses mit dynamischen Waben bei Carrot Search.

Um Postscript- und PDF-Dokumente in die Suche miteinzubeziehen, bedarf es etwas mehr Mühe. Einfache Grep-Kommandos helfen kaum weiter, um das Vorkommen eines Suchstrings in festzustellen. Der Grund dafür liegt in der Art und Weise, wie Postscript und PDF die eigentlichen Inhalte im Dokument abspeichern. Den Ausgangspunkt bildet ein zweidimensionales Koordinatensystem mit dem Nullpunkt in der linken oberen Ecke jeder Seite. Alle Objekte werden mit den entsprechenden X/Y-Koordinaten im Dokument abgelegt und darüber exakt auf der Seite positioniert.

Um ein möglichst perfektes Druckbild zu erreichen, folgen Satzsysteme wie beispielsweise LaTeX den Konventionen aus über 500 Jahren Buchdruck. Beim Umwandeln von LaTeX nach Postscript/PDF werden die Absätze in einzelne Wörter und Buchstaben zerlegt ("bounding boxes"). Feinheiten im Satz, wie etwa Über- und Unterschneidungen der Buchstaben, realisiert das Verfahren über entsprechend verkürzte oder vergrößerte Abstände zwischen den einzelnen Zeichen. Der geometrische Anfang eines Buchstabens wird in die passenden X/Y-Koordinaten umgerechnet.

Postscript und PDF haben gemeinsam, dass die Abfolge der Objekte im Dokument nur einen begrenzten Schluss auf das endgültige Aussehen des Dokuments – das Druckbild – zulässt. Bei Postscript kann man die Positionierungen immerhin noch seitenweise nachzuvollziehen, bei PDF-Dokumenten muss man dazu die einzelnen Elemente des gesamten Object Streams verfolgen.

Dabei dürfen obendrein nachfolgende Objekte vorhergehende wieder überdecken, beispielsweise um eine nachträgliche Schwärzung von Text mit Hilfe eines Balkens zu erreichen. Bei der Anzeige oder dem Ausdruck des Dokuments lassen sich diese Einzelschritte nicht mehr erkennen, da nur die "Draufsicht" erscheint und die einzelnen Ebenen nicht mehr zu sehen sind. Zudem gestattet PDF neben dem Verweis auf externe Daten auch das Einbinden von verkleinerten Vorschaubildern mit unterschiedlichen Auflösungen, Videos, Flash- und Javascript-Elementen sowie komprimierten Daten und Anhängen mit den jeweiligen Referenzen aufeinander.

Finden sich Textfragmente in Form eingebundener Grafiken im Dokument, verhält es sich ähnlich wie bei Webseiten: Zwar kann ein Mensch den Text problemlos erfassen, er lässt sich aber nicht oder nur schwer automatisch von Programmen wie grep verarbeiten. Suchmaschinen versuchen dieses Problem zu lösen, indem bei der Dokumentanalyse zusätzliche Programme zur Texterkennung [3] einbinden. Aus Sicht des Endanwenders steht dieser Aufwand jedoch vielfach nicht im gesunden Verhältnis zum tatsächlichen Nutzen.

Suche in Postscript-Dateien

Für Dateien im Postscript-Format stehen als Betrachter beispielsweise Ghostview, Kghostview, Evince und Okular zur Verfügung. Keines der genannten Werkzeuge ermöglicht bislang eine Suche in den Daten: Menüpunkte zur Recherche gibt es zwar, sie lassen sich aber nicht anwählen.

Um trotzdem ein zumindest ansatzweise brauchbares Ergebnis zu erzielen, bleibt nur der Ausflug auf die Kommandozeile. Hier erweisen sich die Werkzeuge pstotext, ps2ascii und grep als hilfreich. Die Kombination daraus sieht folgendermaßen aus:

$ pstotext Datei.ps | grep --color Suchstring
$ ps2ascii Datei.ps | grep --color Suchstring

Die Kommandos extrahieren den Text aus der Postscript-Datei und schreiben ihn auf die Standardausgabe. Von dort gelangt er über eine Pipe als Eingabe an das Kommando grep, das dann in den Daten nach dem übermittelten Suchstring fahndet. Die Grep-Option --color hebt den Suchtreffer in der Ausgabe farblich hervor und erleichtert so das Auswerten der Trefferliste.

Beide Varianten benötigen wenig Zeit, haben aber den Nachteil, dass sie nur Zeichen im Encoding ISO 8859-1 (Latin-1) zuverlässig auslesen können. Andere Codierungen, wie etwa ISO 8859-15 (Latin-1 mit Euro) oder UTF-8 unterstützen sie nur bedingt. Im Ergebnis zeigt sich das, indem eine Suche nach Fragmenten mit Umlauten maximal Teilergebnisse liefert oder sogar gänzlich fehlschlägt. Im Test kam Ps2ascii etwas besser mit Umlauten zurecht, dafür fehlen Wortzwischenräume und Zeilenumbrüche.

Im Laufe der Recherchen ergab sich eine (wenn auch auf den ersten Blick ungewohnte) Alternative zu Ps2ascii – der Umweg über PDF:

$ ps2pdf Datei.ps
$ pdfgrep Datei.pdf Suchstring

Mit dieser etwas seltsam anmutenden Aufruffolge von Ps2pdf über Pdfgrep gelingt die Suche im Postscript-Dokument.

Tip a friend    Druckansicht Bookmark and Share
Kommentare
Suchen in Farbe
Markus Berlin, Freitag, 20. Januar 2012 09:37:48
Ein/Ausklappen

Vielen Dank für den schönen Artikel! Folgeartikel zu OCR oder auch zu genaueren PDF/PS-Innereien fände ich großartig. :)

Nur zwei Anmerkungen:

(1)

$ for datei in $(ls *.pdf); do pdftotext $datei - | grep --color Suchstring ; done

welchen Vorteil hat das gegenüber:

$ for datei in *.pdf; do pdftotext $datei - | grep --color Suchstring ; done

(2)

"""Da Less die farbliche Hervorhebung der Suchtreffer nicht übernimmt, können Sie dabei die grep-Option --color im Aufruf streichen."""

less übernimmt die Hervorhebung, wenn man ihm die Option "-R" gönnt.

Viele Grüße



Bewertung: 162 Punkte bei 13 Stimmen.
Den Beitrag bewerten: Gut / Schlecht

4248 Hits
Wertung: 206 Punkte (13 Stimmen)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

LinuxUser 05/2014

Aktuelle Ausgabe kaufen:

Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,95 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 60,60) können Sie im Medialinx-Shop bestellen.

Tipp der Woche

Bilder vergleichen mit diffimg
Bilder vergleichen mit diffimg
Tim Schürmann, 01.04.2014 12:40, 1 Kommentare

Das kleine Werkzeug diffimg kann zwei (scheinbar) identische Bilder miteinander vergleichen und die Unterschiede optisch hervorheben. Damit lassen sich nicht nur Rätsel a la „Orignial und Fäls...

Aktuelle Fragen

programm suche
Hans-Joachim Köpke, 13.04.2014 10:43, 8 Antworten
suche noch programme die zu windows gibt, die auch unter linux laufen bzw sich ähneln sozusagen a...
Funknetz (Web-Stick)
Hans-Joachim Köpke, 04.04.2014 07:31, 2 Antworten
Bei Windows7 brauche ich den Stick nur ins USB-Fach schieben dann erkennt Windows7 Automatisch, a...
Ubuntu 13.10 überschreibt immer Windows 8 Bootmanager
Thomas Weiss, 15.03.2014 19:20, 8 Antworten
Hallo Leute, ich hoffe das ich richtig bin. Ich habe einen Dell Insipron 660 Ich möchte gerne Ub...
USB-PTP-Class Kamera wird nicht erkannt (Windows-only)
Wimpy *, 14.03.2014 13:04, 15 Antworten
ich habe meiner Frau eine Digitalkamera, AGFA Optima 103, gekauft und wir sind sehr zufrieden dam...
Treiber
Michael Kristahn, 12.03.2014 08:28, 5 Antworten
Habe mir ein Scanner gebraucht gekauft von Canon CanoScan LiDE 70 kein Treiber wie bekomme ich de...