Upload public.js
Browse files- backend/src/routes/public.js +37 -10
backend/src/routes/public.js
CHANGED
|
@@ -19,9 +19,19 @@ const generateSlideHTML = (pptData, slideIndex, title) => {
|
|
| 19 |
const slide = pptData.slides[slideIndex];
|
| 20 |
const theme = pptData.theme || {};
|
| 21 |
|
| 22 |
-
// 精确计算PPT内容的真实尺寸 -
|
| 23 |
const calculatePptDimensions = (slide) => {
|
| 24 |
-
// 1. 优先使用PPT
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
if (pptData.slideSize && pptData.slideSize.width && pptData.slideSize.height) {
|
| 26 |
const result = {
|
| 27 |
width: Math.ceil(pptData.slideSize.width),
|
|
@@ -31,7 +41,17 @@ const generateSlideHTML = (pptData, slideIndex, title) => {
|
|
| 31 |
return result;
|
| 32 |
}
|
| 33 |
|
| 34 |
-
//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
if (slide.width && slide.height) {
|
| 36 |
const result = {
|
| 37 |
width: Math.ceil(slide.width),
|
|
@@ -41,11 +61,11 @@ const generateSlideHTML = (pptData, slideIndex, title) => {
|
|
| 41 |
return result;
|
| 42 |
}
|
| 43 |
|
| 44 |
-
//
|
| 45 |
if (!slide.elements || slide.elements.length === 0) {
|
| 46 |
-
// 如果没有元素,使用标准PPT尺寸
|
| 47 |
-
const result = { width:
|
| 48 |
-
console.log(`使用默认尺寸: ${result.width}x${result.height}`);
|
| 49 |
return result;
|
| 50 |
}
|
| 51 |
|
|
@@ -82,9 +102,16 @@ const generateSlideHTML = (pptData, slideIndex, title) => {
|
|
| 82 |
const paddingX = Math.max(40, Math.abs(minLeft));
|
| 83 |
const paddingY = Math.max(40, Math.abs(minTop));
|
| 84 |
|
| 85 |
-
// 计算最终的PPT
|
| 86 |
-
let finalWidth = Math.max(contentWidth + paddingX * 2,
|
| 87 |
-
let finalHeight = Math.max(contentHeight + paddingY * 2,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 88 |
|
| 89 |
// 确保尺寸为偶数(避免半像素问题)
|
| 90 |
finalWidth = Math.ceil(finalWidth / 2) * 2;
|
|
|
|
| 19 |
const slide = pptData.slides[slideIndex];
|
| 20 |
const theme = pptData.theme || {};
|
| 21 |
|
| 22 |
+
// 精确计算PPT内容的真实尺寸 - 使用编辑器的实际尺寸数据
|
| 23 |
const calculatePptDimensions = (slide) => {
|
| 24 |
+
// 1. 优先使用PPT数据中的viewportSize和viewportRatio(编辑器的真实尺寸)
|
| 25 |
+
if (pptData.viewportSize && pptData.viewportRatio) {
|
| 26 |
+
const result = {
|
| 27 |
+
width: Math.ceil(pptData.viewportSize),
|
| 28 |
+
height: Math.ceil(pptData.viewportSize * pptData.viewportRatio)
|
| 29 |
+
};
|
| 30 |
+
console.log(`使用编辑器真实尺寸: ${result.width}x${result.height} (viewportSize: ${pptData.viewportSize}, viewportRatio: ${pptData.viewportRatio})`);
|
| 31 |
+
return result;
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
// 2. 使用PPT数据中的预设尺寸
|
| 35 |
if (pptData.slideSize && pptData.slideSize.width && pptData.slideSize.height) {
|
| 36 |
const result = {
|
| 37 |
width: Math.ceil(pptData.slideSize.width),
|
|
|
|
| 41 |
return result;
|
| 42 |
}
|
| 43 |
|
| 44 |
+
// 3. 如果PPT数据中有width和height
|
| 45 |
+
if (pptData.width && pptData.height) {
|
| 46 |
+
const result = {
|
| 47 |
+
width: Math.ceil(pptData.width),
|
| 48 |
+
height: Math.ceil(pptData.height)
|
| 49 |
+
};
|
| 50 |
+
console.log(`使用PPT根级尺寸: ${result.width}x${result.height}`);
|
| 51 |
+
return result;
|
| 52 |
+
}
|
| 53 |
+
|
| 54 |
+
// 4. 使用slide级别的尺寸设置
|
| 55 |
if (slide.width && slide.height) {
|
| 56 |
const result = {
|
| 57 |
width: Math.ceil(slide.width),
|
|
|
|
| 61 |
return result;
|
| 62 |
}
|
| 63 |
|
| 64 |
+
// 5. 根据元素分布计算合适的尺寸
|
| 65 |
if (!slide.elements || slide.elements.length === 0) {
|
| 66 |
+
// 如果没有元素,使用标准PPT尺寸 - 使用PPTist默认尺寸
|
| 67 |
+
const result = { width: 900, height: 506 }; // 16:9标准比例 (viewportSize: 900, viewportRatio: 0.5625)
|
| 68 |
+
console.log(`使用默认尺寸: ${result.width}x${result.height} (16:9比例)`);
|
| 69 |
return result;
|
| 70 |
}
|
| 71 |
|
|
|
|
| 102 |
const paddingX = Math.max(40, Math.abs(minLeft));
|
| 103 |
const paddingY = Math.max(40, Math.abs(minTop));
|
| 104 |
|
| 105 |
+
// 计算最终的PPT尺寸,但限制在合理范围内
|
| 106 |
+
let finalWidth = Math.max(contentWidth + paddingX * 2, 900);
|
| 107 |
+
let finalHeight = Math.max(contentHeight + paddingY * 2, 506);
|
| 108 |
+
|
| 109 |
+
// 如果计算出的尺寸过大,使用标准比例缩放
|
| 110 |
+
if (finalWidth > 1920 || finalHeight > 1080) {
|
| 111 |
+
const scale = Math.min(1920 / finalWidth, 1080 / finalHeight);
|
| 112 |
+
finalWidth = Math.ceil(finalWidth * scale);
|
| 113 |
+
finalHeight = Math.ceil(finalHeight * scale);
|
| 114 |
+
}
|
| 115 |
|
| 116 |
// 确保尺寸为偶数(避免半像素问题)
|
| 117 |
finalWidth = Math.ceil(finalWidth / 2) * 2;
|