Siduction Forum > Scripting & Kernelhacking

[DE] PDFs in Unterordnern finden und zusammen fassen (mit Lesezeichen)

<< < (2/2)

10toe:
Hallo Peter,


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



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


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

bluelupo:
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: ---$ pdftk $(find . -type f -iname "*" | xargs file | grep -i "pdf document"|awk -F":" '{print $1}') cat output out.pdf

--- End code ---

harley-peter:
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.

10toe:
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: ---
 #!/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"

--- End code ---

Navigation

[0] Message Index

[*] Previous page

Go to full version
Powered by Advanced Topic Prefix Pro
Powered by SMFPacks WYSIWYG Editor