使用Python批量修改PPT字体和提取全部文字到word

目录

将一份PPT的每一页字体、大小、是否加粗都统一,是一个常见需求。特别是字体统一是高频、热点需求。在python操控PPT常用库python-pptx中有一个bug,对字体的修改只能修改数字和英文字母,无法修改汉字。即 run.font.namet属性只能修改英文和数字,并且 run.font.name识别的也是英文和数字的名称。如文本框中英文和数字是'Arial'汉字是宋体,则会返回'Arial'。因为这个包,没有针对汉字的API,而且这个包很久没更新了,开发者提供了解决思路是修改office文件的底层xml来实现,修改xml中的a:ea的typeface属性,网上已经有人用 pptx_ea_font 这个包实现了该功能。

首先安装对应的包

pptx和docx的包为,注意不是pptx和docx

复制代码
pip install python-pptx
pip install python-docx

pptx_ea_font 安装方法为

复制代码
pip install pptx_ea_font 

导入相应模块

复制代码
from pptx import Presentation
import pptx_ea_font
from docx import Document
from pptx.util import Cm, Pt

一、修改PPT中每一页的字体

1、可以修改字体、大小、是否加粗

2、图形、图表、表格的汉字还不能修改,需要下一步增加该功能

函数如下:

复制代码
#修改字体类型和大小
def change_ppt_font(ppt_file, new_font,new_size=None,bold=None):
    # 打开PPT文件
    presentation = Presentation(ppt_file)

    # 循环遍历每个slide
    for slide in presentation.slides:
        # 循环遍历slide中的每个shape
        for shape in slide.shapes:
            # 检查shape类型是否为文本框
            if shape.has_text_frame:
                # 获取文本框中的文字
                text_frame = shape.text_frame
                for paragraph in text_frame.paragraphs:
                    for run in paragraph.runs:
                        # 修改字体
                        pptx_ea_font.set_font(run,new_font)
                        #以下方法只能修改数字和英文
                        #run.font.name = new_font
                        if new_size :
                            run.font.size = Pt(new_size)
                        if bold is not None:
                            run.font.bold = bold

    # 保存修改后的PPT文件
    new_ppt_file = ppt_file.replace(".pptx", "_new.pptx")
    presentation.save(new_ppt_file)

    print("字体修改完毕!")

以上代码只能修改文本框,如果要修改图形中的字体需要用VBA。alt+F11 插入模块,复制以下代码 按F5

代码来自 TomasZh

注意:以下代码依然不能修改 图表 chart中的文本

复制代码
Sub SetAllFontToYahei()
''' set all fonts to 微软雅黑

    Dim sld As Slide
    Dim shp As Shape, chd As Shape
    Dim i&, j&
    
    For Each sld In ActivePresentation.Slides
        i = i + 1
        Debug.Print "Slide " & i
        
        For Each shp In sld.Shapes
            j = j + 1
            Debug.Print vbTab & "Shape " & j
        
            If shp.Type = msoGroup Then
                For Each chd In shp.GroupItems
                    If chd.HasTextFrame Then
                        chd.TextFrame.TextRange.Font.Name = "微软雅黑"
                        chd.TextFrame.TextRange.Font.NameFarEast = "微软雅黑"
                    End If
                Next
            ElseIf shp.HasTextFrame Then
                shp.TextFrame.TextRange.Font.Name = "微软雅黑"
                shp.TextFrame.TextRange.Font.NameFarEast = "微软雅黑"
            End If
        Next
    Next
        
    MsgBox "Task completed!"

End Sub

二、将文本框中的字都放到word里

复制代码
def extract_text_from_ppt(ppt_file, word_file):
    # 打开PPT文件
    presentation = Presentation(ppt_file)

    # 创建新的Word文档
    word_doc = Document()

    # 循环遍历每个slide
    for slide in presentation.slides:
        # 循环遍历slide中的每个shape
        for shape in slide.shapes:
            # 检查shape类型是否为文本框
            if shape.has_text_frame:
                # 获取文本框中的文字
                text_frame = shape.text_frame
                for paragraph in text_frame.paragraphs:
                    # 提取文本到Word中
                    word_doc.add_paragraph(paragraph.text)

    # 保存Word文档
    word_doc.save(word_file)

    print("文本提取完毕!")
相关推荐
橡晟4 小时前
深度学习入门:让神经网络变得“深不可测“⚡(二)
人工智能·python·深度学习·机器学习·计算机视觉
墨尘游子4 小时前
神经网络的层与块
人工智能·python·深度学习·机器学习
倔强青铜34 小时前
苦练Python第18天:Python异常处理锦囊
开发语言·python
企鹅与蟒蛇5 小时前
Ubuntu-25.04 Wayland桌面环境安装Anaconda3之后无法启动anaconda-navigator问题解决
linux·运维·python·ubuntu·anaconda
autobaba5 小时前
编写bat文件自动打开chrome浏览器,并通过selenium抓取浏览器操作chrome
chrome·python·selenium·rpa
Rvelamen6 小时前
LLM-SECURITY-PROMPTS大模型提示词攻击测评基准
人工智能·python·安全
【本人】6 小时前
Django基础(一)———创建与启动
后端·python·django
SHIPKING3937 小时前
【python】基于pygame实现动态粒子爱心
开发语言·python·pygame
kk_stoper8 小时前
如何通过API查询实时能源期货价格
java·开发语言·javascript·数据结构·python·能源
java1234_小锋8 小时前
【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 架构搭建
python·自然语言处理·flask