个人经历,代码有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) # 保存为新文件