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}")