Spaces:
Runtime error
Runtime error
| 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}") | |