spa/.claude/skills/softcopyright/scripts/auto-print-pdf.js

223 lines
7.1 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 自动打印PDF解决方案
* 使用系统浏览器自动打开HTML并触发打印
*/
const { exec } = require('child_process');
const fs = require('fs-extra');
const path = require('path');
const chalk = require('chalk');
/**
* 使用系统默认浏览器打开HTML文件
* @param {string} htmlPath HTML文件路径
* @returns {Promise<boolean>}
*/
async function openInBrowser(htmlPath) {
return new Promise((resolve, reject) => {
console.log(chalk.blue(`🌐 在浏览器中打开: ${htmlPath}`));
// macOS使用open命令
const command = process.platform === 'darwin' ? 'open' :
process.platform === 'win32' ? 'start' : 'xdg-open';
const child = exec(`${command} "${htmlPath}"`, (error) => {
if (error) {
console.warn(chalk.yellow('⚠️ 浏览器打开失败:'), error.message);
resolve(false);
} else {
console.log(chalk.green('✅ 浏览器已打开'));
resolve(true);
}
});
// 设置超时
setTimeout(() => {
resolve(true); // 假设成功,即使没有回调
}, 2000);
});
}
/**
* 创建包含自动打印功能的HTML文件
* @param {string} originalHtmlPath 原始HTML路径
* @returns {Promise<string>} 增强版HTML路径
*/
async function createAutoPrintHTML(originalHtmlPath) {
try {
const content = await fs.readFile(originalHtmlPath, 'utf8');
// 增强的HTML内容添加自动打印功能
const enhancedContent = content.replace(
'</head>',
`
<script>
// 自动打印设置
window.onload = function() {
console.log('📄 软件说明书已加载');
// 显示提示信息
setTimeout(() => {
alert('💡 提示:\n1. 本页面将自动打开打印对话框\n2. 可以取消后手动按 Cmd+P 打印\n3. 建议选择"保存为PDF"格式');
}, 1000);
// 自动打开打印对话框延迟2秒让页面完全加载
setTimeout(() => {
console.log('🖨️ 正在自动打开打印对话框...');
try {
window.print();
} catch (e) {
console.log('打印对话框打开失败,请手动按 Cmd+P');
}
}, 3000);
};
// 添加键盘事件监听
document.addEventListener('keydown', function(e) {
// Cmd+P 或 Ctrl+P
if ((e.metaKey || e.ctrlKey) && e.key === 'p') {
e.preventDefault();
console.log('🖨️ 手动触发打印...');
try {
window.print();
} catch (e) {
console.log('打印失败,请检查浏览器设置');
}
}
});
// 添加打印完成监听
window.onafterprint = function() {
console.log('✅ 打印对话框已关闭');
};
// 添加页面卸载提醒
window.addEventListener('beforeunload', function(e) {
if (!document.printing) {
return;
}
});
</script>
</head>
`.trim() + '\n');
const enhancedPath = originalHtmlPath.replace('.html', '_auto_print.html');
await fs.writeFile(enhancedPath, enhancedContent, 'utf8');
console.log(chalk.green(`✅ 自动打印版HTML已生成: ${enhancedPath}`));
return enhancedPath;
} catch (error) {
console.warn(chalk.yellow('⚠️ 创建自动打印版HTML失败:'), error.message);
return originalHtmlPath;
}
}
/**
* 完整的自动打印解决方案
* @param {Object} projectInfo 项目信息
* @param {string} outputDir 输出目录
* @returns {Promise<{htmlPath: string, autoPrintPath: string, browserOpened: boolean}>}
*/
async function generateAutoPrintPDF(projectInfo, outputDir) {
try {
const moment = require('moment');
console.log(chalk.blue.bold('🚀 SoftCopyright - 自动PDF解决方案'));
console.log(chalk.gray('='.repeat(50)));
// 1. 扫描项目
console.log(chalk.yellow('📊 步骤1: 扫描项目源码...'));
const scanner = require('./scanner');
let scannedProjectInfo;
if (typeof projectInfo === 'string') {
scannedProjectInfo = await scanner.scanProject(projectInfo);
} else if (projectInfo && projectInfo.files) {
scannedProjectInfo = projectInfo;
} else {
scannedProjectInfo = await scanner.scanProject(process.cwd());
}
console.log(chalk.green(`✅ 项目扫描完成: ${scannedProjectInfo.name}`));
console.log(chalk.white(` - 文件数: ${scannedProjectInfo.files.length}`));
console.log(chalk.white(` - 代码行数: ${scannedProjectInfo.totalLines}`));
console.log(chalk.white(` - 主要语言: ${scannedProjectInfo.languages.join(', ')}`));
// 2. 生成原始HTML
console.log(chalk.yellow('📝 步骤2: 生成HTML文档...'));
const { generateManualHTML } = require('./simple-doc-generator');
const htmlPath = await generateManualHTML(scannedProjectInfo, outputDir);
// 3. 生成自动打印版HTML
console.log(chalk.yellow('🖨️ 步骤3: 创建自动打印版HTML...'));
const autoPrintPath = await createAutoPrintHTML(htmlPath);
// 4. 在浏览器中打开
console.log(chalk.yellow('🌐 步骤4: 在浏览器中打开...'));
const browserOpened = await openInBrowser(autoPrintPath);
// 5. 显示结果
console.log(chalk.green.bold('\n🎉 自动打印方案启动成功!'));
console.log(chalk.blue(`📄 HTML文件: ${htmlPath}`));
console.log(chalk.blue(`🖨️ 自动打印版: ${autoPrintPath}`));
console.log(chalk.green(`🌐 浏览器${browserOpened ? '已打开' : '请手动打开'}: ${autoPrintPath}`));
console.log(chalk.cyan('\n💡 接下来的操作:'));
console.log(chalk.white('1. 浏览器将自动打开打印对话框3秒后'));
console.log(chalk.white('2. 选择"保存为PDF"格式'));
console.log(chalk.white('3. 设置合适的页边距和缩放'));
console.log(chalk.white('4. 保存PDF文件'));
console.log(chalk.cyan('\n⌨ 快捷键:'));
console.log(chalk.white(' - 随时自动打印: 在打印对话框中选择取消'));
console.log(chalk.white(' - 手动打印: 随时按 Cmd+P (Mac) 或 Ctrl+P (Windows/Linux)'));
return {
htmlPath,
autoPrintPath,
browserOpened
};
} catch (error) {
console.error(chalk.red('❌ 自动打印方案失败:'), error.message);
throw error;
}
}
/**
* 检查系统浏览器
* @returns {string} 可用浏览器名称
*/
function checkBrowser() {
const { execSync } = require('child_process');
try {
execSync('which google-chrome', { stdio: 'ignore' });
return 'Google Chrome';
} catch (e) {
try {
execSync('which chrome', { stdio: 'ignore' });
return 'Chrome';
} catch (e) {
try {
execSync('which firefox', { stdio: 'ignore' });
return 'Firefox';
} catch (e) {
try {
execSync('which safari', { stdio: 'ignore' });
return 'Safari';
} catch (e) {
return '系统默认浏览器';
}
}
}
}
}
module.exports = {
openInBrowser,
createAutoPrintHTML,
generateAutoPrintPDF,
checkBrowser
};