PPT自动生成实现方案(java)

背景

最近公司有业务需求:甲方需要我们提供自动生成PPT的功能,他们主要是常用一个模板,会进行季度性的数据更新、文本更新等。
条件:1、不会提供带变量的ppt模板 2、目的主要是减少他们的工作量(很多是文本、图表的更新),后续细节他们会自己再微调一下(全程无人工参与不现实)。

方案
1、任务解析

(1)当前任务难点在于没有带变量PPT模板——>如何快速自适应生成合适的PPT模板
(2)主要工作是更新文本+图表——>文本更新难度不大,核心在于如何有效更新图表

2、思路

(1)如何快速自适应生成合适的PPT模板
提到“自适应”那必须使用大模型,因为它擅长语义理解,但大模型无法有效提取PPT中的内容,所以必须借助PPT解析工具apache.poi。
(2)如何有效更新图表
PPT中不管是柱状图、折线图、表格等他们核心都是通过一个“表格”渲染出来的,所以我们只需要更新这个内核“表格”,即可完成图表的有效更新

3、具体实施

(1)PPT解析
直接调用apache.poi对应方法即可,PPT解析成对应数据。
示例如下:

{
  "slideWidth" : 960.0,
  "slideHeight" : 540.0,
  "slides" : [ {
    "slideNumber" : 1,
    "masterName" : "/ppt/slideMasters/slideMaster1.xml",
    "layoutName" : "标题幻灯片",
    "notes" : null,
    "elements" : [ {
      "shapeId" : 4,
      "shapeName" : "图表 3",
      "shapeType" : "CHART",
      "geometry" : {
        "x" : 210.7,
        "y" : 114.1,
        "width" : 538.55,
        "height" : 311.8
      },
      "textContent" : null,
      "tableData" : null,
      "chartData" : {
        "chartTitle" : "原始折线图",
        "chartType" : "LINE",
        "categories" : [ "类别 1", "类别 2", "类别 3", "类别 4" ],
        "series" : [ {
          "seriesName" : "Series 531",
          "values" : [ 4.3, 2.5, 3.5, 4.5 ]
        }, {
          "seriesName" : "Series 95",
          "values" : [ 2.4, 4.4, 1.8, 2.8 ]
        }, {
          "seriesName" : "Series 559",
          "values" : [ 2.0, 2.0, 3.0, 5.0 ]
        } ]
      },
      "pictureData" : null
    } ]
  } ]
}

这里关注几个关键信息 slideNumber(PPT页码)、shapeId(内容的ID)、shapeType(类型),后续我们需要根据slideNumber、shapeId来定位,通过、shapeType调用对应方法来替换对应的内容。

(2)PPT变量模板抽取
示例入下:

---
- targetSlideNumber: 1
  targetShapeId: 4
  variableType: "CHART"
  template:
    chartTitle: "${1_4_chart_title}"
    chartType: "LINE"
    categories:
    - "${1_4_category_1}"
    - "${1_4_category_2}"
    - "${1_4_category_3}"
    - "${1_4_category_4}"
    series:
    - seriesName: "${1_4_series_name_1}"
      values:
      - "${1_4_series_1_value_1}"
      - "${1_4_series_1_value_2}"
      - "${1_4_series_1_value_3}"
      - "${1_4_series_1_value_4}"
    - seriesName: "${1_4_series_name_2}"
      values:
      - "${1_4_series_2_value_1}"
      - "${1_4_series_2_value_2}"
      - "${1_4_series_2_value_3}"
      - "${1_4_series_2_value_4}"
    - seriesName: "${1_4_series_name_3}"
      values:
      - "${1_4_series_3_value_1}"
      - "${1_4_series_3_value_2}"
      - "${1_4_series_3_value_3}"
      - "${1_4_series_3_value_4}"

这里直接调用大模型就好,写好对应的提示词。
tips:
1、调用大模型要考虑到token上限,最好将解析的内容分批发送给大模型(用页码来做区分)。
2、分批次又会带来一个问题,抽取的变量无法保证唯一性,这个可以再提示词中让变量绑定 对应的slideNumber、shapeId来解决。
3、当PPT页数较多时,得考虑异步来实现,毕竟大模型响应时间还挺长的。

(3)模板内容返回给前端与用户做交互
大模型抽取的变量不一定是用户需要替换的,所以需要用户手动确认。同时也需要用户上传对应的数据,返回给后端进行变量替换。

(4)PPT重新生成
同样是调用apache.poi对应方法。
tips:
1、重新生成过程中一定要保留原始格式,只做内容替换。

简单效果演示

在这里插入图片描述在这里插入图片描述

总结

1、这里没有提供具体的代码(公司业务,已经上线了,写出来不合适),同时本身这些功能我都是用cusor写的(当然不是演示图片上那么简单哈,但实现逻辑都是一样的)你只要理解思路,也能让ai帮你写出来,我开发周期差不多两周,基本满足要求。
2、关于用户交互还得完善,首先当前所有数据都是抽了变量,但不同页的相同词汇其实应该统一变量;其次图表数据应该处理后作为一个整体,再传递给前端不能使用单一的变量。

**结束语:**当前还有很多要完善的,不过我实习马上结束了,也没时间弄了。只有把思路交接哈,等公司自己找人继续完成,或者我秋招又进这家公司,后面继续干 哈哈哈哈!

Logo

更多推荐