#!/usr/bin/env python3 """Generate PDF report from REPORT.md and FRONTEND.md""" import os import sys import argparse import json def read_file_content(path): if not path or not os.path.exists(path): return "" with open(path, 'r', encoding='utf-8') as f: return f.read() def main(): parser = argparse.ArgumentParser(description='Generate PDF grade report') parser.add_argument('--report', default='REPORT.md', help='Path to REPORT.md') parser.add_argument('--frontend', default='FRONTEND.md', help='Path to FRONTEND.md') parser.add_argument('--grade', default='final_grade.json', help='Path to grade JSON') parser.add_argument('--images', default='images', help='Path to images directory') parser.add_argument('--out', default='grade_report.pdf', help='Output PDF path') parser.add_argument('--student-id', default='', help='Student ID') parser.add_argument('--student-name', default='', help='Student name') parser.add_argument('--class-name', default='', help='Class name') parser.add_argument('--commit-sha', default='', help='Commit SHA') args = parser.parse_args() # Read grade data grade_data = {} if os.path.exists(args.grade): with open(args.grade, 'r', encoding='utf-8') as f: grade_data = json.load(f) # Read markdown content report_content = read_file_content(args.report) frontend_content = read_file_content(args.frontend) if not report_content and not frontend_content: print("No report content found, skipping PDF generation") return try: import markdown from weasyprint import HTML # Build HTML content html_parts = [] # Header with student info header = f"""
学号: {args.student_id or 'N/A'}
姓名: {args.student_name or 'N/A'}
班级: {args.class_name or 'N/A'}
Commit: {args.commit_sha[:7] if args.commit_sha else 'N/A'}
| 项目 | 得分 |
|---|---|
| 编程测试 | {grade_data.get('programming', 0)}/60 |
| 报告 | {grade_data.get('report', 0)}/10 |
| 前端 | {grade_data.get('frontend', 0)}/10 |
| 总分 | {grade_data.get('total', 0)}/80 |