Bonjour à tous,
Dans le cadre d'un stage, cela fait maintenant plus d'un mois que je développe un module statistiques en Java, en utilisant Birt pour générer des fichiers pdf contenant des graphes.
J'ai donc largement eu le temps d'éplucher ce forum (merci !), ainsi que Birt-Exchange community, et beaucoup de blogs ou autres joyeusetés sur Google.
Problème :
Je n'arrive toujours pas à implémenter un simple saut de page dans ma Master Page (grid).
Je me prends un NullPointer exception lorsque je fais : grid.getStyle().setPageBreakAfter("PAGE_BREAK_ALWAYS");
J'ai aussi tenté le PageBreakInside et Before, avec tous les arguments possibles. J'ai tenté le PageBreak sur une cellule, sur une row. Bref, j'ai essayé beaucoup de choses.
Etat actuel :
J'ai un rapport contenant une Master Page avec une grid, un header et un footer. Dans les cellules de ma grid, j'ai des objets TextItemHandle et ImageHandle.
Les images et le texte s'ajoutent dynamiquement, en fonction des paramètres fournis par mon IHM. Donc si j'en ai envie, je suis capable de générer un rapport contenant 50 graphiques + 50 zones de texte.
Pour le moment, lorsque j'ajoute des graphes, ceux-ci se mettent à l'échelle automatiquement. Donc si je mets 2 graphes, je les vois correctement. Mais si j'en mets 50, je verrai 50 graphes microscopiques tenant sur une seule page A4 pdf.
Objectif :
J'aimerais effectuer un saut de page automatique tous les deux graphes, à l'intérieur de ma grid.
C'est-à-dire que chaque page pdf doit contenir 2 graphes maximum + 1 footer + 1 header.
Exemple : si j'ajoute 40 graphiques, je dois avoir 20 pages contenant chacune 2 graphiques (+ 1 page contenant le titre).
Mon code :
Voici à quoi ressemble mon code qui génère mon objet ReportDesignHandle. Le PageBreak se trouve tout à la fin.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
115
116
117
118
119
120 public ReportDesignHandle createReportDesignHandle() { // Configure the Engine and start the Platform DesignConfig config = new DesignConfig(); IDesignEngine engine = null; Platform.startup(config); IDesignEngineFactory factory = (IDesignEngineFactory) Platform.createFactoryObject(IDesignEngineFactory.EXTENSION_DESIGN_ENGINE_FACTORY); engine = factory.createDesignEngine(config); SessionHandle session = engine.newSessionHandle(ULocale.ENGLISH); // Create a new report design. ReportDesignHandle design = session.createDesign(); // The element factory creates instances of the various BIRT elements. ElementFactory efactory = design.getElementFactory(); // Create a simple master page that describes how the report will appear when printed. // Note: The report will fail to load in the BIRT designer unless you create a master page. SimpleMasterPageHandle element = efactory.newSimpleMasterPage("Page Master"); /* +-------------------------------------------------+ */ /* | -- HEADER/FOOTER -- | */ /* +-------------------------------------------------+ */ // ---------------------------- Header (Grid) ---------------------------- // GridHandle headerGrid = efactory.newGridItem("HeaderGrid", 2 /* cols */, 1 /* row */); headerGrid.setWidth("100%"); // HEADER CELL n°1 // RowHandle headerRow = (RowHandle) headerGrid.getRows().get(0); CellHandle headerCellZero = (CellHandle) headerRow.getCells().get(0); ImageHandle imageHeader = efactory.newImage(null); imageHeader.setFile("\"" + InputPath + "image_header.png" + "\""); imageHeader.setWidth("20%"); imageHeader.setHeight("20%"); headerCellZero.getContent().add(imageHeader); // HEADER CELL n°2 // headerRow = (RowHandle) headerGrid.getRows().get(0); CellHandle headerCellOne = (CellHandle) headerRow.getCells().get(1); TextItemHandle textHeader = efactory.newTextItem(null); textHeader.setContentType(DesignChoiceConstants.TEXT_CONTENT_TYPE_HTML); textHeader.setContent("Header text here"); headerCellOne.getContent().add(textHeader); // ---------------------------- Footer (Text) ---------------------------- // DesignElementHandle footerText = efactory.newTextItem("footer"); footerText.setProperty("contentType", "html"); String footer = "<p align="+"center"+">" + "Page "+currentPage+" of "+totalPage+ "</p>"; footerText.setStringProperty("content", footer); // ------------------------ Adding Footer/Header ------------------------ // element.getPageFooter().add(footerText); element.getPageHeader().add(headerGrid); design.getMasterPages().add(element); /* +-------------------------------------------------+ */ /* | -- BODY -- | */ /* +-------------------------------------------------+ */ // Create a grid and add it to the "body" slot of the report design. GridHandle grid = efactory.newGridItem("MainGrid", 1 /* cols */, (1 + 2 * this.charts.size()) /* row */); grid.setWidth("100%"); design.getBody().add(grid); /* +-------------------------------------------------+ */ /* | -- ROW 0 -- | */ /* +-------------------------------------------------+ */ RowHandle row = (RowHandle) grid.getRows().get(0); CellHandle cell = (CellHandle) row.getCells().get(0); // Title of Document TextItemHandle textTitle = efactory.newTextItem(null); textTitle.setContentType(DesignChoiceConstants.TEXT_CONTENT_TYPE_HTML); textTitle.setContent("<p align="+"center"+" style="+"font-size:25px"+">"+"<b>"+ titleOfDocument + "</b><br></p>"); textTitle.setWidth("100%"); cell.getContent().add(textTitle); /* +-------------------------------------------------+ */ /* | -- from ROW 1 to ROW_final -- | */ /* +-------------------------------------------------+ */ for (int i = 0; i < this.charts.size(); i++) { // Title of Image row = (RowHandle) grid.getRows().get(1 + 2 * i); CellHandle cellImage = (CellHandle) row.getCells().get(0); TextItemHandle textImage = efactory.newTextItem(null); textImage.setContentType(DesignChoiceConstants.TEXT_CONTENT_TYPE_HTML); textImage.setContent("<p align=" + "left" + ">" + titleOfImage(i) + "</p>"); textImage.setWidth("100%"); cellImage.getContent().add(textImage); // Image row = (RowHandle) grid.getRows().get(2 + 2 * i); cellImage = (CellHandle) row.getCells().get(0); ImageHandle image = efactory.newImage(null); image.setFile("\"" + InputPath + "image_" + i + ".png" + "\""); image.setWidth("50%"); image.setHeight("50%"); cellImage.getContent().add(image); // ---------------------- Page Break ----------------------------- // if (i%2 == 0) grid.getStyle().setPageBreakAfter("PAGE_BREAK_ALWAYS"); } return design; }
Partager