Invoice Template

作者 claude-office-skills9c4c7d5cd281MIT499 个星标收录于 2026年10月8日更新于 2026年10月8日仓库8个月前更新

Generate professional PDF invoices from templates

AI 生成的概览

根据结构化数据和模板生成专业的 PDF 发票,包含明细项目、税费和合计。

功能
该技能根据结构化发票数据(如发票编号、日期、开票方与客户信息、明细项目、税率和备注)生成 PDF 发票。它记录了两种生成方式:ReportLab 画布脚本,以及用 Jinja2 HTML 模板配合 WeasyPrint 渲染为 PDF。内容还涵盖发票数据结构、字段校验与自动计算合计的最佳实践,以及依赖安装说明。
适用场景
当你需要根据订单或账单数据创建单张、周期性或批量发票时使用。适合生成带品牌信息、明细项目、税费和付款条款的 PDF 发票。
运行要求
仅为说明文档,技能不附带脚本。所述方式需要 Python 及 reportlab、jinja2、weasyprint(安装说明还列出 python-docx、openpyxl、python-pptx),元数据还引用了带 create_docx、fill_docx_template 和 docx_to_pdf 工具的 office-mcp 服务器。

Invoice Template Skill

Overview

This skill generates professional PDF invoices from structured data and templates. Create invoices with company branding, itemized lists, tax calculations, and payment details.

How to Use

  1. Describe what you want to accomplish
  2. Provide any required input data or files
  3. I'll execute the appropriate operations

Example prompts:

  • "Generate invoices from order data"
  • "Create recurring invoices"
  • "Batch generate monthly invoices"
  • "Customize invoice templates per client"

Domain Knowledge

Invoice Data Structure

python
invoice_data = {    "invoice_number": "INV-2026-001",    "date": "2026-01-30",    "due_date": "2026-02-28",        "from": {        "name": "Your Company",        "address": "123 Business St",        "email": "[email protected]"    },        "to": {        "name": "Client Name",        "address": "456 Client Ave",        "email": "[email protected]"    },        "items": [        {"description": "Consulting", "quantity": 10, "rate": 150.00},        {"description": "Development", "quantity": 20, "rate": 100.00}    ],        "tax_rate": 0.08,    "notes": "Payment due within 30 days"}

PDF Generation with ReportLab

python
from reportlab.lib.pagesizes import letterfrom reportlab.pdfgen import canvasfrom reportlab.lib.units import inch
def create_invoice(data: dict, output_path: str):    c = canvas.Canvas(output_path, pagesize=letter)    width, height = letter        # Header    c.setFont("Helvetica-Bold", 24)    c.drawString(1*inch, height - 1*inch, "INVOICE")        # Invoice details    c.setFont("Helvetica", 12)    c.drawString(1*inch, height - 1.5*inch, f"Invoice #: {data['invoice_number']}")    c.drawString(1*inch, height - 1.75*inch, f"Date: {data['date']}")        # From/To    y = height - 2.5*inch    c.drawString(1*inch, y, f"From: {data['from']['name']}")    c.drawString(4*inch, y, f"To: {data['to']['name']}")        # Items table    y = height - 4*inch    c.setFont("Helvetica-Bold", 10)    c.drawString(1*inch, y, "Description")    c.drawString(4*inch, y, "Qty")    c.drawString(5*inch, y, "Rate")    c.drawString(6*inch, y, "Amount")        c.setFont("Helvetica", 10)    subtotal = 0    for item in data['items']:        y -= 0.3*inch        amount = item['quantity'] * item['rate']        subtotal += amount        c.drawString(1*inch, y, item['description'])        c.drawString(4*inch, y, str(item['quantity']))        c.drawString(5*inch, y, f"${item['rate']:.2f}")        c.drawString(6*inch, y, f"${amount:.2f}")        # Totals    tax = subtotal * data['tax_rate']    total = subtotal + tax        y -= 0.5*inch    c.drawString(5*inch, y, f"Subtotal: ${subtotal:.2f}")    y -= 0.25*inch    c.drawString(5*inch, y, f"Tax ({data['tax_rate']*100}%): ${tax:.2f}")    y -= 0.25*inch    c.setFont("Helvetica-Bold", 12)    c.drawString(5*inch, y, f"Total: ${total:.2f}")        c.save()    return output_path

HTML Template Approach

python
from weasyprint import HTMLfrom jinja2 import Template
invoice_template = """<!DOCTYPE html><html><head>    <style>        body { font-family: Arial; margin: 40px; }        .header { display: flex; justify-content: space-between; }        table { width: 100%; border-collapse: collapse; margin: 20px 0; }        th, td { border: 1px solid #ddd; padding: 10px; text-align: left; }        .total { font-weight: bold; font-size: 18px; }    </style></head><body>    <div class="header">        <h1>INVOICE</h1>        <div>            <p>Invoice #: {{ invoice_number }}</p>            <p>Date: {{ date }}</p>        </div>    </div>    <table>        <tr><th>Description</th><th>Qty</th><th>Rate</th><th>Amount</th></tr>        {% for item in items %}        <tr>            <td>{{ item.description }}</td>            <td>{{ item.quantity }}</td>            <td>${{ "%.2f"|format(item.rate) }}</td>            <td>${{ "%.2f"|format(item.quantity * item.rate) }}</td>        </tr>        {% endfor %}    </table>    <p class="total">Total: ${{ "%.2f"|format(total) }}</p></body></html>"""
def create_invoice_html(data: dict, output_path: str):    template = Template(invoice_template)        # Calculate total    total = sum(i['quantity'] * i['rate'] for i in data['items'])    total *= (1 + data.get('tax_rate', 0))    data['total'] = total        html = template.render(**data)    HTML(string=html).write_pdf(output_path)    return output_path

Best Practices

  1. Validate required fields before generation
  2. Use templates for consistent branding
  3. Auto-calculate totals (don't trust input)
  4. Include payment instructions and terms

Installation

bash
# Install required dependenciespip install python-docx openpyxl python-pptx reportlab jinja2

Resources

来源与署名

来源:claude-office-skills/skills位于invoice-template提交9c4c7d5

许可证: MIT

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架