Une multitude de produit existe pour générer des rapports dans différents formats. Jaspert Report, iText. Certain sont plus bas niveau tel que PDFbox. Le moteur de template Thymeleaf permet de générer des pages web. Ensuite il est possible d'utiliser une librarie tierce tel que Open Html To pdf pour générer un pdf.
C'est la manière la plus simple et rapide que j'ai trouvé pour générer un pdf.
Spring boot sera utilisé, par défaut lorsqu'il est utilisé avec Thymeleaf, une configuration est généré afin de pouvoir généré des pages web.
Une autre configuration doit être créé pour être indépendant de celle-ci.
@Component
public class PdfGeneratorUtil<T> {
@Autowired
private TemplateEngine templateEngine;
public byte[] process(String templateName, String templateExtension, List<T> listT, String contextVariableName) throws Exception {
Context ctx = new Context();
ctx.setVariable(contextVariableName, listT);
ByteArrayOutputStream output = new ByteArrayOutputStream();
String processedHtml = templateEngine.process("fragments/html-reports/" + templateName + "." + templateExtension, ctx);
PdfRendererBuilder builder = new PdfRendererBuilder();
builder.useFastMode();
builder.withHtmlContent(processedHtml, "");
builder.toStream(output);
builder.run();
return output.toByteArray();
}
}
Au niveau du contrôleur
public ResponseEntity<byte[]> getPdfReport(Model model) throws Exception {
List<User> users = new ArrayList<>();
users.add(new User("Yvan", "Dubois"));
users.add(new User("Yvon", "Couler"));
users.add(new User("Ytord", "Lamope"));
byte[] content = pdfGeneratorUtil.process("usersReport", "html", users, "users");
return preparePdfReport(content);
}
Cette méthode permet de télécharger le pdf généré.
private ResponseEntity<byte[]> preparePdfReport(byte[] content) throws IOException {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType("application/pdf"));
String fileName = "report.pdf";
headers.add("Content-Disposition", "inline;filename=" + fileName);
headers.setCacheControl("no-cache, must-revalidate, post-check=0, pre-check=0");
ResponseEntity<byte[]> response = new ResponseEntity<>(content, headers, HttpStatus.OK);
return response;
}
Cette portion de code permet d'assigner une liste d'objets à une variable dans un template Thymeleaf. La classe PdfRendererBuilder prendra cette page et génèrera un pdf.
La mise en page peut être définie dans le template Thymeleaf dans la section css.
@page
{
size: letter portrait;
margin-left: 10px;
margin-right:15px;
}
.new-page{
page-break-after:always;
}
Avec des possibilités de condition dans Thymeleaf et le css, il est aisé d'arriver d'allure professionel.
Blog sur la conception, développement et le génie logiciel. Divers langages et systèmes d'exploitations sont traités.
Inscription à :
Commentaires (Atom)
Refonte ou refactoring
Refonte vs Refactoring : Quand réécrire, quand faire du refactoring ? Face à un code legacy, la tentation de tout réécrire est forte. Pourt...
-
Logitech Brio 500 Vous avez une caméra logitech Brio 500 et vous trouvez que vous êtes éloignez ans l'image dans les logitiels de messa...
-
Toshiba AC100 est un smartbook. Toshiba est la seule grosse entreprise qui a commercialisé un smartbook, malgré que plusieurs autres en aie...
-
Thymeleaf est un moteur de template serveur régulièrement utilisé le monde Java, principalement avec le framework Spring. Dans cet article,...