Zarządzanie polami tekstowymi w prezentacjach w .NET

Wprowadzenie

Teksty na slajdach zazwyczaj znajdują się w polach tekstowych lub kształtach. Dlatego, aby dodać tekst do slajdu, najpierw musisz dodać pole tekstowe, a następnie umieścić w nim tekst.

Aby umożliwić dodawanie kształtu, który może zawierać tekst, Aspose.Slides dla .NET udostępnia interfejs IAutoShape.

Utworzenie pola tekstowego na slajdzie

  1. Utwórz instancję klasy Presentation.
  2. Uzyskaj odniesienie do pierwszego slajdu za pomocą jego indeksu.
  3. Dodaj obiekt IAutoShape z właściwością ShapeType ustawioną 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ć tekst. W poniższym przykładzie dodaliśmy ten tekst: Aspose TextBox
  5. Na koniec zapisz plik PPTX przy użyciu obiektu Presentation.

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

 // Tworzy instancję PresentationEx
 using (Presentation pres = new Presentation())
 {
 
     // Pobiera pierwszy slajd w prezentacji
     ISlide sld = pres.Slides[0];
 
     // Dodaje AutoShape z typem ustawionym na Rectangle
     IAutoShape ashp = sld.Shapes.AddAutoShape(ShapeType.Rectangle, 150, 75, 150, 50);
 
     // Dodaje TextFrame do prostokąta
     ashp.AddTextFrame(" ");
 
     // Uzyskuje dostęp do ramki tekstowej
     ITextFrame txtFrame = ashp.TextFrame;
 
     // Tworzy obiekt Paragraph dla ramki tekstowej
     IParagraph para = txtFrame.Paragraphs[0];
 
     // Tworzy obiekt Portion dla akapitu
     IPortion portion = para.Portions[0];
 
     // Ustawia tekst
     portion.Text = "Aspose TextBox";
 
     // Zapisuje prezentację na dysk
     pres.Save("TextBox_out.pptx", Aspose.Slides.Export.SaveFormat.Pptx);
 }

Sprawdzenie, czy kształt jest polem tekstowym

Aspose.Slides udostępnia właściwość IsTextBox z interfejsu IAutoShape , pozwalając na przeglądanie kształtów i identyfikowanie pól tekstowych.

Pola tekstowego i kształt

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

using (Presentation presentation = new Presentation("sample.pptx"))
{
    Aspose.Slides.LowCode.ForEach.Shape(presentation, (shape, slide, index) =>
    {
        if (shape is IAutoShape autoShape)
        {
            Console.WriteLine(autoShape.IsTextBox ? "shape is a text box" : "shape is not a text box");
        }
    });
}

Zauważ, że jeśli po prostu dodasz autokształt za pomocą metody AddAutoShape z interfejsu IShapeCollection, właściwość IsTextBox tego autokształtu zwróci false. Jednak po dodaniu tekstu do autokształtu metodą AddTextFrame lub właściwością Text, właściwość IsTextBox zwróci true.

using (Presentation presentation = new Presentation())
{
    ISlide slide = presentation.Slides[0];

    IAutoShape shape1 = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 10, 100, 40);
    // shape1.IsTextBox ma wartość false
    shape1.AddTextFrame("shape 1");
    // shape1.IsTextBox ma wartość true

    IAutoShape shape2 = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 110, 100, 40);
    // shape2.IsTextBox ma wartość false
    shape2.TextFrame.Text = "shape 2";
    // shape2.IsTextBox ma wartość true

    IAutoShape shape3 = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 210, 100, 40);
    // shape3.IsTextBox ma wartość false
    shape3.AddTextFrame("");
    // shape3.IsTextBox ma wartość false

    IAutoShape shape4 = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 10, 310, 100, 40);
    // shape4.IsTextBox ma wartość false
    shape4.TextFrame.Text = "";
    // shape4.IsTextBox ma wartość false
}

Dodanie kolumn do pola tekstowego

Aspose.Slides udostępnia właściwości ColumnCount i ColumnSpacing (z interfejsu ITextFrameFormat oraz klasy TextFrameFormat), umożliwiające dodanie kolumn do pól tekstowych. Możesz określić liczbę kolumn w polu tekstowym, a następnie odstęp w punktach pomiędzy kolumnami.

Ten kod w C# demonstruje opisaną operację:

using (Presentation presentation = new Presentation())
{
	// Pobiera pierwszy slajd w prezentacji
	ISlide slide = presentation.Slides[0];

	// Dodaje AutoShape z typem ustawionym na Rectangle
	IAutoShape aShape = slide.Shapes.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 ramki TextFrame
	ITextFrameFormat format = aShape.TextFrame.TextFrameFormat;

	// Określa liczbę kolumn w TextFrame
	format.ColumnCount = 3;

	// Określa odstęp między kolumnami
	format.ColumnSpacing = 10;

	// Zapisuje prezentację
	presentation.Save("ColumnCount.pptx", SaveFormat.Pptx);
}

Dodanie kolumn do ramki tekstowej

Aspose.Slides dla .NET udostępnia właściwość ColumnCount (z interfejsu ITextFrameFormat), która pozwala dodać kolumny w ramkach tekstowych. Dzięki tej właściwości możesz określić preferowaną liczbę kolumn w ramce tekstowej.

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

string outPptxFileName = "ColumnsTest.pptx";
using (Presentation pres = new Presentation())
{
    IAutoShape shape1 = pres.Slides[0].Shapes.AddAutoShape(ShapeType.Rectangle, 100, 100, 300, 300);
    TextFrameFormat format = (TextFrameFormat)shape1.TextFrame.TextFrameFormat;

    format.ColumnCount = 2;
    shape1.TextFrame.Text = "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);

    using (Presentation test = new Presentation(outPptxFileName))
    {
        Debug.Assert(2 == ((AutoShape)test.Slides[0].Shapes[0]).TextFrame.TextFrameFormat.ColumnCount);
        Debug.Assert(double.NaN == ((AutoShape)test.Slides[0].Shapes[0]).TextFrame.TextFrameFormat.ColumnSpacing);
    }

    format.ColumnSpacing = 20;
    pres.Save(outPptxFileName, SaveFormat.Pptx);

    using (Presentation test = new Presentation(outPptxFileName))
    {
        Debug.Assert(2 == ((AutoShape)test.Slides[0].Shapes[0]).TextFrame.TextFrameFormat.ColumnCount);
        Debug.Assert(20 == ((AutoShape)test.Slides[0].Shapes[0]).TextFrame.TextFrameFormat.ColumnSpacing);
    }

    format.ColumnCount = 3;
    format.ColumnSpacing = 15;
    pres.Save(outPptxFileName, SaveFormat.Pptx);

    using (Presentation test = new Presentation(outPptxFileName))
    {
        Debug.Assert(3 == ((AutoShape)test.Slides[0].Shapes[0]).TextFrame.TextFrameFormat.ColumnCount);
        Debug.Assert(15 == ((AutoShape)test.Slides[0].Shapes[0]).TextFrame.TextFrameFormat.ColumnSpacing);
    }
}

Aktualizacja tekstu

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

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

using(Presentation pres = new Presentation("text.pptx"))
{
   foreach (ISlide slide in pres.Slides)
   {
       foreach (IShape shape in slide.Shapes)
       {
           if (shape is IAutoShape autoShape) //Sprawdza, czy kształt obsługuje ramkę tekstową (IAutoShape). 
           {
              foreach (IParagraph paragraph in autoShape.TextFrame.Paragraphs) //Iteruje przez akapity w ramce tekstowej
               {
                   foreach (IPortion portion in paragraph.Portions) //Iteruje przez każdy fragment w akapicie
                   {
                       portion.Text = portion.Text.Replace("years", "months"); //Zmienia tekst
                       portion.PortionFormat.FontBold = NullableBool.True; //Zmienia formatowanie
                   }
               }
           }
       }
   }
  
   //Zapisuje zmodyfikowaną prezentację
   pres.Save("text-changed.pptx", SaveFormat.Pptx);
}

Dodanie pola tekstowego z hiperłączem

Możesz wstawić link wewnątrz pola tekstowego. Gdy pole tekstowe zostanie kliknięte, użytkownicy są przekierowywani do otwarcia linku.

  1. Utwórz instancję klasy Presentation.
  2. Uzyskaj odniesienie do pierwszego slajdu za pomocą jego indeksu.
  3. Dodaj obiekt AutoShape z ShapeType ustawionym na Rectangle w określonej pozycji na slajdzie i uzyskaj odwołanie do nowo dodanego obiektu AutoShape.
  4. Dodaj TextFrame do obiektu AutoShape, który zawiera Aspose TextBox jako domyślny tekst.
  5. Utwórz instancję klasy 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 C# — implementacja powyższych kroków — pokazuje, jak dodać pole tekstowe z hiperłączem do slajdu:

// Instancjonuje klasę Presentation, która reprezentuje plik PPTX
Presentation pptxPresentation = new Presentation();

// Uzyskuje pierwszy slajd w prezentacji
ISlide slide = pptxPresentation.Slides[0];

// Dodaje obiekt AutoShape z typem ustawionym na Rectangle
IShape pptxShape = slide.Shapes.AddAutoShape(ShapeType.Rectangle, 150, 150, 150, 50);

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

// Dostaje dostęp do własności ITextFrame powiązanej z AutoShape
pptxAutoShape.AddTextFrame("");

ITextFrame ITextFrame = pptxAutoShape.TextFrame;

// Dodaje tekst do ramki
ITextFrame.Paragraphs[0].Portions[0].Text = "Aspose.Slides";

// Ustawia hiperłącze dla tekstu fragmentu
IHyperlinkManager HypMan = ITextFrame.Paragraphs[0].Portions[0].PortionFormat.HyperlinkManager;
HypMan.SetExternalHyperlinkClick("http://www.aspose.com");

// Zapisuje prezentację PPTX
pptxPresentation.Save("hLinkPPTX_out.pptx", Aspose.Slides.Export.SaveFormat.Pptx);

FAQ

Jaka jest różnica między polem tekstowym a symbolem tekstowym podczas pracy z slajdami nadrzędnymi?

Symbol placeholder dziedziczy styl/położenie z mastera i może być nadpisany na układach, podczas gdy zwykłe pole tekstowe jest niezależnym obiektem na konkretnym slajdzie i nie zmienia się po przełączeniu układów.

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

Ogranicz iterację do auto‑kształtów posiadających ramki tekstowe i wyklucz osadzone obiekty (charts, tables, SmartArt), przeglądając ich kolekcje osobno lub pomijając te typy obiektów.