| name | pdf-report |
| description | 生成专业的 PDF 报告文档,支持封面页、多级标题、表格、图片、页眉页脚等功能。当用户需要将分析结果、报告内容输出为 PDF 格式时使用此技能。 |
| metadata | {"version":"1.0.0","builtin":true} |
PDF Report - PDF 报告生成
Overview
基于 reportlab 库的 PDF 报告生成工具,提供专业的文档排版功能,支持中文字体、封面页、多级标题、表格、图片等元素。适用于生成安全分析报告、威胁情报报告、业务分析报告等场景。
核心功能
| 功能 | 说明 |
|---|
| 封面页 | 带背景图、标题、副标题、作者、日期信息 |
| 多级标题 | 支持 1-4 级标题,自动样式 |
| 正文段落 | 首行缩进、1.5 倍行距、两端对齐 |
| 表格 | 自动换行、交替行背景色、表头高亮 |
| 图片 | 自动缩放、居中、带说明文字 |
| 页眉页脚 | 页眉文本、页码(从正文开始计数) |
| 中文支持 | 自动加载中文字体 |
工作流程
阶段 1: 初始化
import sys
sys.path.append('<SKILL_DIR>/scripts')
from pdf_template import PDFTemplate
manager = PDFTemplate(language='zh')
语言支持:
| 参数 | 效果 |
|---|
language='zh' | 中文(默认):作者、表、图、第 N 页 |
language='en' | 英文:Author、Table、Figure、Page N |
说明: 初始化时会自动下载中文字体和默认封面背景图(如果不存在)。
阶段 2: 配置文档
manager.header_text = "威胁分析报告"
阶段 3: 添加封面页
from datetime import datetime
manager.add_cover_page(
title="威胁分析报告",
subtitle="针对可疑 IP 的深度分析",
author="安全分析团队",
date=datetime.now().strftime("%Y年%m月%d日"),
organization="安全运营中心"
)
阶段 4: 添加正文内容
标题
manager.add_title("一、执行摘要", level=1)
manager.add_title("1.1 分析背景", level=2)
manager.add_title("1.1.1 事件概述", level=3)
manager.add_title("1.1.1.1 详细说明", level=4)
正文段落
manager.add_content("本次分析针对企业内网发现的可疑 IP 地址进行深度威胁研判。")
manager.add_content("分析时间:2024-01-15", first_line_indent=False)
表格
table_data = [
["指标", "结果", "风险等级"],
["多源标记恶意", "是", "高"],
["恶意样本关联", "5 个", "中"],
["近期活跃", "是", "高"]
]
manager.add_table(4, 3, table_data, caption="威胁指标评估结果")
表格自动编号: 表格说明会自动编号为 "表<1>", "表<2>" 等。
图片
manager.add_image("screenshot.png", caption="攻击流量截图")
manager.add_image("diagram.png", width=10, caption="攻击路径示意图")
manager.add_image("chart.png", width=12, height=8, caption="威胁趋势图")
图片自动编号: 图片说明会自动编号为 "图<1>", "图<2>" 等。
其他元素
manager.add_page_break()
manager.add_spacer(24)
阶段 5: 保存文档
filepath = manager.save_document("威胁分析报告.pdf")
print(f"PDF 已保存: {filepath}")
info = manager.get_document_info()
print(f"元素数: {info['total_elements']}")
print(f"表格数: {info['table_count']}")
print(f"图片数: {info['image_count']}")
完整示例
import sys
from datetime import datetime
sys.path.append('<SKILL_DIR>/scripts')
from pdf_template import PDFTemplate
def generate_threat_report():
"""生成威胁分析报告"""
manager = PDFTemplate()
manager.header_text = "IP 威胁分析报告"
manager.add_cover_page(
title="IP 威胁分析报告",
subtitle="45.33.32.156 深度分析",
author="安全分析团队",
date=datetime.now().strftime("%Y年%m月%d日"),
organization="安全运营中心"
)
manager.add_title("一、执行摘要", level=1)
manager.add_content("本报告对可疑 IP 地址 45.33.32.156 进行了全面的威胁情报分析。")
manager.add_content("分析结果表明该 IP 具有高度威胁风险,建议立即采取封锁措施。")
manager.add_title("二、基础信息", level=1)
manager.add_content("IP 地址: 45.33.32.156", first_line_indent=False)
manager.add_content("IP 类型: 公网地址", first_line_indent=False)
manager.add_content("地理位置: 美国 / 加利福尼亚州", first_line_indent=False)
manager.add_content("ASN: AS63949 (Linode, LLC)", first_line_indent=False)
manager.add_title("三、威胁情报", level=1)
intel_data = [
["来源", "标签", "首次发现", "最后活跃"],
["VirusTotal", "scanner", "2023-05-12", "2024-12-20"],
["AbuseIPDB", "malware", "2023-06-01", "2024-12-19"],
["ThreatFox", "C2", "2024-01-10", "2024-12-18"]
]
manager.add_table(4, 4, intel_data, caption="多源威胁情报汇总")
manager.add_title("四、风险评估", level=1)
risk_data = [
["指标", "结果", "分值"],
["多源标记恶意", "是", "+40"],
["C2 标签", "是", "+30"],
["恶意样本关联", "5 个", "+15"],
["近期活跃", "是", "+10"],
["总分", "", "95"]
]
manager.add_table(6, 3, risk_data, caption="风险评分明细")
manager.add_title("五、结论与建议", level=1)
manager.add_content("基于以上分析,该 IP 地址风险等级为 Critical,强烈建议采取以下措施:")
manager.add_content("1. 立即在防火墙封锁该 IP 地址", first_line_indent=False)
manager.add_content("2. 检查内网是否有主机与该 IP 通信", first_line_indent=False)
manager.add_content("3. 将该 IP 加入威胁情报监控列表", first_line_indent=False)
filepath = manager.save_document("ip_threat_report.pdf")
return filepath
if __name__ == "__main__":
generate_threat_report()
依赖要求
必需依赖
| 依赖 | 用途 | 安装命令 |
|---|
| reportlab | PDF 生成核心库 | pip install reportlab |
| Pillow | 图片处理 | pip install Pillow |
| PyPDF2 | PDF 合并(用于添加最后一页) | pip install PyPDF2 |
安装命令
pip install reportlab Pillow PyPDF2
环境检查
python -c "import reportlab; print('reportlab OK')"
python -c "from PIL import Image; print('Pillow OK')"
python -c "from PyPDF2 import PdfReader; print('PyPDF2 OK')"
API 参考
PDFTemplate 类
| 方法 | 参数 | 说明 |
|---|
add_cover_page() | title, subtitle, author, date, organization, additional_info | 添加封面页 |
add_title() | text, level (1-4) | 添加标题 |
add_content() | text, first_line_indent (bool) | 添加正文段落 |
add_table() | rows, cols, data, caption | 添加表格 |
add_image() | image_path, width, height, caption | 添加图片 |
add_page_break() | 无 | 添加分页符 |
add_spacer() | height (默认 12) | 添加空白间距 |
set_cover_background() | background_image_path | 设置封面背景图 |
save_document() | filename | 保存 PDF 文档 |
get_document_info() | 无 | 获取文档统计信息 |
属性
| 属性 | 类型 | 说明 |
|---|
header_text | str | 页眉文本 |
story | list | 文档内容元素列表 |
注意事项
- 中文字体: 优先使用嵌入式 TTF 字体(SourceHanSansCN),确保在微信等第三方预览器中也能正确显示中文。首次运行会自动下载字体文件,需要网络连接。若下载失败则降级为 CID 字体(依赖阅读器本地字体)
- 封面背景: 默认使用在线背景图,可通过
set_cover_background() 设置本地图片
- 图片格式: 支持 PNG、JPEG、GIF 等常见格式
- 表格宽度: 表格会自动适应页面宽度,列宽按比例分配
- 页码: 页码从正文页开始计数,封面页不显示页码
相关参考