乐于分享
好东西不私藏

《PDF页面乱七八糟,手动排序太麻烦?Python一招搞定:任意分组+拖拽重排+区域标记,效果强到离谱!》

《PDF页面乱七八糟,手动排序太麻烦?Python一招搞定:任意分组+拖拽重排+区域标记,效果强到离谱!》

“带你横跨办公自动化的数据江海”

@摸鱼

前言

关于摸鱼

ABOUT MOYU

闻道有先后,术业有专攻。

各位大佬朋友们好!

~我依旧是你们的老朋友摸鱼~

在职场摸爬滚打的这十多年里,我用Python悄悄干了不少“正事”——不知不觉攒下了一整套办公自动化的实用项目技巧。去年10月初创立了公众号 「码海听潮」 ,初衷很简单:把重复的劳动交给代码,把摸鱼的时间留给生活。

目前已经吭哧吭哧更新了120多篇原创文章,每一篇都是实操干货,不讲虚的,只聊怎么用代码真正解放双手,帮大家早点下班、准点摸鱼

好了,多了不说,少了不唠,今天给大佬们分享一款【PDF文档分组排序工具这款工具可以让你按任意页数分组,自由拖拽调整页面顺序,组内页可单独倒序,支持跨组拖动重排。更厉害的是,它还能框选标记关键区域,并自动同步到每一组的相同位置,一键导出全新排序的PDF文件。完美解决PDF页面混乱、需要批量调整顺序、标记信息提取的痛点,特别适合试卷重组、文档整理、批量排版等场景!

《办公工具成品展示:》

《该办公工具核心功能亮点:》

01

 亮点1:灵活分组,自定义页数🎯

        • 支持自定义每组包含的页数(如2页/组、3页/组)

        • 自动生成缩略图预览,直观展示分组结果

        02

         亮点2:双向拖拽排序📱

            • 组间拖拽:整个分组可以跨组拖动重排

            • 组内拖拽:同一组内的页面可自由拖拽互换位置,完美解决页面顺序混乱问题

            03

            亮点3:关键区域标记

            • 在预览页面用鼠标框选任意区域

            • 自动同步到每一组的相同位置(同一组内第N张页面)

            • 标记区域可清除、可重新选择

            • 特别适合批量提取证件照、签名、印章等固定区域内容

            《该办公工具代码展示:》

            下面,我就用python代码让各位大佬见识一下,什么叫"传统文化"遇上"赛博效率"

            import sysfrom PyQt6.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLineEdit, QLabel, QListWidget, QListWidgetItem, QFileDialog, QFrame, QScrollAreafrom PyQt6.QtGui import QIconfrom PyQt6.QtCore import Qt, QSizeclass DraggableListWidget(QListWidget):    def __init__(self, parent=None):        super().__init__(parent)        self.setAcceptDrops(True)        self.setDragEnabled(True)        self.setSelectionMode(QListWidget.SelectionMode.SingleSelection)        self.setDragDropMode(QListWidget.DragDropMode.InternalMove)        self.setDefaultDropAction(Qt.DropAction.MoveAction)        self.viewport().setAcceptDrops(True)class PDFSorterWindow(QMainWindow):    def __init__(self):        super().__init__()        self.setWindowTitle('PDF分组排序工具(欢迎关注微信公众号:码海听潮)')        self.setGeometry(1001001100900)        self.init_ui()    def init_ui(self):        central_widget = QWidget()        self.setCentralWidget(central_widget)        main_layout = QVBoxLayout(central_widget)        main_layout.setContentsMargins(10101010)        main_layout.setSpacing(10)        # 第一行:加载 PDF 和文件路径输入框        top_layout = QHBoxLayout()        top_layout.setSpacing(5)        self.load_btn = QPushButton('📂 加载 PDF')        top_layout.addWidget(self.load_btn)        self.file_path_input = QLineEdit()        self.file_path_input.setPlaceholderText('PDF文件路径')        self.file_path_input.setReadOnly(True)        self.file_path_input.setMinimumWidth(400)        top_layout.addWidget(self.file_path_input)        top_layout.addStretch()        main_layout.addLayout(top_layout)        # 第二行:其他功能按钮        button_layout = QHBoxLayout()        button_layout.setSpacing(5)        range_label = QLabel('📄 分组范围:')        button_layout.addWidget(range_label)        self.start_page_input = QLineEdit()        self.start_page_input.setText('1')        self.start_page_input.setFixedWidth(50)        button_layout.addWidget(self.start_page_input)        range_label2 = QLabel('到')        button_layout.addWidget(range_label2)        self.end_page_input = QLineEdit()        self.end_page_input.setText('1')        self.end_page_input.setFixedWidth(50)        button_layout.addWidget(self.end_page_input)        self.update_range_btn = QPushButton('✅ 应用范围')        self.update_range_btn.setEnabled(False)        button_layout.addWidget(self.update_range_btn)        button_layout.addSpacing(15)        self.group_size_label = QLabel('每页组数:')        button_layout.addWidget(self.group_size_label)        self.group_size_input = QLineEdit()        self.group_size_input.setText('2')        self.group_size_input.setFixedWidth(40)        button_layout.addWidget(self.group_size_input)        self.regroup_btn = QPushButton('🔄 重新分组')        self.regroup_btn.setEnabled(False)        button_layout.addWidget(self.regroup_btn)        self.reverse_btn = QPushButton('⬅️➡️ 倒序排列')        self.reverse_btn.setEnabled(False)        button_layout.addWidget(self.reverse_btn)        self.group_reverse_btn = QPushButton('⬆️⬇️ 组内倒序')        self.group_reverse_btn.setEnabled(False)        button_layout.addWidget(self.group_reverse_btn)        self.clear_marker_btn = QPushButton('🗑️ 清除所有标记')        self.clear_marker_btn.setEnabled(False)        button_layout.addWidget(self.clear_marker_btn)        self.export_btn = QPushButton('💾 导出新PDF')        self.export_btn.setEnabled(False)        button_layout.addWidget(self.export_btn)        self.clear_btn = QPushButton('🗑️ 清空')        button_layout.addWidget(self.clear_btn)        button_layout.addStretch()        main_layout.addLayout(button_layout)        # 列表控件        self.list_widget = DraggableListWidget()        main_layout.addWidget(self.list_widget)        # 状态栏        status_layout = QHBoxLayout()        self.status_label = QLabel('📌 未加载 PDF 文件')        status_layout.addWidget(self.status_label)        main_layout.addLayout(status_layout)if __name__ == '__main__':    app = QApplication(sys.argv)    window = PDFSorterWindow()    window.show()    sys.exit(app.exec())

            通过上面Python自动化脚本,仅用几分钟的时间就完成原需手动操作数小时甚至数天的工作任务。从最初准备手动人工机械操作的麻木到用python实现高效自动化的畅快,工作效率获得指数级提升,终于实现了不加班熬夜的自由!

            大佬们也可以举一反三,参照上面的代码思路根据自己工作中的实际情况来具体问题具体分析,实现自己定制化的需求。

            《该办公工具的应用场景:》

            场景

            PDF试卷/文档页面重组

            批量提取PDF文档特定区域内容

            PDF文档页面顺序调整

            PDF文档排版整理

            结语

            当Python遇见办公,牛马打工人终于笑出了猪叫声

            【职场人必看】每天早上一睁眼,想到又要面对:

            1.📊 堆积如山的Excel表格

            2.📑 机械重复的复制粘贴

            3.✍️ 永远改不完的各类文档

            4.诸如此类的更多........

            是不是连Ctrl+Alt+Delete的心都有了?

            别慌!别急,摸鱼这位“职场外挂”已经带着Python代码来拯救你了!

            感谢各位大佬观看,还望各位大佬抬抬贵手一键三连,多多关注点赞转发评论,大佬们的支持才是摸鱼孜孜不倦更新原创干货的动力!

            另外,本篇文章的exe已上传nas私有云盘,有需要的大佬私信摸鱼君获取