python库 replace jar包导入

该博客介绍了使用Python的pytesseract和docx库处理word文档和图片的OCR应用。通过创建GUI界面,用户可以选择多个文件进行处理,输出识别后的txt文本。尽管word文档识别效果良好,但图片识别准确率较低,且程序存在一些已知问题,如错误处理和文件类型的自动识别。
摘要由CSDN通过智能技术生成


解释

尝试不导入jar包,而是直接使用python的库函数解决问题,从而简化程序,释放容量,避免很多没有必要的调试和导入。

一、做法

在python中引入pytesseract库和docx库,分别用来处理图片和word文档;
将相关的识别方法写好并封装在一个py文件pick_method.py里;
qt生成界面文件pick_ui;
一个主类pick_main,继承QMainWindow,和pick_ui,导入pick_method.py;
主类中封装程序启动,按钮绑定(前后端结合),调用外部方法(pick_method.py);
启动后可以选择多个文件,并选择输出路径;
点击确定可以处理这些文件生成识别出来的txt文件,文件名和原来相同;
pick_method.py中的方法是输入文件和输出文件;
输入文件经过处理后获得文件名,后缀改为txt后和输出路径组合形成输出文件;
根据处理文件的数量,循环调用pick_method中的方法。

二、效果

1.处理文档

选择输入文件:
选取
输入文件和输出路径:
路径
生成结果:

结果
word文档的识别度很高,没有发现错误:
结果

2.处理图片

和上边步骤类似,选择文件时选择图片格式即可。
结果如下:
结果
图片识别的时间较长,且识别度很低,完全不能满足需求:
不行!

三、困难

1、控制台报错全为缓冲区溢出,难以溯源;
2、列表值的比对和变量的赋值报错:如i++, i+=1, i=i+1均报出溢出错误,
目前没有找到原因,暂时改变语法避免了错误;
3、循环调用pick_method的方法时报错:
原因是在处理docx的方法中默认有表格(学校的实验报告模板中含有表格),如果没有找到表格就会出错;
4、条件判定:判断输入路径时如输入不合法,程序容易崩溃,原因是条件没有设置正确;
5、QtWidgets.QFileDialog.getOpenFileName()的返回值问题:返回的是QString类型,不能直接当作字符串类型处理;
6、编码问题:方法中需要设置encoding='utf-8’才能进行处理;
7、关于全局变量global的问题,调试了许久也没有搞明白,最后才知道定义与赋值不能写在同一行,即:
正确:

global a
a = 1

错误:

global a = 1

四、缺陷

1、图片识别准确度太低;
2、没有实现自动识别文件类型;
3、程序健壮性不足,在某些临界条件下会崩溃。

五、源码

pick_method.py

import docx
from docx import Document

from PIL import Image
import pytesseract

def for_docx(in_path, out_path):

    f = open(out_path, 'w', encoding='utf-8')
    document = Document(in_path)

    # 段落
    for paragraph in document.paragraphs:
        f.write(paragraph.text)
    # 表格
    tables = document.tables  # 获取文件中的表格集
    table = tables[0]  # 获取文件中的第一个表格
    for i in range(0, len(table.rows)):  # 从表格第一行开始循环读取表格数据
        result = f'{(table.cell(i, 0).text):<5}' + "" + f'{(table.cell(i, 1).text):<5}' + "" + f'{(table.cell(i, 2).text):<5}'
        # cell(i,0)表示第(i+1)行第1列数据,以此类推
        f.write(result)
    f.close()

def for_picture(in_path,out_path):
    f = open(out_path, 'w', encoding='utf-8')
    result = pytesseract.image_to_string(Image.open(in_path))
    f.write(result)
    f.close()

pick_ui.py

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

# Form implementation generated from reading ui file 'pick_ui.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(30, 210, 621, 182))
        self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.in_text = QtWidgets.QTextBrowser(self.verticalLayoutWidget)
        self.in_text.setMaximumSize(QtCore.QSize(1000, 30))
        self.in_text.setObjectName("in_text")
        self.verticalLayout.addWidget(self.in_text)
        self.out_text = QtWidgets.QTextBrowser(self.verticalLayoutWidget)
        self.out_text.setMaximumSize(QtCore.QSize(1000, 30))
        self.out_text.setObjectName("out_text")
        self.verticalLayout.addWidget(self.out_text)
        self.verticalLayoutWidget_2 = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget_2.setGeometry(QtCore.QRect(660, 210, 111, 181))
        self.verticalLayoutWidget_2.setObjectName("verticalLayoutWidget_2")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_2)
        self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.in_pick = QtWidgets.QToolButton(self.verticalLayoutWidget_2)
        self.in_pick.setMaximumSize(QtCore.QSize(60, 30))
        self.in_pick.setObjectName("in_pick")
        self.verticalLayout_2.addWidget(self.in_pick)
        self.out_pick = QtWidgets.QToolButton(self.verticalLayoutWidget_2)
        self.out_pick.setMaximumSize(QtCore.QSize(60, 30))
        self.out_pick.setObjectName("out_pick")
        self.verticalLayout_2.addWidget(self.out_pick)
        self.verticalLayoutWidget_3 = QtWidgets.QWidget(self.centralwidget)
        self.verticalLayoutWidget_3.setGeometry(QtCore.QRect(660, 400, 111, 80))
        self.verticalLayoutWidget_3.setObjectName("verticalLayoutWidget_3")
        self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.verticalLayoutWidget_3)
        self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.submit = QtWidgets.QPushButton(self.verticalLayoutWidget_3)
        self.submit.setMaximumSize(QtCore.QSize(100, 50))
        self.submit.setObjectName("submit")
        self.verticalLayout_3.addWidget(self.submit)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.in_pick.setText(_translate("MainWindow", "..."))
        self.out_pick.setText(_translate("MainWindow", "..."))
        self.submit.setText(_translate("MainWindow", "确定"))

pick_main.py

import os
import sys
import os.path
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
import pick_ui
import pick_method

class Start(QMainWindow, pick_ui.Ui_MainWindow):

    in_filename = []      #待处理文件
    out_filename =  []    #输出文件(名)
    num = 0               # 文件个数

    def __init__(self):
        QMainWindow.__init__(self)
        pick_ui.Ui_MainWindow.__init__(self)
        self.setupUi(self)

        # 设置按钮的事件监听
        self.in_pick.clicked.connect(self.pick_in)
        self.out_pick.clicked.connect(self.pick_out)
        self.submit.clicked.connect(self.submit_main)

    # 选择输入路径
    def pick_in(self):
        filenames, filetype = QtWidgets.QFileDialog.getOpenFileNames(self, "选取文件", os.getcwd(),
                                        "Word Files(*.docx *.doc);;PDF Files(*.pdf);;JPG Files(*.jpeg *.jpg *jfif);;PNG Files(*.png)")

        self.in_text.setText(filenames[0]+"...")

        global in_filename
        in_filename = []
        global in_filetype

        global num
        num = 0
        while num < len(filenames):
            in_filename.append(filenames[num])
            num = num + 1

        in_filetype = filetype

    # 选择输出路径
    def pick_out(self):
        filepath = QtWidgets.QFileDialog.getExistingDirectory(self, "选择目录", os.getcwd())
        self.out_text.setText(filepath+"/")

        global out_filename
        out_filename = []

        t = 0
        while t < num:
            s = in_filename[t]
            temp = Start.set_out_file_name(s)
            out_filename.append(filepath + '/' + temp + '.txt')
            t = t + 1

    # 提交,生成结果
    def submit_main(self):
        # 如果没有选择文件,弹出提示框
        if (in_filename==0):
            print("if")
            msg_box = QMessageBox(QMessageBox.Warning, '出错', '请选择文件')
            msg_box.exec_()

        # 如果选择了文件
        else:

            if in_filetype == 'Word Files(*.docx *.doc)':

                for i in range(0, len(in_filename)):
                    pick_method.for_docx(in_filename[i], out_filename[i])

                msg_box = QMessageBox(QMessageBox.Warning, '成功', '点击退出')
                msg_box.exec_()


            elif in_filetype == 'JPG Files(*.jpeg *.jpg *jfif)':
                for i in range(0, len(in_filename)):
                    pick_method.for_picture(in_filename[i], out_filename[i])

                msg_box = QMessageBox(QMessageBox.Warning, '成功', '点击退出')
                msg_box.exec_()

            print("complete")


    def set_out_file_name(s):
        index_head = s.rfind("/")
        index_hail = s.rfind(".")
        result = s[index_head + 1:index_hail]
        return result


# 程序入口
if __name__ == '__main__':
    app = QApplication(sys.argv)
    s = Start()
    s.show()
    sys.exit(app.exec_())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值