【问题标题】:How can I change the character spacing in pptx-python?如何更改 pptx-python 中的字符间距?
【发布时间】:2021-08-20 16:55:40
【问题描述】:

我尝试做的是更改函数中每次运行的间距:

def add_direction_arrows(self):
    global junc_file, junc_file_name
    match_colors_to_type = {"White": RGBColor(255, 255, 255), "Yellow": RGBColor(238, 233, 23)}
    arrows_placeholders = {"NORTH_ARROWS": self.NO.LAN.Organize_arrows_order(),
                           "SOUTH_ARROWS": self.SO.LAN.Organize_arrows_order(),
                           "EAST_ARROWS": self.EA.LAN.Organize_arrows_order(),
                           "WEST_ARROWS": self.WE.LAN.Organize_arrows_order()}
    for slide in junc_file.slides:
        for shape in slide.shapes:
            if shape.name in arrows_placeholders.keys():
                text_frame = shape.text_frame
                text_frame.clear()
                arrows_list = arrows_placeholders[shape.name]
                for arrow in arrows_list:
                    text_frame = shape.text_frame
                    p = text_frame.paragraphs[0]
                    run = p.add_run()
                    run.text = arrow[0] * arrow[1]
                    font = run.font
                    font.bold = False
                  ➜ font.spacing = -10
                    font.size = Pt(49.9)
                    font.color.rgb = match_colors_to_type[arrow[2]]
    junc_file.save(junc_file_name)

我不确定 python-pptx 库是否包含此选项,但如果没有,我还有哪些其他选项?可以自己添加吗?也许一种在PowerPoint中手动“按下按钮”的方法? 谢谢!

【问题讨论】:

    标签: python powerpoint spacing python-pptx kerning


    【解决方案1】:

    根据文档python-pptx 不支持间距。

    您可以深入了解该库的内部工作方式,并可能自己添加支持,但我怀疑这是否真的适合您。

    您当然可以稍后手动编辑 powerpoint 文件以更改它(甚至使用 VBA)。

    【讨论】:

    • 实际上,出于兴趣,我查看了源代码。只需添加几行代码,就可以将此选项添加到 Font 中。
    • 真的吗?关于我应该如何开始或在哪里寻找的任何建议?我没有很多经验...谢谢!
    • 好吧,在github repository 中有Font 类的定义(在text/text.py 中)。如您所见,它相当易读。 def size(self): 定义了一个属性。您基本上可以为spacing 属性复制相同的代码。它只需要设置和获取self._rPr.spc 而不是sz。尚未对其进行测试,但我敢打赌这将起作用。 this 对了解正在发生的事情很有帮助。它只是写一些 XML,没什么花哨的。
    • 好的,我按照你的建议做了;我将此添加到 text/text.py @property def spacing(self): sz = self._rPr.spc if sz is None: return None return Centipoints(sz) @spacing.setter def spacing(self, emu): if emu is None: self._rPr.spc = None else: sz = Emu(emu).centipoints self._rPr.spc = sz 我收到此错误:AttributeError: 'CT_TextCharacterProperties' object has no attribute 'spc' 我找不到关于它的解释,但感觉这几乎是解决方案......有什么想法吗?再次感谢!
    【解决方案2】:

    似乎不支持此类。作为一种解决方法,我使用以下 sn-p 在 shape.table 上下文中实现相同的目的。也许您可以通过替换前两行以获取文本框架 txBody 来查看文本运行的行为是否相同。

    def _set_char_spacing(cell):
        tc = cell._tc
        txBody = tc.get_or_add_txBody()
        if not len(txBody.p_lst) > 0:
          return cell
    
        p = txBody.p_lst[0] # NOTE: Using index 0 just for demo purposes
        r = p.r_lst[0] # NOTE: Using index 0 just for demo purposes
        if not r.rPr:
          rPr = r._add_rPr()
    
        spacing = Emu(40)
        rPr.attrib['spc'] = str(spacing)
        return cell
    

    作为免责声明,p_lst 和 r_lst 是需要迭代的列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 2016-10-07
      相关资源
      最近更新 更多