phppresentation是php操作pptx的推荐库,需composer安装;添加文字优先用addtextshape(),复杂样式用createrichtextshape();中文须显式设字体如microsoft yahei;注意高度、字体匹配与导出保存。

PHP 用 PHPPresentation 添加文字,不是直接操作 ZIP
PHP 本身不原生支持读写 PPTX 文件,得靠第三方库。最常用的是 PHPPresentation(phpoffice/phppresentation),它模仿了 PHPExcel 的设计思路,但专为演示文稿服务。别试图用 ZipArchive 手动解压/改 XML——PPTX 结构复杂,字体、段落、占位符关系一动就坏,且不处理 OPC 包关系和内容类型声明,很容易生成打不开的文件。
实操建议:
- 用 Composer 安装:
composer require phpoffice/phppresentation - 只操作
.pptx,不支持旧版.ppt - 新建幻灯片时,默认布局可能不含文本占位符,必须手动添加文本框或指定占位符索引
- 中文文字需显式设置字体,否则默认是无中文字体的 Calibri,Windows 上可能显示方块
addTextShape() 和 createRichTextShape() 选哪个?
加普通说明文字,优先用 addTextShape();需要分段、混排(比如部分加粗、换行、不同字号),必须用 createRichTextShape()。前者简单但死板,后者灵活但稍重。
常见错误现象:
立即学习“PHP免费学习笔记(深入)”;
- 用
addTextShape()写多行文字却没换行符 → 全挤在一行,超出边界也不自动折行 - 用
createRichTextShape()后忘了调$textRun->addText()→ 幻灯片上啥也不显示 - 设了字体但没调
$shape->getActiveParagraph()->getFont()->setName()→ 字体设置被忽略
示例(添加带样式的说明文字):
在原版的基础上做了一下修正评论没有提交正文的问题特价商品的调用连接问题去掉了一个后门补了SQL注入补了一个过滤漏洞浮动价不能删除的问题不能够搜索问题收藏时放入购物车时出错点放入购物车弹出2个窗口修正主题添加问题商家注册页导航连接问题销售排行不能显示更多问题热点商品不能显示更多问题增加了服务器探测 增加了空间使用查看 增加了在线文件编辑增加了后台管理里两处全选功能更新说明:后台的部分功能已经改过前台
$shape = $slide->createRichTextShape();
$shape->setHeight(100)->setWidth(300)->setOffsetX(50)->setOffsetY(80);
$textRun = $shape->createTextRun('注意:此项需人工复核');
$textRun->getFont()->setName('Microsoft YaHei')->setSize(14)->setColor(new Color('FF333333'));
中文乱码或文字不显示的三个关键点
不是编码问题,而是字体、渲染上下文、XML 序列化三者没对齐。PHPPresentation 不嵌入字体,只写字体名,靠系统或 PowerPoint 自行匹配。
实操建议:
- 服务器环境无需中文字体,但生成的 PPTX 必须在有对应字体的设备上打开(比如设
SimSun,就在 Windows 打开;设Noto Sans CJK SC,macOS / Linux 更稳) - 避免用
mb_convert_encoding()多余转码 —— 输入字符串保持 UTF-8 即可,库内部不作编码转换 - 如果文字完全空白,检查
$shape->setHeight()是否太小(高度为 0 或负值会导致不可见) - 导出前务必调
$objWriter->save('output.pptx'),漏掉这步等于白写
性能与兼容性:生成 100 页 PPT 的实际瓶颈在哪
不是 CPU 或内存,而是 DOM 构建和 ZIP 封包。每页新增一个 RichTextShape,对象树就深一层,序列化时耗时非线性增长。Office 2016+ 能正常打开,但 LibreOffice Impress 常无法渲染 rich text 中的复杂样式(如嵌套颜色、垂直对齐)。
优化方向:
- 批量操作尽量复用
Shape对象,不要每页都createRichTextShape() - 纯说明文字优先用
addTextShape()+\n换行,比RichTextShape快 3–5 倍 - 生成后用
file_exists()+finfo_file()校验是否真输出了有效 ZIP 文件,避免静默失败 - PowerPoint for Web 不支持自定义字体渲染,中文说明文字会 fallback 到系统默认字体,样式可能丢失
最常被跳过的一步:没验证生成的 PPTX 能否被 ZipArchive::open() 正常打开 —— 很多“生成成功”其实是空 ZIP 或损坏包结构。










