Skip to content

Commit

Permalink
fix #93, permission error with Firefox
Browse files Browse the repository at this point in the history
  • Loading branch information
John Lyu committed Aug 30, 2023
1 parent c82ab53 commit f05db6b
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 55 deletions.
6 changes: 3 additions & 3 deletions dataframe_image/_browser_pdf.py
Original file line number Diff line number Diff line change
Expand Up @@ -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}
Expand All @@ -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}
Expand All @@ -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


Expand Down
2 changes: 1 addition & 1 deletion dataframe_image/_version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.1.18"
__version__ = "0.1.15"
93 changes: 42 additions & 51 deletions dataframe_image/selenium_screenshot.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)

0 comments on commit f05db6b

Please sign in to comment.