[[Vorlage(Getestet, bionic, focal)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] [:Editor: Einen Editor öffnen] }}} [[Inhaltsverzeichnis(2)]] [[Bild(Wiki/Icons/terminal.png, 48, align=left)]] [https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/ pdftk] {en} (kurz für PDF toolkit) ist ein plattformübergreifendes Werkzeug für die Kommandozeile bzw. [:Terminal#Virtuelle-Konsole:Konsole], mit dem man [:PDF:]-Dateien manipulieren kann. pdftk ist eine Portierung der Open-Source-Bibliothek [wikipedia:iText:]. Das Programm wurde von Sid Steward entwickelt und steht unter der [https://www.gnu.org/licenses/gpl-2.0.html GPLv2]-Lizenz {en}. Die Funktionalität von pdftk umfasst: * das Zusammenfügen und Teilen von PDF-Dokumenten * das Drehen von PDF-Dokumenten * das Einbinden von Wasserzeichen in PDF-Dokumente * das Abfragen und Aktualisieren der Metadaten einer PDF-Datei * das Ausfüllen von PDF-Formularen * die Ver- und Entschlüsselung von PDF-Dokumenten * die Komprimierung und Dekomprimierung von PDF-Dokumenten * das Anfügen von Dateien als Anlage an PDF-Dokumente Mit [:PDF_Chain:] gibt es eine grafische Oberfläche für das Programm, die seit Ubuntu 18.04 nicht mehr in den offiziellen Paketquellen enthalten ist. = Installation = pdftk ist - außer für Ubuntu [:18.04:] - in den offiziellen Paketquellen enthalten. Es muss folgendes Paket installiert [1] werden: {{{#!vorlage Paketinstallation pdftk, universe, ab [:18.10:] als virtuelles Paket, bereitgestellt durch '''pdftk-java''' }}} Unter Ubuntu 18.04 kann pdftk mit [:snap:] installiert werden[2] {{{#!vorlage Befehl sudo snap install pdftk }}} Allerdings kann diese Version nicht auf das Verzeichnis '''/tmp''' zugreifen, was z.B. für Anwendungen wie [:gscan2pdf:] oder [:pdfocr:] sinnvoll ist. Abhilfe schafft die Installation von '''pdftk-java''' aus dem [:PPA:] [https://launchpad.net/~malteworld/+archive/ubuntu/ppa/+packages ppa:malteworld/ppa] {en}. = Bedienung = == Aufruf == pdftk wird im Terminal [2] mit folgendem Befehl aufgerufen: {{{#!vorlage Befehl pdftk EINGABEDATEI OPERATION OPTION output AUSGABEDATEI PASSWORT RECHTEOPTION }}} == Operationen == `pdftk` kennt folgende Operationsoptionen: {{{#!vorlage Tabelle Operationen von `pdftk` +++ Option Beschreibung +++ `attach_files` Anhängen von Dateien an ein PDF-Dokument +++ `background` Einfügen eines Wasserzeichens +++ `burst` Zerlegung eines PDF-Dokuments in Einzelseiten +++ `cat` Zusammenfügung von Einzeldokumenten zu einem neuen Gesamt-Dokument +++ `dump_data` Ausgabe von Informationen zum PDF-Dokument auf der [:Shell/Umleitungen#stdin-stdout-stderr-Kanaele-der-Bash:Standardausgabe] +++ `dump_data_fields` Ausgabe von Informationen zu Formularfeldern eines PDF-Dokument auf der Standardausgabe +++ `fill_form` Ausfüllen von PDF-Formularen (oder Verbindung von Formulardaten mit Dokument) +++ `update_info` Aktualisierung der Metadaten (wie Titel, Autor, Datum der Erstellung) einer PDF-Datei }}} Weitere Optionen sind der [:man:Manpage] zu entnehmen. == Rechteoptionen == pdftk kann folgende Rechte eines PDF-Dokuments verändern: {{{#!vorlage Tabelle Berechtigungen eines PDF-Dokuments +++ Option Beschreibung +++ `AllFeatures` Nutzer hat alle (hier im Artikel nachfolgend genannten) Rechte zur Änderung +++ `Assembly` Zusammenfügen mit anderen Dokumenten erlaubt +++ `CopyContents` Kopieren von Textpassagen und Bildern aus dem Dokument erlaubt (Option `ScreenReaders` ist hiermit auch abgedeckt) +++ `DegradedPrinting` Drucken nur in eingeschränkter Qualität erlaubt +++ `FillIn` Formular-Ausfüllung erlaubt +++ `ModifyAnnotations` Änderung der Anmerkungen erlaubt +++ `ModifyContents` Änderung der Dokumenteninhalte erlaubt +++ `Printing` Drucken in bestmöglicher Qualität erlaubt +++ `ScreenReaders` Textzugriff für [wikipedia:Screenreader:] (d.h. Sprachausgabeprogramme) }}} = Beispiele = == Seiten aus einem PDF-Dokument entfernen == Mit folgendem Befehl werden die erste Seite eines Dokuments '''datei.pdf''' sowie alle Seiten ab der 11. Seite mit Ausnahme der 15. Seite entfernt und die verbleibenden Seiten (Seiten 2 bis 10 sowie 15 der Ursprungsdatei) in der Datei '''Dokument.pdf''' gespeichert: {{{#!vorlage Befehl pdftk datei.pdf cat 2-10 15 output Dokument.pdf }}} Praktisch gibt man also an, welche Seiten im Dokument verbleiben sollen. == Seiten in einem PDF-Dokument vertauschen == Mit folgendem Befehl wird die Position der Seiten 7 bis 8 eines Dokuments '''datei.pdf''' mit derjenigen der Seiten 15 bis 16 getauscht und das neue Dokument als Datei '''Dokument.pdf''' gespeichert: {{{#!vorlage Befehl pdftk datei.pdf cat 1-6 15-16 9-14 7-8 17-end output Dokument.pdf }}} == PDF-Dokumente zusammenfügen == Mit dem folgenden Befehl werden die Dateien '''datei1.pdf''', '''datei2.pdf''' und '''datei3.pdf''' zum neuen Dokument '''datei123.pdf''' zusammengefügt: {{{#!vorlage Befehl pdftk datei1.pdf datei2.pdf datei3.pdf cat output datei123.pdf }}} Mit dem folgenden Befehl werden alle PDF-Dateien im aktuellen Verzeichnis nacheinander zur Datei '''zusammen.pdf''' zusammengefügt: {{{#!vorlage Befehl pdftk *.pdf cat output zusammen.pdf }}} Bitte hier darauf achten, dass die Reihenfolge den jeweiligen Dateinamen bzw. deren Sortierung entspricht. Mit dem folgenden Befehl werden die Seiten 1 bis 7 des Dokuments '''datei1.pdf''' und die Seiten 1 bis 5 des Dokuments '''datei2.pdf''' sowie anschließend noch die 8. Seite von '''datei1.pdf''' zur Datei '''zusammen.pdf''' zusammengefügt: {{{#!vorlage Befehl pdftk A=datei1.pdf B=datei2.pdf cat A1-7 B1-5 A8 output zusammen.pdf }}} {{{#!vorlage Hinweis Sogenannte „Handles“, hier A und B, erlauben es, mehrere Arbeitsschritte in einem Befehl zu verknüpfen. Im obigen Beispiel ist das eine Extraktion (der Seiten) und die anschließende Verknüpfung der extrahierten Seiten. }}} == PDF-Dokumente zerlegen == Zur Zerlegung eines Dokuments in seine Einzelseiten dient die Option `burst`: {{{#!vorlage Befehl pdftk langesdokument.pdf burst }}} Hierbei ist zu beachten, dass sich aus einer Anwendung des Befehls auf Dokumente mit vielen Seiten viele Einzelseiten mit Dateinamen `pg_X.pdf` (`X`=Seitennummer) ergeben. Es empfiehlt sich daher, mit der Option `output` ein Zielverzeichnis für die extrahierten Seiten festzulegen: {{{#!vorlage Befehl pdftk langesdokument.pdf burst output ~/Dokumente/Zielverzeichnis/Seite_%03d.pdf }}} Der Dateiname `Seite_%03d.pdf` bedeutet konkret: Der Name jeder Einzelseite beginnt mit „Seite_“, gefolgt von der Seitenzahl in Dezimaldarstellung (`d`) und 3 Stellen (`3`); fehlende Ziffern werden mit Nullen (0) aufgefüllt. == PDF-Dokumente drehen == === Um 90 Grad drehen === Mit dem folgenden Befehl wird das Dokument '''datei.pdf''' um 90 Grad gedreht und als '''dokument90.pdf''' gespeichert: {{{#!vorlage Befehl pdftk datei.pdf cat 1-endE output dokument90.pdf }}} Hinter dem `cat` wird angegeben, welche Seiten gedreht werden sollen. Im Beispiel sind das die Seiten `1-end`, also alle. Das `E` zeigt die Drehrichtung an: es steht für `E` wie „east“ (Osten), also 90 Grad im Uhrzeigersinn (dementsprechend steht `S` für „south“, also 180 Grad, und `W` für „west“, also 270 Grad). Seit Version 1.45 von pdftk muss die Drehrichtung ausgeschrieben werden. Ab Ubuntu 13.10 lautet der Befehl also {{{#!vorlage Befehl pdftk datei.pdf cat 1-endeast output dokument90.pdf }}} === Um 180 Grad drehen === Mit dem folgenden Befehl wird das Dokument '''datei.pdf''' um 180 Grad gedreht und als '''dokument180.pdf''' gespeichert: {{{#!vorlage Befehl pdftk datei.pdf cat 1-endsouth output dokument180.pdf }}} === Um 270 Grad drehen === Mit dem folgenden Befehl wird das Dokument '''datei.pdf''' um 270 Grad gedreht und als '''dokument270.pdf''' gespeichert: {{{#!vorlage Befehl pdftk datei.pdf cat 1-endwest output dokument270.pdf }}} === Ausgewählte Seiten eines Dokuments drehen === Mit dem folgenden Befehl werden nur die Seiten 7 bis 10 des Dokuments '''datei.pdf''' um 180 Grad gedreht und als '''dokument180_7-10.pdf''' gespeichert: {{{#!vorlage Befehl pdftk datei.pdf cat 1-6 7-10south 11-end output dokument180_7-10.pdf.pdf }}} Die Seiten 1 bis 6 und 11 bis Ende werden nicht gedreht, müssen aber – ohne Drehoption – angegeben werden, da sie sonst nicht in das Enddokument aufgenommen werden. == Metadaten anzeigen und editieren == Mit Hilfe der Option `dump_data` werden die Metadaten eines Dokuments angezeigt. Dazu zählen beispielsweise Informationen zur Anwendung, mit das PDF-Dokument erstellt wurde, Angaben zur verwendeten PDF-Version, Rechte (siehe unten) etc. Im folgenden Beispiel werden die Metadaten des Dokuments '''latexbeamer.pdf''' in die Datei '''info.txt''' geschrieben: {{{#!vorlage Befehl pdftk latexbeamer.pdf dump_data output info.txt }}} Das ergibt folgenden Inhalt der Datei '''info.txt''': {{{#!vorlage Befehl cat info.txt }}} {{{ InfoKey: Creator InfoValue: LaTeX with beamer class version 3.06 InfoKey: Title InfoValue: LaTeX slides with beamer - So much better than PowerPoint InfoKey: Producer InfoValue: pdfeTeX-1.304 InfoKey: Author InfoValue: Sylvia Blaho InfoKey: PTEX.Fullbanner InfoValue: This is pdfeTeX, Version 3.141592-1.30.4-2.2 (Web2C 7.5.5) kpathsea version 3.5.5 InfoKey: CreationDate InfoValue: D:20061103083529+01'00' (…) }}} Die so erzeugte Datei '''info.txt''' kann nun in einem Editor [3] manuell verändert werden. Anschließend können die Änderungen durch folgenden Befehl in das Dokument '''latexbeamer_neu.pdf''' übertragen werden: {{{#!vorlage Befehl pdftk latexbeamer.pdf update_info info.txt output latexbeamer_neu.pdf }}} == Metadaten aus mehreren PDFs gleichzeitig entfernen == Selbst erzeugte PDFs enthalten oft unbeabsichtigt private Daten wie den vollen Namen des Benutzers in den Metadaten. Dies sollte man bedenken, bevor man solche PDFs veröffentlicht. Mit einem [:Shell/Bash-Skripting-Guide_für_Anfänger:Shellscript] kann man mit Hilfe der Funktionen `dump_data` und `update_info` sehr einfach Metadaten aus mehreren PDFs gleichzeitig entfernen. Ein Beispielskript hierfür ist: {{{#!code bash #!/bin/bash # pdf-metadaten-leeren.sh © michael_squire (ubuntuusers.de) 2013-01-18 # Lizenz: Creative Commons Namensnennung 3.0 Unported # Hilfetext: siehe letzte 12 Zeilen dieses Skripts # Hilfetext ausgeben (letzte 12 Zeilen dieses Skripts) falls Skript irrtümlicherweise mit Parametern gestartet wurde: if [ $1 ]; then sed -e :a -e '$q;N;13,$D;ba' $0; exit 127; fi if [ -f ./*.pdf ] ; then mkdir ./temp # Temporäres Verzeichnis erzeugen if [ ! -d ./PDFs-ohne-Metadaten ] ; then mkdir ./PDFs-ohne-Metadaten; fi # Zielverzeichnis erzeugen, falls nicht schon vorhanden cp ./*.pdf ./PDFs-ohne-Metadaten # alle PDFs des aktuellen Verzeichnis ins Zielverzeichnis kopieren echo ... Kopiere PDFs in den Ordner `pwd`"/PDFs-ohne-Metadaten/" ... else echo pdf-metadaten-leeren.sh: Keine PDFs im aktuellen Verzeichnis `pwd` gefunden rm -r ./temp 2>/dev/null # Temporäre Daten löschen exit 1 fi # Zur Verarbeitung der Dateinamen werden vorübergehend die Leerzeichen in den Dateinamen durch Unterstriche ersetzt: for DATEI in ./PDFs-ohne-Metadaten/*.pdf; do rename "s/ /_/g" "$DATEI" 2>/dev/null; done for i in $( find ./PDFs-ohne-Metadaten -type f -name "*.pdf" ); # Dateiname wird in Variable i geschrieben do DATEINAME=`basename $i` DATEINAME_MIT_LEERZEICHEN=`echo $DATEINAME | sed -e "s/_/ /g"` cp --remove-destination ./PDFs-ohne-Metadaten/$DATEINAME ./temp/temp.pdf # Datei zur Verarbeitung ins temporäre Verzeichnis kopieren # Temporäre Datei mit leeren Metadaten für das aktuell verarbeitete PDF erzeugen (die echo-Konstruktion bewirkt mehrere Zeilen ähnlich einem "here document"): ( echo InfoKey: Author; echo InfoValue:; echo InfoKey: Company; echo InfoValue:; echo InfoKey: CreationDate; echo InfoValue:; echo InfoKey: Creator; echo InfoValue:; echo InfoKey: ModDate; echo InfoValue:; echo InfoKey: Producer; echo InfoValue:; echo InfoKey: SourceModified; echo InfoValue:; echo InfoKey: Title; echo InfoValue: $DATEINAME_MIT_LEERZEICHEN ) > ./temp/blank-metadata.txt pdftk ./temp/temp.pdf update_info ./temp/blank-metadata.txt output $i 2>/dev/null # Geänderte Metadaten ins kopierte PDF und in Datei schreiben echo ... Leere Metadaten für Kopie von $DATEINAME_MIT_LEERZEICHEN ... # Feedback an die Kommandozeile done # Leerzeichen in Dateinamen wiederherstellen: for DATEI in ./PDFs-ohne-Metadaten/*.pdf; do rename "s/_/ /g" "$DATEI" 2>/dev/null; done unset i DATEINAME DATEINAME_MIT_LEERZEICHEN DATEI # Variablen löschen rm -r ./temp # Temporäre Daten löschen exit 0 # Hilfetext: pdf-metadaten-leeren.sh: Bitte ohne Parameter starten Anleitung: Dieses Skript ins Verzeichnis der PDFs kopieren und dort ausführen. Verwendung: ./pdf-metadaten-leeren.sh Dieses Skript kopiert alle PDFs des aktuellen Ordners in einen Unterordner ./PDFs-ohne-Metadaten/ und entfernt mit pdftk die Metadaten dieser Kopien. Der Titel ("Title") in den Metadaten wird jeweils durch den Dateinamen ersetzt. Die Originaldateien werden nicht verändert. }}} Man kopiert obigen Code in einen Texteditor und speichert die Datei unter dem Namen '''pdf-metadaten-leeren.sh'''. Alternativ lädt man sich das Skript [[Anhang(pdf-metadaten-leeren.sh)]] {dl} aus dem Anhang dieses Artikels herunter. Dann macht man das Skript [:chmod:ausführbar] und kopiert man das nun fertige Skript in den Ordner, der die PDFs enthält, deren Metadaten man entfernen möchte. Im Terminal öffnet man diesen Ordner und startet das Skript mit {{{#!vorlage Befehl ./pdf-metadaten-leeren.sh }}} Das Skript legt einen neuen Unterordner '''PDFs-ohne-Metadaten''' an, in welchem es gleichnamige Kopien aller PDFs mit leeren Metadaten anlegt, nur "Title" in den Metadaten wird durch den Dateinamen ersetzt. Die Originaldateien werden nicht verändert. Anmerkung: Dieses Skript kann nur Dateinamen ohne Leerzeichen verarbeiten, die Dateien müssen die Endung .pdf haben. == Verschlüsselung von PDF-Dokumenten == Eine Datei '''dokument.pdf''' wird mit dem folgenden Befehl verschlüsselt. Es werden im Beispiel sowohl ein Passwort für den Rechteinhaber als auch ein Benutzerpasswort vergeben: {{{#!vorlage Befehl pdftk dokument.pdf output verschluesselt.pdf owner_pw PASSWORTINHABER user_pw PASSWORTNUTZER }}} Mit den am Schluss des Befehls angehängten Optionen `encrypt_40bit` oder `encrypt_128bit` lässt sich zusätzlich die Verschlüsselungsstärke bestimmen. == Nutzerrechte ändern == Für PDF-Dateien können bestimmte [:pdftk#Rechteoptionen:Rechteoptionen] gesetzt werden. Im folgenden Beispiel ist dem Nutzer das Verändern der Anmerkungen sowie das Drucken der Datei erlaubt, Letzteres allerdings nur in eingeschränkter Qualität: {{{#!vorlage Befehl pdftk datei_alt.pdf output datei_neu.pdf owner_pw PASSWORTINHABER user_pw PASSWORTNUTZER allow DegradedPrinting ModifyAnnotations }}} == Formulare ausfüllen == Mit Hilfe einer Datei im [iawm::][https://web.archive.org/web/20170101202617/http://www.adobe.com/de/support/toptech/acrobat/325874/ FDF-Format] {de} lassen sich Formulare in PDF-Dokumenten ausfüllen. Mit Hilfe des folgenden Befehls wird aus dem Dokument '''Formular.pdf''' eine FDF-Datei '''formulardaten.fdf''' erzeugt: {{{#!vorlage Befehl pdftk Formular.pdf generate_fdf output formulardaten.fdf }}} Diese Datei kann nun in einem Editor [3] manuell editiert werden; `T` bezeichnet dabei den Titel, `V` den Wert eines Formularfeldes. Liegt eine modifizierte FDF-Datei vor (im Beispiel: '''formulardaten.fdf'''), kann sie mit folgendem Befehl mit dem Dokument '''Formular.pdf''' verbunden werden, so dass sich die ausgefüllte Datei '''Dokument.pdf''' ergibt: {{{#!vorlage Befehl pdftk Formular.pdf fill_form formulardaten.fdf output Dokument.pdf }}} Mit der Option `flatten` wird ein Formular erzeugt, das nicht mehr editierbar ist: {{{#!vorlage Befehl pdftk Formular.pdf fill_form formulardaten.fdf output Dokument.pdf flatten }}} == Wasserzeichen einfügen == Um ein Wasserzeichen einzufügen, muss die Datei, die als Wasserzeichen dienen soll, im PDF-Format vorliegen (idealerweise im gleichen Format wie das Zieldokument). Wenn die Wasserzeichen-Datei nicht im gleichen Format vorliegt, skaliert sie pdftk. Mit dem folgenden Befehl wird die Datei '''wasserzeichen.pdf''' als Wasserzeichen in die Datei '''beispiel.pdf''' eingefügt und die so produzierte Datei als '''dokument.pdf''' ausgeben: {{{#!vorlage Befehl pdftk beispiel.pdf background wasserzeichen.pdf output dokument.pdf }}} == Ein PDF-Dokument als "digitales Briefpapier" nutzen == Mit der Option `multistamp` wird ein Dokument '''stamp.pdf''' mehrfach auf ein Dokument '''input.pdf''' gestempelt. Die beiden Dateien müssen dabei nicht die gleiche Seitenzahl haben: wenn '''stamp.pdf''' länger ist als '''input.pdf''', so werden "überzählige" Seiten von '''stamp.pdf''' ignoriert; sollte '''stamp.pdf''' kürzer sein als '''input.pdf''', so wird die letzte Seite von '''stamp.pdf''' so oft wiederholt, bis das Ende von '''input.pdf''' erreicht ist. Mit dem folgenden Befehl wird das Dokument '''brieftext.pdf''' mit dem 2-seitigen Briefpapier '''briefpapier.pdf''' - bestehend aus Briefbogen und abweichender Folgeseite - "gestempelt" und als '''brief.pdf''' ausgegeben. Das Ergebnis ist ein Brief dessen erste Seite auf dem Briefbogen gedruckt ist und die Seiten 2 ff. -falls vorhanden- auf der Folgeseite. {{{#!vorlage Befehl pdftk brieftext.pdf multistamp briefpapier.pdf output brief.pdf }}} = Links = * [https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/ Homepage] {en} * [https://www.pdflabs.com/docs/pdftk-cli-examples/ Pdftk Examples] {en} – Beispiele * [http://www.lagotzki.de/pdftk/ Deutsche Übersetzung der pdftk-Hilfe] {de} – Übersicht der Funktionen und Anleitungen * [wikipedia_en:Pdftk:pdftk] * [https://maketecheasier.com/manipulate-pdfs-with-pdf-chain/2011/04/15 How To Manipulate PDFs with PDF Chain (Linux)] {en} – Blogbeitrag 04/2011 * [http://www.freiesmagazin.de/mobil/freiesMagazin-2009-03-bilder.html#09_03_pdftk Kurztipp: Bastelstunde mit Pdftk] {de} – Artikel freiesMagazin 03/2009 * [https://www.linux-user.de/ausgabe/2005/08/068-pdftk/ PDFs ausgereizt] {de} – Artikel LinuxUser, 08/2005 * [:PDF:] {Übersicht} Übersichtsartikel #tag: Büro, PDF, Shell