Salut !
Personnellement j'ai résolu le problème principal de lenteur qui est en effet dû au démarrage du serveur. Il faudrait que tu crées un singleton qui isole le moteur (engine) :
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
| import java.util.ArrayList;
import java.util.Locale;
import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.api.EngineException;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
import org.eclipse.birt.report.engine.api.RenderOptionBase;
import org.eclipse.birt.report.engine.api.ReportEngine;
public class EditionPDF {
private static EditionPDF m_Instance = null;
private ReportEngine engine;
private String realPath;
private RenderOptionBase option;
private String etat;
private String chemin;
private ArrayList parametres;
private EditionPDF()
{
EngineConfig config = new EngineConfig();
realPath = "C:/Jakarta/webapps/TestBIRT/";
config.setResourcePath(realPath+"/WEB-INF/classes/ressources/");
config.setEngineHome(realPath+"/WEB-INF/ReportEngine"); //endroit où se trouvent les librairies du Runtime
engine = new ReportEngine(config); //engine permet de connaitre et de modifie le fichier .rptdesign
option = new RenderOptionBase();
option.setOutputFormat(RenderOptionBase.OUTPUT_FORMAT_PDF); //Format du fichier de sortie
}
public static EditionPDF getInstance()
{
if (m_Instance == null)
m_Instance = new EditionPDF();
return m_Instance;
}
public void init(String etat, String chemin, ArrayList parametres)
{
this.etat = etat;
this.chemin = chemin;
this.parametres = parametres;
}
public void run()
{
try
{
IReportRunnable design = engine.openReportDesign(realPath+"/WEB-INF/etats/"+etat+".rptdesign");
IRunAndRenderTask task = engine.createRunAndRenderTask(design); //Crée une tâche afin d'éxécuter le rapport
task.setParameterValue("chemin",realPath);
for (int i=0;i<parametres.size();i++)
{
ParametreEditionPDF param = (ParametreEditionPDF)parametres.get(i);
task.setParameterValue(param.getCle(),param.getValeur());
}
task.setParameterValue("realPath", realPath);
/* Création PDF */
option.setOutputFileName(chemin); //Nom du fichier de sortie
task.setRenderOption(option); //Chargement du fichier
/* Fin création PDF */
task.run(); //Création du fichier
}
catch (EngineException e)
{
System.out.println(e.getMessage());
}
}
public void destructeur()
{
engine.destroy();
}
} |
Sachant que ParametreEdition ressemble à un Bean :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public class ParametreEditionPDF {
private String cle;
private Object valeur;
public ParametreEditionPDF(String cle, Object valeur)
{
this.cle = cle;
this.valeur = valeur;
}
public String getCle() {
return cle;
}
public Object getValeur() {
return valeur;
}
} |
La première classe te permets de créer le moteur que tu réutiliseras et de l'initialiser ainsi que de le lancer. La deuxième classe te permet de passer des paramètres à ton rptDesign de façon propre.
Je te donne un exemple d'utilisation :
1 2 3 4 5
| List parametres = new ArrayList();
parametres.add(new ParametreEditionPDF("personnes",lesPersonnes);
EditionPDF edition = EditionPDF.getInstance();
edition.init("MonRapport", "MonRapport.pdf", (ArrayList)parametres);
edition.run(); |
Ce code crée la liste des paramètres à passer au rptdesign puis récupère l'instance en cours de l'engine. Si l'instance n'est pas lancée, il le fait (donc premier lancement plus long). Ensuite, il initialise les options principales :
- Nom du rptdesign
- Nom du fichier de sortie
- Liste des paramètres
Enfin, l'édition est lancée.
Partager