首頁 > 軟體

python實現pptx批次向PPT中插入圖片

2022-02-11 22:00:40

專案背景

實驗結果拍攝了一組圖片,數量較大,想要按順序組合排版,比較簡單的方式是在PPT中插入圖片進行排版。但是PPT批次插入圖片後,順序打亂且不顯示圖片名稱,每個圖片單獨調整位置和大小費時費力,於是想到使用工具批次操作。過去了解過python自動化辦公模組,相對來說python也是簡單易用的語言,專案預計不會耗費太大精力,故嘗試學習實踐一番。(非專業學習筆記分享,望各位大佬不吝指導!)

資料為16組實驗,每組實驗重複兩次,共32個圖片,所有圖片為正方形,
命名方式為:
1.png,1-5.png,2.png,2-5.png … … … … 16.png,16-5.png
需嚴格按照順序排列

基礎

安裝

pip install python-pptx

依賴

Python 2.6, 2.7, 3.3, 3.4, or 3.6

lxml

Pillow

XlsxWriter (to use charting features)

基礎操作程式碼概覽:

import collections.abc
from pptx import Presentation, util

prs = Presentation() # 範例化一個ppt簡報物件

blank_slide_layout = prs.slide_layouts[6] # 範例化空白模板
slide = prs.slides.add_slide(blank_slide_layout) # 向檔案中新增空白頁面 

img_path = './1.png' # 圖片路徑
# 設定圖片的位置和大小 
left = util.Cm(0)
top = util.Cm(0)
width = util.Cm(4)
height = util.Cm(4)
# 在頁面中插入圖片
pic = slide.shapes.add_picture(img_path, left, top, width, height)

prs.save('自動生成的ppt.pptx') # 儲存為檔案

第一步:建立一個PPT檔案

from pptx import Presentation

prs = Presentation()  # 範例化一個ppt簡報物件
# 中間補充具體操作新增內容
prs.save('自動生成的ppt.pptx') # 儲存為檔案

此時踩了第一個坑,執行結果報錯:
AttributeError: module 'collections' has no attribute 'Container'
原因是python 3.10版本支援問題,此時在開頭多匯入一個依賴包collections.abc即可解決。

import collections.abc

第二步:新建頁面

prs.slide_layouts是Presentation物件的預設頁面模板,是一個陣列,共11個,可通過迴圈檢視所有預設頁面模板。
prs.slides.add_slide( )方法可向檔案中新增模板頁面。預設第7個模板為空白頁面。

n = len(prs.slide_layouts)
print("頁面模板數量:", n)
for i in range(n):
	slide_layout = prs.slide_layouts[i] # 範例化模板頁面
	slide = prs.slides.add_slide(slide_layout) # 向檔案中新增模板頁面

單獨新增一個空白頁面僅需如下程式碼:

blank_slide_layout = prs.slide_layouts[6] # 範例化空白模板頁面
slide = prs.slides.add_slide(blank_slide_layout) # 向檔案中新增空白頁面

第三步:新增圖片

新增圖片可使用如下方法,

pic = slide.shapes.add_picture(img_path, left, top, width, height)

位置和大小屬性預設為英制單位EMU,可轉化為釐米,用如下方法定義:

from pptx import util

img_path = './1.png' # 圖片路徑
left = util.Cm(0)
top = util.Cm(0)
width = util.Cm(4)
height = util.Cm(4)

此時便可得到一個在左上角插入圖片的頁面。

加億點點細節

1. 改變幻燈片頁面大小

預設生成的頁面大小為 4 : 3 大小的頁面畫布,可通過修改Presentation物件的屬性改變大小,如下:

prs.slide_width = util.Cm(32)
prs.slide_height = util.Cm(18)

2. 根據需要排列圖片位置

# 讀取圖片列表
pic_list = []
for i in listdir():
	if  '.png'  in i:
		pic_list.append(i)
print('圖片列表:n', pic_list)

# 設定圖片的大小
width = util.Cm(4)
height = util.Cm(4)

for p in pic_list:
	# 圖片路徑
	img_path = './' + p
	# 設定圖片位置
	n = pic_list.index(p)
	if n < 16:
		if  '-'  not  in p:
			top = util.Cm(0)
			left = util.Cm((n - 1) * 2)
		else:
			top = util.Cm(5)
			left = util.Cm(n * 2)
	else:
		if  '-'  not  in p:
			top = util.Cm(10)
			left = util.Cm((n - 17) * 2)
		else:
			top = util.Cm(15)
			left = util.Cm((n - 16) * 2)

# 在頁面中插入圖片
pic = slide.shapes.add_picture(img_path, left, top, width, height)

最終程式碼

import collections.abc
from pptx import Presentation, util
from os import listdir

# 範例化一個ppt簡報物件
prs = Presentation()
# 調整頁面大小
prs.slide_width = util.Cm(32)
prs.slide_height = util.Cm(19)
# 範例化空白模板
blank_slide_layout = prs.slide_layouts[6]
# 向檔案中新增空白頁面
slide = prs.slides.add_slide(blank_slide_layout)

# 讀取圖片列表
pic_list = []
for i in listdir():
	if  '.png'  in i:
		pic_list.append(i)
print('圖片列表:n', pic_list)

# 設定圖片的大小
width = util.Cm(4)
height = util.Cm(4)

for p in pic_list:
	# 圖片路徑
	img_path = './' + p
	# 設定圖片位置
	n = pic_list.index(p)
	if n < 16:
		if  '-'  not  in p:
			top = util.Cm(0)
			left = util.Cm((n - 1) * 2)
		else:
			top = util.Cm(5)
			left = util.Cm(n * 2)
	else:
		if  '-'  not  in p:
			top = util.Cm(10)
			left = util.Cm((n - 17) * 2)
		else:
			top = util.Cm(15)
			left = util.Cm((n - 16) * 2)
# 在頁面中插入圖片
pic = slide.shapes.add_picture(img_path, left, top, width, height)

# 儲存為檔案
prs.save('自動生成的ppt.pptx')

專案結果圖

總結

到此這篇關於python實現pptx批次向PPT中插入圖片的文章就介紹到這了,更多相關python pptx向PPT插圖片內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com