Merge PDF
von HelsAett- SNIPPET_TEXT:
-
- #!/usr/bin/python
- # -*- coding: utf-8 -*-
- #########################################################################
- # File Name: test2.py
- # Author: debian
- # mail: debian@debian-virtualbox
- # Created Time: 2024-05-03 08:19:06
- #########################################################################
- import gi
- gi.require_version("Gtk", "3.0")
- from gi.repository import Gtk, Gdk
- import os
- import sys
- import subprocess
- class PDFMergeWindow(Gtk.Window):
- def __init__(self):
- Gtk.Window.__init__(self, title="PDF Merge")
- self.set_border_width(10)
- self.set_default_size(300, 200)
- # Layout Grid
- grid = Gtk.Grid()
- grid.set_column_spacing(10)
- grid.set_row_spacing(10)
- self.add(grid)
- # Listbox for file paths
- self.listbox = Gtk.ListBox()
- self.listbox.set_selection_mode(Gtk.SelectionMode.NONE)
- scroll = Gtk.ScrolledWindow()
- scroll.set_vexpand(True)
- scroll.add(self.listbox)
- grid.attach(scroll, 0, 0, 3, 1)
- # Buttons
- button_add = Gtk.Button(label="Add PDFs")
- button_add.connect("clicked", self.on_add_files_clicked)
- grid.attach(button_add, 0, 1, 1, 1)
- button_merge = Gtk.Button(label="Merge PDFs")
- button_merge.connect("clicked", self.on_merge_files_clicked)
- grid.attach(button_merge, 1, 1, 1, 1)
- button_exit = Gtk.Button(label="Exit")
- button_exit.connect("clicked", lambda x: Gtk.main_quit())
- grid.attach(button_exit, 2, 1, 1, 1)
- # Initialize with command line PDF files if provided
- if len(sys.argv) > 1:
- for filename in sys.argv[1:]:
- self.add_file_to_list(filename)
- def on_add_files_clicked(self, widget):
- dialog = Gtk.FileChooserDialog(title="Select PDF files", parent=self,
- action=Gtk.FileChooserAction.OPEN)
- dialog.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
- Gtk.STOCK_OPEN, Gtk.ResponseType.OK)
- dialog.set_select_multiple(True)
- filter_pdf = Gtk.FileFilter()
- filter_pdf.set_name("PDF files")
- filter_pdf.add_mime_type("application/pdf")
- dialog.add_filter(filter_pdf)
- response = dialog.run()
- if response == Gtk.ResponseType.OK:
- for filename in dialog.get_filenames():
- self.add_file_to_list(filename)
- dialog.destroy()
- def add_file_to_list(self, filename):
- label = Gtk.Label(label=filename)
- label.set_xalign(0) # Set the label left-aligned
- row = Gtk.ListBoxRow()
- row.add(label)
- self.listbox.add(row)
- self.listbox.show_all()
- def on_merge_files_clicked(self, widget):
- files = [row.get_child().get_label() for row in self.listbox.get_children()]
- if not files:
- self.show_dialog("Error", "No files selected to merge.")
- return
- dialog = Gtk.FileChooserDialog(title="Save merged PDF as...", parent=self,
- action=Gtk.FileChooserAction.SAVE)
- dialog.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
- Gtk.STOCK_SAVE, Gtk.ResponseType.OK)
- dialog.set_current_name("merged_output.pdf")
- filter_pdf = Gtk.FileFilter()
- filter_pdf.set_name("PDF files")
- filter_pdf.add_mime_type("application/pdf")
- dialog.add_filter(filter_pdf)
- response = dialog.run()
- if response == Gtk.ResponseType.OK:
- output_file = dialog.get_filename()
- if os.path.exists(output_file):
- overwrite_response = self.show_dialog("Confirm", "File already exists. Overwrite?", dialog_type="yes/no")
- if overwrite_response == Gtk.ResponseType.NO:
- dialog.destroy()
- return
- self.merge_pdfs(files, output_file)
- dialog.destroy()
- def merge_pdfs(self, files, output_file):
- try:
- subprocess.run(['pdfunite'] + files + [output_file], check=True)
- self.show_dialog("Success", f"PDFs merged successfully into {output_file}")
- except subprocess.CalledProcessError as e:
- self.show_dialog("Error", "Failed to merge PDFs: " + str(e))
- def show_dialog(self, title, message, dialog_type="ok"):
- dialog_type_map = {
- "ok": Gtk.ButtonsType.OK,
- "yes/no": Gtk.ButtonsType.YES_NO
- }
- dialog = Gtk.MessageDialog(transient_for=self, flags=0,
- message_type=Gtk.MessageType.INFO,
- text=title)
- dialog.format_secondary_text(message)
- dialog.add_buttons(Gtk.STOCK_OK, Gtk.ResponseType.OK) if dialog_type == "ok" else dialog.add_buttons(Gtk.STOCK_YES, Gtk.ResponseType.YES, Gtk.STOCK_NO, Gtk.ResponseType.NO)
- response = dialog.run()
- dialog.destroy()
- return response
- win = PDFMergeWindow()
- win.connect("destroy", Gtk.main_quit)
- win.show_all()
- Gtk.main()
Quellcode
Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN