Прежде всего, я рекомендую проверить, существуют ли переменные или имеют определенный размер, например, при попытке использовать ваш код с любым pdf-кодом, который не работает.
Переходя к проблеме, когда вы запустите pdf2excel, вы увидите, что вы не можете изменить размер окна, потому что графический интерфейс пользователя заморожен, поэтому он должен работать в другом потоке и отправлять информацию в виде прогресса и кадра данных через сигналы. , В этом случае я создам рабочий (QObject), который будет жить в другом потоке с функцией pdf2excel.
import sys
from functools import partial
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyPDF2 import PdfFileReader
import pandas as pd
import tabula
import re
from PandasModel import PandasModel
class PdfObject(QtCore.QObject):
progressChanged = QtCore.pyqtSignal(int)
maximumChanged = QtCore.pyqtSignal(int)
pandasChanged = QtCore.pyqtSignal(pd.DataFrame)
@QtCore.pyqtSlot(str)
def pdf2excel(self, pdf_file):
pdf = PdfFileReader(open(pdf_file, "rb"))
length = pdf.getNumPages()
result = pd.DataFrame(
columns=[
"Department",
"Employment No",
"Employment Name",
"Hire Date",
"Term Date",
"Birth Date",
"Seniority Date",
"Pay Code",
"FT/PT/S",
"Status",
]
)
self.maximumChanged.emit(length)
page = 1
while page <= length:
self.progressChanged.emit(page)
df = tabula.read_pdf(
pdf_file,
pages=str(page),
lattice=True,
area=(75.775, 16.0, 572.715, 779.29),
)[1:]
pattern = re.compile(r"(\s){2,}")
df = pd.DataFrame(df[df.columns[0]].replace(pattern, ","))
df = df["Unnamed: 0"].str.split(",", expand=True)
df = df.rename(
columns={
0: "Department",
1: "Employment No",
2: "Employment Name",
3: "Hire Date",
4: "Term Date",
5: "Birth Date",
6: "Seniority Date",
7: "Pay Code",
8: "FT/PT/S",
9: "Status",
}
)
result = result.append(df, ignore_index=True)
page += 1
result["Hire Date"] = pd.to_datetime(result["Hire Date"])
result["Term Date"] = pd.to_datetime(result["Term Date"])
result["Days Difference"] = (
result["Term Date"] - result["Hire Date"]
).dt.days
result = result.dropna(how="all")
result = result.drop(columns=["Birth Date", "Pay Code", "Status"])
result = result[
[
"Department",
"Employment No",
"Employment Name",
"Hire Date",
"Term Date",
"Days Difference",
"Seniority Date",
"FT/PT/S",
]
]
self.pandasChanged.emit(result)
class App(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(App, self).__init__(parent)
uic.loadUi("designUI.ui", self)
self.filename = ""
self.converted_file = None
thread = QtCore.QThread(self)
thread.start()
self.pdf_object = PdfObject()
self.pdf_object.moveToThread(thread)
self.pdf_object.maximumChanged.connect(self.progressBar.setMaximum)
self.pdf_object.progressChanged.connect(self.progressBar.setValue)
self.pdf_object.pandasChanged.connect(self.on_pandasChanged)
self.pushButton.clicked.connect(self.openFileNameDialog)
self.pushButton_3.clicked.connect(self.convert)
self.pushButton_2.clicked.connect(self.view)
self.pushButton_4.clicked.connect(self.saveFileDialog)
def openFileNameDialog(self):
options = QtWidgets.QFileDialog.Options()
options |= QtWidgets.QFileDialog.DontUseNativeDialog
fileName, _ = QtWidgets.QFileDialog.getOpenFileName(
self, "Open File", "", "All Files (*);;Python Files (*.py)"
) # , options=options)
if fileName:
self.filename = fileName
def view(self):
if self.converted_file is not None:
model = PandasModel(self.converted_file)
self.tableView.setModel(model)
def convert(self):
if self.filename:
wrapper = partial(self.pdf_object.pdf2excel, self.filename)
QtCore.QTimer.singleShot(0, wrapper)
@QtCore.pyqtSlot(pd.DataFrame)
def on_pandasChanged(self, df):
self.converted_file = df.copy()
def saveFileDialog(self):
options = QtWidgets.QFileDialog.Options()
options |= QtWidgets.QFileDialog.DontUseNativeDialog
fileName, _ = QtWidgets.QFileDialog.getSaveFileName(
self, "Save File", "", ".xls(*.xls)"
)
if fileName and self.converted_file is not None:
self.converted_file.to_excel(fileName)
msg = QtWidgets.QMessageBox()
msg.setText("File is Saved")
msg.setStandardButtons(QtWidgets.QMessageBox.Ok)
# msg.buttonClicked.connect(msgbtn)
msg.exec_()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
app.setWindowIcon(QtGui.QIcon("pdf-to-excel-icon.png"))
ex = App()
ex.show()
sys.exit(app.exec_())