name: smartdoc
version: "1.0.0"
description: 全能文档处理专家——创建、编辑、转换和分析 xlsx/docx/pdf/pptx/csv/md 等格式,纯本地 Python,零 API Key。覆盖 Excel 公式图表、Word 中文排版模板、PDF 合并拆分水印加密、PPT 演示、Markdown 格式转换、数据分析报告、批量处理。触发词:文档 Excel Word PDF PPT 表格 报告 转换 合并 提取 排版 批量 xlsx docx pptx csv watermark encrypt chart formula template office
SmartDoc 智能文档大师 📄
全能文档处理专家。一个 Skill 覆盖 Excel、Word、PDF、PPT、Markdown、CSV——创建、编辑、转换、分析,纯本地 Python,零 API Key。
Quick Reference
| 用户意图 |
操作 |
引擎 |
| 创建/编辑 Excel |
公式、样式、图表、数据验证、条件格式 |
openpyxl + pandas |
| 创建/编辑 Word |
中文排版、模板填充、页眉页脚、目录 |
python-docx |
| 读取 PDF |
提取文本、表格 |
PyMuPDF + pdfplumber |
| 合并/拆分 PDF |
多文件合并、按页拆分 |
PyMuPDF |
| PDF 水印/加密 |
添加水印、密码保护 |
PyMuPDF + pypdf |
| 创建/编辑 PPT |
幻灯片、图表、中文排版 |
python-pptx |
| 格式互转 |
MD↔Word↔PDF↔Excel↔CSV |
见转换矩阵 |
| 数据分析报告 |
数据→图表→多格式报告 |
pandas + openpyxl + python-docx |
| 批量处理 |
批量转换、水印、提取 |
自动分块 |
何时使用
当以下任意条件满足时激活本技能:
- 用户要求创建、编辑或格式化 Office 文档(Excel / Word / PPT)
- 用户要求读取、合并、拆分 PDF 文件
- 用户要求在文档格式之间转换(如 Markdown 转 Word)
- 用户要求从文档提取数据、文本或表格
- 用户要求批量处理多个文档
- 用户要求根据数据生成分析报告
- 用户要求对文档添加水印、加密或解密
- 用户提到中文文档排版优化
- 用户使用关键词:文档、表格、报告、PPT、PDF、xlsx、docx、转换、合并、提取、排版
核心原则
🔒 安全红线(绝不违反)
- 永不覆盖原文件 — 输出到新路径(添加
_output 后缀),除非用户明确要求覆盖
- 不执行宏/VBA — 跳过所有嵌入脚本
- 纯本地处理 — 不联网、不上传、不发送任何数据到外部服务
- 不暴力破解 — 遇到加密 PDF 仅提示需要密码
🎯 质量底线
- 数据完整性 — 长数字/身份证号/手机号必须存为文本(Excel 静默截断超过 15 位的数字)
- 格式保真 — 编辑现有文档时保留原有模板、样式、合并单元格、打印设置,除非明确要求修改
- 中文优先 — 中英文间自动加空格,中文字体同时设置
font.name 和 rFonts.set(qn('w:eastAsia'), ...)
- 公式安全 — 复制/编辑公式后必须验证引用范围,交付前零公式错误
📗 Excel 处理
引擎选择:
| 任务类型 |
引擎 |
原因 |
| 公式、样式、图表、数据验证 |
openpyxl |
支持单元格级格式控制 |
| 数据分析、清洗、重塑 |
pandas |
DataFrame 操作更高效 |
| 大文件(>50MB) |
openpyxl read_only/write_only |
防止内存溢出 |
关键规则
| 规则 |
错误写法 |
正确写法 |
| 长数字存为文本 |
pd.read_excel('f.xlsx') |
pd.read_excel('f.xlsx', dtype={'身份证号': str}) |
| 合并单元格取值 |
ws['B2'].value |
先查 ws.merged_cells.ranges,映射到左上角 |
| 公式引用验证 |
复制 =SUM(A1:A10) 到 B 列 |
检查是否应变为 =SUM(B1:B10),避免静默偏移 |
| 日期序列号 |
直接当日期处理 |
注意 1900 闰日 bug,部分工作簿用 1904 系统 |
| 数据验证下拉 |
手动写入选项 |
用 DataValidation(type="list", formula1='"选项1,选项2"') |
| 条件格式进度条 |
手动设置颜色 |
用 DataBarRule(start_type='num', start_value=0, end_type='num', end_value=1) |
交付前检查清单
- [ ] 长数字列(身份证/手机/订单号)已设为文本格式
- [ ] 公式无
#REF!、#DIV/0!、#VALUE!、#NAME?、循环引用
- [ ] 表头有样式(加粗、背景色、居中),列宽自适应
- [ ] 原有模板、命名范围、打印设置未被破坏
Before / After:长数字精度丢失
❌ 错误:默认读取,身份证号变成科学计数法
df = pd.read_excel('users.xlsx')
→ 身份证 110101199001011234 变成 1.1010119900101e+17(后 3 位丢失)
✅ 正确:指定 dtype 为 str
df = pd.read_excel('users.xlsx', dtype={'身份证号': str, '手机号': str})
→ 身份证完整保留:110101199001011234
📘 Word 处理
引擎: python-docx
关键规则
| 规则 |
说明 |
| 中文字体必须双设置 |
font.name = '微软雅黑' 且 rFonts.set(qn('w:eastAsia'), '微软雅黑'),缺一不可 |
| 公文边距默认值 |
上 3.7cm、下 3.5cm、左 2.8cm、右 2.6cm |
| 图片宽度 |
不超过页面可用宽度 80%,保持宽高比 |
| 页眉页脚 |
通过 section.header / section.footer 设置,页码用 OxmlElement('w:fldChar') 插入域代码 |
| 目录 |
插入 TOC 域代码,提示用户在 Word 中右键"更新域" |
| 模板填充 |
搜索 {{key}} 占位符替换为值,必须同时扫描段落和表格 |
Before / After:模板填充
❌ 错误:只替换段落中的占位符,忽略表格
→ 表格里的 {{日期}} 仍然显示占位符
✅ 正确:遍历 doc.paragraphs + doc.tables 中所有 cell
→ 段落和表格内的占位符都被替换
📕 PDF 处理
引擎分工:
| 操作 |
引擎 |
关键 API |
| 提取文本 |
PyMuPDF |
page.get_text() |
| 提取表格 |
pdfplumber |
page.extract_tables() |
| 合并 PDF |
PyMuPDF |
merged.insert_pdf(pdf) |
| 拆分 PDF |
PyMuPDF |
new_pdf.insert_pdf(pdf, from_page=i, to_page=i) |
| 添加水印 |
PyMuPDF |
page.insert_text(..., morph=(center, mat)) |
| 加密/解密 |
pypdf |
writer.encrypt() / reader.decrypt() |
关键规则
| 规则 |
说明 |
| PDF 不可直接编辑 |
"编辑 PDF" = 提取内容 → 修改 → 重新生成 |
| 中文水印必须指定字体文件 |
fontfile="C:/Windows/Fonts/msyh.ttc",内置字体 helv 无中文字形 |
| 水印旋转只能用 morph |
insert_text 的 rotate 只接受 0/90/180/270,自定义角度必须用 morph=(center, matrix) |
| 合并时保留书签 |
用 fitz.get_toc() / set_toc() 保留原书签 |
| 扫描件 PDF |
纯图片无文本层,必须 OCR(推荐 PaddleOCR),需提醒用户 |
| fitz.open 必须用 with |
批量处理时未关闭文件句柄会耗尽资源 |
Before / After:中文水印
❌ 错误:用内置字体 + rotate 参数
page.insert_text(center, "机密文件", fontname="helv", rotate=45)
→ ValueError: bad rotate value(rotate 只支持 0/90/180/270)
→ 即使不报错,helv 字体也无法渲染中文
✅ 正确:用系统字体 + morph 参数
mat = fitz.Matrix(cos, sin, -sin, cos, 0, 0)
page.insert_text(center, "机密文件", fontfile="msyh.ttc", morph=(center, mat))
→ 中文正常渲染 + 任意角度旋转
📙 PPT 处理
引擎: python-pptx
关键规则
| 规则 |
说明 |
| 字体必须在 run 级别设置 |
p.font.size 无效,必须 run = p.add_run(); run.font.size = Pt(44) |
| 默认 16:9 宽屏 |
slide_width = Inches(13.333), slide_height = Inches(7.5) |
| 中文标题字体 |
微软雅黑/思源黑体(正文),等线/方正大标宋(标题) |
| 单页文字限制 |
不超过 6 行,每行不超过 20 个中文字符 |
| 图表配色 |
使用专业色板,避免默认彩色 |
Before / After:PPT 字体设置
❌ 错误:在段落级别设置字体
p.text = "项目汇报"
p.font.size = Pt(44) # 无效!保存后字体丢失
p.font.bold = True # 无效!
✅ 正确:在 run 级别设置字体
run = p.add_run()
run.text = "项目汇报"
run.font.size = Pt(44) # 有效
run.font.bold = True # 有效
🔄 格式转换
转换矩阵
| 源 → 目标 |
引擎 |
注意事项 |
| Markdown → Word |
python-docx |
解析 MD 标题/列表/表格/代码块映射为 Word 样式 |
| Markdown → PDF |
weasyprint / fitz |
MD→HTML→PDF,需处理中文字体 |
| Markdown → PPT |
python-pptx |
每个 # 标题生成一张幻灯片 |
| Excel → CSV |
pandas |
输出用 UTF-8 BOM 编码(Excel 兼容) |
| Excel → Markdown |
pandas |
df.to_markdown() |
| Word → PDF |
LibreOffice 命令行 |
格式保真度远高于纯 Python 方案 |
| Word → Markdown |
python-docx |
提取文本+结构映射 |
| PDF → 文本 |
PyMuPDF |
page.get_text() |
| PDF → Markdown |
PyMuPDF |
提取文本+尝试还原结构 |
| CSV → Excel |
pandas + openpyxl |
自动类型推断,长数字列指定 dtype=str |
Before / After:MD→Word 表格处理
❌ 错误:遇到 | 表格行直接 pass/跳过
→ Markdown 中的关键数据表格被静默丢弃,用户打开 Word 发现表格不见了
✅ 正确:收集连续 | 行 → 解析 → doc.add_table()
→ 所有 Markdown 表格完整保留到 Word 文档中
Word → PDF 最佳方案
# 推荐:LibreOffice 命令行(格式保真度最高)
soffice --headless --convert-to pdf input.docx --outdir ./output/
# Windows
"C:\Program Files\LibreOffice\program\soffice.exe" --headless --convert-to pdf input.docx
Markdown → Word 转换规则
| Markdown 元素 |
Word 映射 |
注意 |
# / ## / ### |
add_heading(level=N) |
— |
- item / * item |
List Bullet 样式 |
— |
1. item |
List Number 样式 |
— |
> quote |
Intense Quote 样式 |
— |
```code``` |
Normal + Consolas 9pt |
收集多行,整体设为等宽字体 |
\| table \| |
add_table() |
收集连续 | 行,解析后创建表格,不能丢弃 |
**bold** / *italic* |
Run 级别加粗/斜体 |
需解析行内格式 |
📊 智能报告生成
报告结构模板
一、摘要(3-5 句话概括核心发现)
二、数据概览(describe() 统计表 + 行数/列数/缺失值)
三、关键发现(top N 洞察,每条配数据支撑)
四、图表分析(柱状图/饼图/折线图,标题和轴标签必须中文)
五、结论与建议(可执行的下一步行动)
关键规则
| 规则 |
说明 |
| 图表标题/轴标签/图例 |
必须为中文 |
| 数值格式 |
千分位分隔符,金额用 ¥ 符号 |
| 日期格式 |
统一 YYYY年MM月DD日 |
| 百分比 |
保留 1-2 位小数 |
| Excel 图表 |
用 openpyxl.chart 的 BarChart/PieChart/LineChart + Reference |
| Word 表格 |
用 add_table(style='Light Grid Accent 1') |
⚡ 批量处理
批量处理规则
| 步骤 |
操作 |
| 1. 预检 |
列出待处理文件及数量,确认后再执行 |
| 2. 执行 |
单文件失败不中断整体,try/except 记录失败项 |
| 3. 输出 |
摘要:成功 N 个 / 失败 M 个 / 跳过 K 个 |
| 4. 断点 |
记录已处理文件,重跑时自动跳过 |
输出命名
- 单文件:源文件名 +
_output / _converted 后缀
- 批量输出:
output_YYYYMMDD_HHMMSS/ 子目录
- 临时文件:
temp_ 前缀,完成后自动清理
通用工作流
识别意图 → 确定格式 → 查表选引擎 → 检查依赖 → 执行 → 验证 → 报告结果
依赖安装
首次使用自动检查并安装:
pip install openpyxl python-docx PyMuPDF python-pptx pandas pdfplumber pypdf
# 注意:PyMuPDF 安装后 import 名为 fitz;pypdf 6.x 已移除 PdfMerger
大文件策略(>50MB)
| 格式 |
策略 |
| Excel |
openpyxl read_only 读 / write_only 写 |
| PDF |
fitz 逐页处理,不一次加载 |
| CSV |
pandas.read_csv(chunksize=10000) 分块迭代 |
中文排版规范
中英文混排
标点符号
- 中文正文用全角标点(,。;:!?""''())
- 代码和技术文档用半角标点
- 省略号用
……(六个点),不用 ...
- 连接线用
——(两个破折号)
字体方案
| 场景 |
中文字体 |
英文字体 |
| 正文 |
微软雅黑 / 苹方 |
Segoe UI / Helvetica |
| 标题 |
等线 / 方正大标宋 |
Arial / Georgia |
| 代码 |
— |
Consolas / Source Code Pro |
| 表格 |
微软雅黑 |
Segoe UI |
错误处理
| 错误场景 |
处理方式 |
| 文件不存在 |
提示路径,建议用 Glob 查找 |
| 文件被占用 |
提示关闭文件,输出到替代路径 |
| 格式不支持 |
列出支持的格式,建议替代方案 |
| 库未安装 |
自动 pip install,失败则提示手动安装 |
| 编码错误 |
依次回退 UTF-8 → GBK → GB18030 → latin1 |
| 大文件超时 |
自动分块,单页/单表为单位 |
| 加密 PDF |
提示需要密码,不尝试暴力破解 |
| 空文件/空表格 |
提示内容为空,不生成空输出文件 |
| 扫描件 PDF |
提示需 OCR(推荐 PaddleOCR/pytesseract) |
使用示例
示例 1:创建项目进度 Excel
用户:帮我创建一个项目进度跟踪表
→ 引擎:openpyxl
→ 操作:带样式表头 + 数据验证(状态下拉框)+ 条件格式(进度数据条)
→ 输出:project_tracker.xlsx
示例 2:PDF 合并
用户:把 reports 文件夹下所有 PDF 合并成一个
→ 引擎:PyMuPDF
→ 操作:扫描目录 → 按文件名排序 → 逐个插入 → 保留书签
→ 输出:reports_merged.pdf
示例 3:Markdown 转 Word
用户:把会议纪要的 Markdown 转成正式的 Word 文档
→ 引擎:python-docx
→ 操作:解析 MD 标题/列表/表格/代码块 → 映射为 Word 样式 → 应用中文公文格式
→ 输出:meeting_notes.docx
示例 4:数据分析报告
用户:分析这个 Excel 的销售数据,生成一份报告
→ 引擎:pandas + openpyxl + python-docx
→ 操作:统计概览 → 关键发现 → 图表 → 结论建议
→ 输出:sales_report.docx + sales_report.xlsx
示例 5:批量 Word 转 PDF
用户:把 contracts 目录下所有 Word 转成 PDF
→ 引擎:LibreOffice 命令行
→ 操作:扫描目录 → 确认文件列表 → 批量转换 → 输出摘要
→ 输出:output_20260616/ 目录
示例 6:PDF 加密
用户:给这份 PDF 加个密码
→ 引擎:pypdf
→ 操作:读取 → 复制所有页面 → encrypt() → 保存
→ 输出:encrypted.pdf
示例 7:Word 模板批量填充
用户:用这个合同模板,把 Excel 里的 50 个员工信息填进去,生成 50 份合同
→ 引擎:python-docx + pandas
→ 操作:读取 Excel 数据 → 遍历每行 → 替换模板占位符(段落+表格) → 逐个保存
→ 输出:contracts/ 目录下 50 个 docx 文件