使用python-pptx解决某些PowerPoint问题

个人经历,代码有Bug,请勿参考。

在PowerPoint里,每个图形都有长、宽、水平位置和垂直位置,并且,我们可以同时选中多个图形并且移动。但是,当你同时移动这些图形的时候,某些图形的位置会发生诡异的变化。比如,当我们将这些图形同时向上移动1厘米时,有些图形只会移动0.99厘米,有些则是恰好移动了1厘米。这会令我发疯。当我不可避免地同时移动一大堆图形时,我完全没有办法逐个去纠正它们的位置。我最多只能接受某个图形的位置或者长宽的小数部分是0.05或者0。

代码的作用是:判断某个图形(而非文本框)的位置或者长宽的小数部分是否能被0.05整除,或者说是否离“能被0.05整除”足够接近。如果是,则将完美的数字重新赋给这个属性。在PowerPoint内部,每1厘米等于360000个内部单位。请自行转换。

from pptx import Presentation
from pptx.util import Inches, Cm
from pptx.enum.shapes import MSO_SHAPE_TYPE

# 判断能否被0.05整除,在ppt里,1厘米等于360000个单位,所以0.05厘米就是18000个单位,容差为2700个单位,即为15%
# 为什么要被0.05整除?因为本人患有晚期强迫症,ppt里每个图形的长宽和位置都必须以0.05厘米为间隔
def is_divisible_by_0_05(number):
    if number % 18000 <= 2700 or number % 18000 >= 15300:
        return True
    else:
        return False

if __name__ == "__main__":
    pptx_file = "flowchart.pptx" # pptx文件名
    prs = Presentation(pptx_file) # 创建pptx对象
    print('---------------------------------------')
    for slide in prs.slides: # 遍历每张幻灯片
        for shape in slide.shapes: # 遍历每个图形
            if shape.shape_type == MSO_SHAPE_TYPE.AUTO_SHAPE or shape.shape_type == MSO_SHAPE_TYPE.LINE or shape.shape_type == MSO_SHAPE_TYPE.TABLE: # 判断是否为图形或者线(箭头)或者表格,如果是才继续
                # 判断水平位置
                if is_divisible_by_0_05(shape.left):
                    print('before is: ', shape.left / 360000)
                    shape.left = round(shape.left / 18000) * 18000
                    print('after is : ', shape.left / 360000)
                    print('')
                else:
                    print('error')
                    print(shape.left / 18000)
                    input()
                # 判断垂直位置
                if is_divisible_by_0_05(shape.top):
                    print('before is: ', shape.top / 360000)
                    shape.top = round(shape.top / 18000) * 18000
                    print('after is : ', shape.top / 360000)
                    print('')
                else:
                    print('error')
                    print(shape.top / 18000)
                    input()
                # 判断宽
                if is_divisible_by_0_05(shape.width):
                    print('before is: ', shape.width / 360000)
                    shape.width = round(shape.width / 18000) * 18000
                    print('after is : ', shape.width / 360000)
                    print('')
                else:
                    print('error')
                    print(shape.width / 18000)
                    input()
                # 判断高
                if is_divisible_by_0_05(shape.height):
                    print('before is: ', shape.height / 360000)
                    shape.height = round(shape.height / 18000) * 18000
                    print('after is : ', shape.height / 360000)
                else:
                    print('error')
                    print(shape.height / 18000)
                    input()
                print('---------------------------------------')
    prs.save('mod_' + pptx_file) # 保存为新文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值