Wie füge ich PDFs zusammen und erstelle Lesezeichen für jede Eingabedatei in der Ausgabedatei? (Linux)

Wie füge ich PDFs zusammen und erstelle Lesezeichen für jede Eingabedatei in der Ausgabedatei? (Linux)

Ich verwende Linux und hätte gerne eine Software (oder ein Skript, eine Methode), die einige PDFs zusammenführt und eine einheitliche Ausgabe-PDF mit Lesezeichen erstellt. Lesezeichen werden nach dem Dateinamen der PDF-Dateien benannt, die zum Zusammenführen verwendet wurden, und verweisen auf die Seitenzahl, auf der diese Dateien beginnen.

Ähnliche Möglichkeiten bietet Adobe Acrobat, allerdings ist es kostenpflichtig und nur für Windows verfügbar.

Antwort1

AKTUALISIEREN: Ich war mit dem Ergebnis nicht zufrieden und habe dies mit einer schönen GUI geschrieben:

https://github.com/Yanpas/PdfMerger


Habe Python gelernt und in einer Stunde ein (modifiziertes) Programm geschrieben:

#! /usr/bin/env python
# Original author Nicholas Kim, modified by Yan Pashkovsky
# New license - GPL v3
import sys
import time
from PyPDF2 import utils, PdfFileReader, PdfFileWriter

def get_cmdline_arguments():
    """Retrieve command line arguments."""
    
    from optparse import OptionParser
    
    usage_string = "%prog [-o output_name] file1, file2 [, ...]"

    parser = OptionParser(usage_string)
    parser.add_option(
        "-o", "--output",
        dest="output_filename",
        default=time.strftime("output_%Y%m%d_%H%M%S"),
        help="specify output filename (exclude .pdf extension); default is current date/time stamp"
    )
    
    options, args = parser.parse_args()
    if len(args) < 2:
        parser.print_help()
        sys.exit(1)
    return options, args
    
def main():
    options, filenames = get_cmdline_arguments()
    output_pdf_name = options.output_filename + ".pdf"
    files_to_merge = []

    # get PDF files
    for f in filenames:
        try:
            next_pdf_file = PdfFileReader(open(f, "rb"))
        except(utils.PdfReadError):
            print >>sys.stderr, "%s is not a valid PDF file." % f
            sys.exit(1)
        except(IOError):
            print >>sys.stderr, "%s could not be found." % f
            sys.exit(1)
        else:
            files_to_merge.append(next_pdf_file)

    # merge page by page
    output_pdf_stream = PdfFileWriter()
    j=0
    k=0
    for f in files_to_merge:
        for i in range(f.numPages):
            output_pdf_stream.addPage(f.getPage(i))
            if i==0:
                output_pdf_stream.addBookmark(str(filenames[k]),j)
            j = j + 1
        k += 1
        
    # create output pdf file
    try:
        output_pdf_file = open(output_pdf_name, "wb")
        output_pdf_stream.write(output_pdf_file)
    finally:
        output_pdf_file.close()

    print "%s successfully created." % output_pdf_name


if __name__ == "__main__":
    main()

Dieses Programm erfordert PyPDF2. Sie können es über installieren sudo pip install pypdf2. Zuvor müssen Sie jedoch pip installieren :) Öffnen Sie einfach das Terminal und geben Sie ein./pdfmerger.py *.pdf

Antwort2

Dieses Bash-Skript sorgt dafür, dass jedes PDF in einem Verzeichnis auf seiner ersten Seite ein Lesezeichen mit dem Text des PDF-Dateinamens enthält, und verkettet dann alle. Es kann mit Dateinamen umgehen, die nicht im ASCII-Format vorliegen.

#!/usr/bin/bash

cattedPDFname="${1:?Concatenated PDF filename}"

# make each PDF contain a single bookmark to first page
tempPDF=`mktemp`
for i in *.pdf
do
    bookmarkTitle=`basename "$i" .pdf`
    bookmarkInfo="BookmarkBegin\nBookmarkTitle: $bookmarkTitle\nBookmarkLevel: 1\nBookmarkPageNumber: 1"
    pdftk "$i" update_info_utf8 <(echo -en $bookmarkInfo) output $tempPDF verbose
    mv $tempPDF "$i"
done

# concatenate the PDFs
pdftk *.pdf cat output "$cattedPDFname" verbose

Antwort3

Eine gute Antwort modifizieren [1] vontex.stackexchange.comkönnen Sie eine itemizeListe mit Verweisen auf die Dateien erstellen, die Sie unten einfügen möchten. (Ähnlich einem Inhaltsverzeichnis). Latex kümmert sich um die Aktualisierung der Seitenzahlen.

MancheLatexWörter mehr

  • Eine Zeile wie diese enthält diePDFDatei MyDoc1.pdfmit dem Referenznamen"Dokument01"im selben Verzeichnis wie die Latex-Datei vorhanden:

    \modifiedincludepdf{-}{doc01}{MyDoc1.pdf}
    
  • Ein Befehl wie \pageref{doc02.3}erstellt einen Link mit der Nummer der dritten Seite des Dokuments, das als Referenz den Schlüssel hat"Dokument02". Latex sorgt dafür, dass es auf dem neuesten Stand bleibt.

  • Ein Block \begin{itemize} \end{itemize}erstellt eine Punkteliste.

Die Latex-Datei
Nachfolgend die geänderte Vorlage, die funktioniert mit pdflatex:

\documentclass{article}
\usepackage{hyperref}
\usepackage{pdfpages}
\usepackage[russian,english]{babel}

\newcounter{includepdfpage}
\newcounter{currentpagecounter}
\newcommand{\addlabelstoallincludedpages}[1]{
   \refstepcounter{includepdfpage}
   \stepcounter{currentpagecounter}
   \label{#1.\thecurrentpagecounter}}
\newcommand{\modifiedincludepdf}[3]{
    \setcounter{currentpagecounter}{0}
    \includepdf[pages=#1,pagecommand=\addlabelstoallincludedpages{#2}]{#3}}

\begin{document}

You can refer to the beginning or to a specific page: \\
see page \pageref{doc01.1} till \pageref{doc02.3}.\\

\begin{itemize}
  \item Here contribution from Grupmate 1 \pageref{doc01.1}
  \item Here contribution from Grupmate 2 \pageref{doc02.1}
\end{itemize}

\modifiedincludepdf{-}{doc01}{MyDoc1.pdf}
\modifiedincludepdf{-}{doc02}{MyDoc2.pdf}

\end{document}

Notiz

Um PDF-Dokumente oder Seiten einfach zusammenzuführen und aufzuteilen, können Sie Tools wie pdftk verwenden und sich von anderen Fragen inspirieren lassen [3] darüber.

Verweise

verwandte Informationen