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

@@ -634,6 +634,7 @@ docker logs knowledge-automation-multiuser | grep "数据库"
| WKHTMLTOIMAGE_JS_DELAY_MS | JS 等待时间(毫秒) | 3000 |
| WKHTMLTOIMAGE_WIDTH | 截图宽度 | 1920 |
| WKHTMLTOIMAGE_HEIGHT | 截图高度(视口高度) | 1080 |
| WKHTMLTOIMAGE_FULL_PAGE | 是否输出全页截图(忽略视口高度/裁剪) | 0 |
| WKHTMLTOIMAGE_ZOOM | 渲染缩放比例 | 1.0 |
| WKHTMLTOIMAGE_CROP_WIDTH | 裁剪宽度0 表示不裁剪) | 默认跟随截图宽度 |
| WKHTMLTOIMAGE_CROP_HEIGHT | 裁剪高度0 表示不裁剪) | 默认跟随截图高度 |

View File

@@ -45,6 +45,8 @@ services:
- LOG_FILE=logs/app.log
- API_DIAGNOSTIC_LOG=0
- API_DIAGNOSTIC_SLOW_MS=0
# wkhtmltoimage 截图配置
- WKHTMLTOIMAGE_FULL_PAGE=1
# 知识管理平台配置
- ZSGL_LOGIN_URL=https://postoa.aidunsoft.com/admin/login.aspx
- ZSGL_INDEX_URL_PATTERN=index.aspx

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