Eine kleine Sammlung kleiner Python Skripte zum Umgang mit PDF-Dateien. Ich bin kein Python-Entwickler und die Skripte sind weit weg von optimiert und können wahrscheinlich auch besser geschrieben werden, aber sie werden ihrem Zweck gerecht. Fühlt euch frei sie auf eigene Gefahr zu verwenden und zu modifizieren.
Getestet sind die Skripte mit der Python Version 3.9.13 und der PyPDF2 Version 3.0.1
Eingabe-Datei jeglicher Befehle, anstatt der merge.py, ist hier stets pages.pdf
und zuzüglich werden die Metadaten oder auch Dokumenteninformationen aus der originalen Datei kopiert.
Eigenständige Skripte sind:
Beim exportieren eines Word-Dokumentes in eine PDF-Datei sind Probleme aufgetreten. Das erste war, dass in Verzeichnissen eine falsche Referenz zu Beschriftungen in Textfeldern. Word erstellt hier einen Action-Link statt einem Destination-Link. Nachzulesen in der PDF Spezifikation 1.7 auf der Seite 622 Tabelle 8.24 oder auch Kapitel 8.4.5 Unterkapitel "Link Annotations". Ein weiteres Problem war, dass augenscheinlich zufällig Quellen ganz ohen Referenzen gerendered werden.
Beim Verwenden jeglicher Befehle dieses Skriptes wird die Datei wird als result-an.pdf
ausgegeben.
foo@bar:~$ python annotation.py -fa
Aufgerufen wird dabei die Datei fixActionsIntoDest.py. Dort werden alle Seiten durchgegangen und nach solchen Action-Links gesucht und versucht zu beheben. Wenne in Action-Link gefunden wurde, dann wird die Beschreibung der Abbildung / Tabelle ausgegeben und danach die Seitenzahl, auf welche die jeweilige Abbildung / Tabelle gefunden wurde. Wenn mehrere Seiten gefunden wurden, dann wird der Nutzer dazu aufgefordert die richtige Seite zu wählen.
foo@bar:~$ python annotation.py -fs [-y] <Literaturverzeichnis>
Aufgerufen wird dabei die Datei fixSourceReferences.py. Der Parameter -y
kann verwendet werden, um jeder Frage automatisch zuzustimmen. Als Literaturverzeichnis soll dessen Seitenzahl angegeben werden. Wenn das Literaturverzeichnis mehrere Seiten umfasst, dann ist die erste Seite anzugeben. Dort werden alle Seiten bis zum Literaturverzeichnis durchgegangen und versucht Quellenverweise zu finden, über denen noch kein Destination-Link steht. Danach wird das Literaturverzeichnis und maximal die 5 folgenden Seiten durchgegangen und alle Quellen indiziert. Danach wird versucht allen Quellenverweisen die zugehörige Quelle zuzuordnen. In die Konsole wird zu jeder Seite die Quellenverweise ausgegeben, welche noch nicht verlinkt sind, wenn auf der jeweiligen Seite solche existieren. Danach wird gefragt, ob der Benutzer fortfahren will. Wenn er zustimmt, werden die Quellen wie beschrieben indiziert und noch einmal die Frage gestellt. Nach dem zustimmen werden die Destination-Links generiert und die Datei gespeichert. Um das Rechteck einer Quelle zu bestimmen wird diese über die Schriftart die Breite berechnet. Die bisherige Logik umfasst nur TrueType
Schriftarten.
foo@bar:~$ python annotation.py -f [-n] <Literaturverzeichnis>
Hiermit können beide Befehl mit einmal benutzt werden. Der Parameter -n
wird verwendet, um den Fragen nicht automatisch zuzustimmen. Das nicht benutzen des Parameters ist mit dem Nutzen des Parameters -y
gleichzusetzen. Das Literaturverzeichnis ist wie im vorherigen Kapiteln beschrieben anzugeben. Zuerst werden hierbei die Verzeichnisse und dann die Quellen gefixt. Hierbei wird nicht zwischengespeichert, sondern der PDFWriter
übernommen.
Mit diesem Skript können Lesezeichen in die PDF-Datei eingefügt werden. Hierfür werden keine zusätzlichen Argumente im Befehl benötigt.
foo@bar:~$ python bookmarks.py
Als Eingabe wird die Datei bookmarks.json
verwendet, worin die Lesezeichen definiert werden. Das oberste Element muss dabei eine Array sein. In der Array müssen Objects nach folgender Struktur sein:
{
"name": "Einleitung",
"page": 1
}
Solch ein Object ist mit einem Kapitel zu vergleichen. Um dabei Unterkapitel einzufügen, kann der Eintrag sub
hinzugefügt werden. Dem ist eine Array zuzuordnen, welche wiederum die oben beschriebenen Objects enthalten muss. Dies kann wie folgt aussehen:
{
"name": "Einleitung",
"page": 1,
"sub": [
{
"name": "Unterkapitel 1",
"page": 3
},
{
"name": "Unterkapitel 2",
"page": 5
}
]
}
Diese können wiederum einen sub
haben und so weiter. In diesem Skript werden ebenfalls automatisch Nummerierung hinzugefügt. Dadurch wird die Einleitung
zu 1 Einleitung
und Unterkapitel 1
zu 1.1 Unterkapitel 1
und Unterkapitel 2
zu 1.2 Unterkapitel 2
. Das Resultat wird als result-bm.pdf
ausgegeben.
Hiermit kann aus der PDF-Datei nur bestimmte Seiten extrahiert werden. Der Befehl hierfür ist:
foo@bar:~$ python certain_pages.py <Seite>...
Seiten werden mit der Seitenzahl angegeben. Um mehrere Seiten zu umfassen wird die Startseite und Endseite mit einem Bindestrich verbunden. Bspw. wenn die Seiten 5 bis 10 und Seite 12 extrahiert werden soll sieht der Befehl wie folgt aus:
foo@bar:~$ python certain_pages.py 5-10 12
Dieser Befehl fügt alle PDF-Dateien des Ordners zusammen. Die Reihenfolge wird nach den Namen der Dateien bestimmt. Ratsam hierbei ist die Dateien zu nummerieren. Sollte die Nummerierung dabei 10 oder größer erreichen müssen die Zahlen unter 10 mit einer führenden Null geschrieben werden.
foo@bar:~$ python merge.py