paperfit-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/adjust-length.md +21 -0
- package/.claude/commands/check-visual.md +27 -0
- package/.claude/commands/fix-layout.md +31 -0
- package/.claude/commands/migrate-template.md +23 -0
- package/.claude/commands/repair-table.md +21 -0
- package/.claude/commands/show-status.md +32 -0
- package/.claude-plugin/README.md +77 -0
- package/.claude-plugin/marketplace.json +41 -0
- package/.claude-plugin/plugin.json +39 -0
- package/CLAUDE.md +266 -0
- package/CONTRIBUTING.md +131 -0
- package/LICENSE +21 -0
- package/README.md +164 -0
- package/agents/code-surgeon-agent.md +214 -0
- package/agents/layout-detective-agent.md +229 -0
- package/agents/orchestrator-agent.md +254 -0
- package/agents/quality-gatekeeper-agent.md +270 -0
- package/agents/rule-engine-agent.md +224 -0
- package/agents/semantic-polish-agent.md +250 -0
- package/bin/paperfit.js +176 -0
- package/config/agent_roles.yaml +56 -0
- package/config/layout_rules.yaml +54 -0
- package/config/templates.yaml +241 -0
- package/config/vto_taxonomy.yaml +489 -0
- package/config/writing_rules.yaml +64 -0
- package/install.sh +30 -0
- package/package.json +52 -0
- package/requirements.txt +5 -0
- package/scripts/benchmark_runner.py +629 -0
- package/scripts/compile.sh +244 -0
- package/scripts/config_validator.py +339 -0
- package/scripts/cv_detector.py +600 -0
- package/scripts/evidence_collector.py +167 -0
- package/scripts/float_fixers.py +861 -0
- package/scripts/inject_defects.py +549 -0
- package/scripts/install-claude-global.js +148 -0
- package/scripts/install.js +66 -0
- package/scripts/install.sh +106 -0
- package/scripts/overflow_fixers.py +656 -0
- package/scripts/package-for-opensource.sh +138 -0
- package/scripts/parse_log.py +260 -0
- package/scripts/postinstall.js +38 -0
- package/scripts/pre_tool_use.py +265 -0
- package/scripts/render_pages.py +244 -0
- package/scripts/session_logger.py +329 -0
- package/scripts/space_util_fixers.py +773 -0
- package/scripts/state_manager.py +352 -0
- package/scripts/test_commands.py +187 -0
- package/scripts/test_cv_detector.py +214 -0
- package/scripts/test_integration.py +290 -0
- package/skills/consistency-polisher/SKILL.md +337 -0
- package/skills/float-optimizer/SKILL.md +284 -0
- package/skills/latex_fixers/__init__.py +82 -0
- package/skills/latex_fixers/float_fixers.py +392 -0
- package/skills/latex_fixers/fullwidth_fixers.py +375 -0
- package/skills/latex_fixers/overflow_fixers.py +250 -0
- package/skills/latex_fixers/semantic_micro_tuning.py +362 -0
- package/skills/latex_fixers/space_util_fixers.py +389 -0
- package/skills/latex_fixers/utils.py +55 -0
- package/skills/overflow-repair/SKILL.md +304 -0
- package/skills/space-util-fixer/SKILL.md +307 -0
- package/skills/taxonomy-vto/SKILL.md +486 -0
- package/skills/template-migrator/SKILL.md +251 -0
- package/skills/visual-inspector/SKILL.md +217 -0
- package/skills/writing-polish/SKILL.md +289 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
# Template Migrator Skill
|
|
2
|
+
|
|
3
|
+
## 概述
|
|
4
|
+
|
|
5
|
+
本技能专门处理 **Category E:跨模板迁移缺陷**,包括:
|
|
6
|
+
|
|
7
|
+
- **E1**:单栏↔双栏图表尺寸失配
|
|
8
|
+
- **E2**:页数预算不匹配(如 9 页→14 页的内容重分布)
|
|
9
|
+
- **E3**:模板特定宏兼容性
|
|
10
|
+
|
|
11
|
+
该技能由 `code-surgeon-agent` 在 `/migrate-template` 命令触发时调用,负责将一篇论文从原模板平滑迁移至目标模板,并自动适配图表尺寸、页数预算和宏包兼容性。这是 PaperFit 最具差异化价值的能力,直接解决了科研工作者切换会议投稿时的真实痛点。
|
|
12
|
+
|
|
13
|
+
## 适用场景
|
|
14
|
+
|
|
15
|
+
| 缺陷 ID | 描述 | 优先级 | 是否允许语义修改 |
|
|
16
|
+
|---------|------|--------|-----------------|
|
|
17
|
+
| E1 | 单栏↔双栏图表尺寸失配 | Critical | 否 |
|
|
18
|
+
| E2 | 页数预算不匹配 | Critical | 是(最后手段) |
|
|
19
|
+
| E3 | 模板特定宏兼容性 | Critical | 否 |
|
|
20
|
+
|
|
21
|
+
## 输入规范
|
|
22
|
+
|
|
23
|
+
| 输入项 | 来源 | 说明 |
|
|
24
|
+
|--------|------|------|
|
|
25
|
+
| 主 `.tex` 文件路径 | 项目上下文 | 需修改的源文件 |
|
|
26
|
+
| 目标模板名称 | 用户命令参数 | 如 `ECCV2024`、`ICLR2025` |
|
|
27
|
+
| 模板配置 | `config/templates.yaml` | 包含目标模板的栏数、默认字号、页宽、预期页数等 |
|
|
28
|
+
| 原模板信息 | 自动检测或用户指定 | 当前 `\documentclass` 及主要宏包 |
|
|
29
|
+
| 排版侦探报告 | `layout-detective-agent` | 迁移后首次编译的 E 类缺陷列表 |
|
|
30
|
+
|
|
31
|
+
## 输出规范
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"skill": "template-migrator",
|
|
36
|
+
"status": "success | partial | failed",
|
|
37
|
+
"modified_files": ["main.tex", "figures/fig1.tex"],
|
|
38
|
+
"changes": [
|
|
39
|
+
{
|
|
40
|
+
"defect_id": "E1",
|
|
41
|
+
"object": "Figure 1",
|
|
42
|
+
"action": "单栏图改为跨栏图",
|
|
43
|
+
"before": "\\begin{figure}\n\\includegraphics[width=\\linewidth]{fig1.pdf}\n\\end{figure}",
|
|
44
|
+
"after": "\\begin{figure*}\n\\includegraphics[width=\\textwidth]{fig1.pdf}\n\\end{figure*}"
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"macro_fixes": [
|
|
48
|
+
{
|
|
49
|
+
"issue": "\\theoremstyle undefined in ECCV",
|
|
50
|
+
"fix": "改用 \\newtheorem 直接定义"
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
"unresolved": [],
|
|
54
|
+
"page_budget_status": {
|
|
55
|
+
"current_pages": 9,
|
|
56
|
+
"target_pages": 14,
|
|
57
|
+
"gap": 5,
|
|
58
|
+
"action_taken": "触发 adjust-length 子流程"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## 迁移流程
|
|
64
|
+
|
|
65
|
+
### 第一步:加载模板配置
|
|
66
|
+
|
|
67
|
+
1. 从 `config/templates.yaml` 读取目标模板的完整配置。
|
|
68
|
+
2. 配置项包括:
|
|
69
|
+
- `documentclass`:如 `\documentclass[10pt,twocolumn]{article}` 或 `\documentclass{iclr2025}`
|
|
70
|
+
- `column_type`:`single` 或 `double`
|
|
71
|
+
- `default_figure_width`:`\linewidth` 或 `\textwidth`
|
|
72
|
+
- `expected_pages`:该会议/期刊的典型页数(如 ICLR 9 页,ECCV 14 页)
|
|
73
|
+
- `forbidden_packages`:与新模板冲突的宏包列表
|
|
74
|
+
- `required_packages`:新模板必须加载的宏包
|
|
75
|
+
|
|
76
|
+
示例配置(`config/templates.yaml` 片段):
|
|
77
|
+
|
|
78
|
+
```yaml
|
|
79
|
+
ECCV2024:
|
|
80
|
+
documentclass: "\documentclass[10pt,twocolumn]{article}"
|
|
81
|
+
column_type: double
|
|
82
|
+
default_figure_width: "\linewidth"
|
|
83
|
+
expected_pages: 14
|
|
84
|
+
forbidden_packages: ["amsthm", "algorithm2e"]
|
|
85
|
+
required_packages: ["graphicx", "amsmath", "amssymb"]
|
|
86
|
+
float_behavior: "figures may use figure* for wide content"
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 第二步:分析原模板特征
|
|
90
|
+
|
|
91
|
+
1. 读取当前主 `.tex` 文件的 `\documentclass` 声明。
|
|
92
|
+
2. 识别当前栏数(单栏/双栏)。
|
|
93
|
+
3. 列出当前加载的宏包列表(`\usepackage{...}`)。
|
|
94
|
+
4. 若用户未明确指定原模板,尝试根据 `\documentclass` 自动推断。
|
|
95
|
+
|
|
96
|
+
### 第三步:执行模板替换
|
|
97
|
+
|
|
98
|
+
#### 3.1 替换 `\documentclass`
|
|
99
|
+
|
|
100
|
+
将原 `\documentclass` 替换为目标模板的声明。
|
|
101
|
+
|
|
102
|
+
```latex
|
|
103
|
+
% 修改前(ICLR 2025 单栏)
|
|
104
|
+
\documentclass{iclr2025}
|
|
105
|
+
|
|
106
|
+
% 修改后(ECCV 2024 双栏)
|
|
107
|
+
\documentclass[10pt,twocolumn]{article}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**注意**:若目标模板有多个可选参数(如 `review`、`final`),询问用户偏好或使用默认值。
|
|
111
|
+
|
|
112
|
+
#### 3.2 处理宏包冲突
|
|
113
|
+
|
|
114
|
+
1. 对比原宏包列表与目标模板的 `forbidden_packages`。
|
|
115
|
+
2. 若存在冲突,执行以下操作之一:
|
|
116
|
+
- **移除**:直接注释或删除该 `\usepackage` 行。
|
|
117
|
+
- **替换**:提供替代方案(如 `algorithm2e` → `algorithmic`)。
|
|
118
|
+
- **条件编译**:使用 `\ifdefined` 等实现跨模板兼容。
|
|
119
|
+
|
|
120
|
+
```latex
|
|
121
|
+
% 修改前(含 amsthm,与新模板冲突)
|
|
122
|
+
\usepackage{amsthm}
|
|
123
|
+
\newtheorem{theorem}{Theorem}
|
|
124
|
+
|
|
125
|
+
% 修改后(改用 LaTeX 原生定义)
|
|
126
|
+
% \usepackage{amsthm} % removed for template compatibility
|
|
127
|
+
\newtheorem{theorem}{Theorem}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
#### 3.3 添加必需宏包
|
|
131
|
+
|
|
132
|
+
若目标模板要求特定宏包(如 `graphicx`),确保导言区已加载。若缺失,添加之。
|
|
133
|
+
|
|
134
|
+
```latex
|
|
135
|
+
% 确保必需宏包存在
|
|
136
|
+
\usepackage{graphicx}
|
|
137
|
+
\usepackage{amsmath}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 第四步:图表尺寸适配(E1 修复)
|
|
141
|
+
|
|
142
|
+
这是跨模板迁移中最关键、最易出错的环节。
|
|
143
|
+
|
|
144
|
+
#### 4.1 判断单栏/双栏切换方向
|
|
145
|
+
|
|
146
|
+
| 原模板 | 目标模板 | 处理策略 |
|
|
147
|
+
|--------|----------|----------|
|
|
148
|
+
| 单栏 | 双栏 | 所有图表默认改为单栏宽(`\columnwidth`),宽图改为跨栏(`figure*`) |
|
|
149
|
+
| 双栏 | 单栏 | 所有跨栏图(`figure*`)改为普通图(`figure`),宽度改为 `\linewidth` |
|
|
150
|
+
| 双栏 | 双栏 | 保持原策略,仅检查宽度是否适配新模板的栏宽 |
|
|
151
|
+
| 单栏 | 单栏 | 基本不变,仅检查页宽是否变化 |
|
|
152
|
+
|
|
153
|
+
#### 4.2 智能判断哪些图应跨栏(单栏→双栏时)
|
|
154
|
+
|
|
155
|
+
对于原单栏中的全宽图,在双栏中若仍用单栏会显得过小。需根据图片**宽高比**智能决策:
|
|
156
|
+
|
|
157
|
+
- 若图片宽度 > 高度 × 1.5(宽高比 > 1.5),建议改为跨栏 `figure*`。
|
|
158
|
+
- 若图片宽度 ≤ 高度 × 1.5,保留单栏 `figure`,但宽度设为 `\columnwidth`。
|
|
159
|
+
|
|
160
|
+
```latex
|
|
161
|
+
% 原单栏全宽图(宽度 = \linewidth)
|
|
162
|
+
\begin{figure}
|
|
163
|
+
\includegraphics[width=\linewidth]{wide_arch.pdf}
|
|
164
|
+
\end{figure}
|
|
165
|
+
|
|
166
|
+
% 迁移后(宽高比大,改为跨栏)
|
|
167
|
+
\begin{figure*}
|
|
168
|
+
\includegraphics[width=\textwidth]{wide_arch.pdf}
|
|
169
|
+
\end{figure*}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
#### 4.3 处理表格宽度
|
|
173
|
+
|
|
174
|
+
- 单栏表格在双栏中:宽度改为 `\columnwidth`。
|
|
175
|
+
- 若原表格为 `tabularx{\linewidth}`,改为 `tabularx{\columnwidth}`。
|
|
176
|
+
- 若表格列数过多,考虑改为跨栏 `table*` 并使用 `\textwidth`。
|
|
177
|
+
|
|
178
|
+
```latex
|
|
179
|
+
% 修改前(单栏宽表)
|
|
180
|
+
\begin{table}
|
|
181
|
+
\begin{tabularx}{\linewidth}{|l|X|X|}
|
|
182
|
+
...
|
|
183
|
+
\end{tabularx}
|
|
184
|
+
\end{table}
|
|
185
|
+
|
|
186
|
+
% 修改后(双栏单栏宽表)
|
|
187
|
+
\begin{table}
|
|
188
|
+
\begin{tabularx}{\columnwidth}{|l|X|X|}
|
|
189
|
+
...
|
|
190
|
+
\end{tabularx}
|
|
191
|
+
\end{table}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
#### 4.4 特殊对象处理
|
|
195
|
+
|
|
196
|
+
- **长公式**:双栏中公式宽度受限,可能需将 `equation` 改为 `multline` 或 `align` 并手动断行。
|
|
197
|
+
- **算法伪代码**:双栏中宽度减半,可能需要调整缩进或改为跨栏 `figure*`。
|
|
198
|
+
|
|
199
|
+
### 第五步:编译并检测遗留问题
|
|
200
|
+
|
|
201
|
+
1. 完成上述修改后,执行首次编译。
|
|
202
|
+
2. 若编译失败,解析日志中的 `Undefined control sequence` 等错误(E3),返回第三步修正宏包冲突。
|
|
203
|
+
3. 若编译成功,渲染页图,调用 `layout-detective-agent` 检测 E1/E2 缺陷。
|
|
204
|
+
|
|
205
|
+
### 第六步:页数预算调整(E2 修复)
|
|
206
|
+
|
|
207
|
+
1. 获取当前 PDF 总页数。
|
|
208
|
+
2. 与目标模板的 `expected_pages` 对比,计算偏差。
|
|
209
|
+
3. 若偏差在 ±1 页以内,通常可接受;若偏差 ≥ 2 页,执行以下操作:
|
|
210
|
+
- **若超页**:按 A3 修复策略压缩(见 `space-util-fixer`)。
|
|
211
|
+
- **若缺页**:若用户未指定 `--keep-content`,触发 `adjust-length` 子流程进行语义扩写。
|
|
212
|
+
4. 页数调整通常需要多轮迭代,应在浮动体和图表稳定后进行。
|
|
213
|
+
|
|
214
|
+
### 第七步:生成迁移报告
|
|
215
|
+
|
|
216
|
+
输出一份 Markdown 迁移报告,包含:
|
|
217
|
+
|
|
218
|
+
- 目标模板信息
|
|
219
|
+
- 已修改的文件列表
|
|
220
|
+
- 图表尺寸变更清单(哪些图改为跨栏、哪些保留单栏)
|
|
221
|
+
- 宏包冲突及解决方案
|
|
222
|
+
- 页数调整结果(初始页数 → 最终页数)
|
|
223
|
+
- 人工检查建议(如“请确认 Figure 3 改为跨栏后视觉效果”)
|
|
224
|
+
|
|
225
|
+
## 双栏迁移的特别注意事项
|
|
226
|
+
|
|
227
|
+
双栏模板的排版行为与单栏有本质不同:
|
|
228
|
+
|
|
229
|
+
1. **跨栏图表只能放在页顶**:`figure*` 和 `table*` 仅支持 `[t]` 或 `[p]` 参数,无法使用 `[h]` 或 `[b]`。这意味着跨栏图必然出现在下一页顶部,可能拉大引用距离(B1 缺陷)。这是 LaTeX 的限制,无法完全消除,需在报告中说明。
|
|
230
|
+
2. **浮动体调度更复杂**:双栏中浮动体更容易堆积(B3),可能需要手动插入 `\FloatBarrier` 或调整源码位置。
|
|
231
|
+
3. **公式编号**:双栏中公式编号通常在右侧,若原单栏模板编号在左侧,需检查是否冲突。
|
|
232
|
+
|
|
233
|
+
## 与其它技能的协作
|
|
234
|
+
|
|
235
|
+
- **浮动体优化 (float-optimizer)**:迁移后必然产生新的浮动体位置问题,需联动修复。
|
|
236
|
+
- **空间利用修复 (space-util-fixer)**:页数调整依赖此技能。
|
|
237
|
+
- **语义润色 (semantic-polish-agent)**:扩写/缩写时调用。
|
|
238
|
+
|
|
239
|
+
## 验证标准
|
|
240
|
+
|
|
241
|
+
迁移成功的判定标准:
|
|
242
|
+
|
|
243
|
+
- [ ] 编译成功,无阻塞性错误
|
|
244
|
+
- [ ] 所有图表在新模板下尺寸适配(无溢出、无过窄)
|
|
245
|
+
- [ ] 页数符合目标模板预期(或用户接受偏差)
|
|
246
|
+
- [ ] 无未解决的宏包冲突
|
|
247
|
+
- [ ] 视觉风格与目标模板一致
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
**Template Migrator Skill 就绪。**
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# Visual Inspector Skill
|
|
2
|
+
|
|
3
|
+
## 概述
|
|
4
|
+
|
|
5
|
+
本技能是 PaperFit 视觉排版优化闭环中的关键环节,专门负责 **PDF 页图渲染与视觉验收指导**。它封装了将 PDF 转换为逐页高分辨率图片的标准化流程,并为 `layout-detective-agent` 和 `quality-gatekeeper-agent` 提供详细的逐页视觉检查清单。
|
|
6
|
+
|
|
7
|
+
该技能由 `orchestrator-agent` 在每次编译后调用,确保多模态证据链中的“页图”环节可靠、一致且可复现。
|
|
8
|
+
|
|
9
|
+
## 适用场景
|
|
10
|
+
|
|
11
|
+
- 每次编译成功后,需生成页图供视觉 Agent 审查。
|
|
12
|
+
- 手动触发视觉检查(如 `/check-visual` 命令)。
|
|
13
|
+
- 修复前后对比验证。
|
|
14
|
+
|
|
15
|
+
## 输入规范
|
|
16
|
+
|
|
17
|
+
| 输入项 | 来源 | 必需 | 说明 |
|
|
18
|
+
|--------|------|------|------|
|
|
19
|
+
| PDF 文件路径 | 编译输出 | ✅ | 通常为 `main.pdf` |
|
|
20
|
+
| 输出目录 | 配置或默认 | ✅ | 页图存放目录,默认为 `data/pages/` |
|
|
21
|
+
| DPI 参数 | 配置或调用方指定 | ✅ | 渲染分辨率,默认 220 DPI |
|
|
22
|
+
| 页码范围 | 调用方指定 | ⚠️ | 若为空,渲染全部页面 |
|
|
23
|
+
| 局部裁剪参数 | 调用方指定 | ⚠️ | 如 `{page: 5, bbox: [x,y,w,h]}`,用于表格/公式局部复查 |
|
|
24
|
+
|
|
25
|
+
## 输出规范
|
|
26
|
+
|
|
27
|
+
本技能输出两份产物:
|
|
28
|
+
|
|
29
|
+
1. **页图文件集**:PNG 或 JPG 格式的逐页图片,命名规则为 `page_001.png`、`page_002.png` 等。
|
|
30
|
+
2. **渲染报告 JSON**:
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"skill": "visual-inspector",
|
|
35
|
+
"status": "success | partial | failed",
|
|
36
|
+
"pdf_path": "main.pdf",
|
|
37
|
+
"output_dir": "data/pages/",
|
|
38
|
+
"dpi": 220,
|
|
39
|
+
"pages_rendered": 9,
|
|
40
|
+
"page_files": [
|
|
41
|
+
{"page": 1, "file": "data/pages/page_001.png", "width": 1700, "height": 2200},
|
|
42
|
+
{"page": 2, "file": "data/pages/page_002.png", "width": 1700, "height": 2200}
|
|
43
|
+
],
|
|
44
|
+
"cropped_regions": [
|
|
45
|
+
{
|
|
46
|
+
"page": 5,
|
|
47
|
+
"object": "Table 2",
|
|
48
|
+
"file": "data/pages/page_005_table2.png",
|
|
49
|
+
"bbox": [100, 450, 800, 300]
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
"errors": []
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 渲染流程
|
|
57
|
+
|
|
58
|
+
### 第一步:环境检查
|
|
59
|
+
|
|
60
|
+
1. 确认 PDF 文件存在且可读。
|
|
61
|
+
2. 检查 Python 环境及所需依赖:
|
|
62
|
+
- `pdf2image` 库
|
|
63
|
+
- Poppler 工具(`pdftoppm` 或 `pdftocairo`)
|
|
64
|
+
|
|
65
|
+
若 Poppler 未安装,根据操作系统提供安装指引:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# Debian/Ubuntu
|
|
69
|
+
sudo apt-get install poppler-utils
|
|
70
|
+
|
|
71
|
+
# macOS
|
|
72
|
+
brew install poppler
|
|
73
|
+
|
|
74
|
+
# Windows
|
|
75
|
+
# 下载 poppler 并添加到 PATH,或使用 conda install -c conda-forge poppler
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
3. 若依赖缺失,报告错误并终止,由上层 Agent 提示用户安装。
|
|
79
|
+
|
|
80
|
+
### 第二步:执行渲染
|
|
81
|
+
|
|
82
|
+
使用 `scripts/render_pages.py` 脚本(或直接调用 `pdf2image` 库)进行渲染。
|
|
83
|
+
|
|
84
|
+
#### 基础渲染命令
|
|
85
|
+
|
|
86
|
+
```python
|
|
87
|
+
from pdf2image import convert_from_path
|
|
88
|
+
|
|
89
|
+
pages = convert_from_path(
|
|
90
|
+
pdf_path,
|
|
91
|
+
dpi=220,
|
|
92
|
+
fmt='png',
|
|
93
|
+
thread_count=2,
|
|
94
|
+
grayscale=False,
|
|
95
|
+
size=None
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
for i, page in enumerate(pages, start=1):
|
|
99
|
+
page.save(f"{output_dir}/page_{i:03d}.png", "PNG")
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
#### 渲染参数建议
|
|
103
|
+
|
|
104
|
+
| 场景 | DPI | 说明 |
|
|
105
|
+
|------|-----|------|
|
|
106
|
+
| 整页常规检查 | 180-220 | 平衡清晰度与文件大小 |
|
|
107
|
+
| 表格/公式细节复查 | 260-320 | 需清晰辨认小字号或密集内容 |
|
|
108
|
+
| 局部裁剪复查 | 320 | 聚焦特定区域,可接受较大文件 |
|
|
109
|
+
|
|
110
|
+
### 第三步:局部区域裁剪(可选)
|
|
111
|
+
|
|
112
|
+
当 `layout-detective-agent` 需要对特定表格、公式或段落进行高精度复查时,可请求渲染局部区域。
|
|
113
|
+
|
|
114
|
+
1. 首先以较高 DPI(如 320)渲染整页。
|
|
115
|
+
2. 根据调用方提供的边界框(bbox)裁剪图片。
|
|
116
|
+
3. 保存裁剪后的图片,命名包含对象标识(如 `page_005_table2.png`)。
|
|
117
|
+
|
|
118
|
+
裁剪示例:
|
|
119
|
+
|
|
120
|
+
```python
|
|
121
|
+
from PIL import Image
|
|
122
|
+
|
|
123
|
+
full_page = Image.open(f"{output_dir}/page_005.png")
|
|
124
|
+
cropped = full_page.crop((x1, y1, x2, y2))
|
|
125
|
+
cropped.save(f"{output_dir}/page_005_table2.png")
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### 第四步:生成渲染报告
|
|
129
|
+
|
|
130
|
+
记录渲染结果,包括:
|
|
131
|
+
- 成功渲染的页数
|
|
132
|
+
- 每页图片的路径和尺寸
|
|
133
|
+
- 裁剪区域信息(如有)
|
|
134
|
+
- 错误或警告(如某些页渲染失败)
|
|
135
|
+
|
|
136
|
+
## 视觉检查清单
|
|
137
|
+
|
|
138
|
+
以下清单供 `layout-detective-agent` 在逐页审查时参考。本技能不执行检查,仅提供指导框架。
|
|
139
|
+
|
|
140
|
+
### 通用检查项(每页必查)
|
|
141
|
+
|
|
142
|
+
- [ ] 页面整体信息密度是否均衡?是否存在大面积无意义留白?
|
|
143
|
+
- [ ] 页眉、页脚、页码是否完整且位置正确?
|
|
144
|
+
- [ ] 是否有内容伸出页边距或栏宽?
|
|
145
|
+
- [ ] 图表是否清晰可读,无模糊或锯齿?
|
|
146
|
+
- [ ] 段落末尾是否有孤行或短尾巴?
|
|
147
|
+
|
|
148
|
+
### 首页专项
|
|
149
|
+
|
|
150
|
+
- [ ] 标题、作者、机构信息是否完整,格式是否正确?
|
|
151
|
+
- [ ] 摘要段是否与模板风格一致?
|
|
152
|
+
- [ ] 是否有不必要的空白或过大的标题间距?
|
|
153
|
+
|
|
154
|
+
### 正文页专项
|
|
155
|
+
|
|
156
|
+
- [ ] 章节标题是否突出且一致?
|
|
157
|
+
- [ ] 图表与正文的衔接是否自然?图表是否在引用附近?
|
|
158
|
+
- [ ] 跨页段落是否合理断开?
|
|
159
|
+
- [ ] 双栏布局中左右栏高度是否平衡(尤其末页)?
|
|
160
|
+
|
|
161
|
+
### 末页专项
|
|
162
|
+
|
|
163
|
+
- [ ] 参考文献是否完整,无被浮动体切断?
|
|
164
|
+
- [ ] 末页留白是否在可接受范围(<20%)?
|
|
165
|
+
- [ ] 若为双栏,左右栏底部是否对齐?
|
|
166
|
+
|
|
167
|
+
### 表格专项
|
|
168
|
+
|
|
169
|
+
- [ ] 表格宽度是否匹配栏宽?有无超宽或过窄?
|
|
170
|
+
- [ ] 列宽分配是否均衡?有无单列过宽挤压其他列?
|
|
171
|
+
- [ ] 表格字号是否与全篇其他表格一致?
|
|
172
|
+
- [ ] 表格线是否清晰?推荐使用 `booktabs` 风格。
|
|
173
|
+
|
|
174
|
+
### 图片专项
|
|
175
|
+
|
|
176
|
+
- [ ] 图片是否清晰,分辨率足够?
|
|
177
|
+
- [ ] 图片宽度是否充分利用栏宽?
|
|
178
|
+
- [ ] 图片标题是否在图片下方(表格标题在上方)?
|
|
179
|
+
- [ ] 图片中的文字(坐标轴标签、图例)是否可读?
|
|
180
|
+
|
|
181
|
+
### 公式专项
|
|
182
|
+
|
|
183
|
+
- [ ] 公式是否超出栏宽?
|
|
184
|
+
- [ ] 多行公式是否在合理位置断行并对齐?
|
|
185
|
+
- [ ] 公式编号是否在正确位置(通常右侧)?
|
|
186
|
+
|
|
187
|
+
## 与其它 Agent 的协作
|
|
188
|
+
|
|
189
|
+
- **上游调用者**:`orchestrator-agent` 在编译成功后调用本技能。
|
|
190
|
+
- **下游消费者**:
|
|
191
|
+
- `layout-detective-agent` 使用页图进行视觉缺陷检测。
|
|
192
|
+
- `quality-gatekeeper-agent` 使用页图进行最终验收对比。
|
|
193
|
+
- `code-surgeon-agent` 在修复后可能请求局部页图验证特定修改。
|
|
194
|
+
|
|
195
|
+
## 异常处理
|
|
196
|
+
|
|
197
|
+
| 异常情况 | 处理方式 |
|
|
198
|
+
|----------|----------|
|
|
199
|
+
| Poppler 未安装 | 返回明确错误信息,包含安装指引 |
|
|
200
|
+
| PDF 文件损坏 | 报告错误,请求重新编译 |
|
|
201
|
+
| 部分页渲染失败 | 记录失败页码,尽可能渲染其余页,状态标记为 `partial` |
|
|
202
|
+
| 磁盘空间不足 | 报告错误,清理临时目录或提示用户释放空间 |
|
|
203
|
+
|
|
204
|
+
## 性能优化建议
|
|
205
|
+
|
|
206
|
+
- 对于大型 PDF(>20 页),可考虑仅渲染指定页码范围,避免不必要开销。
|
|
207
|
+
- 缓存机制:若 PDF 文件未修改且渲染参数相同,可复用已有页图。通过比较 PDF 文件哈希和渲染参数实现。
|
|
208
|
+
|
|
209
|
+
## 注意事项
|
|
210
|
+
|
|
211
|
+
- **页图是视觉验收的唯一依据**:严禁仅凭 PDF 文本抽取或日志判断排版质量。
|
|
212
|
+
- **保持页码对应**:页图文件名必须明确反映页码,便于缺陷定位。
|
|
213
|
+
- **高 DPI 不宜滥用**:过高 DPI 会导致图片体积庞大,影响传输和加载速度,按需使用。
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
**Visual Inspector Skill 就绪。**
|