【Python成长之路】从零学GUI -- 制作PDF转WORD的小工具

【写在前面】

    以前为了写毕业论文,经常上网找各种论文,然后进行ctrl + c /ctrl +v。当时很多论文都是PDF格式,而且不能复制到文中的文字。现在还记得,当初在 网上下载各种PDF转WORD的工具,有些软件还是收费的。今天我就自己开发一个pdf转word的小工具,回敬从前弱小的我!

 

【示例代码】

1、GUI制作软件界面:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'pdf2word.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets
import sys
import change

class Ui_Dialog(QtWidgets.QDialog):
    def setupUi(self, Dialog):
        Dialog.setObjectName("PDF转Word工具界面")
        Dialog.resize(527, 369)

        # 设置窗口背景,并且自适应窗口大小
        palette = QtGui.QPalette()
        pix = QtGui.QPixmap("12.jpg")
        pix = pix.scaled(Dialog.width(), Dialog.height())
        palette.setBrush(QtGui.QPalette.Background, QtGui.QBrush(pix))
        Dialog.setPalette(palette)
        
        self.label = QtWidgets.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(380, 300, 101, 41))
        self.label.setStyleSheet("font: 12pt \"新宋体\";\n"
"background-color: rgb(85, 255, 255);")
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(380, 130, 91, 61))
        self.pushButton.setStyleSheet("font: 12pt \"黑体\";\n"
"background-color: rgb(0, 255, 0);")
        self.pushButton.setObjectName("pushButton")
        self.plainTextEdit = QtWidgets.QPlainTextEdit(Dialog)
        self.plainTextEdit.setGeometry(QtCore.QRect(50, 120, 300, 161))
        self.plainTextEdit.setStyleSheet("font: 11pt \"宋体\";")
        self.plainTextEdit.setObjectName("plainTextEdit")


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

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "PDF转Word工具界面"))
        self.label.setText(_translate("Dialog", "  鹏哥出品 "))
        self.pushButton.setText(_translate("Dialog", "选择文件"))
        self.plainTextEdit.setPlainText("欢迎使用!")
        self.pushButton.clicked.connect(self.get_pdffile)

    # 从本地电脑加载PDF文件
    def get_pdffile(self):
        self.plainTextEdit.setPlainText("开始转换pdf文件……")
        filename,_ = QtWidgets.QFileDialog.getOpenFileName(self, "打开文件", "", "*.pdf;;All Files(*)")
        print(filename)
        newname = filename.split("/")[-1] + ".doc"
        change.parse(filename,newname)
        self.plainTextEdit.setPlainText("pdf文件转换完成!\n文件名为%s" %newname)

if __name__ == "__main__":
    app =QtWidgets.QApplication(sys.argv)
    main = QtWidgets.QDialog()
    mainwindow = Ui_Dialog()
    mainwindow.setupUi(main)
    main.show()
    sys.exit(app.exec())

2、PDF转WORD:​​​​​​​

# coding=utf-8
# @Auther : "鹏哥贼优秀"
# @Date : 2019/8/23
# @Software : PyCharm

from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.layout import LAParams
from pdfminer.converter import PDFPageAggregator
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed

def parse(filename,newfile):
    # rb以二进制读模式打开本地pdf文件
    fn = open(filename, 'rb')
    # 创建一个pdf文档分析器
    parser = PDFParser(fn)
    # 创建一个PDF文档
    doc = PDFDocument()
    # 连接分析器 与文档对象
    parser.set_document(doc)
    doc.set_parser(parser)

    # 提供初始化密码doc.initialize("XXX")
    # 如果没有密码 就创建一个空的字符串
    doc.initialize("")
    # 检测文档是否提供txt转换,不提供就忽略
    if not doc.is_extractable:
        raise PDFTextExtractionNotAllowed

    else:
        # 创建PDf资源管理器
        resource = PDFResourceManager()
        # 创建一个PDF参数分析器
        laparams = LAParams()
        # 创建聚合器,用于读取文档的对象
        device = PDFPageAggregator(resource, laparams=laparams)
        # 创建解释器,对文档编码,解释成Python能够识别的格式
        interpreter = PDFPageInterpreter(resource, device)
        # 循环遍历列表,每次处理一页的内容
        # doc.get_pages() 获取page列表
        for page in doc.get_pages():
            # 利用解释器的process_page()方法解析读取单独页数
            interpreter.process_page(page)
            # 使用聚合器get_result()方法获取内容
            layout = device.get_result()
            # 这里layout是一个LTPage对象,里面存放着这个page解析出的各种对象
            for out in layout:
                # 判断是否含有get_text()方法,获取我们想要的文字
                if hasattr(out, "get_text"):
                    print(out.get_text())
                    with open(newfile, 'a') as f:
                        f.write(out.get_text() + '\n')

if __name__ == '__main__':
    parse("李清照诗词_簪花小楷字帖.pdf","test1.txt")

 

【效果如下】

选的是 李清照的一些诗词,格式为PDF,最后转成WORD。

 

【知识点】

1、GUI如何设置自适应背景图?

# 设置窗口背景,并且自适应窗口大小
palette = QtGui.QPalette()
pix = QtGui.QPixmap("12.jpg")
pix = pix.scaled(Dialog.width(), Dialog.height())
palette.setBrush(QtGui.QPalette.Background, QtGui.QBrush(pix))
Dialog.setPalette(palette)

(1)先实例化GUI库中的调色板对象,然后导入需要作为背景的图片。(这是我司的雪景,不错吧!)

(2)通过scaled函数,根据主窗口的长宽进行调整背景大小

(3)最后设置调色板实例的刷子进行背景内容填充。

 

2、PDF转WORD功能代码:

这段代码其实是参考大神写的代码 :

https://yq.aliyun.com/articles/487610?utm_content=m_42525

整体思路为:构造文档对象,解析文档对象,提取所需内容。

构造文档对象:

 

解析文档对象流程:

 

【写在最后】

       现在发现每周 五晚上,找个咖啡馆安静地写写东西,还 是 蛮有意思的,有点回到了大学时期待每周五晚上一样。

 

【参考】

https://yq.aliyun.com/articles/487610?utm_content=m_42525

  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值