alors, via mon appli web, je génère des documents pdf.
Une fois ces documents pdf générer, j'ai 2 possibilités offertes à l'utilisateur:
- juste générer le document et l'afficher dans une popup
- générer, afficher dans une popup et déclencher l'impression de celle-ci.
La génération des pdf se fait via une action ajax.
Ajax appelle mon action qui une fois la génération terminée, renvoie via un flux xml, les liens sur les fichiers pdf.
Ensuite, via une fonction javascript, je passe en paramètre l'url pour qu'elle l'ouvre dans une popup.
ceci fonctionne très bien tant que je ne veux pas déclencher l'impression
Au début, j'avais mis l'ordre d'impression dans la foncton qui ouvre la fenêtre popup.
Mon panneau pour confirmer l'impression s'ouvre bien, mais le pb, c'est qu'il s'ouvre avant que mon pdf est fini de chargé dans la page.
Quand je clique sur ok pur confirmer l'impression j'ai une erreur me disant que mon document à changer et que je dois recommencer l'impression.
Pas de pb , je vais me brancher sur l'event onload.
Je me suis inspiré de cette exemple de la faq pour charger mon pdf via struts et ensuite cablé mon event onload sur l'impression.
Voici ce que j'ai rajouté dans mon fichier struts-config.xml :
mon tiles-config.xml :
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 <form-beans type="org.apache.struts.action.ActionFormBean"> <!-- Logon form bean --> <form-bean name="popupBean" type="drdict.struts.bean.PopupBean" /> </form-beans> <action-mappings> <action path="/popupPdf" type="drdict.struts.action.PopupAction" name="popupBean" parameter="reqCode" scope="session" validate="false" attribute="popupBean"> <forward name="popup" path="page.popup" /> </action> </action-mappings>
popupPdf.jsp :
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 <?xml version="1.0" encoding="UTF-8"?> <tiles-definitions> <!-- Definition de base à utiliser --> <definition name="base" path="/templates/base.jsp"> <put name="enpied" value="enpied.jsp"/> <put name="menu" value="menu.jsp"/> <put name="entete" value="entete.jsp"/> </definition> <!-- Définition de la page popup --> <definition name="page.popup" extends="base" > <put name="body" value="/vues/popupPdf.jsp" /> </definition> </tiles-definitions>
mon fichier PopupBean.java :
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 <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib uri="struts-bean" prefix="bean" %> <%@ taglib uri="struts-html" prefix="html" %> <%@ taglib uri="struts-layout" prefix="layout" %> <script language="javascript" type="text/javascript"> function imprimePdf() { alert('imprimePdf'); var imprim = dojo.byId("popupImprimer"); if(parseInt(imprim.value,10) == 1) window.print(); } dojo.addOnLoad(imprimePdf); alert('imprimePdf'); </script> <layout:text property="popupImprimer" styleId="popupImprimer" mode="H,H,H"/>
et mon fichier PopupAction.java :
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 package drdict.struts.bean; import javax.servlet.http.HttpServletRequest; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionMapping; import fr.improve.struts.taglib.layout.util.DefaultForm; public class PopupBean extends DefaultForm { /** * */ private static final long serialVersionUID = 7904681008170839992L; private String popupImprimer; public PopupBean() { } public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { // gestion des erreurs ActionErrors erreurs = new ActionErrors(); // on rend la liste d'erreurs return erreurs; } public String getPopupImprimer() { return popupImprimer; } public void setPopupImprimer(String popupImprimer) { this.popupImprimer = popupImprimer; } }
Etant donné que j'écris directement dans le flux de sortie en mode binaire et que je ne peux pas faire un mapping.findForward sur le return, j'ai rajouté dans l'ecriture du flux le contenu de mon fichier entete.jsp et mon fichier popupPdf.jsp
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155 package drdict.struts.action; import java.util.*; import java.io.*; import java.nio.channels.*; import javax.servlet.http.*; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.*; import org.apache.struts.actions.*; import org.apache.struts.util.MessageResources; import drdict.ejb.interfaces.*; import drdict.ejb.entity.*; import drdict.struts.bean.PopupBean; import drdict.util.*; public class PopupAction extends DispatchAction { private UtilisateurInterface uI = null; private Locator locator = new Locator(); private static MessageResources messages = MessageResources.getMessageResources("drdict"); public static String localPath = messages.getMessage("files.local.root"); public PopupAction() { } public ActionForward unspecified(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws ServletException { return mapping.findForward("popup"); } public ActionForward affichePdf(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws ServletException { // init des variables PopupBean pb = (PopupBean)form; // dit à la page s'il faut imprimer if(request.getParameter("imprim").equals("1")) pb.setPopupImprimer("1"); else pb.setPopupImprimer("0"); // recupère le fichier pdf à ouvrir String sFic = localPath + request.getParameter("fichier"); FileInputStream file = null; ByteArrayOutputStream bos = null; FileChannel src = null; OutputStream os = null; try { // init du flux d'entrer file = new FileInputStream(sFic); src = file.getChannel(); bos = new ByteArrayOutputStream((int)src.size()); byte[] tab = new byte [(int)src.size()]; // copi du pdf dans le tableau de byte file.read(tab); bos.write(tab); // recupère les entetes et le corps List<ByteArrayOutputStream> list = this.EnteteVersByte(); // Remplir ici votre bos avec le flux du PDF response.setContentType("text/html, application/pdf"); response.setContentLength(bos.size() + list.get(0).size() + list.get(1).size()); // response.setContentLength(bos.size() + list.get(0).size() + list.get(1).size()); // obtiens le flux de sortie os = response.getOutputStream(); // ecrit le pdf os.write(bos.toByteArray(), 0, bos.size()); // ecrit l'entete os.write(list.get(0).toByteArray(), 0, list.get(0).size()); os.write(list.get(1).toByteArray(), 0, list.get(1).size()); // force le cache à se vider os.flush(); // fermeture des flux os.close(); bos.close(); src.close(); file.close(); } catch(Exception ex) { ex.printStackTrace(); } return null; } private List<ByteArrayOutputStream> EnteteVersByte() { // init des variables String sVal = ""; List<ByteArrayOutputStream> list = new ArrayList<ByteArrayOutputStream>(); FileChannel src = null; String sEntete = this.getServlet().getServletContext().getRealPath("/templates/entete.jsp"); FileInputStream entete = null; ByteArrayOutputStream bosEntete = null; String sCorps = this.getServlet().getServletContext().getRealPath("/vues/popupPdf.jsp"); FileInputStream corps = null; ByteArrayOutputStream bosCorps = null; try { entete = new FileInputStream(sEntete); src = entete.getChannel(); byte [] tab1 = new byte[(int)src.size()]; bosEntete = new ByteArrayOutputStream((int)src.size()); entete.read(tab1); bosEntete.write(tab1); list.add(bosEntete); src.close(); corps = new FileInputStream(sCorps); src = corps.getChannel(); byte [] tab2 = new byte[(int)src.size()]; bosCorps = new ByteArrayOutputStream((int)src.size()); corps.read(tab2); bosCorps.write(tab2); list.add(bosCorps); src.close(); // ferme les flux entete.close(); corps.close(); } catch(Exception ex) { ex.printStackTrace(); } // renvoie le resultat return list; } }
Cela donne en résultat que mon fichier pdf s'ouvre dans une popup, pas de pb.
Que mon code contenu dans entete.jsp et popupPdf.jsp sont bien présent aussi,
Mais le pb est que le code source ajouter par entete.jsp et popupPdf.jsp n'est pas interprété, donc ne déclenche pas l'impression
Est-ce que qq aurait une idée de comment faire ?
Ou si je suis sur la bonne piste, qu'est-ce qui cloche dans mon code ?
Merci d'avance
Partager