diff --git a/README.md b/README.md index 8c20ccd..20b0318 100644 --- a/README.md +++ b/README.md @@ -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 表示不裁剪) | 默认跟随截图高度 | diff --git a/docker-compose.yml b/docker-compose.yml index 4fd2379..e2a6e28 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -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 diff --git a/services/screenshots.py b/services/screenshots.py index 42e233f..e9ecf42 100644 --- a/services/screenshots.py +++ b/services/screenshots.py @@ -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);" "})();" )