Jb_Applier_AI_Agent / src /utils /chrome_utils.py
jaothan's picture
Upload 59 files
08d0f6d verified
import os
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager # Import webdriver_manager
import urllib
from src.logging import logger
def chrome_browser_options():
logger.debug("Setting Chrome browser options")
options = Options()
options.add_argument("--start-maximized")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--ignore-certificate-errors")
options.add_argument("--disable-extensions")
options.add_argument("--disable-gpu") # Opzionale, utile in alcuni ambienti
options.add_argument("window-size=1200x800")
options.add_argument("--disable-background-timer-throttling")
options.add_argument("--disable-backgrounding-occluded-windows")
options.add_argument("--disable-translate")
options.add_argument("--disable-popup-blocking")
options.add_argument("--no-first-run")
options.add_argument("--no-default-browser-check")
options.add_argument("--disable-logging")
options.add_argument("--disable-autofill")
options.add_argument("--disable-plugins")
options.add_argument("--disable-animations")
options.add_argument("--disable-cache")
options.add_argument("--incognito")
options.add_argument("--allow-file-access-from-files") # Consente l'accesso ai file locali
options.add_argument("--disable-web-security") # Disabilita la sicurezza web
logger.debug("Using Chrome in incognito mode")
return options
def init_browser() -> webdriver.Chrome:
try:
options = chrome_browser_options()
# Use webdriver_manager to handle ChromeDriver
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=options)
logger.debug("Chrome browser initialized successfully.")
return driver
except Exception as e:
logger.error(f"Failed to initialize browser: {str(e)}")
raise RuntimeError(f"Failed to initialize browser: {str(e)}")
def HTML_to_PDF(html_content, driver):
"""
Converte una stringa HTML in un PDF e restituisce il PDF come stringa base64.
:param html_content: Stringa contenente il codice HTML da convertire.
:param driver: Istanza del WebDriver di Selenium.
:return: Stringa base64 del PDF generato.
:raises ValueError: Se l'input HTML non è una stringa valida.
:raises RuntimeError: Se si verifica un'eccezione nel WebDriver.
"""
# Validazione del contenuto HTML
if not isinstance(html_content, str) or not html_content.strip():
raise ValueError("Il contenuto HTML deve essere una stringa non vuota.")
# Codifica l'HTML in un URL di tipo data
encoded_html = urllib.parse.quote(html_content)
data_url = f"data:text/html;charset=utf-8,{encoded_html}"
try:
driver.get(data_url)
# Attendi che la pagina si carichi completamente
time.sleep(2) # Potrebbe essere necessario aumentare questo tempo per HTML complessi
# Esegue il comando CDP per stampare la pagina in PDF
pdf_base64 = driver.execute_cdp_cmd("Page.printToPDF", {
"printBackground": True, # Includi lo sfondo nella stampa
"landscape": False, # Stampa in verticale (False per ritratto)
"paperWidth": 8.27, # Larghezza del foglio in pollici (A4)
"paperHeight": 11.69, # Altezza del foglio in pollici (A4)
"marginTop": 0.8, # Margine superiore in pollici (circa 2 cm)
"marginBottom": 0.8, # Margine inferiore in pollici (circa 2 cm)
"marginLeft": 0.5, # Margine sinistro in pollici (circa 1.27 cm)
"marginRight": 0.5, # Margine destro in pollici (circa 1.27 cm)
"displayHeaderFooter": False, # Non visualizzare intestazioni e piè di pagina
"preferCSSPageSize": True, # Preferire le dimensioni della pagina CSS
"generateDocumentOutline": False, # Non generare un sommario del documento
"generateTaggedPDF": False, # Non generare PDF taggato
"transferMode": "ReturnAsBase64" # Restituire il PDF come stringa base64
})
return pdf_base64['data']
except Exception as e:
logger.error(f"Si è verificata un'eccezione WebDriver: {e}")
raise RuntimeError(f"Si è verificata un'eccezione WebDriver: {e}")