【问题标题】:Creating a hyperlink to other slides in the same PowerPoint document在同一 PowerPoint 文档中创建指向其他幻灯片的超链接
【发布时间】:2020-01-17 05:27:25
【问题描述】:

我正在寻找一种方法来在同一个 PPTX 文档中添加指向其他幻灯片的超链接,使用 python-pptx 自动执行。下面是我的测试,没有用。在线搜索暗示了一些使用 ActionSetting、part、target_slide、rels、rPr.add_ihlinkClick 等的解决方案,但我无法完全理解将这些组合在一起。

基本上,期望的结果是创建一个文本,该文本将通过幻灯片编号或幻灯片 ID(如果存在)跳转到任何其他幻灯片

    p = table.rows[1].cells[1].text_frame.paragraphs[0]
    r = p.add_run()
    r.text = "Testing"
    r.hyperlink.address = "/ppt/slides/rels/slide1.xml"

【问题讨论】:

  • 你能详细说明“没有工作”吗?
  • 通过 PowerPoint 的对象模型(这在 python 中可能不一样),您将超链接的.SubAddress 属性分配为基于slide.SlideIDslide.SlideNumberslide.Name 的逗号分隔字符串, slide.SlideIndex.
  • 谢谢。为此,我可能会考虑使用 COM 自动化来补充 python-pptx。提供的答案建议直接用于 XML 操作,我还不习惯

标签: python python-pptx


【解决方案1】:

看起来python-pptx 中的ActionSetting 位目前是只读的。因此,您正在寻找的内容没有直接的 API 支持。如果你想编写这些,你需要编写一个扩展/解决方法。

这里对动作设置功能空间进行了非常可靠的分析: http://python-pptx.readthedocs.io/en/latest/dev/analysis/shp-hyperlink.html

如果我没记错的话,唯一真正的技巧是获取目标幻灯片的内部目标“URL”。我将使用 PowerPoint UI 手动创建一个内部链接,并使用opc-diag 检查它生成的 XML。即使不能解决一般情况,找到可行的方法也可能非常简单。

【讨论】:

  • 使用 UI 创建并在查看幻灯片文件夹中的 XML 文件时观察到这一点。似乎没有可用的内部链接?
  • @idazuwaika 这是超链接(点击操作)元素。它通过r:id="rId2" 属性链接到relationship 元素。因此,您必须查看幻灯片的 rels 部分并找到具有匹配 r:id 的关系。 rels 文件部分名称与幻灯片相同,附加了“.rels”,因此类似于slide1.xml.rels。这就是在 Target 属性中找到实际 URL 的位置。
  • 谢谢。看起来我将不得不花一些时间来更详细地了解 PPTX 格式。我需要的很多解决方案都依赖于这种直接的 XML 操作。
  • 嘿@scanny 不想为任意的东西打开一个新问题 - 但你能从 pptx 中删除超链接吗?我需要对来自 PowerBI 的样板 pptx 进行相同的编辑,这需要我调整图像大小并删除超链接 - 我需要为 40 多个页面执行此操作,但我无法仅使用 .xml.rels 的 XML 进行编辑扔给我
  • 这真的是一个单独的问题@Datanovice。如果您创建一个新问题并用python-pptx 标签标记它,我会看看。
【解决方案2】:

您也可以通过使用 shape.click_action 来“作弊”(作为形状,您可以简单地使用包含文本框的形状):

    def create_hyperlink(run, shape, to_slide):
        shape.click_action.target_slide = to_slide
        run.hyperlink.address = shape.click_action.hyperlink.address
        run.hyperlink._hlinkClick.action = shape.click_action.hyperlink._hlink.action
        run.hyperlink._hlinkClick.rId = shape.click_action.hyperlink._hlink.rId
        shape.click_action.target_slide = None

这就是它在 python-pptx-interface 中的完成方式(因为否则我无法获得正确的 rId ^^)。看看PPTXCreator.add_content_slide

【讨论】:

    猜你喜欢
    • 2014-04-17
    • 2012-08-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多