PPT自动生成实现方案(java)
本文介绍了基于Java的PPT自动生成方案。针对客户无变量模板、需定期更新文本和图表的需求,提出使用Apache POI解析PPT内容,结合大模型智能抽取变量模板。方案通过slideNumber和shapeId定位内容,保留原始格式仅替换变量数据。实施过程包括PPT解析、变量模板生成、用户交互确认和PPT重生成等步骤。作者指出当前方案在变量统一性和图表数据处理方面仍需完善,但已基本满足业务需求,整
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、关于用户交互还得完善,首先当前所有数据都是抽了变量,但不同页的相同词汇其实应该统一变量;其次图表数据应该处理后作为一个整体,再传递给前端不能使用单一的变量。
**结束语:**当前还有很多要完善的,不过我实习马上结束了,也没时间弄了。只有把思路交接哈,等公司自己找人继续完成,或者我秋招又进这家公司,后面继续干 哈哈哈哈!
更多推荐
所有评论(0)