มอดูล python-pptx เป็นมอดูลในไพธอนที่มีไว้ใช้จัดการกับไฟล์ไมโครซอฟต์พาวเวอร์พอยต์ (ppt) โดยสามารถทำได้ทั้งสร้างไฟล์พาวเวอร์พอยต์ขึ้นมาใหม่ หรือเปิดไฟล์พาวเวอร์พอยต์ที่มีอยู่แล้วมาดูข้อมูลหรือตัดต่อแก้ไข
เพียงแต่ว่าสิ่งที่ python-pptx ทำได้นั้นก็มีขอบเขตอยู่จำกัด เช่นว่าไม่สามารถทำการแปลงไฟล์พาวเวอร์พอยต์ไปเป็นไฟล์ชนิดอื่นอย่างไฟล์ pdf หรือไฟล์รูปภาพได้ หากต้องการทำอะไรพวกนี้อาจเลือกใช้ win32com แทนได้ (อ่านวิธีใช้ได้ใน
https://phyblas.hinaboshi.com/20230228) แต่สำหรับงานที่ใช้ python-pptx ทำได้นั้น ใช้ python-pptx จะสะดวกกว่า
ในบทความนี้จะเขียนแนะนำวิธีการใช้งาน python-pptx ในเบื้องต้น
การติดตั้งและเริ่มใช้งาน เพื่อที่จะใช้งาน python-pptx ก่อนอื่นต้องติดตั้งก่อน ซึ่งก็ทำได้ง่ายโดยใช้ pip
pip install python-pptx
ส่วนในการใช้งานนั้น เวลา import จะเขียนเป็น
pptx
เฉยๆ ไม่ใช่
python-pptx
import pptx
เพียงแต่ว่าภายในมอดูลนี้มีชิ้นส่วนต่างๆยิบย่อยมากมาย โดยทั่วไปเวลาใช้งานนั้นมักจะ import แยกเอาส่วนที่ต้องการใช้ ตัวอย่างต่อไปที่จะเขียนนี้ก็จะใช้วิธีการแบบนี้เช่นกัน
การสร้างไฟล์พาวเวอร์พอยต์ขึ้นมาใหม่ เริ่มต้นจากการสร้างไฟล์ใหม่ขึ้นมาจาก 0 กันเลย
โดยทั่วไปแล้วทุกครั้งที่จะใช้งาน python-pptx นั้นจะเริ่มจากสร้างออบเจ็กต์คลาส
Presentation
ขึ้นมา ตัวออบเจ็กต์นี้จะแทนตัวไฟล์พาวเวอร์พอยต์ทั้งไฟล์ สามารถเอามาทำอะไรต่างๆเช่นเพิ่มสไลด์เข้าไปได้ เมื่อทำอะไรเสร็จแล้วหากต้องการให้บันทึกลงเป็นไฟล์ในเครื่องก็ใช้เมธอด
.save()
ตัวอย่างเช่น ลองเริ่มจากทำการสร้างพาวเวอร์พอยต์เปล่าขึ้นมาแล้วบันทึก ทำได้ดังนี้
from pptx import Presentation
prs = Presentation()
prs.save('พาวเวอร์พอยต์เปล่า.pptx')
เท่านี้ก็จะได้ไฟล์เปล่าๆที่ไม่มีสไลด์อยู่เลยแม้แต่แผ่นเดียวขึ้นมา สามารถลองเปิดไฟล์ขึ้นมาดูได้
การเปิดไฟล์พาวเวอร์พอยต์ที่มีอยู่ขึ้นมา ออบเจ็กต์คลาส
Presentation
นั้นเวลาที่สร้างขึ้นถ้าแค่ใส่วงเล็บเปล่าๆเฉยๆก็จะได้พาวเวอร์พอยต์เปล่าๆ แต่หากใส่พาธไฟล์ลงไปก็จะเป็นการเปิดไฟล์พาวเวอร์พอยต์ที่มีอยู่แล้วนั้นขึ้นมา
ตัวอย่างเช่นลองเปิดไฟล์พาวเวอร์พอยต์อะไรก็ได้ที่เตรียมไว้แล้วมาดูข้อมูลภายในสไลด์ได้
from pptx import Presentation
prs = Presentation('สไลด์ไม่ใช่สไลม์.pptx')
p = prs.core_properties
print(p.title) # ไตเติล
print(p.author) # ผู้สร้างไฟล์
print(p.created) # เวลาที่สร้างไฟล์
print(p.last_modified_by) # ผู้แก้ไฟล์ล่าสุด
print(p.modified) # เวลาที่แก้ไฟล์ล่าสุด
คุณสมบัติต่างๆของไฟล์พาวเวอร์พอยต์ที่เปิดขึ้นมานั้นจะถูกเก็บอยู่ในแอตทริบิวต์
.core_properties
สามารถดูข้อมูลได้ รวมถึงสามารถนำมาแก้แล้วบันทึกลงไฟล์ไปใหม่ก็ได้ แต่ว่าข้อมูลเหล่านี้ไม่ได้มีผลอะไรกับตัวสไลด์โดยตรง
ส่วนการดูข้อมูลในสไลด์หน้าต่างๆของไฟล์สามารถทำได้โดยไปที่แอตทริบิวต์
.slides
print(len(prs.slides)) # จำนวนสไลด์ที่มี
slide1 = prs.slides[0] # เมื่อต้องการจัดการทำอะไรกับสไลด์หน้าแรก
ไฟล์พาวเวอร์พอยต์แต่ละไฟล์จะประกอบไปด้วยหน้าสไลด์ต่างๆ ซึ่งในแต่ละหน้าก็จะมีส่วนประกอบย่อยลงไปอีก เวลาจัดการทำอะไรก็จะทำที่ตัวหน้านั้นๆ ซึ่งรายละเอียดก็จะกล่าวถึงต่อไป
การใส่หน้าสไลด์ เมื่อสร้างออบเจ็กต์คลาส
Presentation
ขึ้นมาใหม่โดยไม่ได้เปิดไฟล์ที่มีอยู่เดิมก็จะว่างเปล่า ไม่มีสไลด์อยู่ภายใน
หากต้องการเพิ่มสไลด์ลงไปใหม่ก็ทำได้โดยใช้เมธอด
.add_slide()
ที่ตัวแอตทริบิวต์
.slides
โดยสิ่งที่ต้องใส่ลงไปในวงเล็บก็คือออบเจ็กต์แสดงรูปแบบเลย์เอาต์ ซึ่งก็อยู่ในแอตทริบิวต์
.slide_layouts
ของตัวออบเจ็กต์คลาส
Presentation
นั่นเอง
เลย์เอาต์มีทั้งหมด ๑๑ แบบด้วยกัน แทนด้วย
.slide_layouts[0]
,
.slide_layouts[1]
, ... ซึ่งเมื่อใช้เลย์เอาต์ต่างกันจะได้สไลด์ที่มีส่วนประกอบตั้งต้นต่างกันเล็กน้อย
เช่นถ้าลองสร้างสไลด์โดยใช้เลย์เอาต์ตัวแรกก็เขียนได้ดังนี้
from pptx import Presentation
prs = Presentation()
layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(layout)
prs.save('หน้าเปล่า.pptx')
ก็จะได้ไฟล์เปล่าที่มีกล่องข้อความตั้งต้นโผล่มาให้ ๒ อันแบบนี้
ถ้าอยากรู้ว่าเลย์เอาต์แต่ละแบบเป็นยังไงบ้างก็อาจลองไล่ใส่ทีละหน้าแล้วดูไฟล์ที่ได้ แบบนี้
from pptx import Presentation
prs = Presentation()
for layout in prs.slide_layouts:
slide = prs.slides.add_slide(layout)
prs.save('เลย์เอาต์แบบต่างๆ.pptx')
ก็จะได้ไฟล์แบบนี้
สำหรับ
.slide_layouts[6]
นั้นจะเป็นเลย์เอาต์ว่างเปล่า ไม่ได้มีกล่องข้อความตั้งต้นมาให้ ดังนั้นถ้าอยากได้สไลด์เปล่าๆก็ทำแบบนี้
slide = prs.slides.add_slide(prs.slide_layouts[6])
ตัวอย่างต่อจากนี้ไปก็จะใช้เลย์เอาต์เปล่านี้อธิบายเป็นหลัก และสร้างพวกองค์ประกอบต่างๆเช่นกล่องข้อความขึ้นมาเองตั้งแต่ศูนย์
การปรับขนาดหน้าสไลด์ ขนาดความกว้างและสูงของหน้าสไลด์นั้นดูได้ที่แอตทริบิวต์
.slide_width
และ
.slide_height
ของตัวออบเจ็กต์คลาส
Presentation
เช่นลองสร้างออบเจ็กต์คลาส
Presentation
ขึ้นมาใหม่แล้วดูค่าตั้งต้นจะเห็นเป็นแบบนี้
prs = Presentation()
print(prs.slide_width) # ได้ 9144000
print(prs.slide_height) # ได้ 6858000
ค่าที่เห็นนี้เป็นตัวเลขหน่วยเล็ก จึงเป็นตัวเลขจำนวนมาก โดยทั่วไปเวลาใช้จะเขียนในรูปของหน่วยที่คุ้นเคยอย่างเช่นมิลลิเมตร (mm) หรือนิ้ว (inches) โดยใช้ผ่านคลาสที่เตรียมไว้อยู่ใน
pptx.util
ลองเอาคลาสของหน่วยแต่ละอย่างที่เตรียมไว้มาใช้สร้างออบเจ็กต์แล้วดูค่าได้ดังนี้
from pptx.util import Cm,Mm,Inches,Pt
print(Cm(1)) # ได้ 360000
print(Mm(1)) # ได้ 36000
print(Inches(1)) # ได้ 914400
print(Pt(1)) # ได้ 12700
จากในนี้จะเห็นว่าหน่วย mm (มิลลิเมตร) มีค่าเป็น 36000 เท่าของหน่วยย่อย ส่วน pt เป็น 12700 เท่า เป็นต้น
อนึ่ง ออบเจ็กต์หน่วยพวกนี้เวลาสั่ง
print
จะขึ้นเป็นตัวเลขมาแต่จริงๆแล้วชนิดข้อมูลไม่ใช่ตัวเลข แม้ว่าในหลายกรณีจะใช้แทนตัวเลขได้ก็ตาม
_1mm = Mm(1)
print(type(_1mm)) # ได้ <class 'pptx.util.Mm'>
ในงานเอกสารภายในคอมพิวเตอร์แล้ว หน่วยหลักที่ส่วนใหญ่ใช้มักจะเป็น pt ในที่นี้ก็จะขอใช้หน่วยนี้เป็นหลัก
โดยค่าตั้งต้นแล้วสไลด์จะมีขนาดเป็น 720×540 pt
เราสามารถปรับค่าความกว้างและสูงให้สไลด์ตามที่ต้องได้โดยใส่แทนลงใน
.slide_width
และ
.slide_height
เลย
from pptx import Presentation
from pptx.util import Pt
prs = Presentation()
prs.slide_width = Pt(2000)
prs.slide_height = Pt(300)
slide = prs.slides.add_slide(prs.slide_layouts[6])
prs.save('หน้ากว๊างกว้าง.pptx')
แล้วเราก็จะได้ไฟล์ที่มีสไลด์หน้ากว๊างกว้างแบบนี้ขึ้นมา
การใส่กล่องข้อความลงในสไลด์ พูดถึงส่วนประกอบที่สำคัญที่สุดภายในสไลด์ของพาวเวอร์พอยต์แล้วก็คงจะเป็นกล่องข้อความ ซึ่งมีไว้ใช้จัดวางข้อความลงไป
ใน python-pptx นั้นกล่องข้อความนั้นจัดเป็นรูปแบบหนึ่งออบเจ็กต์ชนิด shape โดยออบเจ็กต์ตัวกล่องข้อความถูกเก็บอยู่ในแอตทริบิวต์
.shapes
ของออบเจ็กต์ตัวสไลด์
หากสร้างสไลด์ขึ้นมาโดยใช้เลย์เอาต์เปล่า (คือ
.slide_layouts[6]
) ละก็ จะไม่มีกล่องข้อความใดๆอยู่ ดังนั้นภายในแอตทริบิวต์
.shapes
จะว่างเปล่า เราสามารถเพิ่มกล่องข้อความใหม่ลงไปในสไลด์ได้โดยใช้เมธอด
.add_textbox()
ค่าที่ต้องใส่ลงไปในวงเล็บคือตำแหน่งมุมซ้ายและบนของกล่อง และความกว้างและสูง
(ซ้าย,บน,กว้าง,สูง)
เช่น ลองสร้างสไลด์แผ่นหนึ่งโดยเริ่มจากเลย์เอาต์เปล่า แล้วใส่กล่องข้อความเข้าไปอันนึงได้ดังนี้
from pptx import Presentation
from pptx.util import Pt
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
tb = slide.shapes.add_textbox(Pt(50),Pt(100),Pt(300),Pt(100))
prs.save('สไลด์ที่มีกล่องข้อความเปล่าๆ.pptx')
ภายในออบเจ็กต์กล่องข้อความจะประกอบไปด้วยแอตทริบิวต์
.text_frame
ซึ่งภายในนั้นมีแอตทริบิวต์
.paragraphs
ซึ่งใส่ออบเจ็กต์คลาส
Paragraph
คือออบเจ็กต์ของย่อหน้า ซึ่งเป็นตัวบรรจุข้อความ
เมื่อสร้างออบเจ็กต์กล่องข้อความขึ้นมา ภายในจะมีออบเจ็กต์คลาส
Paragraph
แบบนี้อยู่แล้วอันนึง สามารถลองดูได้
print(tb.text_frame.paragraphs) # ได้ (,)
อธิบายมาถึงตรงนี้จะเห็นว่าโครงสร้างถูกแบ่งย่อยลึกลงไปหลายชั้นดูซับซ้อน ขอเขียนสรุปเป็นโครงสร้างไล่ชั้นให้ดูดังนี้
presentation (ตัวไฟล์) |
|
slide (หน้าสไลด์) |
|
shape (กล่องข้อความ) |
|
paragraph (ย่อหน้า) |
อธิบายสั้นๆก็คือ ภายในออบเจ็กต์ตัวไฟล์ (presentation) จะประกอบไปด้วยออบเจ็กต์หน้าสไลด์ (slide) อยู่หลายๆหน้า แล้วภายในแต่ละสไลด์จะประกอบไปด้วยกล่องข้อความ (shape) และภายในกล่องข้อความจะประกอบไปด้วยออบเจ็กต์ย่อหน้า (paragraph)
และในออบเจ็กต์ย่อหน้านั้นจะมีแอตทริบิวต์
.text
อยู่ ถ้าเราป้อนข้อความลงไปในนั้น ข้อความก็จะไปปรากฏอยู่ในสไลด์
parag = tb.text_frame.paragraphs[0]
parag.text = 'ข้อความ'
เพียงแต่จริงๆแล้วมีวิธีลัดอยู่ คือถ้าหากต้องการให้ภายในกล่องข้อความนี้มีแค่เพียงย่อหน้าเดียวอยู่แล้วก็อาจทำได้โดยป้อนข้อความลงไปผ่านแอตทริบิวต์
.text
ของตัวออบเจ็กต์กล่องข้อความโดยตรง
tb.text = 'ข้อความ'
หรือจะป้อนผ่าน
.text_frame
ก็ได้ผลเหมือนกัน
tb.text_frame.text = 'ข้อความ'
ไม่ว่าจะตัวไหนก็สามารถป้อนค่าหรือดูค่าได้เช่นกัน และสุดท้ายก็โยงมาที่
.text
ตัวเดียวกัน
from pptx import Presentation
from pptx.util import Pt
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
tb = slide.shapes.add_textbox(Pt(40),Pt(120),Pt(350),Pt(80))
tb.text = 'จอมเวทแห่งรุ่งอรุณ'
print(tb.text_frame.text) # ได้ จอมเวทแห่งรุ่งอรุณ
parag = tb.text_frame.paragraphs[0]
print(parag.text) # ได้ จอมเวทแห่งรุ่งอรุณ
parag.text = 'ราชานักล่าอัคคี'
print(tb.text) # ได้ ราชานักล่าอัคคี
print(tb.text_frame.text) # ได้ ราชานักล่าอัคคี
เพียงแต่ให้ระวังว่าถ้ามีมากกว่าหนึ่งย่อหน้าอยู่แล้ว การป้อนค่าผ่าน
tb.text_frame.text
จะเป็นการทำลายย่อหน้าทั้งหมดที่มีอยู่แล้วเขียนทับลงไป
การเพิ่มย่อหน้าใหม่ลงในกล่องข้อความ ย่อหน้าที่ถูกสร้างขึ้นมาพร้อมกับตัวกล่องข้อความจะมีเพียงอันเดียว ถ้าต้องการเพิ่มก็ใส่เพิ่มได้โดยใช้เมธอด
.add_paragraph()
ที่
.text_frame
tb = slide.shapes.add_textbox(Pt(20),Pt(20),Pt(20),Pt(20))
parag = tb.text_frame.add_paragraph()
print(len(tb.text_frame.paragraphs)) # ได้ 2
ตัวอย่างการใส่ย่อหน้าลงไปหลายๆย่อหน้า
from pptx import Presentation
from pptx.util import Pt
prs = Presentation()
prs.slide_width = Pt(400)
prs.slide_height = Pt(200)
slide = prs.slides.add_slide(prs.slide_layouts[6])
tb = slide.shapes.add_textbox(Pt(50),Pt(50),Pt(300),Pt(100))
parag1 = tb.text_frame.paragraphs[0] # ย่อหน้าแรกมีอยู่แล้ว
parag1.text = 'ชีวิตตัวประกอบอย่างตูช่างอยู่ยากเมื่ออยู่ในโลกเกมจีบหนุ่ม'
parag2 = tb.text_frame.add_paragraph() # เติมย่อหน้าที่ ๒ เข้าไป
parag2.text = 'ชีวิตไม่ต้องเด่น ขอแค่เป็นเทพในเงา'
tb.text_frame.add_paragraph().text = 'ชีวิตสโลว์ไลฟ์ของหมอยาสุดโกง +เปิดร้านขายยาที่ต่างโลก+' # ย่อหน้าที่ ๓
tb.text_frame.add_paragraph() # ย่อหน้าที่ ๔
tb.text_frame.paragraphs[-1].text = 'ชีวิตใหม่ไม่ธรรมดาของราชาปีศาจขี้เหงา'
prs.save('นิยายชีวิต.pptx')
การปรับการจัดเรียงข้อความในกล่องข้อความ รูปแบบการจัดเรียงข้อความโดยรวมทั้งหมดภายในกล่องข้อความสามารถปรับแต่งได้ที่แอตทริบิวต์ต่างๆภายใน
.text_frame
โดยหลักๆแล้วมีดังนี้
แอตทริบิวต์ |
ความหมาย |
ค่าที่ใส่ |
.margin_bottom |
ช่องว่างระหว่างตัวหนังสือกับขอบล่าง |
pptx.util.Pt |
.margin_left |
ช่องว่างระหว่างตัวหนังสือกับขอบซ้าย |
.margin_right |
ช่องว่างระหว่างตัวหนังสือกับขอบขวา |
.margin_top |
ช่องว่างระหว่างตัวหนังสือกับขอบบน |
.vertical_anchor |
ให้ตัวหนังสืออยู่ชิดบนหรือกลางหรือล่าง |
pptx.enum.text.MSO_ANCHOR |
.word_wrap |
ให้ข้อความขึ้นบันทัดใหม่เมื่อเลยความกว้างของกรอบหรือไม่ |
True, False |
ออบเจ็กต์ที่ใส่ใน
.vertical_anchor
เพื่อจะบอกว่าจัดเรียงข้อความยังไงนั้นได้แก่
MSO_ANCHOR.BOTTOM |
ชิดล่าง |
MSO_ANCHOR.MIDDLE |
อยู่ตรงกลาง |
MSO_ANCHOR.TOP |
ชิดบน |
ตัวอย่างการใช้
from pptx import Presentation
from pptx.util import Pt
from pptx.enum.text import MSO_ANCHOR
prs = Presentation()
prs.slide_width = Pt(350)
prs.slide_height = Pt(300)
slide = prs.slides.add_slide(prs.slide_layouts[6])
tb = slide.shapes.add_textbox(Pt(50),Pt(50),Pt(250),Pt(200))
tb.text_frame.vertical_anchor = MSO_ANCHOR.BOTTOM # จัดข้อความชิดด้านล่าง
tb.text_frame.margin_bottom = Pt(30) # ให้ห่างจากขอบล่างมาหน่อย
tb.text_frame.word_wrap = True # ให้มีการขึ้นบรรทัดใหม่เมื่อเลยความกว้างของกรอบ
tb.text = 'มังกรกินผัก อายุ 5,000 ปี จู่ ๆ ก็กลายเป็นมังกรไม่ดีไปซะอย่างนั้น'
prs.save('มังกรกินผัก.pptx')
ส่วนพวกค่าที่ปรับแยกในแต่ละย่อหน้านั้นให้ปรับที่ตัวแอตทริบิวต์ของออบเจ็กต์ย่อหน้านั้นๆ ได้แก่
แอตทริบิวต์ |
ความหมาย |
ค่าที่ใส่ |
.alignment |
รูปแบบการจัดเรียง |
pptx.enum.text.PP_ALIGN |
.line_spacing |
ความสูงของบรรทัด |
pptx.util.Pt |
.space_after |
ช่องว่างด้านล่างบรรทัด |
.space_before |
ช่องว่างด้านบนบรรทัด |
ตัวอย่างการใช้
from pptx import Presentation
from pptx.util import Pt
from pptx.enum.text import PP_ALIGN
prs = Presentation()
prs.slide_width = Pt(350)
prs.slide_height = Pt(300)
slide = prs.slides.add_slide(prs.slide_layouts[6])
tb = slide.shapes.add_textbox(Pt(50),Pt(50),Pt(250),Pt(200))
parag1 = tb.text_frame.paragraphs[0]
parag1.text = 'สกิลโกงไร้เทียมทาน'
parag1.alignment = PP_ALIGN.CENTER # วางไว้ตรงกลาง
parag2 = tb.text_frame.add_paragraph()
parag2.text = 'สร้างตำนานในสองโลก'
parag2.alignment = PP_ALIGN.RIGHT # จัดชิดขวา
parag3 = tb.text_frame.add_paragraph()
parag3.text = '-ชีวิตพลิกผันด้วยการอัปเลเวล-'
parag3.space_after = Pt(20) # หลังจากบรรทัดนี้ให้เว้นระยะ
parag4 = tb.text_frame.add_paragraph()
parag4.text = 'สกิลสุดพิสดารกับมื้ออาหารในต่างโลก'
parag5 = tb.text_frame.add_paragraph()
parag5.text = 'ผมเอาแต่อัปสกิลทำฟาร์ม'
parag5.space_before = Pt(30) # เว้นระยะก่อนขึ้นบรรทัดนี้
parag6 = tb.text_frame.add_paragraph()
parag6.text = 'แต่ไม่รู้ทำไมผมถึงได้แข็งแกร่งขึ้นซะงั้น'
parag6.alignment = PP_ALIGN.RIGHT # จัดชิดขวา
prs.save('ว่าด้วยเรื่องของสกิล.pptx')
การปรับรูปแบบข้อความ (ฟอนต์, สี, ขนาด, ฯลฯ) ของอักษรในย่อหน้า การปรับรูปแบบของตัวอักษรทำได้โดยตั้งค่าภายในแอตทริบิวต์
.font
ภายในออบเจ็กต์ตัวย่อหน้า ซึ่งในนั้นก็ประกอบไปด้วยแอตทริบิวต์หลายตัวที่สามารถปรับได้ เช่น
แอตทริบิวต์ |
ความหมาย |
ค่าที่ใส่ |
.size |
ขนาดตัวหนังสือ |
pptx.util.Pt |
.bold |
เป็นตัวหนาหรือไม่ |
True, False |
.italic |
เป็นตัวเอียงหรือไม่ |
True, False |
.underline |
ขีดเส้นใต้หรือไม่ |
True, False |
.name |
ฟอนต์ตัวหนังสือ |
str |
.language_id |
รหัสภาษา |
pptx.enum.lang.MSO_LANGUAGE_ID |
.color.rgb |
สีตัวหนังสือ |
pptx.dml.color.RGBColor |
ตัวอย่างการใช้
from pptx import Presentation
from pptx.util import Pt
from pptx.dml.color import RGBColor
from pptx.enum.lang import MSO_LANGUAGE_ID
prs = Presentation()
prs.slide_width = Pt(120)
prs.slide_height = Pt(160)
slide = prs.slides.add_slide(prs.slide_layouts[6])
tb = slide.shapes.add_textbox(Pt(10),Pt(20),Pt(100),Pt(120))
parag1 = tb.text_frame.paragraphs[0]
parag1.font.size = Pt(28)
parag1.text = 'ตัวใหญ่'
parag2 = tb.text_frame.add_paragraph()
parag2.font.bold = True
parag2.text = 'ตัวหนา'
parag3 = tb.text_frame.add_paragraph()
parag3.font.italic = True
parag3.text = 'ตัวเอียง'
parag4 = tb.text_frame.add_paragraph()
parag4.font.underline = True
parag4.text = 'ขีดเส้นใต้'
parag5 = tb.text_frame.add_paragraph()
parag5.font.color.rgb = RGBColor(0,0,200)
parag5.text = 'สีน้ำเงิน'
for parag in tb.text_frame.paragraphs:
parag.font.language_id = MSO_LANGUAGE_ID.THAI
prs.save('ปรับตัวหนังสือแบบต่างๆ.pptx')
สำหรับค่าที่ใช้ใน
.color.rgb
เพื่อปรับสีนั้นคือออบเจ็กต์
pptx.dml.color.RGBColor
โดยใส่ค่าสี (แดง,เขียว,น้ำเงิน) ซึ่งมีค่าเต็มเป็น 255
ส่วนรหัสภาษานั้นค่าที่ต้องใส่เป็นออบเจ็กต์ใน
pptx.enum.lang.MSO_LANGUAGE_ID
มีไว้กำหนดว่าข้อความตรงนี้เป็นภาษาอะไร อาจมีประโยชน์ในเรื่องการกำหนดการแสดงผลให้ถูกต้อง หรือเรื่องการตรวจคำผิด ในที่นี้เราใช้ภาษาไทยก็ใส่เป็น
MSO_LANGUAGE_ID.THAI
การปรับรูปแบบข้อความให้ต่างกันภายในย่อหน้าเดียว ในตัวอย่างที่ผ่านมาได้แสดงการปรับรูปแบบตัวหนังสือหมดทั้งย่อหน้า แต่ว่าหากต้องการปรับตัวหนังสือแยกให้ต่างกันภายในย่อหน้าเดียวกัน แบบนั้นก็จำเป็นต้องลงไปจัดการชองค์ประกอบที่เป็นหน่วยย่อยลงไปอีก นั่นคือตัวออบเจ็กต์ที่เรียกว่า
run
run
ในที่นี้หมายถึงกลุ่มก้อนของข้อความ บรรจุอยู่ภายในแอตทริบิวต์
.runs
ของออบเจ็กต์ตัวย่อหน้า ซึ่งสามารถเข้าถึงและดูค่ารวมทั้งใส่เพิ่มได้
จริงๆแล้วเวลาที่เราป้อนข้อความให้กับย่อหน้านั้น ตัว
run
ก็ได้ถูกสร้างขึ้นมาอันหนึ่งโดยอัตโนมัติอยู่แล้ว โดยใน
run
นั้นก็จะบรรจุข้อความที่ป้อนมาไว้
ถ้ายังไม่ได้ป้อนข้อความลงไปในย่อหน้า
.runs
จะว่างเปล่า แต่พอพิมพ์ข้อความลงไป
run
ก็จะถูกสร้างขึ้น แล้วข้อความน้นก็จะไปปรากฏใน
run
นั้นด้วย
from pptx import Presentation
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
tb = slide.shapes.add_textbox(Pt(10),Pt(10),Pt(10),Pt(10))
parag1 = tb.text_frame.paragraphs[0]
print(len(parag1.runs)) # ได้ 0
parag1.text = 'กาดำแห่งวังชั้นใน'
print(len(parag1.runs)) # ได้ 1
print(parag1.runs[0].text) # ได้ กาดำแห่งวังชั้นใน
เพื่อให้เห็นความสัมพันธ์ อาจลองเขียนเป็นตารางแสดงไล่เรียงลำดับขั้นได้ดังนี้
presentation |
|
slide = presentation.slides[i] |
|
shape = slide.shapes[i] |
|
paragraph = shape.text_frame.paragraphs[i] |
|
run = paragraph.runs[i] |
ตัวออบเจ็กต์
run
ก็มีแอตทริบิวต์
.font
สามารถปรับรูปแบบตัวอักษรในนี้ได้เช่นเดียวกับที่ตัวย่อหน้า
การใส่
run
เพิ่มลงไปทำได้โดยเมธอด
.add_run()
และถ้าเราปรับรูปแบบตัวอักษรที่ตัว
run
นี้ก็จะเป็นการปรับเฉพาะส่วนของตัวอักษรท่อนนี้ พอทำแบบนี้เราก็สามารถแยกปรับฟอนต์ของอักษรแต่ละท่อนให้ต่างไปได้
ตัวอย่าง
from pptx import Presentation
from pptx.util import Pt
from pptx.dml.color import RGBColor
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
tb = slide.shapes.add_textbox(Pt(50),Pt(100),Pt(620),Pt(380))
tb.text_frame.word_wrap = True
parag1 = tb.text_frame.paragraphs[0] # สร้างย่อหน้า
parag1.font.size = Pt(70) # ตั้งขนาดตัวอักษรตรงนี้ มีผลทั้งย่อหน้า
run1 = parag1.add_run()
run1.text = 'บูรณะมันวุ่นวาย '
run2 = parag1.add_run()
run2.text = 'ขายชาติ'
# ปรับรูปแบบตัวอักษรเฉพาะท่อนนี้
run2.font.bold = True # ปรับตัวหนา
run2.font.size = Pt(80) # ปรับตัวใหญ๋
run2.font.color.rgb = RGBColor(200,0,0) # ใส่สีแดง
run3 = parag1.add_run()
run3.text = 'เลยแล้วกัน!'
parag2 = tb.text_frame.add_paragraph() # ย่อหน้าใหม่
parag2.text = 'ล้อเล่นนะ'
prs.save('ขายชาติ.pptx')
การใส่ลิงก์เว็บให้ข้อความ ออบเจ็กต์
run
นั้นนอกจากจะสามารถปรับรูปแบบตัวอักษรได้แล้วยังสามารถใส่ลิงก์ได้ด้วย เอาไว้ใช้คลิกเพื่อเปิดหน้าเว็บ ทำได้โดยไปใส่ที่แอตทริบิวต์
.hyperlink.address
ตัวอย่าง
from pptx import Presentation
from pptx.util import Pt
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
tb = slide.shapes.add_textbox(Pt(50),Pt(100),Pt(620),Pt(380))
parag1 = tb.text_frame.paragraphs[0]
parag1.font.size = Pt(95)
run1 = parag1.add_run()
run1.text = 'ถ้าหิวก็จง'
run2 = parag1.add_run()
run2.text = 'คลิกที่นี่'
run2.hyperlink.address = 'https://www.google.com/search?q=อาหาร&tbm=isch'
prs.save('คลิก.pptx')
การปรับขอบของกล่องข้อความ กล่องข้อความสามารถวาดเส้นกรอบได้โดยปรับที่แอตทริบิวต์
.line
ซึ่งภายในประกอบด้วยแอตทริบิวต์ซึ่งกำหนดลักษณะของเส้น เช่น
แอตทริบิวต์ |
ความหมาย |
ค่าที่ใส่ |
.width |
ความหนาเส้น |
pptx.util.Pt |
.dash_style |
รูปแบบเส้น |
pptx.enum.dml.MSO_LINE |
.color.rgb |
สีเส้น |
pptx.dml.color.RGBColor |
ตัวอย่าง
from pptx import Presentation
from pptx.util import Pt
from pptx.dml.color import RGBColor
from pptx.enum.dml import MSO_LINE
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
tb1 = slide.shapes.add_textbox(Pt(50),Pt(50),Pt(620),Pt(430))
tb1.line.dash_style = MSO_LINE.SOLID # ใส่เส้นต่อเนื่อง
tb1.line.color.rgb = RGBColor(200,0,0) # ใส่สีแดง
tb1.line.width = Pt(4) # เส้นหนาหน่อย
tb1.text = 'ข้อความในกรอบสีแดง'
tb2 = slide.shapes.add_textbox(Pt(150),Pt(150),Pt(420),Pt(230))
tb2.line.dash_style = MSO_LINE.LONG_DASH_DOT # ใส่เส้นประที่มีขีดและจุด
tb2.line.color.rgb = RGBColor(20,180,0) # ใส่สีเขียว
tb2.line.width = Pt(6) # เส้นหนากว่า
tb2.text = 'ข้อความในกรอบเส้นประสีเขียว'
prs.save('ปรับขอบ.pptx')
การปรับพื้นของกล่องข้อความ พื้นของกล่องข้อความสามารถใส่สีหรือลวดลายลงไปได้โดยจัดการที่แอตทริบิวต์
.fill
โดยอาจระบายเป็นสีเดียวโดยเริ่มจากใช้เมธอด
.fill.solid()
และกำหนดสีที่ต้องการที่แอตทริบิวต์
.fill.fore_color
หรืออาจใส่เป็นลวดลายโดยใช้เมธอด
.fill.patterned()
แล้วกำหนดรูปแบบที่แอตทริบิวต์
.pattern
ใส่สีที่แอตทริบิวต์
.fill.fore_color
และ
.fill.back_color
ตัวอย่าง
from pptx import Presentation
from pptx.util import Pt
from pptx.dml.color import RGBColor
from pptx.enum.dml import MSO_PATTERN
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
tb1 = slide.shapes.add_textbox(Pt(50),Pt(50),Pt(620),Pt(430))
tb1.fill.solid()
tb1.fill.fore_color.rgb = RGBColor(250,30,70)
tb2 = slide.shapes.add_textbox(Pt(150),Pt(150),Pt(420),Pt(230))
tb2.fill.patterned()
tb2.fill.pattern = MSO_PATTERN.OUTLINED_DIAMOND
tb2.fill.fore_color.rgb = RGBColor(20,230,70)
tb2.fill.back_color.rgb = RGBColor(20,30,170)
prs.save('ปรับพื้น.pptx')
ค่าที่ใส่ใน
.pattern
นั้นเป็นออบเจ็กต์ใน
pptx.enum.dml.MSO_PATTERN
ซึ่งมีให้เลือกอยู่มากมายหลายแบบ
เพื่อที่จะรู้ว่าแต่ละแบบเป็นยังไงบ้าง อาจลองเขียนโปรแกรมให้แสดงรูปแบบต่างๆทั้งหมดพร้อมชื่อได้ดังนี้
from pptx import Presentation
from pptx.util import Pt
from pptx.enum.dml import MSO_PATTERN
from pptx.enum.base import EnumValue
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor
prs = Presentation()
prs.slide_width = Pt(270)
prs.slide_height = Pt(180)
for p in dir(MSO_PATTERN):
attr = getattr(MSO_PATTERN,p)
if(isinstance(attr,EnumValue) and p!='MIXED'):
slide = prs.slides.add_slide(prs.slide_layouts[6])
tb = slide.shapes.add_textbox(Pt(10),Pt(10),Pt(250),Pt(150))
tb.fill.patterned()
tb.fill.pattern = attr # กำหนดรูปแบบ
tb.fill.fore_color.rgb = RGBColor(255,0,0)
tb.fill.back_color.rgb = RGBColor(170,255,255)
tb.text = p
tb.text_frame.margin_top = Pt(155) # ตั้งให้ตัวหนังสือไปอยู่ด้านล่างของกรอบ
tb.text_frame.paragraphs[0].font.size = Pt(12)
tb.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
prs.save('รวมลวดลาย.pptx')
ลองเปิดไฟล์ขึ้นมาดูก็จะเป็นแบบนี้ ลองเลือกลวดลายที่ถูกใจได้
การทำพื้นไล่สี พื้นกล่องข้อความยังสามารถทำเป็นพื้นที่มีการไล่สีได้ด้วย โดยใช้เมธอด
.gradient()
ที่
.fill
แล้วกำหนดค่าต่างๆดังนี้
แอตทริบิวต์ |
ความหมาย |
ค่าที่ใส่ |
.gradient_angle |
มุมของการไล่สี |
ตัวเลขค่ามุมเป็นหน่วยองศา |
.gradient_stops[0].position |
ตำแหน่งที่เริ่มไล่สี |
เลข 0~1 |
.gradient_stops[1].position |
ตำแหน่งที่ไล่สีจบ |
.gradient_stops[0].color.rgb |
สีที่จุดที่เริ่มไล่สี |
pptx.dml.color.RGBColor |
.gradient_stops[1].color.rgb |
สีที่จุดปลาย |
ตำแหน่งที่เริ่มและสิ้นสุดการไล่สีนั้น 0 และ 1 คือจุดริมสุด หากไม่ได้ใส่จะเริ่มที่ 0 จบที่ 1 คือไล่ตลอดทั้งพื้นที่
ตัวอย่างการใช้
from pptx import Presentation
from pptx.util import Pt
from pptx.dml.color import RGBColor
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
tb1 = slide.shapes.add_textbox(Pt(50),Pt(50),Pt(620),Pt(430))
tb1.fill.gradient()
tb1.fill.gradient_angle = 80
tb1.fill.gradient_stops[0].color.rgb = RGBColor(0,0,220)
tb1.fill.gradient_stops[1].color.rgb = RGBColor(220,0,120)
tb2 = slide.shapes.add_textbox(Pt(150),Pt(150),Pt(420),Pt(230))
tb2.fill.gradient()
tb2.fill.gradient_angle = -20
tb2.fill.gradient_stops[0].position = 0.45
tb2.fill.gradient_stops[0].color.rgb = RGBColor(230,0,0)
tb2.fill.gradient_stops[1].position = 0.55
tb2.fill.gradient_stops[1].color.rgb = RGBColor(210,230,0)
prs.save('ปรับพื้นไล่สี.pptx')
การใส่รูปร่างต่างๆ ที่จริงแล้วกล่องข้อความนั้นก็เป็นแค่ออบเจ็กต์
shape
รูปแบบหนึ่งเท่านั้น แค่อาจใช้บ่อยกว่าอย่างอื่น แต่นอกจากนั้นแล้วก็ยังมี
shape
แบบอื่นๆอีกหลายอย่างที่สามารถใส่ลงมาเป็นส่วนประกอบภายในสไลด์ได้ เช่นพวกรูปร่างต่างๆ
รูปร่างต่างๆสามารถใส่ลงไปในสไลด์ได้โดยใช้เมธอด
.add_shape()
โดยค่าที่ต้องใส่ลงไปในวงเล็บนั้นคือ
(รูปแบบรูปร่าง,ซ้าย,บน,กว้าง,สูง)
ซึ่ง ๔ ตัวหลังนั้นก็เหมือนกับกรณีของการเพิ่มกล่องข้อความ แต่ว่าตัวแรกที่ต้องใส่ลงไปนั้นคือตัวที่กำหนดว่าจะเอารูปร่างแบบไหน ซึ่งใส่เป็นออบเจ็กต์
pptx.enum.shapes.MSO_SHAPE
เช่นถ้าต้องการใส่รูปหกเหลี่ยมก็ใส่
pptx.enum.shapes.MSO_SHAPE.HEXAGON
เป็นต้น
รูปร่างที่ใส่ลงไปได้นั้นมีอยู่มากมาย อาจลองเขียนโปรแกรมทำการใส่รูปร่างแต่ละแบบพร้อมกับชื่อออบเจ็กต์ที่ต้องใส่ เพื่อเอามาเปิดดูได้ดังนี้
from pptx import Presentation
from pptx.util import Pt
from pptx.enum.shapes import MSO_SHAPE
from pptx.enum.base import EnumValue
from pptx.enum.text import PP_ALIGN
prs = Presentation()
prs.slide_width = Pt(270)
prs.slide_height = Pt(190)
for p in dir(MSO_SHAPE):
attr = getattr(MSO_SHAPE,p)
if(isinstance(attr,EnumValue) and p!='NO_SYMBOL'):
slide = prs.slides.add_slide(prs.slide_layouts[6])
slide.shapes.add_shape(attr,Pt(10),Pt(10),Pt(250),Pt(150))
tb = slide.shapes.add_textbox(Pt(10),Pt(160),Pt(250),Pt(30))
tb.text = p
tb.text_frame.paragraphs[0].font.size = Pt(12)
tb.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
prs.save('รวมรูปร่าง.pptx')
แล้วก็จะได้ไฟล์ซึ่งแต่ละหน้าสไลด์บรรจุรูปร่างแต่ละแบบพร้อมชื่อให้ดู เราสามารถดูรายการนี้เพื่อจะเลือกใช้ตามที่ต้องการได้
รูปร่างต่างๆนั้นสามารถกำหนดขนาดและสมบัติต่างๆอย่างสีพื้นและเส้น รวมทั้งใส่ข้อความลงไปภายในได้ด้วย เช่นเดียวกับกล่องข้อความ
แต่ว่านอกจากนั้นแล้วรูปร่างบางอย่างมีค่าที่สามารถปรับได้เพิ่มเติม ซึ่งค่าที่ปรับนั้นจะอยู่ที่แอตทริบิวต์
.adjustments
ซึ่งค่าในนี้อาจมีหลายตัวก็ได้ ขั้นอยู่กับชนิดของรูปร่างนั้น
เช่นถ้าเลือกรูป
MSO_SHAPE.BEVEL
จะเลือกปรับค่าขนาดของกรอบได้
ตัวอย่าง ลองสร้างกล่อง
MSO_SHAPE.BEVEL
ขึ้นมาโดยมีค่า
.adjustments
ต่างกันออกไป พร้อมเขียนค่านั้นแสดงไว้ตรงกลางกล่องด้วย
from pptx import Presentation
from pptx.util import Pt
from pptx.dml.color import RGBColor
from pptx.enum.shapes import MSO_SHAPE
from pptx.enum.text import PP_ALIGN
from pptx.enum.text import MSO_ANCHOR
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
for i in range(4):
k = 0.1+i*0.1 # ค่าของตัวปรับ
bevel = slide.shapes.add_shape(MSO_SHAPE.BEVEL,Pt(50+(i%2)*310),Pt(50+(i//2)*220),Pt(310),Pt(220))
bevel.fill.gradient()
bevel.fill.gradient_stops[0].color.rgb = RGBColor(105,20,140)
bevel.fill.gradient_stops[1].color.rgb = RGBColor(245,180,225)
bevel.adjustments[0] = k
# ใส่ตัวเลขบอกค่า
bevel.text = 'ใส่ %.1f'%k
bevel.text_frame.paragraphs[0].font.size = Pt(40)
bevel.text_frame.paragraphs[0].alignment = PP_ALIGN.RIGHT # จัดข้อความชิดขวา
bevel.text_frame.vertical_anchor = MSO_ANCHOR.BOTTOM # จัดข้อความชิดด้านล่าง
prs.save('ปรังแต่งรูปร่าง.pptx')
ก็จะได้ภาพแบบนี้ออกมา แสดงให้เห็นผลความต่างของค่านั้น
รูปร่างแบบอื่นๆก็ปรับค่าต่างๆได้มากมายเช่นกัน สามารถไปลองดูกันเองได้
การใส่ตาราง สามารถใส่ตารางลงภายในสไลด์ได้โดยใช้เมธอด
.add_table()
โดยค่าที่ต้องใส่มีอยู่ ๖ ตัวคือ
(จำนวนแถวแนวตั้ง,จำนวนคอลัมน์,ซ้าย,บน,กว้าง,สูง)
ส่วนแต่ละช่องภายในตารางนั้นสามารถเข้าถึงได้โดยผ่านเมธอด
.cell()
โดยใส่
(แถวแนวตั้ง,คอลัมน์)
ลงในวงเล็บเพื่อระบุช่องที่ต้องการเอา นอกจากนี้ยังสามารถใช้เมธอด
.iter_cells()
เพื่อใช้ไล่ในวังวน
for
เพื่อจัดการทีละช่องได้ โดยจะไล่จากช่องซ้ายไปขวา โดยเริ่มไล่จากแถวบนแล้วไล่ลงแถวล่างไล่ไปเรื่อยๆ ส่วนวิธีการจัดการกับอะไรต่างๆภายในช่องนั้นจะคล้ายกับออบเจ็กต์กล่องข้อความ ภายในประกอบด้วยย่อหน้าซึ่งสามรถใส่ข้อความลงไปและปรับรูปแบบตัวหนังสือได้
ตัวอย่าง ลองสร้างตารางขึ้นมาแล้วใส่เลขไล่ลงไปในทุกช่อง โดยที่มีช่องนึงที่ระบายสีพื้นเป็นพิเศษ
from pptx import Presentation
from pptx.util import Pt
from pptx.dml.color import RGBColor
from pptx.enum.text import MSO_ANCHOR
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
table = slide.shapes.add_table(8,5,Pt(50),Pt(50),Pt(620),Pt(440)).table
cell33 = table.cell(3,3) # จัดการช่องที่อยู่ตำแหน่ง (4,4)
cell33.fill.gradient() # ทำพื้นไล่สี
cell33.fill.gradient_stops[0].color.rgb = RGBColor(255,245,200) # เหลือง
cell33.fill.gradient_stops[1].color.rgb = RGBColor(80,135,0) # เขียว
cell33.vertical_anchor = MSO_ANCHOR.BOTTOM # ให้ตัวหนังสือวางชิดล่างช่อง
for i,cell in enumerate(table.iter_cells()): # ไล่จัดการทีละช่อง
cell.text = 'ช่อง %2d'%i # ใส่ข้อความตัวเลข
cell.text_frame.paragraphs[0].font.size = Pt(24) # ปรับขนาดอักษร
prs.save('ตัวอย่างตาราง.pptx')
ก็จะได้ตารางแบบนี้ออกมา
จากตารางที่ได้นี้จะเห็นว่าโดยค่าตั้งต้นแล้วตารางแถวบนสุดจะเป็นพื้นสีฟ้าเข้มและตัวอักษรขาวหนา ในขณะที่แถวอื่นจะเป็นสีฟ้าอ่อนกับฟ้าอ่อนมากสลับกันไป นี่เป็นค่าตั้งต้น แต่เราสามารถปรับแต่ละช่องให้ต่างไปตามที่ต้องการได้ดังตัวอย่างที่เห็น
นอกจากนี้แล้วเรายังอาจทำการหลอมรวมช่องในตารางเข้าด้วยกันได้โดยใช้เมธอด
.merge()
ตัวอย่างตารางที่มีการหลอมรวมช่อง
from pptx import Presentation
from pptx.util import Pt
from pptx.dml.color import RGBColor
from pptx.enum.dml import MSO_PATTERN
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
table = slide.shapes.add_table(5,5,Pt(50),Pt(50),Pt(620),Pt(440)).table
table.cell(0,3).merge(table.cell(1,3)) # รวมช่อง (2,4) เข้ากับช่อง (1,4)
cell11 = table.cell(1,1)
cell11.merge(table.cell(3,2)) # รวมช่อง (4,3) เข้ากับช่อง (2,2)
cell11.fill.patterned() # ใส่ลวดลายให้ช่องนี้
cell11.fill.pattern = MSO_PATTERN.SHINGLE
cell11.fill.back_color.rgb = RGBColor(255,100,120)
cell11.fill.fore_color.rgb = RGBColor(100,255,120)
prs.save('ตารางหลอมรวม.pptx')
การใส่รูปภาพจากไฟล์ เราสามารถนำรูปที่เตรียมไว้จากในไฟล์มาใส่ลงสไลด์ได้โดยใช้เมธอด
.add_picture()
โดยค่าที่ต้องใส่ก็คือ
(พาธของรูป,ซ้าย,บน)
ขอยกรูปไพธอนมาใช้เป็นตัวอย่าง
python_chan.png |
ลองโหลดภาพนี้มาแล้วรันโค้ดตัวอย่างนี้ดู
from pptx import Presentation
from pptx.util import Pt
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
img = slide.shapes.add_picture('python_chan.png',Pt(20),Pt(20))
prs.save('สไลด์ใส่ภาพ.pptx')
ก็จะได้ภาพมาอยู่ในสไลด์แบบนี้
นอกจากนี้แล้วถ้าต้องการกำหนดขนาดภาพก็สามารถใส่ได้โดยใส่เป็นค่าตัวที่ ๔ และ ๕ ใน
.add_picture
กลายเป็น
(พาธของรูป,ซ้าย,บน,กว้าง,สูง)
แต่หากต้องการกำหนดแค่ความกว้างแล้วให้ความสูงเปลี่ยนไปตามสัดส่วนเองโดยอัตโนมัติก็ใส่แค่ ๔ ตัวเป็น
(พาธของรูป,ซ้าย,บน,กว้าง)
ไม่ต้องใส่ความสูง หรือในทางกลับกันหากต้องการใส่แค่ความสูงให้ใส่
None
คั่นเป็น
(พาธของรูป,ซ้าย,บน,None,สูง)
การปรับแต่งรูปภาพที่ใส่เข้ามา ภาพที่ใส่เข้ามานั้นสามารถเอามาหมุนได้โดยปรับมุมที่แอตทริบิวต์
.rotation
เช่นลองใส่ภาพที่หมุนเป็นมุมต่างๆดูได้แบบนี้
from pptx import Presentation
from pptx.util import Pt
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
for i in range(10):
img = slide.shapes.add_picture('python_chan.png',Pt(130),Pt(80),Pt(400))
img.rotation = i*10
prs.save('สไลด์ใส่ภาพหมุน.pptx')
หากต้องการตัดเอาภาพบางส่วนก็ทำได้โดยปรับค่าแอตทริบิวต์
.crop_left
,
.crop_top
,
.crop_right
,
.crop_bottom
โดยใส่ค่าตั้งแต่ 0 ถึง 1 ซึ่งแทนสัดส่วนที่ต้องการตัดทิ้ง เพียงแต่ว่าภาพหลังจากตัดบางส่วนออกไปแล้วนั้นจะถูกขยายจนมาเต็มกรอบขนาดภาพเดิม
เช่นสร้างภาพขนาด 720×540 แล้วตัดส่วนขอบออก ส่วนที่เหลือก็จะแผ่เต็มขนาด 720×540
from pptx import Presentation
from pptx.util import Pt
prs = Presentation()
slide = prs.slides.add_slide(prs.slide_layouts[6])
img = slide.shapes.add_picture('python_chan.png',Pt(0),Pt(0),Pt(720),Pt(540))
img.crop_left = 0.5
img.crop_top = 0.1
img.crop_bottom = 0.35
img.crop_right = 0.05
prs.save('สไลด์ใส่ภาพตัดเอาบางส่วน.pptx')
ทิ้งท้าย จากวิธีใช้และตัวอย่างที่อธิบายมาทั้งหมดจะเห็นว่า python-pptx สามารถใช้ทำอะไรได้มากมาย สามารถสร้างและจัดการไฟล์พาวเวอร์พอยต์ได้ง่าย
แต่ความสามารถที่แนะนำไปตรงนี้เป็นแค่เพียงส่วนหนึ่งในเบื้องต้น ยังมีอีกหลายเรื่องที่ไม่ได้เขียนถึง หากสนใจสามารถไปศึกษาเพิ่มเติมกันต่อไปได้
อ้างอิง