Seriendruck von PDFs mit Python

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
Xmedia
User
Beiträge: 1
Registriert: Sonntag 29. Oktober 2023, 17:37

Hallo zusammen,
Ich freue mich hier im Forum einen ersten Beitrag zu machen.
Ich bin noch kompletter Neuling in Sachen Python und wollte für mich folgende Aufgabe lösen:

Seriendruck von PDFs:
- aktuell verfügbare Drucker aus dem jeweiligen PC auslesen und einen Drucker auswählen
- Anzahl Dateien angeben, welche gedruckt werden sollen
- Anzahl Set angeben, welche gedruckt werden sollen
- kurze Auflistung, zur Kontrolle und Freigabe
- Ziel soll es sein, dass die Dateien wie folgt gedruckt werden bei 4 Dateien und 2 Sets:

1. Set:
Datei 1
Datei 2
Datei 3
Datei 4

2. Set:
Datei 1
Datei 2
Datei 3
Datei 4

Ich muss in meinem Beruf häufig immer wieder 20 Sets aus unterschiedlichen Dateien drucken mit unterschiedlichen Formaten (A4 und A3). Zusätzlichen sollen die Einzelnen Dateien auch geheftet werden und Setweise in der richtigen Reihenfolge ausgedruckt werden.

Zusammen mit ChatGPT bin ich schon sehr weit gekommen. Alle Tests mit dem PDF-Drucker haben soweit funktioniert. Wichtig ist hier, dass man Adobe PDF als Standard hat - sonst funktioniert das Script aus irgendeinem Grund nicht.

Effektiv am grossen Drucker ausdrucken erfolgt über eine zusätzliche Printer-Software (Prinitx Client).
So kann ich alle Dateien im Vorfeld "auf den Drucker" laden und dann vor Ort mit einem Batch alle ausdrucken. In der Reihenfolge, welche die Dateien gesendet werden, werden sie dann auch ausgedruckt. Daran kann ich vor Ort nichts mehr ändern.

Nun zu meiner Frage:
Die Reihenfolge, welche an/über die Printer-Software gesendet wird, unterscheidet sich jedes mal und stimmt nicht mit dem Script überein. Ich gehe davon aus, dass je nach Grösse der Datei / Auslastung der Software, dies unterschiedlich verarbeitet wird. Ich habe versucht einen time.sleep einzufügen, dann wird aber immer nur die erste Datei gedruckt - und nur 1 Mal.

Habt Ihr da eine Idee, wie man das Script optimal anpasst, damit es auch mit der Drucker-Software funktioniert in der korrekten Reihenfolge?

Danke Euch im Voraus

Gruss Xmedia


Anbei das Script:
import win32api
import win32print
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
from tkinter import simpledialog
from tkinter import Listbox
from tkinter import Scrollbar

def print_file(file_path, num_copies, printer_name):
try:
for _ in range(num_copies):
win32api.ShellExecute(0, "print", file_path, f'"{printer_name}"', ".", 0)

except Exception as e:
print("Fehler beim Drucken der Datei:", e)


def get_available_printers():
printers = []
for printer in win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL | win32print.PRINTER_ENUM_CONNECTIONS):
printers.append(printer[2])
return printers

def get_printer_name_by_number(number):
printers = get_available_printers()
if number < 11 or number > 10 + len(printers):
return None
return printers[number - 11]

root = tk.Tk()
root.withdraw()

# Drucker auflisten und Nummerierung zuweisen
printers = get_available_printers()
printer_text = "Verfügbare Drucker:\n\n"
for i, printer in enumerate(printers):
printer_text += f"{i+11}. {printer}\n"
printer_text += "\n"

# Dialogbox für Druckerwahl anzeigen
selected_printer_number = simpledialog.askinteger("Druckerwahl", printer_text + "Gib die Nummer des gewünschten Druckers ein:")

if selected_printer_number:
printer_name = get_printer_name_by_number(selected_printer_number)

if printer_name is None:
print("Ungültige Druckernummer.")
else:
# Eingabe der Anzahl der Dateien und der Sets
root.update()
root.geometry("600x200")

num_files = simpledialog.askinteger("Anzahl der Dateien", "Gib die Anzahl der zu druckenden Dateien ein:")
num_sets = simpledialog.askinteger("Anzahl der Sets", "Gib die Anzahl der zu druckenden Sets ein:")

file_paths = []
for _ in range(num_files):
file_path = filedialog.askopenfilename(filetypes=[("Alle Dateien", "*.*")])
if file_path:
file_paths.append(file_path)

if file_paths:
# Listbox für die gedruckten Dateien und Sets
listbox_window = tk.Toplevel(root)
listbox_window.title("Gedruckte Dateien und Sets")
listbox_window.geometry("600x400")

listbox = Listbox(listbox_window, width=50, height=20)
scrollbar = Scrollbar(listbox_window)
listbox.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=listbox.yview)
scrollbar.pack(side="right", fill="y")
listbox.pack(side="left", fill="both", expand=True)

listbox.insert("end", "Folgende Dateien werden gedruckt:")
for set_index in range(num_sets):
listbox.insert("end", f"Set {set_index+1}:")
for file_index, file_path in enumerate(file_paths):
listbox.insert("end", f"Datei {file_index+1}: {file_path}")

# Bestätigungsdialog anzeigen
result = messagebox.askyesno("Drucken bestätigen", "Möchtest du fortfahren und die Dateien drucken?")

if result:
print("Druckvorgang gestartet...")
for set_index in range(num_sets):
for file_index, file_path in enumerate(file_paths):
print_file(file_path, 1, printer_name)
listbox.insert("end", f"Gedruckt: Set {set_index+1}, Datei {file_index+1}")

print("Druckvorgang abgeschlossen.")
else:
print("Druckvorgang abgebrochen.")
listbox_window.destroy()

root.destroy()
else:
print("Keine Dateien ausgewählt. Druckvorgang abgebrochen.")
root.destroy()
else:
print("Ungültige Druckernummer.")
root.destroy()

root.mainloop()
Antworten