Itext FR
Itext FR
#itext
Table des matières
À propos 1
Remarques 2
Versions 3
Examples 3
Installation ou configuration 3
iText pour C # 5
Bonjour le monde 5
Remarques 7
Examples 7
Text2PdfColumns.java (iText 5) 7
Text2PdfColumns.java (iText 7) 9
Remarques 12
Examples 12
HelloWorld.java (iText 5) 12
Remarques 15
Examples 16
Text2PdfPageEvents.java (iText 5) 16
Text2PdfPageEvents1.java (iText 7) 19
Text2PdfPageEvents2.java 21
Remarques 24
Examples 24
FormCreation.java (iText 5) 24
FormCreation.java (iText 7) 25
FormFilling.java (iText 5) 26
FormFilling.java (iText 7) 27
Remarques 29
Examples 30
HelloWorldInternational.java (iText 5) 30
HelloWorldInternational.java (iText 7) 31
Introduction 33
Remarques 33
Examples 33
iText 5: 33
iText 7: 33
Remarques 35
Examples 35
HelloWorldStyles.java (iText 5) 35
HelloWorldStyles.java (iText 7) 36
Remarques 38
Examples 39
HelloWorldTable.java (iText 5) 39
HelloWorldTable.java (iText 7) 40
Remarques 42
Examples 42
Text2Pdf.java (iText 5) 42
Text2Pdf.java (iText 7) 44
Crédits 47
À propos
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version
from: itext
It is an unofficial and free itext ebook created for educational purposes. All the content is extracted
from Stack Overflow Documentation, which is written by many hardworking individuals at Stack
Overflow. It is neither affiliated with Stack Overflow nor official itext.
The content is released under Creative Commons BY-SA, and the list of contributors to each
chapter are provided in the credits section at the end of this book. Images may be copyright of
their respective owners unless otherwise specified. All trademarks and registered trademarks are
the property of their respective company owners.
Use the content presented in this book at your own risk; it is not guaranteed to be correct nor
accurate, please send your feedback and corrections to info@zzzprojects.com
https://riptutorial.com/fr/home 1
Chapitre 1: Démarrer avec itext
Remarques
Si vous regardez la création de PDF, vous trouverez deux approches différentes:
• Les concepteurs graphiques utilisent des applications de bureau telles que Adobe Acrobat
ou Adobe InDesign pour créer un document dans un processus manuel ou semi-annuel.
• Dans un autre contexte, les documents PDF sont créés par programmation, en utilisant une
API pour produire des fichiers PDF directement à partir d'applications logicielles, sans
intervention humaine ou avec un minimum. Parfois, le document est d'abord créé dans un
format intermédiaire (XML, HTML, etc.), puis converti en PDF.
• Vous pouvez mettre à jour un PDF manuellement dans des outils tels que Adobe Acrobat,
• Il existe également des outils permettant de remplir automatiquement les formulaires en
fonction des informations d’une base de données.
• Générer des documents et des rapports basés sur des données provenant d'un fichier XML
ou d'une base de données
• Créez des cartes et des livres en exploitant de nombreuses fonctionnalités interactives
disponibles en PDF
• Ajouter des signets, numéros de page, filigranes et autres fonctionnalités aux documents
PDF existants
• Fractionner ou concaténer des pages à partir de fichiers PDF existants
• Remplir des formulaires interactifs
• Signer numériquement les documents PDF
• Servir des documents PDF générés ou manipulés dynamiquement sur un navigateur Web
iText n'est pas un outil d'utilisateur final. Vous devez créer iText dans vos propres applications
pour pouvoir automatiser le processus de création et de manipulation des PDF.
https://riptutorial.com/fr/home 2
En règle générale, iText est utilisé dans des projets répondant à l'une des exigences suivantes:
• Le contenu n'est pas disponible à l'avance: il est calculé en fonction des données saisies par
l'utilisateur ou de la base de données en temps réel.
• Les fichiers PDF ne peuvent pas être produits manuellement en raison du volume important
de contenu: un grand nombre de pages ou de documents.
• Les documents doivent être créés en mode sans assistance, par lots.
• Le contenu doit être personnalisé ou personnalisé. Par exemple, le nom de l'utilisateur final
doit figurer sur plusieurs pages.
Vous rencontrerez souvent ces exigences dans les applications Web, où le contenu doit être servi
dynamiquement à un navigateur. Normalement, vous diffusez ces informations sous forme de
code HTML, mais pour certains documents, le format PDF est préférable au code HTML pour une
meilleure qualité d’impression, pour une présentation identique sur diverses plates-formes, pour
des raisons de sécurité comme PAdES, PDF / A ou PDF / UA) ou pour réduire la taille du fichier.
Versions
Examples
Installation ou configuration
• Comment importer iText 7 dans Eclipse pour créer un fichier PDF Hello World?
• Comment importer iText 7 dans Netbeans pour créer un fichier PDF Hello World?
• Comment importer iText 7 dans IntelliJ IDEA pour créer un fichier PDF Hello World?
Dans ces didacticiels, nous définissons uniquement le kernel et les projets de layout en tant que
dépendances. Maven importe également automatiquement le io jar car les paquets du kernel
https://riptutorial.com/fr/home 3
dépendent des paquets io .
<dependencies>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>kernel</artifactId>
<version>7.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>io</artifactId>
<version>7.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>layout</artifactId>
<version>7.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>forms</artifactId>
<version>7.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>pdfa</artifactId>
<version>7.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>pdftest</artifactId>
<version>7.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.18</version>
</dependency>
</dependencies>
Pour une utilisation plus spécifique de iText 7, vous pouvez avoir besoin de jars supplémentaires:
https://riptutorial.com/fr/home 4
• barcodes : utilisez cette barcodes si vous souhaitez créer des codes à barres.
• hyph : utilisez cette hyph pour que le texte soit coupé.
• font-asian : utilisez cette fonctionnalité vous avez besoin de la fonctionnalité CJK (chinois /
japonais / coréen)
• sign : utilisez ceci si vous avez besoin de support pour les signatures numériques.
Tous les pots mentionnés ci-dessus sont disponibles sous la licence AGPL. Vous pouvez
également télécharger ces fichiers dans un fichier ZIP hébergé sur Github:
https://github.com/itext/itext7/releases
Si vous voulez utiliser ces pots, vous devez les ajouter à votre CLASSPATH, tout comme vous
ajouteriez un autre pot.
Des fonctionnalités supplémentaires pour iText 7 sont disponibles via des modules
complémentaires, livrés sous forme de licence sous une licence commerciale. Si vous souhaitez
utiliser l'un de ces modules complémentaires ou si vous souhaitez utiliser iText 7 avec votre code
propriétaire, vous devez obtenir une clé de licence commerciale pour iText 7 (voir la section
juridique du site Web iText ).
Vous pouvez importer une telle clé de licence à l'aide du module de clé de licence. Vous pouvez
obtenir le fichier de licence comme ceci:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-licensekey</artifactId>
<version>2.0.0</version>
<scope>compile</scope>
</dependency>
Certaines fonctionnalités dans iText sont des sources fermées. Par exemple, si vous souhaitez
utiliser PdfCalligraph , vous avez besoin du module de typography . Ce module ne fonctionnera
pas sans une clé de licence officielle.
iText pour C #
Vous pouvez télécharger un fichier ZIP contenant toutes les DLL disponibles sous AGPL. Pour
plus d'informations sur ces DLL, consultez la documentation Java.
Bonjour le monde
Ceci est un programme très simple pour créer un PDF en utilisant iText 7 / Java:
//Initialize writer
PdfWriter writer = new PdfWriter(dest);
//Initialize document
PdfDocument pdfDoc = new PdfDocument(writer);
Document doc = new Document(pdfDoc);
https://riptutorial.com/fr/home 5
//Add paragraph to the document
doc.add(new Paragraph("Hello World!"));
//Close document
doc.close();
( Listing_01_01_HelloWorld.java )
Et c'est un programme très simple pour créer un PDF en utilisant le précurseur iText 5.5.x / Java:
// step 1
Document document = new Document();
// step 2
PdfWriter.getInstance(document, new FileOutputStream(filename));
// step 3
document.open();
// step 4
document.add(new Paragraph("Hello World!"));
// step 5
document.close();
( HelloWorld.java )
Ces deux exemples se ressemblent beaucoup. Les avantages de l'API iText 7 redessinée
deviendront évidents dès que l'on se penchera sur des exemples moins triviaux. Il vous suffit donc
de naviguer dans l'exemple de code source à partir des liens ci-dessus et de comparer.
https://riptutorial.com/fr/home 6
Chapitre 2: Colonnes: iText 5 versus iText 7
Remarques
Dans iText 5, vous ne pouvez pas utiliser la méthode add() pour ajouter un Paragraph à un Document
si vous souhaitez organiser le contenu en colonnes. Nous ne pouvons pas réutiliser le code de
l'exemple Text2Pdf.java (iText 5) .
Au lieu de cela, nous devons créer un objet ColumnText , nous devons ajouter tous les objets
Paragraph à cet objet, et une fois que nous avons fini d'ajouter tout le contenu, nous pouvons
commencer à rendre ce contenu en utilisant la méthode go() . Ce faisant, nous devons suivre les
colonnes et créer de nouvelles pages si nécessaire.
Avec iText 7, nous pouvons copier et coller le code à partir de l'exemple Text2Pdf.java (iText 7) .
Nous pouvons continuer à utiliser la méthode add() la même manière qu'auparavant. Si nous
voulons rendre le contenu dans deux colonnes plutôt que dans une, nous devons simplement
changer le rendu du document:
Rectangle[] columns = {
new Rectangle(36, 36, 254, 770),
new Rectangle(305, 36, 254, 770)};
document.setRenderer(new ColumnDocumentRenderer(document, columns));
Lisez Travailler avec le RootElement qui est le chapitre 5 du tutoriel iText 7: Building Blocks .
Obtenez l'ebook gratuit!
Examples
Text2PdfColumns.java (iText 5)
https://riptutorial.com/fr/home 7
Lorsque vous utilisez iText 5, vous avez besoin d'un code comme celui-ci:
https://riptutorial.com/fr/home 8
public void createPdf(String dest)
throws DocumentException, IOException {
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
ColumnText ct = new ColumnText(writer.getDirectContent());
BufferedReader br = new BufferedReader(new FileReader(TEXT));
String line;
Paragraph p;
Font normal = new Font(FontFamily.TIMES_ROMAN, 12);
Font bold = new Font(FontFamily.TIMES_ROMAN, 12, Font.BOLD);
boolean title = true;
while ((line = br.readLine()) != null) {
p = new Paragraph(line, title ? bold : normal);
p.setAlignment(Element.ALIGN_JUSTIFIED);
title = line.isEmpty();
ct.addElement(p);
}
Rectangle[] columns = {
new Rectangle(36, 36, 290, 806), new Rectangle(305, 36, 559, 806)
};
int c = 0;
int status = ColumnText.START_COLUMN;
while (ColumnText.hasMoreText(status)) {
ct.setSimpleColumn(columns[c]);
status = ct.go();
if (++c == 2) {
document.newPage();
c = 0;
}
}
document.close();
}
Source: developers.itextpdf.com
Text2PdfColumns.java (iText 7)
https://riptutorial.com/fr/home 9
Lorsque vous utilisez iText 7, vous avez besoin d'un code comme celui-ci:
https://riptutorial.com/fr/home 10
public void createPdf(String dest) throws IOException {
PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
Document document = new Document(pdf)
.setTextAlignment(TextAlignment.JUSTIFIED);
Rectangle[] columns = {
new Rectangle(36, 36, 254, 770),
new Rectangle(305, 36, 254, 770)};
document.setRenderer(new ColumnDocumentRenderer(document, columns));
BufferedReader br = new BufferedReader(new FileReader(TEXT));
String line;
PdfFont normal = PdfFontFactory.createFont(FontConstants.TIMES_ROMAN);
PdfFont bold = PdfFontFactory.createFont(FontConstants.TIMES_BOLD);
boolean title = true;
while ((line = br.readLine()) != null) {
document.add(new Paragraph(line).setFont(title ? bold : normal));
title = line.isEmpty();
}
document.close();
}
https://riptutorial.com/fr/home 11
Chapitre 3: Création PDF: iText 5 contre iText
7
Remarques
Dans la conception originale de iText, il était possible de créer un objet Document haut niveau, puis
d’avoir différents objets DocListener écoute de cet objet Document . Cela a été réalisé en utilisant
différents auteurs: un PdfWriter , un HTMLWriter et un RtfWriter . Lors de l'utilisation d'un PdfWriter ,
un PdfDocument été créé en interne. Cette classe de bas niveau a pris en charge toutes les
structures liées au PDF. Plus ou moins la même chose était vraie pour les autres formats.
Au fil des ans, iText s'est spécialisé et est devenu une pure bibliothèque PDF. La création de
HTML et RTF a été abandonnée, il n'était donc plus nécessaire de créer un Document avant de
créer un PdfWriter , mais nous devions nous en tenir à l'architecture d'origine car nous n'étions
pas prêts à casser l'API.
Au fil des années, nous avons ajouté de plus en plus de fonctionnalités PDF à iText, et le fait que
PdfDocument soit une classe à usage interne est devenu problématique. Nous avons utilisé des
solutions de contournement pour que nous puissions introduire de nouvelles fonctionnalités PDF
appartenant à la classe PdfDocument jusqu'au moment où nous avons atteint le plafond de ce que
nous considérions comme des solutions de contournement acceptables.
C'est à ce moment que nous avons décidé de réécrire iText à partir de zéro et de créer une toute
nouvelle architecture pour iText. Nous avons maintenant une distinction claire entre le PdfDocument
(pour les opérations de bas niveau) et le Document (pour les fonctionnalités de haut niveau). Nous
n'avons plus besoin d'ouvrir le document, et si nous utilisons l'approche try-with-resources , nous
n'avons même pas besoin de la fermer nous-mêmes.
Examples
HelloWorld.java (iText 5)
https://riptutorial.com/fr/home 12
Dans iText 5, cela se ferait comme ceci:
Source: developers.itextpdf.com
https://riptutorial.com/fr/home 13
PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
Document document = new Document(pdf);
document.add(new Paragraph("Hello World!"));
document.close();
}
https://riptutorial.com/fr/home 14
Chapitre 4: Evénements de page (iText 5)
contre gestionnaires d'événements et rendus
(iText 7)
Remarques
Dans iText 5, nous avons introduit le concept d'événement de page pour permettre aux
développeurs d'ajouter un comportement spécifique à l'ouverture d'un document, à l'ouverture
d'une nouvelle page, à la fermeture d'un document.
Dans la documentation, nous avons clairement indiqué qu’il était interdit d’ajouter du contenu
dans la méthode onStartPage() ; le contenu ne peut être ajouté que dans la méthode onEndPage() .
Nous avons également indiqué très clairement que l'objet Document transmis aux méthodes
d'événement de page a été transmis uniquement à des fins de lecture seule. Il était interdit
d'utiliser document.add() même dans la méthode onEndPage() .
Je ne me souviens plus combien de fois je me suis agitée parce qu'un autre développeur avait
posté une copie de ces questions. Les gens se demandent souvent pourquoi ils obtiennent une
réponse dure, mais ils ne réalisent pas qu'un minimum d'effort de leur part aurait permis à tout le
monde, y compris eux-mêmes, de gagner du temps. On aurait pu répondre à toutes ces questions
en disant "Lire le manuel (vous savez quoi)."
Une autre option consistait en une refonte complète d’iText afin d’éviter ce genre de problèmes.
Pour tous les événements IEventHandler aux pages, nous implémentons maintenant l'interface
IEventHandler et nous utilisons addEventHandler pour ajouter ce gestionnaire en tant que
PdfDocumentEvent au PdfDocument . Dans l'exemple, nous utilisons un événement END_PAGE , mais
nous aurions également pu utiliser un événement START_PAGE . Que vous ajoutiez du contenu au
https://riptutorial.com/fr/home 15
début ou à la fin importe peu. Vous pouvez en savoir plus à ce sujet dans Gestion des
événements; définir les préférences du lecteur et les propriétés du rédacteur, qui est le chapitre 7
du didacticiel iText 7: Building Blocks .
Nous avons amélioré les éléments constitutifs dans le sens où nous les avons rendus plus
hiérarchiques (voir Avant de commencer: aperçu des classes et des interfaces qui constituent
l’introduction du didacticiel iText 7: Building Blocks ). Nous avons également introduit un ensemble
de classes Renderer, une pour chaque bloc de construction, et nous permettons aux
développeurs d’adapter ces moteurs de rendu pour qu’un bloc de construction affiche un
comportement différent lors du rendu. Voir par exemple l'exemple de rendu dans Ajouter des
objets AbstractElement (partie 1) qui est le chapitre 7 du didacticiel iText 7: Building Blocks .
Ces modifications simplifient la fonctionnalité pour les développeurs qui (ne veulent pas) en savoir
plus sur PDF et iText, tout en offrant une grande flexibilité aux développeurs qui n’ont pas peur de
se plonger dans le code iText pour créer un PDF exactement comme ils le souhaitent.
Examples
Text2PdfPageEvents.java (iText 5)
https://riptutorial.com/fr/home 16
Notez la bordure bleue qui est ajoutée aux titres et le numéro de page au bas de chaque page.
Dans iText 5, ces éléments sont ajoutés à l'aide des événements de page:
https://riptutorial.com/fr/home 17
class MyPageEvents extends PdfPageEventHelper {
@Override
public void onEndPage(PdfWriter writer, Document document) {
Rectangle pagesize = document.getPageSize();
ColumnText.showTextAligned(
writer.getDirectContent(),
Element.ALIGN_CENTER,
new Phrase(String.valueOf(writer.getPageNumber())),
(pagesize.getLeft() + pagesize.getRight()) / 2,
pagesize.getBottom() + 15,
0);
if (startpos != -1)
onParagraphEnd(writer, document,
pagesize.getBottom(document.bottomMargin()));
startpos = pagesize.getTop(document.topMargin());
}
@Override
public void onParagraph(PdfWriter writer, Document document,
float paragraphPosition) {
startpos = paragraphPosition;
}
@Override
public void onParagraphEnd(PdfWriter writer, Document document,
float paragraphPosition) {
if (!title) return;
PdfContentByte canvas = writer.getDirectContentUnder();
Rectangle pagesize = document.getPageSize();
canvas.saveState();
canvas.setColorStroke(BaseColor.BLUE);
canvas.rectangle(
pagesize.getLeft(document.leftMargin()),
paragraphPosition - 3,
pagesize.getWidth() - document.leftMargin() - document.rightMargin(),
startpos - paragraphPosition);
canvas.stroke();
canvas.restoreState();
}
}
Nous pouvons réutiliser le code pour convertir un fichier texte en format PDF à partir de l'exemple
Text2Pdf.java (iText 5) et introduire l'événement de page dans PdfWriter :
https://riptutorial.com/fr/home 18
String line;
Paragraph p;
Font normal = new Font(FontFamily.TIMES_ROMAN, 12);
Font bold = new Font(FontFamily.TIMES_ROMAN, 12, Font.BOLD);
boolean title = true;
while ((line = br.readLine()) != null) {
p = new Paragraph(line, title ? bold : normal);
p.setAlignment(Element.ALIGN_JUSTIFIED);
events.setTitle(title);
document.add(p);
title = line.isEmpty();
}
document.close();
}
Source: developers.itextpdf.com
Text2PdfPageEvents1.java (iText 7)
https://riptutorial.com/fr/home 19
Notez les numéros de page au bas de chaque page. Ceux-ci sont ajoutés à l'aide d'une
implémentation IEventHandler :
https://riptutorial.com/fr/home 20
protected class Footer implements IEventHandler {
@Override
public void handleEvent(Event event) {
PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
PdfDocument pdf = docEvent.getDocument();
PdfPage page = docEvent.getPage();
Rectangle pageSize = page.getPageSize();
PdfCanvas pdfCanvas = new PdfCanvas(
page.getLastContentStream(), page.getResources(), pdf);
Canvas canvas = new Canvas(pdfCanvas, pdf, pageSize);
float x = (pageSize.getLeft() + pageSize.getRight()) / 2;
float y = pageSize.getBottom() + 15;
canvas.showTextAligned(
String.valueOf(pdf.getPageNumber(page)),
x, y, TextAlignment.CENTER);
}
}
Nous pouvons réutiliser l'exemple Text2Pdf.java (iText 7) avec seulement deux modifications
mineures:
Text2PdfPageEvents2.java
https://riptutorial.com/fr/home 21
Notez que ceci est très similaire à ce que nous avions auparavant, mais la bordure des titres a
maintenant des coins arrondis. Nous avons créé un objet ParagraphRenderer personnalisé pour y
https://riptutorial.com/fr/home 22
parvenir, et nous avons créé un objet TitleParagraph utilisant ce moteur de rendu:
@Override
protected IRenderer makeNewRenderer() {
return new ParagraphRenderer(this) {
@Override
public void drawBorder(DrawContext drawContext) {
Rectangle occupiedAreaBBox = getOccupiedAreaBBox();
float[] margins = getMargins();
Rectangle rectangle = applyMargins(occupiedAreaBBox, margins, false);
PdfCanvas canvas = drawContext.getCanvas();
canvas.roundRectangle(rectangle.getX() - 1, rectangle.getY() - 1,
rectangle.getWidth() + 2, rectangle.getHeight() + 2, 5).stroke();
}
};
}
}
Notre code pour convertir du texte en PDF est très simple maintenant. Il n'est plus nécessaire de
définir la police en gras pour les titres et il n'est plus nécessaire de définir une bordure:
Lire Evénements de page (iText 5) contre gestionnaires d'événements et rendus (iText 7) en ligne:
https://riptutorial.com/fr/itext/topic/5790/evenements-de-page--itext-5--contre-gestionnaires-d-
evenements-et-rendus--itext-7-
https://riptutorial.com/fr/home 23
Chapitre 5: Formulaires: iText 5 vs iText 7
Remarques
iText 5 est une bibliothèque qui a connu une croissance organique. De nombreux développeurs
ont contribué au code. Par exemple: un développeur a fourni du code pour créer des champs de
formulaire à partir de zéro, en utilisant des classes telles que TextField et PdfFormField ; un autre
développeur a fourni du code pour modifier les champs de formulaire existants, en utilisant la
classe AcroField et une série de méthodes setFieldProperty() .
Dans iText 5, les classes utilisées pour créer des champs de formulaire ne peuvent pas être
utilisées pour modifier les champs de formulaire, et inversement. Il n'y a aucune relation entre les
deux ensembles de classes. C'est déroutant pour de nombreux utilisateurs. Par exemple: certains
utilisateurs découvrent la classe TextField et supposent qu'ils peuvent utiliser cette classe pour
modifier les propriétés d'un champ de texte existant. Ce n'est pas le cas, ils doivent plutôt utiliser
la classe AcroFields .
Tout cela est corrigé dans iText 7. Nous avons créé un nouvel ensemble de classes telles que
PdfFormField et sa sous-classe PdfTextField qui peuvent être utilisées pour créer un nouveau
champ, ainsi que pour mettre à jour un champ de formulaire existant.
Les méthodes du champ de formulaire iText 7 peuvent être enchaînées pour rendre votre code
plus compact, et elles sont beaucoup plus intuitives que les méthodes correspondantes dans iText
5. Rendre les fonctionnalités du formulaire plus élégantes était l’une des principales raisons de
réécrire iText à partir de zéro.
Examples
FormCreation.java (iText 5)
Dans cet exemple iText 5, nous allons créer un champ de texte et l'ajouter à un PDF:
https://riptutorial.com/fr/home 24
public void manipulatePdf(String src, String dest) throws DocumentException, IOException {
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
TextField tf = new TextField(stamper.getWriter(),
new Rectangle(110, 780, 180, 806), "text");
tf.setBorderColor(BaseColor.BLUE);
tf.setBorderWidth(2);
tf.setTextColor(BaseColor.RED);
tf.setFontSize(12);
tf.setText("Text field");
PdfFormField field = tf.getTextField();
stamper.addAnnotation(field, 1);
stamper.close();
reader.close();
}
Source: developers.itextpdf.com
FormCreation.java (iText 7)
Dans cet exemple iText 7, nous allons créer un champ de texte et nous l'ajouterons à un PDF:
https://riptutorial.com/fr/home 25
public void manipulatePdf(String src, String dest) throws IOException {
PdfReader reader = new PdfReader(src);
PdfDocument pdf = new PdfDocument(reader, new PdfWriter(dest));
PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
PdfFormField tf = PdfTextFormField.createText(
pdf, new Rectangle(110, 780, 70, 26), "text", "Text Field")
.setBorderColor(Color.BLUE)
.setBorderWidth(2)
.setColor(Color.RED)
.setFontSize(12);
form.addField(tf);
pdf.close();
}
Source: developers.itextpdf.com
FormFilling.java (iText 5)
Dans cet exemple iText 5, nous allons modifier les propriétés et la valeur d'un champ de texte:
https://riptutorial.com/fr/home 26
public void manipulatePdf(String src, String dest) throws DocumentException, IOException {
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
AcroFields fields = stamper.getAcroFields();
fields.setFieldProperty("text", "textcolor", BaseColor.BLUE, null);
fields.setFieldProperty("text", "bordercolor", BaseColor.RED, null);
fields.setFieldProperty("text", "fontsize", 14, null);
fields.setField("text", "Field Text");
stamper.close();
reader.close();
}
Source: developers.itextpdf.com
FormFilling.java (iText 7)
Dans cet exemple iText 7, nous allons modifier les propriétés et la valeur d'un champ de texte:
https://riptutorial.com/fr/home 27
public void manipulatePdf(String src, String dest) throws IOException {
PdfReader reader = new PdfReader(src);
PdfDocument pdf = new PdfDocument(reader, new PdfWriter(dest));
PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
PdfFormField tf = form.getFormFields().get("text");
tf.setBorderColor(Color.RED)
.setColor(Color.BLUE)
.setFontSize(14)
.setValue("Field Text");
pdf.close();
}
Source: developers.itextpdf.com
https://riptutorial.com/fr/home 28
Chapitre 6: Polices: iText 5 contre iText 7
Remarques
Dans les premières versions d'iText, il n'y avait qu'une seule classe de Font : Font .
Avec cette police, vous pouvez créer un objet Font pour quatorze polices de cinq familles de
polices: Helvetica (normal, gras, oblique, gras-oblique), Times Roman (normal, gras, italique,
gras-italique), Courier (régulier, gras). , oblique, oblique-oblique), Symboles et Symboles Zapf.
La police par défaut était Helvetica; la taille de police par défaut 12.
iText a évolué et plus de polices ont été prises en charge. La classe BaseFont été utilisée pour
traiter ces polices en interne. Une classe BaseFont été créée comme ceci:
Le premier paramètre est le chemin vers un programme de police, par exemple un fichier TTF, le
deuxième paramètre est le codage, par exemple CP1251 pour les caractères cyrilliques, le
troisième paramètre indique si un sous-ensemble de la police doit être intégré.
La classe BaseFont doit être utilisée lorsque vous ajoutez du contenu au niveau le plus bas, par
exemple lors de la création d'objets de texte dans votre code à l'aide des beginText() ,
setFontAndSize() , setTextMatrix() , showText() et endText() . En règle générale, vous utiliserez
cette approche de bas niveau uniquement si vous êtes un spécialiste du PDF. Si vous ne
connaissez rien de la syntaxe PDF, vous ne devriez pas utiliser une telle séquence.
Vous pouvez également utiliser la classe BaseFont pour créer un objet Font :
Maintenant, nous pouvons utiliser la police russian pour créer un Paragraph contenant du texte
russe.
Il existe d'autres moyens dans iText 5 pour créer des objets Font , mais c'est la procédure la plus
courante. Les gens étaient parfois déroutés par la différence entre Font et BaseFont , et ils
https://riptutorial.com/fr/home 29
n'utilisaient pas toujours la bonne approche.
Nous avons rendu les choses plus uniformes. Il existe maintenant une seule classe PdfFont et
vous créez une police à l'aide de PdfFontFactory :
Vous n'avez plus besoin de créer différents objets de police si vous souhaitez passer à une autre
taille de police. Passer à une taille de police différente peut simplement être fait en utilisant la
méthode setFontSize() :
La police par défaut est toujours Helvetica et la taille de police par défaut est toujours 12, mais
vous pouvez maintenant définir une police (et une taille de police) pour le document:
document.setFont(font);
Dans ce cas, la font sera la police par défaut lors de l'ajout d'un bloc de construction (par
exemple, un Paragraph ) sans spécifier de police.
Lisez Introduction à la classe PdfFont qui est le chapitre 1 du tutoriel iText 7: Building Blocks .
Obtenez l'ebook gratuit!
Examples
HelloWorldInternational.java (iText 5)
Dans cet exemple iText 5, nous allons créer un exemple Hello World en différentes langues, en
utilisant différentes polices:
https://riptutorial.com/fr/home 30
public void createPdf(String dest)
throws DocumentException, IOException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
Font font = new Font(FontFamily.TIMES_ROMAN);
Font font14pt = new Font(FontFamily.TIMES_ROMAN, 14);
Font font10pt = new Font(FontFamily.TIMES_ROMAN, 10);
BaseFont bf_russian = BaseFont.createFont(
"resources/fonts/FreeSans.ttf",
"CP1251",
BaseFont.EMBEDDED);
Font russian = new Font(bf_russian, 12);
BaseFont bf_cjk = BaseFont.createFont(
"resources/fonts/NotoSansCJKsc-Regular.otf",
BaseFont.IDENTITY_H,
BaseFont.EMBEDDED);
Font cjk = new Font(bf_cjk, 12);
Paragraph p = new Paragraph("Hello World! ", font);
Chunk chunk = new Chunk("Hallo Wereld! ", font14pt);
p.add(chunk);
chunk = new Chunk("Bonjour le monde! ", font10pt);
chunk.setTextRise(4);
p.add(chunk);
chunk = new Chunk(
"\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u043b\u0442\u0435
\u043c\u0438\u0440! ",
russian);
p.add(chunk);
p.add(new Chunk("\u4f60\u597d\u4e16\u754c! ", cjk));
p.add(new Chunk("\uc5ec\ubcf4\uc138\uc694 \uc138\uacc4!", cjk));
document.add(p);
document.close();
}
Source: developers.itextpdf.com
HelloWorldInternational.java (iText 7)
Dans cet exemple iText 7, nous allons créer un exemple Hello World en différentes langues, en
utilisant différentes polices:
https://riptutorial.com/fr/home 31
public void createPdf(String dest) throws IOException {
PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
try (Document document = new Document(pdf)) {
PdfFont font = PdfFontFactory.createFont(FontConstants.TIMES_ROMAN);
PdfFont russian = PdfFontFactory.createFont(
"src/main/resources/fonts/FreeSans.ttf",
"CP1251", true);
PdfFont cjk = PdfFontFactory.createFont(
"src/main/resources/fonts/NotoSansCJKsc-Regular.otf",
PdfEncodings.IDENTITY_H, true);
document.setFont(font);
Paragraph p = new Paragraph("Hello World! ")
.add(new Text("Hallo Wereld! ").setFontSize(14))
.add(new Text("Bonjour le monde! ").setFontSize(10).setTextRise(4))
.add(
new
Text("\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u043b\u0442\u0435
\u043c\u0438\u0440! ")
.setFont(russian))
.add(new Text("\u4f60\u597d\u4e16\u754c! ")
.setFont(cjk))
.add(new Text("\uc5ec\ubcf4\uc138\uc694 \uc138\uacc4!")
.setFont(cjk));
document.add(p);
}
}
https://riptutorial.com/fr/home 32
Chapitre 7: Questions et réponses sur les
versions
Introduction
Quelques questions fréquemment posées sur les numéros de version dans iText.
Remarques
Pourquoi les numéros de version passent-ils de 2 à 5 et de 5 à 7? Il existe plusieurs raisons
pour sauter les numéros de version. En 2009, le numéro de version de iText (Java) et iTextSharp
(C #) n'était pas synchronisé. La version Java était à la version 2.1.7; la version C # était à la
version 4.1.6. Il a été décidé de passer à Java 5 pour la version Java et d’harmoniser les numéros
de version d’iText et d’iTextSharp.
Quel est le problème avec iText 4? Les tiers ont publié les versions iText 4.2.z, mais ce ne sont
pas des versions officielles. Ils ne sont supportés par personne et ne devraient pas être utilisés
car personne ne sait vraiment ce qu'il y a à l'intérieur.
IText 7 est-il rétrocompatible? iText 7 est une toute nouvelle version d'iText, écrite de toutes
pièces par l'équipe iText. La compatibilité ascendante est rompue au profit d'une interface plus
intuitive. La version Java d’iText est passée de Java 5 à Java 7, ce qui a été l’une des raisons
pour passer de iText 5 à iText 7.
Examples
itext 2 vs iText 5 vs iText 7
iText 5:
import com.itextpdf.text. *;
iText 7:
import com.itextpdf.kernel. *;
https://riptutorial.com/fr/home 33
import com.itextpdf.layout. *;
...
https://riptutorial.com/fr/home 34
Chapitre 8: Styles: iText 5 versus iText 7
Remarques
Créer un document dans lequel vous devez basculer entre les styles a souvent tendance à être
fastidieux dans iText 5. Vous devez créer beaucoup d’objets Chunk et vous devez toujours faire un
compromis entre l’application des styles directement sur chaque nouveau Chunk et la création une
méthode d'assistance qui crée le Chunk pour vous.
Il est maintenant possible de chaîner les méthodes. Les setFont() , setFontSize() , addStyle() et
d'autres renvoient toutes l'objet sur lequel elles sont appelées. L'ajout d'un Paragraph impliquant
différents styles peut désormais être effectué sur une seule ligne:
document.add(
new Paragraph()
.add("In this example, named ")
.add(new Text("HelloWorldStyles").addStyle(style))
.add(", we experiment with some text in ")
.add(new Text("code style").addStyle(style))
.add("."));
À l'aide de l'objet Style , vous pouvez désormais également appliquer différentes propriétés
(police, couleur de police, couleur d'arrière-plan, taille de police, addStyle() ) en une fois avec la
méthode addStyle() .
Lisez Introduction à la classe PdfFont qui est le chapitre 1 du tutoriel iText 7: Building Blocks .
Obtenez l'ebook gratuit!
Examples
HelloWorldStyles.java (iText 5)
Dans cet exemple iText 5, nous devons changer de style dans le même document:
https://riptutorial.com/fr/home 35
La meilleure façon de le faire dans iText 5 est de créer une méthode pratique qui crée un Chunk
dans le style à utiliser fréquemment; voir la méthode createBgChunk() :
Nous pouvons maintenant utiliser cette méthode dans le code qui crée le PDF:
Source: developers.itextpdf.com
HelloWorldStyles.java (iText 7)
Dans cet exemple iText 7, nous devons changer de style dans le même document:
https://riptutorial.com/fr/home 36
Le meilleur moyen d'y parvenir dans iText 7 est de créer un objet Style et d'appliquer ce Style à un
objet Text :
https://riptutorial.com/fr/home 37
Chapitre 9: Tableaux: iText 5 versus iText 7
Remarques
Les noms de classe iText 5 PdfPTable et PdfPCell ont été choisis car nous avions déjà des classes
nommées Table et Cell pour créer des objets de table et de cellule au niveau de programmation le
plus élevé. Il y avait aussi une classe nommée PdfTable à utiliser par iText en interne. Ces classes
avaient beaucoup de défauts et elles étaient déconseillées en faveur de PdfPTable et PdfPCell . Ils
ont été enlevés il y a longtemps.
Au fil des ans, PdfPTable et PdfPCell également été critiqués par les utilisateurs. Par exemple: les
utilisateurs ne comprenaient pas la différence entre le mode texte et le mode composite .
Le mode texte est utilisé lorsque vous créez un PdfPCell comme ceci:
Dans ce cas, vous définissez des propriétés comme l'alignement horizontal au niveau de PdfPCell
.
Dans ce cas, certaines propriétés définies au niveau de PdfPCell (comme l'alignement horizontal)
sont ignorées. L'alignement horizontal doit être défini au niveau des éléments ajoutés à la cellule.
Par exemple: si vous souhaitez créer une cellule dans laquelle différents paragraphes doivent
avoir un alignement horizontal différent, vous passerez en mode composite.
Si vous regardez la capture d'écran de la table créée avec l'exemple iText 5, vous remarquerez
que les cellules avec le contenu Cell 1.1 (ajouté en mode texte) et Cell 1.2 (ajouté en mode
composite) sont alignées différemment.
En réponse à la critique sur l'alignement impair, nous avons introduit des méthodes pour utiliser
les informations sur les ascendeurs et les descendants. Nous utilisons ces méthodes pour les
cellules contenant le contenu Cell 2.1 (ajouté en mode texte) et Cell 2.2 (ajouté en mode
composite). Nous avons également introduit un remplissage de 5 pour ces cellules.
Depuis que nous avons créé iText 7 à partir de rien, nous n'avions aucune classe existante avec
des noms que nous ne pouvions pas réutiliser. Nous avons introduit une nouvelle Table et une
nouvelle classe de Cell .
https://riptutorial.com/fr/home 38
Il n'y a plus de mode texte et plus de mode composite. Une Cell est créée soit sans paramètres,
soit avec des paramètres qui définissent les lignes et le colspan. Tout le contenu est ajouté de la
même manière: en utilisant la méthode add() .
Comme vous pouvez le voir sur les captures d'écran, les cellules sont très bien rendues. Nous
n'avons pas eu à utiliser de méthodes pour définir l'ascendeur ou le descendeur. Le
comportement par défaut est beaucoup plus proche du comportement attendu par un
développeur.
Vous voulez en savoir plus sur les tableaux et les cellules dans iText 7?
Lire Ajout d'objets AbstractElement (partie 2), qui est le chapitre 5 du didacticiel iText 7: Building
Blocks . Obtenez l'ebook gratuit!
Examples
HelloWorldTable.java (iText 5)
Dans cet exemple, nous allons créer le tableau suivant en utilisant iText 5:
https://riptutorial.com/fr/home 39
PdfPCell cell = new PdfPCell(new Phrase("Cell with colspan 3"));
cell.setColspan(3);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
cell = new PdfPCell(new Phrase("Cell with rowspan 2"));
cell.setRowspan(2);
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
table.addCell(cell);
table.addCell("Cell 1.1");
cell = new PdfPCell();
cell.addElement(new Phrase("Cell 1.2"));
table.addCell(cell);
cell = new PdfPCell(new Phrase("Cell 2.1"));
cell.setPadding(5);
cell.setUseAscender(true);
cell.setUseDescender(true);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
cell = new PdfPCell();
cell.setPadding(5);
cell.setUseAscender(true);
cell.setUseDescender(true);
Paragraph p = new Paragraph("Cell 2.2");
p.setAlignment(Element.ALIGN_CENTER);
cell.addElement(p);
table.addCell(cell);
document.add(table);
document.close();
}
Source: developers.itextpdf.com
HelloWorldTable.java (iText 7)
Dans cet exemple, nous allons créer le tableau suivant en utilisant iText 7:
https://riptutorial.com/fr/home 40
Nous avons besoin de la classe Table et Cell pour y parvenir:
https://riptutorial.com/fr/home 41
Chapitre 10: Texte en PDF: iText 5 contre
iText 7
Remarques
Le code pour convertir un fichier texte brut en un document PDF est assez simple, que vous
utilisiez iText 5 ou iText 7. Dans iText 7, vous avez l’avantage de pouvoir définir l’alignement au
niveau du document. Dans iText 5, vous devez définir l'alignement pour chaque objet Paragraph
distinct.
Pour comprendre la différence réelle entre iText 5 et iText 7 dans cette paire d’exemples, nous
devons examiner le PDF résultant. Dans iText 5, nous nous retrouvons avec 35 pages de texte.
Dans iText 7, nous avons le même texte distribué sur 38 pages.
Le texte est plus facile à lire lorsqu'il est créé par iText 7 car différents paramètres par défaut sont
utilisés lors de la création de la mise en page. Vous pourriez obtenir le même résultat avec le code
iText 5, mais vous devrez alors modifier certaines valeurs en fonction de l'espacement.
Dans iText 7, les valeurs par défaut ont été choisies en fonction de 16 années d'expérience avec
iText. De cette façon, vous obtenez un meilleur résultat avec moins de code.
Lisez Travailler avec le RootElement qui est le chapitre 5 du tutoriel iText 7: Building Blocks .
Obtenez l'ebook gratuit!
Examples
Text2Pdf.java (iText 5)
https://riptutorial.com/fr/home 42
En utilisant iText 5, nous utiliserions le code suivant:
https://riptutorial.com/fr/home 43
throws DocumentException, IOException {
Document document = new Document();
PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();
BufferedReader br = new BufferedReader(new FileReader(TEXT));
String line;
Paragraph p;
Font normal = new Font(FontFamily.TIMES_ROMAN, 12);
Font bold = new Font(FontFamily.TIMES_ROMAN, 12, Font.BOLD);
boolean title = true;
while ((line = br.readLine()) != null) {
p = new Paragraph(line, title ? bold : normal);
p.setAlignment(Element.ALIGN_JUSTIFIED);
title = line.isEmpty();
document.add(p);
}
document.close();
}
Source: developers.itextpdf.com
Text2Pdf.java (iText 7)
https://riptutorial.com/fr/home 44
En utilisant iText 7, nous aurions besoin du code suivant:
https://riptutorial.com/fr/home 45
public void createPdf(String dest) throws IOException {
PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
Document document = new Document(pdf)
.setTextAlignment(TextAlignment.JUSTIFIED);
BufferedReader br = new BufferedReader(new FileReader(TEXT));
String line;
PdfFont normal = PdfFontFactory.createFont(FontConstants.TIMES_ROMAN);
PdfFont bold = PdfFontFactory.createFont(FontConstants.TIMES_BOLD);
boolean title = true;
while ((line = br.readLine()) != null) {
document.add(new Paragraph(line).setFont(title ? bold : normal));
title = line.isEmpty();
}
document.close();
}
https://riptutorial.com/fr/home 46
Crédits
S.
Chapitres Contributeurs
No
1 Démarrer avec itext Alexis Pigeon, Bruno Lowagie, Community, Egl, mkl
Colonnes: iText 5
2 Bruno Lowagie, Egl
versus iText 7
Evénements de page
(iText 5) contre
4 gestionnaires Bruno Lowagie, Egl
d'événements et
rendus (iText 7)
Formulaires: iText 5
5 Bruno Lowagie, Egl
vs iText 7
Polices: iText 5
6 Bruno Lowagie, Egl
contre iText 7
Questions et
7 réponses sur les Bruno Lowagie
versions
Styles: iText 5
8 Bruno Lowagie, Egl
versus iText 7
Tableaux: iText 5
9 Bruno Lowagie, Egl
versus iText 7
https://riptutorial.com/fr/home 47