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

这篇具有很好参考价值的文章主要介绍了使用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中每一页的字体

Python修改

1、可以修改字体、大小、是否加粗
2、图形、图表、表格的汉字还不能修改,需要下一步增加该功能

函数如下:

def change_ppt_font(ppt_file, new_font,new_size=None,bold=None,line_spacing=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:
                    if line_spacing is not None:
                        paragraph.line_spacing = line_spacing
                    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("字体修改完毕!")

以上代码只能修改文本框,因为图形是个msogroup对象。如果要修改图形中的字体需要用VBA。alt+F11 插入模块,复制以下代码 按F5
代码来自网上已有代码的整合。
注意:以下代码依然不能修改 图表 chart中的文本

VBA修改,修改文本框和图表字体为微软雅黑(常用)

Sub SetTextFontToYahei()

    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
            
End Sub

Sub ChangeTableFontInAllSlides()
Dim oSlide As Slide
Dim oShape As Shape
Dim oTable As Table
Dim oRow As Row
Dim oCell As Cell
Dim oTxtRange As TextRange

On Error Resume Next
For Each oSlide In ActivePresentation.Slides
For Each oShape In oSlide.Shapes
If oShape.HasTable Then ' 处理表格中的文本
Set oTable = oShape.Table
For Each oRow In oTable.Rows
For Each oCell In oRow.Cells
If oCell.Shape.HasTextFrame Then
Set oTxtRange = oCell.Shape.TextFrame.TextRange

With oTxtRange.Font
'──────────────────────────────
'修改为您所需的字体名称
.Name = "微软雅黑"
'.Size = 20    修改为您所需的字体大小
'.Color.RGB = RGB(255, 0, 0)  修改为您所需的字体颜色
'.Bold = True  修改为您所需的是否加粗
'.Italic = False  修改为您所需的是否倾斜
'.Underline = False  修改为您所需的是否有下划线
'──────────────────────────────
End With

End If
Next oCell
Next oRow
End If
Next oShape
Next oSlide
MsgBox "文本框和图表修改完成"
End Sub

VBA代码库

以下代码更全面可以修改表格和图形的,但是不能修改图表的和文本框聚合的图形中的文字。

Sub ChangeFontInAllSlides()

Dim oSlide As Slide

Dim oShape As Shape

Dim oTable As Table

Dim oRow As Row

Dim oCell As Cell

Dim oTxtRange As TextRange

On Error Resume Next

For Each oSlide In ActivePresentation.Slides

For Each oShape In oSlide.Shapes

If oShape.HasTextFrame Then ' 处理文本框中的文本

Set oTxtRange = oShape.TextFrame.TextRange

With oTxtRange.Font

'──────────────────────────────

.Name = "Arial" ' 修改为您所需的字体名称

.Size = 20 ' 修改为您所需的字体大小

.Color.RGB = RGB(255, 0, 0) ' 修改为您所需的字体颜色

.Bold = True ' 修改为您所需的是否加粗

.Italic = False ' 修改为您所需的是否倾斜

.Underline = False ' 修改为您所需的是否有下划线

'──────────────────────────────

End With

End If

If oShape.HasTable Then ' 处理表格中的文本

Set oTable = oShape.Table

For Each oRow In oTable.Rows

For Each oCell In oRow.Cells

If oCell.Shape.HasTextFrame Then

Set oTxtRange = oCell.Shape.TextFrame.TextRange

With oTxtRange.Font

'──────────────────────────────

.Name = "Arial" ' 修改为您所需的字体名称

.Size = 20 ' 修改为您所需的字体大小

.Color.RGB = RGB(255, 0, 0) ' 修改为您所需的字体颜色

.Bold = True ' 修改为您所需的是否加粗

.Italic = False ' 修改为您所需的是否倾斜

.Underline = False ' 修改为您所需的是否有下划线

'──────────────────────────────

End With

End If

Next oCell

Next oRow

End If

Next oShape

Next oSlide

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("文本提取完毕!")

三、PPT插入图片和修改位置

1、Python PPT插入图片 —推荐

1、使用get_image_list(img_dir)函数获取PPT文件路径列表,方便对列表操作以控制插入PPT的图片的顺序,如对列表进行翻转、排序等,可以让图片反序、按一定序列插入PPT。
2、使用create_ppt_with_images函数将图片插入PPT,其中slide.shapes.add_picture(img_file, left, top, width, height)代码进行插入,img_file是要插入的图片, left, top, width, height是插入的坐标和大小,left, top表示插入位置,手工设定。 width, height是插入图片的大小,可以手工设定也可以通过 width ,height = prs.slide_width, prs.slide_height的方式获取幻灯片的大小,然后按比例输入图片的大小。文章来源地址https://www.toymoban.com/news/detail-716039.html

import os
from pptx import Presentation
from pptx.util import Inches


def get_image_list(img_dir):
    """
    读取文件夹中的图片文件名并返回一个列表。
    """
    img_files = os.listdir(img_dir)
    img_path = [os.path.join(img_dir, f)  for f in img_files if f.endswith('.jpg') or f.endswith('.png')]  # 你可以根据需要修改这里,只选择你需要的图片格式
    return  img_path


def create_ppt_with_images(img_list, output_ppt_path):
    """
    将给定的图片列表按顺序插入到一个新的PPT演示文稿中。
    """
    prs = Presentation()
    for i, img_file in enumerate(img_list):
        slide = prs.slides.add_slide(prs.slide_layouts[6])  # 使用标题和内容布局,你可以根据需要选择其他布局
        # 设置图片位置和大小,使其铺满整个幻灯片
        left = top = 0
        width ,height = prs.slide_width, prs.slide_height
        pic = slide.shapes.add_picture(img_file, left, top, width, height)
    prs.save(output_ppt_path)

if __name__ == '__main__':
    # 请将 'path_to_your_images' 替换为你的图片文件夹路径,将 'output.pptx' 替换为你想要保存PPT的路径和文件名
    path_img=r"xx"
    path_out=r"output.pptx"
    list_img=get_image_list(path_img)
    create_ppt_with_images(list_img,path_out)

2、VBA PPT插入图片

Sub InsertPicturesToPPT()
  Dim sld As Slide
  Dim shp As Shape
  Dim i, count, numPicturePerSlide, curSlide As Long
  Dim slideWidth, slideHeight As Single
  Dim autoAddSlide As Boolean

  curSlide = ActiveWindow.View.Slide.SlideIndex

  '用这个变量设置每页 PPT 要插入的图片数量
  numPicturePerSlide = 1
  '用这个变量设置是否在页数不足时自动添加新的 PPT 页来插入所有选中的图片,设置为 False 来取消该功能
  autoAddSlide = True

  fd = Split(FileDialogOpen, vbLf)
  If Left(fd(0), 1) = "-" Then
    Debug.Print "Canceled"
    Exit Sub
  End If

  slideWidth = ActivePresentation.PageSetup.slideWidth
  slideHeight = ActivePresentation.PageSetup.slideHeight

  If autoAddSlide Then
    If (ActivePresentation.Slides.count - curSlide + 1) * numPicturePerSlide < UBound(fd) - LBound(fd) + 1 Then
      total = Int((UBound(fd) - LBound(fd) + 1) / numPicturePerSlide - ActivePresentation.Slides.count + curSlide - 1 + 0.5)
      For i = ActivePresentation.Slides.count + 1 To ActivePresentation.Slides.count + total
        ' 在末尾添加空白页
        'ActivePresentation.Slides.Add i, ppLayoutBlank
        ' 在当前页之后添加空白页
        ' ActivePresentation.Slides.Add curSlide, ppLayoutBlank
        ' ActivePresentation.Slides(curSldie - 1).Select
        ' 在当前页之后复制当前页
        ActivePresentation.Slides(curSlide).Duplicate
      Next i
    End If
  End If

  count = 0
  For Each sld In ActivePresentation.Slides
    ' 跳过隐藏的 PPT 页,并跳过在当前页之前的页
    Debug.Print sld.SlideIndex & " >= " & curSlide
    If sld.SlideShowTransition.Hidden = msoFalse And sld.SlideIndex >= curSlide Then
      If count + LBound(fd) > UBound(fd) Then
        ' No picture to insert
        Exit For
      End If

      For i = 1 To numPicturePerSlide
        If count + LBound(fd) <= UBound(fd) Then
          Set shp = sld.Shapes.AddPicture( _
            FileName:=fd(count + LBound(fd)), _
            LinkToFile:=msoFalse, _
            SaveWithDocument:=msoTrue, _
            Left:=0, _
            Top:=0, _
            Width:=-1, _
            Height:=-1 _
          )
          With shp
            .LockAspectRatio = msoTrue  ' 锁定纵横比
            '.ScaleHeight 0.75, msoTrue
            .Left = slideWidth / numPicturePerSlide * i - .Width / 2
            .Top = (slideHeight - .Height) / 2
            '.ZOrder msoSendToBack   ' 将图片设置为最底层
          End With
          count = count + 1
        Else
          Exit For
        End If
      Next i
    End If
  Next sld

  'MsgBox "Processing finished. Inserted (" & count & ") pictures in total"
  MsgBox "插入图片完成,共插入 " & count & " 张图片"

End Sub

Function FileDialogOpen() As String

  #If Mac Then
    ' 默认路径
    mypath = MacScript("return (path to desktop folder) as String")

    sMacScript = "set applescript's text item delimiters to "","" " & vbNewLine & _
    "try " & vbNewLine & _
    "set theFiles to (choose file of type {""png"", ""jpg"", ""jpeg"", ""svg"", ""tiff"", ""gif""}" & _
    "with prompt ""请选择一个或多个要插入的图片"" default location alias """ & _
    mypath & """ multiple selections allowed true)" & vbNewLine & _
    "set applescript's text item delimiters to """" " & vbNewLine & _
    "on error errStr number errorNumber" & vbNewLine & _
    "return errorNumber " & vbNewLine & _
    "end try " & vbNewLine & _
    "repeat with i from 1 to length of theFiles" & vbNewLine & _
    "if i = 1 then" & vbNewLine & _
    "set fpath to POSIX path of item i of theFiles" & vbNewLine & _
    "else" & vbNewLine & _
    "set fpath to fpath & """ & vbNewLine & _
    """ & POSIX path of item i of theFiles" & vbNewLine & _
    "end if" & vbNewLine & _
    "end repeat" & vbNewLine & _
    "return fpath"

    FileDialogOpen = MacScript(sMacScript)

  #Else
    With Application.FileDialog(msoFileDialogOpen)
      .AllowMultiSelect = True
      .Title = "请选择要一个或多个要插入的图片"
      .Filters.Add "图片", "*.png; *.jpg; *.jpeg; *.svg; *.tiff; *.gif", 1
      If .Show = -1 Then
        FileDialogOpen = ""
        For i = 1 To .SelectedItems.count
          If i = 1 Then
            FileDialogOpen = .SelectedItems.Item(i)
          Else
            FileDialogOpen = FileDialogOpen & vbLf & .SelectedItems.Item(i)
          End If
        Next
      Else
        FileDialogOpen = "-"
      End If
    End With

  #End If
End Function

3、PPT中图片修改位置

Sub test()
'获取所有ppt页面
For Each currentSlide In ActivePresentation.Slides '循环每个页面
    For Each shp In currentSlide.Shapes
      'type = 13是图片  17是文本框
      If shp.Type = 13 Then
       shp.Top = 10 '设置top位置
       shp.Left = 10  '设置left位置
        shp.Height = 10000 '设置图片高度位置
        shp.Width = 600
        End If
    Next shp
 
Next currentSlide

End Sub

到了这里,关于使用Python批量修改PPT字体和提取全部文字到word的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 批量修改文件名-txt_word_ppt批量修改文件名

    word/excel/ppt等等批量修改文件名 批量修改文件名的方法有N多种,我的这种是比较简单的,小白也可以使用 使用windows自带的批处理脚本进行批量重命名 什么类型的文件批量修改原理都一样,这里以txt修改为例 通过py脚本快速创建文件测试,这步是创建100个txt文件,这步不重要,因为我

    2024年01月16日
    浏览(95)
  • 免费,开源,可批量的离线图片文字提取软件OCR

    免费,开源,可批量的离线OCR软件 适用于 Windows7 x64 及以上 免费 :本项目所有代码开源,完全免费。 方便 :解压即用,离线运行,无需网络。 批量 :可批量导入处理图片,结果保存到本地 txt / md / jsonl 多种格式文件。也可以即时截屏识别。 高效 :采用 PaddleOCR-json C++ 识别

    2024年02月07日
    浏览(59)
  • 【Unity编辑器扩展】字库裁剪工具, 优化字体文件大小,批量修改文本组件字体

    原理: 1. 扫描项目中用到的字符集; 2. 把字体文件裁剪掉没用到的字符,仅保留项目中用到的字符; 3. 生成裁剪后的字体文件; 工具功能设计: 1. 支持通过拖拽字体文件或文件夹批量选择需要裁剪的字体文件。 2. 扫描工程中使用到的字符集:主要是获取prefab中Text、TextM

    2024年02月15日
    浏览(47)
  • 【办公自动化】使用Python批量生成PPT版荣誉证书

    🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 目录 一、Python处理PPT 二、批量生成PPT版荣誉证书  三、往期推荐           使用Python处

    2024年02月12日
    浏览(45)
  • AD18批量修改一部分或者全部器件位号的方法!

           现在任何一个公司嵌入式硬件开发的主板全都是有很多sheet的,而硬件工程师做的往往也都是在老的图纸上进行修改或者再设计,也正因为如此,我们在画原理图的时候尽量不要去改动已有部分的位号,以免PCB工程师骂人! 就算自己画PCB的时候也会晕头转向!      

    2024年01月17日
    浏览(35)
  • 【批量区域识别内容重命名】批量识别图片区域文字并重命名,批量图片部分识别内容重命文件,PDF区域识别提取重命名

    我们在工作和生活中经常遇到这样的需求:比如将以下的图片区域识别进行重命名,批量识别后改成以时间和工作内容重命名,便于日后检索,快速查询 首先我们拍摄照片用到的是水印相机,这里的文字呢我们需要加个背景,这样在文字识别就很容易的被识别,准确率也非常

    2024年04月25日
    浏览(51)
  • [Qt学习笔记]Halcon窗口界面上显示文字的字体尺寸、样式修改

    养成良好的查资料习惯,可以实现事半功倍。 在Halcon12中,有set_font和set_display_font两个算子,其中set_display_font是本地函数形式,所以最终的实现算子为set_font. 按照不同的系统环境下,使用方法略有不同: 不同的系统下使用的方法不同,原本以为比较简单,直接按照文档的

    2024年03月20日
    浏览(55)
  • 【PCB专题】如何在Allegro中定义字体及批量修改丝印

    在PCB板上丝印往往包含了很多信息,比如元件边界、元件参数、元件编号、极性、静电标识、板号等,这些信息在生产、测试及后期维护等都需要使用。一个好的设计往往都能从丝印的布局、丝印的完整性上体现出来。如下所示PCB在电解电容旁有极性丝印、电阻旁有电阻的位

    2024年02月16日
    浏览(50)
  • 【Python 实战】---- 批量识别图片中的文字,存入excel中【使用百度的通用文字识别】

    1. 获取信息图片示例 2. 运行实例 3. 运行结果 4. 各个文件的位置 1. 需求分析 识别图片中的文字【采用百度的通用文字识别】; 文字筛选,按照分类获取对应的文本; 采用 openpyxl 实现将数据存入 excel 中。 2. 获取 access_token 获取本地缓存的

    2024年02月15日
    浏览(49)
  • 基于Tesseract模块Python实现提取图片中的文字信息(安装+使用教程)

    Python实现提取图片中的文字可以使用Optical Character Recognition (OCR) 技术来解决。OCR是指将图像中的文本转换成可编辑的文本的过程。Python有许多OCR库,但最流行和最广泛使用的是Tesseract库。 下面是一个使用Python和Tesseract来提取图像中的文本的简单示例代码。 OCR,即光学字符识

    2024年02月05日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包