NoPaste

Merge PDF

von HelsAett

SNIPPET_TEXT:
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. #########################################################################
  4. # File Name: test2.py
  5. # Author: debian
  6. # mail: debian@debian-virtualbox
  7. # Created Time: 2024-05-03 08:19:06
  8. #########################################################################
  9.  
  10.  
  11. import gi
  12. gi.require_version("Gtk", "3.0")
  13. from gi.repository import Gtk, Gdk
  14. import os
  15. import sys
  16. import subprocess
  17.  
  18. class PDFMergeWindow(Gtk.Window):
  19.     def __init__(self):
  20.         Gtk.Window.__init__(self, title="PDF Merge")
  21.         self.set_border_width(10)
  22.         self.set_default_size(300, 200)
  23.  
  24.         # Layout Grid
  25.        grid = Gtk.Grid()
  26.         grid.set_column_spacing(10)
  27.         grid.set_row_spacing(10)
  28.         self.add(grid)
  29.  
  30.         # Listbox for file paths
  31.        self.listbox = Gtk.ListBox()
  32.         self.listbox.set_selection_mode(Gtk.SelectionMode.NONE)
  33.         scroll = Gtk.ScrolledWindow()
  34.         scroll.set_vexpand(True)
  35.         scroll.add(self.listbox)
  36.         grid.attach(scroll, 0, 0, 3, 1)
  37.  
  38.         # Buttons
  39.        button_add = Gtk.Button(label="Add PDFs")
  40.         button_add.connect("clicked", self.on_add_files_clicked)
  41.         grid.attach(button_add, 0, 1, 1, 1)
  42.  
  43.         button_merge = Gtk.Button(label="Merge PDFs")
  44.         button_merge.connect("clicked", self.on_merge_files_clicked)
  45.         grid.attach(button_merge, 1, 1, 1, 1)
  46.  
  47.         button_exit = Gtk.Button(label="Exit")
  48.         button_exit.connect("clicked", lambda x: Gtk.main_quit())
  49.         grid.attach(button_exit, 2, 1, 1, 1)
  50.  
  51.         # Initialize with command line PDF files if provided
  52.        if len(sys.argv) > 1:
  53.             for filename in sys.argv[1:]:
  54.                 self.add_file_to_list(filename)
  55.  
  56.     def on_add_files_clicked(self, widget):
  57.         dialog = Gtk.FileChooserDialog(title="Select PDF files", parent=self,
  58.                                        action=Gtk.FileChooserAction.OPEN)
  59.         dialog.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
  60.                            Gtk.STOCK_OPEN, Gtk.ResponseType.OK)
  61.         dialog.set_select_multiple(True)
  62.         filter_pdf = Gtk.FileFilter()
  63.         filter_pdf.set_name("PDF files")
  64.         filter_pdf.add_mime_type("application/pdf")
  65.         dialog.add_filter(filter_pdf)
  66.  
  67.         response = dialog.run()
  68.         if response == Gtk.ResponseType.OK:
  69.             for filename in dialog.get_filenames():
  70.                 self.add_file_to_list(filename)
  71.         dialog.destroy()
  72.  
  73.     def add_file_to_list(self, filename):
  74.         label = Gtk.Label(label=filename)
  75.         label.set_xalign(0)  # Set the label left-aligned
  76.        row = Gtk.ListBoxRow()
  77.         row.add(label)
  78.         self.listbox.add(row)
  79.         self.listbox.show_all()
  80.  
  81.     def on_merge_files_clicked(self, widget):
  82.         files = [row.get_child().get_label() for row in self.listbox.get_children()]
  83.         if not files:
  84.             self.show_dialog("Error", "No files selected to merge.")
  85.             return
  86.        
  87.         dialog = Gtk.FileChooserDialog(title="Save merged PDF as...", parent=self,
  88.                                        action=Gtk.FileChooserAction.SAVE)
  89.         dialog.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
  90.                            Gtk.STOCK_SAVE, Gtk.ResponseType.OK)
  91.         dialog.set_current_name("merged_output.pdf")
  92.         filter_pdf = Gtk.FileFilter()
  93.         filter_pdf.set_name("PDF files")
  94.         filter_pdf.add_mime_type("application/pdf")
  95.         dialog.add_filter(filter_pdf)
  96.  
  97.         response = dialog.run()
  98.         if response == Gtk.ResponseType.OK:
  99.             output_file = dialog.get_filename()
  100.             if os.path.exists(output_file):
  101.                 overwrite_response = self.show_dialog("Confirm", "File already exists. Overwrite?", dialog_type="yes/no")
  102.                 if overwrite_response == Gtk.ResponseType.NO:
  103.                     dialog.destroy()
  104.                     return
  105.             self.merge_pdfs(files, output_file)
  106.         dialog.destroy()
  107.  
  108.     def merge_pdfs(self, files, output_file):
  109.         try:
  110.             subprocess.run(['pdfunite'] + files + [output_file], check=True)
  111.             self.show_dialog("Success", f"PDFs merged successfully into {output_file}")
  112.         except subprocess.CalledProcessError as e:
  113.             self.show_dialog("Error", "Failed to merge PDFs: " + str(e))
  114.  
  115.     def show_dialog(self, title, message, dialog_type="ok"):
  116.         dialog_type_map = {
  117.             "ok": Gtk.ButtonsType.OK,
  118.             "yes/no": Gtk.ButtonsType.YES_NO
  119.         }
  120.         dialog = Gtk.MessageDialog(transient_for=self, flags=0,
  121.                                    message_type=Gtk.MessageType.INFO,
  122.                                    text=title)
  123.         dialog.format_secondary_text(message)
  124.         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)
  125.         response = dialog.run()
  126.         dialog.destroy()
  127.         return response
  128.  
  129. win = PDFMergeWindow()
  130. win.connect("destroy", Gtk.main_quit)
  131. win.show_all()
  132. Gtk.main()

Quellcode

Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN