【问题标题】:Is it possible to combine two or more powerpoints using python-pptx?是否可以使用 python-pptx 组合两个或多个 powerpoint?
【发布时间】:2020-03-25 13:13:16
【问题描述】:

我正在尝试合并 powerpoint 幻灯片,但我不知道该怎么做。我发现了一个看起来很有希望的 python 模块 pptx。我尝试将幻灯片内容从 2 个 powerpoint 复制到一个新的 powerpoint。但是我遇到了很多问题,比如如何获取现有的幻灯片布局或形状(包括图片、自动形状等所有形状)的高度、宽度、位置。我查看了Python-pptx: copy slide 上的 python-pptx 示例。我尝试做类似的事情,但没有奏效。

这是我的代码:

from pptx import Presentation

prs1 = Presentation("C:/Users/number/Documents/Test1.pptx")
prs2 = Presentation("C:/Users/number/Documents/Test2.pptx")

slidelst = []
for layout in prs2.slide_layouts:
    slidelst.append(prs1.slides.add_slide(layout))

index = 0
for slide in slidelst:
    for shape in prs2.slides[prs2.slides.index(slide)].shapes:
        slide.shapes._spTree.insert_element_before(shape.element, 'p:extLst')
    index+=1

prs1.save("C:/Users/I505168/Documents/newpresentation.pptx")

我得到错误:

Traceback (most recent call last):
  File "C:\Users\I505168\Desktop\testpptx.py", line 12, in <module>
    for shape in prs2.slides[prs2.slides.index(slide)].shapes:
  File "C:\Users\I505168\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pptx\slide.py", line 315, in index
    raise ValueError("%s is not in slide collection" % slide)
ValueError: <pptx.slide.Slide object at 0x03B53A50> is not in slide collection

预期结果是两张单独的幻灯片合并为一张幻灯片。

【问题讨论】:

  • 嗨!我很想知道您是否最终找到了一种编程方式来做到这一点。
  • 目前不支持从其他演示文稿复制幻灯片。 python-pptx.readthedocs.io/en/latest/user/…
  • @kingofjong 你解决问题了吗。如果是的话,你能分享一下解决方案吗

标签: python python-pptx


【解决方案1】:

我能够通过使用 python 和 win32com.client 来解决这个问题,也许这不是您所需要的,因为它会启动 Microsoft Powerpoint 并将幻灯片从输入文件复制并粘贴到输出文件。然后关闭 PowerPoint 应用程序。如果此方法对您有用,这里是link 我对另一个问题的回答。

【讨论】:

    【解决方案2】:

    在 python 中组合 PowerPoint 演示文稿的另一种解决方案是 GroupDocs.Merger Cloud SDK for Python。它是一个 REST API 解决方案,不依赖任何第三方应用程序/工具。目前,它结合了来自云存储(GroupDocs 内部存储、Amazon S3、DropBox、Google Drive Storage、Google Cloud Storage、Windows Azure Storage 和 FTP Storage)的文件。但是,我们计划在不久的将来合并来自请求正文(流)的文件。

    P.S:我是 GroupDocs 的开发布道者。

    # Import module
    import groupdocs_merger_cloud
    from shutil import copyfile
    
    # Get your client Id and Secret at https://dashboard.groupdocs.cloud (free registration is required).
    clientid = "xxxxx-xxxx-xxxx-xxxx-xxxxxxxx"
    clientsecret = "xxxxxxxxxxxxxxxxxxxxxxxxx"
    
    # Create instance of the API
    documentApi = groupdocs_merger_cloud.DocumentApi.from_keys(clientid, clientsecret)
    file_api = groupdocs_merger_cloud.FileApi.from_keys(clientid, clientsecret)
    
    try:
    
        #upload source files to default storage
        filename1 = 'C:/Temp/test.pptx'
        remote_name1 = 'slides/test.pptx'
        filename2 = 'C:/Temp/three-slides.pptx'
        remote_name2 = 'slides/three-slides.pptx'
    
        output_name= 'slides/joined.pptx'
    
    
        request_upload1 = groupdocs_merger_cloud.UploadFileRequest(remote_name1,filename1)
        response_upload1 = file_api.upload_file(request_upload1)
        request_upload2 = groupdocs_merger_cloud.UploadFileRequest(remote_name2,filename2)
        response_upload2 = file_api.upload_file(request_upload2)
     
        item1 = groupdocs_merger_cloud.JoinItem()
        item1.file_info = groupdocs_merger_cloud.FileInfo(remote_name1)
        item2 = groupdocs_merger_cloud.JoinItem()
        item2.file_info = groupdocs_merger_cloud.FileInfo(remote_name2)
     
        options = groupdocs_merger_cloud.JoinOptions()
        options.join_items = [item1, item2]
        options.output_path = output_name
     
        result = documentApi.join(groupdocs_merger_cloud.JoinRequest(options))
    
            
        #Download Document from default Storage        
        request_download = groupdocs_merger_cloud.DownloadFileRequest(output_name)
        response_download = file_api.download_file(request_download)
           
        copyfile(response_download, 'C:/Temp/joined.pptx')
        print("Result {}".format(response_download))
            
    except groupdocs_merger_cloud.ApiException as e:
            print("Exception when converting document: {0}".format(e.message))
    
    

    【讨论】:

      【解决方案3】:

      我为两个特定的 pptx 做了这个解决方案

      from pptx import Presentation
      import os
      
      
      prs1 = Presentation("Esempio.pptx")
      prs2 = Presentation("Example.pptx")
      for slide in prs2.slides:
          sl = prs1.slides.add_slide(prs1.slide_layouts[1])
          sl.shapes.title.text = slide.shapes.title.text
          sl.placeholders[1].text = slide.placeholders[1].text
      prs1.save("Esempio_Example.pptx")
      

      这适用于文件夹中的所有 pptx

      from pptx import Presentation
      import os
      import glob
      
      
      pres = glob.glob("*.pptx")
      prs1 = Presentation(pres[0])
      # prs2 = Presentation("Example.pptx")
      for presentation in pres[1:]:
          pres = Presentation(presentation)
          for slide in pres.slides:
              sl = prs1.slides.add_slide(prs1.slide_layouts[1])
              sl.shapes.title.text = slide.shapes.title.text
              try:
                  sl.placeholders[1].text = slide.placeholders[1].text
              except:
                  sl.placeholders[1].image = slide.placeholders[1].image
          prs1.save("all_together.pptx")
      

      【讨论】:

        猜你喜欢
        • 2011-12-12
        • 2015-07-18
        • 2017-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-05
        • 2015-07-30
        • 2017-03-28
        相关资源
        最近更新 更多