Python द्वारा Java में प्रस्तुति आकारों का प्रबंधन

सारांश

Aspose.Slides for Python via Java स्लाइड पर आकारों को क्रमबद्ध ShapeCollection के रूप में दर्शाता है। यह संग्रह वह स्थान है जहाँ आप आकारों को खोज और संशोधित कर सकते हैं और उनका स्टैक क्रम निर्धारित करता है: इंडेक्स 0 सबसे पीछे वाला आकार है, जबकि अंतिम इंडेक्स सबसे आगे वाला आकार है।

यह लेख उसी मॉडल को अपनाता है। पहले यह समझाता है कि किसी आकार की विश्वसनीय पहचान कैसे करें और प्रीसेट आकार समायोजन बिंदुओं को कैसे बदलें, फिर क्लोन, हटाना, छिपाना और क्रम बदलने के बारे में दिखाता है। अंतिम भाग लेआउट‑स्तर फॉर्मेटिंग, SVG निर्यात, अलाइनमेंट और फ़्लिप सेटिंग्स को कवर करता है। प्रत्येक उदाहरण स्वतंत्र है, इसलिए आप केवल वही ऑपरेशन उपयोग कर सकते हैं जो आपके कार्य‑प्रवाह के लिए आवश्यक है।

आकारों की पहचान और खोज

कलेक्शन इंडेक्स ज्ञात फ़ाइल को प्रोसेस करते समय सुविधाजनक होते हैं, लेकिन वे स्थायी पहचानकर्ता नहीं हैं। आकार जोड़ने, हटाने या क्रम बदलने से उनका इंडेक्स बदल सकता है। प्रस्तुति के निर्माण और रख‑रखाव के तरीके के अनुसार पहचानकर्ता चुनें:

  • Name उन टेम्पलेट्स के लिए उपयोगी है जिन्हें डेवलपर नियंत्रित करता है और PowerPoint के Selection Pane में आसानी से देखा जा सकता है। नामों को संपादित किया जा सकता है और वे अनिवार्य रूप से अद्वितीय नहीं होते, इसलिए यदि कोड उन पर निर्भर करता है तो नामकरण नियम स्थापित करें।
  • AlternativeText तब उपयोगी होता है जब कोई एक्सेसिबिलिटी विवरण या लेखक‑द्वारा दिया गया टैग पहले से ही आकार की पहचान करता हो। यह उपयोगकर्ताओं को दिखता है, स्थानीयकृत या एक्सेसिबिलिटी के लिये पुनः‑लेखा जा सकता है, और यह अनिवार्य रूप से अद्वितीय नहीं है। अर्थपूर्ण एक्सेसिबिलिटी टेक्स्ट को चुपचाप डेटाबेस कुंजी के रूप में उपयोग न करें।
  • OfficeInteropShapeId एक केवल‑पढ़ने योग्य पहचानकर्ता है जो स्लाइड के भीतर अद्वितीय है और PowerPoint इंटरोप द्वारा उपयोग किए जाने वाले Shape ID से मेल खाता है। PowerPoint के साथ एकीकरण या किसी आकार के जीवन‑काल के दौरान अस्पष्ट संदर्भ की आवश्यकता होने पर इसका उपयोग करें। क्लोन या पुनः‑निर्मित आकार अलग होता है और अपना स्वयं का ID प्राप्त करता है।

संबंधित getUniqueId विधि प्रस्तुति‑स्तर पर पहचानकर्ता लौटाती है, लेकिन यह पहचानकर्ता ऐड‑इन के लिये अभिप्रेत है और पुनः‑सेट किया जा सकता है। इसे स्थायी बाहरी कुंजी के रूप में नहीं माना जाना चाहिए। यदि दीर्घकालिक पहचान आवश्यक है, तो अनुप्रयोग डेटा में मैपिंग रखें और यह सत्यापित करें कि अपेक्षित आकार अभी भी मौजूद है।

निम्न उदाहरण नाम द्वारा सटीक तुलना के साथ खोजता है और स्लाइड‑स्कोप्ड इंटरोप ID रिपोर्ट करता है। जब टेम्पलेट में अपेक्षित आकार नहीं मिलता, तो कोड गलत ऑब्जेक्ट के साथ आगे बढ़ने के बजाय वह परिणाम रिपोर्ट करता है।

import jpype
import asposeslides

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

from asposeslides.api import Presentation

presentation = Presentation("input.pptx")
try:
    slide = presentation.getSlides().get_Item(0)

    target_shape = None
    for shape in slide.getShapes():
        if shape.getName() == "RevenueChart":
            target_shape = shape
            break

    if target_shape is None:
        print("The shape 'RevenueChart' was not found on slide 1.")
    else:
        print(f"Found {target_shape.getName()}; interop ID: {target_shape.getOfficeInteropShapeId()}")
finally:
    presentation.dispose()

जब कोई ऑपरेशन आकार प्रकार विशेष होता है, तो प्रकार‑विशिष्ट सदस्य उपयोग करने से पहले प्रकार जाँचें। यह उदाहरण तभी टेक्स्ट और वैकल्पिक टेक्स्ट अपडेट करता है जब नामित वस्तु एक AutoShape हो।

import jpype
import asposeslides

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

from asposeslides.api import AutoShape, Presentation, SaveFormat

presentation = Presentation("input.pptx")
try:
    slide = presentation.getSlides().get_Item(0)

    candidate = None
    for shape in slide.getShapes():
        if shape.getName() == "StatusLabel":
            candidate = shape
            break

    if isinstance(candidate, AutoShape):
        candidate.getTextFrame().setText("Approved")
        candidate.setAlternativeText("Approval status: approved")
        presentation.save("identified-shape.pptx", SaveFormat.Pptx)
    else:
        print("'StatusLabel' is missing or is not an AutoShape.")
finally:
    presentation.dispose()

प्रीसेट आकार समायोजन की पहचान और संशोधन

प्रीसेट ज्योमेट्री आकार समायोजन बिंदु उजागर कर सकते हैं जो कोने के आकार, तीर अनुपात या चाप कोण जैसे गुणों को नियंत्रित करते हैं। इन्हें केवल‑पढ़ने योग्य GeometryShape.getAdjustments संग्रह के माध्यम से पहुँचें। यह संग्रह स्वयं आकार द्वारा प्रदान किया जाता है, लेकिन प्रत्येक AdjustValue में एक मान होता है जिसे बदला जा सकता है।

केवल स्थिर संग्रह इंडेक्स पर निर्भर न रहें। समायोजनों पर इटरेट करें और केवल‑पढ़ने योग्य getType विधि की जाँच करें, जिसका ShapeAdjustmentType मान बताता है कि समायोजन किस चीज़ को नियंत्रित करता है। केवल‑पढ़ने योग्य getName विधि अतिरिक्त पहचान जानकारी प्रदान करती है और जब प्रीसेट में समान अर्थ वाले कई समायोजन हों तब विशेष रूप से उपयोगी होती है।

समायोजन के अर्थ से मेल खाने वाले मान‑विधि का उपयोग करें:

समायोजन प्रकार उद्देश्य बदलने के लिये मान
CornerSize गोल कोनों का आकार setRawValue
ArrowTailThickness तीर के पूंछ की मोटाई setRawValue
ArrowheadLength तीर की नोक की लंबाई setRawValue
ArrowheadWidth तीर की नोक की चौड़ाई setRawValue
StartAngle पाई या चाप का प्रारंभिक कोण setAngleValue
EndAngle पाई या चाप का अंतिम कोण setAngleValue

getType और getName केवल‑पढ़ने योग्य जानकारी लौटाते हैं। getRawValue और setRawValue प्रीसेट की मूल ज्योमेट्री इकाइयों में पूर्णांक के साथ काम करते हैं, जबकि getAngleValue और setAngleValue डिग्री में कोण के साथ काम करते हैं। समायोजन की संख्या, क्रम, अर्थ और वैध रेंज प्रीसेट ShapeType पर निर्भर करती है। एक प्रीसेट के लिये मान्य एक मान दूसरे प्रीसेट में अमान्य या अलग प्रभाव डाल सकता है।

जब getType ShapeAdjustmentType.Custom लौटाता है, तो API कोई मानक अर्थ नहीं पहचानती। getName, प्रीसेट प्रकार और मौजूदा मान देखें, और तभी समायोजन बदलें जब अपेक्षित अर्थ और रेंज ज्ञात हों। पहचाने गये प्रकारों के लिये भी जाँचें कि क्या वही प्रकार कई बार प्रकट होता है, तब ही मान चुनें। Connector आलेख में कनेक्टर बेंड समायोजनों की स्थिति दिखायी गयी है।

निम्न पूर्ण उदाहरण तीन प्रीसेट आकारों के डिफ़ॉल्ट और संशोधित संस्करण बनाता है। यह हर समायोजन पर इटरेट करता है, उसका नाम और प्रकार रिपोर्ट करता है, आकार‑संबंधी मानों को setRawValue से बदलता है, कोणों को setAngleValue से बदलता है, और परिणाम सहेजता है। बायाँ कॉलम डिफ़ॉल्ट ज्योमेट्री रखता है; दायाँ कॉलम समायोजित गोल आयत, चार‑तरफ़ा तीर और पाई दिखाता है।

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, ShapeAdjustmentType, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    # डिफ़ॉल्ट और समायोजित आकार कॉलम के लिए हेडर जोड़ता है।
    default_column_label = slide.getShapes().addAutoShape(ShapeType.Rectangle, 40, 20, 250, 30)
    default_column_label.getTextFrame().setText("Default preset geometry")
    adjusted_column_label = slide.getShapes().addAutoShape(ShapeType.Rectangle, 390, 20, 250, 30)
    adjusted_column_label.getTextFrame().setText("Modified adjustment values")

    slide.getShapes().addAutoShape(ShapeType.RoundCornerRectangle, 80, 70, 160, 70)
    modified_rounded_rectangle = slide.getShapes().addAutoShape(ShapeType.RoundCornerRectangle, 430, 70, 160, 70)
    modified_rounded_rectangle.setName("ModifiedRoundedRectangle")

    slide.getShapes().addAutoShape(ShapeType.QuadArrow, 80, 180, 160, 110)
    modified_arrow = slide.getShapes().addAutoShape(ShapeType.QuadArrow, 430, 180, 160, 110)
    modified_arrow.setName("ModifiedQuadArrow")

    slide.getShapes().addAutoShape(ShapeType.Pie, 95, 330, 130, 130)
    modified_pie = slide.getShapes().addAutoShape(ShapeType.Pie, 445, 330, 130, 130)
    modified_pie.setName("ModifiedPie")

    shapes_to_adjust = [modified_rounded_rectangle, modified_arrow, modified_pie]

    for shape in shapes_to_adjust:
        for adjustment_index in range(shape.getAdjustments().size()):
            adjustment = shape.getAdjustments().get_Item(adjustment_index)
            print(f"{shape.getName()} / {adjustment.getName()}: {adjustment.getType()}")

            if adjustment.getType() == ShapeAdjustmentType.CornerSize:
                adjustment.setRawValue(5000)
            elif adjustment.getType() == ShapeAdjustmentType.ArrowTailThickness:
                adjustment.setRawValue(25000)
            elif adjustment.getType() == ShapeAdjustmentType.ArrowheadLength:
                adjustment.setRawValue(30000)
            elif adjustment.getType() == ShapeAdjustmentType.ArrowheadWidth:
                adjustment.setRawValue(40000)
            elif adjustment.getType() == ShapeAdjustmentType.StartAngle:
                adjustment.setAngleValue(30)
            elif adjustment.getType() == ShapeAdjustmentType.EndAngle:
                adjustment.setAngleValue(300)
            elif adjustment.getType() == ShapeAdjustmentType.Custom:
                print(f"Custom adjustment '{adjustment.getName()}' was not changed.")

    presentation.save("preset-shape-adjustments.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

समायोजन बदलने से पहले अर्थ‑जाँच करने से कोड का इरादा स्पष्ट रहता है और यह मानते हुए त्रुटियों से बचता है कि विभिन्न प्रीसेट आकारों में समान संग्रह‑इंडेक्स का समान अर्थ है।

आकार संग्रह में संशोधन

जोड़ने, क्लोन करने, हटाने और क्रम‑बदलने की विधियाँ संग्रह पर तुरंत प्रभाव डालती हैं। यदि कोई ऑपरेशन आकारों की संख्या या क्रम बदलता है, तो उस ऑपरेशन से पहले प्राप्त किए गये इंडेक्स पर निर्भर नहीं रहना चाहिए।

आकार क्लोन करना

addClone एक स्वतंत्र कॉपी बनाता है और उसे लक्ष्य संग्रह के अंत में जोड़ता है। insertClone भी कॉपी बनाता है लेकिन उसे निर्दिष्ट z‑order इंडेक्स पर रखता है। समन्वय‑स्वीकार करने वाले ओवरलोड क्लोन का आकार नहीं बदलते; चौड़ाई‑और‑ऊँचाई वाले ओवरलोड इसे आकार बदल भी सकते हैं।

निम्न उदाहरण एक लक्ष्य स्लाइड बनाता है, लेबल‑युक्त आयत को आगे क्लोन करता है, और दूसरा क्लोन पीछे सम्मिलित करता है। किसी भी क्लोन में परिवर्तन स्रोत आकार को प्रभावित नहीं करता।

import jpype
import asposeslides

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

from asposeslides.api import AutoShape, Presentation, SaveFormat, ShapeType, SlideLayoutType

presentation = Presentation()
try:
    source_slide = presentation.getSlides().get_Item(0)
    source_shape = source_slide.getShapes().addAutoShape(ShapeType.Rectangle, 40, 40, 180, 60)
    source_shape.setName("SourceLabel")
    source_shape.getTextFrame().setText("Source")

    blank_layout = presentation.getMasters().get_Item(0).getLayoutSlides().getByType(SlideLayoutType.Blank)
    destination_slide = presentation.getSlides().addEmptySlide(blank_layout)

    front_clone_shape = destination_slide.getShapes().addClone(source_shape, 80, 80)
    front_clone_shape.setName("FrontClone")
    if isinstance(front_clone_shape, AutoShape):
        front_clone_shape.getTextFrame().setText("Front clone")
    else:
        print("The front clone is not an AutoShape; its text was not changed.")

    back_clone_shape = destination_slide.getShapes().insertClone(0, source_shape, 80, 180)
    back_clone_shape.setName("BackClone")
    if isinstance(back_clone_shape, AutoShape):
        back_clone_shape.getTextFrame().setText("Back clone")
    else:
        print("The back clone is not an AutoShape; its text was not changed.")

    presentation.save("cloned-shapes.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

क्लोन आकार की सामग्री और फ़ॉर्मेटिंग, जिसमें उसका नाम और वैकल्पिक टेक्स्ट शामिल है, को भी कॉपी करता है। जब ये मान अद्वितीय होने चाहिए तो क्लोन को नए तार्किक पहचानकर्ता दें। जटिल आकारों द्वारा उपयोग किए गये संसाधनों को प्रस्तुति संभालती है, लेकिन क्लोन एक नया संग्रह आइटम होता है जिसका अपना आकार पहचान होता है।

आकार हटाना

remove एक विशिष्ट आकार वस्तु को उसकी संग्रह से हटाता है। जब आप इंडेक्स‑आधारित इटरेशन के दौरान कई मिलान हटाते हैं, तो अंत से शुरू करके चलें ताकि शेष इंडेक्स वैध रहें।

यह उदाहरण निर्दिष्ट नाम वाले सभी आकारों को हटाता है। यह वर्तमान इंडेक्स पर आकार पढ़ता है, न कि निश्चित संग्रह आइटम, और आकार को अनावश्यक रूप से कास्ट नहीं करता।

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    keep_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 40, 40, 140, 60)
    keep_shape.setName("Keep")

    first_temporary_shape = slide.getShapes().addAutoShape(ShapeType.Ellipse, 220, 40, 80, 80)
    first_temporary_shape.setName("Temporary")

    second_temporary_shape = slide.getShapes().addAutoShape(ShapeType.Triangle, 340, 40, 100, 80)
    second_temporary_shape.setName("Temporary")

    for i in range(slide.getShapes().size() - 1, -1, -1):
        shape = slide.getShapes().get_Item(i)
        if shape.getName() == "Temporary":
            slide.getShapes().remove(shape)

    presentation.save("removed-shapes.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

हटाने के बाद आकार गणना और बाद के आकारों के इंडेक्स बदलते हैं। अप्रभावित आकारों के संदर्भ सहेजे गये इंडेक्स की तुलना में अधिक विश्वसनीय रहते हैं। साथ ही कनेक्टर, एनीमेशन और अन्य प्रस्तुति सुविधाओं पर भी विचार करें जो हटाए गये वस्तु को संदर्भित कर सकते हैं; दृश्य आकार हटाने से स्लाइड की उपस्थिति से अधिक कुछ बदल सकता है।

आकार छिपाना

Hidden को True पर सेट करने से आकार संग्रह में बना रहता है लेकिन सामान्य स्लाइड शो में दिखाई नहीं देता। उसका इंडेक्स, फ़ॉर्मेटिंग और सामग्री कोड के लिये उपलब्ध रहती है, इसलिए वैकल्पिक तत्वों को बाद में पुनः‑प्रकट करने के लिये छिपाना उपयुक्त है।

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, ShapeType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    visible_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 40, 40, 160, 60)
    visible_shape.setName("VisibleLabel")

    optional_shape = slide.getShapes().addAutoShape(ShapeType.Moon, 240, 40, 100, 100)
    optional_shape.setName("OptionalDecoration")

    for shape in slide.getShapes():
        if shape.getName() == "OptionalDecoration":
            shape.setHidden(True)

    presentation.save("hidden-shape.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

छिपाना हटाना या सुरक्षा नहीं है। वस्तु को उपयोगकर्ता या कोड द्वारा अभी भी खोजा और अनहिड़ किया जा सकता है, और वह प्रस्तुति फ़ाइल का हिस्सा बनी रहती है।

Z‑Order बदलना

ओवरलैपिंग आकार संग्रह क्रम में पेंट होते हैं। reorder मौजूदा आकार को लक्ष्य इंडेक्स पर ले जाता है बिना क्लोन किए। इंडेक्स 0 पीछे है; संग्रह size‑1 आगे है।

import jpype
import asposeslides

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

from asposeslides.api import FillType, Presentation, SaveFormat, ShapeType
from java.awt import Color

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    blue_rectangle = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 220, 120)
    blue_rectangle.setName("BlueRectangle")
    blue_rectangle.getFillFormat().setFillType(FillType.Solid)
    blue_rectangle.getFillFormat().getSolidFillColor().setColor(Color.BLUE)

    orange_ellipse = slide.getShapes().addAutoShape(ShapeType.Ellipse, 180, 140, 220, 120)
    orange_ellipse.setName("OrangeEllipse")
    orange_ellipse.getFillFormat().setFillType(FillType.Solid)
    orange_ellipse.getFillFormat().getSolidFillColor().setColor(Color.ORANGE)

    slide.getShapes().reorder(slide.getShapes().size() - 1, blue_rectangle)
    presentation.save("reordered-shapes.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

आयत पहले बनाया जाता है और प्रारम्भ में दीर्घवृत्त के पीछे रहता है। उसे अंतिम इंडेक्स पर ले जाने से वह आगे आ जाता है। सभी संबंधित आकारों को जोड़ने या क्लोन करने के बाद z‑order को अंतिम रूप दें, क्योंकि ये ऑपरेशन नए संग्रह आइटम जोड़ते या सम्मिलित करते हैं और स्टैक क्रम बदल सकते हैं।

लेआउट स्लाइड्स पर आकारों का निरीक्षण

सामान्य स्लाइड्स, लेआउट स्लाइड्स और मास्टर स्लाइड्स के अलग‑अलग आकार संग्रह होते हैं। लेआउट संग्रह में एक आकार सामान्य स्लाइड पर समान‑स्थिति वाले आकार के समान वस्तु नहीं होता। लेआउट आकारों का निरीक्षण तब करें जब आपको लेआउट द्वारा प्रदान किए गये फ़ॉर्मेटिंग को समझना या बदलना हो।

निम्न उदाहरण प्रत्येक लेआउट आकार की FillFormat और LineFormat को पढ़ता है, बिना यह मानते हुए कि हर आकार एक AutoShape है।

import jpype
import asposeslides

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

from asposeslides.api import Presentation

presentation = Presentation("input.pptx")
try:
    for layout_slide in presentation.getLayoutSlides():
        for shape in layout_slide.getShapes():
            fill_type = shape.getFillFormat().getFillType()
            line_width = shape.getLineFormat().getWidth()
            print(f"{layout_slide.getName()} / {shape.getName()}: fill={fill_type}, line width={line_width}")
finally:
    presentation.dispose()

लेआउट में बदलाव कई स्लाइड्स को प्रभावित कर सकता है जो उसका उपयोग करती हैं। लेआउट आकार बदलने से पहले निर्धारित करें कि क्या कोई सामान्य स्लाइड वस्तु को विरासत में प्राप्त करती है या स्थानीय ओवरराइड रखती है, और उस लेआउट का उपयोग करने वाली प्रत्येक स्लाइड का परीक्षण करें।

आकार को SVG में निर्यात करना

Shape की writeAsSvg विधि एक आकार की रेंडर की गई सामग्री को स्ट्रीम में लिखती है। परिणाम में केवल वह आकार होता है, पूरी स्लाइड पृष्ठभूमि या पड़ोसी आकार नहीं।

import jpype
import asposeslides

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

from asposeslides.api import Presentation
from pathlib import Path
from java.io import ByteArrayOutputStream

presentation = Presentation("input.pptx")
try:
    slide = presentation.getSlides().get_Item(0)

    if slide.getShapes().size() == 0:
        print("Slide 1 does not contain a shape to export.")
    else:
        shape = slide.getShapes().get_Item(0)
        svg_stream = ByteArrayOutputStream()
        try:
            shape.writeAsSvg(svg_stream)
            svg_bytes = bytes(svg_stream.toByteArray())
            Path("shape.svg").write_bytes(svg_bytes)
        except OSError as exception:
            print(f"The SVG file could not be written: {exception}")
        finally:
            svg_stream.close()
finally:
    presentation.dispose()

रेंडरिंग के दौरान प्रस्तुति खुली रखे। आउटपुट आकार की फ़ॉर्मेटिंग तथा फ़ॉन्ट और छवियों जैसी संसाधनों पर निर्भर करता है। यदि आपको पूरी रचना चाहिए तो स्लाइड को निर्यात करें, न कि व्यक्तिगत आकार को। कॉलर को स्ट्रीम का स्वामित्व होता है और उसे बंद करना आवश्यक है।

आकारों को संरेखित करना

SlideUtil.alignShapes के ओवरलोड सभी आकारों या चयनित संग्रह इंडेक्स को संरेखित करते हैं। ShapesAlignmentType किनारा, केंद्र रेखा या वितरण मोड निर्दिष्ट करता है। align_to_slide को True पर सेट करने से स्लाइड किनारे उपयोग होते हैं; False पर सेट करने से चयनित आकार आपस में संरेखित होते हैं।

यह उदाहरण तीन आकारों को स्लाइड के शीर्ष किनारे पर संरेखित करता है। लौटाए गये आकार संदर्भों को संरेखण से ठीक पहले उनके वर्तमान इंडेक्स में परिवर्तित किया जाता है।

import jpype
import asposeslides

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

from asposeslides.api import Presentation, SaveFormat, ShapeType, ShapesAlignmentType, SlideUtil

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    first_shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 60, 80, 120, 50)
    second_shape = slide.getShapes().addAutoShape(ShapeType.Ellipse, 240, 160, 120, 50)
    third_shape = slide.getShapes().addAutoShape(ShapeType.Triangle, 420, 240, 120, 50)
    first_shape.setName("FirstAlignedShape")
    second_shape.setName("SecondAlignedShape")
    third_shape.setName("ThirdAlignedShape")

    shape_indexes = jpype.JArray(jpype.JInt)([slide.getShapes().indexOf(first_shape), slide.getShapes().indexOf(second_shape), slide.getShapes().indexOf(third_shape)])

    SlideUtil.alignShapes(ShapesAlignmentType.AlignTop, True, slide, shape_indexes)
    presentation.save("aligned-shapes.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

संरेखण स्थिति बदलता है, z‑order नहीं। सापेक्ष संरेखण सामान्यतः कम से कम दो आकारों की आवश्यकता रखता है, जबकि क्षैतिज या लंबवत वितरण के लिये पर्याप्त संख्या में आकारों की आवश्यकता होती है ताकि अंतराल निर्धारित किया जा सके। विधि कॉल करने से पहले यदि आप संग्रह संशोधित करते हैं तो इंडेक्स पुनः‑गणना करें।

आकार को फ़्लिप करना

ShapeFrame क्लास स्थिति, आकार, क्षैतिज और लंबवत फ़्लिप सेटिंग्स तथा घूर्णन संग्रहीत करता है। इसकी getFlipH और getFlipV मान NullableBool का उपयोग करते हैं: True फ़्लिप सक्षम करता है, False निष्क्रिय करता है, और NotDefined अनिर्दिष्ट/डिफ़ॉल्ट स्थिति को बनाए रखता है।

नीचे दिया गया इनपुट प्रस्तुति एक अनफ़्लिप्ड आकार रखती है।

The shape before flipping

उदाहरण सभी अन्य फ्रेम मानों को बरकरार रखता है और केवल दो फ़्लिप सेटिंग को बदलता है। यह महत्वपूर्ण है क्योंकि नया Frame असाइन करने से पूरा फ्रेम बदल जाता है।

import jpype
import asposeslides

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

from asposeslides.api import NullableBool, Presentation, SaveFormat, ShapeFrame

presentation = Presentation("sample.pptx")
try:
    shape = presentation.getSlides().get_Item(0).getShapes().get_Item(0)
    frame = shape.getFrame()

    print(f"Horizontal flip before change: {frame.getFlipH()}")
    print(f"Vertical flip before change: {frame.getFlipV()}")

    flipped_frame = ShapeFrame(frame.getX(), frame.getY(), frame.getWidth(), frame.getHeight(), NullableBool.True_, NullableBool.True_, frame.getRotation())
    shape.setFrame(flipped_frame)

    presentation.save("flipped-shape.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

सहेजा गया आकार क्षैतिज और लंबवत दोनों दिशा में प्रतिबिंबित हो जाता है, जबकि उसकी स्थिति, आकार और घूर्णन समान रहता है।

The shape after flipping

FAQ

क्या मुझे आकार पहचानकर्ता के रूप में संग्रह इंडेक्स का उपयोग करना चाहिए?

केवल अल्पकालिक प्रोसेसिंग के लिये जब संग्रह उस इंडेक्स के उपयोग से पहले नहीं बदलेगा। लिखित टेम्पलेट्स के लिये मान्य Name या AlternativeText नियम का उपयोग करें, या स्लाइड‑स्कोप्ड इंटरोप कार्य के लिये OfficeInteropShapeId प्रयोग करें।

क्या आकार को छिपाने से वह z‑order से हट जाता है?

नहीं। छिपा आकार वही इंडेक्स पर संग्रह में रहता है। उसे पाया, क्रम बदल, संपादित या फिर से दृश्यमान किया जा सकता है।

क्लोन किया गया आकार किसी अन्य आकार के सामने क्यों दिखाई दिया?

addClone क्लोन को संग्रह के अंत में जोड़ता है, जो z‑order के आगे के बराबर है। प्रारम्भिक इंडेक्स चुनने के लिये insertClone का उपयोग करें या सभी आकार जोड़ने के बाद reorder करें।

क्या मैं प्रीसेट आकार समायोजन की पहचान के लिये स्थिर इंडेक्स इस्तेमाल कर सकता हूँ?

केवल तभी जब आप सटीक प्रीसेट और संग्रह लेआउट को सत्यापित करें। GeometryShape.getAdjustments के माध्यम से इटरेट करें और AdjustValue.getType की जाँच करें; जब समान अर्थ वाला प्रकार कई बार आता है तो अतिरिक्त जानकारी के लिये AdjustValue.getName का उपयोग करें।