PPT全方位辅助系统-项目记录11

1.更新生成内容的提示词

根据大纲生成内容的AI还是不太稳定,调了好久提示词,越调越不听话,越调格式越跑偏,最后干脆改变描述逻辑重写了一遍,比之前稳定多了。

public final static String system_content = "以下共分为四部分,分别为{格式描述}、{任务描述}、{格式讲解}、{任务举例}。" +
            "{格式描述}" +
            "【格式1】:封面页(换行) 标题:XXXXXXX(换行) 副标题:XXXXXXX(换行) 目录页(换行) XXX(换行) XXX(换行) XXX(换行) 内容页(换行) XXX(换行)" +
            "【格式2】:封面页(换行) 标题:XXXXXXX(换行) 副标题:XXXXXXX(换行) 目录页(换行) XXX:XXXX(换行) XXX:XXXX(换行) XXX:XXXX(换行) 内容页(换行) XXX:XXXXXXXX(换行) 结尾页(换行) XXXXXX" +
            "{任务描述}" +
            "有两种可能的任务,每次只会是其中一种,根据输入的内容进行判断。" +
            "第一种任务是,输入为一个PPT文件的主题,请根据该主题,严格按照【格式1】生成PPT的大纲。" +
            "第二种任务是,输入为严格按照【格式1】提供的大纲,请根据大纲的各部分,严格按照【格式2】生成PPT的详细内容。" +
            "注意:给出并且只给出严格按照指定格式生成的输出即可;不要添加任何加粗或符号;不需要对用户的任何问候、询问或提示。" +
            "{格式讲解}" +
            "以下是对【格式1】和【格式2】的讲解:" +
            "1.“封面页”“目录页”“内容页”各代表一页幻灯片。" +
            "2.“封面页”中,“标题:”后的“XXXXXXX”表示PPT文件的主题,“副标题:”后的“XXXXXXX”是对主题的简要解释。" +
            "3.“目录页”中,“XXX”分别对应各“内容页”的主题,注意数量和内容要完全一致。" +
            "4.“内容页”有多页,3页到5页。【格式1】中,“内容页”后的“XXX”是该内容页的主题,后面不需要再细分小标题;【格式2】中,“内容页”后的“XXX:XXXXXXXX”是对小主题的详细描述,后面的“XXXXXXXX”装入内容文本框,一定不要遗漏冒号。" +
            "5.注意注意:每一个内容页都必须要有“内容页”作为开头!每一个内容页都必须要有“内容页”作为开头!每一个内容页都必须要有“内容页”作为开头!" +
            "6.“结尾页”是根据前面的内容生成,装入结尾页内容“XXXXXX”。注意【格式1】与【格式2】中已经说明,第一种任务生成大纲时不需要结尾页,第二种任务生成内容时需要结合全文给出结尾页。" +
            "7.我描述的所有“XXX”“XXXX”“XXXXXXX”等仅表示占位符,并不代表具体内容或字数限制。" +
            "{任务举例}" +
            "第一种任务举例:输入“鲜花”,输出“封面页 标题:鲜花 副标题:探索不同种类与花语 目录页 鲜花种类介绍 鲜花与花语 鲜花养护知识 内容页 鲜花种类介绍 内容页 鲜花与花语 内容页 鲜花养护知识”" +
            "第二种任务举例:举例:输入“封面页 标题:鲜花 副标题:探索不同种类与花语 目录页 鲜花种类介绍 鲜花与花语 鲜花养护知识 内容页 鲜花种类介绍 内容页 鲜花与花语 内容页 鲜花养护知识”,输出“封面页 标题:鲜花 副标题:探索不同种类与花语  目录页 鲜花种类介绍:概述各类鲜花的特征与分布 鲜花与花语:了解不同鲜花所代表的意义 鲜花养护知识:掌握保持鲜花新鲜的方法 内容页 鲜花种类介绍:玫瑰、郁金香、百合、康乃馨等,各有其独特的形态与花语。 内容页 鲜花与花语:玫瑰代表爱情,郁金香代表优雅,百合代表纯洁,康乃馨代表母爱。 内容页 鲜花养护知识:正确的剪枝、水位控制、温度调节以及避免直射日光,是保持鲜花长久鲜艳的关键。 结尾页 通过对鲜花的种类、花语以及养护知识的深入了解,我们可以更好地欣赏和利用这些大自然的美丽赠礼。”";

2.更新PPT翻译部分

PPT翻译方面由于安全性限制(浏览器出于安全性考虑,不允许网页随意访问用户的文件系统路径,以防止恶意代码对用户的文件进行未经授权的访问或修改)前端和之前的后端代码无法适配,所以改了改代码,不再是输入路径进行处理,而是改成用户选择文件。

改后代码如下:

PPTModifier:

package top.pulselink.chatglmT;

import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFShape;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFTextBox;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;

public class PPTModifier {

    public static void modifyPPT(ChatClient chatClient, String inputPath, String outputPath) throws IOException {
        // 读取PPT文件
        FileInputStream inputStream = new FileInputStream(inputPath);
        XMLSlideShow ppt = new XMLSlideShow(inputStream);
        inputStream.close();

        // 获取每个幻灯片
        for (XSLFSlide slide : ppt.getSlides()) {
            // 获取幻灯片中的文本框
            for (XSLFShape shape : slide.getShapes()) {
                if (shape instanceof XSLFTextBox) {
                    XSLFTextBox textBox = (XSLFTextBox) shape;
                    String originalText = textBox.getText(); // 获取文本框内容
                    // 调用ChatClient的AsyncInvoke方法获取修改后的文本
                    chatClient.AsyncInvoke(originalText);
                    String modifiedText = chatClient.getResponseMessage();
                    // 清空文本框内容并添加修改后的内容
                    textBox.clearText();
                    textBox.setText(modifiedText);
                }
            }
        }

        // 保存修改后的PPT文件
        FileOutputStream outputStream = new FileOutputStream(outputPath);
        ppt.write(outputStream);
        outputStream.close();
    }
}

TranslateController:

package com.example.ppt_project_backend.controller;

import com.example.ppt_project_backend.service.TranslateService;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;

@RestController
@RequestMapping("/translate")
@CrossOrigin(origins = "http://localhost:63342")
public class TranslateController {

    private final TranslateService translateService;

    public TranslateController(TranslateService translateService) {
        this.translateService = translateService;
    }

    @PostMapping("/upload")
    public ResponseEntity<FileSystemResource> uploadAndTranslatePPT(@RequestParam("file") MultipartFile file) {
        try {
            // 临时保存上传的PPT文件
            Path tempDir = Files.createTempDirectory("temp-ppt");
            File tempFile = new File(tempDir.toFile(), file.getOriginalFilename());
            file.transferTo(tempFile);

            // 调用TranslateService来处理PPT翻译
            String outputPath = tempDir.resolve("translated-" + System.currentTimeMillis() + ".pptx").toString();
            translateService.translatePPT(tempFile.getAbsolutePath(), outputPath);

            // 准备响应
            FileSystemResource resource = new FileSystemResource(new File(outputPath));
            return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + resource.getFilename())
                    .contentType(MediaType.APPLICATION_OCTET_STREAM)
                    .body(resource);
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.status(500).build();
        }
    }
}

TranslateService: 

package com.example.ppt_project_backend.service;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import top.pulselink.chatglmT.ChatClient;
import top.pulselink.chatglmT.PPTModifier;

import java.io.IOException;

@Service
public class TranslateService {

    private final ChatClient chatClient;

    public TranslateService(@Value("${chatglm.api.key}") String apiKey) {
        if (apiKey == null || apiKey.isEmpty()) {
            throw new IllegalStateException("API key is required");
        }
        this.chatClient = new ChatClient(apiKey);
        this.chatClient.registerShutdownHook();
    }

    public void translatePPT(String inputPath, String outputPath) throws IOException {
        PPTModifier.modifyPPT(chatClient, inputPath, outputPath);
    }
}

测试用的HTML: 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Upload and Translate PPT</title>
</head>
<body>
<h1>Upload and Translate PPT</h1>
<form id="uploadForm" enctype="multipart/form-data">
    <input type="file" name="file" id="fileInput">
    <button type="submit">Upload and Translate</button>
</form>

<hr>

<h2>Translated PPT</h2>
<div id="translatedPPT"></div>

<script>
    document.getElementById('uploadForm').addEventListener('submit', function(event) {
        event.preventDefault();

        var formData = new FormData();
        formData.append('file', document.getElementById('fileInput').files[0]);

        fetch('http://localhost:8080/translate/upload', {
            method: 'POST',
            body: formData
        })
        .then(response => {
            if (!response.ok) {
                throw new Error('Network response was not ok');
            }
            return response.blob();
        })
        .then(blob => {
            // 创建URL对象并设置下载链接
            var url = window.URL.createObjectURL(blob);
            var a = document.createElement('a');
            a.href = url;
            a.download = 'translated_ppt.pptx';
            a.textContent = 'Download translated PPT';
            document.getElementById('translatedPPT').appendChild(a);
        })
        .catch(error => {
            console.error('There has been a problem with your fetch operation:', error);
        });
    });
</script>
</body>
</html>

测试:

点击选择文件选择要翻译的PPT,然后点击Upload and Translate,等待片刻,会自动下载已翻译好的PPT。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值