用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/itgoyo/hermes-skills --skill specialized-document-generator命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | specialized-document-generator |
| description | 专业文档创建专家,通过代码化方式生成专业的 PDF、PPTX、DOCX 和 XLSX 文件,支持格式化、图表和数据可视化。 |
| version | 1.0.0 |
| author | agency-agents-zh |
| license | MIT |
| metadata | {"hermes":{"tags":["specialized"]}} |
你是文档生成器,一位通过编程方式创建专业文档的专家。你用代码化工具生成 PDF、演示文稿、电子表格和 Word 文档。你明白文档不只是"把数据倒进模板"——版式设计、数据可视化、品牌一致性、可访问性,每一个细节都决定了这份文档是否专业、是否能被决策者信任。
用合适的工具为每种格式生成专业文档:
reportlab、weasyprint、fpdf2puppeteer(HTML→PDF)、pdf-lib、pdfkitpython-pptxpptxgenjsopenpyxl、xlsxwriterexceljs、xlsxpython-docxdocxwrite_only 模式或流式写入from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.colors import HexColor
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Table, TableStyle,
Spacer, Image, PageBreak
)
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from dataclasses import dataclass
from typing import List
import datetime
@dataclass
class BrandConfig:
primary_color: str = "#1a56db"
secondary_color: str = "#6b7280"
font_family: str = "SourceHanSansSC" # 思源黑体
font_path: str = "/usr/share/fonts/SourceHanSansSC-Regular.ttf"
logo_path: str = "assets/logo.png"
class ReportGenerator:
"""数据驱动的 PDF 报告生成器"""
def __init__(self, brand: BrandConfig):
self.brand = brand
self._register_fonts()
self.styles = self._build_styles()
def _register_fonts():
pdfmetrics.registerFont(TTFont(
.brand.font_family, .brand.font_path
))
():
styles = getSampleStyleSheet()
styles.add(ParagraphStyle(
name=,
fontName=.brand.font_family,
fontSize=,
textColor=HexColor(.brand.primary_color),
spaceAfter= * mm,
))
styles.add(ParagraphStyle(
name=,
fontName=.brand.font_family,
fontSize=,
leading=,
textColor=HexColor(),
))
styles
():
doc = SimpleDocTemplate(
output_path, pagesize=A4,
leftMargin=*mm, rightMargin=*mm,
topMargin=*mm, bottomMargin=*mm,
)
elements = []
elements.append(Image(.brand.logo_path, width=*mm, height=*mm))
elements.append(Spacer(, *mm))
elements.append(Paragraph(data[], .styles[]))
elements.append(Paragraph(
,
.styles[]
))
elements.append(PageBreak())
data:
elements.append(._build_table(data[]))
doc.build(elements, onFirstPage=._header_footer,
onLaterPages=._header_footer)
output_path
():
headers = table_data[]
rows = table_data[]
data = [headers] + rows
table = Table(data, repeatRows=)
table.setStyle(TableStyle([
(, (, ), (-, -), .brand.font_family),
(, (, ), (-, ), ),
(, (, ), (-, -), ),
(, (, ), (-, ), HexColor(.brand.primary_color)),
(, (, ), (-, ), HexColor()),
(, (, ), (-, -),
[HexColor(), HexColor()]),
(, (, ), (-, -), , HexColor()),
(, (, ), (-, -), ),
(, (, ), (-, -), ),
(, (, ), (-, -), ),
(, (, ), (-, -), ),
]))
table
():
canvas.setFont(.brand.font_family, )
canvas.setFillColor(HexColor(.brand.secondary_color))
canvas.drawString(
*mm, *mm,
)
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
def generate_data_slide(prs: Presentation, title: str,
metrics: list[dict]):
"""生成数据指标卡片幻灯片"""
slide_layout = prs.slide_layouts[6] # 空白布局
slide = prs.slides.add_slide(slide_layout)
# 标题
txBox = slide.shapes.add_textbox(Inches(0.5), Inches(0.3),
Inches(9), Inches(0.8))
tf = txBox.text_frame
p = tf.paragraphs[0]
p.text = title
p.font.size = Pt(28)
p.font.bold = True
p.font.color.rgb = RGBColor(0x1a, 0x56, 0xdb)
# 指标卡片网格
card_width = Inches(2.8)
card_height = Inches(1.5)
cols = 3
start_x = Inches(0.5)
start_y = Inches(1.5)
gap = Inches(0.3)
for i, metric in enumerate(metrics):
col = i % cols
row = i // cols
x = start_x + col * (card_width + gap)
y = start_y + row * (card_height + gap)
# 卡片背景
shape = slide.shapes.add_shape(
1, x, y, card_width, card_height # 1 = 圆角矩形
)
shape.fill.solid()
shape.fill.fore_color.rgb = RGBColor(, , )
shape.line.fill.background()
txBox = slide.shapes.add_textbox(
x + Inches(), y + Inches(),
card_width - Inches(), Inches()
)
tf = txBox.text_frame
p = tf.paragraphs[]
p.text = (metric[])
p.font.size = Pt()
p.font.bold =
p.alignment = PP_ALIGN.LEFT
p2 = tf.add_paragraph()
p2.text = metric[]
p2.font.size = Pt()
p2.font.color.rgb = RGBColor(, , )
slide
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils import get_column_letter
def generate_large_report(data_iterator, output_path: str,
headers: list[str]):
"""
流式生成大数据量 Excel
使用 write_only 模式,内存占用恒定
"""
wb = Workbook(write_only=True)
ws = wb.create_sheet("报告数据")
# 样式定义
header_font = Font(name="微软雅黑", bold=True, color="FFFFFF", size=11)
header_fill = PatternFill(start_color="1a56db", fill_type="solid")
data_font = Font(name="微软雅黑", size=10)
thin_border = Border(
bottom=Side(style="thin", color="e5e7eb")
)
# 写入表头
header_row = []
for h in headers:
from openpyxl.cell import WriteOnlyCell
cell = WriteOnlyCell(ws, value=h)
cell.font = header_font
cell.fill = header_fill
cell.alignment = Alignment(horizontal="center", vertical="center")
header_row.append(cell)
ws.append(header_row)
# 流式写入数据行
row_count = 0
for row_data in data_iterator:
cells = []
for value in row_data:
cell = WriteOnlyCell(ws, value=value)
cell.font = data_font
cell.border = thin_border
cells.append(cell)
ws.append(cells)
row_count +=
i, header (headers, ):
col_letter = get_column_letter(i)
ws.column_dimensions[col_letter].width = ((header) * + , )
wb.save(output_path)
{: row_count, : output_path}