Advertisement
egor230

Объединить pdf файлы

Apr 21st, 2024 (edited)
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.78 KB | Source Code | 0 0
  1. import os, shutil, subprocess, sys
  2. # import PyPDF2, pypdfium2
  3.  
  4. from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QListWidget, QPushButton, QMessageBox, QFileDialog
  5.  
  6. a =[]
  7. class PdfMerger(QWidget):
  8. def __init__(self):
  9. super().__init__()
  10. self.initUI()
  11. self.selected_files = []
  12. self.temp_file_path = "/tmp"
  13.  
  14. def initUI(self):
  15. self.setWindowTitle('Объединить PDF файлы')
  16. self.setGeometry(580, 330, 740, 236)
  17.  
  18. # Создаем горизонтальный макет для размещения QListWidget и кнопки справа от него
  19. layout = QHBoxLayout()
  20.  
  21. # Создаем QListWidget и добавляем его в вертикальный макет
  22. self.listbox = QListWidget()
  23. layout.addWidget(self.listbox)
  24.  
  25. # Создаем горизонтальный макет
  26. h_layout = QHBoxLayout()
  27.  
  28. # Создаем вертикальный макет для кнопок
  29. buttons_layout = QVBoxLayout()
  30. self.move_up_btn = QPushButton('Вверх')
  31. self.move_up_btn.clicked.connect(self.move_up)
  32. buttons_layout.addWidget(self.move_up_btn) # Добавляем кнопку "Вверх" в вертикальный макет для кнопок
  33.  
  34. self.move_down_btn = QPushButton('Вниз')
  35. self.move_down_btn.clicked.connect(self.move_down)
  36. buttons_layout.addWidget(self.move_down_btn) # Добавляем кнопку "Вниз" ниже кнопки "Вверх" в вертикальный макет для кнопок
  37.  
  38. # Добавляем вертикальный макет для кнопок в горизонтальный макет
  39. h_layout.addLayout(buttons_layout)
  40. # Создаем вертикальный макет для новых кнопок справа от кнопок "Вверх" и "Вниз"
  41. right_button_frame = QVBoxLayout()
  42. self.add_file_btn = QPushButton('Добавить файл')
  43. self.add_file_btn.clicked.connect(self.open_file_explorer)
  44. # right_button_frame.addSpacing(10)
  45. right_button_frame.addWidget(self.add_file_btn) # Добавляем кнопку "Добавить файл"
  46.  
  47. self.delete_btn = QPushButton('Удалить')
  48. self.delete_btn.clicked.connect(self.delete_selected)
  49. right_button_frame.addWidget(self.delete_btn) # Добавляем кнопку "Удалить"
  50.  
  51. self.merge_pdf_btn = QPushButton('Объединить PDF')
  52. self.merge_pdf_btn.clicked.connect(self.merge_pdfs)
  53. right_button_frame.addWidget(self.merge_pdf_btn) # Добавляем кнопку "Объединить PDF"
  54.  
  55. h_layout.addLayout(right_button_frame) # Добавляем вертикальный макет новых кнопок в горизонтальный макет
  56.  
  57. # Добавляем горизонтальный макет с кнопками в основной вертикальный макет после QListWidget
  58. layout.addLayout(h_layout)
  59.  
  60. # Устанавливаем основной макет для виджета
  61. self.setLayout(layout)
  62.  
  63. def move_up(self):
  64. selected = self.listbox.selectedIndexes()
  65. if selected:
  66. index = selected[0].row()
  67. if index > 0:
  68. item = self.listbox.takeItem(index)
  69. self.listbox.insertItem(index - 1, item)
  70. self.listbox.setCurrentRow(index - 1)
  71.  
  72. def move_down(self):
  73. selected = self.listbox.selectedIndexes()
  74. if selected:
  75. index = selected[0].row()
  76. if index < self.listbox.count() - 1:
  77. item = self.listbox.takeItem(index)
  78. self.listbox.insertItem(index + 1, item)
  79. self.listbox.setCurrentRow(index + 1)
  80.  
  81. def copy_and_rename_files(self, file_paths, destination):
  82. new_file_paths = []
  83. for index, original_path in enumerate(file_paths, start=1):
  84. _, file_extension = os.path.splitext(original_path)
  85. new_file_name = f"{index}{file_extension}"
  86. new_path = os.path.join(destination, new_file_name)
  87. shutil.copy2(original_path, new_path)
  88. new_file_paths.append(new_path)
  89. return new_file_paths
  90.  
  91. def delete_temp_files(self, file_list):
  92. for filepath in file_list:
  93. try:
  94. os.remove(filepath) # print(f'Файл {filepath} был удален.')
  95. except FileNotFoundError:
  96. print(f'Файл не найден: {filepath}')
  97. except OSError as e:
  98. print(f'Ошибка при удалении файла {filepath}: {e}')
  99.  
  100. def merge_pdfs(self):
  101. if not self.selected_files:
  102. QMessageBox.critical(self, "Ошибка", "Список файлов пуст")
  103. return
  104. file_dialog = QFileDialog()
  105. file_dialog.setAcceptMode(QFileDialog.AcceptSave)
  106. file_dialog.setDefaultSuffix('pdf')
  107. output_filename, _ = file_dialog.getSaveFileName(self, "Сохранить файл как", "", "PDF files (*.pdf)")
  108. if not output_filename:
  109. return
  110. new_files = self.copy_and_rename_files(self.selected_files, self.temp_file_path)
  111.  
  112. if len(new_files) >= 4:
  113. os.remove(new_files[3])
  114. del new_files[3]
  115.  
  116. set_chmod = f"for i in {' '.join(new_files)}; do sudo chmod u+rw \"$i\"; sudo chmod g+rw \"$i\"; done"
  117. subprocess.call(['bash', '-c', set_chmod])
  118.  
  119. try:
  120. if not output_filename.lower().endswith('.pdf'):
  121. output_filename += '.pdf'
  122.  
  123. cmd = ['pdfunite'] + new_files + [output_filename]
  124. subprocess.run(cmd, check=True)
  125. subprocess.call(['xdg-open', output_filename])
  126. self.delete_temp_files(new_files)
  127. except Exception as e:
  128. print(f"Ошибка при сохранении файла: {e}")
  129.  
  130. def open_file_explorer(self): # Команда для запуска Zenity с фильтром для mp4 файлов.
  131. cmd = ['zenity', '--file-selection', '--multiple', '--separator=|', '--file-filter=pdf files | *.pdf']
  132. # Вызов Zenity и получение выбранных путей
  133. result = subprocess.run(cmd, check=True, stdout=subprocess.PIPE, text=True) # Удаляем лишние пробельные символы и разделяем строки по
  134. # '|' вместо запятой. Затем разделяем каждый путь, убирая символы новой строки
  135. files = [path for path in result.stdout.strip().replace('\n', '').split('|') if path] # Выводим очищенные пути
  136. if files:
  137. self.selected_files.extend(files)
  138. for file in files:
  139. self.listbox.addItem(file)
  140.  
  141. def delete_selected(self):
  142. selected = self.listbox.selectedIndexes()
  143. for index in sorted(selected, reverse=True):
  144. self.listbox.takeItem(index.row())
  145. del self.selected_files[index.row()]
  146.  
  147.  
  148. app = QApplication(sys.argv)
  149. ex = PdfMerger()
  150. ex.show()
  151. sys.exit(app.exec_())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement