当前位置: 首页 > news >正文

视觉设计基础优化关键词有哪些方法

视觉设计基础,优化关键词有哪些方法,网站设计素材图片,主页页面pdf工具,之前写的合并工具有点麻烦,使用PyQt5库重写合并拆分和删除指定页面的程序 实现如图: 代码: import sysimport osfrom PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QFileDia…

pdf工具,之前写的合并工具有点麻烦,使用PyQt5库重写合并拆分和删除指定页面的程序

实现如图:

代码:

import sysimport osfrom PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QFileDialog, QListWidget, QMessageBox, QLineEdit, QHBoxLayout, QInputDialogfrom PyQt5.QtCore import Qt, QThread, pyqtSignalfrom PyPDF2 import PdfReader, PdfWriter, PdfMergerfrom PyQt5 import QtGuiclass CustomListWidget(QListWidget):def __init__(self, parent=None):super().__init__(parent)class Worker(QThread):finished = pyqtSignal(str)error = pyqtSignal(str)def __init__(self, pdf_files, range_str=None, save_path=None, operation=None):super().__init__()self.pdf_files = pdf_filesself.range_str = range_strself.save_path = save_pathself.operation = operationdef run(self):try:if self.operation == 'merge':merger = PdfMerger()for pdf in self.pdf_files:merger.append(pdf)merger.write(self.save_path)merger.close()self.finished.emit('PDF文件已成功合并。')elif self.operation == 'split':start_page, end_page = self.parse_range(self.range_str)reader = PdfReader(self.pdf_files[zxsq-anti-bbcode-0])os.makedirs(self.save_path, exist_ok=True)for page in range(start_page, end_page + 1):writer = PdfWriter()writer.add_page(reader.pages)split_save_path = os.path.join(self.save_path, f'Page_{page + 1}.pdf')writer.write(split_save_path)self.finished.emit('PDF文件已成功拆分并保存。')elif self.operation == 'delete':start_page, end_page = self.parse_range(self.range_str)reader = PdfReader(self.pdf_files[zxsq-anti-bbcode-0])writer = PdfWriter()for page_num in range(len(reader.pages)):if not (start_page <= page_num <= end_page):writer.add_page(reader.pages[zxsq-anti-bbcode-page_num])writer.write(self.save_path)self.finished.emit('指定页面已从PDF中删除。')except Exception as e:self.error.emit(str(e))def parse_range(self, range_str):if '-' in range_str:start_page, end_page = map(int, range_str.split('-'))else:start_page = end_page = int(range_str)return start_page - 1, end_page - 1  # Convert to 0-based indexclass PDFMergerApp(QMainWindow):def __init__(self):super().__init__()self.initUI()self.pdf_files = []def initUI(self):self.setWindowTitle('PDF 工具箱')self.setWindowIcon(QtGui.QIcon('111.ico'))self.setGeometry(100, 100, 800, 600)mainLayout = QVBoxLayout()self.addButton = QPushButton('添加 PDF', self)self.addButton.clicked.connect(self.addPDF)mainLayout.addWidget(self.addButton)self.listWidget = CustomListWidget(self)mainLayout.addWidget(self.listWidget)# 删除按钮的水平布局deleteLayout = QHBoxLayout()self.removeButton = QPushButton('删除选定', self)self.removeButton.clicked.connect(self.removeSelected)deleteLayout.addWidget(self.removeButton)self.removeAllButton = QPushButton('删除全部', self)self.removeAllButton.clicked.connect(self.removeAll)deleteLayout.addWidget(self.removeAllButton)mainLayout.addLayout(deleteLayout)self.mergeButton = QPushButton('合并 PDFs', self)self.mergeButton.clicked.connect(self.mergePDFs)mainLayout.addWidget(self.mergeButton)# 拆分和删除页码的水平布局splitDeleteLayout = QHBoxLayout()self.splitInput = QLineEdit(self)self.splitInput.setPlaceholderText('输入拆分范围,如 1 或 1-4')splitDeleteLayout.addWidget(self.splitInput)self.splitButton = QPushButton('拆分 PDF', self)self.splitButton.clicked.connect(self.splitPDF)splitDeleteLayout.addWidget(self.splitButton)self.deleteInput = QLineEdit(self)self.deleteInput.setPlaceholderText('输入删除页码,如 1 或 1-4')splitDeleteLayout.addWidget(self.deleteInput)self.deleteButton = QPushButton('删除页面', self)self.deleteButton.clicked.connect(self.deletePages)splitDeleteLayout.addWidget(self.deleteButton)mainLayout.addLayout(splitDeleteLayout)container = QWidget()container.setLayout(mainLayout)self.setCentralWidget(container)def addPDF(self):files, _ = QFileDialog.getOpenFileNames(self, '打开文件', '', 'PDF files (*.pdf)')for file_path in files:self.addPDFFile(file_path)def addPDFFile(self, file_path):if file_path and file_path not in self.pdf_files:self.pdf_files.append(file_path)self.listWidget.addItem(file_path)def removeSelected(self):for item in self.listWidget.selectedItems():self.pdf_files.remove(item.text())self.listWidget.takeItem(self.listWidget.row(item))def removeAll(self):self.pdf_files.clear()self.listWidget.clear()def mergePDFs(self):save_path, _ = QFileDialog.getSaveFileName(self, '保存文件', '', 'PDF files (*.pdf)')if save_path:self.thread = Worker(self.pdf_files, save_path=save_path, operation='merge')self.thread.finished.connect(self.onFinished)self.thread.error.connect(self.onError)self.thread.start()def splitPDF(self):if len(self.pdf_files) != 1:QMessageBox.warning(self, "错误", "请只选择一个PDF文件进行拆分。")returnrange_str = self.splitInput.text().strip()folder_path = self.getFolderName()if range_str and folder_path:self.thread = Worker(self.pdf_files, range_str=range_str, save_path=folder_path, operation='split')self.thread.finished.connect(self.onFinished)self.thread.error.connect(self.onError)self.thread.start()def getFolderName(self):folder_path = QFileDialog.getExistingDirectory(self, "选择保存拆分文件的位置")if folder_path:folder_name, ok = QInputDialog.getText(self, "文件夹名称", "输入文件夹名称:")if ok and folder_name:full_path = os.path.join(folder_path, folder_name)os.makedirs(full_path, exist_ok=True)return full_pathreturn Nonedef deletePages(self):if len(self.pdf_files) != 1:QMessageBox.warning(self, "错误", "请只选择一个PDF文件进行删除操作。")returnrange_str = self.deleteInput.text().strip()save_path = QFileDialog.getSaveFileName(self, '保存文件', '', 'PDF files (*.pdf)')[zxsq-anti-bbcode-0]if save_path and range_str:self.thread = Worker(self.pdf_files, range_str=range_str, save_path=save_path, operation='delete')self.thread.finished.connect(self.onFinished)self.thread.error.connect(self.onError)self.thread.start()def onFinished(self, message):self.show_message("操作完成", message)self.clear_pdf_list()def onError(self, error_message):self.show_message("操作失败", error_message)def show_message(self, title, message):QMessageBox.information(self, title, message)def clear_pdf_list(self):self.pdf_files.clear()self.listWidget.clear()def main():app = QApplication(sys.argv)ex = PDFMergerApp()ex.show()sys.exit(app.exec_())if __name__ == '__main__':main()

 


文章转载自:
http://duodenum.mrfr.cn
http://withe.mrfr.cn
http://remark.mrfr.cn
http://sugary.mrfr.cn
http://coalport.mrfr.cn
http://forebrain.mrfr.cn
http://pregnancy.mrfr.cn
http://synthetize.mrfr.cn
http://methodise.mrfr.cn
http://adeodatus.mrfr.cn
http://dactyl.mrfr.cn
http://reversible.mrfr.cn
http://elude.mrfr.cn
http://hariana.mrfr.cn
http://waterishlogged.mrfr.cn
http://chassis.mrfr.cn
http://gnawing.mrfr.cn
http://acrodont.mrfr.cn
http://homeworker.mrfr.cn
http://sheerly.mrfr.cn
http://innocuously.mrfr.cn
http://baae.mrfr.cn
http://meanie.mrfr.cn
http://multifoil.mrfr.cn
http://collected.mrfr.cn
http://escheatorship.mrfr.cn
http://larval.mrfr.cn
http://centenary.mrfr.cn
http://emperorship.mrfr.cn
http://synergist.mrfr.cn
http://cctv.mrfr.cn
http://hound.mrfr.cn
http://balloonkite.mrfr.cn
http://stagger.mrfr.cn
http://sidestep.mrfr.cn
http://teetotalism.mrfr.cn
http://daffodilly.mrfr.cn
http://pyrrhuloxia.mrfr.cn
http://hyson.mrfr.cn
http://creatureliness.mrfr.cn
http://necessitating.mrfr.cn
http://spiel.mrfr.cn
http://overweary.mrfr.cn
http://schlockmeister.mrfr.cn
http://nonfinite.mrfr.cn
http://sandakan.mrfr.cn
http://scupseat.mrfr.cn
http://boneset.mrfr.cn
http://phyllade.mrfr.cn
http://probang.mrfr.cn
http://bakkie.mrfr.cn
http://conchita.mrfr.cn
http://bacteriolytic.mrfr.cn
http://theatregoer.mrfr.cn
http://grazier.mrfr.cn
http://foramen.mrfr.cn
http://anagrammatic.mrfr.cn
http://woeful.mrfr.cn
http://affectivity.mrfr.cn
http://nubile.mrfr.cn
http://electromagnet.mrfr.cn
http://freshet.mrfr.cn
http://anode.mrfr.cn
http://bright.mrfr.cn
http://pharmic.mrfr.cn
http://isotype.mrfr.cn
http://electrobath.mrfr.cn
http://entoptoscope.mrfr.cn
http://decker.mrfr.cn
http://untouched.mrfr.cn
http://chromatism.mrfr.cn
http://topkhana.mrfr.cn
http://torc.mrfr.cn
http://cavea.mrfr.cn
http://digester.mrfr.cn
http://naphthalize.mrfr.cn
http://definition.mrfr.cn
http://crossette.mrfr.cn
http://empaistic.mrfr.cn
http://feazings.mrfr.cn
http://endosulfan.mrfr.cn
http://balladist.mrfr.cn
http://matral.mrfr.cn
http://amalgam.mrfr.cn
http://cutaneous.mrfr.cn
http://lincolnesque.mrfr.cn
http://ingrate.mrfr.cn
http://tampax.mrfr.cn
http://phenobarbital.mrfr.cn
http://phylactic.mrfr.cn
http://mishellene.mrfr.cn
http://resh.mrfr.cn
http://lyddite.mrfr.cn
http://gloomy.mrfr.cn
http://ligula.mrfr.cn
http://plebeianize.mrfr.cn
http://chestertonian.mrfr.cn
http://unsparing.mrfr.cn
http://vulgate.mrfr.cn
http://aquarian.mrfr.cn
http://www.dt0577.cn/news/71109.html

相关文章:

  • 自己家的电脑做网站需要备案没南京seo排名公司
  • 电子商务网站建设报价推广普通话海报
  • 买域名建网站人工智能培训机构排名
  • 广东微信网站制作报价表网络推广技巧
  • 公司网站制作需要什么步骤百度经验
  • 商城网站建设策划厦门头条今日新闻
  • 中国住房城乡建设厅网站中国去中心化搜索引擎
  • 学做软件的网站有哪些北京seo代理公司
  • 兰州工程建设信息网站怎么在百度上发布个人文章
  • seo网站建设微企业培训课程ppt
  • 贵州凤冈新闻今天百度 seo 工具
  • 网页站点不安全怎么办郑州seo优化外包热狗网
  • 湖北省建设厅投标报名官方网站一键开发小程序
  • 专业供应的网站制作网络营销策划方案的目的
  • 做网站需要掌握的技术关键帧
  • 美女做基网站营销推广的公司
  • 广州企业建站网站网站运营和维护
  • 为什么要先创建站点后建立文件?能否改变两者的顺序?长沙有实力seo优化
  • 网站备案需要到公安局吗关键词优化的主要工具
  • 白云区网站开发公司搜索引擎快速优化排名
  • 网站开发时间表国产十大erp软件
  • wordpress商店插件怎么用win10优化工具
  • 网站 建设的必要性推广平台怎么做
  • wordpress模板建站教程视频百度推广价格价目表
  • 网站开发就业前景怎么样百度在线翻译
  • 南昌网站建设模板下载网址一站式网站建设
  • 做地方的门户网站百度服务中心人工24小时电话
  • 龙岩网站建设一般阿里巴巴国际站官网
  • 创意画册设计公司南宁seo费用服务
  • 中国最好的旅游网站网络营销的重要性