Seite 1 von 1

merge pdf in beliebiger Reihenfolge

Verfasst: Freitag 11. September 2020, 06:39
von typ42
Mit diesem Code kann man pdfs in alphabetischer Reihenfolge zusammenfügen.

Code: Alles auswählen

# pdf_merger2.py
import glob
from PyPDF2 import PdfFileMerger
os.chdir(r"auf_comp")
def merger(output_path, input_paths):
    pdf_merger = PdfFileMerger()
    file_handles = []
    
    for path in input_paths:
        pdf_merger.append(path)
        
    with open(output_path, 'wb') as fileobj:
        pdf_merger.write(fileobj)
        pdf_merger.close()
        
if __name__ == '__main__':
    paths = glob.glob('*.pdf')
    paths.sort()
    merger('data.pdf', paths)
Wie kann ich eine andere Reihenfolge festlegen z.B. 3.pdf, 5.pdf, 1.pdf...usw., die ich zB vorher in einer txt Datei angegeben habe?

Re: merge pdf in beliebiger Reihenfolge

Verfasst: Freitag 11. September 2020, 07:34
von sparrow
Was hast du denn schon versucht? Woran scheiterst du genau?

Re: merge pdf in beliebiger Reihenfolge

Verfasst: Freitag 11. September 2020, 07:48
von Sirius3
os.chrdir solltest Du nicht benutzen. Starte einfach das Programm in dem Pfad, in dem Du es brauchst.
file_handles wird definiert aber nicht gebraucht.
Du mußt nur stat mit glob.glob die Dateinamen aus einer angegebenen Datei lesen.

Re: merge pdf in beliebiger Reihenfolge

Verfasst: Freitag 11. September 2020, 09:29
von __blackjack__
@typ42: Der Quelltext liefert einen `NameError` weil `os` verwendet, aber nicht importiert wird. `os.chdir()` sollte man aber auch gar nicht verwenden. Und in neuem Code `glob` auch nicht mehr, denn diese Funktionalität steht auch über `pathlib` bereit.

`merger()` ist kein guter Funktionsname weil der keine Tätigkeit beschreibt.

`file_handles` wird definiert aber nicht verwendet. Der Name wäre auch nicht so passend, denn Dateien sind in Python Objekte und keine ”handles”.

Das ``pdf_merger.close()`` steht an einer merkwürdigen Stelle im Code.

Das `obj` in `fileobj` ist überflüssig. In Python ist *alles* was man an einen Namen binden kann ein Objekt. Das ist also keine sinnvolle Information die man in einen Namen stecken müsste. `file` reicht vollkommen aus.

Zwischenstand (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
from contextlib import closing
from pathlib import Path

from PyPDF2 import PdfFileMerger

PDF_PATH = Path(r"auf_comp")


def concatenate_pdfs(output_path, input_paths):
    with closing(PdfFileMerger()) as merger:
        for path in input_paths:
            merger.append(str(path))

        with output_path.open("wb") as file:
            merger.write(file)


if __name__ == "__main__":
    concatenate_pdfs(PDF_PATH / "data.pdf", sorted(PDF_PATH.glob("*.pdf")))
Wenn Du eine andere Reihenfolge haben willst als lexikographisch, dann müsstest Du eine entsprechende `key`-Funktion für das sortieren schreiben.

Oder nicht sortieren, sondern direkt die Namen in der gewünschten Reihenfolge an das `PdfFileMerger`-Objekt anhängen.