ปรับขนาดรูปทรงบนสไลด์การนำเสนอใน Python ผ่าน Java

ภาพรวม

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

ปรับขนาดรูปทรง

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

ตัวอย่างแรกโหลดงานนำเสนอที่สไลด์ไม่มีตาราง เปลี่ยนขนาดสไลด์เป็น A4 และบันทึกผลลัพธ์ ใช้ SlideSize.setSize พร้อมกับ SlideSizeScaleType.DoNotScale เพื่อให้ลูปถัดไปควบคุมการสเกล อัตราส่วนไม่มีหน่วย; ตำแหน่งและขนาดของรูปทรงวัดเป็นจุด อัตราส่วนความกว้างและความสูงที่ต่างกันสามารถทำให้รูปทรงบิดเบี้ยว และการเปลี่ยนขนาดรูปทรงจะไม่สเกลขนาดฟอนต์ของมัน

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat, SlideSizeType, SlideSizeScaleType

presentation = Presentation("sample.pptx")
try:
    # คำนวณปัจจัยสเกลแนวนอนและแนวตั้งอย่างอิสระ.
    original_size = presentation.getSlideSize().getSize()
    presentation.getSlideSize().setSize(SlideSizeType.A4Paper, SlideSizeScaleType.DoNotScale)
    target_size = presentation.getSlideSize().getSize()
    width_ratio = target_size.getWidth() / original_size.getWidth()
    height_ratio = target_size.getHeight() / original_size.getHeight()

    for slide in presentation.getSlides():
        for shape in slide.getShapes():
            shape.setWidth(shape.getWidth() * width_ratio)
            shape.setHeight(shape.getHeight() * height_ratio)
            shape.setX(shape.getX() * width_ratio)
            shape.setY(shape.getY() * height_ratio)

    presentation.save("output.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

ตัวอย่างที่สองรองรับตารางและประมวลผลรูปทรงบนมาสเตอร์และเลเอาต์รวมถึงสไลด์เดี่ยวก่อนบันทึกงานนำเสนอที่ปรับขนาด ตัวช่วยของมันจัดการแต่ละ Table โดยปรับสเกลความกว้างของคอลัมน์ด้วย Column.setWidth และความสูงขั้นต่ำของแถวด้วย Row.setMinimalHeight จากนั้นปรับสเกลตำแหน่งของตารางโดยไม่แยกการสเกลมิติรวมของมัน

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SaveFormat, SlideSizeType, SlideSizeScaleType, Table


def resize_shapes(shapes, width_ratio, height_ratio):
    for shape in shapes:
        if isinstance(shape, Table):
            # มิติของตารางถูกควบคุมโดยความกว้างของคอลัมน์และความสูงของแถว.
            for column in shape.getColumns():
                column.setWidth(column.getWidth() * width_ratio)

            for row in shape.getRows():
                row.setMinimalHeight(row.getMinimalHeight() * height_ratio)
        else:
            shape.setWidth(shape.getWidth() * width_ratio)
            shape.setHeight(shape.getHeight() * height_ratio)

        shape.setX(shape.getX() * width_ratio)
        shape.setY(shape.getY() * height_ratio)


presentation = Presentation("sample.pptx")
try:
    # คำนวณปัจจัยสเกลแนวนอนและแนวตั้งอย่างอิสระ.
    original_size = presentation.getSlideSize().getSize()
    presentation.getSlideSize().setSize(SlideSizeType.A4Paper, SlideSizeScaleType.DoNotScale)
    target_size = presentation.getSlideSize().getSize()
    width_ratio = target_size.getWidth() / original_size.getWidth()
    height_ratio = target_size.getHeight() / original_size.getHeight()

    # ปรับขนาดรูปทรงที่กำหนดบนมาสเตอร์และเลเอาต์รวมถึงสไลด์แต่ละอัน.
    for master in presentation.getMasters():
        resize_shapes(master.getShapes(), width_ratio, height_ratio)

        for layout_slide in master.getLayoutSlides():
            resize_shapes(layout_slide.getShapes(), width_ratio, height_ratio)

    for slide in presentation.getSlides():
        resize_shapes(slide.getShapes(), width_ratio, height_ratio)

    presentation.save("output.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

คำถามที่พบบ่อย

ทำไมรูปทรงจึงบิดเบี้ยวหรือถูกตัดหลังจากปรับขนาดสไลด์?

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

โค้ดที่ให้มาทำงานได้กับทุกประเภทของรูปทรงหรือไม่?

ตัวอย่างแรกเปลี่ยนขอบเขตของรูปทรงโดยตรงและออกแบบมาสำหรับสไลด์ที่ไม่มีตาราง ตัวอย่างที่สองจัดการตารางแยกต่างหาก ตรวจสอบเลเอาต์ที่ได้ โดยเฉพาะข้อความและตาราง เนื่องจากตัวอย่างเหล่านี้ไม่ได้สเกลขนาดฟอนต์และเนื้อหาตารางอาจจำกัดความสูงของแถว

ฉันจะปรับขนาดตารางเมื่อปรับขนาดสไลด์อย่างไร?

ปรับสเกลความกว้างของคอลัมน์ตามอัตราส่วนความกว้างและความสูงขั้นต่ำของแถวตามอัตราส่วนความสูง จากนั้นปรับสเกลตำแหน่งของตารางตามที่แสดงในตัวอย่างที่สอง

การปรับขนาดนี้จะทำงานกับมาสเตอร์สไลด์และเลเอาต์สไลด์หรือไม่?

ใช่ ตัวอย่างที่สองวนลูปผ่าน Presentation.getMasters และ MasterSlide.getLayoutSlides ของแต่ละมาสเตอร์ แล้วใช้ตรรกะการปรับขนาดเดียวกันกับรูปทรงของพวกมัน

ฉันสามารถเปลี่ยนแนวสไลด์ (แนวตั้ง/แนวนอน) พร้อมกับการปรับขนาดได้หรือไม่?

ใช่ เรียก SlideSize.setOrientation หลังจากเปลี่ยนขนาดสไลด์และก่อนอ่านมิติเป้าหมาย เพื่อให้ปัจจัยสเกลสะท้อนแนวสุดท้าย

มีข้อจำกัดใดต่อขนาดสไลด์ที่ฉันสามารถตั้งค่าได้หรือไม่?

คุณสามารถกำหนดมิติสไลด์แบบกำหนดเองได้ด้วย SlideSize.setSize มิติที่สนับสนุนยังขึ้นกับรูปแบบงานนำเสนอและแอปพลิเคชันที่ใช้เปิดไฟล์

ฉันจะป้องกันไม่ให้รูปทรงที่มีอัตราส่วนคงที่บิดเบี้ยวได้อย่างไร?

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