Zarządzanie polami tekstowymi w prezentacjach na Androidzie
Wprowadzenie
W Aspose.Slides dla Androida przy użyciu Javy tekst slajdu jest przechowywany w ramkach tekstowych, które należą do kształtów. Interfejs IAutoShape reprezentuje najczęstszy kształt zawierający tekst i udostępnia jego tekst poprzez metodę IAutoShape.getTextFrame.
Uwaga
Każdy automatyczny kształt implementuje IShape, ale nie każdy kształt jest automatycznym kształtem ani nie obsługuje ramki tekstowej. Podczas przetwarzania istniejącej prezentacji należy sprawdzić, czy kształt implementuje IAutoShape przed dostępem do jego tekstu.Utworzenie pola tekstowego na slajdzie
Aby utworzyć pole tekstowe, dodaj automatyczny kształt do slajdu, dodaj tekst do jego ramki tekstowej i zapisz prezentację. Poniższy przykład tworzy prostokątne pole tekstowe:
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape textBox = slide.getShapes().addAutoShape(ShapeType.Rectangle, 150, 75, 300, 50);
textBox.addTextFrame("Aspose TextBox");
presentation.save("TextBox.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Współrzędne i wymiary przekazywane do IShapeCollection.addAutoShape są mierzone w punktach. IAutoShape.addTextFrame inicjalizuje ramkę tekstową podanym tekstem.
Sprawdzenie, czy kształt jest polem tekstowym
Użyj metody IAutoShape.isTextBox aby określić, czy automatyczny kształt jest traktowany jako pole tekstowe. Jest to przydatne, gdy prezentacja zawiera zarówno kształty z tekstem, jak i czysto graficzne automatyczne kształty.

Poniższy przykład sprawdza każdy automatyczny kształt w prezentacji:
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape textBox = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 10, 120, 40);
textBox.addTextFrame("Text box");
slide.getShapes().addAutoShape(ShapeType.Ellipse, 150, 10, 40, 40);
for (ISlide currentSlide : presentation.getSlides()) {
for (IShape shape : currentSlide.getShapes()) {
if (shape instanceof IAutoShape) {
IAutoShape autoShape = (IAutoShape) shape;
System.out.println(autoShape.isTextBox() ? "The shape is a text box." : "The shape is not a text box.");
}
}
}
} finally {
presentation.dispose();
}
Nowo dodany automatyczny kształt nie jest uznawany za pole tekstowe, dopóki nie zawiera niepustego tekstu. Możesz dostarczyć ten tekst za pomocą IAutoShape.addTextFrame lub ITextFrame.setText. Dodanie lub przypisanie pustego ciągu powoduje, że IAutoShape.isTextBox zwraca false:
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape shape1 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 10, 100, 40);
shape1.addTextFrame("Shape 1");
System.out.println(shape1.isTextBox());
IAutoShape shape2 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 70, 100, 40);
shape2.getTextFrame().setText("Shape 2");
System.out.println(shape2.isTextBox());
IAutoShape shape3 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 130, 100, 40);
shape3.addTextFrame("");
System.out.println(shape3.isTextBox());
IAutoShape shape4 = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 190, 100, 40);
shape4.getTextFrame().setText("");
System.out.println(shape4.isTextBox());
} finally {
presentation.dispose();
}
Pierwsze dwa wywołania wypisują true; ostatnie dwa wypisują false.
Znajdowanie kształtu, który posiada ramkę tekstową
Kod przetwarzający tekst może otrzymać ITextFrame bez wiedzy, który obiekt prezentacji go zawiera. Użyj tylko‑do‑odczytu metody ITextFrame.getParentShape aby przejść z powrotem do jego właściciela IShape.
Dla ramki tekstowej należącej do automatycznego kształtu lub innego kształtu zawierającego tekst, ITextFrame.getParentShape zwraca właściciela, a ITextFrame.getParentCell zwraca null. Sprawdź zwróconą wartość przed dostępem do niej. Aby zidentyfikować zarówno właścicieli kształtów, jak i komórek tabel, w tym kształty powiązane z węzłami SmartArt, zobacz Search and Replace Text.
Dodawanie kolumn do pola tekstowego
Metoda ITextFrameFormat.setColumnCount dzieli ramkę tekstową na kolumny, a ITextFrameFormat.setColumnSpacing ustawia odstęp między kolumnami w punktach. Oba ustawienia należą do ITextFrameFormat i mogą być zmienione przez ramkę tekstową istniejącego pola tekstowego. Tekst przemieszcza się pomiędzy kolumnami wewnątrz tego samego kształtu; nie jest kontynuowany w innym kształcie.
Poniższy przykład tworzy pole tekstowe z trzema kolumnami i odstępem 10 punktów między kolumnami, zapisuje prezentację i odczytuje zapisane ustawienia z pliku wyjściowego:
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape textBox = slide.getShapes().addAutoShape(ShapeType.Rectangle, 100, 100, 300, 200);
textBox.addTextFrame("This text is distributed automatically across all columns in the text box.");
ITextFrameFormat textFrameFormat = textBox.getTextFrame().getTextFrameFormat();
textFrameFormat.setColumnCount(3);
textFrameFormat.setColumnSpacing(10);
presentation.save("TextBoxColumns.pptx", SaveFormat.Pptx);
Presentation savedPresentation = new Presentation("TextBoxColumns.pptx");
try {
IAutoShape savedTextBox = (IAutoShape) savedPresentation.getSlides().get_Item(0).getShapes().get_Item(0);
ITextFrameFormat savedFormat = savedTextBox.getTextFrame().getTextFrameFormat();
System.out.println("Columns: " + savedFormat.getColumnCount() + "; spacing: " + savedFormat.getColumnSpacing() + " points");
} finally {
savedPresentation.dispose();
}
} finally {
presentation.dispose();
}
Wyodrębnianie tekstu z poszczególnych kolumn
Użyj ITextFrame.splitTextByColumns aby pobrać tekst przypisany każdej widocznej kolumnie w istniejącej ramce tekstowej. Metoda zwraca jeden ciąg znaków dla każdej kolumny, w kolejności odczytu kolumnowo. Ramka tekstowa jednokolumnowa tworzy tablicę z jednym elementem, a pusta kolumna jest reprezentowana pustym ciągiem. Ciągi zawierają wyłącznie czysty tekst; formatowanie na poziomie części nie jest zachowywane.
Jest to przydatne, gdy potrzebujesz:
- Wyodrębnić tekst, zachowując jego kolejność odczytu w oparciu o kolumny.
- Indeksować lub porównać zawartość slajdów wielokolumnowych.
- Wyeksportować każdą kolumnę do osobnego pliku, pola bazy danych lub innego miejsca docelowego.
- Sprawdzić, jak tekst przemieszcza się po zmianie liczby kolumn przy użyciu ITextFrameFormat.setColumnCount, odstępu przy użyciu ITextFrameFormat.setColumnSpacing, czcionki lub rozmiaru ramki tekstowej.
Metoda raportuje tekst rozmieszczony w bieżącym ITextFrame; nie przepływa automatycznie tekstu pomiędzy oddzielnymi kształtami lub polami tekstowymi. Rozkład kolumn może zależeć od dostępnych czcionek i innych ustawień układu tekstu, dlatego upewnij się, że wymagane czcionki są dostępne, gdy zależą od spójnych wyników.
Poniższy przykład ładuje prezentację, znajduje pierwszy automatyczny kształt wielokolumnowy z ramką tekstową, odczytuje jego skonfigurowaną liczbę kolumn i zapisuje tekst z każdej kolumny do osobnego pliku. Kształty nieposiadające ramki tekstowej są pomijane.
import com.aspose.slides.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
Presentation presentation = new Presentation("MultiColumnText.pptx");
try {
IAutoShape textBox = null;
for (IShape shape : presentation.getSlides().get_Item(0).getShapes()) {
if (shape instanceof IAutoShape) {
IAutoShape autoShape = (IAutoShape) shape;
if (autoShape.getTextFrame() != null) {
int columnCount = autoShape.getTextFrame().getTextFrameFormat().getColumnCount();
if (columnCount > 1) {
textBox = autoShape;
break;
}
}
}
}
if (textBox == null) {
System.out.println("No multi-column text frame was found.");
} else {
ITextFrame textFrame = textBox.getTextFrame();
int configuredColumnCount = textFrame.getTextFrameFormat().getColumnCount();
String[] columnTexts = textFrame.splitTextByColumns();
System.out.println("Configured columns: " + configuredColumnCount);
for (int columnIndex = 0; columnIndex < columnTexts.length; columnIndex++) {
int columnNumber = columnIndex + 1;
String columnText = columnTexts[columnIndex];
System.out.println("Column " + columnNumber + ": " + columnText);
String outputPath = "Column-" + columnNumber + ".txt";
byte[] textBytes = columnText.getBytes(StandardCharsets.UTF_8);
try (FileOutputStream outputStream = new FileOutputStream(outputPath)) {
outputStream.write(textBytes);
} catch (IOException exception) {
System.out.println("Could not write column " + columnNumber + ": " + exception.getMessage());
}
}
}
} finally {
presentation.dispose();
}
Aktualizacja tekstu
Aby zaktualizować tekst w całej prezentacji, przeiteruj slajdy i kształty, wybierz automatyczne kształty i edytuj ich fragmenty tekstu. Praca na poziomie fragmentu pozwala zmieniać zarówno tekst, jak i formatowanie znaków.
Poniższy przykład zastępuje każde wystąpienie years słowem months w tekście automatycznego kształtu i pogrubia każdą zmienioną część:
import com.aspose.slides.*;
Presentation presentation = new Presentation("Text.pptx");
try {
for (ISlide slide : presentation.getSlides()) {
for (IShape shape : slide.getShapes()) {
if (!(shape instanceof IAutoShape)) {
continue;
}
IAutoShape autoShape = (IAutoShape) shape;
ITextFrame textFrame = autoShape.getTextFrame();
if (textFrame == null) {
continue;
}
for (IParagraph paragraph : textFrame.getParagraphs()) {
for (IPortion portion : paragraph.getPortions()) {
String text = portion.getText();
if (text != null && text.contains("years")) {
portion.setText(text.replace("years", "months"));
portion.getPortionFormat().setFontBold(NullableBool.True);
}
}
}
}
}
presentation.save("TextChanged.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
Ta iteracja aktualizuje tekst wyłącznie w automatycznych kształtach. Tekst zapisany w tabelach, wykresach, SmartArt lub grupowanych kształtach wymaga iteracji własnych kolekcji tych obiektów.
Dodanie pola tekstowego z hiperłączem
Hiperłącze może być przypisane do konkretnego fragmentu tekstu, dzięki czemu tylko ten fragment działa jako klikalny link. Użyj IHyperlinkManager.setExternalHyperlinkClick aby powiązać fragment z zewnętrznym adresem URL.
Poniższy przykład tworzy tekst z linkiem i zapisuje go w prezentacji:
import com.aspose.slides.*;
Presentation presentation = new Presentation();
try {
ISlide slide = presentation.getSlides().get_Item(0);
IAutoShape textBox = slide.getShapes().addAutoShape(ShapeType.Rectangle, 150, 150, 200, 50);
textBox.addTextFrame("Aspose.Slides");
IPortion textPortion = textBox.getTextFrame().getParagraphs().get_Item(0).getPortions().get_Item(0);
textPortion.getPortionFormat().getHyperlinkManager().setExternalHyperlinkClick("https://www.aspose.com/");
presentation.save("Hyperlink.pptx", SaveFormat.Pptx);
} finally {
presentation.dispose();
}
FAQ
Jaka jest różnica między polem tekstowym a symbolem zastępczym tekstu na slajdzie mastera lub układu?
Symbol zastępczy może dziedziczyć swoją pozycję i formatowanie z slajdu mastera lub slajdu układu. Zwykłe pole tekstowe jest niezależnym kształtem na slajdzie, na którym zostało utworzone i nie przejmuje zachowania symbolu zastępczego po zmianie układu.
Jak mogę zamienić tekst bez zmieniania tekstu w wykresach, tabelach lub SmartArt?
Ogranicz iterację do kształtów implementujących IAutoShape, jak pokazano w przykładzie Aktualizacja tekstu. Wykresy, tabele i SmartArt przechowują tekst w własnych modelach obiektów, więc nie są modyfikowane przez tę pętlę.