Remplacer le texte dans un PDF
Remplacer le texte sur toutes les pages d’un document PDF
Pour remplacer le texte sur toutes les pages d’un document PDF en utilisant Aspose.PDF for Java:
-
Utilisez d’abord TextFragmentAbsorber pour trouver la phrase particulière à remplacer.
-
Ensuite, parcourez tous les TextFragments pour remplacer le texte et modifier d’autres attributs.
-
Enfin, enregistrez le PDF de sortie en utilisant la méthode save de la classe Document.
package com.aspose.pdf.examples;
import com.aspose.pdf.*;
public class ExampleReplaceText {
private static String _dataDir = "/home/admin1/pdf-examples/Samples/";
public static void ReplaceTextOnAllPages() {
Document pdfDocument = new Document(_dataDir+"sample.pdf");
// Créer un objet TextAbsorber pour trouver toutes les instances de la phrase de recherche saisie
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("Web");
// Accepter l'absorbeur pour la première page du document
pdfDocument.getPages().accept(textFragmentAbsorber);
// Obtenir les fragments de texte extraits dans une collection
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();
// Parcourir les fragments
for (TextFragment textFragment : (Iterable<TextFragment>) textFragmentCollection) {
// Mettre à jour le texte et d'autres propriétés
textFragment.setText("World Wide Web");
textFragment.getTextState().setFont(FontRepository.findFont("Verdana"));
textFragment.getTextState().setFontSize(12);
textFragment.getTextState().setForegroundColor(Color.getBlue());
textFragment.getTextState().setBackgroundColor(Color.getGray());
}
// Enregistrer le fichier PDF mis à jour
pdfDocument.save(_dataDir+"Updated_Text.pdf");
}
}
Remplacer le texte dans une région particulière de la page
Pour remplacer le texte dans une région particulière de la page, nous devons d’abord instancier l’objet TextFragmentAbsorber, spécifier la région de la page en utilisant TextSearchOptions.setRectangle puis parcourir tous les TextFragments pour remplacer le texte. Une fois ces opérations terminées, nous avons seulement besoin de sauvegarder le PDF de sortie en utilisant la méthode save de l’objet Document.
Le code suivant vous montre comment remplacer le texte dans toutes les pages d’un document PDF.
public static void ReplaceTextInParticularRegion(){
// charger le fichier PDF
Document pdfDocument = new Document(_dataDir+"sample.pdf");
// instancier l'objet TextFragment Absorber
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("PDF");
// rechercher le texte dans les limites de la page
textFragmentAbsorber.getTextSearchOptions().setLimitToPageBounds(true);
// spécifier la région de la page pour les options de recherche de texte
textFragmentAbsorber.getTextSearchOptions().setRectangle(new Rectangle(100, 700, 400, 770));
// rechercher le texte de la première page du fichier PDF
pdfDocument.getPages().get_Item(1).accept(textFragmentAbsorber);
// parcourir chaque TextFragment
for(TextFragment tf : textFragmentAbsorber.getTextFragments())
{
// remplacer le texte par "---"
tf.setText("---");
}
// Enregistrer le fichier PDF mis à jour
pdfDocument.save(_dataDir+"Updated_Text.pdf");
}
Remplacer le texte basé sur une expression régulière
Si vous voulez remplacer certaines phrases basées sur une expression régulière, vous devez d’abord trouver toutes les phrases correspondant à cette expression régulière particulière en utilisant TextFragmentAbsorber. Vous devrez passer l’expression régulière en tant que paramètre au constructeur de TextFragmentAbsorber. Vous devez également créer un objet TextSearchOptions qui spécifie si l’expression régulière est utilisée ou non. Une fois que vous avez les phrases correspondantes dans TextFragments, vous devez les parcourir toutes et les mettre à jour selon vos besoins. Enfin, vous devez enregistrer le PDF mis à jour en utilisant la méthode Save de l’objet Document.
Le code suivant vous montre comment remplacer du texte basé sur une expression régulière.
public static void ReplaceTextWithRegularExpression() {
// charger le fichier PDF
Document pdfDocument = new Document(_dataDir + "sample.pdf");
// Créez un objet TextAbsorber pour trouver toutes les instances de la phrase de recherche
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("\\d{4}-\\d{4}");
// comme 1999-2000
// Définir l'option de recherche de texte pour spécifier l'utilisation des expressions régulières
TextSearchOptions textSearchOptions = new TextSearchOptions(true);
textFragmentAbsorber.setTextSearchOptions(textSearchOptions);
// Accepter l'absorbeur pour la première page du document
pdfDocument.getPages().accept(textFragmentAbsorber);
// Obtenez les fragments de texte extraits dans la collection
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();
// Parcourir les fragments
for (TextFragment textFragment : (Iterable<TextFragment>) textFragmentCollection) {
// Mettre à jour le texte et autres propriétés
textFragment.setText("ABCD-EFGH");
textFragment.getTextState().setFont(FontRepository.findFont("Verdana"));
textFragment.getTextState().setFontSize(12);
textFragment.getTextState().setForegroundColor(Color.getBlue());
textFragment.getTextState().setBackgroundColor(Color.getGray());
}
// Enregistrer le fichier PDF mis à jour
pdfDocument.save(_dataDir + "Updated_Text.pdf");
}
Remplacer les polices dans un fichier PDF existant
Aspose.PDF pour Java prend en charge la capacité de remplacer le texte dans un document PDF. Cependant, parfois, vous avez besoin de remplacer uniquement la police utilisée dans le document PDF. Ainsi, au lieu de remplacer le texte, seule la police utilisée est remplacée. L’une des surcharges du constructeur TextFragmentAbsorber accepte un objet TextEditOptions comme argument et nous pouvons utiliser la valeur RemoveUnusedFonts de l’énumération TextEditOptions.FontReplace pour répondre à nos besoins.
Le code suivant montre comment remplacer la police dans un document PDF.
public static void ReplaceFonts() {
// Instancier l'objet Document
Document pdfDocument = new Document(_dataDir + "sample.pdf");
// Rechercher des fragments de texte et définir l'option d'édition pour supprimer les polices inutilisées
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(
new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts));
// Accepter l'absorbeur pour toutes les pages du document
pdfDocument.getPages().accept(textFragmentAbsorber);
// parcourir tous les TextFragments
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();
for (TextFragment textFragment : (Iterable<TextFragment>) textFragmentCollection)
{
String fontName = textFragment.getTextState().getFont().getFontName();
// si le nom de la police est ArialMT, remplacer le nom de la police par Arial
if (fontName.equals("ArialMT")) {
textFragment.getTextState().setFont(FontRepository.findFont("Arial"));
}
}
// Enregistrer le fichier PDF mis à jour
pdfDocument.save(_dataDir + "Updated_Text.pdf");
}
Utiliser une Police Non-Anglaise (Japonais) Lors du Remplacement de Texte
Le code suivant montre comment remplacer du texte par des caractères japonais. Veuillez noter que pour ajouter du texte japonais, vous devez utiliser une police qui prend en charge les caractères japonais (par exemple MSGothic).
public static void UseNonEnglishFontWhenReplacingText() {
// Instancier un objet Document
Document pdfDocument = new Document(_dataDir + "sample.pdf");
// Changeons chaque mot "page" par du texte japonais avec une police spécifique
// TakaoMincho qui peut être installée dans le système
// De plus, il peut s'agir d'une autre police qui prend en charge les hiéroglyphes
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("page");
// Créer une instance des options de recherche de texte
TextSearchOptions searchOptions = new TextSearchOptions(true);
textFragmentAbsorber.setTextSearchOptions(searchOptions);
// Accepter l'absorbeur pour toutes les pages du document
pdfDocument.getPages().accept(textFragmentAbsorber);
// Obtenir les fragments de texte extraits dans une collection
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();
// Parcourir les fragments
for (TextFragment textFragment : (Iterable<TextFragment>) textFragmentCollection) {
// Mettre à jour le texte et d'autres propriétés
textFragment.setText("ファイル");
textFragment.getTextState().setFont(FontRepository.findFont("MSGothic"));
textFragment.getTextState().setFontSize(12);
textFragment.getTextState().setForegroundColor(Color.getBlue());
textFragment.getTextState().setBackgroundColor(Color.getGray());
}
// Enregistrer le document mis à jour
pdfDocument.save(_dataDir + "Japanese_Text.pdf");
}
Le remplacement de texte doit réorganiser automatiquement le contenu de la page
Aspose.PDF pour Java prend en charge la fonctionnalité de recherche et de remplacement de texte dans le fichier PDF. Cependant, récemment, certains clients ont rencontré des problèmes lors du remplacement de texte lorsqu’un TextFragment particulier est remplacé par un contenu plus petit et que des espaces supplémentaires sont affichés dans le PDF résultant ou dans le cas où le TextFragment est remplacé par une chaîne plus longue, les mots se chevauchent avec le contenu existant de la page. Donc, la nécessité était d’introduire un mécanisme pour que, une fois le texte d’un document PDF remplacé, le contenu soit réorganisé.
Afin de répondre aux scénarios mentionnés ci-dessus, Aspose.PDF pour Java a été amélioré de sorte qu’aucun problème de ce type n’apparaisse lors du remplacement de texte dans le fichier PDF. Le code suivant montre comment remplacer du texte dans le fichier PDF et le contenu de la page doit être réorganisé automatiquement.
public static void RearrangeContent() {
// Charger le fichier PDF source
Document pdfDocument = new Document(_dataDir + "sample.pdf");
// Créer un objet TextFragment Absorber avec une expression régulière
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("[PDF,Web]");
TextSearchOptions textSearchOptions = new TextSearchOptions(true);
textFragmentAbsorber.setTextSearchOptions(textSearchOptions);
//Vous pouvez également spécifier l'option ReplaceAdjustment.WholeWordsHyphenation pour envelopper le texte sur la ligne suivante ou actuelle
//si la ligne actuelle devient trop longue ou courte après le remplacement :
//textFragmentAbsorber.getTextReplaceOptions().setReplaceAdjustmentAction(TextReplaceOptions.ReplaceAdjustment.WholeWordsHyphenation);
// Accepter l'absorbeur pour toutes les pages du document
pdfDocument.getPages().accept(textFragmentAbsorber);
// Obtenir les fragments de texte extraits dans la collection
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();
// Remplacer chaque TextFragment
for (TextFragment textFragment : (Iterable<TextFragment>) textFragmentCollection) {
// Définir la police du fragment de texte à remplacer
textFragment.getTextState().setFont(FontRepository.findFont("Arial"));
// Définir la taille de la police
textFragment.getTextState().setFontSize(10);
textFragment.getTextState().setForegroundColor(Color.getBlue());
textFragment.getTextState().setBackgroundColor(Color.getGray());
// Remplacer le texte par une chaîne plus longue que l'espace réservé
textFragment.setText("Ceci est une chaîne plus longue pour le test de cette fonctionnalité");
}
// Enregistrer le PDF résultant
pdfDocument.save(_dataDir + "RearrangeContentsUsingTextReplacement_out.pdf");
}
Rendu des symboles remplaçables lors de la création de PDF
Les symboles remplaçables sont des symboles spéciaux dans une chaîne de texte qui peuvent être remplacés par le contenu correspondant lors de l’exécution. Les symboles remplaçables actuellement pris en charge par le nouveau modèle objet de document du namespace Aspose.PDF sont $P
, $p,
\n
, \r
. Les symboles $p
et $P
sont utilisés pour gérer la numérotation des pages lors de l’exécution. $p
est remplacé par le numéro de la page où se trouve la classe actuelle de paragraphe. $P
est remplacé par le nombre total de pages dans le document. Lors de l’ajout de TextFragment à la collection de paragraphes des documents PDF, il ne prend pas en charge le saut de ligne à l’intérieur du texte. Cependant, afin d’ajouter du texte avec un saut de ligne, veuillez utiliser TextFragment avec TextParagraph :
- utilisez “\r\n” ou Environment.NewLine dans TextFragment au lieu d’un simple “\n” ;
- créez un objet TextParagraph. Il ajoutera du texte avec une séparation de ligne ;
- ajouter le TextFragment avec TextParagraph.AppendLine ;
- ajouter le TextParagraph avec TextBuilder.AppendParagraph.
public static void RenderingReplaceableSymbols() {
// charger le fichier PDF
Document pdfDocument = new Document(_dataDir + "sample.pdf");
Page page = pdfDocument.getPages().add();
// Initialiser un nouveau TextFragment avec du texte contenant les marqueurs de nouvelle ligne requis
TextFragment textFragment = new TextFragment("Nom du demandeur : " + System.lineSeparator() + " Joe Smoe");
// Définir les propriétés du fragment de texte si nécessaire
textFragment.getTextState().setFontSize(12);
textFragment.getTextState().setFont(FontRepository.findFont("TimesNewRoman"));
textFragment.getTextState().setBackgroundColor(Color.getLightGray());
textFragment.getTextState().setForegroundColor(Color.getRed());
// Créer un objet TextParagraph
TextParagraph par = new TextParagraph();
// Ajouter un nouveau TextFragment au paragraphe
par.appendLine(textFragment);
// Définir la position du paragraphe
par.setPosition (new Position(100, 600));
// Créer un objet TextBuilder
TextBuilder textBuilder = new TextBuilder(page);
// Ajouter le TextParagraph en utilisant TextBuilder
textBuilder.appendParagraph(par);
_dataDir = _dataDir + "RenderingReplaceableSymbols_out.pdf";
pdfDocument.save(_dataDir);
}
Symboles remplaçables dans la zone d’en-tête/pied de page
Les symboles remplaçables peuvent également être placés à l’intérieur de la section En-tête/Pied de page d’un fichier PDF. Veuillez consulter l’extrait de code suivant pour plus de détails sur la façon d’ajouter un symbole remplaçable dans la section de pied de page.
public static void ReplaceableSymbolsInHeaderFooterArea() {
Document doc = new Document();
Page page = doc.getPages().add();
MarginInfo marginInfo = new MarginInfo();
marginInfo.setTop(90);
marginInfo.setBottom(50);
marginInfo.setLeft(50);
marginInfo.setRight(50);
// Assigner l'instance marginInfo à la propriété Margin de sec1.PageInfo
page.getPageInfo().setMargin(marginInfo);
HeaderFooter hfFirst = new HeaderFooter();
page.setHeader(hfFirst);
hfFirst.getMargin().setLeft(50);
hfFirst.getMargin().setRight(50);
// Instancier un paragraphe de texte qui stockera le contenu à afficher comme en-tête
TextFragment t1 = new TextFragment("titre du rapport");
t1.getTextState().setFont(FontRepository.findFont("Arial"));
t1.getTextState().setFontSize(16);
t1.getTextState().setForegroundColor(Color.getBlack());
t1.getTextState().setFontStyle(FontStyles.Bold);
t1.getTextState().setHorizontalAlignment(HorizontalAlignment.Center);
t1.getTextState().setLineSpacing(5f);
hfFirst.getParagraphs().add(t1);
TextFragment t2 = new TextFragment("Nom_Rapport");
t2.getTextState().setFont(FontRepository.findFont("Arial"));
t2.getTextState().setForegroundColor(Color.getBlack());
t2.getTextState().setHorizontalAlignment(HorizontalAlignment.Center);
t2.getTextState().setLineSpacing(5f);
t2.getTextState().setFontSize(12);
hfFirst.getParagraphs().add(t2);
// Créer un objet HeaderFooter pour la section
HeaderFooter hfFoot = new HeaderFooter();
// Définir l'objet HeaderFooter sur pied de page impair et pair
page.setFooter(hfFoot);
hfFoot.getMargin().setLeft(50);
hfFoot.getMargin().setRight(50);
// Ajouter un paragraphe de texte contenant le numéro de page actuel sur le nombre total de pages
TextFragment t3 = new TextFragment("Généré à la date du test");
TextFragment t4 = new TextFragment("nom du rapport ");
TextFragment t5 = new TextFragment("Page $p de $P");
// Instancier un objet Table
Table tab2 = new Table();
// Ajouter le tableau dans la collection de paragraphes de la section souhaitée
hfFoot.getParagraphs().add(tab2);
// Définir les largeurs de colonnes du tableau
tab2.setColumnWidths("165 172 165");
// Créer des rangées dans le tableau puis des cellules dans les rangées
Row row3 = tab2.getRows().add();
row3.getCells().add();
row3.getCells().add();
row3.getCells().add();
// Définir l'alignement vertical du texte comme aligné au centre
row3.getCells().get_Item(0).setAlignment(HorizontalAlignment.Left);
row3.getCells().get_Item(1).setAlignment(HorizontalAlignment.Center);
row3.getCells().get_Item(2).setAlignment(HorizontalAlignment.Right);
row3.getCells().get_Item(0).getParagraphs().add(t3);
row3.getCells().get_Item(1).getParagraphs().add(t4);
row3.getCells().get_Item(2).getParagraphs().add(t5);
Table table = new Table();
table.setColumnWidths("33% 33% 34%");
table.setDefaultCellPadding(new MarginInfo());
table.getDefaultCellPadding().setTop(10);
table.getDefaultCellPadding().setBottom(10);
// Ajouter le tableau dans la collection de paragraphes de la section souhaitée
page.getParagraphs().add(table);
// Définir la bordure par défaut de la cellule à l'aide de l'objet BorderInfo
table.setDefaultCellBorder(new BorderInfo(BorderSide.All, 0.1f));
// Définir la bordure du tableau à l'aide d'un autre objet BorderInfo personnalisé
table.setBorder(new BorderInfo(BorderSide.All, 1f));
table.setRepeatingRowsCount(1);
// Créer des rangées dans le tableau puis des cellules dans les rangées
Row row1 = table.getRows().add();
row1.getCells().add("col1");
row1.getCells().add("col2");
row1.getCells().add("col3");
String CRLF = "\r\n";
for (int i = 0; i <= 10; i++) {
Row row = table.getRows().add();
row.setRowBroken(true);
for (int c = 0; c <= 2; c++) {
Cell c1;
if (c == 2)
c1 = row.getCells().add(
"Aspose.Total for Java est une compilation de chaque composant Java offert par Aspose. Elle est compilée sur une"
+ CRLF
+ "base quotidienne pour s'assurer qu'elle contient les versions les plus récentes de chacun de nos composants Java. "
+ CRLF
+ "base quotidienne pour s'assurer qu'elle contient les versions les plus récentes de chacun de nos composants Java. "
+ CRLF
+ "En utilisant Aspose.Total for Java, les développeurs peuvent créer une large gamme d'applications.");
else
c1 = row.getCells().add("élément1" + c);
c1.setMargin(new MarginInfo());
c1.getMargin().setLeft(30);
c1.getMargin().setTop(10);
c1.getMargin().setBottom(10);
}
}
_dataDir = _dataDir + "ReplaceableSymbolsInHeaderFooter_out.pdf";
doc.save(_dataDir);
}
Supprimer tout le texte du document PDF
Supprimer tout le texte en utilisant des opérateurs
Dans certaines opérations sur le texte, vous devez supprimer tout le texte du document PDF et pour cela, vous devez généralement définir le texte trouvé comme une chaîne vide. Le point est que changer le texte pour une multitude de fragments de texte entraîne un certain nombre de vérifications et d’opérations d’ajustement de position du texte. Elles sont essentielles dans les scénarios d’édition de texte. La difficulté est que vous ne pouvez pas déterminer combien de fragments de texte seront supprimés dans le scénario où ils sont traités dans une boucle.
Par conséquent, nous recommandons d’utiliser une autre approche pour le scénario de suppression de tout le texte des pages PDF. Veuillez considérer l’extrait de code suivant qui fonctionne très rapidement.
public static void RemoveAllTextUsingOperators() {
// Ouvrir le document
Document pdfDocument = new Document(_dataDir + "sample.pdf");
// Boucle à travers toutes les pages du document PDF
for (int i = 1; i <= pdfDocument.getPages().size(); i++) {
Page page = pdfDocument.getPages().get_Item(i);
OperatorSelector operatorSelector = new OperatorSelector(new com.aspose.pdf.operators.TextShowOperator());
// Sélectionner tout le texte sur la page
page.getContents().accept(operatorSelector);
// Supprimer tout le texte
page.getContents().delete(operatorSelector.getSelected());
}
// Enregistrer le document
pdfDocument.save(_dataDir + "RemoveAllText_out.pdf");
}