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