/** * HTML PDF生成器 * 使用HTML + Playwright生成支持中文的PDF */ const puppeteer = require('puppeteer'); const fs = require('fs-extra'); const path = require('path'); const moment = require('moment'); const chalk = require('chalk'); const { SUPPORTED_EXTENSIONS } = require('./scanner'); /** * 使用HTML生成软件说明书PDF * @param {Object} projectInfo 项目信息 * @param {string} outputDir 输出目录 * @returns {Promise} 生成的PDF文件路径 */ async function generateManualHTML(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 = generateManualHTMLContent(projectInfo); // 创建临时HTML文件 const tempHtmlPath = path.join(outputDir, `temp_${Date.now()}.html`); await fs.writeFile(tempHtmlPath, htmlContent, 'utf8'); // 使用Puppeteer生成PDF await generatePDFFromHTML(tempHtmlPath, outputPath); // 删除临时HTML文件 await fs.remove(tempHtmlPath); console.log(chalk.green(`✅ 软件说明书已生成: ${outputPath}`)); return outputPath; } catch (error) { throw new Error(`生成软件说明书失败: ${error.message}`); } } /** * 生成HTML内容 * @param {Object} projectInfo 项目信息 * @returns {string} HTML内容 */ function generateManualHTMLContent(projectInfo) { return ` 软件说明书 - ${projectInfo.name}

软件说明书

${projectInfo.name}

版本: 1.0.0
生成日期: ${moment().format('YYYY年MM月DD日')}

项目信息

项目名称: ${projectInfo.name}
开发语言: ${projectInfo.languages.join('、')}
源代码文件: ${projectInfo.files.length} 个
总代码行数: ${projectInfo.totalLines} 行
项目类型: ${getProjectTypeDescription(projectInfo.features.type)}

目录

1. 引言
1.1 概述
1.2 编写目的
1.3 开发背景
2. 软件概述
2.1 主要功能
2.2 应用场景
2.3 软件特点
2.4 性能指标
3. 运行环境
3.1 硬件要求
3.2 软件要求
3.3 网络环境
4. 设计思想与实现过程
4.1 系统架构
4.2 模块划分
4.3 开发流程
5. 功能模块详述
5.1 核心功能模块
5.2 辅助功能模块
5.3 用户界面设计
6. 用户指南
6.1 安装说明
6.2 使用方法
6.3 常见问题
7. 测试与维护
7.1 测试情况
7.2 维护说明
1. 引言

1.1 概述

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

1.2 编写目的

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

1.3 开发背景

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

2. 软件概述

2.1 主要功能

    ${getMainFunctions(projectInfo).map(func => `
  1. ${func}
  2. `).join('')}

2.2 应用场景

${getApplicationScenario(projectInfo)}

2.3 软件特点

2.4 性能指标

本软件在性能方面具有以下特点:

    ${getPerformanceMetrics(projectInfo).map(metric => `
  1. ${metric}
  2. `).join('')}
3. 运行环境

3.1 硬件要求

最低硬件配置:

推荐硬件配置:

3.2 软件要求

3.3 网络环境

本软件支持以下网络环境:

软件说明书结束

项目名称: ${projectInfo.name}
生成时间: ${moment().format('YYYY年MM月DD日 HH:mm:ss')}

(本文档由 SoftCopyright 工具自动生成,仅用于软件著作权申请)

`; } /** * 使用Puppeteer从HTML生成PDF * @param {string} htmlPath HTML文件路径 * @param {string} outputPath 输出PDF路径 * @returns {Promise} */ async function generatePDFFromHTML(htmlPath, outputPath) { let browser; try { // 启动Puppeteer browser = await puppeteer.launch({ headless: true, args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-gpu', '--lang=zh-CN,zh,zh-TW,en-US,en' ] }); const page = await browser.newPage(); // 设置用户代理和视口 await page.setUserAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36'); await page.setViewport({ width: 1200, height: 800 }); // 加载HTML文件 await page.goto(`file://${htmlPath}`, { waitUntil: ['networkidle0', 'domcontentloaded'], timeout: 30000 }); // 等待字体加载 await page.waitForTimeout(2000); // 生成PDF await page.pdf({ path: outputPath, format: 'A4', printBackground: true, margin: { top: '20mm', bottom: '20mm', left: '15mm', right: '15mm' }, displayHeaderFooter: true, headerTemplate: '
软件说明书
', footerTemplate: '
/
', preferCSSPageSize: true }); console.log(chalk.green('✅ PDF生成成功')); } catch (error) { throw new Error(`PDF生成失败: ${error.message}`); } finally { if (browser) { await browser.close(); } } } // 辅助函数 function getProjectTypeDescription(type) { const typeMap = { 'web': 'Web应用', 'python': 'Python应用', 'java': 'Java应用', 'javascript': 'JavaScript应用', 'unknown': '通用应用' }; return typeMap[type] || '通用应用'; } function getMainFunctions(projectInfo) { const functions = []; functions.push('用户界面管理和交互功能'); functions.push('数据处理和存储功能'); functions.push('系统配置和设置功能'); functions.push('用户认证和权限管理功能'); functions.push('日志记录和监控功能'); return functions; } function getApplicationScenario(projectInfo) { return '软件开发和部署场景,满足现代化的业务需求和技术要求'; } function getSoftwareFeatures(projectInfo) { const features = [ '采用模块化设计,具有良好的可扩展性', '使用现代化技术栈,确保技术的先进性', '代码结构清晰,遵循最佳实践和编码规范', '具有完整的错误处理和异常管理机制', '支持多种数据格式和协议', '具有良好的性能和响应速度' ]; if (projectInfo.features.hasTests) { features.push('包含完整的单元测试和集成测试'); } if (projectInfo.features.hasDocumentation) { features.push('提供详细的技术文档和API说明'); } return features; } function getPerformanceMetrics(projectInfo) { return [ '响应时间:主要操作响应时间小于200ms', '并发处理:支持100+并发用户访问', '数据处理:支持大量数据的高效处理', '内存使用:合理的内存占用和垃圾回收机制', '可扩展性:支持水平扩展和负载均衡' ]; } function getSoftwareRequirements(projectInfo) { const reqs = [ '操作系统:Windows 10+、macOS 10.14+、Linux (Ubuntu 18.04+)', `运行环境:${projectInfo.languages.join('、')}` ]; if (projectInfo.features.packageManagers.includes('npm')) { reqs.push('包管理器:Node.js 14+ 和 npm 6+'); } if (projectInfo.features.frameworks.length > 0) { reqs.push(`框架依赖:${projectInfo.features.frameworks.join('、')}`); } return reqs; } module.exports = { generateManualHTML };