Beheer tekstvakken in presentaties op Android

Inleiding

Teksten op dia’s staan doorgaans in tekstvakken of vormen. Daarom moet je, om tekst aan een dia toe te voegen, een tekstvak toevoegen en vervolgens tekst in dat tekstvak plaatsen. Aspose.Slides for Android via Java biedt de IAutoShape interface die je in staat stelt een vorm toe te voegen die tekst bevat.

Maak een tekstvak op een dia

Om een tekstvak op een dia te maken, doorloop je deze stappen:

  1. Maak een instantie van de Presentation klasse.
  2. Verkrijg een referentie naar de eerste dia in de nieuw aangemaakte presentatie.
  3. Voeg een IAutoShape object toe met ShapeType ingesteld op Rectangle op een opgegeven positie op de dia en verkrijg de referentie voor het nieuw toegevoegde IAutoShape object.
  4. Voeg een TextFrame eigenschap toe aan het IAutoShape object die tekst zal bevatten. In het onderstaande voorbeeld hebben we deze tekst toegevoegd: Aspose TextBox
  5. Schrijf tenslotte het PPTX‑bestand weg via het Presentation object.

Deze Java‑code – een implementatie van de bovenstaande stappen – toont hoe je tekst aan een dia kunt toevoegen:

// Instantieert Presentation
Presentation pres = new Presentation();
try {
    // Haalt de eerste dia in de presentatie op
    ISlide sld = pres.getSlides().get_Item(0);

    // Voegt een AutoShape toe met type ingesteld op Rectangle
    IAutoShape ashp = sld.getShapes().addAutoShape(ShapeType.Rectangle, 150, 75, 150, 50);

    // Voegt TextFrame toe aan de Rectangle
    ashp.addTextFrame(" ");

    // Benadert het TextFrame
    ITextFrame txtFrame = ashp.getTextFrame();

    // Maakt het Paragraph-object voor het TextFrame
    IParagraph para = txtFrame.getParagraphs().get_Item(0);

    // Maakt een Portion-object voor het Paragraph
    IPortion portion = para.getPortions().get_Item(0);

    // Stelt tekst in
    portion.setText("Aspose TextBox");

    // Slaat de presentatie op op de schijf
    pres.save("TextBox_out.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

Controleer op een tekstvakvorm

Aspose.Slides levert de isTextBox methode van de IAutoShape interface, waarmee je vormen kunt onderzoeken en tekstvakken kunt identificeren.

Tekstvak en vorm

Deze Java‑code laat zien hoe je kunt controleren of een vorm als tekstvak is aangemaakt:

Presentation presentation = new Presentation("sample.pptx");
try {
    ForEach.shape(presentation, (shape, slide, index) -> {
        if (shape instanceof IAutoShape) {
            IAutoShape autoShape = (IAutoShape) shape;
            System.out.println(autoShape.isTextBox() ? "shape is a text box" : "shape is not a text box");
        }
    });
} finally {
    presentation.dispose();
}

Let op dat als je eenvoudig een autoshape toevoegt met de addAutoShape methode van de IShapeCollection interface, de isTextBox methode van de autoshape false zal teruggeven. Nadat je echter tekst aan de autoshape toevoegt met de addTextFrame methode of de setText methode, geeft de isTextBox eigenschap true terug.

Presentation presentation = new Presentation();
ISlide slide = presentation.getSlides().get_Item(0);

IAutoShape shape1 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 10, 100, 40);
// shape1.isTextBox() retourneert false
shape1.addTextFrame("shape 1");
// shape1.isTextBox() retourneert true

IAutoShape shape2 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 110, 100, 40);
// shape2.isTextBox() retourneert false
shape2.getTextFrame().setText("shape 2");
// shape2.isTextBox() retourneert true

IAutoShape shape3 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 210, 100, 40);
// shape3.isTextBox() retourneert false
shape3.addTextFrame("");
// shape3.isTextBox() retourneert false

IAutoShape shape4 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 310, 100, 40);
// shape4.isTextBox() retourneert false
shape4.getTextFrame().setText("");
// shape4.isTextBox() retourneert false

Kolommen toevoegen aan een tekstvak

Aspose.Slides biedt de eigenschappen ColumnCount en ColumnSpacing (van de ITextFrameFormat interface en de TextFrameFormat klasse) die je in staat stellen kolommen toe te voegen aan tekstvakken. Je kunt het aantal kolommen in een tekstvak specificeren en de afstand in punten tussen de kolommen instellen.

Deze Java‑code demonstreert de beschreven bewerking:

Presentation pres = new Presentation();
try {
    // Haalt de eerste dia in de presentatie op
    ISlide slide = pres.getSlides().get_Item(0);

    // Voeg een AutoShape toe met type ingesteld op Rectangle
    IAutoShape aShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 300);

    // Voeg TextFrame toe aan de Rectangle
    aShape.addTextFrame("All these columns are limited to be within a single text container -- " +
            "you can add or delete text and the new or remaining text automatically adjusts " +
            "itself to flow within the container. You cannot have text flow from one container " +
            "to other though -- we told you PowerPoint's column options for text are limited!");

    // Haalt het tekstformaat van TextFrame op
    ITextFrameFormat format = aShape.getTextFrame().getTextFrameFormat();

    // Specificeert het aantal kolommen in TextFrame
    format.setColumnCount(3);

    // Specificeert de afstand tussen kolommen
    format.setColumnSpacing(10);

    // Slaat de presentatie op
    pres.save("ColumnCount.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

Kolommen toevoegen aan een tekstframe

Aspose.Slides for Android via Java biedt de eigenschap ColumnCount (van de ITextFrameFormat interface) die je in staat stelt kolommen toe te voegen in tekstframes. Met deze eigenschap kun je het gewenste aantal kolommen in een tekstframe opgeven.

Deze Java‑code laat zien hoe je een kolom toevoegt binnen een tekstframe:

String outPptxFileName = "ColumnsTest.pptx";
Presentation pres = new Presentation();
try {
    IAutoShape shape1 = pres.getSlides().get_Item(0).getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 300);
    TextFrameFormat format = (TextFrameFormat)shape1.getTextFrame().getTextFrameFormat();

    format.setColumnCount(2);
    shape1.getTextFrame().setText("All these columns are forced to stay within a single text container -- " +
            "you can add or delete text - and the new or remaining text automatically adjusts " +
            "itself to stay within the container. You cannot have text spill over from one container " +
            "to other, though -- because PowerPoint's column options for text are limited!");
    pres.save(outPptxFileName, SaveFormat.Pptx);

    Presentation test = new Presentation(outPptxFileName);
    try {
        IAutoShape autoShape = ((AutoShape)test.getSlides().get_Item(0).getShapes().get_Item(0));
        Assert.assertTrue(2 == autoShape.getTextFrame().getTextFrameFormat().getColumnCount());
        Assert.assertTrue(Double.NaN == autoShape.getTextFrame().getTextFrameFormat().getColumnSpacing());
    } finally {
        if (test != null) test.dispose();
    }

    format.setColumnSpacing(20);
    pres.save(outPptxFileName, SaveFormat.Pptx);

    Presentation test1 = new Presentation(outPptxFileName);
    try {
        IAutoShape autoShape = ((AutoShape)test1.getSlides().get_Item(0).getShapes().get_Item(0));
        Assert.assertTrue(2 == autoShape.getTextFrame().getTextFrameFormat().getColumnCount());
        Assert.assertTrue(20 == autoShape.getTextFrame().getTextFrameFormat().getColumnSpacing());
    } finally {
        if (test1 != null) test1.dispose();
    }

    format.setColumnCount(3);
    format.setColumnSpacing(15);
    pres.save(outPptxFileName, SaveFormat.Pptx);

    Presentation test2 = new Presentation(outPptxFileName);
    try {
        IAutoShape autoShape = ((AutoShape)test2.getSlides().get_Item(0).getShapes().get_Item(0));
        Assert.assertTrue(3 == autoShape.getTextFrame().getTextFrameFormat().getColumnCount());
        Assert.assertTrue(15 == autoShape.getTextFrame().getTextFrameFormat().getColumnSpacing());
    } finally {
        if (test2 != null) test2.dispose();
    }
} finally {
    if (pres != null) pres.dispose();
}

Tekst bijwerken

Aspose.Slides stelt je in staat de tekst in een tekstvak of alle teksten in een presentatie te wijzigen of bij te werken.

Deze Java‑code demonstreert een bewerking waarbij alle teksten in een presentatie worden bijgewerkt of gewijzigd:

Presentation pres = new Presentation("text.pptx");
try {
    for (ISlide slide : pres.getSlides())
    {
        for (IShape shape : slide.getShapes())
        {
            if (shape instanceof IAutoShape) //Controleert of de vorm een tekstframe ondersteunt (IAutoShape). 
            {
                IAutoShape autoShape = (IAutoShape)shape; 
                for (IParagraph paragraph : autoShape.getTextFrame().getParagraphs()) //Itereert door alinea's in het tekstframe
                {
                    for (IPortion portion : paragraph.getPortions()) //Itereert door elk deel in de alinea
                    {
                        portion.setText(portion.getText().replace("years", "months")); //Wijzigt de tekst
                        portion.getPortionFormat().setFontBold(NullableBool.True); //Wijzigt opmaak
                    }
                }
            }
        }
    }

    //Slaat de gewijzigde presentatie op
    pres.save("text-changed.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

Je kunt een koppeling in een tekstvak invoegen. Wanneer op het tekstvak wordt geklikt, wordt de gebruiker naar de link geleid.

Om een tekstvak met een koppeling toe te voegen, doorloop je de volgende stappen:

  1. Maak een instantie van de Presentation klasse.
  2. Verkrijg een referentie naar de eerste dia in de nieuw aangemaakte presentatie.
  3. Voeg een AutoShape object toe met ShapeType ingesteld op Rectangle op een opgegeven positie op de dia en verkrijg een referentie naar het nieuw toegevoegde AutoShape object.
  4. Voeg een TextFrame toe aan het AutoShape object dat Aspose TextBox als standaardtekst bevat.
  5. Instantieer de IHyperlinkManager klasse.
  6. Wijs het IHyperlinkManager object toe aan de HyperlinkClick eigenschap die gekoppeld is aan het gewenste gedeelte van het TextFrame.
  7. Schrijf tenslotte het PPTX‑bestand weg via het Presentation object.

Deze Java‑code – een implementatie van de bovenstaande stappen – toont hoe je een tekstvak met een hyperlink aan een dia kunt toevoegen:

// Instantieert een Presentation-klasse die een PPTX vertegenwoordigt
Presentation pres = new Presentation();
try {
    // Haalt de eerste dia in de presentatie op
    ISlide slide = pres.getSlides().get_Item(0);

    // Voegt een AutoShape-object toe met type ingesteld op Rectangle
    IShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 150, 150, 150, 50);

    // Cast de vorm naar AutoShape
    IAutoShape pptxAutoShape = (IAutoShape)shape;

    // Benadert de ITextFrame-eigenschap die bij de AutoShape hoort
    pptxAutoShape.addTextFrame("");

    ITextFrame textFrame = pptxAutoShape.getTextFrame();

    // Voeg wat tekst toe aan het frame
    textFrame.getParagraphs().get_Item(0).getPortions().get_Item(0).setText("Aspose.Slides");

    // Stelt de hyperlink in voor de portion-tekst
    IHyperlinkManager hyperlinkManager = textFrame.getParagraphs().get_Item(0).getPortions().get_Item(0).
            getPortionFormat().getHyperlinkManager();
    hyperlinkManager.setExternalHyperlinkClick("http://www.aspose.com");

    // Slaat de PPTX-presentatie op
    pres.save("hLink_out.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

FAQ

Wat is het verschil tussen een tekstvak en een tekst‑placeholder bij het werken met masterslides?

Een placeholder erft stijl/positie van de master en kan worden overschreven op layouts, terwijl een regulier tekstvak een zelfstandig object op een specifieke dia is en niet verandert wanneer je van layout wisselt.

Hoe kan ik een bulk‑tekstvervanging uitvoeren over de hele presentatie zonder tekst in grafieken, tabellen en SmartArt aan te passen?

Beperk je iteratie tot auto‑shapes die tekstframes hebben en sluit ingesloten objecten (charts, tables, SmartArt) uit door hun collecties afzonderlijk te doorlopen of die objecttypen over te slaan.