chengjie hai 6 meses
pai
achega
30539a29e8
Modificáronse 1 ficheiros con 37 adicións e 25 borrados
  1. 37 25
      src/api/yjbdc/yjbdcController.js

+ 37 - 25
src/api/yjbdc/yjbdcController.js

@@ -181,7 +181,7 @@ export async function GenerateArticle(ctx) {
181
     let result = globalCache.get(url);
181
     let result = globalCache.get(url);
182
     if (result === 0) {
182
     if (result === 0) {
183
         const params = ctx.request.body;
183
         const params = ctx.request.body;
184
-        const words = JSON.parse(params.Words).join(",");
184
+        const words = params.Words;
185
         const articleStyle = params.ArticleStyle;
185
         const articleStyle = params.ArticleStyle;
186
 
186
 
187
         //文章类型
187
         //文章类型
@@ -221,7 +221,7 @@ export async function GenerateArticle(ctx) {
221
 
221
 
222
         let content = "将"+words+"这些单词生成一篇英文文章。要求"+
222
         let content = "将"+words+"这些单词生成一篇英文文章。要求"+
223
         "[难度];"+
223
         "[难度];"+
224
-        "单词若是脏话,像'f***'、's***'等,可以忽略;"+
224
+        "单词若是脏话,像'fuck'、'shit'等,可以忽略;"+
225
         "文章类型是'"+articleStyle+"([类型])';"+
225
         "文章类型是'"+articleStyle+"([类型])';"+
226
         "文章单词数在200个左右,最多不能超过300个;"+
226
         "文章单词数在200个左右,最多不能超过300个;"+
227
         "文章按每句分成数组,且每句都有中文翻译;"+
227
         "文章按每句分成数组,且每句都有中文翻译;"+
@@ -285,7 +285,7 @@ export async function GetYJBDCArticleList(ctx) {
285
             for(let i=0;i<result.length;i++){
285
             for(let i=0;i<result.length;i++){
286
                 let item=result[i];
286
                 let item=result[i];
287
                 item.CreateTime=moment(item.CreateTime).format("YYYY年MM月DD日 HH:mm");
287
                 item.CreateTime=moment(item.CreateTime).format("YYYY年MM月DD日 HH:mm");
288
-                switch (item.Level){
288
+                switch (Number(item.Level)){
289
                     case 0:
289
                     case 0:
290
                         item.LevelStr="小学";
290
                         item.LevelStr="小学";
291
                         break;
291
                         break;
@@ -350,8 +350,9 @@ export async function GeneratePDF(ctx) {
350
             autoFirstPage: true
350
             autoFirstPage: true
351
         });
351
         });
352
 
352
 
353
-        // 注册中文字体
354
-        doc.registerFont('ChineseFont', '/usr/share/fonts/google-droid/DroidSansFallback.ttf');
353
+        // 注册中文字体 - 使用Mac系统的PingFang字体
354
+        //doc.registerFont('ChineseFont', '/usr/share/fonts/google-droid/DroidSansFallback.ttf');
355
+        doc.registerFont('ChineseFont', '/System/Library/Fonts/PingFang.ttc');
355
         
356
         
356
         // 定义字体选择函数,根据内容是否包含中文选择合适的字体
357
         // 定义字体选择函数,根据内容是否包含中文选择合适的字体
357
         const selectFont = (text, defaultFont = 'Helvetica') => {
358
         const selectFont = (text, defaultFont = 'Helvetica') => {
@@ -411,7 +412,8 @@ export async function GeneratePDF(ctx) {
411
         console.log("Questions to display:", questions.length);
412
         console.log("Questions to display:", questions.length);
412
 
413
 
413
         // 1. 在top:90,left:120像素处写"Story",60像素大小,Semibold粗细
414
         // 1. 在top:90,left:120像素处写"Story",60像素大小,Semibold粗细
414
-        doc.font('Helvetica-Bold')  // 使用Helvetica-Bold作为Semibold替代
415
+        // 使用selectFont函数动态选择字体
416
+        doc.font(selectFont("Story", 'Helvetica-Bold'))  // 使用Helvetica-Bold作为Semibold替代
415
            .fontSize(pixelToPt(60))
417
            .fontSize(pixelToPt(60))
416
            .text("Story", pixelToPt(120), pixelToPt(90), {
418
            .text("Story", pixelToPt(120), pixelToPt(90), {
417
                width: pixelToPt(200),
419
                width: pixelToPt(200),
@@ -419,7 +421,8 @@ export async function GeneratePDF(ctx) {
419
            });
421
            });
420
 
422
 
421
         // 2. 在top:250,left:120像素处写英文文章,48像素大小,宽1240像素,高自适应,Regular粗细
423
         // 2. 在top:250,left:120像素处写英文文章,48像素大小,宽1240像素,高自适应,Regular粗细
422
-        doc.font('Helvetica')
424
+        // 使用selectFont函数动态选择字体
425
+        doc.font(selectFont(articleText, 'Helvetica'))
423
            .fontSize(pixelToPt(48))
426
            .fontSize(pixelToPt(48))
424
            .text(articleText, pixelToPt(120), pixelToPt(250), {
427
            .text(articleText, pixelToPt(120), pixelToPt(250), {
425
                width: pixelToPt(1240),
428
                width: pixelToPt(1240),
@@ -510,10 +513,13 @@ export async function GeneratePDF(ctx) {
510
                 let optionY = doc.y + pixelToPt(20);
513
                 let optionY = doc.y + pixelToPt(20);
511
                 
514
                 
512
                 for (let i = 0; i < options.length; i++) {
515
                 for (let i = 0; i < options.length; i++) {
513
-                    doc.text(options[i] || `Option ${i+1}`, pixelToPt(120), optionY, {
514
-                        width: pixelToPt(540),
515
-                        align: 'left'
516
-                    });
516
+                    const optionText = options[i] || `Option ${i+1}`;
517
+                    // 检查选项是否包含中文并使用适当的字体
518
+                    doc.font(/[\u4E00-\u9FFF]/.test(optionText) ? 'ChineseFont' : 'Helvetica')
519
+                       .text(optionText, pixelToPt(120), optionY, {
520
+                           width: pixelToPt(540),
521
+                           align: 'left'
522
+                       });
517
                     optionY = doc.y + pixelToPt(10);
523
                     optionY = doc.y + pixelToPt(10);
518
                 }
524
                 }
519
             }
525
             }
@@ -532,17 +538,20 @@ export async function GeneratePDF(ctx) {
532
                    });
538
                    });
533
                 
539
                 
534
                 // 问题选项
540
                 // 问题选项
535
-                doc.font('Helvetica')
536
-                   .fontSize(pixelToPt(36));
541
+                doc.fontSize(pixelToPt(36));
542
+                // 不预先设置字体,将在每个选项中根据内容动态选择
537
                 
543
                 
538
                 const options = questions[1].OptionsEnglish || [];
544
                 const options = questions[1].OptionsEnglish || [];
539
                 let optionY = doc.y + pixelToPt(20);
545
                 let optionY = doc.y + pixelToPt(20);
540
                 
546
                 
541
                 for (let i = 0; i < options.length; i++) {
547
                 for (let i = 0; i < options.length; i++) {
542
-                    doc.text(options[i] || `Option ${i+1}`, pixelToPt(120), optionY, {
543
-                        width: pixelToPt(540),
544
-                        align: 'left'
545
-                    });
548
+                    const optionText = options[i] || `Option ${i+1}`;
549
+                    // 检查选项是否包含中文并使用适当的字体
550
+                    doc.font(/[\u4E00-\u9FFF]/.test(optionText) ? 'ChineseFont' : 'Helvetica')
551
+                       .text(optionText, pixelToPt(120), optionY, {
552
+                           width: pixelToPt(540),
553
+                           align: 'left'
554
+                       });
546
                     optionY = doc.y + pixelToPt(10);
555
                     optionY = doc.y + pixelToPt(10);
547
                 }
556
                 }
548
             }
557
             }
@@ -550,25 +559,28 @@ export async function GeneratePDF(ctx) {
550
             // 问题3和问题4 - left:740像素位置
559
             // 问题3和问题4 - left:740像素位置
551
             if (questions.length >= 3) {
560
             if (questions.length >= 3) {
552
                 // 问题3标题
561
                 // 问题3标题
553
-                doc.font('Helvetica-Bold')
562
+                const q3Text = `3. ${questions[2].QuestionEnglish || "Question 3"}`;
563
+                doc.font(selectFont(q3Text, 'Helvetica-Bold'))
554
                    .fontSize(pixelToPt(36))
564
                    .fontSize(pixelToPt(36))
555
-                   .text(`3. ${questions[2].QuestionEnglish || "Question 3"}`, pixelToPt(740), lineY + pixelToPt(100), {
565
+                   .text(q3Text, pixelToPt(740), lineY + pixelToPt(100), {
556
                        width: pixelToPt(540),
566
                        width: pixelToPt(540),
557
                        align: 'left'
567
                        align: 'left'
558
                    });
568
                    });
559
                 
569
                 
560
                 // 问题3选项
570
                 // 问题3选项
561
-                doc.font('Helvetica')
562
-                   .fontSize(pixelToPt(36));
571
+                doc.fontSize(pixelToPt(36));
563
                 
572
                 
564
                 const options3 = questions[2].OptionsEnglish || [];
573
                 const options3 = questions[2].OptionsEnglish || [];
565
                 let option3Y = doc.y + pixelToPt(20);
574
                 let option3Y = doc.y + pixelToPt(20);
566
                 
575
                 
567
                 for (let i = 0; i < options3.length; i++) {
576
                 for (let i = 0; i < options3.length; i++) {
568
-                    doc.text(options3[i] || `Option ${i+1}`, pixelToPt(740), option3Y, {
569
-                        width: pixelToPt(540),
570
-                        align: 'left'
571
-                    });
577
+                    const option3Text = options3[i] || `Option ${i+1}`;
578
+                    // 检查选项是否包含中文并使用适当的字体
579
+                    doc.font(selectFont(option3Text, 'Helvetica'))
580
+                       .text(option3Text, pixelToPt(740), option3Y, {
581
+                           width: pixelToPt(540),
582
+                           align: 'left'
583
+                       });
572
                     option3Y = doc.y + pixelToPt(10);
584
                     option3Y = doc.y + pixelToPt(10);
573
                 }
585
                 }
574
                 
586