ubuntuusers.de

pdftk *pdf cat output content.pdf mit Inhaltsverzeichnis

Status: Gelöst | Ubuntu-Version: Ubuntu 18.10 (Cosmic Cuttlefish)
Antworten |

nurguggen

Anmeldungsdatum:
20. Juni 2018

Beiträge: 83

Hallo,

nachdem andere Agenturen das auch so machen, trenne ich jetzt noch schärfer Inhalt/Content und Design. Zu einem derzeitigen Projekt existieren ca 30 PDFs mit Content. Die Seitenzahl geht von einer Seite bis hin zu 30-40 Seiten von AGB Dokumenten.

Wäre es nun möglich daraus ein einziges PDF zu generieren, mit dem Unterschied, dass auf der ersten Seite ein Inhaltsverzeichnis ist, welches den Dateinamen und die dazugehörige Seitennummer benennt?

Habt ihr da eine Idee wie das gehen könnte? Würde man erst diese Verzeichnisdatei erstellen wäre es kein Problem aus dieser mit Latex ein PDF zu generieren und das dann mit pdftk vorne angestellt alles zusammenzupacken.

Ich denke da grundsätzlich an die Shell.

Danke

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Wohnort: Göttingen

Hi,

hier mal ein erster Ansatz:

#!/bin/bash
set -eo pipefail
page=1; for file in *.pdf ; do 
	startpage=$page; 
	echo -n "$file " ; 
	number_of_pages=$(pdftk "$file" dump_data| awk '/NumberOfPages/ {print $2}') ;
	endpage=$(($page+$number_of_pages-1)); 
	page=$((endpage+1)); 
	echo "S. $startpage-$endpage";
done

Das Skript gibt aus dem gleichen Ordner, in dem es liegt die Seiten der darin enthaltenene pdfs aus.

Dabei zu beachten:

- die Dateiendung muss .pdf sein, also komplett klein geschrieben.

- Man müsste nun noch die Seitenzahlen des Inhaltsverzeichnisses dort mit hinzu rechnen. Da wäre die Frage, ob Du das Inhaltsverzeichnis auf eine Seite quetschen willst, oder eh einfach zwei Seiten dafür vorsehen willst. Die Ausgabe dieses Skriptes könntest Du dann entsprechend anpassen, um daraus ein Inhaltsverzeichnis zu generieren.

Ich denke, da wäre Markdown das einfachste, aus dem Du dann per Pandoc wiederum ein PDF generieren könntest. Aber vielleicht bist Du mit Tex ja auch geübter, aber das kommt mir an dieser Stelle ein wenig übertrieben vor...

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Wohnort: Göttingen

Hab nochmal ein wenig weitergebastelt:

#!/bin/bash
set -eo pipefail

content_file_markdown="/tmp/content.$(uuidgen).md";
content_file_pdf=${content_file_markdown%.md}.pdf;

pdf_total="/tmp/pdftotal.$(uuidgen).pdf";
pdf_total_tmp="/tmp/pdftotal.$(uuidgen).pdf.tmp";
echo '# Inhaltsverzeichnis' > $content_file_markdown;
echo "Erstelle zusammengefuehrtes PDF $pdf_total";
echo "Erstelle Inhaltsverzeichnis $content_file_pdf";
page=1; 
for file in *.pdf ; do
    echo $file;
    startpage=$page;
    echo -n " - $file " >> $content_file_markdown;
    number_of_pages=$(pdftk "$file" dump_data| awk '/NumberOfPages/ {print $2}') ;
    endpage=$(($page+$number_of_pages-1));
    page=$((endpage+1));
    echo "S. $startpage-$endpage" >> $content_file_markdown;

    test -e "$pdf_total" && pdfunite "$pdf_total" "$file" "$pdf_total_tmp" || cp "$file" "$pdf_total_tmp";
    mv "$pdf_total_tmp" "$pdf_total";
done

pandoc -t latex -o $content_file_pdf $content_file_markdown;

hiermit erhälst Du im /tmp Ordner ein Dokument mit den zusammengeführten pdfs und ein zweites mit dem Inhaltsverzeichnis.

Bliebe die Frage, wie Du die Anzahl der Seitenzahlen des Inhaltsverzeichnisses hier dann einreichnest.

Da bräuchtest Du vielleicht einen Counter, wo Du erst die Anzahl der pdf-Dateien zählst, daraus errechnest, wieviele Seiten das Inhaltsverzeichnis haben wird und dann das $page am Anfang entsprechend setzt. Ich weiß ja nicht, ob deine Dateinamen evtl. so lang sind, dass sie zwei Zeilen in dem Inhaltsverzeichnis benötigen. In dem Fall müsste man das noch ein wenig aufwendiger machen, sprich ein Inhaltsverzeichnis vorgenerieren und dann schauen, wieviele Seiten es hat.

Und die temporären Dateien müsstest Du noch löschen und das Markdown entsprechend schick machen...

nurguggen

(Themenstarter)

Anmeldungsdatum:
20. Juni 2018

Beiträge: 83

Danke das sieht schon echt gut aus.

Zur Überlegung bzgl. der Seitenzahlen des Inhaltsverzeichnis. Wäre es möglich einen ersten Durchlauf für das Inhaltsverzeichnis zu starten, bei dem die Seitenzahlen erst einmal unwichtig sind, und man schaut wieviele Seiten das Inhaltsverzeichnis tatsächlich einnimmt, und dann anhand von dieser Zahl beim zweiten Durchlauf das Inhaltsverzeichnis erneut generiert, diesesmal mit der richtigen Seitenzahl und dann hintendran alle PDFs anhängt?

Bei Latex muss man ja auch oftmals zweimal kompilieren wenn man ein Inhaltsverzeichnis nutzt...

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Wohnort: Göttingen

Hi,

habe das ganze jetzt nochmal umgebaut, so daß ein zweiter Durchlauf für die Generierung gemacht wird. Das Skript ist im Anhang.

Noch ein paar Hinweise dazu:

- /tmp ist vielleicht nicht ganz optimal als Speicherplatz für das zusammengeführte PDF. Da müßtest Du sehen, ob Du das woanders hinlegst, insbesondere, wenn /tmp bei Dir im RAM liegt...

- Ich bekomme beim Vereinen per pdfunite des Inhaltsverzeichnisses mit dem Gesamt-PDF noch folgende Meldung, die aber an den PDFs liegen mag, mit denen ich teste:

Internal Error: xref num 10 not found but needed, try to reconstruct<0a>

- Ob das dann auf wirklich klappt, wenn das Inhaltsverzeichnis mehr als eine Seite hat, habe ich noch nicht getestet.

- Dass das Skript in dem Verzeichnis liegen muss, wo auch die Pdfs liegen, ist natürlich auch nicht optimal. Da müsste man halt noch einen Parameter für einbauen, den man dem Skript mitgibt...

merge_pdfs_and_create_toc.sh (1.7 KiB)
Download merge_pdfs_and_create_toc.sh

nurguggen

(Themenstarter)

Anmeldungsdatum:
20. Juni 2018

Beiträge: 83

super das läuft genau so wie ichs wollte. Ich hab noch die Option eingefügt, dass dem Titelblatt, auf dem auch das Inhaltsverzeichnis anfängt als Dokumententitel oben der Ordnername gegeben wird, indem alle PDFs liegen.

Antworten |