From 28f4e807a902d2ce93ed7186107dfb2a35c176be Mon Sep 17 00:00:00 2001 From: yuyx <237899745@qq.com> Date: Wed, 31 Dec 2025 20:23:31 +0800 Subject: [PATCH] Fix wkhtmltoimage viewport crop --- README.md | 6 ++++++ services/screenshots.py | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/README.md b/README.md index e642ffd..8c20ccd 100644 --- a/README.md +++ b/README.md @@ -633,6 +633,12 @@ docker logs knowledge-automation-multiuser | grep "数据库" | WKHTMLTOIMAGE_PATH | wkhtmltoimage 可执行文件路径 | 自动探测 | | WKHTMLTOIMAGE_JS_DELAY_MS | JS 等待时间(毫秒) | 3000 | | WKHTMLTOIMAGE_WIDTH | 截图宽度 | 1920 | +| WKHTMLTOIMAGE_HEIGHT | 截图高度(视口高度) | 1080 | +| WKHTMLTOIMAGE_ZOOM | 渲染缩放比例 | 1.0 | +| WKHTMLTOIMAGE_CROP_WIDTH | 裁剪宽度(0 表示不裁剪) | 默认跟随截图宽度 | +| WKHTMLTOIMAGE_CROP_HEIGHT | 裁剪高度(0 表示不裁剪) | 默认跟随截图高度 | +| WKHTMLTOIMAGE_CROP_X | 裁剪起点 X | 0 | +| WKHTMLTOIMAGE_CROP_Y | 裁剪起点 Y | 0 | | WKHTMLTOIMAGE_QUALITY | JPG截图质量 | 95 | | WKHTMLTOIMAGE_TIMEOUT_SECONDS | 截图超时时间(秒) | 60 | | WKHTMLTOIMAGE_USER_AGENT | 截图使用的 UA | Chrome 120 | diff --git a/services/screenshots.py b/services/screenshots.py index bb1da87..42e233f 100644 --- a/services/screenshots.py +++ b/services/screenshots.py @@ -30,6 +30,15 @@ _WKHTMLTOIMAGE_JS_DELAY_MS = int(os.environ.get("WKHTMLTOIMAGE_JS_DELAY_MS", "30 _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")) +_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 +_WKHTMLTOIMAGE_CROP_HEIGHT = ( + int(_env_crop_h) if _env_crop_h is not None else (_WKHTMLTOIMAGE_HEIGHT if _WKHTMLTOIMAGE_HEIGHT > 0 else 0) +) +_WKHTMLTOIMAGE_CROP_X = int(os.environ.get("WKHTMLTOIMAGE_CROP_X", "0")) +_WKHTMLTOIMAGE_CROP_Y = int(os.environ.get("WKHTMLTOIMAGE_CROP_Y", "0")) _WKHTMLTOIMAGE_UA = os.environ.get( "WKHTMLTOIMAGE_USER_AGENT", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", @@ -124,6 +133,16 @@ def take_screenshot_wkhtmltoimage( if _WKHTMLTOIMAGE_HEIGHT > 0: 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: + 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)]) + if _WKHTMLTOIMAGE_CROP_HEIGHT > 0: + cmd.extend(["--crop-h", str(_WKHTMLTOIMAGE_CROP_HEIGHT)]) + if run_script: cmd.extend(["--run-script", run_script]) if window_status: