diff --git a/debug-error.txt b/debug-error.txt new file mode 100644 index 0000000..59b8f49 Binary files /dev/null and b/debug-error.txt differ diff --git a/server/services/generators/pdfGenerator.cjs b/server/services/generators/pdfGenerator.cjs index b68ecee..7cade8b 100644 --- a/server/services/generators/pdfGenerator.cjs +++ b/server/services/generators/pdfGenerator.cjs @@ -61,6 +61,12 @@ const generatePDF = async (analysisData, analysisType, userName) => { preferCSSPageSize: true }); + // 确保返回的是Buffer对象 + if (!Buffer.isBuffer(pdfBuffer)) { + console.warn('Puppeteer返回的不是Buffer,正在转换:', typeof pdfBuffer); + return Buffer.from(pdfBuffer); + } + return pdfBuffer; } catch (error) { diff --git a/server/services/generators/pngGenerator.cjs b/server/services/generators/pngGenerator.cjs index fa71033..a3395a6 100644 --- a/server/services/generators/pngGenerator.cjs +++ b/server/services/generators/pngGenerator.cjs @@ -1,34 +1,80 @@ /** * PNG图片生成器 * 将分析结果转换为PNG图片格式 - * 使用canvas或html-to-image技术 + * 使用Puppeteer将SVG转换为PNG */ +const puppeteer = require('puppeteer'); + const generatePNG = async (analysisData, analysisType, userName) => { + let browser; try { - // 生成图片内容 - const imageData = await generateImageData(analysisData, analysisType, userName); + // 生成SVG内容 + const svgContent = await generateImageData(analysisData, analysisType, userName); - // 由于canvas库需要额外安装,这里先返回占位符 - // 在实际部署时需要安装 canvas 或 puppeteer + // 创建包含SVG的HTML页面 + const htmlContent = ` + + + + + + + + ${svgContent} + +`; - // 临时解决方案:返回SVG内容作为PNG(实际应该转换为PNG) - const Buffer = require('buffer').Buffer; - return Buffer.from(imageData, 'utf8'); + // 启动puppeteer浏览器 + browser = await puppeteer.launch({ + headless: 'new', + args: [ + '--no-sandbox', + '--disable-setuid-sandbox', + '--disable-dev-shm-usage', + '--disable-gpu', + '--no-first-run', + '--disable-extensions', + '--disable-plugins' + ], + timeout: 30000 + }); - // 正式实现应该是: - // const { createCanvas, loadImage } = require('canvas'); - // const canvas = createCanvas(800, 1200); - // const ctx = canvas.getContext('2d'); - // - // // 绘制内容到canvas - // drawContent(ctx, analysisData, analysisType, userName); - // - // return canvas.toBuffer('image/png'); + const page = await browser.newPage(); + + // 设置页面内容 + await page.setContent(htmlContent, { + waitUntil: 'networkidle0' + }); + + // 设置视口大小 + await page.setViewport({ width: 800, height: 1200 }); + + // 截图生成PNG + const pngBuffer = await page.screenshot({ + type: 'png', + fullPage: true, + omitBackground: false + }); + + // 确保返回的是Buffer对象 + if (!Buffer.isBuffer(pngBuffer)) { + console.warn('Puppeteer返回的不是Buffer,正在转换:', typeof pngBuffer); + return Buffer.from(pngBuffer); + } + + return pngBuffer; } catch (error) { console.error('生成PNG失败:', error); throw error; + } finally { + if (browser) { + await browser.close(); + } } };