จัดการรูปทรงในการนำเสนอด้วย Java

ภาพรวม

บทความนี้อธิบายวิธีการทำงานกับรูปทรงในงานนำเสนอโดยใช้ Aspose.Slides แสดงวิธีการค้นหารูปทรงบนสไลด์, คัดลอก, ลบ, ซ่อน, เปลี่ยนลำดับ, รับ Interop shape ID, และตั้งค่าข้อความทางเลือกสำหรับการระบุตัวและการประมวลผลต่อไป

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

ค้นหารูปทรงบนสไลด์

หัวข้อนี้จะอธิบายเทคนิคง่าย ๆ เพื่อทำให้นักพัฒนาค้นหารูปทรงเฉพาะบนสไลด์ได้ง่ายขึ้นโดยไม่ต้องใช้ Id ภายในของมัน สำคัญที่ต้องรู้คือไฟล์ PowerPoint Presentation ไม่มีวิธีใด ๆ ที่จะระบุรูปทรงบนสไลด์ยกเว้น Id ภายในที่เป็นเอกลักษณ์ การค้นหารูปทรงโดยใช้ Id ภายในอาจเป็นเรื่องยากสำหรับนักพัฒนา รูปทรงทั้งหมดที่เพิ่มลงในสไลด์จะมี Alt Text เราแนะนำให้นักพัฒนาใช้ข้อความทางเลือกเพื่อค้นหารูปทรงเฉพาะ คุณสามารถใช้ MS PowerPoint เพื่อกำหนดข้อความทางเลือกสำหรับวัตถุที่คุณวางแผนจะเปลี่ยนในอนาคต

หลังจากตั้งค่าข้อความทางเลือกของรูปทรงใด ๆ ที่ต้องการแล้ว คุณสามารถเปิดงานนำเสนอนั้นด้วย Aspose.Slides for Java และวนลูปผ่านรูปทรงทั้งหมดที่เพิ่มลงในสไลด์ ในแต่ละรอบคุณสามารถตรวจสอบข้อความทางเลือกของรูปทรงและรูปทรงที่มีข้อความตรงจะเป็นรูปทรงที่คุณต้องการ เพื่อแสดงเทคนิคนี้อย่างชัดเจน เราได้สร้างเมธอด findShape ที่ทำหน้าที่ค้นหารูปทรงเฉพาะในสไลด์และคืนค่ารูปทรงนั้น

// สร้างอินสแตนซ์ของคลาส Presentation ที่แทนไฟล์งานนำเสนอ
Presentation pres = new Presentation("FindingShapeInSlide.pptx");
try {

    ISlide slide = pres.getSlides().get_Item(0);
    // ข้อความทางเลือกของรูปทรงที่ต้องการค้นหา
    IShape shape = findShape(slide, "Shape1");
    if (shape != null)
    {
        System.out.println("Shape Name: " + shape.getName());
    }
} finally {
    if (pres != null) pres.dispose();
}
// การทำงานของเมธอดเพื่อค้นหารูปทรงในสไลด์โดยใช้ข้อความทางเลือกของมัน
public static IShape findShape(ISlide slide, String alttext)
{
    // วนลูปผ่านรูปทรงทั้งหมดภายในสไลด์
    for (int i = 0; i < slide.getShapes().size(); i++)
    {
        // หากข้อความทางเลือกของสไลด์ตรงกับที่ต้องการแล้ว
        // คืนค่ารูปทรงนั้น
        if (slide.getShapes().get_Item(i).getAlternativeText().compareTo(alttext) == 0)
            return slide.getShapes().get_Item(i);
    }
    return null;
}

คัดลอกรูปทรง

เพื่อคัดลอกรูปทรงไปยังสไลด์โดยใช้ Aspose.Slides for Java:

  1. สร้างอินสแตนซ์ของคลาส Presentation
  2. รับอ็อบเจกต์อ้างอิงของสไลด์โดยใช้ดัชนีของมัน
  3. เข้าถึงคอลเล็กชันรูปทรงของสไลด์ต้นทาง
  4. เพิ่มสไลด์ใหม่ลงในงานนำเสนอ
  5. คัดลอกรูปทรงจากคอลเล็กชันของสไลด์ต้นทางไปยังสไลด์ใหม่
  6. บันทึกงานนำเสนอที่แก้ไขเป็นไฟล์ PPTX

ตัวอย่างด้านล่างเพิ่มกลุ่มรูปทรงลงในสไลด์

// สร้างอินสแตนซ์ของคลาส Presentation
Presentation pres = new Presentation("Source Frame.pptx");
try {
    IShapeCollection sourceShapes = pres.getSlides().get_Item(0).getShapes();
    ILayoutSlide blankLayout = pres.getMasters().get_Item(0).getLayoutSlides().getByType(SlideLayoutType.Blank);
    ISlide destSlide = pres.getSlides().addEmptySlide(blankLayout);
    IShapeCollection destShapes = destSlide.getShapes();
    destShapes.addClone(sourceShapes.get_Item(1), 50, 150 + sourceShapes.get_Item(0).getHeight());
    destShapes.addClone(sourceShapes.get_Item(2));
    destShapes.insertClone(0, sourceShapes.get_Item(0), 50, 150);

    // บันทึกไฟล์ PPTX ลงดิสก์
    pres.save("CloneShape_out.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

ลบรูปทรง

Aspose.Slides for Java อนุญาตให้ผู้พัฒนาลบรูปทรงใด ๆ ได้ เพื่อลบรูปทรงจากสไลด์ใดสไลด์หนึ่ง โปรดทำตามขั้นตอนด้านล่าง:

  1. สร้างอินสแตนซ์ของคลาส Presentation
  2. เข้าถึงสไลด์แรก
  3. ค้นหารูปทรงที่มี AlternativeText เฉพาะ
  4. ลบรูปทรง
  5. บันทึกไฟล์ลงดิสก์
// สร้างออบเจกต์ Presentation
Presentation pres = new Presentation();
try {
    // ดึงสไลด์แรก
    ISlide sld = pres.getSlides().get_Item(0);

    // เพิ่ม AutoShape ประเภทสี่เหลี่ยม
    sld.getShapes().addAutoShape(ShapeType.Rectangle, 50, 40, 150, 50);
    sld.getShapes().addAutoShape(ShapeType.Moon, 160, 40, 150, 50);

    String altText = "User Defined";
    int iCount = sld.getShapes().size();
    for (int i = 0; i < iCount; i++)
    {
        AutoShape ashp = (AutoShape)sld.getShapes().get_Item(0);
        if (alttext.equals(ashp.getAlternativeText()))
        {
            sld.getShapes().remove(ashp);
        }
    }

    // บันทึกงานนำเสนอลงดิสก์
    pres.save("RemoveShape_out.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

ซ่อนรูปทรง

Aspose.Slides for Java อนุญาตให้ผู้พัฒนาซ่อนรูปทรงใด ๆ ได้ เพื่ซ่อนรูปทรงจากสไลด์ใดสไลด์หนึ่ง โปรดทำตามขั้นตอนด้านล่าง:

  1. สร้างอินสแตนซ์ของคลาส Presentation
  2. เข้าถึงสไลด์แรก
  3. ค้นหารูปทรงที่มี AlternativeText เฉพาะ
  4. ซ่อนรูปทรง
  5. บันทึกไฟล์ลงดิสก์
// สร้างอินสแตนซ์ของคลาส Presentation ที่แทนไฟล์ PPTX
Presentation pres = new Presentation();
try {
    // ดึงสไลด์แรก
    ISlide sld = pres.getSlides().get_Item(0);

    // เพิ่ม autoshape ประเภทสี่เหลี่ยม
    sld.getShapes().addAutoShape(ShapeType.Rectangle, 50, 40, 150, 50);
    sld.getShapes().addAutoShape(ShapeType.Moon, 160, 40, 150, 50);

    String alttext = "User Defined";
    int iCount = sld.getShapes().size();
    for (int i = 0; i < iCount; i++)
    {
        AutoShape ashp = (AutoShape)sld.getShapes().get_Item(i);
        if (alttext.equals(ashp.getAlternativeText()))
        {
            ashp.setHidden(true);
        }
    }

    // บันทึกงานนำเสนอลงดิสก์
    pres.save("Hiding_Shapes_out.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

เปลี่ยนลำดับรูปทรง

Aspose.Slides for Java อนุญาตให้ผู้พัฒนาจัดลำดับรูปทรงใหม่ การจัดลำดับรูปทรงระบุว่ารูปทรงใดอยู่หน้า หรือใดอยู่หลัง เพื่อจัดลำดับรูปทรงจากสไลด์ใดสไลด์หนึ่ง โปรดทำตามขั้นตอนด้านล่าง:

  1. สร้างอินสแตนซ์ของคลาส Presentation
  2. เข้าถึงสไลด์แรก
  3. เพิ่มรูปทรง
  4. เพิ่มข้อความบางส่วนใน Text Frame ของรูปทรง
  5. เพิ่มรูปทรงอีกอันหนึ่งด้วยพิกัดเดียวกัน
  6. จัดลำดับรูปทรงใหม่
  7. บันทึกไฟล์ลงดิสก์
Presentation pres = new Presentation("ChangeShapeOrder.pptx");
try {
    ISlide slide = pres.getSlides().get_Item(0);
    IAutoShape shp3 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 200, 365, 400, 150);
    shp3.getFillFormat().setFillType(FillType.NoFill);
    shp3.addTextFrame(" ");

    IParagraph para = shp3.getTextFrame().getParagraphs().get_Item(0);
    IPortion portion = para.getPortions().get_Item(0);
    portion.setText("Watermark Text Watermark Text Watermark Text");

    shp3 = slide.getShapes().addAutoShape(ShapeType.Triangle, 200, 365, 400, 150);

    slide.getShapes().reorder(2, shp3);

    pres.save("Reshape_out.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

รับ Interop Shape ID

Aspose.Slides for Java อนุญาตให้ผู้พัฒนารับตัวระบุรูปทรงที่เป็นเอกลักษณ์ในระดับสไลด์ ซึ่งต่างจากเมธอด getUniqueId ที่ให้ตัวระบุระดับงานนำเสนอ เมธอด getOfficeInteropShapeId ได้ถูกเพิ่มเข้าไปในอินเทอร์เฟซ IShape และคลาส Shape ค่าที่คืนจากเมธอดนี้สอดคล้องกับ Id ของวัตถุ Microsoft.Office.Interop.PowerPoint.Shape ตัวอย่างโค้ดด้านล่างแสดงการใช้งาน

Presentation pres = new Presentation("Presentation.pptx");
try {
    // รับตัวระบุรูปทรงที่ไม่ซ้ำในระดับสไลด์
    long officeInteropShapeId = pres.getSlides().get_Item(0).getShapes().get_Item(0).getOfficeInteropShapeId();

} finally {
    if (pres != null) pres.dispose();
}

ตั้งค่าข้อความทางเลือกสำหรับรูปทรง

Aspose.Slides for Java อนุญาตให้ผู้พัฒนาตั้งค่า AlternateText ของรูปทรงใด ๆ รูปทรงในงานนำเสนอสามารถระบุได้โดยเมธอด AlternativeText หรือ Shape Name เมธอด setAlternativeText และ getAlternativeText สามารถอ่านหรือกำหนดได้โดยใช้ Aspose.Slides รวมถึง Microsoft PowerPoint ด้วยเมธอดนี้คุณสามารถทำเครื่องหมายรูปทรงและทำการดำเนินการต่าง ๆ เช่น การลบรูปทรง, การซ่อนรูปทรง หรือการจัดลำดับรูปทรงบนสไลด์ เพื่อกำหนด AlternateText ของรูปทรง โปรดทำตามขั้นตอนด้านล่าง:

  1. สร้างอินสแตนซ์ของคลาส Presentation
  2. เข้าถึงสไลด์แรก
  3. เพิ่มรูปทรงใด ๆ ลงในสไลด์
  4. ทำงานบางอย่างกับรูปทรงที่เพิ่งเพิ่ม
  5. วนลูปผ่านรูปทรงเพื่อค้นหารูปทรง
  6. ตั้งค่า AlternativeText
  7. บันทึกไฟล์ลงดิสก์
// สร้างอินสแตนซ์ของคลาส Presentation ที่แทนไฟล์ PPTX
Presentation pres = new Presentation();
try {
    // ดึงสไลด์แรก
    ISlide sld = pres.getSlides().get_Item(0);

    // เพิ่ม autoshape ประเภทสี่เหลี่ยม
    IShape shp1 = sld.getShapes().addAutoShape(ShapeType.Rectangle, 50, 40, 150, 50);
    IShape shp2 = sld.getShapes().addAutoShape(ShapeType.Moon, 160, 40, 150, 50);
    shp2.getFillFormat().setFillType(FillType.Solid);
    shp2.getFillFormat().getSolidFillColor().setColor(Color.GRAY);

    for (int i = 0; i < sld.getShapes().size(); i++)
    {
        AutoShape shape = (AutoShape) sld.getShapes().get_Item(i);
        if (shape != null)
        {
            shape.setAlternativeText("User Defined");
        }
    }

    // บันทึกงานนำเสนอลงดิสก์
    pres.save("Set_AlternativeText_out.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

เข้าถึงรูปแบบการจัดวางสำหรับรูปทรง

Aspose.Slides for Java มี API ง่าย ๆ เพื่อเข้าถึงรูปแบบการจัดวางสำหรับรูปทรง บทความนี้แสดงตัวอย่างวิธีการเข้าถึงรูปแบบการจัดวาง

ตัวอย่างโค้ดด้านล่าง

Presentation pres = new Presentation("pres.pptx");
try {
    for (ILayoutSlide layoutSlide : pres.getLayoutSlides())
    {
        for (IShape shape : layoutSlide.getShapes())
        {
            IFillFormat fillFormats = shape.getFillFormat();
            ILineFormat lineFormats = shape.getLineFormat();
        }
    }
} finally {
    if (pres != null) pres.dispose();
}

เรนเดอร์รูปทรงเป็น SVG

ขณะนี้ Aspose.Slides for Java รองรับการเรนเดอร์รูปทรงเป็น SVG เมธอด writeAsSvg (และโอเวอร์โหลด) ถูกเพิ่มในคลาส Shape และอินเทอร์เฟซ IShape เมธอดนี้ช่วยบันทึกเนื้อหาของรูปทรงเป็นไฟล์ SVG ตัวอย่างโค้ดด้านล่างแสดงวิธีการส่งออกรูปทรงของสไลด์เป็นไฟล์ SVG

Presentation pres = new Presentation("TestExportShapeToSvg.pptx");
try {
    FileOutputStream stream = new FileOutputStream("SingleShape.svg");
    try {
        pres.getSlides().get_Item(0).getShapes().get_Item(0).writeAsSvg(stream);
    } finally {
        if (stream != null) stream.close();
    }
} catch (IOException e) {
} finally {
    if (pres != null) pres.dispose();
}

จัดแนวรูปทรง

Aspose.Slides อนุญาตให้จัดแนวรูปทรงได้ทั้งสัมพันธ์กับขอบสไลด์หรือสัมพันธ์กันเอง เพื่อวัตถุประสงค์นี้ได้เพิ่มเมธอดโอเวอร์โหลด SlidesUtil.alignShape() โดย enumeration ShapesAlignmentType กำหนดตัวเลือกรูปแบบการจัดแนวที่เป็นไปได้

Example 1

โค้ดต้นฉบับด้านล่างจัดแนวรูปทรงที่มีดัชนี 1,2 และ 4 ตามขอบด้านบนของสไลด์

Presentation pres = new Presentation("example.pptx");
try {
    ISlide slide = pres.getSlides().get_Item(0);
    IShape shape1 = slide.getShapes().get_Item(1);
    IShape shape2 = slide.getShapes().get_Item(2);
    IShape shape3 = slide.getShapes().get_Item(4);
    SlideUtil.alignShapes(ShapesAlignmentType.AlignTop, true, pres.getSlides().get_Item(0), new int[]
    {
        slide.getShapes().indexOf(shape1),
        slide.getShapes().indexOf(shape2),
        slide.getShapes().indexOf(shape3)
    });
} finally {
    if (pres != null) pres.dispose();
}
}

Example 2

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

Presentation pres = new Presentation("example.pptx");
try {
    SlideUtil.alignShapes(ShapesAlignmentType.AlignBottom, false, pres.getSlides().get_Item(0));
} finally {
    if (pres != null) pres.dispose();
}

คุณสมบัติการพลิก

ใน Aspose.Slides คลาส ShapeFrame ให้การควบคุมการสะท้อนแนวนอนและแนวตั้งของรูปทรงผ่านคุณสมบัติ flipH และ flipV ทั้งสองเป็นประเภท byte โดยค่าที่เป็น 1 หมายถึงพลิก, 0 ไม่พลิก, หรือ -1 ใช้ค่าดีฟอลต์ ค่าดังกล่าวเข้าถึงได้จาก Frame ของรูปทรง

เพื่อปรับการตั้งค่าการพลิก จะสร้างอินสแตนซ์ใหม่ของ ShapeFrame ด้วยตำแหน่งและขนาดปัจจุบันของรูปทรง, ค่าที่ต้องการสำหรับ flipH และ flipV, และมุมการหมุน การกำหนดอินสแตนซ์นี้ให้กับ Frame ของรูปทรงและบันทึกงานนำเสนอจะทำให้การสะท้อนถูกนำไปใช้และบันทึกลงไฟล์ผลลัพธ์

สมมติว่ามีไฟล์ sample.pptx ที่สไลด์แรกมีรูปทรงเดียวที่ตั้งค่า flip เริ่มต้นตามด้านล่าง

รูปทรงที่ต้องการพลิก

โค้ดตัวอย่างต่อไปนี้ดึงคุณสมบัติ flip ปัจจุบันของรูปทรงและพลิกทั้งแนวนอนและแนวตั้ง

Presentation presentation = new Presentation("sample.pptx");
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IShape shape = slide.getShapes().get_Item(0);

    // ดึงคุณสมบัติการพลิกแนวนอนของรูปทรง
    byte horizontalFlip = shape.getFrame().getFlipH();
    System.out.println("Horizontal flip: " + horizontalFlip);

    // ดึงคุณสมบัติการพลิกแนวตั้งของรูปทรง
    byte verticalFlip = shape.getFrame().getFlipV();
    System.out.println("Vertical flip: " + verticalFlip);

    float x = shape.getFrame().getX();
    float y = shape.getFrame().getY();
    float width = shape.getFrame().getWidth();
    float height = shape.getFrame().getHeight();
    byte flipH = NullableBool.True; // พลิกแนวนอน.
    byte flipV = NullableBool.True; // พลิกแนวนอน.
    float rotation = shape.getFrame().getRotation();

    shape.setFrame(new ShapeFrame(x, y, width, height, flipH, flipV, rotation));

    presentation.save("output.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

ผลลัพธ์:

รูปทรงที่พลิกแล้ว

ถามตอบ

ฉันสามารถรวมรูปทรง (union/intersect/subtract) บนสไลด์เหมือนในโปรแกรมเดสก์ท็อปได้หรือไม่?

ไม่มี API การดำเนินการบูลีนในตัว คุณสามารถทำโดยประมาณโดยสร้างรูปร่างสรุปที่ต้องการเอง เช่น คำนวณเรขาคณิตผลลัพธ์ (ผ่าน GeometryPath) แล้วสร้างรูปทรงใหม่ด้วยโครงร่างนั้น พร้อมกับลบรูปทรงต้นฉบับถ้าต้องการ

ฉันจะควบคุมลำดับการซ้อน (z-order) เพื่อให้รูปทรงอยู่ด้านบนเสมอได้อย่างไร?

เปลี่ยนลำดับการแทรก/ย้ายภายในคอลเล็กชัน shapes ของสไลด์ เพื่อให้ได้ผลลัพธ์คาดเดาได้ ให้สรุปลำดับ z-order หลังจากทำการแก้ไขสไลด์อื่น ๆ เสร็จแล้ว

ฉันสามารถ ‘ล็อค’ รูปทรงเพื่อป้องกันไม่ให้ผู้ใช้แก้ไขใน PowerPoint ได้หรือไม่?

ได้ โดยตั้งค่าธงป้องกันระดับรูปทรง (เช่น lock selection, movement, resizing, text edits) ดูเอกสารที่เกี่ยวกับการป้องกันระดับพรีเซนเทชัน หากต้องการความปลอดภัยที่สูงขึ้น สามารถผสานกับการจำกัดระดับไฟล์เช่นคำแนะนำให้เป็นแบบอ่านอย่างเดียวหรือการตั้งรหัสผ่าน /slides/th/java/password-protected-presentation/