φυβλαςのβλογ
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
モンゴル語
言語学
maya
確率論
日本での日記
中国での日記
-- 北京での日記
-- 香港での日記
-- 澳門での日記
台灣での日記
北欧での日記
他の国での日記
qiita
その他の記事

記事の類別



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

  記事を検索

  おすすめの記事

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

ไทย

日本語

中文