Zarządzanie polami tekstowymi w prezentacjach przy użyciu Java

Wprowadzenie

Teksty na slajdach zazwyczaj znajdują się w polach tekstowych lub kształtach. Dlatego, aby dodać tekst do slajdu, musisz dodać pole tekstowe, a następnie umieścić w nim tekst. Aspose.Slides for Java udostępnia interfejs IAutoShape, który pozwala dodać kształt zawierający tekst.

Utworzenie pola tekstowego na slajdzie

Aby utworzyć pole tekstowe na slajdzie, wykonaj następujące kroki:

  1. Utwórz instancję klasy Presentation.
  2. Uzyskaj odwołanie do pierwszego slajdu w nowo utworzonej prezentacji.
  3. Dodaj obiekt IAutoShape z typem ShapeType ustawionym na Rectangle w określonej pozycji na slajdzie i uzyskaj odwołanie do nowo dodanego obiektu IAutoShape.
  4. Dodaj właściwość TextFrame do obiektu IAutoShape, która będzie zawierała tekst. W poniższym przykładzie dodaliśmy tekst: Aspose TextBox
  5. Na koniec zapisz plik PPTX przy użyciu obiektu Presentation.

Ten kod w Javie — implementacja powyższych kroków — pokazuje, jak dodać tekst do slajdu:

// Tworzy instancję Presentation
Presentation pres = new Presentation();
try {
    // Pobiera pierwszy slajd w prezentacji
    ISlide sld = pres.getSlides().get_Item(0);

    // Dodaje AutoShape z typem ustawionym na Rectangle
    IAutoShape ashp = sld.getShapes().addAutoShape(ShapeType.Rectangle, 150, 75, 150, 50);

    // Dodaje TextFrame do Rectangle
    ashp.addTextFrame(" ");

    // Uzyskuje dostęp do TextFrame
    ITextFrame txtFrame = ashp.getTextFrame();

    // Tworzy obiekt Paragraph dla TextFrame
    IParagraph para = txtFrame.getParagraphs().get_Item(0);

    // Tworzy obiekt Portion dla Paragraph
    IPortion portion = para.getPortions().get_Item(0);

    // Ustawia tekst
    portion.setText("Aspose TextBox");

    // Zapisuje prezentację na dysk
    pres.save("TextBox_out.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

Sprawdzenie, czy kształt jest polem tekstowym

Aspose.Slides udostępnia metodę isTextBox z interfejsu IAutoShape, pozwalającą zbadać kształty i zidentyfikować pola tekstowe.

Text box and shape

Ten kod w Javie pokazuje, jak sprawdzić, czy kształt został utworzony jako pole tekstowe:

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();
}

Uwaga: jeśli po prostu dodasz autoshape metodą addAutoShape z interfejsu IShapeCollection, metoda isTextBox tego autoshape zwróci false. Jednak po dodaniu tekstu do autoshape metodą addTextFrame lub setText, właściwość isTextBox zwróci true.

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

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

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

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

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

Dodawanie kolumn do pola tekstowego

Aspose.Slides udostępnia właściwości ColumnCount i ColumnSpacing (z interfejsu ITextFrameFormat oraz klasy TextFrameFormat), które pozwalają dodać kolumny do pól tekstowych. Możesz określić liczbę kolumn w polu tekstowym oraz odstęp w punktach między kolumnami.

Ten kod w Javie demonstruje opisane działanie:

Presentation pres = new Presentation();
try {
    // Pobiera pierwszy slajd w prezentacji
    ISlide slide = pres.getSlides().get_Item(0);

    // Dodaje AutoShape z typem ustawionym na Rectangle
    IAutoShape aShape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 300);

    // Dodaje TextFrame do prostokąta
    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!");

    // Pobiera format tekstu TextFrame
    ITextFrameFormat format = aShape.getTextFrame().getTextFrameFormat();

    // Określa liczbę kolumn w TextFrame
    format.setColumnCount(3);

    // Określa odstęp między kolumnami
    format.setColumnSpacing(10);

    // Zapisuje prezentację
    pres.save("ColumnCount.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

Dodawanie kolumn do ramki tekstowej

Aspose.Slides for Java udostępnia właściwość ColumnCount (z interfejsu ITextFrameFormat), która pozwala dodać kolumny w ramach tekstowych. Za jej pomocą możesz określić preferowaną liczbę kolumn w ramce tekstowej.

Ten kod w Javie pokazuje, jak dodać kolumnę wewnątrz ramki tekstowej:

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();
}

Aktualizacja tekstu

Aspose.Slides umożliwia zmianę lub aktualizację tekstu zawartego w polu tekstowym lub wszystkich tekstów w prezentacji.

Ten kod w Javie demonstruje operację, w której wszystkie teksty w prezentacji są aktualizowane lub zmieniane:

Presentation pres = new Presentation("text.pptx");
try {
    for (ISlide slide : pres.getSlides())
    {
        for (IShape shape : slide.getShapes())
        {
            if (shape instanceof IAutoShape) //Sprawdza, czy kształt obsługuje ramkę tekstową (IAutoShape).
            {
                IAutoShape autoShape = (IAutoShape)shape; 
                for (IParagraph paragraph : autoShape.getTextFrame().getParagraphs()) //Iteruje przez akapity w ramce tekstowej
                {
                    for (IPortion portion : paragraph.getPortions()) //Iteruje przez każdy fragment w akapicie
                    {
                        portion.setText(portion.getText().replace("years", "months")); //Modyfikuje tekst
                        portion.getPortionFormat().setFontBold(NullableBool.True); //Modyfikuje formatowanie
                    }
                }
            }
        }
    }

    //Zapisuje zmodyfikowaną prezentację
    pres.save("text-changed.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

Dodanie pola tekstowego z odnośnikiem

Możesz wstawić odnośnik wewnątrz pola tekstowego. Po kliknięciu pola tekstowego użytkownicy są przekierowywani do otwarcia odnośnika.

Aby dodać pole tekstowe zawierające odnośnik, wykonaj następujące kroki:

  1. Utwórz instancję klasy Presentation.
  2. Uzyskaj odwołanie do pierwszego slajdu w nowo utworzonej prezentacji.
  3. Dodaj obiekt AutoShape z ustawionym ShapeType na Rectangle w określonej pozycji na slajdzie i uzyskaj odwołanie do nowo dodanego obiektu AutoShape.
  4. Dodaj TextFrame do obiektu AutoShape, które będzie zawierało Aspose TextBox jako domyślny tekst.
  5. Zainicjuj klasę IHyperlinkManager.
  6. Przypisz obiekt IHyperlinkManager do właściwości HyperlinkClick powiązanej z wybraną częścią TextFrame.
  7. Na koniec zapisz plik PPTX przy użyciu obiektu Presentation.

Ten kod w Javie — implementacja powyższych kroków — pokazuje, jak dodać pole tekstowe z odnośnikiem do slajdu:

// Tworzy instancję klasy Presentation, która reprezentuje plik PPTX
Presentation pres = new Presentation();
try {
    // Pobiera pierwszy slajd w prezentacji
    ISlide slide = pres.getSlides().get_Item(0);

    // Dodaje obiekt AutoShape z typem ustawionym na Rectangle
    IShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 150, 150, 150, 50);

    // Rzutuje kształt na AutoShape
    IAutoShape pptxAutoShape = (IAutoShape)shape;

    // Uzyskuje dostęp do właściwości ITextFrame powiązanej z AutoShape
    pptxAutoShape.addTextFrame("");

    ITextFrame textFrame = pptxAutoShape.getTextFrame();

    // Dodaje tekst do ramki
    textFrame.getParagraphs().get_Item(0).getPortions().get_Item(0).setText("Aspose.Slides");

    // Ustawia hiperłącze dla tekstu fragmentu
    IHyperlinkManager hyperlinkManager = textFrame.getParagraphs().get_Item(0).getPortions().get_Item(0).
            getPortionFormat().getHyperlinkManager();
    hyperlinkManager.setExternalHyperlinkClick("http://www.aspose.com");

    // Zapisuje prezentację PPTX
    pres.save("hLink_out.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

FAQ

Jaka jest różnica między polem tekstowym a tekstowym placeholderem przy pracy z master slajdami?

Placeholder dziedziczy styl/pozycję z mastera i może być nadpisany w layoutach, podczas gdy zwykłe pole tekstowe jest niezależnym obiektem na konkretnym slajdzie i nie zmienia się po przełączeniu layoutów.

Jak wykonać masową zamianę tekstu w całej prezentacji, nie dotykając tekstu w wykresach, tabelach i SmartArt?

Ogranicz iterację do autoshape’ów posiadających ramki tekstowe i wyklucz osadzone obiekty (charts, tables, SmartArt) poprzez osobne przeglądanie ich kolekcji lub pomijanie tych typów obiektów.