จัดการรูปทรงในการนำเสนอด้วย 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:
- สร้างอินสแตนซ์ของคลาส Presentation
- รับอ็อบเจกต์อ้างอิงของสไลด์โดยใช้ดัชนีของมัน
- เข้าถึงคอลเล็กชันรูปทรงของสไลด์ต้นทาง
- เพิ่มสไลด์ใหม่ลงในงานนำเสนอ
- คัดลอกรูปทรงจากคอลเล็กชันของสไลด์ต้นทางไปยังสไลด์ใหม่
- บันทึกงานนำเสนอที่แก้ไขเป็นไฟล์ 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 อนุญาตให้ผู้พัฒนาลบรูปทรงใด ๆ ได้ เพื่อลบรูปทรงจากสไลด์ใดสไลด์หนึ่ง โปรดทำตามขั้นตอนด้านล่าง:
- สร้างอินสแตนซ์ของคลาส Presentation
- เข้าถึงสไลด์แรก
- ค้นหารูปทรงที่มี AlternativeText เฉพาะ
- ลบรูปทรง
- บันทึกไฟล์ลงดิสก์
// สร้างออบเจกต์ 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 อนุญาตให้ผู้พัฒนาซ่อนรูปทรงใด ๆ ได้ เพื่ซ่อนรูปทรงจากสไลด์ใดสไลด์หนึ่ง โปรดทำตามขั้นตอนด้านล่าง:
- สร้างอินสแตนซ์ของคลาส Presentation
- เข้าถึงสไลด์แรก
- ค้นหารูปทรงที่มี AlternativeText เฉพาะ
- ซ่อนรูปทรง
- บันทึกไฟล์ลงดิสก์
// สร้างอินสแตนซ์ของคลาส 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 อนุญาตให้ผู้พัฒนาจัดลำดับรูปทรงใหม่ การจัดลำดับรูปทรงระบุว่ารูปทรงใดอยู่หน้า หรือใดอยู่หลัง เพื่อจัดลำดับรูปทรงจากสไลด์ใดสไลด์หนึ่ง โปรดทำตามขั้นตอนด้านล่าง:
- สร้างอินสแตนซ์ของคลาส Presentation
- เข้าถึงสไลด์แรก
- เพิ่มรูปทรง
- เพิ่มข้อความบางส่วนใน Text Frame ของรูปทรง
- เพิ่มรูปทรงอีกอันหนึ่งด้วยพิกัดเดียวกัน
- จัดลำดับรูปทรงใหม่
- บันทึกไฟล์ลงดิสก์
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 ของรูปทรง โปรดทำตามขั้นตอนด้านล่าง:
- สร้างอินสแตนซ์ของคลาส Presentation
- เข้าถึงสไลด์แรก
- เพิ่มรูปทรงใด ๆ ลงในสไลด์
- ทำงานบางอย่างกับรูปทรงที่เพิ่งเพิ่ม
- วนลูปผ่านรูปทรงเพื่อค้นหารูปทรง
- ตั้งค่า AlternativeText
- บันทึกไฟล์ลงดิสก์
// สร้างอินสแตนซ์ของคลาส 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/