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.