30.10.26
Extraire le texte d’un PowerPoint en Java11 min de lecture2 117 mots

Extraire le texte d’un PowerPoint en Java

Découvrez comment extraire le texte d’un PowerPoint en Java : toutes les diapositives, une page précise ou les tableaux, puis enregistrer en UTF-8 facilement.

extraire texte PowerPoint Javaextraction texte PPTX JavaSpire Presentation Javalire tableaux PowerPoint Javatraitement fichiers PowerPoint
Extraire le texte d’un PowerPoint en Java

Extraire le texte d'un PowerPoint en Java : méthode et exemples

Une présentation PowerPoint contient souvent des informations qu'on a envie de réutiliser ailleurs : comptes rendus, documentation, tableaux de suivi ou bases de données. Copier les diapositives une par une fonctionne pour quelques pages. Mais dès que l'opération revient souvent, ou qu'il faut traiter plusieurs fichiers, la méthode devient vite pénible et difficile à contrôler.

En Java, vous pouvez parcourir un fichier .pptx, lire le texte des formes et l'écrire dans un fichier en UTF-8. Le point important, c'est que « extraire le texte d'une présentation » ne veut pas dire une seule chose : le texte d'une zone de texte, celui d'un tableau et celui d'une image ne sont pas stockés de la même manière. Résultat : un script qui ne traite que les zones de texte peut sortir un résultat incomplet, sans forcément déclencher d'erreur.

Dans ce tutoriel, on va voir comment :

  • extraire le texte de toutes les diapositives,
  • cibler une diapositive précise,
  • lire le contenu des tableaux avec Java et Spire.Presentation,
  • anticiper les limites avant d'intégrer le tout dans un outil métier.

Préparer le projet Java

Les exemples ci-dessous utilisent Spire.Presentation, une bibliothèque Java qui permet de charger et de parcourir des présentations PowerPoint. La version indiquée est 11.9.10. Avant de l'adopter, vérifiez les versions disponibles et les conditions de licence : une dépendance « OK en prototype » peut devenir plus contraignante une fois intégrée à un service en production.

Avec Maven, ajoutez le dépôt et la dépendance suivants dans votre fichier pom.xml :

<repositories>

<repository>

<id>com.e-iceblue</id>

<name>e-iceblue</name>

<url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>

</repository>

</repositories>

<dependencies>

<dependency>

<groupId>e-iceblue</groupId>

<artifactId>spire.presentation</artifactId>

<version>11.9.10</version>

</dependency>

</dependencies>

Les exemples supposent qu'un fichier report.pptx se trouve dans le répertoire de travail. En pratique, évitez de le coder en dur : passez-le en paramètre, ou adaptez-le selon votre environnement. C'est plus simple à tester, et plus facile à déployer sur un serveur.

Pour l'écriture des résultats, on utilise StandardCharsets.UTF_8. Ça évite les surprises quand les diapositives contiennent des accents, des caractères non latins ou plusieurs langues. Le fichier .txt pourra aussi être relu sur d'autres systèmes sans dépendre de l'encodage « par défaut » de la machine.

Enfin, pensez à libérer la présentation après traitement avec dispose(). Ce n'est pas juste « pour faire propre » : si vous enchaînez les ouvertures sans libérer les ressources, vous pouvez finir par consommer inutilement de la mémoire (ou d'autres ressources) côté processus.

Extraire le texte de toutes les diapositives

Pour parcourir une présentation complète, récupérez les diapositives avec getSlides(), puis parcourez les formes de chaque diapositive. Les titres, zones de texte et formes contenant du texte passent par IAutoShape. Le texte est organisé en paragraphes, accessibles via ParagraphEx.getText().

Voici un programme autonome qui réunit le texte dans un fichier, avec un séparateur entre chaque diapositive :

import com.spire.presentation.*;

import java.nio.charset.StandardCharsets;

import java.nio.file.Files;

import java.nio.file.Paths;

public class ExtraireToutLeTexte {

public static void main(String[] args) throws Exception {

Presentation presentation = new Presentation();

try {

presentation.loadFromFile("report.pptx");

StringBuilder resultat = new StringBuilder();

for (int i = 0; i < presentation.getSlides().getCount(); i++) {

ISlide diapositive = presentation.getSlides().get(i);

resultat.append("Diapositive ")

.append(i + 1)

.append(System.lineSeparator());

for (Object forme : diapositive.getShapes()) {

if (forme instanceof IAutoShape) {

IAutoShape formeTexte = (IAutoShape) forme;

for (Object element : formeTexte.getTextFrame().getParagraphs()) {

ParagraphEx paragraphe = (ParagraphEx) element;

String texte = paragraphe.getText();

if (texte != null && !texte.trim().isEmpty()) {

resultat.append(texte)

.append(System.lineSeparator());

}

}

}

}

resultat.append(System.lineSeparator());

}

Files.write(Paths.get("texte-toutes-diapos.txt"),

resultat.toString().getBytes(StandardCharsets.UTF_8));

System.out.println("Extraction terminée.");

} finally {

presentation.dispose();

}

}

}

Le fichier texte-toutes-diapos.txt regroupe le contenu par numéro de diapositive. Les paragraphes vides sont ignorés, ce qui évite d'empiler des lignes inutiles.

Les appels principaux sont simples :

  • getSlides() donne accès à la collection de diapositives ;
  • getShapes() fournit les formes de la diapositive ;
  • getTextFrame().getParagraphs() récupère les paragraphes d'une forme textuelle ;
  • getText() renvoie le texte d'un paragraphe.

Mais il faut garder une idée claire : ce que vous obtenez vient des objets que la boucle reconnaît. Les tableaux, les notes du présentateur, les graphiques et le texte « dans » une image ne sont pas forcément pris en charge ici. Et l'ordre de lecture correspond à l'ordre des formes dans la collection, qui ne colle pas toujours à l'ordre visuel attendu par un lecteur.

Dans un outil de production, ajoutez des infos de diagnostic : nom du fichier traité, nombre de diapositives, durée, et détails en cas d'erreur. Une extraction partielle qui finit sans avertir est souvent plus embêtante qu'un échec explicite.

Lire une diapositive précise

Vous n'avez pas toujours besoin de traiter toute la présentation. Pour récupérer un texte de la troisième diapositive, par exemple, vous sélectionnez la diapositive avant de parcourir ses formes.

Dans l'API, l'index commence à zéro : get(0) correspond à la première diapositive. Si vous partez du numéro « habituel » (qui commence à un), vous devez faire numero - 1.

import com.spire.presentation.*;

import java.nio.charset.StandardCharsets;

import java.nio.file.Files;

import java.nio.file.Paths;

public class ExtraireUneDiapositive {

public static void main(String[] args) throws Exception {

Presentation presentation = new Presentation();

try {

presentation.loadFromFile("report.pptx");

int numeroDiapositive = 3;

int nombreDiapositives = presentation.getSlides().getCount();

if (numeroDiapositive < 1 || numeroDiapositive > nombreDiapositives) {

throw new IllegalArgumentException(

"Le numéro de diapositive demandé n'existe pas.");

}

ISlide diapositive = presentation.getSlides()

.get(numeroDiapositive - 1);

StringBuilder resultat = new StringBuilder();

for (Object forme : diapositive.getShapes()) {

if (forme instanceof IAutoShape) {

IAutoShape formeTexte = (IAutoShape) forme;

for (Object element : formeTexte.getTextFrame().getParagraphs()) {

ParagraphEx paragraphe = (ParagraphEx) element;

String texte = paragraphe.getText();

if (texte != null && !texte.trim().isEmpty()) {

resultat.append(texte)

.append(System.lineSeparator());

}

}

}

}

Files.write(Paths.get("texte-diapositive-3.txt"),

resultat.toString().getBytes(StandardCharsets.UTF_8));

System.out.println("Extraction de la diapositive terminée.");

} finally {

presentation.dispose();

}

}

}

Le contrôle des bornes évite un accès invalide quand le numéro demandé est en dehors de [1, nombre de diapositives]. C'est un petit test, mais dès que le numéro vient d'un formulaire ou d'un traitement automatisé, il devient indispensable.

Si vous avez plusieurs diapos à extraire, reprenez la même logique avec une liste de numéros : validez, convertissez en index avec numero - 1, puis traitez uniquement ce qui est demandé. Pour une présentation longue et quelques pages ciblées, ça réduit le travail. Pour des fichiers plus petits, parcourir tout le monde reste souvent plus simple.

Extraire le contenu des tableaux

Les cellules d'un tableau ne se récupèrent pas comme les paragraphes d'une zone de texte classique. Il faut repérer les objets ITable, parcourir leurs lignes et colonnes, puis lire le texte de chaque cellule.

L'exemple ci-dessous cherche les tableaux sur toutes les diapositives et enregistre les cellules sous forme de texte, avec des tabulations entre colonnes. Chaque ligne du tableau PowerPoint devient une ligne dans le fichier :

import com.spire.presentation.*;

import java.nio.charset.StandardCharsets;

import java.nio.file.Files;

import java.nio.file.Paths;

public class ExtraireTexteDesTableaux {

public static void main(String[] args) throws Exception {

Presentation presentation = new Presentation();

try {

presentation.loadFromFile("report.pptx");

StringBuilder resultat = new StringBuilder();

for (int i = 0; i < presentation.getSlides().getCount(); i++) {

ISlide diapositive = presentation.getSlides().get(i);

for (Object forme : diapositive.getShapes()) {

if (forme instanceof ITable) {

ITable tableau = (ITable) forme;

resultat.append("Tableau de la diapositive ")

.append(i + 1)

.append(System.lineSeparator());

int nombreLignes = tableau.getTableRows().getCount();

int nombreColonnes = tableau.getColumnsList().getCount();

for (int ligne = 0; ligne < nombreLignes; ligne++) {

for (int colonne = 0; colonne < nombreColonnes; colonne++) {

String texte = tableau.get(colonne, ligne)

.getTextFrame().getText();

if (texte != null) {

texte = texte.replace("\\r", " ")

.replace("\\n", " ")

.replace("\\t", " ");

resultat.append(texte);

}

if (colonne < nombreColonnes - 1) {

resultat.append("\\t");

}

}

resultat.append(System.lineSeparator());

}

resultat.append(System.lineSeparator());

}

}

}

Files.write(Paths.get("texte-tableaux.txt"),

resultat.toString().getBytes(StandardCharsets.UTF_8));

System.out.println("Extraction des tableaux terminée.");

} finally {

presentation.dispose();

}

}

}

Attention à l'ordre des index : tableau.get(colonne, ligne) attend d'abord l'index de colonne, puis celui de ligne. Les deux commencent à zéro. Si vous inversez, vous risquez soit un contenu incohérent, soit carrément un comportement inattendu selon la forme du tableau.

Ici, les tabulations séparent les colonnes, et les retours à la ligne séparent les lignes. Si une cellule contient des tabulations ou des retours, on les remplace par des espaces pour garder une ligne de sortie par ligne du tableau. Si vous avez besoin de préserver des tabulations « significatives », ou si un programme doit consommer le fichier, mieux vaut définir une vraie règle d'échappement, ou choisir un format plus robuste comme CSV correctement géré ou JSON.

Les cellules fusionnées ajoutent un vrai sujet : selon les présentations, une boucle « ligne × colonne » peut tomber sur des zones vides ou répétées. Testez avec des fichiers représentatifs : selon les modèles et versions de PowerPoint, les conventions de mise en page ne sont pas toujours identiques.

Gérer les limites et choisir le bon format

Avant de considérer l'extraction comme « terminée », il faut regarder où le texte vit vraiment. Dans PowerPoint, ce qu'on voit à l'écran ne dit pas forcément quel type d'objet porte le contenu. Une phrase peut être une forme, une cellule de tableau, un libellé de graphique... ou du texte qui n'existe que comme pixels dans une image.

Le texte intégré dans une image nécessite de l'OCR

Une capture d'écran, une image numérisée, ou une photo avec des mots ne donnera pas de texte exploitable via getText(). Le contenu est stocké comme image. Dans ce cas, il faut passer par une étape d'OCR (reconnaissance optique de caractères). La qualité dépend de la résolution, de la langue, et de la lisibilité.

Certains objets demandent un parcours spécifique

Les exemples traitent les IAutoShape, et les tableaux via ITable. Ça ne garantit pas forcément la récupération :

  • des notes du présentateur,
  • des étiquettes dans certains graphiques,
  • du texte contenu dans des objets groupés.

Si vous ciblez un périmètre précis, écrivez des tests à partir de présentations qui reflètent vos cas d'usage, et vérifiez les types d'objets réellement rencontrés.

Et si vous faites de la recherche documentaire ou une base de connaissances, ne vous contentez pas d'un test « ça s'exécute ». Comparez le texte extrait au contenu attendu sur plusieurs modèles. Une extraction qui « réussit » techniquement n'implique pas que toutes les informations métier sont là.

Le fichier texte perd la mise en forme

Un .txt ne garde ni les polices, ni les couleurs, ni la position sur la diapo, ni la hiérarchie visuelle. C'est parfait si vous cherchez du texte brut à indexer ou à réutiliser.

Si l'ordre, la structure des tableaux ou le rôle des titres comptent, ajoutez des marqueurs dans la sortie (par exemple le numéro de diapositive et le type d'objet), ou partez sur un format plus structuré.

Il faut aussi décider quoi faire avec :

  • les éléments sans texte,
  • les doublons,
  • et l'ordre de lecture.

Ce ne sont pas des détails « après coup » : ce sont des choix qui influencent directement la qualité des données en aval.

Vérifier la confidentialité et la licence

Une présentation peut contenir des informations internes, des données de clients, ou des éléments soumis à des obligations de confidentialité. Si le traitement reste local côté application Java, vous contrôlez le flux, mais vous devez aussi maîtriser :

  • qui peut accéder aux fichiers,
  • combien de temps vous stockez les résultats,
  • et quels journaux vous produisez.

Dans un contexte européen, pensez aussi au RGPD.

Enfin, relisez les conditions applicables à la bibliothèque et à sa version. Le coût et les limites de licence font partie du choix technique : une solution acceptable à l'essai peut ne pas passer dans un déploiement commercial.

Conclusion

Extraire du texte d'un PowerPoint en Java est assez direct, à condition de savoir où se trouve réellement le contenu. Les formes textuelles se récupèrent via IAutoShape, une diapositive précise se sélectionne avec un index commençant à zéro, et les tableaux demandent un parcours dédié des cellules.

La vraie décision à prendre avant d'industrialiser, c'est ce que vous entendez par « tout le texte » pour votre cas. Ensuite, testez avec les types d'objets réellement présents dans vos fichiers, et choisissez un format de sortie adapté à l'usage derrière.

Commencez avec une présentation représentative, comparez le résultat à ce que vous voyez à l'écran, puis ajoutez les cas particuliers (tableaux fusionnés, images, notes) si votre périmètre l'exige.

Pour aller plus loin, intégrez ces exemples dans un traitement avec des chemins configurables, des erreurs explicites, et des contrôles sur les fichiers générés. C'est souvent le chemin le plus sûr pour passer d'un script utile à un outil qui tient dans le temps.

Questions frequentes

Chargez le fichier avec Spire.Presentation, parcourez les diapositives et leurs formes, puis lisez les paragraphes des objets IAutoShape. Enregistrez le résultat en UTF-8. Cette méthode ne couvre pas automatiquement les tableaux, images, notes ou tous les autres types d’objets.
Utilisez presentation.getSlides().get(2), car les index commencent à zéro. Si le numéro est fourni sous la forme habituelle, en commençant à un, convertissez-le avec numeroDiapositive - 1 et vérifiez qu’il correspond à une diapositive existante avant l’accès.
Pas avec la boucle limitée aux IAutoShape. Repérez les objets ITable, puis parcourez leurs cellules avec les index de colonne et de ligne. Les cellules fusionnées peuvent nécessiter un traitement spécifique et des tests sur les présentations concernées.
Une image ne contient pas de texte exploitable par les méthodes de lecture des formes. Il faut appliquer une technologie OCR pour reconnaître les caractères. Le résultat dépend de la qualité de l’image, de la langue et de la mise en page ; prévoyez une validation si l’exactitude est importante.
Utilisez UTF-8, par exemple avec StandardCharsets.UTF_8 lors de l’écriture du fichier. Cela permet de conserver correctement les accents et les caractères de différentes langues, indépendamment de l’encodage par défaut de l’ordinateur qui exécute le programme.

Articles similaires