-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
204 lines (181 loc) · 7.33 KB
/
main.py
File metadata and controls
204 lines (181 loc) · 7.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
import sys
from PySide6.QtCore import Qt
from PySide6.QtGui import QAction
from PySide6.QtWidgets import (
QApplication,
QDialog,
QFileDialog,
QHBoxLayout,
QListWidget,
QMainWindow,
QMenu,
QMessageBox,
QPushButton,
QScrollArea,
QVBoxLayout,
QWidget,
)
from pdf_operations import merge_pages_to_pdf
from viewer import PDFViewer
from workspace import Workspace
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Simple PDF Editor")
self.resize(900, 700)
self.workspace = Workspace()
self._init_ui()
def _init_ui(self):
self._init_toolbars()
self._init_central_widget()
self._init_context_menu()
def _init_toolbars(self):
# 文件工具栏
file_toolbar = self.addToolBar("文件")
self._add_toolbar_action(file_toolbar, "新建工作区", self.new_workspace)
self._add_toolbar_action(file_toolbar, "添加PDF", self.open_pdf)
self._add_toolbar_action(file_toolbar, "删除PDF", self.delete_pdf)
# 编辑工具栏
edit_toolbar = self.addToolBar("编辑")
self._add_toolbar_action(
edit_toolbar, "左旋90°", lambda: self.rotate_selected_pages(-90)
)
self._add_toolbar_action(
edit_toolbar, "右旋90°", lambda: self.rotate_selected_pages(90)
)
self._add_toolbar_action(edit_toolbar, "删除页面", self.delete_selected_pages)
self._add_toolbar_action(
edit_toolbar, "合并选中页面", self.merge_selected_pages
)
# 保存工具栏
save_toolbar = self.addToolBar("保存")
self._add_toolbar_action(save_toolbar, "保存工作区", self.merge_all_pages)
def _add_toolbar_action(self, toolbar, text, slot):
action = QAction(text, self)
action.triggered.connect(slot)
toolbar.addAction(action)
def _init_central_widget(self):
central_widget = QWidget()
layout = QVBoxLayout(central_widget)
self.viewer = PDFViewer(self.workspace)
scroll = QScrollArea()
scroll.setWidgetResizable(True)
scroll.setWidget(self.viewer)
layout.addWidget(scroll)
self.setCentralWidget(central_widget)
def _init_context_menu(self):
self.viewer.setContextMenuPolicy(Qt.CustomContextMenu)
self.viewer.customContextMenuRequested.connect(self.show_context_menu)
def new_workspace(self):
self.workspace.clear()
self.viewer.update_view()
def open_pdf(self):
file_paths, _ = QFileDialog.getOpenFileNames(
self, "添加PDF文件", "", "PDF Files (*.pdf)"
)
if file_paths:
for file_path in file_paths:
self.workspace.add_pdf(file_path)
self.viewer.update_view()
def delete_pdf(self):
if not self.workspace.pdf_files:
QMessageBox.warning(self, "警告", "当前工作区没有PDF文件可删除。")
return
pdf_names = [pdf.file_path.split("/")[-1] for pdf in self.workspace.pdf_files]
selected_items = self._show_multi_select_dialog(
"删除PDF", "选择要删除的PDF文件:", pdf_names
)
if selected_items:
for item in selected_items:
self.workspace.remove_pdf_by_name(item)
self.workspace.update()
self.viewer.update_view()
def _show_multi_select_dialog(self, title, label, items):
dialog = QDialog(self)
dialog.setWindowTitle(title)
layout = QVBoxLayout(dialog)
list_widget = QListWidget()
list_widget.addItems(items)
list_widget.setSelectionMode(QListWidget.MultiSelection)
layout.addWidget(list_widget)
button_layout = QHBoxLayout()
ok_button = QPushButton("确定")
cancel_button = QPushButton("取消")
button_layout.addWidget(ok_button)
button_layout.addWidget(cancel_button)
layout.addLayout(button_layout)
ok_button.clicked.connect(dialog.accept)
cancel_button.clicked.connect(dialog.reject)
if dialog.exec() == QDialog.Accepted:
return [item.text() for item in list_widget.selectedItems()]
return []
def show_context_menu(self, pos):
global_pos = self.viewer.mapToGlobal(pos)
menu = QMenu(self)
menu.addAction("合并选中页面并另存为", self.merge_selected_pages)
menu.addAction("左旋90°", lambda: self.rotate_selected_pages(-90))
menu.addAction("右旋90°", lambda: self.rotate_selected_pages(90))
menu.addAction("删除页面", self.delete_selected_pages)
menu.exec(global_pos)
def merge_selected_pages(self):
selected_labels = self.viewer.selected_pages
if not selected_labels:
QMessageBox.warning(self, "提示", "请先选中要合并的页面。")
return
save_path, _ = QFileDialog.getSaveFileName(
self, "保存合并后的PDF", "", "PDF Files (*.pdf)"
)
if not save_path:
return
selected_pages = [label.page for label in selected_labels]
merge_pages_to_pdf(selected_pages, save_path)
QMessageBox.information(self, "完成", "合并并保存成功。")
def merge_all_pages(self):
all_labels = self.viewer._all_labels
all_pages = [label.page for label in all_labels]
if not all_pages:
QMessageBox.warning(self, "提示", "当前没有可合并的页面。")
return
save_path, _ = QFileDialog.getSaveFileName(
self, "保存合并后的PDF", "", "PDF Files (*.pdf)"
)
if not save_path:
return
merge_pages_to_pdf(all_pages, save_path)
QMessageBox.information(self, "完成", "合并并保存成功。")
def rotate_selected_pages(self, angle):
selected_labels = list(self.viewer.selected_pages)
if not selected_labels:
QMessageBox.warning(self, "提示", "请先选中要旋转的页面。")
return
selected_pages = [label.page for label in selected_labels]
for label in selected_labels:
page = label.page
page.rotation = (page.rotation + angle) % 360
page.update_thumbnail()
label.setPixmap(page.thumbnail)
self.viewer.update_view()
self.viewer.selected_pages.clear()
for label in self.viewer._all_labels:
if label.page in selected_pages:
label.setStyleSheet("background-color: lightblue;")
self.viewer.selected_pages.append(label)
def delete_selected_pages(self):
selected_labels = self.viewer.selected_pages
if not selected_labels:
QMessageBox.warning(self, "提示", "请先选中要删除的页面。")
return
for label in selected_labels:
page = label.page
for pdf_file in self.workspace.pdf_files:
if page in pdf_file.pages:
pdf_file.pages.remove(page)
self.workspace.update()
self.viewer.update_view()
def show_waiting(self):
QMessageBox.information(self, "未完成", "该功能尚未完成,敬请期待。")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())