Accès rapide :
La vidéo
La librairie IText
Le code
Cette vidéo vous apprend à coder une servlet d'export de données au format PDF. L'exemple proposé permet de générer une facture avec les données d'une commande. La librairie utilisée pour la production du PDF est IText.
La librairie IText permet de générer des fichiers au format PDF à partir d'une application Java (ou .NET). Cette librairie et ses documentations sont disponibles à partir de l'adresse suivante : itextpdf.com.
Une possibilité très intéressante qui est utilisée dans l'exemple de code proposé, consiste à pouvoir ouvrir un document PDF initial, servant de matrice, puis de pouvoir rajouter par dessus les informations manquantes. Cela vous évite de devoir produire un code Java trop complexe : les éléments statique (logos, textes, ...) ne seront pas programmés car déjà présent dans le PDF initial. Cela peut, par exemple, s'avérer très pratiques pour produire des factures clientes. C'est ce scénario qui est proposé dans la vidéo ainsi que dans l'exemple ci-dessous.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
package fr.koor.webstore.servlet; import java.io.IOException; import java.text.NumberFormat; import java.util.Locale; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.itextpdf.io.font.FontProgram; import com.itextpdf.io.font.FontProgramFactory; import com.itextpdf.kernel.font.PdfFont; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfPage; import com.itextpdf.kernel.pdf.PdfReader; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.canvas.PdfCanvas; import fr.koor.webstore.business.Article; import fr.koor.webstore.business.ShoppingCartLine; @WebServlet( "/pdfexport" ) public class PDFExport extends HttpServlet { private static final long serialVersionUID = 7609134248482865644L; @Override protected void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { int idCommand = 0; try { idCommand = Integer.parseInt( request.getParameter( "idCommand" ) ); } catch (Exception exception ) { // Nothing to do } ShoppingCartLine [] lines = { new ShoppingCartLine( new Article( 1, "Stylo bille", "Bic", 0.2 ), 5 ), new ShoppingCartLine( new Article( 18, "Bonbon", "Haribo", 0.1 ), 50 ), }; String masterPath = request.getServletContext().getRealPath( "/WEB-INF/FacMaster.pdf" ); response.setContentType( "application/pdf" ); try ( PdfReader reader = new PdfReader( masterPath ); PdfWriter writer = new PdfWriter( response.getOutputStream() ); PdfDocument document = new PdfDocument( reader, writer ) ) { PdfPage page = document.getPage( 1 ); PdfCanvas canvas = new PdfCanvas( page ); FontProgram fontProgram = FontProgramFactory.createFont(); PdfFont font = PdfFontFactory.createFont( fontProgram, "utf-8", true ); canvas.setFontAndSize( font, 12 ); canvas.beginText(); canvas.setTextMatrix( 0, 0 ); canvas.showText( "Origine" ); canvas.setTextMatrix( 470, 760 ); canvas.showText( "" + idCommand ); int top = 500; double totalPrice = 0; NumberFormat formatter = NumberFormat.getNumberInstance( new Locale( "fr", "FR" ) ); for (ShoppingCartLine line : lines) { Article article = line.getArticle(); canvas.setTextMatrix( 116, top ); canvas.showText( "" + article.getIdArticle() ); canvas.setTextMatrix( 200, top ); canvas.showText( article.getDescription() ); canvas.setTextMatrix( 270, top ); canvas.showText( article.getBrand() ); canvas.setTextMatrix( 341, top ); canvas.showText( formatter.format( article.getUnitaryPrice() ) ); canvas.setTextMatrix( 412, top ); canvas.showText( "" + line.getQuantity() ); double totalLine = article.getUnitaryPrice() * line.getQuantity(); totalPrice += totalLine; canvas.setTextMatrix( 482, top ); canvas.showText( formatter.format( totalLine ) ); top -= 20; } canvas.setTextMatrix( 482, 240 ); canvas.showText( formatter.format( totalPrice ) ); canvas.setTextMatrix( 482, 216 ); canvas.showText( formatter.format( totalPrice * 0.2 ) ); canvas.setTextMatrix( 482, 192 ); canvas.showText( formatter.format( totalPrice * 1.2 ) ); canvas.endText(); } } } |
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :