diff --git a/dataframe_image/_browser_pdf.py b/dataframe_image/_browser_pdf.py index 400367a..19a1c0b 100644 --- a/dataframe_image/_browser_pdf.py +++ b/dataframe_image/_browser_pdf.py @@ -50,7 +50,7 @@ async def main(file_name, p): p.kill() raise Exception("Could not connect to chrome server") - async with session.ws_connect(page_url, receive_timeout=3, max_msg_size=0) as ws: + async with session.ws_connect(page_url, receive_timeout=10, max_msg_size=0) as ws: # first - navigate to html page params = {"url": file_name} data = {"id": 1, "method": "Page.navigate", "params": params} @@ -67,7 +67,7 @@ async def main(file_name, p): await handler(ws, data, "content") # fourth - get pdf - for i in range(10): + for _ in range(10): await asyncio.sleep(1) params = {"displayHeaderFooter": False, "printBackground": True} data = {"id": 4, "method": "Page.printToPDF", "params": params} @@ -76,7 +76,7 @@ async def main(file_name, p): if len(pdf_data) > 1000: break else: - raise Exception("Could not get pdf data") + raise TimeoutError("Could not get pdf data") return pdf_data diff --git a/dataframe_image/_version.py b/dataframe_image/_version.py index e007f5e..8d80269 100644 --- a/dataframe_image/_version.py +++ b/dataframe_image/_version.py @@ -1 +1 @@ -__version__ = "0.1.18" \ No newline at end of file +__version__ = "0.1.15" \ No newline at end of file diff --git a/dataframe_image/selenium_screenshot.py b/dataframe_image/selenium_screenshot.py index c0a89b3..47c1a69 100644 --- a/dataframe_image/selenium_screenshot.py +++ b/dataframe_image/selenium_screenshot.py @@ -30,56 +30,47 @@ def __init__( self.limit_crop = limit_crop self.device_scale_factor = device_scale_factor - self.temp_dir_obj = TemporaryDirectory() - - def __del__(self): - # geckodriver will not close on windows - try: - self.temp_dir_obj.cleanup() - except Exception as ex: - _logger.debug("Could not delete temp dir: %s", ex) - pass - def take_screenshot(self): - temp_dir = self.temp_dir_obj.name - try: - import selenium.common - import selenium.webdriver - - options = selenium.webdriver.FirefoxOptions() - options.add_argument("--headless") - - profile = selenium.webdriver.FirefoxProfile() - profile.set_preference( - "layout.css.devPixelsPerPx", str(self.device_scale_factor) - ) - - options.profile = profile - - service = Service(log_path=str(Path(temp_dir) / "geckodriver.log")) - except ImportError: - raise ImportError( - "Selenium is not installed. Install it with 'pip install selenium' and make sure you have a firefox webdriver installed." - ) - - temp_html = Path(temp_dir) / "temp.html" - temp_img = Path(temp_dir) / "temp.png" - with open(temp_html, "w", encoding="utf-8") as f: - f.write(self.get_css() + self.html) - - with selenium.webdriver.Firefox(options=options, service=service) as driver: - driver.get(f"file://{str(temp_html)}") # selenium will do the rest - - required_width = driver.execute_script( - "return document.body.parentNode.scrollWidth" - ) - required_height = driver.execute_script( - "return document.body.parentNode.scrollHeight" - ) - driver.set_window_size(required_width + 150, required_height + 90) - driver.save_screenshot(str(temp_img)) - - # subprocess.run(executable=self.chrome_path, args=args) - - img = Image.open(temp_img) + # by default Firefox will cleanup it's profile directory after closing + # so we need to set ignore_cleanup_errors=True + with TemporaryDirectory(ignore_cleanup_errors=True) as temp_dir: + try: + import selenium.common + import selenium.webdriver + + options = selenium.webdriver.FirefoxOptions() + options.add_argument("--headless") + + profile = selenium.webdriver.FirefoxProfile(temp_dir) + profile.set_preference( + "layout.css.devPixelsPerPx", str(self.device_scale_factor) + ) + + options.profile = profile + + service = Service(log_path=str(Path(temp_dir) / "geckodriver.log")) + except ImportError: + raise ImportError( + "Selenium is not installed. Install it with 'pip install selenium' and make sure you have a firefox webdriver installed." + ) + + temp_html = Path(temp_dir) / "temp.html" + temp_img = Path(temp_dir) / "temp.png" + with open(temp_html, "w", encoding="utf-8") as f: + f.write(self.get_css() + self.html) + + with selenium.webdriver.Firefox(options=options, service=service) as driver: + driver.get(f"file://{str(temp_html)}") # selenium will do the rest + + required_width = driver.execute_script( + "return document.body.parentNode.scrollWidth" + ) + required_height = driver.execute_script( + "return document.body.parentNode.scrollHeight" + ) + driver.set_window_size(required_width + 150, required_height + 90) + driver.save_screenshot(str(temp_img)) + + # temp_img will be deleted after context exit + img = Image.open(temp_img) return self.crop(img)