Welcome, Guest. Please login or register.
Did you miss your activation email?

Author Topic: [DE] PDFs in Unterordnern finden und zusammen fassen (mit Lesezeichen)  (Read 22008 times)

Offline 10toe

  • User
  • Posts: 159
Moin!


Ich bin gerade an einem Projekt mit mehreren einseitigen PDFs (>300), die über mehrere Unterverzeichnisse verteilt sind. Diese sollen jetzt automatisiert zusammen gesucht und zu einem einzigen großen Dokument zusammenfasst werden. Dabei soll jede Seite und die vorgefundene Unterordnerstruktur als (hierarchische) Lesezeichen mit in die Metadaten geschrieben werden.


Ich habe schon mal einen bash-Befehl zusammen gebastelt, das die PDFs findet und mergt (Große Freude! Hat jemand Interesse daran?). Was mir jetzt noch fehlt, ist die Möglichkeit automatisiert Lesezeichen in die Metadaten zu schreiben.


Das war, wenn ich es richtig verstanden habe, mit pdftk eigentlich möglich. Da hat man die Metadaten in eine Textdatei extrahieren, verändern und wiedereinpflanzen können. Doch pdftk ist aufgrund von Abhängigkeitsproblemen nicht mehr installierbar... Hat jemand eine Idee oder einen Tipp für eine Alternative oder wo ich weitersuchen könnte?


Viele Grüße!
Hans



Offline 10toe

  • User
  • Posts: 159
Ah, großartig! Mit diesem Paket läuft pdftk endlich wieder. Und das Setzen von verschachtelten Lesezeichen geht auch! Jetzt muss ich nur noch ein Skript basteln, das die Ordnerstruktur ausliest und als Text in die Metainformationen einpflanzt... genau das richtige für die kommenden verregneten Feiertage...


Danke Euch! :-)


Viele Grüße!
Hans

Offline harley-peter

  • User
  • Posts: 1.022
Hallo Hans,

ja ich habe Interesse an deinem Befehl zum Finden und Zusammenbasteln der Dokumente.

Gruß
Peter

Offline 10toe

  • User
  • Posts: 159
Hallo Peter,


gerne! Zum Zusammensuchen aller PDFs aus allen Unterordnern benutze ich folgenden Befehl:


Code: [Select]
find . | grep pdf | grep -v "xoj" | sed 's/ /\\ /g' | { sort; echo "cat output Output.pdf"; } | tr "\n" " " > AllePDFs.txt

Erläuterung:


1. Im Datenstrom zuerst alle pdfs filtern. Alle Einträge werden mit Zeilenumbruch voneinander getrennt.
2. Aus allen Einträgen die xoj-Files entfernen - nur wichtig, falls Du Xournal verwendest...
3. Aus allen Leerzeichen die Zeichenabfolge "/ " umwandeln
4. Alle Einträge alphabetisch sortieren und am Ende des Datenstroms noch "cat output Output.pdf" anfügen - damit der Merge-Befehl für pdftk ausgeführt werden kann.
5. Alle Zeilenumbrüche in Leerzeichen umwandeln.
6. Alles in eine Textdatei hineinschreiben.


Aus dieser Textdatei kopiere ich die riesenlange Zeile zurück in die Bash, in die ich vorher "pdftk" + Leerzeichen getippt habe -> Enter -> Output.pdf wird erstellt.


Punkt 6 ist eine Notlösung, da ich es einfach nicht hinbekommen habe, den Datenstrom auf pdftk zu lenken. Das Problem sind einfach die Leerzeichen: Aus "/ " wird wieder " " gemacht... und damit funktioniert der pdftk-Befehl nicht mehr. Daher der Umstand mit der Txt-Datei und dem Copy/Paste. (Falls jemand einen Tipp parat hat, gerne!)


Mein erstes Bash-Coding, jippie! :-)
Viele Grüße!
Hans


Offline bluelupo

  • User
  • Posts: 2.068
    • BluelupoMe
Hallo zusammen,

nachfolgender Einzeiler findet per find-Kommando, alle PDF's (file Kommando) ab dem aktuellen Verzeichniss und merged alle gefunden PDF's zu einem Dokument per pdftk zusammen, unabhängig ob sich auch noch andere Dateitypen in den Verzeichnissen befinden.

Code: [Select]
$ pdftk $(find . -type f -iname "*" | xargs file | grep -i "pdf document"|awk -F":" '{print $1}') cat output out.pdf
« Last Edit: 2018/12/06, 21:20:48 by bluelupo »

Offline harley-peter

  • User
  • Posts: 1.022
Danke euch beiden für die Befehle.
Ich benutze für das mergen bisher pdfchain als grafisches Tool das pdf Dateien zerlegen und auch wieder zusammensetzen kann. Es hat außerdem den Vorteil dass ich auch noch die Reihenfolge bestimmen kann. Aber wenn ich die Dateien erst zusammen suchen muss sind eure Befehle eine große Hilfe.

Offline 10toe

  • User
  • Posts: 159
Das fertige Skript sieht nun wie folgt aus.


Es sucht sämtliche PDFs in den Unterordnern und fasst sie sortiert zu einem großen Dokument zusammen. Außerdem - und das ist der eigentliche Clou - werden Lesezeichen für jedes Dokument und jeden Unterordner angelegt. Bei meinem Projekt sind es mittlerweile über 300 Dokumente (Mathe-Trainingsbögen) - somit hilft die Baumansicht in dem einklappbaren Lesezeichenverzeichnis unglaublich gut die Übersicht zu bewahren.


Ich muss ergänzen, dass der Algorithmus für das Anfertigen der Lesezeichen hier nicht universell, sondern auf das mir vorliegendene Projekt zugeschnitten ist (ausschließlich einseitige PDFs, ausschließlich Unterordner in drei Ebenen). Aber vielleicht dient das Skript dennoch dem einen oder anderen als Inspiration. Falls wirklich jemand Interesse hat, es für sein Projekt umzuschreiben, helfe ich gerne - so weit ich kann - weiter.


Viele Grüße und an bluelupo und hendrikL nochmals danke für die Hilfe! :-)
Hans


Code: [Select]

 #!/bin/bash
 


### SCHRITT 1: Alle PDFs in den Unterverzeichnissen zu einer PDF mergen -> Dump_Output.pdf


#Ausgabe
echo -n "1. PDFs suchen und zusammenfassen... "


find . | grep pdf | grep -v "xoj" | sed 's/ /\\ /g' | sort > Dump_AllePDFs.txt


while read line
do
    AllePDFsAlsArray+=("$line")
done < Dump_AllePDFs.txt


pdftk "${AllePDFsAlsArray[@]}" cat output Dump_Output.pdf


#Ausgabe
echo "fertig"




### SCHRITT 2: Eine Liste in txt-Form für die Lesezeichen erstellen -> Dump_ListeFuerLesezeichen.txt




#Ausgabe
echo -n "2. Liste für die Lesezeichen erstellen... "


find . | grep pdf | grep -v "xoj" | grep -v "Dump_Output" | sed 's/\.pdf//g' | sed 's/\.//g' | sort | tr "/" "\n" > Dump_ListeFuerLesezeichen.txt


#Ausgabe
echo "fertig"




### SCHRITT 3: Lesezeichen in dem PDF erstellen und eigentliches Output-File erstellen -> Mathe-Training-Komplett




#Ausgabe
echo -n "3. Metadatei für die Lesezeichen erstellen... "


Page=0
Level=1
BookmarkYesNo=No
OrdnerNameAltLevel1=A
OrdnerNameAltLevel2=B
OrdnerNameAltLevel3=C
i=0
 
pdftk Dump_Output.pdf dump_data > Dump_MetadateiFuerDiePDF.txt    #Zunächst die Metadatei aus dem Output-PDF entnehmen, dann mit folgender Schleife mit den Lesezeichen ergänzen:


while read line
do
    BookmarkYesNo=No   #Grundsätzlich erst mal pro Schleife davon ausgehen, dass ein Lesezeichen gesetzt wird.
   
    if [ "$line" = '' ]    #Falls die aktuelle Zeile nur ein Punkt ist. Komischerweise muss hier in die Anführungszeichen genau nichts...
       then
           Page=$[$Page +1]
           Level=0
    fi
   
    Level=$[$Level +1]
   
   
    if [ $((Level%5)) == 2 -a "$line" != "$OrdnerNameAltLevel1" ]    #In diesem Komplex wird entschieden, ob ein Lesezeichen gesetzt wird, oder nicht. Das %5 bedeutet modulo5, also der Rest nach der Division durch 5. Bei einem Rest von 2 ist man im Level 1, Rest 3 -> Level 2, usw. Anschließend wird die aktuelle Zeile in OrdnerNameAlt abgelegt, damit im nächsten Schritt erneut mit der vorigen Ebene verglichen werden kann.
        then
            BookmarkYesNo=Yes
            OrdnerNameAltLevel1=$line
        elif [ $((Level%5)) == 3 -a "$line" != "$OrdnerNameAltLevel2" ]
            then
                BookmarkYesNo=Yes
                OrdnerNameAltLevel2=$line
        elif [ $((Level%5)) == 4 -a "$line" != "$OrdnerNameAltLevel3" ]
            then
                BookmarkYesNo=Yes
                OrdnerNameAltLevel3=$line
        elif [ $((Level%5)) == 0 ]
            then
                BookmarkYesNo=Yes
    fi


    if [ "$BookmarkYesNo" = "Yes" ];
        then
            echo "BookmarkBegin" >> Dump_MetadateiFuerDiePDF.txt
            echo "BookmarkTitle: $line" >> Dump_MetadateiFuerDiePDF.txt
            BookmarkLevel=$[$Level -1]
            echo "BookmarkLevel: $BookmarkLevel" >> Dump_MetadateiFuerDiePDF.txt
            echo "BookmarkPageNumber: $Page" >> Dump_MetadateiFuerDiePDF.txt
    fi


done < ./Dump_ListeFuerLesezeichen.txt


#Ausgabe
echo "fertig"




#Ausgabe
echo -n "4. Zusammengefasste PDF-Datei mit Lesezeichen erstellen... "


Datum=`date +%Y-%m-%d`


pdftk Dump_Output.pdf update_info Dump_MetadateiFuerDiePDF.txt output Mathe-Training-komplett-V$Datum.pdf   #Jetzt die Metadatei wieder einlesen


#Ausgabe
echo "fertig"




### SCHRITT 4: Alle Dump-Dateien wieder löschen


#Ausgabe
echo -n "5. Alle Dump-Dateien wieder löschen... "


rm Dump_AllePDFs.txt Dump_ListeFuerLesezeichen.txt Dump_MetadateiFuerDiePDF.txt Dump_Output.pdf


#Ausgabe
echo "fertig"