用python写了一个简单的pdf文件合并器,带GUI界面
exe文件下载地址:链接:https://pan.baidu.com/s/1MowKrrS_4mvdNiBUBe7Gwg
提取码:1hul
源码献上:
import os
import sys
from datetime import datetime
from PyPDF2 import PdfMerger
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QFileDialog, \
QProgressBar, QLabel, QListWidget, QListWidgetItem, QLineEdit
class PDFMergerApp(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("PDF Merger")
self.setGeometry(200, 100, 1500, 1200)
self.file_paths = []
self.file_save_path = ''
self.merger = PdfMerger()
self.progress = QProgressBar()
self.progress.setRange(0, 100)
self.progress.setValue(0)
self.label_status = QLabel("Ready")
self.button_select = QPushButton("选择文件")
self.button_select.clicked.connect(self.select_files)
self.button_merge = QPushButton("合并文件")
self.button_merge.clicked.connect(self.merge_files)
self.button_cancel = QPushButton("中止合并")
self.button_cancel.setEnabled(False)
self.button_cancel.clicked.connect(self.cancel_merge)
self.file_list = QListWidget()
layout = QVBoxLayout()
layout.addWidget(self.button_select)
layout.addWidget(self.file_list)
progress_layout = QHBoxLayout()
progress_layout.addWidget(self.progress)
progress_layout.addWidget(self.label_status)
layout.addLayout(progress_layout)
layout.addWidget(self.button_merge)
layout.addWidget(self.button_cancel)
central_widget = QWidget()
central_widget.setLayout(layout)
self.setCentralWidget(central_widget)
# 添加新的一行,包含一个标签,一个输入框,和一个按钮
self.save_dir_label = QLabel('文件保存目录:')
self.save_dir_input = QLineEdit(self)
self.save_dir_input.setReadOnly(True)
self.get_dir_button = QPushButton('选择目录', self)
self.get_dir_button.clicked.connect(self.select_save_dir)
input_layout = QHBoxLayout()
input_layout.addWidget(self.save_dir_label)
input_layout.addWidget(self.save_dir_input)
input_layout.addWidget(self.get_dir_button)
layout.addLayout(input_layout)
layout.addWidget(self.button_merge)
layout.addWidget(self.button_cancel)
central_widget = QWidget()
central_widget.setLayout(layout)
self.setCentralWidget(central_widget)
def select_files(self):
options = QFileDialog.Options()
options |= QFileDialog.ReadOnly
file_dialog = QFileDialog()
file_dialog.setFileMode(QFileDialog.ExistingFiles)
files, _ = file_dialog.getOpenFileNames(self, "Select PDF Files", "", "PDF Files (*.pdf)", options=options)
self.file_paths.extend(files)
self.file_list.clear()
for path in self.file_paths:
item = QListWidgetItem() # create the item without any text
delete_button = QPushButton("删除")
delete_button.clicked.connect(lambda _, item=item: self.delete_file(item))
delete_button.setFixedWidth(100)
widget = QWidget()
widget_layout = QHBoxLayout()
widget_layout.addWidget(QLabel(path)) # create the QLabel with the file path
widget_layout.addWidget(delete_button)
widget.setLayout(widget_layout)
item.setSizeHint(widget.sizeHint())
self.file_list.addItem(item)
self.file_list.setItemWidget(item, widget)
def delete_file(self, item):
row = self.file_list.row(item)
self.file_list.takeItem(row)
del self.file_paths[row]
def merge_files(self):
if len(self.file_paths) < 2:
self.label_status.setText("请先选择2个或2个以上pdf文件")
return
if self.file_save_path == '':
self.label_status.setText("请指定文件保存目录")
return
self.button_select.setEnabled(False)
self.button_merge.setEnabled(False)
self.button_cancel.setEnabled(True)
self.merger = PdfMerger()
output_file_name = self.file_save_path + '/' + datetime.now().strftime("%Y%m%d%H%M%S") + ".pdf"
for path in self.file_paths:
self.merger.append(path)
self.merger.write(output_file_name)
self.merger.close()
self.progress.setValue(100)
self.label_status.setText("Merge completed: " + output_file_name)
self.button_select.setEnabled(True)
self.button_merge.setEnabled(True)
self.button_cancel.setEnabled(False)
def cancel_merge(self):
self.merger.close()
self.progress.setValue(0)
self.label_status.setText("Merge canceled")
self.button_select.setEnabled(True)
self.button_merge.setEnabled(True)
self.button_cancel.setEnabled(False)
def on_click(self):
content = self.input.text()
print(f'输入的内容是: {content}')
def select_save_dir(self):
directory = QFileDialog.getExistingDirectory(self, "选择一个目录")
if directory:
self.save_dir_input.setText(directory)
self.file_save_path = directory
if __name__ == "__main__":
app = QApplication(sys.argv)
window = PDFMergerApp()
window.show()
sys.exit(app.exec_())
界面截图: