merge pdf in beliebiger Reihenfolge

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
typ42
User
Beiträge: 1
Registriert: Freitag 11. September 2020, 06:34

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?
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Was hast du denn schon versucht? Woran scheiterst du genau?
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten