网络编程
位置:首页>> 网络编程>> Python编程>> 基于PyQt5完成pdf转word功能

基于PyQt5完成pdf转word功能

作者:疯狂的豆包  发布时间:2022-05-17 13:06:47 

标签:PyQt5,pdf,word

PyQt是Qt框架的Python语言实现,是最强大的GUI库之一。PyQt提供了一个设计良好的窗口控件集合,具有更方便的操作性。学过VB的同学会知道,相比与VB的使用,在界面设计上元素更丰富。

本文就是基于PyQt5完成的pdf转word功能,先看界面:

基于PyQt5完成pdf转word功能

一、界面PdfZ.ui可参考之前的文章如何实现,程序代码如下:

from PyQt5 import QtCore, QtGui, QtWidgets
import  base64
import os
from return_png import img as retu  # 引入img变量,赋别名为pdf_cf

class Ui_PdfZ(object):
   def setupUi(self, PdfZ):
       tmp = open('return.png', 'wb')  # 创建临时的文件
       tmp.write(base64.b64decode(retu))  # 把这个one图片解码出来,写入文件中去。
       tmp.close()
       PdfZ.setObjectName("PdfZ")
       PdfZ.resize(1400, 814)
       PdfZ.setMinimumSize(QtCore.QSize(1400, 814))
       PdfZ.setMaximumSize(QtCore.QSize(1400, 814))
       palette = QtGui.QPalette()
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)
       PdfZ.setPalette(palette)
       self.Reback = QtWidgets.QToolButton(PdfZ)
       self.Reback.setGeometry(QtCore.QRect(10, 10, 51, 41))
       palette = QtGui.QPalette()
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipBase, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipBase, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipBase, brush)
       self.Reback.setPalette(palette)
       icon = QtGui.QIcon()
       icon.addPixmap(QtGui.QPixmap("return.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
       self.Reback.setIcon(icon)
       self.Reback.setIconSize(QtCore.QSize(100, 100))
       self.Reback.setAutoRaise(True)
       self.Reback.setObjectName("Reback")
       self.label = QtWidgets.QLabel(PdfZ)
       self.label.setGeometry(QtCore.QRect(88, 8, 171, 41))
       font = QtGui.QFont()
       font.setFamily("微软雅黑")
       font.setPointSize(16)
       font.setBold(True)
       font.setWeight(75)
       self.label.setFont(font)
       self.label.setObjectName("label")
       self.frame = QtWidgets.QFrame(PdfZ)
       self.frame.setGeometry(QtCore.QRect(20, 60, 1351, 161))
       palette = QtGui.QPalette()
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
       brush = QtGui.QBrush(QtGui.QColor(245, 255, 250))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)
       brush = QtGui.QBrush(QtGui.QColor(245, 255, 250))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)
       brush = QtGui.QBrush(QtGui.QColor(245, 255, 250))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)
       brush = QtGui.QBrush(QtGui.QColor(245, 255, 250))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)
       self.frame.setPalette(palette)
       self.frame.setAutoFillBackground(True)
       self.frame.setFrameShape(QtWidgets.QFrame.Box)
       self.frame.setFrameShadow(QtWidgets.QFrame.Plain)
       self.frame.setLineWidth(1)
       self.frame.setMidLineWidth(0)
       self.frame.setObjectName("frame")
       self.scwd = QtWidgets.QPushButton(self.frame)
       self.scwd.setGeometry(QtCore.QRect(570, 30, 191, 61))
       palette = QtGui.QPalette()
       brush = QtGui.QBrush(QtGui.QColor(0, 217, 159))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ButtonText, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255, 128))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.PlaceholderText, brush)
       brush = QtGui.QBrush(QtGui.QColor(0, 217, 159))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ButtonText, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255, 128))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.PlaceholderText, brush)
       brush = QtGui.QBrush(QtGui.QColor(0, 217, 159))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush)
       brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush)
       brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, brush)
       brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 128))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.PlaceholderText, brush)
       self.scwd.setPalette(palette)
       font = QtGui.QFont()
       font.setFamily("微软雅黑")
       font.setPointSize(16)
       font.setBold(True)
       font.setWeight(75)
       self.scwd.setFont(font)
       self.scwd.setAutoFillBackground(True)
       self.scwd.setAutoDefault(False)
       self.scwd.setDefault(False)
       self.scwd.setFlat(True)
       self.scwd.setObjectName("scwd")
       self.label_2 = QtWidgets.QLabel(self.frame)
       self.label_2.setGeometry(QtCore.QRect(620, 100, 131, 21))
       font = QtGui.QFont()
       font.setFamily("微软雅黑")
       self.label_2.setFont(font)
       self.label_2.setObjectName("label_2")
       self.frame_2 = QtWidgets.QFrame(PdfZ)
       self.frame_2.setGeometry(QtCore.QRect(1050, 280, 321, 301))
       palette = QtGui.QPalette()
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
       brush = QtGui.QBrush(QtGui.QColor(245, 255, 250))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)
       brush = QtGui.QBrush(QtGui.QColor(245, 255, 250))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)
       brush = QtGui.QBrush(QtGui.QColor(245, 255, 250))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)
       brush = QtGui.QBrush(QtGui.QColor(245, 255, 250))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)
       self.frame_2.setPalette(palette)
       self.frame_2.setAutoFillBackground(True)
       self.frame_2.setFrameShape(QtWidgets.QFrame.NoFrame)
       self.frame_2.setFrameShadow(QtWidgets.QFrame.Plain)
       self.frame_2.setLineWidth(1)
       self.frame_2.setMidLineWidth(0)
       self.frame_2.setObjectName("frame_2")
       self.label_3 = QtWidgets.QLabel(self.frame_2)
       self.label_3.setGeometry(QtCore.QRect(20, 20, 191, 31))
       font = QtGui.QFont()
       font.setFamily("微软雅黑")
       font.setPointSize(14)
       font.setBold(False)
       font.setWeight(50)
       self.label_3.setFont(font)
       self.label_3.setObjectName("label_3")
       self.xzwd = QtWidgets.QPushButton(self.frame_2)
       self.xzwd.setGeometry(QtCore.QRect(30, 200, 271, 61))
       palette = QtGui.QPalette()
       brush = QtGui.QBrush(QtGui.QColor(0, 217, 159))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ButtonText, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255, 128))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.PlaceholderText, brush)
       brush = QtGui.QBrush(QtGui.QColor(0, 217, 159))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ButtonText, brush)
       brush = QtGui.QBrush(QtGui.QColor(255, 255, 255, 128))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.PlaceholderText, brush)
       brush = QtGui.QBrush(QtGui.QColor(0, 217, 159))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush)
       brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush)
       brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, brush)
       brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 128))
       brush.setStyle(QtCore.Qt.SolidPattern)
       palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.PlaceholderText, brush)
       self.xzwd.setPalette(palette)
       font = QtGui.QFont()
       font.setFamily("微软雅黑")
       font.setPointSize(14)
       font.setBold(True)
       font.setWeight(75)
       self.xzwd.setFont(font)
       self.xzwd.setAutoFillBackground(True)
       self.xzwd.setAutoDefault(False)
       self.xzwd.setDefault(False)
       self.xzwd.setFlat(True)
       self.xzwd.setObjectName("xzwd")
       self.label_4 = QtWidgets.QLabel(self.frame_2)
       self.label_4.setGeometry(QtCore.QRect(30, 70, 141, 21))
       font = QtGui.QFont()
       font.setFamily("微软雅黑")
       self.label_4.setFont(font)
       self.label_4.setObjectName("label_4")
       self.textEdit = QtWidgets.QTextEdit(self.frame_2)
       self.textEdit.setGeometry(QtCore.QRect(60, 110, 61, 41))
       font = QtGui.QFont()
       font.setFamily("微软雅黑")
       font.setPointSize(12)
       font.setBold(True)
       font.setWeight(75)
       self.textEdit.setFont(font)
       self.textEdit.setObjectName("textEdit")
       self.label_5 = QtWidgets.QLabel(self.frame_2)
       self.label_5.setGeometry(QtCore.QRect(150, 120, 31, 21))
       font = QtGui.QFont()
       font.setFamily("微软雅黑")
       self.label_5.setFont(font)
       self.label_5.setObjectName("label_5")
       self.textEdit_2 = QtWidgets.QTextEdit(self.frame_2)
       self.textEdit_2.setGeometry(QtCore.QRect(200, 110, 61, 41))
       font = QtGui.QFont()
       font.setFamily("微软雅黑")
       font.setPointSize(12)
       font.setBold(True)
       font.setWeight(75)
       self.textEdit_2.setFont(font)
       self.textEdit_2.setObjectName("textEdit_2")
       self.label_7 = QtWidgets.QLabel(PdfZ)
       self.label_7.setGeometry(QtCore.QRect(450, 250, 71, 21))
       font = QtGui.QFont()
       font.setFamily("微软雅黑")
       self.label_7.setFont(font)
       self.label_7.setObjectName("label_7")
       self.label_6 = QtWidgets.QLabel(PdfZ)
       self.label_6.setGeometry(QtCore.QRect(270, 290, 461, 511))
       self.label_6.setFrameShape(QtWidgets.QFrame.Box)
       self.label_6.setFrameShadow(QtWidgets.QFrame.Plain)
       self.label_6.setLineWidth(1)
       self.label_6.setMidLineWidth(0)
       self.label_6.setText("")
       self.label_6.setObjectName("label_6")

self.retranslateUi(PdfZ)
       QtCore.QMetaObject.connectSlotsByName(PdfZ)

os.remove("return.png")

def retranslateUi(self, PdfZ):
       _translate = QtCore.QCoreApplication.translate
       PdfZ.setWindowTitle(_translate("PdfZ", "PDFZWORD"))
       self.Reback.setText(_translate("PdfZ", "..."))
       self.label.setText(_translate("PdfZ", "PDFZWORD"))
       self.scwd.setText(_translate("PdfZ", "+ 上传文档"))
       self.label_2.setText(_translate("PdfZ", "上传文档至此"))
       self.label_3.setText(_translate("PdfZ", "操作"))
       self.xzwd.setText(_translate("PdfZ", "开始转换"))
       self.label_4.setText(_translate("PdfZ", "页码选择(请勿输0):"))
       self.label_5.setText(_translate("PdfZ", "到"))
       self.label_7.setText(_translate("PdfZ", "PDF预览"))

二、main.py实现主要功能程序如下:

class pdwwindow(QtWidgets.QWidget,Ui_PdfZ):
    def __init__(self):
        super(pdwwindow, self).__init__()
        self.setupUi(self)
    def re_back(self):
        self.close()
    def sctp(self):
        fileName, fileType = QtWidgets.QFileDialog.getOpenFileName(self, "选取文件", os.getcwd(),"自定义(*.pdf;*);;All Files(*)")
        self.f = str(fileName)
        self.p, self.s =self.f.split(".")
        try:
          if self.s == "pdf":
           # 打开文件
           doc = fitz.open(self.f)
           # 读取一页 0代表第1页
           page_one = doc.loadPage(0)
           # 将第一页转换为Pixmap
           page_pixmap = page_one.getPixmap()
           # 将Pixmap转换为QImage
           image_format = QImage.Format_RGBA8888 if page_pixmap.alpha else QImage.Format_RGB888
           page_image = QImage(page_pixmap.samples, page_pixmap.width,page_pixmap.height, page_pixmap.stride, image_format)
           # width = page_image.width()
           # height = page_image.height()
           # QImage 转为QPixmap
           pix = QPixmap.fromImage(page_image)
            # 设置图片大小自适应标签
           self.label_6.setScaledContents(True)
            # 给标签设置图像
           self.label_6.setPixmap(pix)
          else:
           msg_box = QMessageBox(QMessageBox.Warning,"错误", "文件不是 pdf 文件,请重新选择!")
           msg_box.exec_()
        except Exception as e:
          pass
    def xzwj(self):
        docx_file = "{}_pdfZword.docx".format(self.p)
        str1 = self.textEdit.toPlainText()
        num1 = int(str1)
        str2 = self.textEdit_2.toPlainText()
        num2 = int(str2)
        if num1==num2:
            num1=num1-1
        cv = Converter(self.f)
        cv.convert(docx_file, start=num1, end=num2)
        cv.close()
        root = tkinter.Tk()
        root.withdraw()
        tkinter.messagebox.showinfo("提示", "成功下载到源文件所在文件夹")

说明如下:

(1) def sctp(self): 其中的sctp为按钮的objectName属性名字;def xzwj(self):其中的xzwj为按钮的objectName属性名字;

(2) 可通过点击按钮实现本地文件上传;

fileName, fileType = QtWidgets. QFileDialog.getOpenFileName(self, "选取文件", os.getcwd(), "自定义(*.jpg;*.png;*.jpeg;*);;All Files(*)")
(3) 增加了防错功能,当上传的文档格式不是pdf时,将不执行程序,同时提示错误;

(4) 将pdf第一页转为图片,并用label组件显示;

(5) 在def xzwj(self):程序中可实现按页数提取word;

(6) 借助converter模块实现转化word。

三、最后在主程序中加入以上子程序。

if __name__ =="__main__":
   import sys
   app = QtWidgets.QApplication(sys.argv)
   win = mywindow()
   pw = pdwwindow()
   win.show()
   win.pdf_word.clicked.connect(win.pic_main)
   win.pdf_word.clicked.connect(pw.show)
   pw.Reback.clicked.connect(pw.re_back)
   pw.Reback.clicked.connect(win.show)
   pw.scwd.clicked.connect(pw.sctp)
   pw.xzwd.clicked.connect(pw.xzwj)
   sys.exit(app.exec_())

四、总结

本文介绍的pdf转word功能还有一些待完善地方,例如可增加预览功能,实现每页预览。当然我们可以在后续阶段逐渐完善。

来源:https://blog.csdn.net/Crazydoubao/article/details/125177027

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com