0

Extrahieren der Gliederung aus einer PDF-Datei

Das Arbeiten mit Gliederungen in PDF-Dateien ist sehr sinnvoll. Zum einen erlauben PDF-Gliederungen das überblicksartige Erfassen der Struktur eines Dokuments und zum anderen ermöglichen sie aufgrund ihrer „Klickbarkeit“ (technisch gesehen handelt es sich bei PDF-Gliederungen um – hierarchisch strukturierte – Links) die schnelle Navigation innerhalb des Dokuments.

Erstellt werden PDF-Gliederungen automatisch durch das Textverarbeitungsprogramm (Microsoft Word, LibreOffice, LATEX etc.) beim Generieren der PDF-Datei. Das händische Erstellen oder Verändern einer PDF-Gliederung erlaubt etwa der (verhältnismäßig günstig zu erwerbende) Reader PDF-Expert.

Bisweilen kann es nötig sein, allein die in einer PDF-Datei enthaltene Gliederung selbst (ohne das PDF-Dokument) weiter zu verarbeiten. So kann etwa ein Bedürfnis bestehen, für sich selbst oder für eine andere Person die PDF-Gliederung als eigenständige PDF-Datei abzuspeichern oder auszudrucken.

Wie aber extrahiert man aus einer bestehenden PDF-Datei deren Gliederung?

Zugriff auf die Metadaten der PDF-Datei mit pdftk

Ein Mittel der Wahl hierzu ist das kostenlos verfügbare PDF Toolkit von PDF Labs. Die hier verwendete Kommandozeilenversion PDFtk Server lässt sich für Windows, MacOS und Linux über deren Website beziehen.

Ist PDFtk installiert und in der Kommandozeile verfügbar, können mit dem Argument dump_data_utf8 die Metadaten der PDF-Datei, zu denen auch die enthaltenen Gliederung zählt, ausgelesen werden. Der Befehl

/opt/pdflabs/pdftk/bin/pdftk /home/Users/`whoami`/Desktop/PDF-Datei.pdf dump_data_utf8 > /tmp/PDF-Gliederung.txt

etwa schreibt die Metadaten in die Datei PDF-Gliederung.txt im Ordner /tmp/. Der Inhalt dieser Datei

InfoBegin
InfoKey: Subject
InfoValue: Eine Untersuchung zu Gehalt und Wirkung des § 852 Abs. 1 ZPO
InfoBegin
InfoKey: Author
InfoValue: Christoph Scheuing
InfoBegin
InfoKey: Keywords
InfoValue: § 852 Abs. 1 ZPO, Pfändungsbeschränkung, Pfändungsverbot, Verwertungsbeschränkung, Verwertungsverbot, Pfändung eines in seiner zwangsweisen Verwertbarkeit aufschiebend bedingten Anspruchs, Gläubigerbenachteiligung durch die Weggabe unpfändbarer Gegenstände
InfoBegin
InfoKey: Title
InfoValue: Der Pflichtteilsanspruch in Zwangsvollstreckung und Insolvenz
PdfID0: 2dde9c335152017eddaafbb5d8e5d067
PdfID1: 2dde9c335152017eddaafbb5d8e5d067
NumberOfPages: 335
BookmarkBegin
BookmarkTitle: Titel
BookmarkLevel: 1
BookmarkPageNumber: 1
BookmarkBegin
BookmarkTitle: Vorwort
BookmarkLevel: 1
BookmarkPageNumber: 7
BookmarkBegin
BookmarkTitle: Inhaltsübersicht
BookmarkLevel: 1
BookmarkPageNumber: 9

umfasst dann zunächst noch mehr Meta-Daten als die eigentlich gewollte PDF-Gliederung. Durch Hinzufügen von | grep Bookmark werden die ausgegebenen Daten auf die Gliederungsdaten reduziert.

/opt/pdflabs/pdftk/bin/pdftk /home/Users/`whoami`/Desktop/PDF-Datei.pdf \
 dump_data_utf8 | grep Bookmark > /tmp/PDF-Gliederung.txt

führt also zu

BookmarkBegin
BookmarkTitle: Titel
BookmarkLevel: 1
BookmarkPageNumber: 1
BookmarkBegin
BookmarkTitle: Vorwort
BookmarkLevel: 1
BookmarkPageNumber: 7
BookmarkBegin
BookmarkTitle: Inhaltsübersicht
BookmarkLevel: 1
BookmarkPageNumber: 9

Weiterverarbeitung der extrahierten Metadaten der PDF-Gliederung

Freilich hat diese Text-Datei noch kein für Menschen leicht erfassbares Format. Um ein solches zu erreichen, bietet sich eine Weiterverarbeitung des Inhalts der Text-Datei mittels einfachen Suchen-und-Ersetzens auf String-Ebene unter Rückgriff auf reguläre Ausdrücke an. Sinnvoll erscheinen dabei zunächst die folgenden Schritte:

  • Löschen der Zeilen mit BookmarkBegin. Der Zeilenumbruch am Ende wird übrigens durch ein \n gekennzeichnet.
  • Entfernen des Textes BookmarkTitle: , BookmarkLevel: und BookmarkPageNumber:.
  • Voranstellen der Zahl der Gliederungstiefe des jeweiligen Gliederungseintrags (zwischen je zwei Doppelpunkte zur späteren Weiterverarbeitung) und Hintanstellen der Seitenzahl des jeweiligen Gliederungseintrags in runden Klammern und mit einem S., also „(S. X)“.

Erreichen lassen sich alle diese Schritte in einem einzigen Perl-Befehl, der etwa so lauten kann:

perl -0 -i -p -e 's/BookmarkBegin\nBookmarkTitle: (.*)\nBookmarkLevel: (\d+)\nBookmarkPageNumber: (\d+)/::\2::\1 (S. \3)/gm' /tmp/PDF-Gliederung.txt

Das ergibt folgenden Inhalt der Text-Datei:

::1::Titel (S. 1)
::1::Vorwort (S. 7)
::1::Inhaltsübersicht (S. 9)
::1::Inhaltsverzeichnis (S. 11)
::1::Abkürzungsverzeichnis (S. 21)
::1::Einleitung (S. 25)
::2::I. Problemstellung (S. 25)
::2::II. Forschungsstand und Zielsetzung (S. 27)
::2::III. Gang der Untersuchung (S. 29)
::1::Erster Teil: Der Pflichtteilsanspruch (S. 32)
::2::§ 1 Die Pflichtteilsansprüche des BGB (S. 32)
::3::I. Überblick (S. 32)
::3::II. Voraussetzungen (S. 34)
::4::1. Pflichtteilsberechtigung (S. 34)
::5::a) Berechtigter Personenkreis (S. 34)

Um die verschiedenen Gliederungsebenen durch verschieden große Einrückungen mit dem Tabulator-Zeichen abzubilden, müssen nun noch die doppelten Doppelpunkte mit der Zahl dazwischen durch die entsprechende Anzahl von Tabulator-Zeichen, das den ASCII-Code \x09 hat, ersetzt werden. Dies geht etwa (wenig elegant, aber leicht nachvollziehbar) so:

perl -i -p -e 's/::1:://g' /tmp/PDF-Gliederung.txt
perl -i -p -e 's/::2::/\x09/g' /tmp/PDF-Gliederung.txt
perl -i -p -e 's/::3::/\x09\x09/g' /tmp/PDF-Gliederung.txt
perl -i -p -e 's/::4::/\x09\x09\x09/g' /tmp/PDF-Gliederung.txt
perl -i -p -e 's/::5::/\x09\x09\x09\x09/g' /tmp/PDF-Gliederung.txt
perl -i -p -e 's/::6::/\x09\x09\x09\x09\x09/g' /tmp/PDF-Gliederung.txt
perl -i -p -e 's/::7::/\x09\x09\x09\x09\x09\x09/g' /tmp/PDF-Gliederung.txt
perl -i -p -e 's/::8::/\x09\x09\x09\x09\x09\x09\x09/g' /tmp/PDF-Gliederung.txt
perl -i -p -e 's/::9::/\x09\x09\x09\x09\x09\x09\x09\x09/g' /tmp/PDF-Gliederung.txt

Dies ergibt dann die folgende Text-Datei:

Titel (S. 1)
Vorwort (S. 7)
Inhaltsübersicht (S. 9)
Inhaltsverzeichnis (S. 11)
Abkürzungsverzeichnis (S. 21)
Einleitung (S. 25)
I. Problemstellung (S. 25)
	II. Forschungsstand und Zielsetzung (S. 27)
	III. Gang der Untersuchung (S. 29)
Erster Teil: Der Pflichtteilsanspruch (S. 32)
	§ 1 Die Pflichtteilsansprüche des BGB (S. 32)
		I. Überblick (S. 32)
		II. Voraussetzungen (S. 34)
			1. Pflichtteilsberechtigung (S. 34)
				a) Berechtigter Personenkreis (S. 34)

Diese Text-Datei kann in einem beliebigen Textverarbeitungsprogramm geöffnet, formatiert und weiterverwendet werden.

Bash-Skript zum Extrahieren der Gliederung aus einer PDF-Datei

Es empfiehlt sich, die verwendeten Befehle in einem Bash-Skript zu nutzen, das als Argument die PDF-Datei erhält, deren Gliederung extrahiert werden soll. Die extrahierte Gliederung soll das Skript dann in einer Text-Datei mit dem Dateinamen der PDF-Datei und der Ergänzung „-Gliederung.txt“ speichern. Das Skript könnte den folgenden Inhalt haben:

#!/bin/sh
var1="$1"
/opt/pdflabs/pdftk/bin/pdftk "$var1" dump_data_utf8 \
 | grep Bookmark > /tmp/PDF-Gliederung.txt
perl -0 -p -i -e 's/BookmarkBegin\nBookmarkTitle: (.*)\nBookmarkLevel: (\d+)\nBookmarkPageNumber: (\d+)/::\2::\1 (S. \3)/gm' /tmp/PDF-Gliederung.txt
perl -p -i -e 's/::1:://g' /tmp/PDF-Gliederung.txt
perl -i -p -e 's/::2::/\x09/g' /tmp/PDF-Gliederung.txt
perl -i -p -e 's/::3::/\x09\x09/g' /tmp/PDF-Gliederung.txt
perl -i -p -e 's/::4::/\x09\x09\x09/g' /tmp/PDF-Gliederung.txt
perl -i -p -e 's/::5::/\x09\x09\x09\x09/g' /tmp/PDF-Gliederung.txt
perl -i -p -e 's/::6::/\x09\x09\x09\x09\x09/g' /tmp/PDF-Gliederung.txt
perl -i -p -e 's/::7::/\x09\x09\x09\x09\x09\x09/g' /tmp/PDF-Gliederung.txt
perl -i -p -e 's/::8::/\x09\x09\x09\x09\x09\x09\x09/g' /tmp/PDF-Gliederung.txt
perl -i -p -e 's/::9::/\x09\x09\x09\x09\x09\x09\x09\x09/g' /tmp/PDF-Gliederung.txt
mv /tmp/PDF-Gliederung.txt "${var1/.pdf/-Gliederung.txt}"

Unter MacOS kann dieses Skript im Automator als Schnellaktion angelegt werden:

Dies ermöglicht es, die PDF-Gliederung einer beliebigen PDF-Datei dadurch zu extrahieren, dass man im Finder mit Rechts auf die PDF-Datei klickt und unter „Dienste“ den Namen der Schnellaktion auswählt. Damit wird in dem Ordner, in dem sich die PDF-Datei befindet, die extrahierte Gliederung als Text-Datei abgelegt.

Schreibe einen Kommentar

Es gelten die üblichen Spielregeln. Der Name wird veröffentlicht, die E-Mail-Adresse nicht. Bitte freundlich und sachbezogen bleiben.