φυβλαςのβλογ
บล็อกของ phyblas



การใช้ python-pptx เพื่ออ่านและเขียนไฟล์พาวเวอร์พอยต์ (.pptx)
เขียนเมื่อ 2023/03/05 22:38
แก้ไขล่าสุด 2024/02/21 18:14
 

มอดูล 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 สามารถใช้ทำอะไรได้มากมาย สามารถสร้างและจัดการไฟล์พาวเวอร์พอยต์ได้ง่าย

แต่ความสามารถที่แนะนำไปตรงนี้เป็นแค่เพียงส่วนหนึ่งในเบื้องต้น ยังมีอีกหลายเรื่องที่ไม่ได้เขียนถึง หากสนใจสามารถไปศึกษาเพิ่มเติมกันต่อไปได้




อ้างอิง


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python
-- คอมพิวเตอร์ >> microsoft_office

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
ภาษา javascript
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文