Tab2pdf/main.py
2023-08-07 21:32:58 +05:30

192 lines
8.1 KiB
Python

import tkinter as tk
from tkinter import filedialog, messagebox
from selenium import webdriver
from selenium.webdriver.firefox.service import Service as FirefoxService
from selenium.webdriver.chrome.service import Service as ChromeService
import time
import pdfkit
import os
import threading
class Tab2PdfApp:
def __init__(self, root):
self.root = root
self.root.title("Tab2Pdf")
# Load the icon file
icon_path = "icon.ico" # Replace with the actual icon file name
self.root.iconbitmap(default=icon_path)
# Set the window size (width x height)
self.root.geometry("800x600") # Adjust the dimensions as needed
# Create and place the GUI elements
self.menu_bar = tk.Menu(self.root)
self.root.config(menu=self.menu_bar)
self.file_menu = tk.Menu(self.menu_bar, tearoff=0)
self.menu_bar.add_cascade(label="File", menu=self.file_menu)
self.file_menu.add_command(label="Open Starting HTML File", command=self.open_starting_html_file)
self.file_menu.add_separator()
self.file_menu.add_command(label="Exit", command=self.root.quit)
self.help_menu = tk.Menu(self.menu_bar, tearoff=0)
self.menu_bar.add_cascade(label="Help", menu=self.help_menu)
self.help_menu.add_command(label="About", command=self.show_about_dialog)
self.help_menu.add_command(label="FAQ", command=self.show_faq_dialog)
# Create a larger font for buttons and labels
self.larger_font = ('Helvetica', 12) # Adjust the font size as needed
self.save_path_label = tk.Label(self.root, text="Save Location:", font=self.larger_font)
self.save_path_label.pack()
self.save_path_var = tk.StringVar()
# Increase the width of the text entry box
self.save_path_entry = tk.Entry(self.root, textvariable=self.save_path_var, font=self.larger_font, width=40)
self.save_path_entry.pack()
self.browse_button = tk.Button(self.root, text="Browse", font=self.larger_font,
command=lambda: self.save_path_var.set(filedialog.askdirectory()))
self.browse_button.pack()
# Create a variable to store the browser choice
self.browser_var = tk.StringVar()
self.browser_var.set("Firefox") # Default choice
# Create a label and option menu for browser choice
self.browser_label = tk.Label(self.root, text="Select Browser:", font=self.larger_font)
self.browser_label.pack()
self.browser_option_menu = tk.OptionMenu(self.root, self.browser_var, "Firefox", "Chrome")
self.browser_option_menu.pack()
self.start_button_text = tk.StringVar()
self.start_button_text.set("Start")
self.start_button = tk.Button(self.root, textvariable=self.start_button_text, font=self.larger_font, command=self.start_process)
self.start_button.pack()
# Create a listbox to display open tabs
self.open_tabs_listbox = tk.Listbox(self.root, font=self.larger_font, selectmode=tk.MULTIPLE)
self.open_tabs_listbox.pack(fill=tk.BOTH, expand=True)
def open_starting_html_file(self):
html_file_path = filedialog.askopenfilename(filetypes=[("HTML Files", "*.html")])
if html_file_path:
# Load the new HTML file in the initial tab
self.driver.get('file://' + html_file_path)
def show_about_dialog(self):
about_text = "Save PDFs from Tabs\n\nVersion: 0.4\n\nDeveloped by: Amit Nandi"
messagebox.showinfo("About", about_text)
# Function to update the open tabs listbox
def show_faq_dialog(self):
faq_text = (
"Frequently Asked Questions\n\n"
"Q: How do I change the starting HTML file?\n"
"A: You can change the starting HTML file by selecting 'Open Starting HTML File' from the File menu.\n\n"
"Q: How can I specify the save location for PDFs?\n"
"A: You can enter the desired save location in the 'Save Location' text box.\n\n"
"Q: How does the program work?\n"
"A: The program opens a Firefox browser, loads tabs from the starting HTML file, and saves PDFs of the tabs.\n\n"
"Q: Can I customize the PDF save filenames?\n"
"A: The program automatically names the PDFs as SS1.pdf, SS2.pdf, and so on.\n\n"
"Q: How do I start the process?\n"
"A: Click the 'Start' button to begin opening tabs and saving PDFs.\n"
)
messagebox.showinfo("FAQ", faq_text)
def run_browser_and_save_pdfs(self, save_path, browser_choice):
if browser_choice == "Firefox":
# Specify the path to the GeckoDriver executable
gecko_path = r'geckodriver.exe'
service = FirefoxService(gecko_path)
self.driver = webdriver.Firefox(service=service)
elif browser_choice == "Chrome":
# Specify the path to the ChromeDriver executable
chrome_path = r'chromedriver.exe'
service = ChromeService(chrome_path)
self.driver = webdriver.Chrome(service=service)
update_thread = threading.Thread(target=self.update_open_tabs_listbox)
update_thread.daemon = True
update_thread.start()
# Load a local HTML file in the initial tab
html_file_path = r'\starter.html'
self.driver.get(os.getcwd() + html_file_path)
print(os.getcwd())
# Wait for the initial tab content to load (adjust wait time as needed)
time.sleep(5)
try:
# Get the initial number of tabs
initial_tabs = len(self.driver.window_handles)
while True:
# Get the total number of tabs
total_tabs = len(self.driver.window_handles)
# Check for newly opened tabs
if total_tabs > initial_tabs:
# Loop through newly opened tabs
for tab_index in range(initial_tabs, total_tabs):
# Switch to the new tab
self.driver.switch_to.window(self.driver.window_handles[tab_index])
# Save a screenshot of the current tab content
pdf_filename = f'SS{tab_index}.pdf'
pdf_path = os.path.join(save_path, pdf_filename)
self.save_tab_as_pdf(tab_index, pdf_path)
print(f'Saved PDF for tab {tab_index + 1}: {pdf_path}')
initial_tabs = total_tabs # Update the initial tabs count
# Show a completion dialog
messagebox.showinfo("PDFs Saved", "All PDFs have been saved.")
time.sleep(5) # Wait before checking for new tabs again
except KeyboardInterrupt:
pass # Press Ctrl+C to exit the loop
# Close the WebDriver instance
self.driver.quit()
def save_tab_as_pdf(self, tab_index, pdf_path):
self.driver.switch_to.window(self.driver.window_handles[tab_index])
try:
# Create a PDF from the current page using pdfkit
pdfkit.from_url(self.driver.current_url, pdf_path)
print(f'Saved PDF for tab {tab_index + 1}: {pdf_path}')
except Exception as e:
print(f'Error saving PDF for tab {tab_index + 1}: {e}')
def update_open_tabs_listbox(self):
while True:
open_tabs = self.driver.window_handles
self.open_tabs_listbox.delete(0, tk.END)
for tab_index, tab_handle in enumerate(open_tabs):
tab_title = self.driver.title
self.open_tabs_listbox.insert(tk.END, f"Tab {tab_index + 1}: {tab_title}")
time.sleep(2) # Update every 2 seconds
def start_process(self):
save_path = self.save_path_var.get()
if not save_path:
save_path = os.getcwd()
browser_choice = self.browser_var.get()
driver_thread = threading.Thread(target=self.run_browser_and_save_pdfs, args=(save_path, browser_choice))
driver_thread.start()
if __name__ == "__main__":
root = tk.Tk()
app = Tab2PdfApp(root)
root.mainloop()