# 生成富文本和PDF **Repository Path**: jpf1987/report-generator-service ## Basic Information - **Project Name**: 生成富文本和PDF - **Description**: 传入数据,根据模板生成html富文本内容和PDF文件 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-12-24 - **Last Updated**: 2026-01-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 评标报告生成微服务 独立的评标报告生成服务,根据模板ID和数据生成HTML富文本和PDF文件。 ## 技术栈 - **Spring Boot 3.2.0** - Web框架 - **Thymeleaf** - 模板引擎 - **OpenHTMLtoPDF** - HTML转PDF - **Lombok** - 简化代码 - **SpringDoc OpenAPI** - API文档 ## 项目结构 ``` report-generator-service/ ├── src/main/java/com/report/ │ ├── ReportGeneratorApplication.java # 主应用类 │ ├── controller/ # REST API控制器 │ │ └── ReportGeneratorController.java │ ├── service/ # 业务服务层 │ │ ├── TemplateService.java # 模板管理服务 │ │ ├── HtmlGenerationService.java # HTML生成服务 │ │ ├── PdfGenerationService.java # PDF生成服务 │ │ └── ReportGeneratorService.java # 报告生成核心服务 │ ├── model/ # 数据模型 │ │ ├── ReportGenerateRequest.java # 请求DTO │ │ ├── ReportGenerateResponse.java # 响应DTO │ │ └── TemplateInfo.java # 模板信息 │ ├── config/ # 配置类 │ │ └── ThymeleafConfig.java │ └── exception/ # 异常处理 │ └── GlobalExceptionHandler.java └── src/main/resources/ ├── application.yml # 应用配置 ├── templates/ # 模板文件目录 │ ├── evaluation_report.html # 评标报告模板 │ └── simple_report.html # 简单报告模板 └── font/ # 字体文件目录(可选) ``` ## 快速开始 ### 前置要求 - JDK 17+ - Maven 3.6+ ### 构建项目 ```bash cd report-generator-service mvn clean package ``` ### 运行服务 ```bash mvn spring-boot:run ``` 或运行JAR包: ```bash java -jar target/report-generator-service-1.0.0.jar ``` 服务启动后访问: - 服务地址: http://localhost:8080/report-service - API文档: http://localhost:8080/report-service/swagger-ui.html ## API接口说明 ### 1. 生成报告 **接口:** `POST /api/report/generate` **请求参数:** ```json { "templateId": "evaluation_report", "data": { "projectName": "某市智能化工程采购项目", "projectNumber": "ZB-2024-001", "biddingType": "公开招标", "openBidTime": "2024-01-15 09:30:00", "openBidLocation": "某市公共资源交易中心", "experts": [ { "name": "张三", "organization": "某科技公司", "major": "计算机", "title": "高级工程师", "type": "技术专家" } ], "bidders": [ { "name": "某建设公司", "price": "1,500,000.00", "duration": "180天", "deposit": "30,000.00", "technicalScore": 45.5, "commercialScore": 30.0, "otherScore": 10.0, "totalScore": 85.5 } ], "candidates": [ { "name": "某建设公司", "score": 85.5, "recommendation": "推荐为第一中标候选人" } ] }, "returnHtml": true, "returnPdfBase64": false } ``` **响应示例:** ```json { "success": true, "message": "报告生成成功", "templateId": "evaluation_report", "html": "...", "pdfUrl": "D:\\ai\\template\\pdf-storage\\evaluation_report_20240123_153045_a1b2c3d4.pdf", "pdfFileName": "evaluation_report_20240123_153045_a1b2c3d4.pdf", "timestamp": 1705987245123 } ``` ### 2. 下载PDF **接口:** `GET /api/report/download?filePath={文件路径}` 返回PDF文件流,可直接下载或在浏览器中预览。 ### 3. 获取模板列表 **接口:** `GET /api/templates` 返回所有可用的报告模板信息。 ### 4. 获取指定模板信息 **接口:** `GET /api/templates/{templateId}` 返回指定模板的详细信息。 ### 5. 健康检查 **接口:** `GET /api/health` 检查服务健康状态。 ## 模板开发指南 ### 模板位置 模板文件放在 `src/main/resources/templates/` 目录下。 ### 模板语法 使用Thymeleaf语法: ```html
默认值
1 姓名
内容...
2024-01-01 ``` ### 中文字体支持 默认使用系统字体(SimSun、SimHei)。如需使用特定字体: 1. 将字体文件(TTF)放入 `src/main/resources/font/` 目录 2. 在模板CSS中引用: ```css body { font-family: "SimSun", "宋体", serif; } ``` ### 中文换行控制 ```css /* 防止表格文字不换行 */ td { word-wrap: break-word; word-break: break-all; } ``` ## 配置说明 ### application.yml 关键配置 ```yaml server: port: 8080 # 服务端口 servlet: context-path: /report-service # 应用上下文路径 app: pdf: storage-path: ./pdf-storage # PDF文件存储路径 ``` ## 测试示例 ### 使用curl测试 ```bash # 生成报告 curl -X POST http://localhost:8080/report-service/api/report/generate \ -H "Content-Type: application/json" \ -d '{ "templateId": "simple_report", "data": { "title": "测试报告", "content": "这是一个测试报告的内容", "items": ["项目一", "项目二", "项目三"] } }' ``` ### 使用Postman测试 1. 导入API文档: http://localhost:8080/report-service/swagger-ui.html 2. 使用Swagger UI直接测试接口 ## 扩展功能 ### 添加新模板 1. 在 `src/main/resources/templates/` 创建新的HTML模板 2. 在 `TemplateService.java` 中注册模板: ```java predefinedTemplates.put("your_template_id", TemplateInfo.builder() .templateId("your_template_id") .templateName("模板名称") .templatePath("templates/your_template.html") .version("1.0.0") .status(TemplateInfo.TemplateStatus.ACTIVE) .build()); ``` ### 数字签名扩展 如需添加数字签名功能,可集成: ```xml org.apache.pdfbox pdfbox 2.0.30 ``` ## 常见问题 ### Q1: PDF中文显示乱码? **A:** 确保系统中安装了中文字体,或在模板CSS中明确指定字体: ```css body { font-family: "SimSun", "宋体", "SimHei", "黑体", sans-serif; } ``` ### Q2: 表格跨页边框丢失? **A:** 在模板中添加: ```html ``` ### Q3: 如何自定义PDF文件名? **A:** 在请求中指定 `pdfFileName` 参数: ```json { "templateId": "evaluation_report", "data": {...}, "pdfFileName": "项目评标报告.pdf" } ``` ## 部署建议 ### Docker部署 ```dockerfile FROM openjdk:17-jdk-slim COPY target/report-generator-service-1.0.0.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app.jar"] ``` ### 生产环境配置 - 开启Thymeleaf缓存: `spring.thymeleaf.cache: true` - 配置反向代理(Nginx) - 设置日志级别: `logging.level.com.report: INFO` - 定期清理PDF存储目录 ## 许可证 MIT License ## 联系方式 如有问题或建议,请联系开发团队。