Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os, shutil, subprocess, sys
- # import PyPDF2, pypdfium2
- from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QListWidget, QPushButton, QMessageBox, QFileDialog
- a =[]
- class PdfMerger(QWidget):
- def __init__(self):
- super().__init__()
- self.initUI()
- self.selected_files = []
- self.temp_file_path = "/tmp"
- def initUI(self):
- self.setWindowTitle('Объединить PDF файлы')
- self.setGeometry(580, 330, 740, 236)
- # Создаем горизонтальный макет для размещения QListWidget и кнопки справа от него
- layout = QHBoxLayout()
- # Создаем QListWidget и добавляем его в вертикальный макет
- self.listbox = QListWidget()
- layout.addWidget(self.listbox)
- # Создаем горизонтальный макет
- h_layout = QHBoxLayout()
- # Создаем вертикальный макет для кнопок
- buttons_layout = QVBoxLayout()
- self.move_up_btn = QPushButton('Вверх')
- self.move_up_btn.clicked.connect(self.move_up)
- buttons_layout.addWidget(self.move_up_btn) # Добавляем кнопку "Вверх" в вертикальный макет для кнопок
- self.move_down_btn = QPushButton('Вниз')
- self.move_down_btn.clicked.connect(self.move_down)
- buttons_layout.addWidget(self.move_down_btn) # Добавляем кнопку "Вниз" ниже кнопки "Вверх" в вертикальный макет для кнопок
- # Добавляем вертикальный макет для кнопок в горизонтальный макет
- h_layout.addLayout(buttons_layout)
- # Создаем вертикальный макет для новых кнопок справа от кнопок "Вверх" и "Вниз"
- right_button_frame = QVBoxLayout()
- self.add_file_btn = QPushButton('Добавить файл')
- self.add_file_btn.clicked.connect(self.open_file_explorer)
- # right_button_frame.addSpacing(10)
- right_button_frame.addWidget(self.add_file_btn) # Добавляем кнопку "Добавить файл"
- self.delete_btn = QPushButton('Удалить')
- self.delete_btn.clicked.connect(self.delete_selected)
- right_button_frame.addWidget(self.delete_btn) # Добавляем кнопку "Удалить"
- self.merge_pdf_btn = QPushButton('Объединить PDF')
- self.merge_pdf_btn.clicked.connect(self.merge_pdfs)
- right_button_frame.addWidget(self.merge_pdf_btn) # Добавляем кнопку "Объединить PDF"
- h_layout.addLayout(right_button_frame) # Добавляем вертикальный макет новых кнопок в горизонтальный макет
- # Добавляем горизонтальный макет с кнопками в основной вертикальный макет после QListWidget
- layout.addLayout(h_layout)
- # Устанавливаем основной макет для виджета
- self.setLayout(layout)
- def move_up(self):
- selected = self.listbox.selectedIndexes()
- if selected:
- index = selected[0].row()
- if index > 0:
- item = self.listbox.takeItem(index)
- self.listbox.insertItem(index - 1, item)
- self.listbox.setCurrentRow(index - 1)
- def move_down(self):
- selected = self.listbox.selectedIndexes()
- if selected:
- index = selected[0].row()
- if index < self.listbox.count() - 1:
- item = self.listbox.takeItem(index)
- self.listbox.insertItem(index + 1, item)
- self.listbox.setCurrentRow(index + 1)
- def copy_and_rename_files(self, file_paths, destination):
- new_file_paths = []
- for index, original_path in enumerate(file_paths, start=1):
- _, file_extension = os.path.splitext(original_path)
- new_file_name = f"{index}{file_extension}"
- new_path = os.path.join(destination, new_file_name)
- shutil.copy2(original_path, new_path)
- new_file_paths.append(new_path)
- return new_file_paths
- def delete_temp_files(self, file_list):
- for filepath in file_list:
- try:
- os.remove(filepath) # print(f'Файл {filepath} был удален.')
- except FileNotFoundError:
- print(f'Файл не найден: {filepath}')
- except OSError as e:
- print(f'Ошибка при удалении файла {filepath}: {e}')
- def merge_pdfs(self):
- if not self.selected_files:
- QMessageBox.critical(self, "Ошибка", "Список файлов пуст")
- return
- file_dialog = QFileDialog()
- file_dialog.setAcceptMode(QFileDialog.AcceptSave)
- file_dialog.setDefaultSuffix('pdf')
- output_filename, _ = file_dialog.getSaveFileName(self, "Сохранить файл как", "", "PDF files (*.pdf)")
- if not output_filename:
- return
- new_files = self.copy_and_rename_files(self.selected_files, self.temp_file_path)
- if len(new_files) >= 4:
- os.remove(new_files[3])
- del new_files[3]
- set_chmod = f"for i in {' '.join(new_files)}; do sudo chmod u+rw \"$i\"; sudo chmod g+rw \"$i\"; done"
- subprocess.call(['bash', '-c', set_chmod])
- try:
- if not output_filename.lower().endswith('.pdf'):
- output_filename += '.pdf'
- cmd = ['pdfunite'] + new_files + [output_filename]
- subprocess.run(cmd, check=True)
- subprocess.call(['xdg-open', output_filename])
- self.delete_temp_files(new_files)
- except Exception as e:
- print(f"Ошибка при сохранении файла: {e}")
- def open_file_explorer(self): # Команда для запуска Zenity с фильтром для mp4 файлов.
- cmd = ['zenity', '--file-selection', '--multiple', '--separator=|', '--file-filter=pdf files | *.pdf']
- # Вызов Zenity и получение выбранных путей
- result = subprocess.run(cmd, check=True, stdout=subprocess.PIPE, text=True) # Удаляем лишние пробельные символы и разделяем строки по
- # '|' вместо запятой. Затем разделяем каждый путь, убирая символы новой строки
- files = [path for path in result.stdout.strip().replace('\n', '').split('|') if path] # Выводим очищенные пути
- if files:
- self.selected_files.extend(files)
- for file in files:
- self.listbox.addItem(file)
- def delete_selected(self):
- selected = self.listbox.selectedIndexes()
- for index in sorted(selected, reverse=True):
- self.listbox.takeItem(index.row())
- del self.selected_files[index.row()]
- app = QApplication(sys.argv)
- ex = PdfMerger()
- ex.show()
- sys.exit(app.exec_())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement