Skip to content

Commit 2438ab5

Browse files
committed
fix(pdf): 迁移为 playwright
1 parent b5e094f commit 2438ab5

File tree

10 files changed

+365
-624
lines changed

10 files changed

+365
-624
lines changed

PDF_功能说明.md

Lines changed: 25 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@
22

33
## 概述
44

5-
本插件现已支持生成 PDF 格式的群聊分析报告,提供更专业的报告输出格式。
5+
本插件现已支持生成 PDF 格式的群聊分析报告,提供更专业的报告输出格式。PDF 引擎已迁移至 Playwright,提供更好的兼容性。
66

77
## 功能特性
88

99
- 📄 **PDF 报告生成**: 将群聊分析结果导出为精美的 PDF 文档
1010
- 🎨 **专业排版**: 针对 PDF 打印优化的样式设计
1111
- 📊 **完整内容**: 包含所有分析数据(统计信息、话题分析、用户称号、群聊金句)
12-
- 🔧 **灵活配置**: 可自定义输出目录和文件名格式
12+
- 🔧 **灵活配置**: 可自定义输出目录、文件名格式以及**自定义浏览器路径**
1313

1414
## 安装依赖
1515

16-
使用 PDF 功能前,需要安装 pyppeteer 库。有以下几种安装方式:
16+
使用 PDF 功能前,需要安装 playwright 库。有以下几种安装方式:
1717

1818
### 方式一:使用命令安装(推荐)
1919

@@ -23,22 +23,19 @@
2323
/安装PDF
2424
```
2525

26-
提示: 首次使用命令安装,最后出现提示告诉你需要重启生效,是对的,需要重启 astrbot,而不是热重载插件。
27-
2826
此命令会自动:
29-
- 检查 pyppeteer 是否已安装
30-
- 如未安装,自动安装 pyppeteer
31-
- 下载 Chromium 浏览器
27+
- 检查 playwright 是否已安装
28+
- 如未安装,自动安装 playwright
29+
- 检查是否需要下载 Chromium 浏览器(已配置自定义路径则跳过)
3230
- 测试 PDF 功能是否正常
3331

3432
### 方式二:手动安装
3533

3634
```bash
37-
pip install pyppeteer==1.0.2
35+
pip install playwright
36+
playwright install chromium
3837
```
3938

40-
首次使用时,pyppeteer 还需要下载 Chromium 浏览器,请确保网络连接正常。
41-
4239
## 使用方法
4340

4441
### 1. 设置输出格式
@@ -49,106 +46,45 @@ pip install pyppeteer==1.0.2
4946
/设置格式 pdf
5047
```
5148

52-
支持的格式:
53-
- `image` - 图片格式(默认)
54-
- `text` - 文本格式
55-
- `pdf` - PDF 格式
56-
5749
### 2. 生成 PDF 报告
5850

5951
设置为 PDF 格式后,使用常规的分析命令:
6052

6153
```
6254
/群分析
63-
/群分析 3 # 分析近3天的数据
64-
```
65-
66-
### 3. 查看当前设置
67-
6855
```
69-
/设置格式 # 不带参数,查看当前格式设置
70-
/分析设置 status # 查看完整的插件状态
71-
```
72-
73-
## PDF 报告内容
74-
75-
生成的 PDF 报告包含以下部分:
76-
77-
1. **报告标题和日期**
78-
2. **基础统计数据**
79-
- 消息总数
80-
- 参与人数
81-
- 总字符数
82-
- 表情数量
83-
- 最活跃时段
84-
85-
3. **热门话题分析**
86-
- 话题名称
87-
- 主要参与者
88-
- 详细描述
89-
90-
4. **群友称号**
91-
- 用户昵称
92-
- 获得称号
93-
- MBTI 类型
94-
- 获得理由
9556

96-
5. **群聊金句**
97-
- 精选的有趣发言
98-
- 发言人
99-
- 选择理由
57+
### 3. 高级配置:自定义浏览器路径
10058

101-
## 故障排除
102-
103-
pyppeteer 版本要为稳定版的 1.0.2。
104-
105-
### 1. pyppeteer 安装失败
106-
107-
```bash
108-
# 使用国内镜像安装
109-
pip install pyppeteer -i https://pypi.tuna.tsinghua.edu.cn/simple/
110-
```
59+
如果您希望使用系统中已有的 Chrome 或 Edge,或者在特定的路径下运行浏览器,可以在配置中设置 `browser_path`
11160

112-
### 2. Chromium 下载失败
113-
114-
```bash
115-
# 手动下载 Chromium
116-
python -m pyppeteer.install
61+
```json
62+
{
63+
"browser_path": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
64+
}
11765
```
11866

119-
### 3. PDF 生成失败
120-
121-
- 检查系统内存是否充足
122-
- 确保有足够的磁盘空间
123-
- 检查输出目录权限
67+
## 故障排除
12468

125-
### 4. 中文字体显示问题
69+
### 1. Playwright 安装失败
12670

127-
PDF 使用系统默认字体,如果中文显示异常,请确保系统安装了中文字体
71+
请确保您的系统网络能够访问官网下载浏览器内核。如果是在受限环境下,建议使用系统的 Chrome/Edge 并配置 `browser_path`
12872

129-
## 性能说明
73+
### 2. PDF 生成失败
13074

131-
- PDF 生成比图片格式稍慢,通常需要 3-10 秒
132-
- 首次使用时需要启动浏览器,可能需要更长时间
133-
- 建议在服务器资源充足时使用
75+
- 检查 `browser_path` 是否正确且可执行。
76+
- 确保系统安装了必要的字体。
13477

13578
## 更新日志
13679

137-
### v1.1.0
138-
- ✨ 新增 PDF 报告生成功能
139-
- ✨ 新增 `/设置格式` 命令
140-
- 🎨 优化 PDF 样式和排版
141-
- 📝 完善配置选项和文档
80+
### v1.2.0
81+
- 🚀 **Playwright 迁移**: 替换了不稳定的 pyppeteer。
82+
- 🛠️ **自定义浏览器**: 支持手动指定 Chrome/Edge 路径。
83+
-**安装优化**: 自动检测系统浏览器并减少不必要的下载。
14284

14385
## 技术实现
14486

14587
PDF 生成基于以下技术:
146-
- **pyppeteer**: 无头浏览器控制
88+
- **Playwright**: 现代无头浏览器控制
14789
- **HTML/CSS**: 报告模板和样式
14890
- **异步处理**: 非阻塞的 PDF 生成过程
149-
150-
## 注意事项
151-
152-
1. PDF 功能需要额外的系统资源,建议在配置较好的服务器上使用
153-
2. 生成的 PDF 文件会保存在指定目录中,注意定期清理
154-
3. 如果遇到权限问题,请检查输出目录的写入权限

_conf_schema.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,12 @@
185185
"default": "data/plugins/astrbot_plugin_qq_group_daily_analysis/reports",
186186
"hint": "PDF报告文件的保存目录"
187187
},
188+
"browser_path": {
189+
"type": "string",
190+
"description": "自定义浏览器路径",
191+
"default": "",
192+
"hint": "要填写的话请你清楚自己在干什么。自定义浏览器的可执行文件路径(如 Chrome 或 Edge 的 .exe 文件)。提示:如果是在网页后台设置,则直接输入普通路径即可(如 C:\\Program Files\\...);如果是手动编辑 config.json 文件,请务必使用双反斜杠 '\\\\' 分隔路径。"
193+
},
188194
"pdf_filename_format": {
189195
"type": "string",
190196
"description": "PDF文件名格式",

main.py

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -275,9 +275,9 @@ async def analyze_group_daily(
275275
f"[AstrBot QQ群日常分析总结插件] ⚠️ 图片报告生成失败,以下是文本版本:\n\n{text_report}"
276276
)
277277
elif output_format == "pdf":
278-
if not self.config_manager.pyppeteer_available:
278+
if not self.config_manager.playwright_available:
279279
yield event.plain_result(
280-
"❌ PDF 功能不可用,请使用 /安装PDF 命令安装 pyppeteer==1.0.2"
280+
"❌ PDF 功能不可用,请使用 /安装PDF 命令安装依赖"
281281
)
282282
return
283283

@@ -342,8 +342,8 @@ async def set_output_format(
342342
current_format = self.config_manager.get_output_format()
343343
pdf_status = (
344344
"✅"
345-
if self.config_manager.pyppeteer_available
346-
else "❌ (需安装 pyppeteer)"
345+
if self.config_manager.playwright_available
346+
else "❌ (需安装 Playwright)"
347347
)
348348
yield event.plain_result(f"""📊 当前输出格式: {current_format}
349349
@@ -360,10 +360,8 @@ async def set_output_format(
360360
yield event.plain_result("❌ 无效的格式类型,支持: image, text, pdf")
361361
return
362362

363-
if format_type == "pdf" and not self.config_manager.pyppeteer_available:
364-
yield event.plain_result(
365-
"❌ PDF 格式不可用,请使用 /安装PDF 命令安装 pyppeteer==1.0.2"
366-
)
363+
if format_type == "pdf" and not self.config_manager.playwright_available:
364+
yield event.plain_result("❌ PDF 格式不可用,请使用 /安装PDF 命令安装依赖")
367365
return
368366

369367
self.config_manager.set_output_format(format_type)
@@ -540,14 +538,10 @@ async def install_pdf_deps(self, event: AiocqhttpMessageEvent):
540538
yield event.plain_result("🔄 开始安装 PDF 功能依赖,请稍候...")
541539

542540
try:
543-
# 安装 pyppeteer
544-
result = await PDFInstaller.install_pyppeteer(self.config_manager)
541+
# 安装 playwright (内部已包含浏览器内核安装逻辑)
542+
result = await PDFInstaller.install_playwright(self.config_manager)
545543
yield event.plain_result(result)
546544

547-
# 提供系统依赖安装指导
548-
system_deps_result = await PDFInstaller.install_system_deps()
549-
yield event.plain_result(system_deps_result)
550-
551545
except Exception as e:
552546
logger.error(f"安装 PDF 依赖失败: {e}", exc_info=True)
553547
yield event.plain_result(f"❌ 安装过程中出现错误: {str(e)}")

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
pyppeteer==1.0.2
1+
playwright>=1.40.0

scripts/mock_pdf_gen.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,12 @@ def get_max_golden_quotes(self):
6060
return 5
6161

6262
@property
63-
def pyppeteer_available(self):
63+
def playwright_available(self):
6464
return True
6565

66+
def get_browser_path(self):
67+
return ""
68+
6669

6770
# ==========================================
6871
# 3. Main Execution

0 commit comments

Comments
 (0)