[Bug][pdf-plugin] html2pdf-next.js 的 @page 检测只扫行内 <style>,误注入 20mm 边距导致分页膨胀
维护者通常 1 天内回复
还没有人认领这个 Issue。
评估
- 难度
- 2/5
- 预计耗时
- 1-3 小时
- 新手友好度
- 76/100
- Issue 类型
- 缺陷
- 描述清晰度
- 描述清楚
- 活跃度
- 活跃
- 技术栈
- css, javascript, nodejs
- 领域
- cli
调研方向
错误出在 html2pdf-next.js 的 preRenderHooks 第 5 步中的 @page 检测,该步骤使用 document.querySelectorAll('style')。请用一个最小页面复现:在外部样式表中放入 @page { size: A4; margin: 8mm; },然后运行 node html2pdf-next.js page.html -o out.pdf。当外部链接的情况下保留作者设置的页边距,并且页面未声明任何 @page 时仍应用后备规则 @page { margin: 20mm; },即视为完成。
由索引模型根据 Issue 内容生成。
描述
Description
html2pdf-next.js 的 preRenderHooks 第 5 步用 document.querySelectorAll('style') 判断页面是否声明过 @page。当 @page 写在外部样式表(<link>)里时会被误判为缺失,随后注入 @page { margin: 20mm; };该行内样式生效晚于 <link>,会覆盖作者边距、压缩可用页高,把本可容纳的内容挤出额外页。
Steps to Reproduce(最小复现)
同一最小 HTML(内容样式全部 inline;@page { size: A4; margin: 8mm; } 单独放外链 CSS),用未打补丁的发行版/上游版本执行 node html2pdf-next.js page.html -o out.pdf:
| 导出方式(同一页面) | 页顶起点(量化 bbox) | 页数 |
|---|---|---|
外链 CSS 的 @page(8mm) |
20.1mm(被注入的 20mm 覆盖) | 2 |
同一条 @page 改经 --css 行内注入 |
7.8mm | 1 |
页面完全不声明 @page(fallback 生效对照) |
22.2mm | 1 |
页顶起点 20.1mm → 7.8mm 的翻转证明:缺陷不在排版,而在"检测只扫行内 <style>"这一处。
Expected Behavior
作者声明的 @page 边距被尊重;fallback 注入仅在页面确实未声明 @page 时发生。
Actual Behavior
外链 @page 被无视,行内 @page { margin: 20mm; } 覆盖作者边距,可用页高两页共缩水约 190px,内容溢出到额外空白内容页。
Suggested Fix
检测范围扩展到 document.styleSheets(含 <link> 样式表):
const hasPageRule = Array.from(document.styleSheets).some(sheet => {
try {
return Array.from(sheet.cssRules || []).some(
r => typeof r.cssText === 'string' && r.cssText.includes('@page'));
} catch { return false; } // 跨域样式表无访问权限时按未命中处理
});
已实测该修复:外链场景恢复作者 8mm 边距;页面完全无 @page 时 fallback 仍生效(无回归)。
Environment
- OS:Windows 11
- 版本:pdf-plugin 0.1.8(ZCode 安装包内置);Playwright Chromium Headless Shell 156
- 主要语言
- Python
- 星标
- 103
- 派生
- 78
- PR 合并指标
- 30 天内没有已合并 PR
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
zai-org/zcode-plugins 的其他 Issue
-
难度 1/5 1 小时以内 新手友好度 85/100
zai-org/zcode-plugins#106 ·
维护者通常 1 天内回复
-
video-agent-kit (0.4.3): hooks invoke python3, which doesn't exist on Windows — SessionStart/UserPromptSubmit/Stop hooks fail on every trigger可能已有人在做 @dvd233 于 26 天前认领。 未关闭
难度 2/5 1-3 小时 新手友好度 85/100
zai-org/zcode-plugins#14 ·
维护者通常 1 天内回复
-
难度 3/5 1-2 天 新手友好度 74/100
zai-org/zcode-plugins#109 ·
维护者通常 1 天内回复
-
难度 4/5 3-5 天 新手友好度 18/100
zai-org/zcode-plugins#105 · 1 个 reaction ·
维护者通常 1 天内回复
-
难度 4/5 3-5 天 新手友好度 35/100
zai-org/zcode-plugins#88 · 1 条评论 ·
维护者通常 1 天内回复
查看 zai-org/zcode-plugins 的全部 Issue
相似的 Issue
-
debt
难度 2/5 1-3 小时 新手友好度 68/100
microsoft/vscode-flake8#601 ·
维护者通常 1 天内回复
-
nonews refactor
难度 2/5 1-3 小时 新手友好度 75/100
Uninett/nav#4255 · 1 条评论 · 1 个 reaction ·
维护者通常 3 天内回复
-
namespace operations
难度 1/5 1 小时以内 新手友好度 70/100
EclipseFdn/open-vsx.org#14421 ·
维护者通常 1 天内回复
-
untriaged
难度 2/5 1-3 小时 新手友好度 78/100
ubuntu/ubuntu-project-docs#850 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 83/100
维护者通常 1 天内回复