Пользовательский интерфейс не может отменить ocrmypdf.ocr()
Я создал графический интерфейс с Python и другими необходимыми библиотеками. Моя задача состоит в том, чтобы преобразовать PDF-файл, не поддающийся поиску, с возможностью поиска, сохранить его как новый PDF-файл, извлечь из него слово и сохранить файл с этим именем. Я интегрировал этот код с GUL, в котором есть кнопки запуска, отмены, закрытия, запуск, но работает правильно, и после завершения я тоже могу правильно выйти из кода, но когда я попытался отменить запуск. Его шоу завершилось, но не остановлено. его выполнение остановилось после того, как ocrmypdf.pdf() запустился полностью и сохранит его как pdf, а затем он остановился, что нужно, во время обработки, только его нужно остановить. вот мой код
import tkinter as tk
from tkinter import filedialog
import customtkinter
from tkinter import ttk
import threading
import sys
import fitz
import PyPDF2
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
import io
import os
import ocrmypdf
import re
canceled = False
customtkinter.set_appearance_mode("System")
app = customtkinter.CTk() # create window
app.geometry("400x240")
def backend(input,output):
def create_footer_page(footer, page_orientation): # Adding Footer to the page
packet = io.BytesIO()
# Create a canvas for the header PDF
can = canvas.Canvas(packet, pagesize=letter)
can.setFont("Times-Roman", 10)
if page_orientation == 'l': # Adding the footer when the page rotation is 90
can.setFillColorRGB(0, 0, 1)
can.drawString(750, 565, footer)
else: # Adding the footer when the page rotation is 0
can.setFillColorRGB(0, 0, 1)
can.drawString(500, 800, footer)
can.save()
packet.seek(0)
header_pdf = PyPDF2.PdfFileReader(packet)
return header_pdf.pages[0] # return's the page to the add_header_to_landscape after adding footer
def create_header_page(text, page_orientation):
packet = io.BytesIO()
# Create a canvas for the header PDF
can = canvas.Canvas(packet, pagesize=letter)
can.setFont("Times-Roman", 10)
if page_orientation == 'l': # Adding the Header when the page in Landscape mode
can.setFillColorRGB(0, 0, 1)
can.drawString(300, 565, text)
else: # Adding the Header when the page rotation is 0
can.setFillColorRGB(0, 0, 1)
can.drawString(150, 800, text)
can.save()
packet.seek(0)
header_pdf = PyPDF2.PdfFileReader(packet)
return header_pdf.pages[0] # return's the page to the add_header_to_landscape after adding header
def add_header_to_landscape(input_pdf, output_pdf, header):
pdf_reader = PyPDF2.PdfFileReader(input_pdf)
pdf_writer = PyPDF2.PdfFileWriter()
num_pages = len(pdf_reader.pages)
for page_num in range(num_pages):
page = pdf_reader.pages[page_num]
width = page.mediaBox.getWidth()
height = page.mediaBox.getHeight()
if height < width:
page_orientation = 'l'
else:
page_orientation = 'p'
footer = f'page {page_num + 1} of {num_pages}'
footer_pdf = create_footer_page(footer, page_orientation) # Function for adding the footer in pages
header_pdf = create_header_page(header, page_orientation) # Function for adding the Header in pages
page.mergePage(header_pdf)
page.mergePage(footer_pdf)
pdf_writer.addPage(page)
with open(output_pdf, 'wb') as output_file:
pdf_writer.write(output_file)
def word(input_pdf):
dco = fitz.open(input_pdf)
page = dco[0]
text = page.get_text()
lines = text.split('\n')
search = r"LIB\d{5}|L1B\d{5}|LIBO\d{4}"
word = ''
header = ''
for i in range(0, 5):
for j in lines[i]:
if j == ' ' or j == ':' or j == '-':
if re.search(search, word) != None:
x = re.search(search, word).group()
header = x[4::]
header = 'LIB0' + header
word = ''
else:
word += j
return header
def rotate_pdf_pages(input_pdf, output_pdf):
ocrmypdf.ocr(input_pdf, output_pdf, skip_text=True, rotate_pages_threshold=1, rotate_pages=True)
def process():
#print("in func")
proxy_file_path = ''
if input:
for filename in os.listdir(input):
if filename.endswith(".pdf"):
input_file_path = os.path.join(input, filename)
proxy_file_path = os.path.join(output, "proxy.pdf")
rotate_pdf_pages(input_file_path, proxy_file_path)
header_part = word(proxy_file_path)
header_text = f"{header_part}"
output_file_path = os.path.join(output, header_text + '.pdf')
add_header_to_landscape(proxy_file_path, output_file_path, header_text)
print(f"Processed: {input_file_path} -> {output_file_path}")
os.remove(proxy_file_path) # Delete proxy file
process()
def button_callback():
print("button pressed")
def browse_folder():
input_folder_path = filedialog.askdirectory()
input_folder_entry.delete(0, tk.END) # Clear previous content if any
input_folder_entry.insert(tk.END, input_folder_path)
def browse_folder_1():
output_folder_path = filedialog.askdirectory()
output_folder_entry.delete(0, tk.END) # Clear previous content if any
output_folder_entry.insert(tk.END, output_folder_path)
def start_processing():
global canceled, progress_bar, progress_percent_label
canceled = False
progress_bar = ttk.Progressbar(main_frame, mode="determinate", maximum=100, length=300, orient="horizontal")
progress_bar.grid(row=16, column=2, columnspan=2, padx=5, pady=20, ipadx=5, ipady=5)
progress_bar.start()
send_data = threading.Thread(target=senddatatobackend)
send_data.start()
def cancel_processing():
global canceled
canceled = True
input_folder_entry.delete(0, tk.END)
output_folder_entry.delete(0, tk.END)
progress_bar.stop()
progress_bar.grid_forget()
def senddatatobackend():
#print("hi")
input_path = input_folder_entry.get()
output_path = output_folder_entry.get()
# start_processing()
backend(input_path, output_path)
progress_bar.stop()
progress_bar.grid_forget()
def close_application(root):
root.destroy()
exit()
def main():
global input_folder_entry, output_folder_entry, progress_bar, main_frame, root, progress_percent_label
root = tk.Tk()
root.title("PDF Page Orientation & Adding Header")
main_frame = tk.Frame(root, width=50, highlightbackground='blue', highlightthickness=3, borderwidth=2,
relief=tk.GROOVE, background='black')
main_frame.grid(row=0, column=0, padx=100, pady=50, ipadx=100, ipady=50)
input_label = tk.Label(main_frame, text="Select Input Folders:")
input_label.grid(row=4, column=1, padx=(20, 10), sticky="e", pady=(40, 0))
input_folder_entry = tk.Entry(main_frame, width=50)
input_folder_entry.grid(row=4, column=2, columnspan=2, padx=5, pady=(40, 0))
input_button = tk.Button(main_frame, text="Browse", command=browse_folder, pady=2)
input_button.grid(row=4, column=4, pady=(40, 0), padx=(0, 10), sticky="w")
output_label = tk.Label(main_frame, text="Select Output Folders:")
output_label.grid(row=10, column=1, padx=(20, 10), sticky="e", pady=(40, 0))
output_folder_entry = tk.Entry(main_frame, width=50)
output_folder_entry.grid(row=10, column=2, columnspan=2, padx=5, pady=(40, 0))
output_button = tk.Button(main_frame, text="Browse", command=browse_folder_1, pady=2)
output_button.grid(row=10, column=4, padx=(0, 10), pady=(40, 0), sticky="w")
start_button = customtkinter.CTkButton(main_frame, text="start", command=start_processing)
start_button.grid(row=13, column=2, padx=5, pady=20, ipadx=5, ipady=5)
cancel_button = customtkinter.CTkButton(main_frame, text="Cancel", command=cancel_processing)
cancel_button.grid(row=13, column=3, padx=5, pady=20, ipadx=5, ipady=5)
close_button = customtkinter.CTkButton(main_frame, text="close", command=lambda: close_application(root))
close_button.grid(row=14, column=2, columnspan=2, padx=5, pady=5, ipadx=5, ipady=5)
root.mainloop()
if __name__ == "__main__":
main()
Как я сказал выше. Я попробовал то, что хочу: когда я нажимаю кнопку отмены, мне нужно проверить, какая функция запущена, и нужно остановить выполнение этой функции. и когда мы нажали кнопку «Закрыть», необходимо проверить, запущена ли какая-либо функция, если она запущена, необходимо спросить еще процесс, хотите ли вы закрыть приложение, если пользователь сказал «да», тогда необходимо остановить обработку и закрыть его. если у них не работает ни одна функция, ее просто нужно закрыть напрямую