IText, Fying-Saucer sont deux libraires de génération et de manipulation des documents PDF.
Ce billet aborde les principales fonctionnalités de IText et introduit la libraie Fying-Saucer pour étendre et simplifier la transformation des templates Html/Xml en PDF.
IText
est une libraire open Source de génération et de manipulation
des documents PDF. Elle permet de transformer
les templates HTML/XML en document PDF.
IText est disponible pour
java , .net et Android.
Dans ce blog je vais présenter les principales fonctionnalités
d'IText , je mettrait l'accent sur la transformation des templates Html/Xml vers PDF et le problème de l’arrière plan image. et à
la fin j'introduis la librairie Flying-Saucer qui résout ce
problème.
Voici la dépendance Maven pour IText :
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.0.6</version>
</dependency>
1 - Les Principales Fonctionnalités d'IText
1.1 Création
des Documents Pdf (PdfWriter)
La création d'un nouveau document avec IText se fait en
cinq étapes
-
Création de l'objet Document
-
Récupérer l'instance de
l'objet PdfWriter -
Ouvrir le Document
-
Ajout du contenu
-
Fermeture du Document
Exemple1 :
package import import import import import import public {
public {
final
//
final
//
PdfWriter.getInstance(document,
// document.open();
//
document.add(new
// document.close(); } } |
Un autre exemple plus riche qui introduit les objets suivants:
Paragraph, Chapter, Section, PdfPTable,
PdfPCell
Exemple2 :
package import import import import import import import import import import import import import public {
public {
final
final
//
final
//
PdfWriter.getInstance(document,new
// document.open(); // Création des metas data du documents
document.addTitle("Exemple2
document.addSubject("
document.addKeywords("Java, document.addAuthor(System.getProperty("user.name")); document.addCreator(System.getProperty("user.name")); // Création de la première page
final
fistPage.add(new
fistPage.add(new
fistPage.add(new
fistPage.add(new
fistPage.add(new
fistPage.add(new
fistPage.add(new
fistPage.add(new
fistPage.add(new document.add(fistPage); //---------- Création de la deuxième page document.newPage(); // création de la première chapitre
final
//
Paragraph subPara = new
Section Section =
Section.add(new
//
subPara = new
Section =
//
Section.add(new
Section.add(new
Section.add(new
// ajout document.add(chapitre1); //---------- Création de la deuxième page document.newPage(); // création de la première chapitre
final // création de la section 1
subPara = new
Section = // Création d'une PdfPTable avec 3 colonnes
final // Création d'une PdfPCell avec un paragraphe
final
// cell.setColspan(3);
// table.addCell(cell);
// table.addCell("1.1"); table.addCell("2.1"); table.addCell("3.1"); table.addCell("1.2"); table.addCell("2.2"); table.addCell("3.2");
//
// table.addCell("4.1"); table.addCell("4.2");
// table.setSpacingBefore(25f); table.setSpacingAfter(25f); Section.add(table);
//
final
list.add(new
list.add(new
list.add(new Section.add(list); document.add(chapitre2);
// document.close(); } } |
1.2
Manipulation des Documents Pdf Existants (PdfReader)
IText permet la manipulation des fichiers PDF existants en
offrant plusieurs objets tel que :
PdfReader:
Lecture de fichier PDF.
PdfImportedPage:
Importation
des pages PDF.
PdfCopy:
Copie des pages PDF.
PdfStamper:
Modification de
fichier PDF.
Exemple3:
package import import import import import import public { /**
* Cette exemple montre * vers au un autre. * */
public {
final
final
//
final
// reader.selectPages("2-3");
final
//
final
final document.open();
for
copy.addPage(copy.getImportedPage(reader, } document.close(); } } |
Exemple
4:
package import import import import import import import import public { /**
* Cet Exemple montre comment
* mettre une image comme
* ajout du contenu à une * * */
public { try {
final
final
new
final
for(int {
final
image.setAbsolutePosition(100f,
// content_under.addImage(image); }
//
final
//
final
content_over.setFontAndSize(bf, content_over.beginText();
content_over.showTextAligned(PdfContentByte.ALIGN_CENTER, content_over.endText(); pdfStamper.close();
} catch e.printStackTrace();
} catch e.printStackTrace(); } } } |
1.3
Conversion du XML / HTML en PDF (HTMLWorker, XMLWorker)
IText offre une fonctionnalité très utile qui permet de
convertir des templates HTML, XHTML ou XML en PDF. Pour cela on a
deux objets sont principalement utilisés :
- HTMLWorker:
Convertit les templates HTML en PDF. Cette conversion se fait malgré que le
fichier d'origine n'est pas bien formé ( manque des balises
fermantes …).
- XMLWorker:
Convertit les templates XHTML/XML en PDF. Contrairement à l'objet précédent
, la conversion ne s'effectue pas si la template n'est bien formées.
Exemple 5 :
package import import import import import import import import public { /**
* Dans cet exemple on va
* on va essayer de mettre une */
public {
final
final
final
"<div
//
final myPdf.open();
//
final
//
htmlWorker.parse(new myPdf.close(); pdfWriter.close(); } } |
Cet exemple montre que
HtmlWorker ne tiens pas compte de l'attribut background=image.jpg.
2 - Problématique
Comme le montre l'exemple
précédent Itext ne couvre pas tous les éléments de HTML
Ce qui veut dire qu'on ne peut
pas convertir n'importe quel template HTML vers PDF en utilisant
Itext.
Dans notre cas si on veut
convertir un document HTML qui a une image comme arrière plan alors
on a deux solutions :
- Soit via IText en utilisant
l'objet HtmlWorker et PdfStamper :
L'exemple 4 montre comment
mettre une image comme arrière plan en utilisant PdfStamper
==> Solution compliqué et
spécifique à ce cas précis,
-
Soit en utilisant Flying
saucer.
3 - Flying-Saucer
Flying
Saucer est une librairie java Open Source développée par la
communauté java et .net
Il
prend en entrée un flux XML ou XHTM, lui applique le style CSS 2.1 et
rend :
-
un PDF (via ITEX)
-
GUI interfaces (via Swing Jpanel)
-
Images
Flying
Saucer se base sur Itext pour générer les Pdfs, et accepte plus
d’éléments xhtml/xml/CSS que Itext (background-image).
Les
principales objets de Flying Saucer:
XHTMLPanel :
Convertit les templates XML/HTML vers GUI Swing
ImageRenderer :
Convertit les templates XML/HTML vers une Image
ItextRenderer :
Convertit les templates XML/HTML vers Pdf
Dépendance
Maven :
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-core</artifactId>
<version>9.0.1</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf</artifactId>
<version>9.0.2</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-itext5</artifactId>
<version>9.0.2</version>
</dependency>
Exemple 6:
package import import import import public { /**
* Utilisation de
* pour convertir du * Résout problème de bacground image. */
public {
final
final
"<style> "background-image:url(./src/test/resources/PDF/image.jpg);"+
"background-repeat: "--></style>"+
"<h1>Exmeple
"<body
"<div "</body></html>"; // création de l'objet ITextRenderer
final
// indiquer au render que le document se basera sur la chaine de renderer.setDocumentFromString(htmlString); renderer.layout(); // création du flux pdf renderer.createPDF(baosPDF); baosPDF.close(); } } |
Moi qui suit un peu noobs ce genre de tutoriel n’est pas du luxe, allez (grattement de tête) j’essaye de comprendre.
Merci , vous m’avez bien aidé