/** * 简单PDF生成器 * 使用HTML方式生成PDF,避免中文编码问题 */ const fs = require('fs-extra'); const path = require('path'); const moment = require('moment'); const chalk = require('chalk'); const { execSync } = require('child_process'); /** * 生成软件说明书PDF * @param {Object} projectInfo 项目信息 * @param {string} outputDir 输出目录 * @returns {Promise} 生成的PDF文件路径 */ async function generateManualPDF(projectInfo, outputDir) { try { console.log(chalk.yellow('📝 生成软件说明书(HTML方式)...')); const timestamp = moment().format('YYYYMMDD_HHMMSS'); const fileName = `软件说明书_${projectInfo.name}_${timestamp}.pdf`; const outputPath = path.join(outputDir, fileName); // 生成HTML内容 const htmlContent = generateHTMLContent(projectInfo); // 创建临时HTML文件 const tempHtmlPath = path.join(outputDir, `temp_manual_${Date.now()}.html`); await fs.writeFile(tempHtmlPath, htmlContent, 'utf8'); // 尝试使用系统工具转换HTML到PDF const success = await convertHTMLToPDF(tempHtmlPath, outputPath); // 删除临时HTML文件 await fs.remove(tempHtmlPath); if (success) { console.log(chalk.green(`✅ 软件说明书已生成: ${outputPath}`)); return outputPath; } else { throw new Error('HTML到PDF转换失败'); } } catch (error) { throw new Error(`生成软件说明书失败: ${error.message}`); } } /** * 生成HTML内容 * @param {Object} projectInfo 项目信息 * @returns {string} HTML内容 */ function generateHTMLContent(projectInfo) { return ` 软件说明书 - ${projectInfo.name}

软件说明书

${projectInfo.name}

版本
1.0.0
生成日期
${moment().format('YYYY年MM月DD日')}
源代码文件
${projectInfo.files.length} 个
总代码行数
${projectInfo.totalLines} 行

目录

  1. 引言
  2. 软件概述
  3. 运行环境
  4. 设计思想与实现过程
  5. 功能模块详述
  6. 用户指南
  7. 测试与维护

1. 引言

1.1 概述

${projectInfo.name}是一款基于${projectInfo.languages.join('、')}技术开发的软件应用。本项目包含${projectInfo.files.length}个源代码文件,总计${projectInfo.totalLines}行代码,体现了良好的软件工程实践和模块化设计理念。软件采用了现代化的开发技术和架构设计,具有高度的可扩展性和维护性。

1.2 编写目的

本软件说明书旨在详细描述${projectInfo.name}的功能特性、技术架构、运行环境和使用方法,为软件著作权申请提供完整的技术文档。本文档将从技术角度全面阐述软件的设计思想、实现方案和创新点,展现软件的技术价值和实用性。

1.3 开发背景

随着信息技术的快速发展和数字化转型的深入,用户对高质量软件的需求日益增长。${projectInfo.name}的开发正是为了满足现代化的业务需求。项目采用了主流技术框架,确保了技术的先进性和稳定性。通过深入的调研和精心的设计,本软件实现了核心功能的优化和用户体验的提升。

2. 软件概述

2.1 主要功能

  1. 用户界面管理和交互功能
  2. 数据处理和存储功能
  3. 系统配置和设置功能
  4. 用户认证和权限管理功能
  5. 日志记录和监控功能

2.2 软件特点

2.3 性能指标

3. 运行环境

3.1 硬件要求

最低配置:

推荐配置:

3.2 软件要求

4. 设计思想与实现过程

4.1 系统架构

本软件采用模块化架构设计,包括表示层、业务逻辑层和数据访问层。系统采用分层设计,各层之间通过标准接口进行通信,确保系统的松耦合和高内聚。

4.2 模块划分

  1. 用户界面模块:负责用户交互和界面展示
  2. 业务逻辑模块:处理核心业务逻辑
  3. 数据访问模块:负责数据的存储和检索
  4. 系统配置模块:管理系统配置和参数设置

4.3 开发流程

软件开发遵循标准的软件工程流程,包括需求分析、系统设计、编码实现、测试验证和部署维护等阶段。项目采用敏捷开发方法,通过迭代的方式逐步完善功能。版本控制使用Git,确保代码的可追溯性和团队协作效率。

5. 功能模块详述

5.1 核心功能模块

  1. 用户管理模块:实现用户注册、登录、权限管理等功能
  2. 数据处理模块:负责数据的增删改查和业务逻辑处理
  3. API接口模块:提供RESTful API接口供前端调用

5.2 用户界面设计

用户界面设计遵循简洁易用的原则,采用现代化的设计风格。界面布局合理,色彩搭配协调,图标和文字清晰可读。支持响应式设计,能够适配不同分辨率的设备。提供统一的交互体验,操作流程简单直观。

6. 用户指南

6.1 安装说明

  1. 环境准备:确保系统满足最低硬件和软件要求
  2. 依赖安装:安装必要的运行环境和依赖包
  3. 软件部署:将软件部署到目标环境
  4. 配置设置:根据实际需求配置系统参数
  5. 启动测试:验证软件是否正常运行

6.2 使用方法

  1. 用户登录:使用有效的用户名和密码登录系统
  2. 功能导航:通过主菜单或导航栏访问各项功能
  3. 数据操作:在相应界面中完成数据的增删改查
  4. 报表查看:通过报表功能查看统计数据和分析结果

7. 测试与维护

7.1 测试情况

本软件经过全面的测试验证,包括单元测试、集成测试和系统测试。测试覆盖了主要功能模块、边界条件和异常情况,确保软件的稳定性和可靠性。性能测试验证了系统在不同负载下的响应能力,安全测试确保了系统的安全性。

7.2 维护说明

软件维护包括日常维护、故障排除和功能升级等方面:

`; } /** * 转换HTML到PDF * @param {string} htmlPath HTML文件路径 * @param {string} outputPath PDF输出路径 * @returns {Promise} 是否成功 */ async function convertHTMLToPDF(htmlPath, outputPath) { // 方法1: 尝试使用Chrome/Chromium headless if (await tryChromeConversion(htmlPath, outputPath)) { return true; } // 方法2: 尝试使用wkhtmltopdf if (await tryWkHtmlToPdf(htmlPath, outputPath)) { return true; } // 方法3: 使用Node.js库 if (await tryNodeJSConversion(htmlPath, outputPath)) { return true; } return false; } /** * 尝试使用Chrome转换 */ async function tryChromeConversion(htmlPath, outputPath) { try { const puppeteer = require('puppeteer'); const browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox'] }); const page = await browser.newPage(); await page.goto(`file://${htmlPath}`, { waitUntil: 'networkidle0' }); await page.pdf({ path: outputPath, format: 'A4', printBackground: true, margin: { top: '20mm', bottom: '20mm', left: '15mm', right: '15mm' } }); await browser.close(); return true; } catch (error) { console.warn('Chrome转换失败:', error.message); return false; } } /** * 尝试使用wkhtmltopdf */ async function tryWkHtmlToPdf(htmlPath, outputPath) { try { execSync(`wkhtmltopdf --page-size A4 --margin-top 20mm --margin-bottom 20mm --margin-left 15mm --margin-right 15mm "${htmlPath}" "${outputPath}"`, { stdio: 'ignore' }); return true; } catch (error) { console.warn('wkhtmltopdf转换失败:', error.message); return false; } } /** * 尝试使用Node.js库 */ async function tryNodeJSConversion(htmlPath, outputPath) { try { // 这里可以使用其他Node.js PDF库,如jsPDF等 console.log('NodeJS转换暂未实现'); return false; } catch (error) { console.warn('NodeJS转换失败:', error.message); return false; } } module.exports = { generateManualPDF };