mirror of
https://github.com/patdelphi/suanming.git
synced 2026-02-28 05:33:11 +08:00
fix: 完全修复PDF和PNG下载功能\n\n- 修复PDF生成器Buffer转换问题,确保返回正确的PDF格式\n- 重构PNG生成器,使用Puppeteer替代SVG输出,生成真正的PNG图片\n- 添加Buffer类型检查和转换逻辑,防止格式错误\n- 全面测试所有下载格式(PDF、PNG)的完整性\n- 解决前端文件保存时的格式损坏问题\n\n测试结果:\n- 八字命理 PDF/PNG: ✅ 正常\n- 紫微斗数 PDF/PNG: ✅ 正常\n- 易经占卜 PDF/PNG: ✅ 正常
This commit is contained in:
BIN
debug-error.txt
Normal file
BIN
debug-error.txt
Normal file
Binary file not shown.
@@ -61,6 +61,12 @@ const generatePDF = async (analysisData, analysisType, userName) => {
|
|||||||
preferCSSPageSize: true
|
preferCSSPageSize: true
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 确保返回的是Buffer对象
|
||||||
|
if (!Buffer.isBuffer(pdfBuffer)) {
|
||||||
|
console.warn('Puppeteer返回的不是Buffer,正在转换:', typeof pdfBuffer);
|
||||||
|
return Buffer.from(pdfBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
return pdfBuffer;
|
return pdfBuffer;
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -1,34 +1,80 @@
|
|||||||
/**
|
/**
|
||||||
* PNG图片生成器
|
* PNG图片生成器
|
||||||
* 将分析结果转换为PNG图片格式
|
* 将分析结果转换为PNG图片格式
|
||||||
* 使用canvas或html-to-image技术
|
* 使用Puppeteer将SVG转换为PNG
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
const puppeteer = require('puppeteer');
|
||||||
|
|
||||||
const generatePNG = async (analysisData, analysisType, userName) => {
|
const generatePNG = async (analysisData, analysisType, userName) => {
|
||||||
|
let browser;
|
||||||
try {
|
try {
|
||||||
// 生成图片内容
|
// 生成SVG内容
|
||||||
const imageData = await generateImageData(analysisData, analysisType, userName);
|
const svgContent = await generateImageData(analysisData, analysisType, userName);
|
||||||
|
|
||||||
// 由于canvas库需要额外安装,这里先返回占位符
|
// 创建包含SVG的HTML页面
|
||||||
// 在实际部署时需要安装 canvas 或 puppeteer
|
const htmlContent = `
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<style>
|
||||||
|
body { margin: 0; padding: 0; }
|
||||||
|
svg { display: block; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
${svgContent}
|
||||||
|
</body>
|
||||||
|
</html>`;
|
||||||
|
|
||||||
// 临时解决方案:返回SVG内容作为PNG(实际应该转换为PNG)
|
// 启动puppeteer浏览器
|
||||||
const Buffer = require('buffer').Buffer;
|
browser = await puppeteer.launch({
|
||||||
return Buffer.from(imageData, 'utf8');
|
headless: 'new',
|
||||||
|
args: [
|
||||||
|
'--no-sandbox',
|
||||||
|
'--disable-setuid-sandbox',
|
||||||
|
'--disable-dev-shm-usage',
|
||||||
|
'--disable-gpu',
|
||||||
|
'--no-first-run',
|
||||||
|
'--disable-extensions',
|
||||||
|
'--disable-plugins'
|
||||||
|
],
|
||||||
|
timeout: 30000
|
||||||
|
});
|
||||||
|
|
||||||
// 正式实现应该是:
|
const page = await browser.newPage();
|
||||||
// const { createCanvas, loadImage } = require('canvas');
|
|
||||||
// const canvas = createCanvas(800, 1200);
|
// 设置页面内容
|
||||||
// const ctx = canvas.getContext('2d');
|
await page.setContent(htmlContent, {
|
||||||
//
|
waitUntil: 'networkidle0'
|
||||||
// // 绘制内容到canvas
|
});
|
||||||
// drawContent(ctx, analysisData, analysisType, userName);
|
|
||||||
//
|
// 设置视口大小
|
||||||
// return canvas.toBuffer('image/png');
|
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) {
|
} catch (error) {
|
||||||
console.error('生成PNG失败:', error);
|
console.error('生成PNG失败:', error);
|
||||||
throw error;
|
throw error;
|
||||||
|
} finally {
|
||||||
|
if (browser) {
|
||||||
|
await browser.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user