川小胖学python

博客园 首页 新随笔 联系 订阅 管理

cad最终出图时,需要将图纸转成pdf文件,并附带图纸目录提交。通常习惯以图号命名pdf文件,例如“37MC620319CSTZLQ-023”,“37MC620319CSTZLQ-024”等。将cad批量打印为pdf已有不少插件,例如batchplot,贱人工具箱等。因此我需要的功能较为简单,如下:

  • 批量打印时已经按照图号顺序转为pdf,获取每个pdf生成时间
  • 根据pdf生成时间自动排序,以图号命名文件(用户只需要输入图号前缀和图号起始值)
  • 自动生成目录。

需要用到的包有os,sys,pyqt5,openpyxl。其中,pyqt5只是为了做个界面,方便其他人使用,如有编程基础,可以舍弃界面提高启动速度。启动后界面如下:

完整代码如下:

  1 import os, sys, openpyxl
  2 from PyQt5.QtWidgets import QMainWindow, QWidget, QPushButton, QLabel, QHBoxLayout, QVBoxLayout, \
  3     QApplication, QStatusBar, QGroupBox, QLineEdit, QMessageBox, QProgressBar
  4 
  5 
  6 class Mywin(QMainWindow):
  7 
  8     def __init__(self):
  9         super(Mywin, self).__init__()
 10         self.step = 0  # 初始值设置为0,计划后期改进时添加进度条,作为起始值
 11         self.initui()
 12 
 13     def initui(self):
 14         # self.pbar = QProgressBar() #计划后期改进时添加进度条,
 15 
 16         self.setWindowTitle('川小胖工具箱')
 17         self.resize(340, 280)
 18         self.statusBar = QStatusBar()
 19         # self.statusBar.showMessage('内测版1.0',0)
 20         self.statusBar.showMessage('状态栏')
 21         # ======重命名文件========
 22         groupbox_1 = QGroupBox('重命名文件', self)
 23 
 24         lineedit_start = QLineEdit()
 25         lineedit_pre = QLineEdit()
 26         lbl_pre = QLabel('设定前缀', self)
 27         lbl_start = QLabel('起始值', self)
 28         # lbl_pre.setMaximumWidth(130)
 29         # lbl_start.setMaximumWidth(50)
 30         _ = QLabel()
 31         btn_ok = QPushButton('重命名', self)
 32         hbx1 = QHBoxLayout()
 33         hbx1.addWidget(lbl_pre)
 34         hbx1.addWidget(lbl_start)
 35         hbx1.addWidget(_)
 36         hbx2 = QHBoxLayout()
 37         hbx2.addWidget(lineedit_pre)
 38         hbx2.addWidget(lineedit_start)
 39         hbx2.addWidget(btn_ok)
 40         vbx = QVBoxLayout()
 41         vbx.addLayout(hbx1)
 42         vbx.addLayout(hbx2)
 43         groupbox_1.setLayout(vbx)
 44 
 45         # ======添加生成目录控件=====
 46         lbl = QLabel('使用说明:\n1.将所有pdf文件放入同一文件夹下;\n2.根据需要点击下方按钮。', self)
 47         lbl_no = QLabel('内测版0.1', self)
 48         btn_excel = QPushButton('转为excel')
 49         btn_excel.setMaximumWidth(100)
 50         btn_txt = QPushButton('转为txt')
 51         btn_txt.setMaximumWidth(100)
 52 
 53         # 设置布局
 54         hbx = QHBoxLayout()
 55         hbx.addWidget(btn_txt)
 56         hbx.addWidget(btn_excel)
 57         vbx = QVBoxLayout()
 58         vbx.addWidget(lbl)
 59         vbx.addLayout(hbx)
 60 
 61         groupbox_2 = QGroupBox('自动生成目录', self)
 62         groupbox_2.setLayout(vbx)
 63 
 64         vbx1 = QVBoxLayout()
 65         vbx1.addWidget(groupbox_1)
 66         vbx1.addWidget(groupbox_2)
 67         vbx1.addWidget(lbl_no)
 68         widget = QWidget()
 69         widget.setLayout(vbx1)
 70         self.setCentralWidget(widget)
 71         # self.setLayout(vbx)
 72         # btn_ok.clicked.connect(self.action)
 73 
 74         #链接函数
 75         btn_ok.clicked.connect(lambda: self.rename(lineedit_pre, lineedit_start))
 76         btn_excel.clicked.connect(lambda: self.output_contents(btn_excel))
 77         btn_txt.clicked.connect(lambda: self.output_contents(btn_txt))
 78 
 79     def output_contents(self, btn):
 80         # =========1.获取文件名,将所有pdf文件名存入列表中===========
 81         path = os.getcwd()  # 获取程序所在文件夹路径
 82         files = os.listdir(path)  # 获取指定路径下的所有文件的文件名称
 83         list_pdf = [file.replace('.pdf', '').split('.') for file in files if file.split('.')[-1] in ['pdf']]
 84         # ==========2.判断用户选项,做出响应===========
 85         if btn.text() == '转为txt':
 86             with open('目录.txt', 'w', encoding='utf-8') as f:
 87                 for i in list_pdf:
 88                     f.write(' '.join(i) + '\n')
 89 
 90         elif btn.text() == '转为excel':
 91             list_pdf.insert(0, ['序号', '图名'])
 92             # =====创建对象=====
 93             wb = openpyxl.Workbook()  # W”要大写
 94             worksheet = wb.active  # 获取当前活跃的worksheet,默认就是第一个worksheet
 95             worksheet.title = "目录"
 96             # =====写入数据=====
 97             for i in list_pdf:
 98                 worksheet.append(i)
 99             # =====调整格式=====
100             # for row in worksheet.rows:
101             #     for cell in row:
102             #         cell.alignment = Alignment(horizontal='center', vertical='center')
103             wb.save(filename='目录.xlsx')
104 
105     def rename(self, pre, start):
106 
107         for i in [pre, start]:  # 检查是否有漏输入项
108             if i.text() == '':
109                 QMessageBox.about(self, '参数缺失', '有参数尚未输入,请检查!')
110                 i.setFocus()
111                 break
112         else:
113             files = os.listdir(os.getcwd())  # 获取指定路径下的所有文件的文件名称
114             list_pdf = [file for file in files if file.split('.')[-1] in ['pdf']]
115             list_time = [os.path.getctime(i) for i in list_pdf]
116             new_list = sorted(list(zip(list_time, list_pdf)), key=lambda x: float(x[0]))
117 
118             start1 = int(start.text())
119             pre1 = pre.text()
120             end = start1 + len(list_pdf) + 1
121             _ = list(zip([i for i in range(start1, end + 1)], new_list))
122             for index, i in enumerate(_):
123                 newname = str(index + 1) + '.' + pre1 + str(i[0]) + '.pdf'
124                 os.rename(i[1][1], newname)
125             QMessageBox.about(self, '完成', '所有文件已重命名!')
126 
127     def action(self):
128         """测试功能"""
129         pass
130 
131 
132 if __name__ == '__main__':
133     app = QApplication(sys.argv)
134     win = Mywin()
135     win.show()
136     sys.exit(app.exec_())
批量重命名及自动生成目录

打包为exe后,可能文件体积较大,可在".spec"文件中将不需要的包剔除。

 

posted on 2021-01-04 15:18  川小胖学Python  阅读(346)  评论(0编辑  收藏  举报