Gérer les zones de texte dans les présentations sur Android
Introduction
Dans Aspose.Slides for Android via Java, le texte d’une diapositive est stocké dans des cadres de texte qui appartiennent à des formes. L’interface IAutoShape représente la forme la plus courante contenant du texte et expose son texte via la méthode IAutoShape.getTextFrame .
Note
Toute forme auto implemente IShape, mais toutes les formes ne sont pas des formes auto ou ne prennent pas en charge un cadre de texte. Lors du traitement d’une presentation existante, verifiez qu’une forme implemente IAutoShape avant d’acceder a son texte.Creer une zone de texte sur une diapositive
Pour creer une zone de texte, ajoutez une forme auto a une diapositive, ajoutez du texte a son cadre de texte, puis enregistrez la presentation. L’exemple suivant cree une zone de texte rectangulaire :
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();
}
Les coordonnees et dimensions passees a IShapeCollection.addAutoShape sont exprimees en points. IAutoShape.addTextFrame initialise le cadre de texte avec le texte fourni.
Verifier la presence d’une forme zone de texte
Utilisez la methode IAutoShape.isTextBox pour determiner si une forme auto est consideree comme une zone de texte. Cela est utile lorsqu’une presentation contient a la fois des formes auto contenant du texte et des formes purement graphiques.

L’exemple suivant inspecte chaque forme auto d’une presentation :
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();
}
Une forme auto nouvellement ajoutee n’est pas consideree comme une zone de texte tant qu’elle ne contient pas de texte non vide. Vous pouvez fournir ce texte via IAutoShape.addTextFrame ou ITextFrame.setText. Ajouter ou assigner une chaine vide fait retourner false par IAutoShape.isTextBox :
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();
}
Les deux premiers appels affichent true; les deux derniers affichent false.
Trouver la forme qui possede un cadre de texte
Un code de traitement de texte genereique peut recevoir un ITextFrame sans connaitre l’objet de presentation qui le contient. Utilisez la methode en lecture seule ITextFrame.getParentShape pour revenir a sa forme proprietaire IShape .
Pour un cadre de texte detenu par une forme auto ou une autre forme contenant du texte, ITextFrame.getParentShape renvoie le proprietaire et ITextFrame.getParentCell renvoie null. Verifiez la valeur renvoyee avant de l’utiliser. Pour identifier a la fois les proprietaires de formes et de cellules de tableau, y compris les formes associees aux noeuds SmartArt, voir Search and Replace Text .
Ajouter des colonnes a une zone de texte
La methode ITextFrameFormat.setColumnCount divise le cadre de texte en colonnes, tandis que ITextFrameFormat.setColumnSpacing definit l’espace entre les colonnes en points. Les deux parametres appartiennent a ITextFrameFormat et peuvent etre modifies via le cadre de texte d’une zone de texte existante. Le texte se reajuste entre les colonnes a l’interieur de la meme forme; il ne se poursuit pas dans une autre forme.
L’exemple suivant cree une zone de texte a trois colonnes avec 10 points entre les colonnes, enregistre la presentation et lit les parametres enregistres dans le fichier de sortie :
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();
}
Extraire le texte des colonnes individuelles
Utilisez ITextFrame.splitTextByColumns pour recuperer le texte attribue a chaque colonne visuelle d’un cadre de texte existant. La methode renvoie une chaine pour chaque colonne, dans l’ordre de lecture base sur les colonnes. Un cadre de texte a une seule colonne produit un tableau contenant un seul element, et une colonne vide est representee par une chaine vide. Les chaines contiennent uniquement du texte brut; le formatage au niveau des portions n’est pas conserve.
C’est utile lorsque vous devez:
- Extraire le texte tout en conservant son ordre de lecture base sur les colonnes.
- Indexer ou comparer le contenu de diapositives a colonnes multiples.
- Exporter chaque colonne vers un fichier distinct, un champ de base de donnees ou une autre destination.
- Analyser comment le texte est redistribue après avoir modifie le nombre de colonnes avec ITextFrameFormat.setColumnCount, l’espacement avec ITextFrameFormat.setColumnSpacing, la police ou la taille du cadre de texte.
La methode rapporte le texte repartit dans le ITextFrame actuel; elle ne fait pas automatiquement couler le texte entre des formes ou zones de texte separees. La repartition en colonnes peut dependre des polices disponibles et d’autres parametres de mise en page, assurez-vous donc que les polices requises sont presentes lorsque la coherence des resultats est importante.
L’exemple suivant charge une presentation, trouve la premiere forme auto a colonnes multiples avec un cadre de texte, lit son nombre de colonnes configure et ecrit le texte de chaque colonne dans un fichier distinct. Les formes qui ne fournissent pas de cadre de texte sont ignores.
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();
}
Mettre a jour le texte
Pour mettre a jour le texte dans l’ensemble d’une presentation, parcourez les diapositives et les formes, selectionnez les formes auto, puis modifiez leurs portions de texte. Travailler au niveau des portions permet de changer a la fois le texte et le formatage des caracteres.
L’exemple suivant remplace chaque occurrence de years par months dans le texte des formes auto et rend chaque portion affectee en gras :
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();
}
Ce parcours met a jour le texte uniquement dans les formes auto. Le texte stocke dans des tableaux, des graphiques, SmartArt ou des formes groupees necessite de parcourir les collections propres a ces objets.
Ajouter une zone de texte avec un hyperlien
Un hyperlien peut etre attribue a une portion de texte specifique, de sorte que seul ce texte agit comme lien cliquable. Utilisez IHyperlinkManager.setExternalHyperlinkClick pour associer la portion a une URL externe.
L’exemple suivant cree du texte lie et l’enregistre dans une presentation :
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
Quelle est la difference entre une zone de texte et un espace reserve de texte sur une diapositive maitre ou de mise en page?
Un placeholder peut heriter de sa position et de son formatage d’une master slide ou d’une layout slide. Une zone de texte ordinaire est une forme independante sur la diapositive ou elle a ete creee et n’acquiert pas le comportement d’espace reserve lorsque la mise en page change.
Comment remplacer du texte sans modifier le texte dans les graphiques, tableaux ou SmartArt?
Limitez le parcours aux formes qui implementent IAutoShape, comme le montre l’exemple Mettre a jour le texte. Les graphiques, tableaux et SmartArt stockent le texte dans leurs propres modeles d’objets, ils ne sont donc pas modifies par cette boucle.