Capture full-page wkhtmltoimage shots

This commit is contained in:
2025-12-31 20:50:02 +08:00
parent 28f4e807a9
commit 2e44afde30
3 changed files with 38 additions and 4 deletions

View File

@@ -31,6 +31,12 @@ _WKHTMLTOIMAGE_WIDTH = int(os.environ.get("WKHTMLTOIMAGE_WIDTH", "1920"))
_WKHTMLTOIMAGE_HEIGHT = int(os.environ.get("WKHTMLTOIMAGE_HEIGHT", "1080"))
_WKHTMLTOIMAGE_QUALITY = int(os.environ.get("WKHTMLTOIMAGE_QUALITY", "95"))
_WKHTMLTOIMAGE_ZOOM = float(os.environ.get("WKHTMLTOIMAGE_ZOOM", "1.0"))
_WKHTMLTOIMAGE_FULL_PAGE = str(os.environ.get("WKHTMLTOIMAGE_FULL_PAGE", "")).strip().lower() in (
"1",
"true",
"yes",
"on",
)
_env_crop_w = os.environ.get("WKHTMLTOIMAGE_CROP_WIDTH")
_env_crop_h = os.environ.get("WKHTMLTOIMAGE_CROP_HEIGHT")
_WKHTMLTOIMAGE_CROP_WIDTH = int(_env_crop_w) if _env_crop_w is not None else _WKHTMLTOIMAGE_WIDTH
@@ -130,13 +136,13 @@ def take_screenshot_wkhtmltoimage(
if image_format in ("jpg", "jpeg"):
cmd.extend(["--quality", str(_WKHTMLTOIMAGE_QUALITY)])
if _WKHTMLTOIMAGE_HEIGHT > 0:
if _WKHTMLTOIMAGE_HEIGHT > 0 and not _WKHTMLTOIMAGE_FULL_PAGE:
cmd.extend(["--height", str(_WKHTMLTOIMAGE_HEIGHT)])
if abs(_WKHTMLTOIMAGE_ZOOM - 1.0) > 1e-6:
cmd.extend(["--zoom", str(_WKHTMLTOIMAGE_ZOOM)])
if _WKHTMLTOIMAGE_CROP_WIDTH > 0 or _WKHTMLTOIMAGE_CROP_HEIGHT > 0:
if not _WKHTMLTOIMAGE_FULL_PAGE and (_WKHTMLTOIMAGE_CROP_WIDTH > 0 or _WKHTMLTOIMAGE_CROP_HEIGHT > 0):
cmd.extend(["--crop-x", str(_WKHTMLTOIMAGE_CROP_X), "--crop-y", str(_WKHTMLTOIMAGE_CROP_Y)])
if _WKHTMLTOIMAGE_CROP_WIDTH > 0:
cmd.extend(["--crop-w", str(_WKHTMLTOIMAGE_CROP_WIDTH)])
@@ -269,10 +275,35 @@ def take_screenshot_for_account(
"(function(){"
"var f=document.getElementById('mainframe');"
"function done(){window.status='ready';}"
"function fit(){"
"if(!f){done();return;}"
"try{"
"var doc=f.contentDocument||f.contentWindow.document;"
"if(doc&&doc.body&&doc.documentElement){"
"doc.body.style.height='auto';"
"doc.documentElement.style.height='auto';"
"doc.body.style.overflow='visible';"
"doc.documentElement.style.overflow='visible';"
"var h=Math.max(doc.body.scrollHeight,doc.documentElement.scrollHeight);"
"if(h&&h>0){"
"f.style.height=h+'px';"
"var extra=0;"
"var topBar=document.querySelector('.main-top');"
"if(topBar){extra+=topBar.offsetHeight||0;}"
"var container=document.querySelector('.main-container');"
"if(container){extra+=container.offsetTop||0;}"
"var total=h+extra+20;"
"document.body.style.height=total+'px';"
"document.documentElement.style.height=total+'px';"
"}"
"}"
"}catch(e){}"
"done();"
"}"
"if(!f){fit();return;}"
f"f.src='{target_url}';"
"f.onload=function(){setTimeout(done,500);};"
"setTimeout(done,4000);"
"f.onload=function(){setTimeout(fit,500);};"
"setTimeout(fit,4000);"
"})();"
)